Manipulating the WebSocket handshake to exploit vulnerabilities
Laboratorio de Portswigger sobre WebSocket Attacks
Certificaciones
- eWPT
- eWPTXv2
- OSWE
- BSCP
Descripción
Esta tienda en línea tiene una función de chat en vivo implementada usando WebSockets. Cuenta con un filtro XSS agresivo pero con fallos. Para resolver el laboratorio, debemos usar un mensaje WebSocket para activar un popup alert() en el navegador del agente de soporte
Guía de WebSocket Attacks
Antes de completar este laboratorio es recomendable leerse esta guía de websocket attacks https://justice-reaper.github.io/posts/WebSocket-Attacks-Guide/
Resolución
Al acceder a la web nos sale esto
Pulsamos sobre Live chat y vemos que hay un chat de IA. Este tipo de chats suelen ser LLM's, un tipo de modelo de IA entrenado con grandes volúmenes de texto para procesar y generar lenguaje natural. Estos modelos, como ChatGPT, son una subcategoría dentro del NLP (Natural Language Processing) y se especializan en tareas como traducción, resumen, análisis de texto y generación de respuestas
Mandamos un mensaje y capturamos la petición con Burpsuite
Obtenemos esta respuesta
Si nos vamos al chat vemos que podemos inyectar código HTML
Si usamos este payload nos blacklisteará la IP y no podremos mandar nuevos mensajes al chat
1
<img src=error onerror='alert()'>
Si capturamos la petición con Burpsuite y usamos la cabecera X-Forwarded-For podemos cambiar el origen de la petición y evadir el blacklist
Ahora lo que vamos a hacer es tunelizar las peticiones del navegador a través del proxy, para ello, debemos tener intercept is off. Posteriormente hacemos click sobre Proxy > proxy settings y en el apartado de HTTP match and replace rules vamos a crear una nueva regla
Si enviamos un payload que tenga contenido malicioso y nos los vuelve a detectar nos banearía también la nueva IP, para evitar esto vamos a usar la extensión Random IP Address Header https://github.com/PortSwigger/random-ip-address-header.git o Request Randomizer https://github.com/portswigger/request-randomizer. Para este caso he preferido usar Request Randomizer pero ambas funcionan igual. Para poder instalar Request Randomizer primero debemos instalar jython, podemos instalarlo desde github https://github.com/jython/jython o con apt
1
# sudo apt install jython
Una vez instalado nos vamos a Extension > Extensions settings y añdimos la ruta en la que se aloja el .jar
Para hacer que se ejecute la extensión en todas las peticiones debemos acceder a Settings > Sessions y añadir una nueva regla
En la pestaña de Scope marcamos la casilla Proxy (use with caution) y seleccionamos Include all URLs
Una vez esta esto configurado podemos probar payloads tanto desde la web como desde Burpsuite. Cada vez que se nos bloquee la dirección desde donde proviene la petición solo tenemos que recargar la página y ya podremos mandar un nuevo payload. Vamos a usar los payloads de la cheat sheet de portswigger https://portswigger.net/web-security/cross-site-scripting/cheat-sheet para evitar que nos bloquee el código malicioso. Debemos enviar un mensaje a la web y capturar esa petición con Burpsuite, hacemos esto para evitar que se HTML encodee el payload. Al mandarlo veremos que no recibimos ningún mensaje de alerta, lo cual quiere decir, que hemos logrado bypassear las medidas de seguridad
Si vamos a la web y recargamos veremos que hemos podido explotar el XSS de forma exitosa















