Snapped HackTheBox (Hard)
Contexto de la maquina
Trayectoria Snapped

Descripción
La máquina Snapped es un entorno Linux que expone un servicio web basado en Nginx junto a una interfaz administrativa (nginx-ui). El reto consiste en comprometer dicha aplicación web, extraer información sensible a través de una vulnerabilidad en su API y escalar privilegios hasta obtener acceso como root.
Objetivo
Obtener acceso inicial al panel administrativo.
Comprometer credenciales de usuarios.
Acceder al sistema mediante SSH.
Escalar privilegios hasta
root.
Tipo de máquina
Linux
Web + API backend
Escalada de privilegios local
Habilidades y técnicas evaluadas
Enumeración web avanzada (subdominios y APIs)
Análisis de tráfico HTTP
Explotación de vulnerabilidades en APIs
Criptografía aplicada (JWT, AES)
Extracción y cracking de hashes
Escalada de privilegios mediante vulnerabilidades del sistema
Análisis de vulnerabilidades




Escaneo de puertos
Comenzamos realizando un escaneo completo de puertos TCP para identificar los servicios expuestos en la máquina objetivo.
Una vez identificados los puertos abiertos, lanzamos un escaneo más detallado sobre ellos para obtener versiones y scripts por defecto.
Resultado:
Observamos que únicamente hay dos puertos abiertos:
22 (SSH) → Acceso remoto
80 (HTTP) → Servidor web
El servicio web nos indica una redirección hacia el dominio:
Por lo tanto, lo añadimos a nuestro archivo /etc/hosts:
Accedemos al sitio web:
Respuesta:

La página no muestra nada especialmente relevante a simple vista, por lo que continuamos con enumeración más profunda.
Fuzzing de subdominios (FFUF)
Procedemos a realizar fuzzing de subdominios utilizando ffuf:
Respuesta:
Identificamos el subdominio:
admin.snapped.htb
Lo añadimos al /etc/hosts:
Accedemos:
Respuesta:

Análisis del panel de login
Nos encontramos con un panel de autenticación. Probamos credenciales por defecto (admin:admin), pero no funcionan.
Sin embargo, observamos un comportamiento interesante: la respuesta del servidor tarda más de lo habitual, lo cual sugiere procesamiento adicional en backend.
Esto nos lleva a inspeccionar las peticiones mediante las herramientas de desarrollo del navegador (Network).
Análisis de peticiones
Al intentar autenticarnos, identificamos varias peticiones, entre ellas una especialmente relevante:
public_key(respuesta JSON)
Respuesta:

Esto indica que la aplicación utiliza criptografía asimétrica (RSA), posiblemente para proteger credenciales o intercambios de datos.
Aunque en este punto no es explotable directamente, confirma la existencia de una API backend.
Enumeración de APIs
Recargando la página y capturando tráfico con Burp Suite, identificamos varias rutas API:

/api/install

/api/casdoor_uri

/api/passkeys/config

/api/icp_settings

Tras analizarlas manualmente en el Repeater, observamos que:
La mayoría no devuelven información útil
/api/installresponde, pero cuenta con validaciones internas que impiden su abuso directo
Fuzzing de endpoints API
Dado que hemos identificado la existencia de una API backend, procedemos a realizar fuzzing de endpoints para descubrir rutas adicionales accesibles.
Respuesta:
De los resultados obtenidos, el endpoint más interesante es:
/api/backup
Este endpoint no había sido identificado previamente y devuelve una respuesta de tamaño considerable, lo que sugiere que puede contener información relevante.
Análisis del endpoint /api/backup
/api/backupAl acceder directamente al endpoint, observamos que el servidor devuelve un archivo comprimido:
Procedemos a descomprimirlo:
Contenido:
Esto resulta especialmente interesante, ya que aparentemente contiene backups de distintos componentes de la aplicación (probablemente frontend/backend o panel administrativo).
Intento de extracción
Intentamos descomprimir los archivos internos:
Sin embargo, observamos que:
Los archivos no son ZIPs válidos
El contenido parece estar cifrado u ofuscado
Esto indica que el backup implementa algún mecanismo de protección adicional.
Análisis de la respuesta HTTP
Capturando la descarga con Burp Suite, identificamos una cabecera relevante:

