Apuntes Ciberseguridad (Cibaism)
HTBGitHubLinkedInNotion (Writeups)
  • Welcome to My Digital Garden
  • About me
  • Hacking notes (Personal)
    • Tratamiento TTY
    • Hacking Web Tecniques
      • File Inclusion
    • Linux Privilage Escalation
    • Arreglar bloodhound
  • Hacking Notes (Learning Path)
    • (HTB) Penetration Tester
      • Getting Started
        • Common Terms
          • Tipos de Shell
          • Puertos importantes
          • OWASP Top 10
        • Service Scanning
          • Nmap
          • Attacking Network Services
            • Captura de banners
            • FTP
            • SMB
            • SNMP
        • Web Enumeration
        • Public exploits
          • Encontrar exploits públicos
          • Introducción a Metasploit
        • Types of Shells
          • Reverse Shell
          • Bind Shell
          • Web Shell
        • Privilage escalation
        • Transferring Files
      • Footprinting
        • Infrastructura Based Enumeration
          • Domain Information
          • Cloud Resources
          • Staff
        • Host Based Enumeration
          • FTP
          • SMB
          • NFS
          • DNS
          • SMTP
          • IMAP / POP3
          • SNMP
          • MySQL
          • MSSQL
          • Oracle TNS
          • IPMI
          • Protocolos de administración remota de Linux
          • Protocolos de administración remota de Windows
      • Introduction to Active Directory Enumeration & Attacks
        • Tools of the Trade
        • Initial enumeration
          • External Recon and Enumeration Principles
          • Initial Enumeration of the Domain
        • Sniffing out a Foothold
          • LLMNR/NBT-NS Poisoning - from Linux
          • LLMNR/NBT-NS Poisoning - from Windows
        • Sighting In, Hunting For A User
          • Password Spraying Overview
          • Enumerating & Retrieving Password Policies
          • Password Spraying - Making a Target User List
        • Spray Responsibly
          • Internal Password Spraying - from Linux
      • File Inclusion
        • File Disclousure
          • Local File Inclusion (LFI)
          • Basic Bypasses
          • PHP Filters
        • Remote Code Execution
          • PHP Wrappers
    • (CRTA) Red Team Analyst
      • (CRTA) Red Team Analyst - Lab
    • (eJPT) Junior Penetration Tester
      • Assessment Methodologies
        • Assessment Methodologies: Footprinting & Scanning
          • Windows Recon: Nmap Host Discovery
          • Scan the Server 1
          • Windows Recon: SMB Nmap Scripts
        • Assessment Methodologies: Enumeration
          • Importing Nmap Scan Results Into MSF
          • T1046 : Network Service Scanning
          • FTP Enumeration
          • Samba Recon: Basics
          • Apache Enumeration
          • MySQL Enumeration
          • SSH Login
          • Postfix Recon: Basics
        • Assessment Methodologies: Vulnerability Assessment
          • Windows: IIS Server DAVTest
          • Shellshock
          • Web App Vulnerability Scanning With WMAP
      • Host & Network Penetration Testing
        • Host & Network Penetration Testing: System/Host Based Attacks
          • Windows
            • Windows: IIS Server: WebDav Metasploit
            • Windows: SMB Server PSexec
            • Windows: Insecure RDP Service
            • WinRM: Exploitation with Metasploit
            • UAC Bypass: UACMe
            • Privilege Escalation: Impersonate
            • Unattended Installation
            • Windows: Meterpreter: Kiwi Extension
          • Linux
            • ProFTP Recon: Basics
            • Samba Recon: Dictionary Attack
            • Cron Jobs Gone Wild II
            • Exploiting Setuid Programs
            • Password Cracker: Linux
        • Host & Network Penetration Testing: Network-Based Attacks
          • NetBIOS Hacking
          • SNMP Analysis
          • DNS & SMB Relay Attack
        • Host & Network Penetration Testing: The Metasploit Framework (MSF)
          • Windows: Java Web Server
          • Windows: HTTP File Server
          • Vulnerable FTP Server
          • Vulnerable File Sharing Service
          • Vulnerable SSH server
          • Vulnerable SMTP Server
          • Meterpreter Basics
          • Upgrading Command Shells To Meterpreter Shells
          • Windows Post Exploitation Modules
          • UAC Bypass: Memory Injection (Metasploit)
          • Exploiting SMB With PsExec
          • Windows: Enabling Remote Desktop
          • Clearing Windows Event Logs
          • Pivoting
  • Blue team notes
    • Digital Forensics
      • Malware Analysis with VirusTotal
      • Wireshark
    • (Falcon) CrowdStrike
      • FALCON 104: Getting Started with the Endpoint Security Module
      • FALCON 106: Customizing Dashboards in Falcon
      • FALCON 180: Falcon Forensics Fundamentals
  • Programming
    • Powershell
