Precious
Last updated
Last updated
Publicado: 05 de Junio de 2025 Autor: José Miguel Romero aKa x3m1Sec Dificultad: ⭐ Easy
Precious es una máquina Linux de dificultad fácil en Hack The Box que presenta una aplicación web que convierte URLs en archivos PDF. La explotación inicial se basa en una vulnerabilidad de inyección de comandos (CVE-2022-25765) en la librería pdfkit v0.8.7.2, que permite la ejecución remota de código a través de parámetros mal sanitizados en la URL de entrada.
Una vez dentro del sistema, se encuentra credenciales hardcodeadas en archivos de configuración de Ruby que permiten el movimiento lateral al usuario henry. La escalada de privilegios se logra explotando una vulnerabilidad de deserialización YAML en un script Ruby que henry puede ejecutar como root sin contraseña, permitiendo la ejecución de código arbitrario con privilegios administrativos.
🌐 Web Application Security: Análisis y explotación de aplicaciones web
💉 Command Injection: CVE-2022-25765 en pdfkit
🔐 Credential Discovery: Búsqueda de credenciales en archivos de configuración
⬆️ Privilege Escalation: Escalada mediante deserialización YAML
🐍 Ruby/YAML Exploitation: Explotación de vulnerabilidades específicas de Ruby
📄 PDF Generation: Aplicaciones de conversión de contenido web a PDF
🔍 Information Gathering: Reconocimiento y enumeración de servicios
🏃 Lateral Movement: Movimiento entre usuarios del sistema
💡 Nota: El TTL cercano a 64 sugiere que probablemente sea una máquina Linux.
⚠️ Importante: Detectamos durante la fase de enumeración con nmap que se está realizando virtual hosting. Debemos añadir el siguiente vhost a nuestro fichero /etc/hosts
Al acceder a http://precious.htb/ encontramos un sitio web que permite converter una web que introduzcamos introduciendo una url a formato PDF
🕷️Fuzzing de directorios
Realizamos fuzzing de directorios con herramientas como feroxbuster o dirsearch pero no obtenemos ningún resultado:
🕷️Fuzzing de vhosts
Tampoco encontramos ningún vhost
Dado que la aplicación espera una URL para convertirla a formato pdf, probamos algunos payloads como file:///etc/passwd http://127.0.0.1 pero son bloqueados.
Si introducimos una URL válida como http://www.google.es e interceptamos la petición con burp enueramos que el servidor está usando Phusion Passenger(R) 6.0.15 y Ruby.
Ahora probamos a levantar un servidor web en python en nuestro host de ataque y hacemos una petición al mismo.
Y comprobamos que genera y descarga el pdf con el contenido:
Ahora que hemos descargado el PDF, echamos un vistazo a los metadatos del mismo. Usamos por ejemplo la herramienta exiftool y logramos enumerar la herramienta usada para su generación:
Si no tenemos exiftool también podemos enumerar esta información en las propiedades del documento usando algún lector de pdf:
pdfkit v0.8.7.2 - Command Injection
Buscamos si hay algún exploit pública para para esa versión de la herramienta y encontramos un candidato:
El exploit abusa de una mala sanitización del campo de entrada URL y explota una vulnerabilidad de inyección de comandos. Tras leer la documentación de la vulnerabilidad, parece que podemos inyectar comandos en el campo de entrada añadiendo ?name=%20
en la solicitud una solicitud HTTP GET con un parámetro name
Ejemplo:
La PoC funciona, así que ahora intentemos obtener una RCE usando el siguiente payload:
Y ganamos acceso a la máquina
Enumeramos la máquina y encontramos dos usuarios
No tenemos permisos para leer la flag así que continuamos enumerando la máquina y encontramos un fichero de configuración en el directorio del usuario henry que podría ser una contraseña:
Logramos autenticarnos como henry y obtener la primera flag
Buscamos ahora vías potenciales de escalada a root y lo hacemos comenzando por revisar si henry puede ejecutar algún comando o binario como sudo:
Observamos que hay un script en ruby que henry puede ejecutar como root sin que la contraseña sea solicitada. Comprobamos los permisos que tiene henry sobre dicho script y vemos que puede leer y ejecutar:
Si tratamos de ejecutarlo obtenemos un error:
Analicemos un poco el contenido del script
Esta línea es crítica: YAML.load
ya que ejecuta código Ruby arbitrario si se le da un archivo .yml
malicioso. Es un YAML deserialisation vulnerability muy conocido en Ruby.
Para abusar de esto creamos un archivo dependencies.yml con el siguiente contenido en /dev/shm:
Este payload lo que hará será crear una copia de /bin/bash en el directorio tmp con el nombre x3m1sec y le otorgará SUID. A continuación se muestra el archivo generado:
Ahora simplemente nos quedaría elevar privilegios haciendo uso de la flag -p y escalamos a root:
presenta un ejemplo muy claro y conciso de una carga útil que puede usarse para explotar la deserialización de YAML en Ruby. Se basa en este