8.9 KiB
Ulepszenie Smuglowania Nagłówka
Dowiedz się, jak 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!
- Zdobądź oficjalne gadżety PEASS & HackTricks
- Odkryj Rodzinę PEASS, naszą kolekcję ekskluzywnych NFT
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @carlospolopm.
- Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do HackTricks i HackTricks Cloud github repos.
Znajdź najważniejsze podatności, aby móc je szybko naprawić. Intruder śledzi powierzchnię ataku, wykonuje proaktywne skanowanie zagrożeń, znajduje problemy w całym stosie technologicznym, od interfejsów API po aplikacje internetowe i systemy chmurowe. Wypróbuj go za darmo już dziś.
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
Smuglowanie H2C
HTTP2 nad czystym tekstem (H2C)
H2C, czyli http2 nad czystym tekstem, odbiega od normy przejściowych połączeń HTTP, uaktualniając standardowe połączenie HTTP do trwałego. To uaktualnione połączenie wykorzystuje binarny protokół http2 do ciągłej komunikacji, w przeciwieństwie do jednorazowego charakteru czystego HTTP.
Istota problemu smuglowania wynika z użycia odwróconego proxy. Zwykle odwrócone proxy przetwarza i przekazuje żądania HTTP do backendu, zwracając odpowiedź backendu po tym. Jednak gdy nagłówek Connection: Upgrade
jest obecny w żądaniu HTTP (często widoczny w połączeniach websocket), odwrócone proxy utrzymuje trwałe połączenie między klientem a serwerem, ułatwiając ciągłą wymianę wymaganą przez pewne protokoły. Dla połączeń H2C, zgodność z RFC wymaga obecności trzech konkretnych nagłówków:
Upgrade: h2c
HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA
Connection: Upgrade, HTTP2-Settings
Podatność pojawia się, gdy po uaktualnieniu połączenia, odwrócony proxy przestaje zarządzać poszczególnymi żądaniami, zakładając, że jego zadanie polegające na kierowaniu jest zakończone po ustanowieniu połączenia. Wykorzystanie H2C Smuggling umożliwia obejście reguł odwróconego proxy stosowanych podczas przetwarzania żądania, takich jak kierowanie oparte na ścieżce, uwierzytelnianie i przetwarzanie WAF, zakładając, że połączenie H2C zostanie pomyślnie nawiązane.
Podatne proxy
Podatność zależy od obsługi nagłówków Upgrade
i czasami Connection
przez odwrócone proxy. Następujące proxy domyślnie przekazują te nagłówki podczas proxy-pass, co umożliwia automatyczne włączenie H2C smuggling:
- HAProxy
- Traefik
- Nuster
Z kolei te usługi nie przekazują obu nagłówków domyślnie podczas proxy-pass. Jednak mogą być skonfigurowane w sposób niebezpieczny, umożliwiający niefiltrowane przekazywanie nagłówków Upgrade
i Connection
:
- AWS ALB/CLB
- NGINX
- Apache
- Squid
- Varnish
- Kong
- Envoy
- Apache Traffic Server
Wykorzystanie
Warto zauważyć, że nie wszystkie serwery domyślnie przekazują nagłówki wymagane do zgodnego uaktualnienia połączenia H2C. Dlatego warto przetestować wariant niezgodny z zasadami, który nie zawiera wartości HTTP2-Settings
w nagłówku Connection
, ponieważ niektóre backendy mogą nie być zgodne ze standardami.
{% hint style="danger" %}
Niezależnie od określonej ścieżki w URL proxy_pass
(np. http://backend:9999/socket.io
), ustanowione połączenie domyślnie odwołuje się do http://backend:9999
. Pozwala to na interakcję z dowolną ścieżką wewnątrz tego wewnętrznego punktu końcowego, wykorzystując tę technikę. Określenie ścieżki w URL proxy_pass
nie ogranicza dostępu.
{% endhint %}
Narzędzia h2csmuggler od BishopFox i h2csmuggler od assetnote ułatwiają próby obejścia ochrony narzuconej przez proxy poprzez ustanowienie połączenia H2C, umożliwiając dostęp do zasobów zabezpieczonych przez proxy.
Aby uzyskać dodatkowe informacje na temat tej podatności, zwłaszcza dotyczące NGINX, odwołaj się do tego szczegółowego źródła.
Websocket Smuggling
Websocket smuggling, w przeciwieństwie do tworzenia tunelu HTTP2 do punktu końcowego dostępnego za pośrednictwem proxy, ustanawia tunel Websocket w celu obejścia potencjalnych ograniczeń proxy i ułatwienia bezpośredniej komunikacji z punktem końcowym.
Scenariusz 1
W tym scenariuszu złośliwy klient, który chce uzyskać dostęp do wewnętrznego REST API, kieruje atak na backend, który oferuje publiczne API Websocket obok niedostępnego wewnętrznego REST API. Atak składa się z kilku kroków:
- Klient rozpoczyna, wysyłając żądanie Upgrade do odwróconego proxy z nieprawidłową wersją protokołu
Sec-WebSocket-Version
w nagłówku. Proxy, nie sprawdzając nagłówkaSec-WebSocket-Version
, uznaje żądanie Upgrade za prawidłowe i przekazuje je do backendu. - Backend odpowiada kodem stanu
426
, wskazującym nieprawidłową wersję protokołu w nagłówkuSec-WebSocket-Version
. Odwrócone proxy, pomijając status odpowiedzi backendu, zakłada gotowość do komunikacji Websocket i przekazuje odpowiedź do klienta. - W rezultacie odwrócone proxy zostaje wprowadzone w błąd, wierząc, że zostało ustanowione połączenie Websocket między klientem a backendem, podczas gdy w rzeczywistości backend odrzucił żądanie Upgrade. Mimo to, proxy utrzymuje otwarte połączenie TCP lub TLS między klientem a backendem, umożliwiając klientowi nieograniczony dostęp do prywatnego REST API za pośrednictwem tego połączenia.
Podatne odwrócone proxy obejmują Varnish, który odmówił rozwiązania tego problemu, oraz proxy Envoy w wersji 1.8.0 lub starszej, przy czym późniejsze wersje zmieniły mechanizm uaktualniania. Inne proxy mogą również być podatne.
Scenariusz 2
Ten scenariusz dotyczy backendu posiadającego zarówno publiczne API Websocket, jak i publiczne API REST do sprawdzania stanu zdrowia, oraz niedostępnego wewnętrznego REST API. Atak, bardziej złożony, obejmuje następujące kroki:
- Klient wysyła żądanie POST, aby uruchomić API sprawdzania stanu zdrowia, zawierając dodatkowy nagłówek HTTP
Upgrade: websocket
. NGINX, działający jako odwrócone proxy, interpretuje to jako standardowe żądanie Upgrade, opierając się wyłącznie na nagłówkuUpgrade
, ignorując inne aspekty żądania, i przekazuje je do backendu. - Backend wykonuje API sprawdzania stanu zdrowia, sięgając do zewnętrznego zasobu kontrolowanego przez atakującego, który zwraca odpowiedź HTTP ze statusem
101
. Ta odpowiedź, po otrzymaniu jej przez backend i przekazaniu do NGINX, wprowadza proxy w błąd, sugerując, że zostało ustanowione połączenie Websocket ze względu na sprawdzenie tylko kodu stanu.
Ostrzeżenie: Złożoność tej techniki wzrasta, ponieważ wymaga możliwości interakcji z punktem końcowym, który może zwrócić kod stanu 101.
Ostatecznie NGINX zostaje wprowadzone w błąd, wierząc, że istnieje połączenie Websocket między klientem a backendem. W rzeczywistości takie połączenie nie istnieje; celem była REST API sprawdzania stanu zdrowia. Niemniej jednak, odwrócone proxy utrzymuje otwarte połączenie, umożliwiając klientowi dostęp do prywatnego REST API za pośrednictwem niego.
![https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-5.png](https://github.com/0ang3el/web