Powered by GitBook
On this page
  • Filtros de recorrido de ruta no recursivos
  • Codificación
  • Caminos Aprobados
  • Extension adjunta
  • Truncamiento de ruta
  • Bytes nulos
  1. Hacking Notes (Learning Path)
  2. (HTB) Penetration Tester
  3. File Inclusion
  4. File Disclousure

Basic Bypasses

PreviousLocal File Inclusion (LFI)NextPHP Filters

Last updated 1 month ago

En la sección anterior, vimos varios tipos de ataques que podemos usar para diferentes tipos de vulnerabilidades de LFI. En muchos casos, podríamos encontrarnos con una aplicación web que aplica diversas protecciones contra la inclusión de archivos, por lo que nuestras cargas útiles de LFI habituales no funcionarían. Aun así, a menos que la aplicación web esté debidamente protegida contra la entrada maliciosa de usuarios de LFI, podríamos eludir las protecciones existentes y lograr la inclusión de archivos.

Filtros de recorrido de ruta no recursivos

Uno de los filtros más básicos contra LFI es el filtro de búsqueda y reemplazo, que simplemente elimina subcadenas de ( ../) para evitar recorrer rutas. Por ejemplo:

$language = str_replace('../', '', $_GET['language']);

El código anterior pretende evitar el cruce de rutas y, por lo tanto, inutilizar LFI. Si probamos las cargas útiles de LFI que probamos en la sección anterior, obtenemos lo siguiente:

http://<SERVER_IP>:<PORT>/index.php?language=../../../../etc/passwd

Vemos que ../se eliminaron todas las subcadenas, lo que resultó en una ruta final de ./languages/etc/passwd. Sin embargo, este filtro es muy inseguro, ya que no es recursively removingla ../subcadena, ya que se ejecuta una sola vez en la cadena de entrada y no aplica el filtro a la cadena de salida. Por ejemplo, si usamos ....//como carga útil, el filtro se eliminaría ../y la cadena de salida sería ../, lo que significa que aún podríamos recorrer la ruta. Intentemos aplicar esta lógica a la función include /etc/passwdde nuevo:

http://<SERVER_IP>:<PORT>/index.php?language=....//....//....//....//etc/passwd

Como podemos ver, la inclusión se realizó correctamente esta vez y podemos leer /etc/passwdcorrectamente. La ....//subcadena no es la única derivación que podemos usar, ya que podemos usar ..././`or` ....\/y otras cargas útiles LFI recursivas. Además, en algunos casos, escapar la barra diagonal también puede funcionar para evitar filtros de recorrido de ruta (p. ej., `` ....\/), o añadir barras diagonales adicionales (p. ej., ` ....////`) .

Codificación

Algunos filtros web pueden impedir los filtros de entrada que incluyen ciertos caracteres relacionados con LFI, como un punto .o una barra diagonal /para recorrer rutas. Sin embargo, algunos de estos filtros pueden omitirse mediante la codificación URL de nuestra entrada, de modo que ya no incluya estos caracteres incorrectos, pero se decodifique de nuevo como nuestra cadena de recorrido de ruta una vez que alcance la función vulnerable. Los filtros principales de PHP en las versiones 5.3.4 y anteriores eran específicamente vulnerables a esta omisión, pero incluso en versiones más recientes podemos encontrar filtros personalizados que pueden omitirse mediante la codificación URL.

Si la aplicación web de destino no permitía .el uso /de ``` en nuestra entrada``, podemos codificar la URL ../en ` %2e%2e%2f``, lo que podría eludir el filtro. Para ello, podemos usar cualquier codificador de URL en línea o la herramienta Burp Suite Decoder, como se indica a continuación:

Intentemos usar esta carga útil LFI codificada contra nuestra aplicación web vulnerable anterior que filtra ../cadenas:

<SERVER_IP>:<PORT>/index.php?language=%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%65%74%63%2f%70%61%73%73%77%64

Como podemos ver, también logramos eludir el filtro y usar el recorrido de ruta para leer /etc/passwd. Además, podemos usar Burp Decoder para codificar la cadena codificada de nuevo y obtener una double encodedcadena, lo que también permite eludir otros tipos de filtros.

Caminos Aprobados

Algunas aplicaciones web también pueden usar expresiones regulares para garantizar que el archivo incluido se encuentre en una ruta específica. Por ejemplo, la aplicación web que analizamos podría aceptar únicamente rutas que se encuentren en el ./languagesdirectorio, como se indica a continuación:

if(preg_match('/^\.\/languages\/.+$/', $_GET['language'])) {
    include($_GET['language']);
} else {
    echo 'Illegal path specified!';
}

