# Upgrade Header Smuggling {% hint style="success" %} Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks * Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! * **Join the** 馃挰 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 馃惁 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %} **Try Hard Security Group**
{% embed url="https://discord.gg/tryhardsecurity" %} *** ### H2C Smuggling #### HTTP2 Over Cleartext (H2C) H2C, czyli **http2 over cleartext**, odbiega od normy przejrzystych po艂膮cze艅 HTTP, aktualizuj膮c standardowe po艂膮czenie HTTP **do po艂膮czenia trwa艂ego**. To zaktualizowane po艂膮czenie wykorzystuje binarny protok贸艂 http2 do bie偶膮cej komunikacji, w przeciwie艅stwie do jednorazowego charakteru tekstowego HTTP. Sedno problemu z smugglingiem pojawia si臋 przy u偶yciu **reverse proxy**. Zwykle reverse 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 spotykanym w po艂膮czeniach websocket), reverse **proxy utrzymuje trwa艂e po艂膮czenie** mi臋dzy klientem a serwerem, u艂atwiaj膮c ci膮g艂膮 wymian臋 wymagan膮 przez niekt贸re protoko艂y. Dla po艂膮cze艅 H2C przestrzeganie RFC wymaga obecno艣ci trzech specyficznych nag艂贸wk贸w: ``` Upgrade: h2c HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA Connection: Upgrade, HTTP2-Settings ``` Wra偶liwo艣膰 pojawia si臋, gdy po zaktualizowaniu po艂膮czenia, odwrotny proxy przestaje zarz膮dza膰 poszczeg贸lnymi 偶膮daniami, zak艂adaj膮c, 偶e jego zadanie routingu jest zako艅czone po nawi膮zaniu po艂膮czenia. Wykorzystanie H2C Smuggling pozwala na obej艣cie zasad odwrotnego proxy stosowanych podczas przetwarzania 偶膮da艅, takich jak routing oparty na 艣cie偶kach, uwierzytelnianie i przetwarzanie WAF, zak艂adaj膮c, 偶e po艂膮czenie H2C zosta艂o pomy艣lnie nawi膮zane. #### Wra偶liwe Proxysy Wra偶liwo艣膰 zale偶y od obs艂ugi przez odwrotny proxy nag艂贸wk贸w `Upgrade` i czasami `Connection`. Nast臋puj膮ce proxy z natury przekazuj膮 te nag艂贸wki podczas proxy-pass, co z natury umo偶liwia H2C smuggling: * HAProxy * Traefik * Nuster Z drugiej strony, te us艂ugi nie przekazuj膮 z natury obu nag艂贸wk贸w podczas proxy-pass. Mog膮 jednak by膰 skonfigurowane w spos贸b niebezpieczny, co pozwala na nieprzefiltrowane przekazywanie nag艂贸wk贸w `Upgrade` i `Connection`: * AWS ALB/CLB * NGINX * Apache * Squid * Varnish * Kong * Envoy * Apache Traffic Server #### Wykorzystanie Wa偶ne jest, aby zauwa偶y膰, 偶e nie wszystkie serwery z natury przekazuj膮 nag艂贸wki wymagane do zgodnej aktualizacji po艂膮czenia H2C. W zwi膮zku z tym serwery takie jak AWS ALB/CLB, NGINX i Apache Traffic Server, mi臋dzy innymi, naturalnie blokuj膮 po艂膮czenia H2C. Niemniej jednak warto przetestowa膰 niezgodn膮 wersj臋 `Connection: Upgrade`, kt贸ra wyklucza warto艣膰 `HTTP2-Settings` z nag艂贸wka `Connection`, poniewa偶 niekt贸re backendy mog膮 nie przestrzega膰 standard贸w. {% hint style="danger" %} Niezale偶nie od konkretnej **艣cie偶ki** wyznaczonej w URL `proxy_pass` (np. `http://backend:9999/socket.io`), nawi膮zane po艂膮czenie domy艣lnie odnosi si臋 do `http://backend:9999`. Umo偶liwia to interakcj臋 z dowoln膮 艣cie偶k膮 w tym wewn臋trznym punkcie ko艅cowym, wykorzystuj膮c t臋 technik臋. W zwi膮zku z tym okre艣lenie 艣cie偶ki w URL `proxy_pass` nie ogranicza dost臋pu. {% endhint %} Narz臋dzia [**h2csmuggler by BishopFox**](https://github.com/BishopFox/h2csmuggler) i [**h2csmuggler by assetnote**](https://github.com/assetnote/h2csmuggler) u艂atwiaj膮 pr贸by **obej艣cia zabezpiecze艅 na艂o偶onych przez proxy** poprzez nawi膮zanie po艂膮czenia H2C, co umo偶liwia dost臋p do zasob贸w chronionych przez proxy. Aby uzyska膰 dodatkowe informacje na temat tej wra偶liwo艣ci, szczeg贸lnie w odniesieniu do NGINX, zapoznaj si臋 z [**tym szczeg贸艂owym zasobem**](../network-services-pentesting/pentesting-web/nginx.md#proxy\_set\_header-upgrade-and-connection). ## Websocket Smuggling Websocket smuggling, w przeciwie艅stwie do tworzenia tunelu HTTP2 do punktu ko艅cowego dost臋pnego przez proxy, ustanawia tunel Websocket, aby obej艣膰 potencjalne ograniczenia proxy i umo偶liwi膰 bezpo艣redni膮 komunikacj臋 z punktem ko艅cowym. ### Scenariusz 1 W tym scenariuszu atakowany jest backend, kt贸ry oferuje publiczne API WebSocket obok niedost臋pnego wewn臋trznego API REST. Atak przebiega w kilku krokach: 1. Klient inicjuje, wysy艂aj膮c 偶膮danie Upgrade do odwrotnego proxy z nieprawid艂ow膮 wersj膮 protoko艂u `Sec-WebSocket-Version` w nag艂贸wku. Proxy, nie weryfikuj膮c nag艂贸wka `Sec-WebSocket-Version`, uwa偶a, 偶e 偶膮danie Upgrade jest wa偶ne i przekazuje je do backendu. 2. Backend odpowiada kodem statusu `426`, wskazuj膮c na nieprawid艂ow膮 wersj臋 protoko艂u w nag艂贸wku `Sec-WebSocket-Version`. Odwrotny proxy, pomijaj膮c status odpowiedzi backendu, zak艂ada gotowo艣膰 do komunikacji WebSocket i przekazuje odpowied藕 do klienta. 3. W konsekwencji odwrotny proxy jest wprowadzany w b艂膮d, wierz膮c, 偶e nawi膮zano 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, co pozwala klientowi na nieograniczony dost臋p do prywatnego API REST przez to po艂膮czenie. Dotkni臋te odwrotne proxy obejmuj膮 Varnish, kt贸ry odm贸wi艂 rozwi膮zania problemu, oraz wersj臋 proxy Envoy 1.8.0 lub starsz膮, przy czym nowsze wersje zmieni艂y mechanizm aktualizacji. Inne proxy mog膮 by膰 r贸wnie偶 podatne. ![https://github.com/0ang3el/websocket-smuggle/raw/master/img/2-4.png](https://github.com/0ang3el/websocket-smuggle/raw/master/img/2-4.png) ### Scenariusz 2 Ten scenariusz dotyczy backendu z publicznym API WebSocket oraz publicznym API REST do sprawdzania stanu, a tak偶e niedost臋pnego wewn臋trznego API REST. Atak, bardziej z艂o偶ony, obejmuje nast臋puj膮ce kroki: 1. Klient wysy艂a 偶膮danie POST, aby uruchomi膰 API sprawdzania stanu, w tym dodatkowy nag艂贸wek HTTP `Upgrade: websocket`. NGINX, dzia艂aj膮cy jako odwrotny proxy, interpretuje to jako standardowe 偶膮danie Upgrade wy艂膮cznie na podstawie nag艂贸wka `Upgrade`, pomijaj膮c inne aspekty 偶膮dania, i przekazuje je do backendu. 2. Backend wykonuje API sprawdzania stanu, kontaktuj膮c si臋 z zewn臋trznym zasobem kontrolowanym przez atakuj膮cego, kt贸ry zwraca odpowied藕 HTTP z kodem statusu `101`. Ta odpowied藕, po odebraniu przez backend i przekazaniu do NGINX, wprowadza proxy w b艂膮d, my艣l膮c, 偶e nawi膮zano po艂膮czenie WebSocket z powodu jego weryfikacji tylko na podstawie kodu statusu. ![https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-4.png](https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-4.png) > **Ostrze偶enie:** Z艂o偶ono艣膰 tej techniki wzrasta, poniewa偶 wymaga mo偶liwo艣ci interakcji z punktem ko艅cowym zdolnym do zwr贸cenia kodu statusu 101. Ostatecznie NGINX jest wprowadzany 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艂o API REST sprawdzania stanu. Niemniej jednak odwrotny proxy utrzymuje po艂膮czenie otwarte, umo偶liwiaj膮c klientowi dost臋p do prywatnego API REST przez nie. ![https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-5.png](https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-5.png) Wi臋kszo艣膰 odwrotnych proxy jest podatna na ten scenariusz, ale wykorzystanie zale偶y od obecno艣ci zewn臋trznej wra偶liwo艣ci SSRF, zazwyczaj uwa偶anej za problem o niskim ci臋偶arze. #### Laboratoria Sprawd藕 laboratoria, aby przetestowa膰 oba scenariusze w [https://github.com/0ang3el/websocket-smuggle.git](https://github.com/0ang3el/websocket-smuggle.git) ### Odniesienia * [https://blog.assetnote.io/2021/03/18/h2c-smuggling/](https://blog.assetnote.io/2021/03/18/h2c-smuggling/) * [https://bishopfox.com/blog/h2c-smuggling-request](https://bishopfox.com/blog/h2c-smuggling-request) * [https://github.com/0ang3el/websocket-smuggle.git](https://github.com/0ang3el/websocket-smuggle.git) **Try Hard Security Group**
{% embed url="https://discord.gg/tryhardsecurity" %} {% hint style="success" %} Ucz si臋 i 膰wicz Hacking AWS:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Ucz si臋 i 膰wicz Hacking GCP: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Wsparcie HackTricks * Sprawd藕 [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)! * **Do艂膮cz do** 馃挰 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **艣led藕** nas na **Twitterze** 馃惁 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Podziel si臋 sztuczkami hackingowymi, przesy艂aj膮c PR do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytori贸w github.
{% endhint %}