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.
No vulnerable
No hay input por parte del usuario.
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.
/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
Crea un .php file (rce.php)
Comprimelo en un archiv .zip (file.zip)
Subelo en la web vulnerable
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.
Mantenga el sistema y los servicios, incluidos los marcos de aplicaciones web, actualizados con la última versión.
Desactive los errores de PHP para evitar filtrar la ruta de la aplicación y otra información potencialmente reveladora.
Un firewall de aplicaciones web (WAF) es una buena opción para ayudar a mitigar los ataques de aplicaciones web.
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 .
Analice cuidadosamente la aplicación web y permita solo los protocolos y contenedores de PHP que se necesitan.
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.
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