flagSnapped 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/install responde, 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

Al 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 GitHubarrow-up-right

Explotación del CVE

Nos descargamos el exploit y ejecutamos el mismo:

Respuesta:

El exploit realiza automáticamente:

  1. Descarga del backup

  2. Extracción de la cabecera X-Backup-Security

  3. Obtención de:

    • Clave AES-256

    • Vector de inicialización (IV)

  4. 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:

    • admin

    • jonathan

  • 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)

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

Contiene configuraciones del servidor web (virtual hosts, módulos, etc.), pero no aporta credenciales directamente útiles para la escalada.

Carpeta nginx-ui

Aquí 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)

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 snapd en el sistema

  • Superficie 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 GitHubarrow-up-right

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 GitHubarrow-up-right

Este exploit abusa de una combinación de:

  • snap-confine (SUID)

  • systemd-tmpfiles

  • Manipulació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 snapd

  • Inyectar un payload mediante ld.so.preload

  • Generar 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