Facts – Hack The Box [Write Up Español]

La máquina Facts es una máquina fácil de HTB.

Resumen de conceptos trabajados:

Enumeración de servicios
Fuzzing web de directorios ocultos
Explotación de roles de usuarios
Path Traversal
Extracción de clave ssh privada
Acceso por ssh al sistema
Abuso de Binario

Resumen: Esta máquina se resuelve comenzando con una enumeración que revela un servidor Linux con servicios web activos y un CMS accesible tras identificar virtual hosting. Tras registrarnos como usuario, aprovechamos una vulnerabilidad pública para escalar privilegios dentro del panel y obtener acceso administrativo. Desde ahí detectamos un Path Traversal que nos permite descargar archivos del sistema, incluida una clave privada SSH de un usuario real. Tras crackear su passphrase, accedimos por SSH y, gracias a un permiso inseguro sobre un binario, logramos ejecutar código como root y completar la máquina obteniendo la flag final.

Si es tu primera máquina en Hack The Box y no sabes cómo conectarte a la máquina del laboratorio, te recomiendo que visites este post donde te cuento cómo introducirte en esta plataforma.

A continuación, para conectarte a la máquina, tendrás que establecer la conexión con la máquina víctima de HTB conectándote a la VPN desde la carpeta donde la tengas descargada, y desde ahí ejecutarás el comando «sudo openvpn».

ENUMERACIÓN DE PUERTOS Y SERVICIOS

Comenzamos con la enumeración de puertos y conocimiento de versiones y servicios que corren sobre los mismos.

Antes, a mi me gusta asegurarme que efectivamente la máquina víctima está activa y ante qué sistema operativo (OS) nos enfrentamos. Para ello:

¿Está la máquina víctima activa y nos podemos comunicar con ella?

Aquí lo que haremos es ejecutar el siguiente comando y ver si el «host is up»:

El TTL es de 64 (63 en HTB por el nodo intermediario) por lo que estamos antes una máquina Linux.

Ahora que sabemos que la máquina víctima está activa, procedemos escanear la red lanzando un nmap para detectar qué puertos están abiertos con el siguiente comando:

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.129.3.94 -oG Escaneo_TCP

Sabemos por tanto que los puerto 22 SSH y 80 http web están abiertos. Llama la atención el puerto abierto 54321, el cual es un puerto alto.

Vamos a continuar con la fase de investigación estática mediante nmap corriendo un comando para analizar las versiones y servicios que corren para esos puertos. De esta manera podremos tener algo más de información que podamos explotar.

nmap -sCV -p22,80,54321 10.129.3.94

Nos reporta información muy interesante…

Por el puerto 22 ssh se sirve una versión de OpenSSH 9.9 que a priori está actualizada y corresponde con una de las últimas versiones, por lo que la descarto como vector de entrada.

Sin embargo, me llama la atención los dos puertos abiertos 80 y 54321, que sirven un servicio web http, y que registra en ambos que el servidor respondió con una redirección pero que nmap no la siguió de forma automática. Es decir, se está aplicando virtual hosting.

Además, se muestra en la cabecera del puerto 54321 un título que dice MinIO, el cual es un sistema Object Storage donde se suele almacenar información de backups, ficheros, documentos, datos sensibles, etc. Quizás por aquí podamos encontrar contraseñas o usuarios…

En el caso del puerto 80 que sabemos que se aplica virtual hosting al dominio facts.htb, lo que haremos será configurar el archivo de /etc/hosts de nuestra máquina de tal forma que la IP de la máquina víctima resolverá ese dominio facts.htb.

Para la otra redirección que muestra en el puerto 54321, donde se nos dice que el puerto IP_VICTIMA:54321 debería redirigir a IP_VICTIMA:9001 no podemos asociarlo en el /etc/hosts porque ese fichero no entiende de puertos, solo IPs. Ese comportamiento de decirle que un puerto redirija a otro se debe hacer a través de un proxy por ejemplo….Además, se nos dice que en ese puerto

Hecha la asociación de la IP al dominio facts.htb, al acceder por el navegador, vemos esta aplicación:

Si analizamos un poco la web e busca de información, tanto mediante Wappalizer como Whatweb como investigación activa de la aplicación y código fuente, podemos ver:

  • Con whatweb, veo información interesante que anoto por si más adelante me quedo estancado en la intrusión….es el caso de las respuestas de cabecera como «Cookies», «UncommonHeaders», «X-Frame-Options» y «X-XSS-Protection [0]»
  • Mirando la respuesta de Wappalizer, me llama la atención que el lenguaje de programación a priori que se estaría utilizando en la aplicación es Ruby y pone 50% seguro…
  • Revisando la navegación web, veo que existen distintas páginas de «Facts» o «Hechos» acerca de distintas temáticas, pero donde en los comentarios aparecen siempre alguno de estos tres usuarios: Bob, Carol y Dave …. Esto me puede dar una pista de potenciales usuarios a explotar.