Esta cabecera sugiere:
Uso de cifrado simétrico (probablemente AES)
Inclusión de clave + vector de inicialización (IV)
Mecanismo propietario de protección del backup
Tras investigar este comportamiento, encontramos que está relacionado con una vulnerabilidad conocida.
CVE-2026-27944

Este comportamiento está asociado a la vulnerabilidad CVE-2026-27944, que afecta a Nginx UI y permite:
Descarga de backups sin autenticación
Obtención de claves criptográficas desde cabeceras HTTP
Descifrado completo del contenido del backup
Existe un PoC público que automatiza este proceso.
URL = PoC CVE-2026-27944 GitHub
Explotación del CVE
Nos descargamos el exploit y ejecutamos el mismo:
Respuesta:
El exploit realiza automáticamente:
Descarga del backup
Extracción de la cabecera
X-Backup-SecurityObtención de:
Clave AES-256
Vector de inicialización (IV)
Descifrado de todos los archivos
Información obtenida
Tras el descifrado, se extraen secretos sensibles del archivo de configuración:
Esto es crítico, ya que nos permite:
Firmar tokens JWT válidos
Suplantar usuarios
Acceder a endpoints restringidos
Generación de JWT (suplantación de admin)
Con los secretos obtenidos, procedemos a generar un token JWT válido para el usuario admin.

createJWT.py
Ejecutamos el script:
Respuesta:
Se genera correctamente un token JWT válido.
Limitación encontrada
Intentamos utilizar el token mediante cookies en el navegador:
Añadiendo
token=<JWT>en el almacenamiento del navegador.Recargando la página.
Comportamiento observado:
El acceso al panel de administración se produce brevemente.
Sin embargo, el sistema invalida/elimina la cookie automáticamente.
Conclusión:
Existe algún mecanismo adicional de validación (posiblemente server-side o relacionado con sesiones), por lo que esta vía no es completamente fiable.
Creación de usuario vía exploit (No es la vía principal)
El exploit no solo permite la extracción de backups y secretos, sino que además incorpora funcionalidad para crear usuarios directamente en el sistema, aprovechando el bypass basado en el Node Secret.
Ejecutamos el exploit con la opción de creación de usuario:
Respuesta:
Análisis:
El exploit reutiliza los secretos obtenidos previamente (
Node Secret) para autenticarse contra la API interna.Se realiza un bypass de autenticación que permite la creación de usuarios con privilegios administrativos.
Acceso al panel de administración
Probamos las credenciales creadas manualmente desde el panel de login:
Respuesta:

Accedemos correctamente al panel de administración.
Una vez dentro, navegamos a la sección Manage Users, donde podemos observar:

Usuarios existentes en el sistema:
adminjonathan
Todos los usuarios tienen el 2FA deshabilitado, lo cual reduce significativamente la seguridad del sistema.
Escalate user jonathan

