Resuelve Hack the Box y otros desafíos CTF con Snyk
Mathias Conradt
1 de septiembre de 2022
0 minutos de lecturaHack The Box (HTB) es una plataforma que convierte la capacitación en ciberseguridad en un juego. Es ideal para quienes aspiran a convertirse en pentesters, así como para desarrolladores que quieren ser referentes de seguridad o simplemente comprender un poco mejor la mentalidad de los atacantes para proteger mejor sus aplicaciones.
Creo en la eficacia de la gamificación en la capacitación y la educación porque, seamos honestos: ¿quién no ha participado en una capacitación interna sobre seguridad o ha estudiado para un examen de certificación y olvidado todo ese conocimiento seis meses después? HTB adopta un enfoque diferente con sus juegos prácticos de captura de bandera (CTF), en los que los jugadores irrumpen en una máquina —normalmente una máquina virtual Linux o Windows— al descubrir y explotar vulnerabilidades para capturar dos banderas: primero, la de un usuario normal y luego la del usuario root, mediante una escalada de privilegios. Una bandera es simplemente el contenido de un archivo de texto específico que está en la máquina.
Además de las «máquinas» (los elementos principales de la plataforma) de Hack The Box, también hay tareas más pequeñas en las que puedes participar, llamadas «Challenges». Estos desafíos suelen ser un poco más cortos y solo requieren una bandera, pero a menudo incluyen un conjunto completo de archivos de recursos para descargar. Puede ser un archivo pcap para analizar con Wireshark o el código fuente completo de la aplicación en cuestión, que te permite analizar la estructura y el código de la aplicación subyacente. Justamente ahí es donde entra Snyk.
Snyk te ayuda a encontrar vulnerabilidades y posibles puntos de entrada más rápido. La CLI de Snyk te permite ejecutar pruebas SAST (pruebas estáticas de seguridad de aplicaciones) y SCA (análisis de composición de software) en tu proyecto, además de analizar archivos de manifiesto de aplicaciones, como package.json, para detectar vulnerabilidades conocidas en bibliotecas de código abierto. Incluso señala PoC.
Análisis del desafío BlinkerFluids
El desafío BlinkerFluids es una excelente muestra de HTB. Como es un desafío bastante fácil y una buena forma de empezar, lo usaré como ejemplo en esta publicación del blog.

Cuando inicies el desafío, recibirás la IP y el puerto del host (46.101.2.216:32221 en este ejemplo). Al abrirlos en un navegador, verás un sitio web con una interfaz sencilla.

Veamos qué hay detrás de esta URL de destino abriendo http://46.101.2.216:32221.
La aplicación consta de una sola página con una lista de facturas y opciones para exportarlas como PDF, eliminarlas o crear nuevas.

Al pasar el cursor sobre el enlace para exportar a PDF, vemos que los archivos PDF se sirven desde lo que parece ser una carpeta de recursos estáticos.

El editor para crear facturas parece ofrecer un editor WYSIWYG que recibe texto en un lenguaje de marcado (Markdown) antes de convertirlo en PDF.

