WebSocket Attacks
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Las conexiones WebSocket se establecen a través de un handshake HTTP inicial y están diseñadas para ser de larga duración, permitiendo la mensajería bidireccional 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.
Una explicación detallada sobre el establecimiento de conexiones WebSocket se puede acceder aquí. En resumen, las conexiones WebSocket generalmente se inician a través de JavaScript del lado del cliente como se muestra a continuación:
El protocolo wss
significa una conexión WebSocket asegurada con TLS, mientras que ws
indica una conexión no asegurada.
Durante el establecimiento de la conexión, se realiza un apretón de manos entre el navegador y el servidor a través de HTTP. El proceso de apretón de manos implica que el navegador envía una solicitud y el servidor responde, como se ilustra en los siguientes ejemplos:
El navegador envía una solicitud de apretón de manos:
Respuesta del apretón de manos del servidor:
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 del protocolo WebSocket deseada, generalmente 13
.
Un valor aleatorio codificado en Base64 se envía 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 configurado.
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.
Puedes usar websocat
para establecer una conexión en bruto con un websocket.
O para crear un servidor websocat:
Si descubres que los clientes están conectados a un HTTP websocket desde tu red local actual, podrías intentar un ARP Spoofing Attack para realizar un ataque MitM entre el cliente y el servidor. Una vez que el cliente esté intentando conectarse, puedes usar:
Puedes usar la herramienta https://github.com/PalindromeLabs/STEWS para descubrir, identificar y buscar vulnerabilidades conocidas en websockets automáticamente.
Burp Suite soporta la comunicación de websockets MitM de 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 al obtener el historial, establecer reglas de interceptación, usar reglas de coincidencia y reemplazo, usar 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 de WebSocket y Socket.IO entre el cliente y el servidor.
wsrepl es un REPL de websocket interactivo 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.
https://websocketking.com/ es una web para comunicarse con otras webs usando websockets.
https://hoppscotch.io/realtime/websocket entre otros tipos de comunicaciones/protocolos, proporciona una web para comunicarse con otras webs usando websockets.
En Burp-Suite-Extender-Montoya-Course tienes un código para lanzar una web usando websockets y en esta publicación puedes encontrar una explicación.
El secuestro de WebSocket entre sitios, también conocido como secuestro de WebSocket de origen cruzado, se identifica como un caso específico de Cross-Site Request Forgery (CSRF) 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 o 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 de la víctima con la aplicación, aprovechando la falta de protección CSRF en el mecanismo de manejo de sesiones.
Ten en cuenta que al establecer una conexión de websocket, la cookie es enviada 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 devuelve 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 será enviada automáticamente para autorizar al usuario víctima) enviando "READY" podrá recuperar el historial de la conversación.
En esta publicación del 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 del web socket. Debido a que era un subdominio, la cookie estaba siendo enviada, y como el Websocket no verificó el Origin correctamente, fue posible comunicarse con él y robar tokens de él.
Copia la aplicación web que deseas suplantar (los archivos .html por ejemplo) y dentro del script donde está ocurriendo la comunicación del websocket agrega este código:
Ahora descarga el archivo wsHook.js
de 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:
Las Condiciones de carrera en WebSockets también son un problema, consulta esta información para aprender más.
Dado que 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.
Esta vulnerabilidad podría permitirte eludir las restricciones de 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:
Upgrade Header SmugglingAprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)