En este punto, aunque ya disponemos de acceso administrativo al panel web, no encontramos funcionalidades evidentes que permitan ejecutar comandos directamente en el sistema o comprometer el host a nivel de sistema operativo.
Por ello, decidimos retomar información previamente obtenida durante la fase de explotación.
Revisión del contenido extraído (backup_extracted)
backup_extracted)Al ejecutar anteriormente el exploit:
Se generó automáticamente el directorio:
Inicialmente este contenido pasó desapercibido, pero contiene información potencialmente sensible que puede ser aprovechada para continuar con la intrusión.
Estructura del directorio:
Análisis de configuraciones
Carpeta nginx
nginxContiene configuraciones del servidor web (virtual hosts, módulos, etc.), pero no aporta credenciales directamente útiles para la escalada.
Carpeta nginx-ui
nginx-uiAquí encontramos dos archivos clave:
El archivo más relevante es database.db, ya que contiene información estructurada de la aplicación.
Análisis de la base de datos (SQLite)
Accedemos a la base de datos utilizando sqlite3:
Respuesta:
Listamos las tablas disponibles:
Respuesta:
La tabla que más nos interesa es users, ya que probablemente contenga credenciales o hashes.
Consultamos su contenido:
Respuesta:
Observamos dos usuarios: admin y jonathan. El hash del usuario jonathan resulta especialmente interesante.
Extracción del hash
hash
Se trata de un hash bcrypt, por lo que procedemos a intentar su crackeo.
Crackeo de contraseña (john)
john)Utilizamos john con un diccionario:
Respuesta:
La contraseña obtenida para el usuario jonathan es:
Acceso por SSH
Con las credenciales obtenidas, intentamos acceso por SSH:
Metemos como contraseña linkinpark...
Se confirma que hemos obtenido acceso válido al sistema como el usuario jonathan, por lo que leeremos la flag del usuario.
user.txt
Escalate Privileges

En esta fase, comenzamos enumerando binarios con permisos SUID, ya que son un vector clásico de escalada de privilegios en sistemas Linux.
Respuesta:
Se listan múltiples binarios con SUID, la mayoría comunes (passwd, su, sudo, etc.). Sin embargo, uno de ellos destaca especialmente:
Identificación del vector de ataque
El binario snap-confine se ejecuta con privilegios elevados (SUID root) y forma parte del sistema snapd. Este punto resulta especialmente interesante por varios motivos:
El nombre de la máquina: Snapped
Uso de
snapden el sistemaSuperficie de ataque conocida en este componente
Esto nos indica claramente que la vía de escalada probablemente esté relacionada con snap.
Enumeración de versión
Comprobamos la versión de snap instalada:
Respuesta:
CVE-2026-3888
Si investigamos en profundidad posibles vulnerabilidades asociadas a la versión snapd 2.63, encontraremos una vulnerabilidad reciente identificada como:
Para más información, podemos consultar el advisory oficial:
URL = Info CVE-2026-3888 GitHub
Obtención de PoC
Buscando un Proof of Concept (PoC) que nos permita automatizar la explotación, encontramos el siguiente repositorio:
URL = PoC CVE-2026-3888 GitHub
Este exploit abusa de una combinación de:
snap-confine(SUID)systemd-tmpfilesManipulación de namespaces
Condiciones de carrera (race condition)
El repositorio incluye múltiples implementaciones. En nuestro caso, utilizaremos la variante basada en capabilities, que resulta más fiable que otras aproximaciones basadas únicamente en SUID.
Preparación del exploit
Clonamos el repositorio en nuestra máquina atacante:
A continuación, compilamos los binarios necesarios:
En este caso, únicamente necesitamos estos dos archivos, que son los que han funcionado correctamente durante la explotación.
Transferencia a la máquina víctima
Levantamos un servidor HTTP simple:
Desde la máquina víctima, descargamos los binarios:
Asignamos permisos de ejecución:
Ejecución del exploit
Ejecutamos el exploit de la siguiente forma:
⚠️ Nota importante: Este exploit depende de una race condition, por lo que su ejecución no es determinista. Puede requerir múltiples intentos hasta conseguir una ejecución exitosa. En este caso, fue necesario aproximadamente 1 hora hasta lograr explotarlo correctamente.
Resultado de la explotación
Salida relevante del exploit:
Durante la explotación, el ataque consigue:
Ganar la condición de carrera (race condition)
Obtener control sobre rutas críticas de
snapdInyectar un payload mediante
ld.so.preloadGenerar una bash con permisos SUID root
Ejecuta la shell generada como
root
Tras una exitosa explotación, obtenemos una shell como el usuario root, por lo que ya podremos leer la flag del usuario root.
root.txt
Last updated