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)
As conexões WebSocket são estabelecidas através de um handshake HTTP inicial e são projetadas para serem de longa duração, permitindo a comunicação bidirecional a qualquer momento sem a necessidade de um sistema transacional. Isso torna os WebSockets particularmente vantajosos para aplicações que requerem baixa latência ou comunicação iniciada pelo servidor, como fluxos de dados financeiros ao vivo.
Uma explicação detalhada sobre o estabelecimento de conexões WebSocket pode ser acessada aqui. Em resumo, as conexões WebSocket geralmente são iniciadas via JavaScript do lado do cliente, conforme mostrado abaixo:
O protocolo wss
significa uma conexão WebSocket segura com TLS, enquanto ws
indica uma conexão não segura.
Durante o estabelecimento da conexão, um handshake é realizado entre o navegador e o servidor via HTTP. O processo de handshake envolve o navegador enviando uma solicitação e o servidor respondendo, conforme ilustrado nos seguintes exemplos:
O navegador envia uma solicitação de handshake:
Resposta de handshake do servidor:
A conexão permanece aberta para troca de mensagens em ambas as direções uma vez estabelecida.
Pontos Chave do Handshake WebSocket:
Os cabeçalhos Connection
e Upgrade
sinalizam a iniciação de um handshake WebSocket.
O cabeçalho Sec-WebSocket-Version
indica a versão do protocolo WebSocket desejada, geralmente 13
.
Um valor aleatório codificado em Base64 é enviado no cabeçalho Sec-WebSocket-Key
, garantindo que cada handshake seja único, o que ajuda a prevenir problemas com proxies de cache. Este valor não é para autenticação, mas para confirmar que a resposta não é gerada por um servidor ou cache mal configurado.
O cabeçalho Sec-WebSocket-Accept
na resposta do servidor é um hash do Sec-WebSocket-Key
, verificando a intenção do servidor de abrir uma conexão WebSocket.
Esses recursos garantem que o processo de handshake seja seguro e confiável, abrindo caminho para uma comunicação em tempo real eficiente.
Você pode usar websocat
para estabelecer uma conexão bruta com um websocket.
Ou para criar um servidor websocat:
Se você descobrir que os clientes estão conectados a um HTTP websocket da sua rede local atual, você pode tentar um ARP Spoofing Attack para realizar um ataque MitM entre o cliente e o servidor. Uma vez que o cliente esteja tentando se conectar, você pode usar:
Você pode usar a ferramenta https://github.com/PalindromeLabs/STEWS para descobrir, identificar e buscar por vulnerabilidades conhecidas em websockets automaticamente.
Burp Suite suporta comunicação MitM de websockets de uma maneira muito semelhante à que faz para comunicação HTTP regular.
A extensão socketsleuth do Burp Suite permitirá que você gerencie melhor as comunicações de Websocket no Burp obtendo o histórico, definindo regras de interceptação, usando regras de correspondência e substituição, utilizando Intruder e AutoRepeater.
WSSiP: Abreviação de "WebSocket/Socket.io Proxy", esta ferramenta, escrita em Node.js, fornece uma interface de usuário para capturar, interceptar, enviar mensagens personalizadas e visualizar todas as comunicações de WebSocket e Socket.IO entre o cliente e o servidor.
wsrepl é um REPL interativo de websocket projetado especificamente para testes de penetração. Ele fornece uma interface para observar mensagens de websocket recebidas e enviar novas, com uma estrutura fácil de usar para automatizar essa comunicação.
https://websocketking.com/ é uma web para se comunicar com outras webs usando websockets.
https://hoppscotch.io/realtime/websocket entre outros tipos de comunicações/protocolos, fornece uma web para se comunicar com outras webs usando websockets.
No Burp-Suite-Extender-Montoya-Course você tem um código para lançar uma web usando websockets e em este post você pode encontrar uma explicação.
Sequestro de WebSocket entre sites, também conhecido como sequestro de WebSocket de origem cruzada, é identificado como um caso específico de Cross-Site Request Forgery (CSRF) que afeta os handshakes de WebSocket. Essa vulnerabilidade surge quando os handshakes de WebSocket se autenticam exclusivamente via cookies HTTP sem tokens CSRF ou medidas de segurança semelhantes.
Os atacantes podem explorar isso hospedando uma página web maliciosa que inicia uma conexão de WebSocket entre sites para um aplicativo vulnerável. Consequentemente, essa conexão é tratada como parte da sessão da vítima com o aplicativo, explorando a falta de proteção CSRF no mecanismo de gerenciamento de sessão.
Observe que ao estabelecer uma conexão de websocket, o cookie é enviado ao servidor. O servidor pode estar usando isso para relacionar cada usuário específico com sua sessão de websocket com base no cookie enviado.
Então, se por exemplo o servidor de websocket enviar de volta o histórico da conversa de um usuário se uma mensagem com "READY" for enviada, então um XSS simples estabelecendo a conexão (o cookie será enviado automaticamente para autorizar o usuário vítima) enviando "READY" será capaz de recuperar o histórico da conversa.
Neste post do blog https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/, o atacante conseguiu executar Javascript arbitrário em um subdomínio do domínio onde a comunicação do web socket estava ocorrendo. Como era um subdomínio, o cookie estava sendo enviado, e como o Websocket não verificou o Origin corretamente, foi possível se comunicar com ele e roubar tokens dele.
Copie a aplicação web que você deseja imitar (os arquivos .html, por exemplo) e dentro do script onde a comunicação do websocket está ocorrendo, adicione este código:
Agora baixe o arquivo wsHook.js
de https://github.com/skepticfx/wshook e salve-o dentro da pasta com os arquivos da web.
Expondo a aplicação web e fazendo um usuário se conectar a ela, você poderá roubar as mensagens enviadas e recebidas via websocket:
Condições de Corrida em WebSockets também são uma realidade, verifique esta informação para saber mais.
Como os Web Sockets são um mecanismo para enviar dados para o lado do servidor e do cliente, dependendo de como o servidor e o cliente lidam com as informações, os Web Sockets podem ser usados para explorar várias outras vulnerabilidades como XSS, SQLi ou qualquer outra vulnerabilidade web comum usando a entrada de um usuário de um websocket.
Essa vulnerabilidade poderia permitir que você contornasse as restrições de proxies reversos fazendo-os acreditar que uma comunicação websocket foi estabelecida (mesmo que não seja verdade). Isso poderia permitir que um atacante acessasse endpoints ocultos. Para mais informações, verifique a página a seguir:
Upgrade Header SmugglingAprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)