Para encontrar la ruta aprobada, podemos examinar las solicitudes enviadas por los formularios existentes y ver qué ruta utilizan para la funcionalidad web normal. Además, podemos realizar pruebas de fuzzing en directorios web con la misma ruta y probar diferentes hasta encontrar una coincidencia. Para evitar esto, podemos usar el recorrido de ruta e iniciar nuestra carga útil con la ruta aprobada, y luego usar ../para volver al directorio raíz y leer el archivo especificado, como se muestra a continuación:

<SERVER_IP>:<PORT>/index.php?language=./languages/../../../../etc/passwd

Algunas aplicaciones web pueden aplicar este filtro junto con uno de los filtros anteriores, por lo que podemos combinar ambas técnicas iniciando nuestra carga útil con la ruta aprobada y luego codificar en URL nuestra carga útil o usar una carga útil recursiva.

Extension adjunta

Como se explicó en la sección anterior, algunas aplicaciones web añaden una extensión a nuestra cadena de entrada (p. ej., .php) para garantizar que el archivo que incluimos tenga la extensión esperada. Con las versiones modernas de PHP, es posible que no podamos evitar esto y nos veamos limitados a leer únicamente archivos con esa extensión, lo cual puede seguir siendo útil, como veremos en la siguiente sección (p. ej., para leer código fuente).

Hay un par de técnicas más que podríamos usar, pero son obsolete with modern versions of PHP and only work with PHP versions before 5.3/5.4... Sin embargo, puede ser útil mencionarlas, ya que algunas aplicaciones web podrían seguir ejecutándose en servidores antiguos, y estas técnicas podrían ser las únicas alternativas posibles.

Truncamiento de ruta

En versiones anteriores de PHP, las cadenas definidas tenían una longitud máxima de 4096 caracteres, probablemente debido a la limitación de los sistemas de 32 bits. Si se pasaba una cadena más larga, simplemente sería truncated, y cualquier carácter después de la longitud máxima se ignoraría. Además, PHP solía eliminar las barras diagonales finales y los puntos simples en los nombres de ruta, por lo que si invocábamos ( /etc/passwd/.), /.también se truncaría, y PHP invocaría ( /etc/passwd). PHP, y los sistemas Linux en general, también ignoran las barras diagonales múltiples en la ruta (por ejemplo, ////etc/passwdes igual a /etc/passwd). De forma similar, un acceso directo al directorio actual ( .) en medio de la ruta también se ignoraría (por ejemplo, /etc/./passwd).

Si combinamos estas dos limitaciones de PHP, podemos crear cadenas muy largas que evalúan una ruta correcta. Al alcanzar el límite de 4096 caracteres, la extensión añadida ( .php) se trunca y obtenemos una ruta sin extensión añadida. Finalmente, es importante tener en cuenta que también necesitamos [nombre del archivo] start the path with a non-existing directorypara que esta técnica funcione.

Un ejemplo de dicha carga útil sería el siguiente:

?language=non_existing_directory/../../../etc/passwd/./././././ REPEATED ~2048 times]

Por supuesto, no tenemos que escribir manualmente ./2048 veces (un total de 4096 caracteres), pero podemos automatizar la creación de esta cadena con el siguiente comando:

echo -n "non_existing_directory/../../../etc/passwd/" && for i in {1..2048}; do echo -n "./"; done
non_existing_directory/../../../etc/passwd/./././<SNIP>././././

También podemos aumentar el número de ../, ya que añadir más nos llevaría al directorio raíz, como se explicó en la sección anterior. Sin embargo, si usamos este método, debemos calcular la longitud completa de la cadena para asegurarnos de que solo .phpse trunque y no el archivo solicitado al final de la cadena ( /etc/passwd). Por eso sería más fácil usar el primer método.

Bytes nulos

Las versiones de PHP anteriores a la 5.5 eran vulnerables a null byte injection, lo que significa que añadir un byte nulo ( %00) al final de la cadena la terminaba y no consideraba nada posterior. Esto se debe a la forma en que las cadenas se almacenan en la memoria de bajo nivel, donde deben usar un byte nulo para indicar el final, como ocurre en los lenguajes Ensamblador, C o C++.

Para explotar esta vulnerabilidad, podemos terminar nuestra carga útil con un byte nulo (por ejemplo, /etc/passwd%00), de modo que la ruta final pasada a include()sea ( /etc/passwd%00.php). De esta forma, aunque .phpse añada a nuestra cadena, cualquier valor después del byte nulo se truncaría, por lo que la ruta utilizada sería /etc/passwd, lo que nos permitiría omitir la extensión añadida.

Puede consultar el módulo para obtener más información sobre cómo eludir varios personajes incluidos en la lista negra, ya que las mismas técnicas también se pueden utilizar con LFI.

Inyecciones de comandos