FUZZING WEB

De hecho, y sin ver a priori más profundidad en la web a nivel de urls o ficheros, vamos a realizar fuzzing web para ver si se detectan directorios o archivos ocultos que nos den más pistas, usaremos gobuster.

└─# gobuster dir -u http://facts.htb/ -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -x php,html,txt 

Además de muchos archivos y directorios abiertos, lo más relevante es la redirección de determinados ficheros php, txt o html al directorio /admin/login , donde se muestra un panel de autenticación de usuarios que permite su login pero también crearse una nueva cuenta…

Esto es lo que vamos a probar, a crearnos una nueva cuenta y ver si podemos acceder a un dashboard de usuarios que nos permita poder subir archivos.

SPOILER: sólo me ha funcionando creando un usuario llamado «test»

Y efectivamente después de registrarnos, accedemos a un dashboard http://facts.htb/admin/dashboard.

Dentro del dashboard podemos ver alguna cosas importantes, como que el CMS que corre y la versión son Camaleon y la v 2.9.0 y que somos el usuario creado número (ID) porque ya hice pruebas con otros antes, y que ese usuario tiene un role de Client.

EXPLOTACIÓN DE ROLES DE USUARIOS

Vista la versión y el nombre del CMS Camaleon, si lo buscamos en Google vemos una POC de github que nos permitiría escalar privilegios a root con cualquier usuario ejecutando un script en py con un usuario ya creado – https://github.com/Alien0ne/CVE-2025-2304 .

Efectivamente vemos como ejecutando el exploit me cambia el role del usuario «test» de client a admin.

Y si accedemos de nuevo al panel de login con las credenciales, vemos que ahora el dashboard se completa con más funcionalidades (de root) donde podemos ver entre otras cosas los usuarios registrados y sus roles…

y también las credenciales de aws s3 de acceso y configuración…

NOTA: Como la máquina la resolví en varios días…la plataforma Hack The Box me resetea la IP de la máquina Facts, por lo que a partir de aquí la IP de la máquina víctima es 10.129.4.155 .

Esto no invalida todos los pasos anteriores.

En este punto y sabiendo que ahora como admin del panel puedo subir archivos desde Media, lo que hago es probar a subir una shell maliciosa en php para entablarme conexión con mi máquina atacante por nc, sin embargo, Camaleon CMS es un CMS Ruby on Rails (no PHP), por lo que una subida de shell.php no se interpreta del lado servidor.

Por eso no recibimos conexión en nc, ni probando a hacer un curl -I dispara nada.

PATH TRAVERSAL

Navegando en el dashboard como admin, vi distintas rutas tipo /admin/media/download_private_file?file=ALGO , y esto me vino a la mente que podría ser vulnerable a Path Traversal.

Probamos a aplicar Path Traversal desde el navegador, y nos efectivamente funciona, y nos descarga el fichero «passwd».

http://facts.htb/admin/media/download_private_file?file=../../../../../../etc/passwd

En él vemos todos los usuarios, sobre los que hacemos zoom son en «trivia» y «william» que pueden ejecutar una bin bash.

En este punto, no necesitamos la contraseña como tal, si no la clave SSH privada.

En Linux, los usuarios que usan SSH tienen normalmente una clave aquí:

/home/USUARIO/.ssh/id_ed25519
o
/home/USUARIO/.ssh/id_rsa

EXTRACCIÓN DE CLAVE SSH PRIVADA

Y como nosotros podemos leer archivos del sistema (recuerda que pudimos acceder por el navegador haciendo path traversal), entonces lo que tenemos que hacer es ejecutar esto:

http://facts.htb/admin/media/download_private_file?file=../../../../../../home/trivia/.ssh/id_ed25519

Probamos primero con el usuario trivia, y con el ssh de id_ed25519, y efectivamente nos descarga el fichero «id_ed25519» que contiene la clave privada en SSH:

Si intentamos asignarle permisos a ese fichero, y luego tratamos de acceder por ssh con el usuario trivia, nos pide una «passphrase», es decir, que está protegida. Por lo que tenemos que crackearla.

Ahora lo que haremos por tanto será extraer el hash (o la «passphrase») de esa clave privada usando la herramienta ssh2john del id_ed25519 del usuario trivia, y exportando el hash a un nuevo fichero llamado «key.jon».

