* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
Las conexiones WebSocket se inician a través de **HTTP** y suelen ser de **larga duración**. Los mensajes se pueden enviar en **ambas direcciones en cualquier momento** y no tienen una naturaleza transaccional. La conexión normalmente permanecerá abierta e inactiva hasta que el cliente o el servidor estén listos para enviar un mensaje.\
Los WebSockets son particularmente útiles en situaciones donde se requieren mensajes de **baja latencia o iniciados por el servidor**, como feeds en tiempo real de datos financieros.
(Aquí encontrarás un resumen, pero una **guía más detallada sobre cómo se crea una conexión de WebSocket** se puede encontrar [**aquí**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc)).\
El protocolo **`wss`** establece una conexión WebSocket sobre una conexión **TLS** encriptada, mientras que el protocolo **`ws`** utiliza una conexión **no encriptada**.
Para establecer la conexión, el navegador y el servidor realizan un handshake WebSocket a través de HTTP. El navegador emite una solicitud de handshake WebSocket como la siguiente:
* Los encabezados **`Connection`** y **`Upgrade`** en la solicitud y respuesta **indican** que se trata de un **apretón de manos de WebSocket**.
* El encabezado de solicitud **`Sec-WebSocket-Version`** especifica la **versión del protocolo WebSocket** que el cliente desea utilizar. Esto suele ser `13`.
* El encabezado de solicitud **`Sec-WebSocket-Key`** contiene un **valor aleatorio** codificado en Base64, que debe generarse aleatoriamente en cada solicitud de apretón de manos.
* El encabezado de respuesta **`Sec-WebSocket-Accept`** contiene un hash del valor enviado en el encabezado de solicitud `Sec-WebSocket-Key`, concatenado con una cadena específica definida en la especificación del protocolo. Esto se hace para evitar respuestas engañosas resultantes de servidores mal configurados o proxies de caché.
El encabezado **`Sec-WebSocket-Key`** contiene un **valor aleatorio** para evitar errores de proxies de caché y **no se utiliza para fines de autenticación o manejo de sesiones** (_No es un token CSRF_).
Si descubres que los clientes están conectados a un **websocket HTTP** desde tu red local actual, puedes intentar un [Ataque de ARP Spoofing](../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 utilizar:
Puedes utilizar la **herramienta** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **para descubrir, identificar y buscar****vulnerabilidades** conocidas en websockets de forma automática.
## Herramientas de depuración de Websockets
* **Burp Suite** admite la comunicación de websockets en modo MitM de manera muy similar a como lo hace con la comunicación HTTP regular.
* [**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 interactivo de websockets** diseñado específicamente para pruebas de penetración. Proporciona una interfaz para observar **mensajes entrantes de websockets 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 utilizando **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 utilizando **websockets**.
## Laboratorio de Websockets
En [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) tienes un código para lanzar una web utilizando websockets y en [**este post**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) puedes encontrar una explicación.
**Es un** [**Cross-Site Request Forgery (CSRF)**](csrf-cross-site-request-forgery.md) **en un handshake de WebSocket**.
Surge cuando la solicitud de **handshake de WebSocket** se basa únicamente en **cookies HTTP** para el manejo de sesiones y no contiene ningún token CSRF u otros valores impredecibles.\
Un atacante puede crear una **página web maliciosa** en su propio dominio que **establece una conexión de WebSocket entre sitios** con la aplicación vulnerable. La aplicación manejará la conexión en el **contexto de la sesión del usuario víctima** con la aplicación.
Ten en cuenta que al **establecer** una conexión de **websocket**, la **cookie** se **envía** al servidor. El **servidor** puede estar utilizá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****envía de vuelta el historial de la conversación** de un usuario si se envía un mensaje con "**READY"**, entonces un **simple XSS** al establecer la conexión (la **cookie** se enviará **automáticamente** para autorizar al usuario víctima) **enviando** "**READY**" será capaz de **recuperar** el historial de la **conversación**.
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 código Javascript arbitrario en un subdominio** del dominio donde se estaba produciendo la comunicación del websocket. Debido a que era un **subdominio**, la **cookie** se estaba **enviando**, y debido a que el **Websocket no verificaba correctamente el origen**, era posible comunicarse con él y **robar tokens de él**.
Copia la aplicación web que deseas suplantar (los archivos .html, por ejemplo) y dentro del script donde se produce la comunicación del websocket, agrega este código:
```javascript
//This is the script tag to load the websocket hooker
<scriptsrc='wsHook.js'></script>
//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 <script>tagsorinsidea.jsfile
Ahora descarga el archivo `wsHook.js` desde [https://github.com/skepticfx/wshook](https://github.com/skepticfx/wshook) y **guárdalo dentro de la carpeta con los archivos web**.\
Exponiendo la aplicación web y haciendo que un usuario se conecte a ella, podrás robar los mensajes enviados y recibidos a través del websocket:
```javascript
sudo python3 -m http.server 80
```
## Otras vulnerabilidades
Como los Web Sockets son un mecanismo para enviar datos al lado del servidor y al lado del cliente, dependiendo de cómo el servidor y el cliente manejen la información, los Web Sockets pueden ser utilizados para explotar varias otras vulnerabilidades como XSS, SQLi o cualquier otra vulnerabilidad web común utilizando la entrada de un usuario desde un websocket.
Esta vulnerabilidad podría permitirte evadir las restricciones de los proxies inversos haciendo que crean que se estableció una comunicación websocket (aunque no sea cierto). Esto podría permitir a un atacante acceder a puntos finales ocultos. Para obtener más información, consulta la siguiente página:
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**merchandising oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).