Upgrade Header Smuggling
Reading time: 7 minutes
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Soutenir HackTricks
- VĂ©rifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépÎts github.
H2C Smuggling
HTTP2 Over Cleartext (H2C)
H2C, ou http2 sur cleartext, 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 la communication continue, contrairement Ă la nature de requĂȘte unique de HTTP en texte clair.
Le cĆur du problĂšme de smuggling 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.
caution
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.
Les outils h2csmuggler by BishopFox et h2csmuggler by assetnote 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.
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 :
- 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ĂȘteSec-WebSocket-Version
, considĂšre la requĂȘte Upgrade comme valide et la transmet au backend. - Le backend rĂ©pond avec un code d'Ă©tat
426
, indiquant la version de protocole incorrecte dans l'en-tĂȘteSec-WebSocket-Version
. Le proxy inverse, nĂ©gligeant le statut de rĂ©ponse du backend, suppose qu'il est prĂȘt pour la communication WebSocket et relaie la rĂ©ponse au client. - 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.
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 :
- 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ĂȘteUpgrade
, nĂ©gligeant les autres aspects de la requĂȘte, et la transmet au backend. - 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.
Warning: 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.
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é.
Labs
Vérifiez les labs pour tester les deux scénarios dans https://github.com/0ang3el/websocket-smuggle.git
Références
- https://blog.assetnote.io/2021/03/18/h2c-smuggling/
- https://bishopfox.com/blog/h2c-smuggling-request
- https://github.com/0ang3el/websocket-smuggle.git
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Soutenir HackTricks
- VĂ©rifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépÎts github.