# 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, ou **http2 sur texte clair**, s'Ă©carte de la norme des connexions HTTP transitoires en mettant Ă  niveau une **connexion HTTP standard en une connexion persistante**. Cette connexion mise Ă  niveau utilise le protocole binaire http2 pour une communication continue, contrairement Ă  la nature de requĂȘte unique de l'HTTP en texte clair. Le cƓur du problĂšme de contournement rĂ©side dans l'utilisation d'un **proxy inverse**. Ordinairement, le proxy inverse traite et transmet les requĂȘtes HTTP vers le backend, retournant la rĂ©ponse du backend aprĂšs cela. Cependant, lorsque l'en-tĂȘte `Connection: Upgrade` est prĂ©sent dans une requĂȘte HTTP (souvent observĂ© avec les connexions websocket), le **proxy inverse maintient une connexion persistante** entre le client et le serveur, facilitant l'Ă©change continu requis par certains protocoles. Pour les connexions H2C, le respect de la RFC nĂ©cessite la prĂ©sence de trois en-tĂȘtes spĂ©cifiques : ``` Upgrade: h2c HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA Connection: Upgrade, HTTP2-Settings ``` La vulnĂ©rabilitĂ© survient lorsque, aprĂšs la mise Ă  niveau d'une connexion, le proxy inverse cesse de gĂ©rer les requĂȘtes individuelles, supposant que son travail de routage est terminĂ© aprĂšs l'Ă©tablissement de la connexion. L'exploitation de H2C Smuggling permet de contourner les rĂšgles de proxy inverse appliquĂ©es lors du traitement des requĂȘtes, telles que le routage basĂ© sur le chemin, l'authentification et le traitement WAF, Ă  condition qu'une connexion H2C soit initiĂ©e avec succĂšs. #### Proxies vulnĂ©rables La vulnĂ©rabilitĂ© dĂ©pend de la gestion par le proxy inverse des en-tĂȘtes `Upgrade` et parfois `Connection`. Les proxies suivants transmettent intrinsĂšquement ces en-tĂȘtes lors du proxy-pass, permettant ainsi intrinsĂšquement le H2C smuggling : * HAProxy * Traefik * Nuster En revanche, ces services ne transmettent pas intrinsĂšquement les deux en-tĂȘtes lors du proxy-pass. Cependant, ils peuvent ĂȘtre configurĂ©s de maniĂšre non sĂ©curisĂ©e, permettant le transfert non filtrĂ© des en-tĂȘtes `Upgrade` et `Connection` : * AWS ALB/CLB * NGINX * Apache * Squid * Varnish * Kong * Envoy * Apache Traffic Server #### Exploitation Il est crucial de noter que tous les serveurs ne transmettent pas intrinsĂšquement les en-tĂȘtes requis pour une mise Ă  niveau de connexion H2C conforme. Ainsi, des serveurs comme AWS ALB/CLB, NGINX et Apache Traffic Server, entre autres, bloquent naturellement les connexions H2C. NĂ©anmoins, il vaut la peine de tester avec la variante non conforme `Connection: Upgrade`, qui exclut la valeur `HTTP2-Settings` de l'en-tĂȘte `Connection`, car certains backends peuvent ne pas se conformer aux normes. {% hint style="danger" %} IndĂ©pendamment du **chemin** spĂ©cifique dĂ©signĂ© dans l'URL `proxy_pass` (par exemple, `http://backend:9999/socket.io`), la connexion Ă©tablie par dĂ©faut Ă  `http://backend:9999`. Cela permet d'interagir avec n'importe quel chemin au sein de ce point de terminaison interne, en tirant parti de cette technique. Par consĂ©quent, la spĂ©cification d'un chemin dans l'URL `proxy_pass` ne restreint pas l'accĂšs. {% endhint %} Les outils [**h2csmuggler by BishopFox**](https://github.com/BishopFox/h2csmuggler) et [**h2csmuggler by assetnote**](https://github.com/assetnote/h2csmuggler) facilitent les tentatives de **contourner les protections imposĂ©es par le proxy** en Ă©tablissant une connexion H2C, permettant ainsi l'accĂšs Ă  des ressources protĂ©gĂ©es par le proxy. Pour plus d'informations sur cette vulnĂ©rabilitĂ©, en particulier concernant NGINX, consultez [**cette ressource dĂ©taillĂ©e**](../network-services-pentesting/pentesting-web/nginx.md#proxy\_set\_header-upgrade-and-connection). ## Websocket Smuggling Le websocket smuggling, contrairement Ă  la crĂ©ation d'un tunnel HTTP2 vers un point de terminaison accessible via un proxy, Ă©tablit un tunnel Websocket pour contourner les limitations potentielles du proxy et faciliter la communication directe avec le point de terminaison. ### ScĂ©nario 1 Dans ce scĂ©nario, un backend qui offre une API WebSocket publique aux cĂŽtĂ©s d'une API REST interne inaccessible est ciblĂ© par un client malveillant cherchant Ă  accĂ©der Ă  l'API REST interne. L'attaque se dĂ©roule en plusieurs Ă©tapes : 1. Le client commence par envoyer une requĂȘte Upgrade au proxy inverse avec une version de protocole `Sec-WebSocket-Version` incorrecte dans l'en-tĂȘte. Le proxy, ne validant pas l'en-tĂȘte `Sec-WebSocket-Version`, croit que la requĂȘte Upgrade est valide et la transmet au backend. 2. Le backend rĂ©pond avec un code d'Ă©tat `426`, indiquant la version de protocole incorrecte dans l'en-tĂȘte `Sec-WebSocket-Version`. Le proxy inverse, ignorant le statut de rĂ©ponse du backend, suppose qu'il est prĂȘt pour la communication WebSocket et relaye la rĂ©ponse au client. 3. Par consĂ©quent, le proxy inverse est induit en erreur en croyant qu'une connexion WebSocket a Ă©tĂ© Ă©tablie entre le client et le backend, alors qu'en rĂ©alitĂ©, le backend avait rejetĂ© la requĂȘte Upgrade. MalgrĂ© cela, le proxy maintient une connexion TCP ou TLS ouverte entre le client et le backend, permettant au client d'accĂ©der sans restriction Ă  l'API REST privĂ©e via cette connexion. Les proxies inverses affectĂ©s incluent Varnish, qui a refusĂ© de traiter le problĂšme, et la version 1.8.0 ou antĂ©rieure du proxy Envoy, les versions ultĂ©rieures ayant modifiĂ© le mĂ©canisme de mise Ă  niveau. D'autres proxies peuvent Ă©galement ĂȘtre susceptibles. ![https://github.com/0ang3el/websocket-smuggle/raw/master/img/2-4.png](https://github.com/0ang3el/websocket-smuggle/raw/master/img/2-4.png) ### ScĂ©nario 2 Ce scĂ©nario implique un backend avec Ă  la fois une API WebSocket publique et une API REST publique pour le contrĂŽle de la santĂ©, ainsi qu'une API REST interne inaccessible. L'attaque, plus complexe, implique les Ă©tapes suivantes : 1. Le client envoie une requĂȘte POST pour dĂ©clencher l'API de contrĂŽle de la santĂ©, incluant un en-tĂȘte HTTP supplĂ©mentaire `Upgrade: websocket`. NGINX, servant de proxy inverse, interprĂšte cela comme une requĂȘte de mise Ă  niveau standard basĂ©e uniquement sur l'en-tĂȘte `Upgrade`, nĂ©gligeant les autres aspects de la requĂȘte, et la transmet au backend. 2. Le backend exĂ©cute l'API de contrĂŽle de la santĂ©, contactant une ressource externe contrĂŽlĂ©e par l'attaquant qui renvoie une rĂ©ponse HTTP avec le code d'Ă©tat `101`. Cette rĂ©ponse, une fois reçue par le backend et transmise Ă  NGINX, trompe le proxy en pensant qu'une connexion WebSocket a Ă©tĂ© Ă©tablie en raison de sa validation uniquement du code d'Ă©tat. ![https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-4.png](https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-4.png) > **Avertissement :** La complexitĂ© de cette technique augmente car elle nĂ©cessite la capacitĂ© d'interagir avec un point de terminaison capable de renvoyer un code d'Ă©tat 101. En fin de compte, NGINX est trompĂ© en croyant qu'une connexion WebSocket existe entre le client et le backend. En rĂ©alitĂ©, aucune connexion de ce type n'existe ; l'API REST de contrĂŽle de la santĂ© Ă©tait la cible. NĂ©anmoins, le proxy inverse maintient la connexion ouverte, permettant au client d'accĂ©der Ă  l'API REST privĂ©e Ă  travers elle. ![https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-5.png](https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-5.png) La plupart des proxies inverses sont vulnĂ©rables Ă  ce scĂ©nario, mais l'exploitation dĂ©pend de la prĂ©sence d'une vulnĂ©rabilitĂ© SSRF externe, gĂ©nĂ©ralement considĂ©rĂ©e comme un problĂšme de faible gravitĂ©. #### Laboratoires VĂ©rifiez les laboratoires pour tester les deux scĂ©narios Ă  [https://github.com/0ang3el/websocket-smuggle.git](https://github.com/0ang3el/websocket-smuggle.git) ### RĂ©fĂ©rences * [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" %} Apprenez et pratiquez le hacking AWS :[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Apprenez et pratiquez le hacking GCP : [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Soutenir HackTricks * Consultez les [**plans d'abonnement**](https://github.com/sponsors/carlospolop) ! * **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez-nous** sur **Twitter** 🐩 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Partagez des astuces de hacking en soumettant des PR au** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dĂ©pĂŽts GitHub.
{% endhint %}