# Ataques WebSocket
Aprende hacking en AWS de cero a h茅roe con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCI脫N**](https://github.com/sponsors/carlospolop)!
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colecci贸n de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **脷nete al** 馃挰 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 馃惁 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
## 驴Qu茅 son los WebSockets?
Las conexiones WebSocket se inician sobre **HTTP** y suelen ser **de larga duraci贸n**. Los mensajes pueden enviarse en **cualquier direcci贸n en cualquier momento** y no son de 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 flujos de datos financieros en tiempo real.
### 驴C贸mo se establecen las conexiones WebSocket?
(Aqu铆 encontrar谩s un resumen, pero una **gu铆a m谩s detallada sobre c贸mo se crea una conexi贸n WebSocket** se puede encontrar [**aqu铆**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc)).\
Las conexiones WebSocket normalmente se crean utilizando JavaScript del lado del cliente como el siguiente:
```javascript
var ws = new WebSocket("wss://normal-website.com/ws");
```
El protocolo **`wss`** establece un 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 de WebSocket sobre HTTP. El navegador emite una solicitud de handshake de WebSocket como la siguiente:
```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
```
Si el servidor acepta la conexi贸n, devuelve una respuesta de handshake de WebSocket como la siguiente:
```javascript
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
```
En este punto, la conexi贸n de red permanece abierta y se puede utilizar para enviar mensajes WebSocket en ambas direcciones.
**Nota**
Varias **caracter铆sticas** de los mensajes de **handshake** de WebSocket son dignas de menci贸n:
* Los encabezados **`Connection`** y **`Upgrade`** en la solicitud y respuesta **indican** que se trata de un **handshake de WebSocket**.
* El encabezado de solicitud **`Sec-WebSocket-Version`** especifica la **versi贸n del protocolo WebSocket** que el cliente desea utilizar. T铆picamente es `13`.
* El encabezado de solicitud **`Sec-WebSocket-Key`** contiene un **valor aleatorio** codificado en Base64, que debe generarse aleatoriamente en cada solicitud de handshake.
* 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 prevenir respuestas enga帽osas resultantes de servidores mal configurados o proxies de cach茅.
El encabezado **`Sec-WebSocket-Key`** contiene un **valor aleatorio** para prevenir errores de proxies de cach茅, y **no se utiliza para prop贸sitos de autenticaci贸n o manejo de sesiones** (_No es un token CSRF_).
### Consola de Linux
Puedes usar `websocat` para establecer una conexi贸n cruda 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
```
### Ataques MitM en conexiones websocket
Si descubres que los clientes est谩n conectados a un **websocket HTTP** desde tu red local actual, podr铆as intentar un [Ataque de Spoofing ARP](../generic-methodologies-and-resources/pentesting-network/#arp-spoofing) para realizar un ataque MitM entre el cliente y el servidor.\
Una vez que el cliente intente 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 de forma autom谩tica.
### Herramientas de depuraci贸n de Websockets
* **Burp Suite** soporta la comunicaci贸n de websockets MitM de una manera muy similar a como lo hace para la comunicaci贸n HTTP regular.
* La **extensi贸n de Burp Suite** [**socketsleuth**](https://github.com/snyk/socketsleuth) te permitir谩 gestionar mejor las comunicaciones de Websocket en Burp obteniendo el **historial**, estableciendo **reglas de intercepci贸n**, utilizando reglas de **coincidencia y reemplazo**, utilizando **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 entre el cliente y el servidor de WebSocket y Socket.IO.
* [**wsrepl**](https://github.com/doyensec/wsrepl) es un **REPL interactivo de websockets** dise帽ado espec铆ficamente para pentesting. Proporciona una interfaz para observar **mensajes entrantes de websockets y enviar nuevos**, con un marco de trabajo 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.
## Secuestro de WebSocket entre sitios (CSWSH)
Tambi茅n conocido como _secuestro de WebSocket de origen cruzado_.\
**Es un** [**Cross-Site Request Forgery (CSRF)**](csrf-cross-site-request-forgery.md) **en un apret贸n de manos de WebSocket.**
Surge cuando la **solicitud de apret贸n de manos de WebSocket** depende 煤nicamente de **cookies HTTP** para el manejo de sesiones y **no contiene tokens 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.
### Ataque Simple
Ten en cuenta que al **establecer** una conexi贸n **websocket** la **cookie** se **env铆a** 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** **env铆a de vuelta 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** se **enviar谩** **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** se estaba **enviando**, y debido a que el **Websocket no verificaba correctamente el Origin**, fue posible comunicarse con 茅l y **robar tokens de 茅l**.
### Robando datos del usuario
Copia la aplicaci贸n web que quieres 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