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

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

Check List

Directory Path Traversal

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

Wrappers

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:

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

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

Mediante PHP

Curl

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.

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.

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í:

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

Ejemplo

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

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.

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

Ejemplo

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

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

Last updated