hacktricks/pentesting-web/h2c-smuggling.md

106 lines
8.5 KiB
Markdown
Raw Normal View History

# Nadogradnja Header Smuggling
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 13:11:20 +00:00
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 13:11:20 +00:00
Drugi načini podrške HackTricks-u:
2022-04-28 16:01:33 +00:00
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJSTVO**](https://github.com/sponsors/carlospolop)!
2024-02-10 13:11:20 +00:00
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
2024-02-10 13:11:20 +00:00
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
2022-04-28 16:01:33 +00:00
</details>
### H2C Smuggling <a href="#http2-over-cleartext-h2c" id="http2-over-cleartext-h2c"></a>
2022-04-28 16:01:33 +00:00
#### HTTP2 preko čistog teksta (H2C) <a href="#http2-over-cleartext-h2c" id="http2-over-cleartext-h2c"></a>
H2C, ili **http2 preko čistog teksta**, odstupa od norme prolaznih HTTP veza nadogradnjom standardne HTTP **veze na postojanu**. Ova nadograđena veza koristi http2 binarni protokol za kontinuiranu komunikaciju, za razliku od jednokratne prirode plaintext HTTP-a.
Srž problema sa smugglingom nastaje sa korišćenjem **reverse proxy-ja**. Obično, reverse proxy obrađuje i prosleđuje HTTP zahteve backend-u, vraćajući odgovor backend-a nakon toga. Međutim, kada je `Connection: Upgrade` zaglavlje prisutno u HTTP zahtevu (često viđeno kod websocket veza), reverse **proxy održava postojanu vezu** između klijenta i servera, olakšavajući kontinuiranu razmenu potrebnu za određene protokole. Za H2C veze, poštovanje RFC-a zahteva prisustvo tri specifična zaglavlja:
```
Upgrade: h2c
HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA
Connection: Upgrade, HTTP2-Settings
```
### Ranjivi Proksi <a href="#exploitation" id="exploitation"></a>
Ranjivost se javlja kada, nakon ažuriranja veze, obrnuti proksi prestaje da upravlja pojedinačnim zahtevima, pretpostavljajući da je njegov posao rutiranja završen nakon uspostavljanja veze. Iskorišćavanje H2C Smugglinga omogućava zaobilaženje pravila obrnutog proksija primenjenih tokom obrade zahteva, poput rutiranja zasnovanog na putanji, autentifikacije i WAF obrade, pod uslovom da je H2C veza uspešno uspostavljena.
Ranjivi Proksiji <a href="#exploitation" id="exploitation"></a>
2022-06-19 13:37:58 +00:00
Ranjivost zavisi od rukovanja proksija sa `Upgrade` i ponekad `Connection` zaglavljima. Sledeći proksiji inherentno prosleđuju ova zaglavlja tokom proksi-prenosa, čime inherentno omogućavaju H2C smuggling:
2022-06-19 13:37:58 +00:00
2024-02-06 03:10:38 +00:00
- HAProxy
- Traefik
- Nuster
2022-06-19 13:37:58 +00:00
S druge strane, ovi servisi inherentno ne prosleđuju oba zaglavlja tokom proksi-prenosa. Međutim, mogu biti konfigurisani nebezbedno, omogućavajući nefiltrirano prosleđivanje `Upgrade` i `Connection` zaglavlja:
2022-06-19 13:37:58 +00:00
2024-02-06 03:10:38 +00:00
- AWS ALB/CLB
- NGINX
- Apache
- Squid
- Varnish
- Kong
- Envoy
- Apache Traffic Server
2022-06-19 13:37:58 +00:00
Iskorišćavanje <a href="#exploitation" id="exploitation"></a>
Važno je napomenuti da ne sve serveri inherentno prosleđuju zaglavlja potrebna za usklađenu H2C vezu. Stoga, serveri poput AWS ALB/CLB, NGINX i Apache Traffic Server, između ostalih, prirodno blokiraju H2C veze. Ipak, vredi testirati sa neusklađenom varijantom `Connection: Upgrade`, koja isključuje vrednost `HTTP2-Settings` iz `Connection` zaglavlja, jer neki backend-ovi možda ne poštuju standarde.
2022-06-19 13:37:58 +00:00
{% hint style="danger" %}
Bez obzira na specifičnu **putanju** određenu u URL-u `proxy_pass` (npr. `http://backend:9999/socket.io`), uspostavljena veza podrazumevano se vraća na `http://backend:9999`. Ovo omogućava interakciju sa bilo kojom putanjom unutar te unutrašnje tačke, koristeći ovu tehniku. Stoga, specificiranje putanje u URL-u `proxy_pass` ne ograničava pristup.
2022-06-19 13:37:58 +00:00
{% endhint %}
Alati [**h2csmuggler od BishopFox-a**](https://github.com/BishopFox/h2csmuggler) i [**h2csmuggler od assetnote-a**](https://github.com/assetnote/h2csmuggler) olakšavaju pokušaje **zaobilaženja zaštita nametnutih proksijem** uspostavljanjem H2C veze, čime se omogućava pristup resursima zaštićenim proksijem.
2022-06-19 13:58:11 +00:00
2024-02-10 13:11:20 +00:00
Za dodatne informacije o ovoj ranjivosti, posebno u vezi sa NGINX-om, pogledajte [**ovaj detaljni resurs**](../network-services-pentesting/pentesting-web/nginx.md#proxy\_set\_header-upgrade-and-connection).
2022-06-19 13:58:11 +00:00
## Websocket Smuggling
2022-06-19 13:58:11 +00:00
Websocket smuggling, za razliku od kreiranja HTTP2 tunela do tačke pristupa preko proksija, uspostavlja Websocket tunel za zaobilaženje potencijalnih ograničenja proksija i olakšava direktnu komunikaciju sa tačkom pristupa.
2022-06-19 13:58:11 +00:00
### Scenario 1
2022-06-19 13:58:11 +00:00
U ovom scenariju, zlonamerni klijent cilja backend koji nudi javni WebSocket API zajedno sa nepristupačnim internim REST API-jem. Napad se odvija u nekoliko koraka:
2022-06-19 13:58:11 +00:00
1. Klijent započinje slanjem Upgrade zahteva obrnutom proksiju sa neispravnom verzijom protokola `Sec-WebSocket-Version` u zaglavlju. Proksi, ne uspevajući da validira `Sec-WebSocket-Version` zaglavlje, veruje da je Upgrade zahtev validan i prosleđuje ga backend-u.
2. Backend odgovara status kodom `426`, ukazujući na neispravnu verziju protokola u `Sec-WebSocket-Version` zaglavlju. Obrnuti proksi, ignorisavši odgovor backend-a, pretpostavlja spremnost za WebSocket komunikaciju i prosleđuje odgovor klijentu.
3. Kao rezultat, obrnuti proksi je zaveden da veruje da je uspostavljena WebSocket veza između klijenta i backend-a, dok je zapravo backend odbio Upgrade zahtev. Bez obzira na to, proksi održava otvorenu TCP ili TLS vezu između klijenta i backend-a, omogućavajući klijentu neograničen pristup privatnom REST API-ju putem ove veze.
2022-06-19 13:58:11 +00:00
Pogođeni obrnuti proksiji uključuju Varnish, koji nije želeo da se pozabavi problemom, i Envoy proksi verziju 1.8.0 ili starije, pri čemu su kasnije verzije promenile mehanizam nadogradnje. Drugi proksiji takođe mogu biti podložni.
2022-06-19 13:58:11 +00:00
2024-02-06 03:10:38 +00:00
![https://github.com/0ang3el/websocket-smuggle/raw/master/img/2-4.png](https://github.com/0ang3el/websocket-smuggle/raw/master/img/2-4.png)
2022-06-19 13:58:11 +00:00
### Scenario 2
2022-06-19 13:58:11 +00:00
Ovaj scenario uključuje backend sa javnim WebSocket API-jem i javnim REST API-jem za proveru zdravlja, zajedno sa nepristupačnim internim REST API-jem. Napad, složeniji, uključuje sledeće korake:
2022-06-19 13:58:11 +00:00
1. Klijent šalje POST zahtev kako bi pokrenuo API provere zdravlja, uključujući dodatni HTTP zaglavlje `Upgrade: websocket`. NGINX, koji služi kao obrnuti proksi, tumači ovo kao standardni Upgrade zahtev zasnovan isključivo na `Upgrade` zaglavlju, zanemarujući druge aspekte zahteva, i prosleđuje ga backend-u.
2. Backend izvršava API provere zdravlja, pristupajući spoljnom resursu koji kontroliše napadač i koji vraća HTTP odgovor sa status kodom `101`. Ovaj odgovor, kada ga backend primi i prosledi NGINX-u, zavodi proksi da veruje da je uspostavljena WebSocket veza zbog validacije samo status koda.
2022-06-19 13:58:11 +00:00
2024-02-06 03:10:38 +00:00
![https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-4.png](https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-4.png)
2022-06-19 13:58:11 +00:00
> **Upozorenje:** Složenost ove tehnike se povećava jer zahteva sposobnost interakcije sa tačkom pristupa koja može vratiti status kod 101.
2022-06-19 13:58:11 +00:00
Na kraju, NGINX je prevaren da veruje da postoji WebSocket veza između klijenta i backend-a. U stvarnosti, takva veza ne postoji; cilj je bio API provere zdravlja. Ipak, obrnuti proksi održava otvorenu vezu, omogućavajući klijentu pristup privatnom REST API-ju putem nje.
2022-06-19 13:58:11 +00:00
2024-02-06 03:10:38 +00:00
![https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-5.png](https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-5.png)
2022-06-19 13:58:11 +00:00
Većina obrnutih proksija je ranjiva na ovaj scenario, ali iskorišćavanje zavisi od prisustva spoljne SSRF ranjivosti, obično smatrane kao problem niskog stepena ozbiljnosti.
#### Laboratorije
Proverite laboratorije kako biste testirali oba scenarija na [https://github.com/0ang3el/websocket-smuggle.git](https://github.com/0ang3el/websocket-smuggle.git)
### Reference
* [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)