Solución de Fetch the Flag CTF 2022: Logster
10 de noviembre de 2022
0 minutos de lectura¡Gracias por jugar Fetch con nosotros! Felicitaciones a los miles de jugadores que participaron en Fetch the Flag CTF. Y muchas gracias a los Snykers que crearon, probaron y documentaron los desafíos!
Si participaste en Fetch the Flag de Snyk en 2022 y buscas la respuesta al desafío Logster, llegaste al lugar indicado. ¡Veamos la solución paso a paso!
Empecemos por la fase de reconocimiento
En esta fase, un atacante identifica un objetivo vulnerable y explora cómo aprovecharlo. En nuestro caso, se nos presenta un enlace a un sitio web. Solo necesitamos un punto de entrada para comenzar.

Primero revisamos el enlace y vamos a http://logster.c.ctf-snyk.io/. Este sitio web nos permite escanear sitios web.

Probemos con https://www.cnn.com/. Muestra los encabezados:

A partir de ahí, podemos deducir por la descripción del desafío (lookup) y el lenguaje de programación (Java) que estamos ante Log4Shell.
¡Empecemos a crear un túnel!
Ahora, creemos un servidor web Express para configurar encabezados personalizados, creemos un túnel de ngrok para ejecutar el servidor localmente y luego expongámoslo a Internet. Después lo escanearemos y veremos qué sucede.
Si no sabes cómo configurar un servidor Express, la documentación oficial te ayudará con este paso.

Creamos nuestro servidor Express para que escuche en el puerto 3000 y configuramos un encabezado personalizado con ('PWN', 'pwn').
Ejecutémoslo con el comando node express.js:

También creemos el túnel de ngrok con el comando ngrok http 3000. Consulta la documentación oficial de ngrok para configurarlo en tu máquina.

Copia el enlace de reenvío, pégalo en el sitio web y escanéalo. En la consola de ngrok (http://localhost:4040/) podemos ver que el encabezado refleja lo que pusimos en el archivo express.js

Probemos a configurar un encabezado con un payload de tipo Log4Shell. Volvamos al archivo express.js y cambiemos el encabezado a ('${java:version}', 'pwn'):

Reiniciemos el servidor y hagamos otro escaneo del sitio web. Obtenemos un 500 Internal Server Error y, si revisamos los registros, vemos que el nombre del encabezado debe ser un token HTTP válido.

Express no permite encabezados no válidos: $ y {} no son caracteres válidos. Así que tenemos que eludir esta restricción. Podemos hacerlo creando un servidor de sockets que devuelva una respuesta personalizada cada vez que reciba una conexión.
El servidor de sockets se ve así. Escuchará en el socket y, con cada conexión, enviará la respuesta, que en este caso incluye la versión de Java. Intentaremos inyectar este encabezado personalizado para ver si se evalúa.

Iniciemos el servidor con el comando node index.js y cambiemos el túnel de ngrok a un túnel TCP con el comando ngrok tcp 3000. Debes crear una cuenta en ngrok para poder usar la función de túnel TCP.

Copia el enlace Forwarding sin TCP y pégalo en el sitio web. Agrega https:// al principio y escanea el enlace. Vemos que se evaluó el encabezado personalizado. Se hizo una búsqueda y obtuvimos la versión de Java. Sabemos que lookup funciona.

Ahora tenemos que configurar un exploit de Log4Shell.
¿Qué es Log4Shell?
CVE-2021-44228, también conocida como Log4Shell, es una vulnerabilidad de ejecución remota de código (RCE) sin autenticación que afecta a casi todas las versiones de Apache Log4j 2. El 9 de diciembre de 2021, la noticia de esta vulnerabilidad de día cero se difundió en las comunidades de seguridad informática, junto con una prueba de concepto (POC) disponible públicamente.
Si quieres aprender más sobre la vulnerabilidad Log4Shell, consulta nuestra lección gratuita en Snyk Learn .
La POC
Usaremos esta POC disponible públicamente en los siguientes pasos. Este repositorio contiene todo lo que necesitamos para realizar el ataque.
Clona el proyecto con Git y ve a la clase Evil.java. Tenemos que modificarla para crear el payload de este desafío. Queremos listar todos los archivos del directorio raíz. Crearemos un objeto File, obtendremos una lista de archivos e imprimiremos sus nombres.

Creemos nuestra imagen de Docker con el siguiente comando:
Iniciemos el servidor TCP de ngrok con el comando:

Y el servidor HTTP de ngrok con el comando: ngrok http 8888

Tendremos que ejecutar el contenedor de Docker de forma remota con el siguiente comando:

Pero primero, tenemos que configurar el servidor LDAP para que apunte al enlace Forwarding correcto. Copia y pega el enlace del servidor HTTP que escucha en el puerto 8888.
También necesitamos incluir en el archivo de sockets index.js la dirección del servidor TCP que escucha en el puerto 9999. Aquí enviamos un encabezado con un payload real de Log4Shell. Estamos sirviendo la clase Evil que modificamos antes.

Reiniciemos el servidor de sockets con el comando: node index.js
Volvamos a ejecutar este comando:

Deberías ver el mismo resultado en tu terminal:

Al volver al sitio web, deberías poder ver la lista de archivos del directorio raíz. ¡Y podemos ver que está la flag!

Tenemos que modificar el payload una última vez para revelar la flag. Volvamos a la clase Evil. Este fragmento de código nos permitirá leer la flag y mostrar el contenido del archivo.

Tenemos que volver a ejecutar el contenedor de Docker para que se reflejen los cambios. Si escaneamos una vez más, veremos el contenido del archivo de la flag.

Resumen de Logster
La sencillez de este exploit y el uso generalizado de la biblioteca han hecho que los profesionales de seguridad se apresuren a responder desde que se divulgó el error. La recomendación inicial para mitigar Log4Shell era actualizar a la versión 2.16; lamentablemente, después se descubrió un exploit de denegación de servicio en esa versión. La recomendación actual es actualizar a la versión 2.17.
Para conocer en detalle las recomendaciones de corrección, consulta nuestra guía rápida de corrección de Log4Shell. La actualizamos continuamente a medida que hay nueva información disponible.
¡Espero que hayas disfrutado Logster y los demás desafíos del CTF :) ¿Quieres saber cómo encontramos las otras flags? Visita nuestra página de soluciones de Fetch the Flag para ver cómo lo hicimos.



