# WebSocket Attacks {% hint style="success" %} Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks * Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! * **Join the** 馃挰 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 馃惁 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %} ## Qu茅 son los WebSockets Las conexiones WebSocket se establecen a trav茅s de un **handshake HTTP** inicial y est谩n dise帽adas para ser **de larga duraci贸n**, permitiendo la mensajer铆a bidireccional en cualquier momento sin necesidad de un sistema transaccional. Esto hace que los WebSockets sean particularmente ventajosos para aplicaciones que requieren **baja latencia o comunicaci贸n iniciada por el servidor**, como flujos de datos financieros en vivo. ### Establecimiento de Conexiones WebSocket Una explicaci贸n detallada sobre el establecimiento de conexiones WebSocket se puede acceder [**aqu铆**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc). En resumen, las conexiones WebSocket generalmente se inician a trav茅s de JavaScript del lado del cliente como se muestra a continuaci贸n: ```javascript var ws = new WebSocket("wss://normal-website.com/ws"); ``` El protocolo `wss` significa una conexi贸n WebSocket asegurada con **TLS**, mientras que `ws` indica una conexi贸n **no asegurada**. Durante el establecimiento de la conexi贸n, se realiza un apret贸n de manos entre el navegador y el servidor a trav茅s de HTTP. El proceso de apret贸n de manos implica que el navegador env铆a una solicitud y el servidor responde, como se ilustra en los siguientes ejemplos: El navegador env铆a una solicitud de apret贸n de manos: ```javascript GET /chat HTTP/1.1 Host: normal-website.com Sec-WebSocket-Version: 13 Sec-WebSocket-Key: wDqumtseNBJdhkihL6PW7w== Connection: keep-alive, Upgrade Cookie: session=KOsEJNuflw4Rd9BDNrVmvwBF9rEijeE2 Upgrade: websocket ``` Respuesta del apret贸n de manos del servidor: ```javascript HTTP/1.1 101 Switching Protocols Connection: Upgrade Upgrade: websocket Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk= ``` La conexi贸n permanece abierta para el intercambio de mensajes en ambas direcciones una vez establecida. **Puntos Clave del Handshake de WebSocket:** - Los encabezados `Connection` y `Upgrade` se帽alan el inicio de un handshake de WebSocket. - El encabezado `Sec-WebSocket-Version` indica la versi贸n del protocolo WebSocket deseada, generalmente `13`. - Un valor aleatorio codificado en Base64 se env铆a en el encabezado `Sec-WebSocket-Key`, asegurando que cada handshake sea 煤nico, lo que ayuda a prevenir problemas con proxies de cach茅. Este valor no es para autenticaci贸n, sino para confirmar que la respuesta no es generada por un servidor o cach茅 mal configurado. - El encabezado `Sec-WebSocket-Accept` en la respuesta del servidor es un hash del `Sec-WebSocket-Key`, verificando la intenci贸n del servidor de abrir una conexi贸n WebSocket. Estas caracter铆sticas aseguran que el proceso de handshake sea seguro y confiable, allanando el camino para una comunicaci贸n en tiempo real eficiente. ### Consola de Linux Puedes usar `websocat` para establecer una conexi贸n en bruto con un websocket. ```bash websocat --insecure wss://10.10.10.10:8000 -v ``` O para crear un servidor websocat: ```bash websocat -s 0.0.0.0:8000 #Listen in port 8000 ``` ### MitM websocket connections Si descubres que los clientes est谩n conectados a un **HTTP websocket** desde tu red local actual, podr铆as intentar un [ARP Spoofing Attack ](../generic-methodologies-and-resources/pentesting-network/#arp-spoofing)para realizar un ataque MitM entre el cliente y el servidor.\ Una vez que el cliente est茅 intentando conectarse, puedes usar: ```bash websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v ``` ### Enumeraci贸n de Websockets Puedes usar la **herramienta** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **para descubrir, identificar y buscar** **vulnerabilidades** **conocidas** en websockets autom谩ticamente. ### Herramientas de depuraci贸n de Websocket * **Burp Suite** soporta la comunicaci贸n de websockets MitM de manera muy similar a como lo hace para la comunicaci贸n HTTP regular. * La [**extensi贸n de Burp Suite**](https://github.com/snyk/socketsleuth) **socketsleuth** te permitir谩 gestionar mejor las comunicaciones de Websocket en Burp al obtener el **historial**, establecer **reglas de interceptaci贸n**, usar reglas de **coincidencia y reemplazo**, usar **Intruder** y **AutoRepeater.** * [**WSSiP**](https://github.com/nccgroup/wssip)**:** Abreviatura de "**WebSocket/Socket.io Proxy**", esta herramienta, escrita en Node.js, proporciona una interfaz de usuario para **capturar, interceptar, enviar mensajes personalizados** y ver todas las comunicaciones de WebSocket y Socket.IO entre el cliente y el servidor. * [**wsrepl**](https://github.com/doyensec/wsrepl) es un **REPL de websocket interactivo** dise帽ado espec铆ficamente para pruebas de penetraci贸n. Proporciona una interfaz para observar **mensajes de websocket entrantes y enviar nuevos**, con un marco f谩cil de usar para **automatizar** esta comunicaci贸n. * [**https://websocketking.com/**](https://websocketking.com/) es una **web para comunicarse** con otras webs usando **websockets**. * [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) entre otros tipos de comunicaciones/protocolos, proporciona una **web para comunicarse** con otras webs usando **websockets.** ## Laboratorio de Websocket En [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) tienes un c贸digo para lanzar una web usando websockets y en [**esta publicaci贸n**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) puedes encontrar una explicaci贸n. ## Secuestro de WebSocket entre sitios (CSWSH) El **secuestro de WebSocket entre sitios**, tambi茅n conocido como **secuestro de WebSocket de origen cruzado**, se identifica como un caso espec铆fico de **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)** que afecta a los handshakes de WebSocket. Esta vulnerabilidad surge cuando los handshakes de WebSocket se autentican 煤nicamente a trav茅s de **cookies HTTP** sin **tokens CSRF** o medidas de seguridad similares. Los atacantes pueden explotar esto al alojar una **p谩gina web maliciosa** que inicia una conexi贸n de WebSocket entre sitios a una aplicaci贸n vulnerable. En consecuencia, esta conexi贸n se trata como parte de la sesi贸n de la v铆ctima con la aplicaci贸n, aprovechando la falta de protecci贸n CSRF en el mecanismo de manejo de sesiones. ### Ataque Simple Ten en cuenta que al **establecer** una conexi贸n de **websocket**, la **cookie** es **enviada** al servidor. El **servidor** podr铆a estar us谩ndola para **relacionar** a cada **usuario espec铆fico** con su **sesi贸n de websocket basada en la cookie enviada**. Entonces, si por **ejemplo** el **servidor de websocket** **devuelve el historial de la conversaci贸n** de un usuario si se env铆a un mensaje con "**READY"**, entonces un **XSS simple** estableciendo la conexi贸n (la **cookie** ser谩 **enviada** **autom谩ticamente** para autorizar al usuario v铆ctima) **enviando** "**READY**" podr谩 **recuperar** el historial de la **conversaci贸n**. ```markup ``` ### Cross Origin + Cookie con un subdominio diferente En esta publicaci贸n de blog [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/) el atacante logr贸 **ejecutar Javascript arbitrario en un subdominio** del dominio donde estaba ocurriendo la comunicaci贸n por web socket. Debido a que era un **subdominio**, la **cookie** estaba siendo **enviada**, y como el **Websocket no verific贸 el Origin correctamente**, fue posible comunicarse con 茅l y **robar tokens de 茅l**. ### Robando datos del usuario Copia la aplicaci贸n web que deseas suplantar (los archivos .html por ejemplo) y dentro del script donde est谩 ocurriendo la comunicaci贸n por websocket a帽ade este c贸digo: ```javascript //This is the script tag to load the websocket hooker //These are the functions that are gonig to be executed before a message //is sent by the client or received from the server //These code must be between some