Y ahora con ese hash, lo que hacemos es crackearlo usando John the Ripper contra el diccionario rockyou.txt, y nos da la «passphrase» = dragonballz.

ACCESO POR SSH AL SISTEMA

Ahora probamos a acceder por ssh como el usuario trivia (asegúrate antes de darle a la key los permisos correctos con «chmod 600 id_ed25519») y con la contraseña anterior.

ssh -i id_ed25519 trivia@facts.htb

Y ya estamos dentro de la máquina como el usuario trivia. Si vamos al directorio /home, vemos que efectivamente tenemos los usuarios trivia y william que vimos al descargarnos en local el fichero passwd.

De hecho, si accedemos a la carpeta del usuario william, podemos ver la user flag.

ABUSO DE BINARIO

Ahora nos toca escalar privilegios a root. Para eso lo que hacemos es ejecutar «sudo -l» y ver qué permisos tiene o puede ejecutar como sudo trivia (si es que tiene…).

Y efectivamente, nos dice que puede ejecutar el binario «facter» con permisos de root sin necesidad de proporcionar contraseña.

Facter es una herramienta de Ruby que carga “facts” (pequeños scripts Ruby).

Por lo que nos vamos a GTFObins, que es un repositorio de explotación y abuso de distintos binarios, y buscamos por facter:

Y nos dice como abusar del binario con sudo para escalar a root.

Si ejecutamos cada una de las 3 líneas que nos indica GTFObins, es decir:

TF=$(mktemp -d)
#Esto crea una carpeta temporal

echo 'exec("/bin/sh")' > $TF/x.rb
#Esto crea un pequeño script Ruby que abre una shell

sudo FACTERLIB=$TF facter

Nos salta este error:

Este error significa simplemente que sudo está bloqueando variables de entorno, y que no deja usar FACTORLIB=… delante del comando, por lo que tenemos que buscar otra forma de escalar.

En vez de usar la variable de entorno, vamos a usar directamente el parámetro que acepta facter: «–custom-dir». Eso hace exactamente lo mismo pero sin usar variables de entorno (y sudo no lo bloquea).

Para ello lo que hacemos paso a paso es:

  1. Creamos una carpeta temporal : «mkdir /tmp/f»
  2. Creamos un archivo en Ruby dentro: «nano /tmp/f/root.rb«
  3. Añadimos este código dentro de ese archivo en Ruby:
Facter.add(:hack) do
  setcode do
    exec("/bin/bash")
  end
end

Y ejecutamos Facter como Root cargando esa carpeta:

sudo /usr/bin/facter --custom-dir=/tmp/f

Y ya estamos dentro como root…sólo nos queda navegar al directorio cd /root y extraer la root flag.

RESUMEN RESOLUCIÓN MÁQUINA «FACTS»

Comenzamos con la fase de enumeración de puertos y servicios, verificando un TTL de 64 (Linux) y tres puertos abiertos: 22 (SSH), 80 (HTTP) y 54321 (HTTP alternativo). El puerto 80 aplicaba virtual hosting hacia el dominio facts.htb, mientras que el puerto 54321 mostraba referencias a MinIO, un sistema de almacenamiento tipo S3.

Tras configurar el archivo /etc/hosts para resolver el dominio facts.htb, analizamos la aplicación web detectando que probablemente estaba desarrollada en Ruby y utilizando el CMS Camaleon v2.9.0. Durante la enumeración web con Gobuster descubrimos el directorio /admin/login, donde era posible registrarse como usuario. Tras crear una cuenta y acceder al dashboard, identificamos que nuestro rol inicial era “Client”. Investigando la versión del CMS encontramos una prueba de concepto (CVE-2025-2304) que permitía escalar privilegios a administrador mediante un script en Python. Al ejecutar el exploit, nuestro usuario pasó a tener rol de admin.

A partir de ahí, detectamos una vulnerabilidad de Path Traversal que permitía descargar archivos arbitrarios del sistema. Aprovechando esta vulnerabilidad descargamos /etc/passwd, identificando usuarios reales como trivia y william con acceso a /bin/bash. Posteriormente descargamos la clave privada SSH de uno de ellos desde su directorio .ssh, la convertimos con ssh2john y crackeamos su passphrase con john y el diccionario rockyou. Una vez dentro por SSH como el usuario trivia, ejecutamos sudo -l y descubrimos que podíamos ejecutar /usr/bin/facter como root sin contraseña. Consultando GTFOBins, abusamos de esta funcionalidad cargando un script Ruby personalizado mediante --custom-dir, lo que nos permitió ejecutar código como root y obtener finalmente la root flag, completando la máquina con éxito.

Otros posts relacionados