Gunship – Hack The Box [Write Up] Challenge

Empezamos el reto de completar los Challenges de Hack The Box con el llamado «Gunship» de dificultad Muy Fácil y categoría Web.

Al final del post encontrarás un resumen de todo lo trabajado en este CTF. 🙂

La forma de iniciar los challenges es igual que cuando nos conectamos a una máquina del laboratorio de HTB, en este post te cuento paso a paso cómo conectarte con la VPN de la plataforma e iniciar la conexión.

Una vez nos dan el host de la máquina, la ejecutamos en el navegador:

http://94.237.53.140:47379/

Vamos a probar ese campo y ver qué información se envía cuando se POSTea.

Para ello abrimos BurpSuite, interceptamos la petición «On» y activamos el FoxyProxy en el navegador para enviarla a Burp.

Una vez enviamos la petición introduciendo cualquier campo, vamos a la petición POST en la pestaña Proxy y la enviamos al Repeater con el botón derecho sobre la petición (o Control+R).

Vemos que se tramita la petición a una aplicación /api/submit

Si analizamos los recursos que permite descargar HackTheBox del reto, y en concreto la parte del api sumbit que está en el fichero index.js:

Vemos que la lógica del código en el servidor indica que realiza una verificación en el nombre de un artista enviado a través de la solicitud POST a la ruta /api/submit.

Esta validación busca palabras clave como Haigh, Westaway o Gingell. Si encuentra alguna de ellas, genera una respuesta dinámica con un mensaje utilizando pug.compile.

Es decir, si modificamos «prueba 2» por «Haigh» vemos en la respuesta que efectivamente se envía ese mensaje, si no, nos envía la respuesta de arriba:

Si analizamos el resto de archivos, llegamos a package.json, donde nos muestra las diferentes versiones que corren esos aplicativos, entre ellas «pug» en su versión 3.0.0, la cual es vulnerable a inyección de código en plantillas RCE.

Para verificar esta vulnerabilidad, vamos a manipular la petición mediante el siguiente payload el cual intenta ejecutar el comando ls | grep flag en el servidor.

{
  "artist.name": "Haigh",
  "__proto__.block": {
    "type": "Text",
    "line": "process.mainModule.require('child_process').execSync('$(ls | grep flag)')"
  }
}

La respuesta es:

por lo que si hacemos un cat de la flag con estos comandos, nos aparece:

		{
			"artist.name":"Haigh","__proto__.block": {
	        "type": "Text", 
	        "line": "process.mainModule.require('child_process').execSync('$(cat flag)')"
		    }
		}
RESUMEN

El challenge «Gunship» comienza con una aplicación web que contiene un campo de entrada para enviar el nombre de un artista favorito.

Analizando la petición POST en Burpsuite en el endpoint /api/submit, descubrimos que la entrada del usuario interactúa con el motor de plantillas pug. Al inspeccionar el código backend, detectamos una posible vulnerabilidad de SSTI (Server-Side Template Injection).

Para confirmarla, enviamos payloads de prueba utilizando Burp Suite, como #{7*7}, y observamos la respuesta del servidor. Esto nos permitió validar que era posible inyectar y ejecutar comandos directamente en el sistema.

Una vez confirmada la vulnerabilidad RCE asociada a la template PUG, comenzamos a explorar el sistema.
Modificando cuidadosamente las solicitudes POST, localizamos la flag, ejecutamos cat flag para extraerla y completar el desafío.

Este proceso demostró la importancia de validar entradas en aplicaciones web y brindó una práctica valiosa en la explotación de vulnerabilidades de inyección de plantillas.

Otros posts relacionados