WebSocket attacks guide
Guía sobre WebSocket Attacks
Certificaciones
- eWPT
- eWPTXv2
- OSWE
- BSCP
Descripción
Explicación técnica de vulnerabilidades que se pueden dar a través de websockets. Detallamos cómo identificar y explotar esta vulnerabilidades. Además, exploramos estrategias clave para prevenirlas
¿Qué son los WebSockets?
Los WebSockets son un protocolo de comunicación bidireccional y full duplex iniciado sobre HTTP. Se usan comúnmente en las aplicaciones web modernas para transmitir datos y otro tipo de tráfico asíncrono
En esta sección explicaremos la diferencia entre HTTP y WebSockets, cómo se establecen las conexiones WebSocket, y cómo son los mensajes WebSocket
¿Cuál es la diferencia entre HTTP y WebSocket?
La mayoría de la comunicación entre navegadores web y sitios web utiliza HTTP. Con HTTP, el cliente envía una solicitud y el servidor devuelve una respuesta. Normalmente, la respuesta ocurre de inmediato y la transacción termina. Incluso si la conexión de red permanece abierta, se usará para una transacción separada de solicitud y respuesta
Algunos sitios modernos usan WebSockets. Las conexiones WebSocket se inician sobre HTTP y suelen ser de larga duración. Los mensajes pueden enviarse en cualquier dirección y en cualquier momento y no son de tipo transaccional. La conexión normalmente permanece abierta e inactiva hasta que el cliente o el servidor esté listo para enviar un mensaje
Los WebSockets son especialmente útiles en situaciones donde se requieren mensajes de baja latencia o iniciados por el servidor, como en transmisiones en tiempo real de datos financieros
¿Cómo se establecen las conexiones WebSocket?
Las conexiones WebSocket normalmente se crean usando JavaScript del lado del cliente, como el siguiente ejemplo:
1
var ws = new WebSocket("wss://normal-website.com/chat");
El protocolo wss establece un WebSocket cifrado sobre una conexión TLS, mientras que ws usa una conexión sin cifrar
Para establecer la conexión, el navegador y el servidor realizan un handshake WebSocket sobre HTTP. El navegador envía una solicitud de handshake como la siguiente:
1
2
3
4
5
6
7
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 WebSocket como esta:
1
2
3
4
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 puede usarse para enviar mensajes WebSocket en cualquier dirección
Varias características de los mensajes de handshake de WebSocket son importantes:
- Las cabeceras - Connectiony- Upgradeen la- solicitudy la- respuestaindican que se trata de un- handshake WebSocket
- La cabecera - Sec-WebSocket-Versionespecifica la- versión del protocolo WebSocketque el cliente desea usar . Esto es normalmente- 13
- La cabecera - Sec-WebSocket-Keycontiene un- valor aleatorio codificado en Base64, que- debe generarse aleatoriamente en cada solicitud de handshake
- La cabecera - Sec-WebSocket-Accepten la- respuestacontiene un- hash del valorenviado en- Sec-WebSocket-Key, concatenado con una- cadena específica definida en la especificación del protocolo. Esto evita- respuestas falsascausadas por- servidores mal configuradoso- proxies en caché
¿Cómo son los mensajes WebSocket?
Una vez que se ha establecido una conexión WebSocket, los mensajes pueden enviarse de forma asíncrona en cualquier dirección, ya sea por el cliente o el servidor
Un mensaje simple puede enviarse desde el navegador usando JavaScript del lado del cliente como en el siguiente ejemplo:
1
ws.send("Peter Wiener");
En principio, los mensajes WebSocket pueden contener cualquier contenido o formato de datos. En las aplicaciones modernas, es común usar JSON para enviar datos estructurados dentro de los mensajes WebSocket
Por ejemplo, una aplicación de chat-bot que use WebSockets podría enviar un mensaje como el siguiente:
1
{"user":"Hal Pline","content":"I wanted to be a Playstation growing up, not a device to answer your inane questions"}
Manipulación del tráfico WebSocket
Encontrar vulnerabilidades en WebSockets generalmente implica manipular el tráfico de formas que la aplicación no espera. Podemos hacerlo usando Burpsuite
Con Burpsuite podemos:
- Interceptar y modificar mensajes WebSocket 
- Reproducir y generar nuevos mensajes WebSocket 
- Manipular conexiones WebSocket 
Interceptar y modificar mensajes WebSocket
Podemos usar el Proxy de Burpsuite para interceptar y modificar los mensajes WebSocket, de la siguiente forma:
- Abrir el - navegadorde- Burpsuite
- Navegarhasta la- funciónde la- aplicaciónque- usa WebSockets. Podemos- identificarque se usan- WebSocketsobservando las entradas que aparecen en la pestaña- WebSockets historydentro del- Proxyde- Burpsuite
- En la pestaña - Interceptdel- Proxyde- Burpsuite, asegurarnos de que la- intercepciónesté- activada
- Cuando se - envíeun- mensaje WebSocketdesde el- navegadoro el- servidor, se mostrará en la pestaña- Interceptpara que lo- veamoso lo- modifiquemos. Pulsar el botón- Forwardpara- reenviarel- mensaje
Repetición y generación de nuevos mensajes WebSocket
Además de interceptar y modificar mensajes WebSocket en tiempo real, podemos repetir mensajes individuales y generar mensajes nuevos. Podemos hacerlo usando el Repeater de Burpsuite:
- En el - Proxyde- Burpsuite, debemos- seleccionarun- mensajeen el- WebSockets history, o en la pestaña- Intercept, y elegir- Send to Repeaterdesde el- menú contextual
- En el - Repeaterde- Burpsuite, ahora podemos- editar el mensaje seleccionadoy- enviarlo una y otra vez
- Podemos - introducir un mensaje nuevoy- enviarloen- cualquiera de las dos direcciones, al- clienteo al- servidor
- En el panel - Historydentro del- Repeaterde- Burpsuite, podemos- ver el historial de mensajes transmitidos sobre la conexión WebSocket. Esto incluye- mensajesque- hemos generadoen el- Repeaterde- Burpsuitey también los- generadospor el- navegadoro el- servidorvía la- misma conexión
- Si queremos - editaro- reenviarcualquier- mensajedel panel- History, podemos hacerlo- seleccionando el mensajey eligiendo- Edit and resenddesde el- menú contextual
Manipulación de conexiones WebSocket
Además de manipular mensajes WebSocket, a veces es necesario manipular el handshake que establece la conexión
Existen varias situaciones en las que manipular el handshake WebSocket puede ser necesario. El hacerlo puede ser útil en los siguiente casos:
- Permitirnos alcanzar - más superficie de ataque
- Establecer una nueva conexión, ya que, algunos ataques pueden provocar que nuestra conexión se caiga
- Tokensu- otros datosen la- solicitud de handshake originalpueden estar- obsoletosy- necesitar actualización
Podemos manipular el handshake WebSocket usando el Repeater de Burpsuite:
- Enviarun- mensaje WebSocketal- Repeaterde- Burpsuitecomo se ha descrito
- En el - Repeaterde- Burpsuite, hacer- clicken el- icono del lápizjunto a la- URLdel- WebSocket. Esto abre un- asistenteque nos permite- adjuntarnosa un- WebSocket conectado existente,- clonarun- WebSocket conectado, o- reconectarnosa un- WebSocket desconectado
- Si elegimos - clonar un WebSocket conectadoo- reconectarnos a un WebSocket desconectado, el- asistentemostrará los- detalles completosde la- solicitud de handshake del WebSocket, la cual podemos- editar según sea necesarioantes de que se realice el- handshake.
- Cuando pulsemos en - Connect,- Burpsuiteintentará- ejecutar el handshake configurado y mostrará el resultado. Si- se establece correctamente una nueva conexión WebSocket, podremos usarla para- enviar mensajes nuevosmediante el- Repeaterde- Burpsuite
Vulnerabilidades de seguridad en WebSocket
En principio, prácticamente cualquier vulnerabilidad de seguridad web podría surgir en relación con los WebSockets:
- Cuando el - inputproporcionado por el- usuariose transmite al- servidorpodría- procesarse de forma insegura, conduciendo a- vulnerabilidadescomo- SQL injectiono- XXE
- Algunas vulnerabilidades - blindalcanzables vía- WebSocketspodrían- detectarsesolamente usando- OAST (técnicas out-of-band)
- Si los - datos controladospor el- atacantese- transmitenvía- WebSocketsa otros usuarios de la aplicación, esto podría provocar un- XSSu otras- vulnerabilidades del lado del cliente
Manipular mensajes WebSocket para explotar vulnerabilidades
La mayoría de las vulnerabilidades basadas en entrada que afectan a WebSockets pueden encontrarse y explotarse manipulando el contenido de los mensajes WebSocket
Por ejemplo, supongamos que una aplicación tiene un chat que usa WebSockets para enviar mensajes entre el navegador y el servidor. Cuando un usuario escribe un mensaje en el chat, se envía al servidor el mensaje mediante un WebSocket como el siguiente:
1
{"message":"Hello Carlos"}
El contenido del mensaje se transmite de nuevo vía WebSockets a otro usuario del chat, y se renderiza en el navegador del usuario así:
1
<td>Hello Carlos</td>
En esta situación, siempre que no existan otros procesados del input o defensas, un atacante puede realizar un PoC de XSS enviando el siguiente mensaje WebSocket:
1
{"message":"<img src=1 onerror='alert(1)'>"}
En este laboratorio podemos ver como se aplica esta técnica:
- Manipulating WebSocket messages to exploit vulnerabilities - https://justice-reaper.github.io/posts/WebSocket-Attacks-Lab-1/
Manipular el handshake WebSocket para explotar vulnerabilidades
Algunas vulnerabilidades de WebSocket solo pueden encontrarse y explotarse manipulando el handshake WebSocket. Estas vulnerabilidades suelen implicar fallos de diseño, como:
- Confianza en cabeceras HTTP para tomar decisiones de seguridad, por ejemplo la cabecera- X-Forwarded-For
- Defectos en los mecanismos de manejo de sesiones, ya que el- contexto de sesiónen el cual los- mensajes WebSocketson- procesadosestá generalmente determinado por- el contexto de sesión del mensaje handshake, es decir, por- el mensaje de establecimiento de conexión
- Superficie de ataqueintroducida por- cabeceras HTTP personalizadasusadas por la aplicación
En este laboratorio podemos ver como se aplica esta técnica:
- Manipulating the WebSocket handshake to exploit vulnerabilities - https://justice-reaper.github.io/posts/WebSocket-Attacks-Lab-3/
Cross-site WebSocket hijacking
En esta sección explicaremos el CSWSH (cross-site WebSocket hijacking), describiremos el impacto de comprometerlo, y detallaremos cómo realizar un ataque de cross-site WebSocket hijacking
¿Qué es el cross-site WebSocket hijacking?
El cross-site WebSocket hijacking también es conocido como cross-origin WebSocket hijacking e implica una vulnerabilidad de CSRF en el handshake WebSocket. Surge cuando la solicitud de handshake WebSocket confía únicamente en las cookies HTTP para el manejo de la sesión y no incluye token CSRF u otros valores impredecibles
Un atacante puede crear una página web maliciosa en su propio dominio que establezca una conexión WebSocket cross-site con la aplicación vulnerable. La aplicación tratará la conexión en el contexto de la sesión del usuario víctima
Por esto, la página del atacante puede enviar mensajes arbitrarios al servidor a través de la conexión y leer el contenido de los mensajes que el servidor devuelva. Esto significa que, a diferencia del CSRF normal, el atacante obtiene interacción bidireccional con la aplicación comprometida
¿Cuál es el impacto del cross-site WebSocket hijacking?
Un ataque exitoso de cross-site WebSocket hijacking a menudo permitirá a un atacante:
- Realizar acciones no autorizadas haciéndose pasar por el usuario víctima- Como en el- CSRFhabitual, el atacante puede- enviar mensajes arbitrarios a la aplicación del servidor. Si la- aplicaciónutiliza- mensajes WebSocket generados por el clientepara- ejecutar acciones sensibles, el atacante- puede generar esos mensajes desde otro dominio y disparar esas acciones
- Recuperar datos sensibles a los que el usuario tiene acceso- A diferencia del- CSRF normal, el- cross-site WebSocket hijackingproporciona al atacante- interacción bidireccionalcon la- aplicación vulnerablea través del- WebSocket secuestrado. Si la- aplicaciónusa- mensajes WebSocket generados por el servidorpara- devolver datos sensibles al usuario, el atacante puede- interceptar esos mensajesy- capturar los datos de la víctima
Realizar un cross-site WebSocket hijacking
Dado que un ataque de cross-site WebSocket hijacking es esencialmente una vulnerabilidad de CSRF en un handshake WebSocket, el primer paso para ejecutar un ataque es revisar los handshakes WebSocket que realiza la aplicación y determinar si están protegidos contra CSRF
En términos de las condiciones normales para ataques CSRF, normalmente necesitamos encontrar una solicitud de handshake que dependa únicamente de las cookies HTTP para la gestión de sesión y que no emplee tokens u otros valores impredecibles en los parámetros de la solicitud
Por ejemplo, la siguiente solicitud de handshake WebSocket probablemente sea vulnerable a CSRF, porque el único token de sesión se transmite en una cookie:
1
2
3
4
5
6
7
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
La cabecera Sec-WebSocket-Key contiene un valor aleatorio para prevenir errores de proxies en caché, y no se usa para autenticación ni para la gestión de sesión
Si la solicitud de handshake WebSocket es vulnerable a CSRF, la página del atacante puede realizar una petición cross-site para abrir un WebSocket en el sitio web vulnerable. Lo que ocurra a continuación depende completamente de la lógica de la aplicación y de cómo use WebSockets. El ataque podría implicar:
- Enviar mensajes WebSocketpara- realizar acciones no autorizadas en nombre del usuario víctima
- Enviar mensajes WebSocketpara- recuperar datos sensibles
- A veces, simplemente - esperara que- lleguen mensajes entrantesque contengan- datos sensibles
En este laboratorio podemos ver como se aplica esta técnica:
- Cross-site WebSocket hijacking - https://justice-reaper.github.io/posts/WebSocket-Attacks-Lab-2/
Cheatsheet
Usaremos estas cheatsheet para facilitar la detección y explotación de esta vulnerabilidad:
- Hacking tools https://justice-reaper.github.io/posts/Hacking-Tools/
¿Cómo llevar a cabo un ataque mediante WebSocket?
Teniendo en cuenta que los términos y herramientas mencionados a continuación se encuentran en la cheatsheet mencionada anteriormente, llevaremos a cabo los siguientes pasos:
- Instalar las extensiones - Param Minery- Random IP Address Headerde- Burpsuite
- Usar la extensión - Param Minerde- Burpsuitepara descubrir si podemos usar alguna- cabecera. Para esta- vulnerabilidadseguramente podamos usar- X-Forwarded-Forpara- bypassearlos- bloqueos mayores a 1 minuto. Una vez probado que podemos usar- X-Forwarded-For, podemos usar la extensión- Random IP Address Headerpara que nos- añadaesta- cabeceraa todas las- peticiones
- Observar a ver si podemos enviar algún - payloadmediante un- message WebSocket. Revisar la- guía de ofuscacióny la de- XSS
- Si observamos que se nos asigna una - cookiey- no existe token CSRFpodemos probar a- enviarleun- payloadal- usuario víctimay- obtener su chat
¿Cómo asegurar una conexión WebSocket?
Para minimizar el riesgo de vulnerabilidades de seguridad al usar WebSockets, debemos seguir las siguientes recomendaciones:
- Usar el protocolo - wss:// (WebSockets sobre TLS)
- Codificar de forma fijala- URL del endpoint WebSockety nunca incluir- datos controlados por el usuarioen esta- URL
- Proteger el mensaje de handshakedel- WebSocketcontra- CSRF, para- evitar vulnerabilidades de tipo cross-site WebSocket hijacking
- Tratar los - datos recibidosa través del- WebSocketcomo- no confiablesen- ambas direcciones. Debemos- manejar los datos de forma seguratanto en el- servidorcomo en el- cliente, para- prevenir vulnerabilidades basadas en inputscomo- SQL injectiony- cross-site scripting (XSS)