Antes de analizar más a fondo el host de destino, descarguemos los recursos que proporciona el desafío. Al descargar y extraer el archivo zip, obtenemos el código fuente completo de la aplicación, una aplicación Node empaquetada como imagen de Docker, con el Dockerfile y package.json incluidos.
También vemos un archivo flag.txt en la carpeta raíz. En los desafíos de HTB, la bandera suele estar en la ruta /flag.txt. Sin embargo, el archivo de este paquete zip es solo un marcador de posición, no la bandera activa que buscamos. La plataforma HTB genera y rota estas banderas en línea con su propia lógica. En cualquier caso, ya conocemos la receta y los ingredientes de la aplicación BlinkerFluids.
La aplicación en sí está en la subcarpeta «challenge». Como podemos ver, hay varias bibliotecas de Node configuradas como dependencias directas y transitivas en node_modules. También vemos la carpeta static, que parece ser la que sirve los archivos PDF exportados que vimos antes.
Análisis de vulnerabilidades con Snyk
Como buscamos una forma de irrumpir en la aplicación y capturar /flag.txt en la instancia en línea, podemos estudiar el código a fondo para comprender la lógica. Para no extenderme demasiado, no entraré en muchos detalles en esta publicación del blog.
En esencia, buscamos vulnerabilidades en el código personalizado que se escribió o en cualquiera de las dependencias directas o indirectas (transitivas).
La CLI de Snyk nos permite hacer ambas cosas. Si aún no instalaste Snyk, puedes hacerlo con este comando:
o con cualquier otro método que prefieras, como se documenta en la página de instalación de Snyk CLI.
Dentro de la subcarpeta challenge, primero ejecutamos una prueba SAST en el código personalizado:
y obtenemos los siguientes resultados:
Aunque vemos un par de vulnerabilidades, incluida una de gravedad alta, no hay nada que podamos aprovechar; XSS no nos sirve mucho en este caso. Así que continuemos con una prueba SCA.
Como parte de una prueba SCA, Snyk analiza los archivos de manifiesto de un proyecto (en el caso de Node.js, package.json y package-lock.json).
Aunque solo tenemos 5 dependencias directas en package.json, en realidad hay un total de 371 si contamos las dependencias transitivas, como podemos ver en package-lock.json. Son demasiadas vulnerabilidades para revisarlas manualmente. Ejecutemos:
Obtenemos los siguientes resultados:

Esto se ve mejor. Podemos ignorar los problemas de ReDoS, ya que provocar una interrupción del servicio no nos ayudaría a acceder a la plataforma. Pero la vulnerabilidad crítica de Remote Code Execution (RCE) en md-to-pdf parece muy prometedora: justo lo que necesitamos. Podemos suponer que md-to-pdf es la biblioteca auxiliar que se usa para convertir el Markdown de la factura en un PDF.
Aquí podemos ver realmente el poder de Snyk. Analizó las dependencias del proyecto en segundos, señaló las vulnerabilidades e incluso proporciona un enlace a Snyk Vulnerability Database, que incluye un PoC de explotación y enlaces al informe original del problema:

Esta información ayudará con la explotación, pero vale la pena señalar que el informe de Snyk también recomienda cómo corregir el problema, como puedes ver en la captura de pantalla anterior. Es un consejo realmente práctico.
Pero, como ahora estamos en el papel del atacante, revisemos el problema original en GitHub para obtener más información.
Como se señala en el problema de GitHub, el problema está en la biblioteca gray-matter (que md-to-pdf usa para analizar los metadatos iniciales), que expone un motor de JavaScript de forma predeterminada. En esencia, esto ejecuta eval sobre el Markdown proporcionado, lo que permite que cualquier persona que controle su contenido ejecute código JavaScript arbitrario.
Podemos ver el PoC original y, más abajo, en los comentarios, un PoC ligeramente modificado.

Este PoC intenta listar e imprimir un directorio. Como nos interesa el contenido de la bandera que está en /flag.txt, podemos aprovecharlo con una pequeña modificación para leer el contenido del archivo de la bandera:
Al pegar este código en el generador de facturas y hacer clic en Guardar, obtendremos un PDF que contiene la bandera que buscamos.



Envía esta bandera y habrás resuelto el desafío. ¡A por el siguiente! :)
Conviértete en un campeón de CTF con Snyk
Los desafíos de Hack The Box son una forma divertida de aprender sobre vulnerabilidades y cómo explotarlas. Snyk nos ayudó a resolver este desafío de Hack The Box al analizar rápidamente las dependencias de la aplicación y señalar una vulnerabilidad crítica de RCE, junto con información sobre cómo explotarla. También proporcionó información para que el desarrollador de la aplicación pudiera corregir el problema.
Anota la fecha: Snyk organizará «Fetch the Flag CTF» el 9 de noviembre. Regístrate y participa: te esperan 16 desafíos.
Empieza con Capture the Flag
Aprende a resolver desafíos de Capture the Flag viendo nuestro taller virtual introductorio a pedido.
Acerca del autor
Mathias Conradt es emprendedor y profesional de la ciberseguridad, con experiencia en ingeniería de software y preventa. Es Snyk Ambassador y líder del capítulo de DevSecCon Germany. También participa en competencias CTF. Visita su sitio web personal aquí.



