From bc709201c95c34d19fd0e71a7e523ec862bf26ec Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 29 Sep 2025 14:21:07 +0000 Subject: [PATCH] Translated ['', 'src/pentesting-web/websocket-attacks.md', 'src/pentesti --- src/SUMMARY.md | 9 +- src/pentesting-web/race-condition.md | 162 ++++++++-------- src/pentesting-web/websocket-attacks.md | 236 ++++++++++++++++++------ 3 files changed, 271 insertions(+), 136 deletions(-) diff --git a/src/SUMMARY.md b/src/SUMMARY.md index abe382dcf..be4d4275a 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -837,9 +837,14 @@ - [WWW2Exec - GOT/PLT](binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md) - [WWW2Exec - \_\_malloc_hook & \_\_free_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md) - [Common Exploiting Problems](binary-exploitation/common-exploiting-problems.md) -- [Linux kernel exploitation - toctou](binary-exploitation/linux-kernel-exploitation/posix-cpu-timers-toctou-cve-2025-38352.md) - [Windows Exploiting (Basic Guide - OSCP lvl)](binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md) -- [iOS Exploiting](binary-exploitation/ios-exploiting.md) +- [iOS Exploiting](binary-exploitation/ios-exploiting/README.md) + - [ios CVE-2020-27950-mach_msg_trailer_t](binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md) + - [ios CVE-2021-30807-IOMobileFrameBuffer](binary-exploitation/ios-exploiting/CVE-2021-30807-IOMobileFrameBuffer.md) + - [ios Corellium](binary-exploitation/ios-exploiting/ios-corellium.md) + - [ios Heap Exploitation](binary-exploitation/ios-exploiting/ios-example-heap-exploit.md) + - [ios Physical UAF - IOSurface](binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md) + # đŸ€– AI - [AI Security](AI/README.md) diff --git a/src/pentesting-web/race-condition.md b/src/pentesting-web/race-condition.md index 7e031a930..e2c190f6c 100644 --- a/src/pentesting-web/race-condition.md +++ b/src/pentesting-web/race-condition.md @@ -1,58 +1,58 @@ -# Condition de Course +# Race Condition {{#include ../banners/hacktricks-training.md}} > [!WARNING] > Pour obtenir une comprĂ©hension approfondie de cette technique, consultez le rapport original sur [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine) -## AmĂ©lioration des Attaques par Condition de Course +## AmĂ©liorer les attaques Race Condition -Le principal obstacle pour tirer parti des conditions de course est de s'assurer que plusieurs requĂȘtes sont traitĂ©es en mĂȘme temps, avec **trĂšs peu de diffĂ©rence dans leurs temps de traitement—idĂ©alement, moins de 1ms**. +Le principal obstacle pour exploiter les race conditions est de s'assurer que plusieurs requĂȘtes soient traitĂ©es en mĂȘme temps, avec une diffĂ©rence de leurs temps de traitement trĂšs faible — idĂ©alement, moins de 1 ms. -Ici, vous pouvez trouver quelques techniques pour Synchroniser les RequĂȘtes : +Voici quelques techniques pour synchroniser des requĂȘtes : -#### Attaque Ă  Paquet Unique HTTP/2 vs. Synchronisation du Dernier Octet HTTP/1.1 +#### HTTP/2 Single-Packet Attack vs. HTTP/1.1 Last-Byte Synchronization -- **HTTP/2** : Prend en charge l'envoi de deux requĂȘtes sur une seule connexion TCP, rĂ©duisant l'impact du jitter rĂ©seau. Cependant, en raison des variations cĂŽtĂ© serveur, deux requĂȘtes peuvent ne pas suffire pour une exploitation cohĂ©rente de la condition de course. -- **HTTP/1.1 'Synchronisation du Dernier Octet'** : Permet l'envoi prĂ©alable de la plupart des parties de 20-30 requĂȘtes, en retenant un petit fragment, qui est ensuite envoyĂ© ensemble, atteignant simultanĂ©ment le serveur. +- **HTTP/2** : Permet d'envoyer deux requĂȘtes sur une seule connexion TCP, rĂ©duisant l'impact du jitter rĂ©seau. Cependant, en raison des variations cĂŽtĂ© serveur, deux requĂȘtes peuvent ne pas suffire pour un exploit de race condition fiable. +- **HTTP/1.1 'Last-Byte Sync'** : Permet de prĂ©-envoyer la majeure partie de 20-30 requĂȘtes, en retenant un petit fragment, qui est ensuite envoyĂ© ensemble, obtenant ainsi une arrivĂ©e simultanĂ©e au serveur. -**PrĂ©paration pour la Synchronisation du Dernier Octet** implique : +**PrĂ©paration pour Last-Byte Sync** implique : -1. Envoyer les en-tĂȘtes et les donnĂ©es du corps moins le dernier octet sans terminer le flux. -2. Faire une pause de 100ms aprĂšs l'envoi initial. -3. DĂ©sactiver TCP_NODELAY pour utiliser l'algorithme de Nagle pour regrouper les derniers trames. -4. Pinger pour rĂ©chauffer la connexion. +1. Envoyer les en-tĂȘtes et les donnĂ©es du corps moins l'octet final sans fermer le flux. +2. Faire une pause de 100 ms aprĂšs l'envoi initial. +3. DĂ©sactiver TCP_NODELAY pour utiliser Nagle's algorithm afin de regrouper les frames finaux. +4. Envoyer des pings pour prĂ©chauffer la connexion. -L'envoi subsĂ©quent des trames retenues devrait aboutir Ă  leur arrivĂ©e dans un seul paquet, vĂ©rifiable via Wireshark. Cette mĂ©thode ne s'applique pas aux fichiers statiques, qui ne sont gĂ©nĂ©ralement pas impliquĂ©s dans les attaques RC. +L'envoi ultĂ©rieur des frames retenues devrait aboutir Ă  leur arrivĂ©e dans un seul paquet, vĂ©rifiable via Wireshark. Cette mĂ©thode ne s'applique pas aux fichiers statiques, qui ne sont gĂ©nĂ©ralement pas impliquĂ©s dans les attaques RC. -### S'adapter Ă  l'Architecture du Serveur +### S'adapter Ă  l'architecture du serveur -Comprendre l'architecture de la cible est crucial. Les serveurs frontaux peuvent router les requĂȘtes diffĂ©remment, affectant le timing. Le rĂ©chauffement prĂ©ventif de la connexion cĂŽtĂ© serveur, Ă  travers des requĂȘtes sans consĂ©quence, pourrait normaliser le timing des requĂȘtes. +Comprendre l'architecture cible est crucial. Les serveurs frontaux peuvent router les requĂȘtes diffĂ©remment, ce qui affecte le timing. Le prĂ©chauffage cĂŽtĂ© serveur, via des requĂȘtes sans consĂ©quence, peut normaliser le timing des requĂȘtes. -#### Gestion du Verrouillage BasĂ© sur la Session +#### GĂ©rer le verrouillage basĂ© sur la session -Des frameworks comme le gestionnaire de session de PHP sĂ©rialisent les requĂȘtes par session, obscurcissant potentiellement les vulnĂ©rabilitĂ©s. Utiliser diffĂ©rents jetons de session pour chaque requĂȘte peut contourner ce problĂšme. +Des frameworks comme le session handler de PHP sĂ©rialisent les requĂȘtes par session, ce qui peut masquer des vulnĂ©rabilitĂ©s. Utiliser diffĂ©rents tokens de session pour chaque requĂȘte peut contourner ce problĂšme. -#### Surmonter les Limites de Taux ou de Ressources +#### Surmonter les limites de dĂ©bit ou de ressources -Si le rĂ©chauffement de la connexion est inefficace, dĂ©clencher intentionnellement les dĂ©lais de limites de taux ou de ressources des serveurs web Ă  travers un flot de requĂȘtes fictives pourrait faciliter l'attaque Ă  paquet unique en induisant un dĂ©lai cĂŽtĂ© serveur propice aux conditions de course. +Si le prĂ©chauffage de la connexion est inefficace, provoquer intentionnellement des dĂ©lais liĂ©s aux limites de dĂ©bit ou de ressources des serveurs web via un flood de requĂȘtes factices peut faciliter le single-packet attack en induisant un dĂ©lai cĂŽtĂ© serveur propice aux race conditions. -## Exemples d'Attaque +## Attack Examples -- **Tubo Intruder - attaque Ă  paquet unique HTTP2 (1 point de terminaison)** : Vous pouvez envoyer la requĂȘte Ă  **Turbo intruder** (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), vous pouvez changer dans la requĂȘte la valeur que vous souhaitez forcer pour **`%s`** comme dans `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` et ensuite sĂ©lectionner le **`examples/race-single-packer-attack.py`** dans le menu dĂ©roulant : +- **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: Vous pouvez envoyer la requĂȘte vers **Turbo intruder** (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), vous pouvez modifier dans la requĂȘte la valeur que vous voulez bruteforcer pour **`%s`** comme dans `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` et ensuite sĂ©lectionner le **`examples/race-single-packer-attack.py`** dans la liste dĂ©roulante :
-Si vous allez **envoyer diffĂ©rentes valeurs**, vous pourriez modifier le code avec celui-ci qui utilise une liste de mots depuis le presse-papiers : +Si vous allez **envoyer diffĂ©rentes valeurs**, vous pouvez modifier le code avec celui-ci qui utilise une wordlist depuis le presse-papiers: ```python passwords = wordlists.clipboard for password in passwords: engine.queue(target.req, password, gate='race1') ``` > [!WARNING] -> Si le web ne prend pas en charge HTTP2 (uniquement HTTP1.1), utilisez `Engine.THREADED` ou `Engine.BURP` au lieu de `Engine.BURP2`. +> Si le site ne prend pas en charge HTTP2 (seulement HTTP1.1), utilisez `Engine.THREADED` ou `Engine.BURP` au lieu de `Engine.BURP2`. -- **Tubo Intruder - attaque Ă  paquet unique HTTP2 (Plusieurs points de terminaison)** : Dans le cas oĂč vous devez envoyer une requĂȘte Ă  1 point de terminaison puis plusieurs Ă  d'autres points de terminaison pour dĂ©clencher le RCE, vous pouvez modifier le script `race-single-packet-attack.py` avec quelque chose comme : +- **Tubo Intruder - HTTP2 single-packet attack (Several endpoints)**: Dans le cas oĂč vous devez envoyer une requĂȘte Ă  1 endpoint puis plusieurs Ă  d'autres endpoints pour dĂ©clencher la RCE, vous pouvez modifier le script `race-single-packet-attack.py` avec quelque chose comme: ```python def queueRequests(target, wordlists): engine = RequestEngine(endpoint=target.endpoint, @@ -83,16 +83,16 @@ engine.queue(confirmationReq, gate=currentAttempt) # send all the queued requests for this attempt engine.openGate(currentAttempt) ``` -- Il est Ă©galement disponible dans **Repeater** via la nouvelle option '**Envoyer le groupe en parallĂšle**' dans Burp Suite. -- Pour **limit-overrun**, vous pourriez simplement ajouter la **mĂȘme requĂȘte 50 fois** dans le groupe. -- Pour **connection warming**, vous pourriez **ajouter** au **dĂ©but** du **groupe** quelques **requĂȘtes** vers une partie non statique du serveur web. -- Pour **delaying** le processus **entre** le traitement **d'une requĂȘte et une autre** en 2 Ă©tapes substantielles, vous pourriez **ajouter des requĂȘtes supplĂ©mentaires entre** les deux requĂȘtes. -- Pour un RC **multi-endpoint**, vous pourriez commencer Ă  envoyer la **requĂȘte** qui **va Ă  l'Ă©tat cachĂ©** et ensuite **50 requĂȘtes** juste aprĂšs qui **exploite l'Ă©tat cachĂ©**. +- Il est Ă©galement disponible dans **Repeater** via la nouvelle option '**Send group in parallel**' dans Burp Suite. +- Pour **limit-overrun** vous pouvez simplement ajouter la **mĂȘme requĂȘte 50 fois** dans le groupe. +- Pour **connection warming**, vous pouvez **ajouter** au **dĂ©but** du **groupe** quelques **requĂȘtes** vers une partie non statique du serveur web. +- Pour **retarder** le processus **entre** le traitement **d'une requĂȘte et d'une autre** en 2 Ă©tapes de sous-Ă©tats, vous pouvez **ajouter des requĂȘtes supplĂ©mentaires entre** les deux requĂȘtes. +- Pour un RC **multi-endpoint** vous pouvez commencer par envoyer la **requĂȘte** qui **va vers l'Ă©tat cachĂ©** et ensuite **50 requĂȘtes** juste aprĂšs qui **exploitent l'Ă©tat cachĂ©**.
-- **Script python automatisĂ©** : L'objectif de ce script est de changer l'email d'un utilisateur tout en le vĂ©rifiant continuellement jusqu'Ă  ce que le token de vĂ©rification du nouvel email arrive Ă  l'ancien email (c'est parce que dans le code, il voyait un RC oĂč il Ă©tait possible de modifier un email mais d'avoir la vĂ©rification envoyĂ©e Ă  l'ancien car la variable indiquant l'email Ă©tait dĂ©jĂ  peuplĂ©e avec le premier).\ -Lorsque le mot "objetivo" est trouvĂ© dans les emails reçus, nous savons que nous avons reçu le token de vĂ©rification de l'email changĂ© et nous mettons fin Ă  l'attaque. +- **Automated python script**: Le but de ce script est de changer l'email d'un utilisateur tout en vĂ©rifiant en continu jusqu'Ă  ce que le verification token du nouvel email arrive dans l'ancien email (c'est parce que dans le code on observait un RC oĂč il Ă©tait possible de modifier un email mais que la vĂ©rification soit envoyĂ©e Ă  l'ancien, car la variable indiquant l'email Ă©tait dĂ©jĂ  initialisĂ©e avec la premiĂšre valeur).\ +Quand le mot "objetivo" est trouvĂ© dans les emails reçus, nous savons que nous avons reçu le verification token de l'email modifiĂ© et nous terminons l'attaque. ```python # https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun # Script from victor to solve a HTB challenge @@ -217,21 +217,21 @@ h2_conn.close_connection() response = requests.get(url, verify=False) ``` -### AmĂ©lioration de l'attaque par paquet unique +### AmĂ©lioration du Single Packet Attack -Dans la recherche originale, il est expliquĂ© que cette attaque a une limite de 1 500 octets. Cependant, dans [**ce post**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/), il a Ă©tĂ© expliquĂ© comment il est possible d'Ă©tendre la limitation de 1 500 octets de l'attaque par paquet unique Ă  la **limitation de fenĂȘtre de 65 535 B de TCP en utilisant la fragmentation au niveau IP** (en divisant un seul paquet en plusieurs paquets IP) et en les envoyant dans un ordre diffĂ©rent, ce qui a permis d'empĂȘcher le rĂ©assemblage du paquet jusqu'Ă  ce que tous les fragments atteignent le serveur. Cette technique a permis au chercheur d'envoyer 10 000 requĂȘtes en environ 166 ms. +Dans la recherche originale, il est expliquĂ© que cette attaque a une limite de 1 500 octets. Cependant, dans [**this post**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/), il est expliquĂ© comment il est possible d'Ă©tendre la limitation de 1 500 octets de l'attaque Single Packet Attack Ă  **la limitation de fenĂȘtre de 65,535 B de TCP en utilisant la fragmentation au niveau IP** (en scindant un seul paquet en plusieurs paquets IP) et en les envoyant dans un ordre diffĂ©rent, ce qui empĂȘche le rĂ©assemblage du paquet jusqu'Ă  ce que tous les fragments aient atteint le serveur. Cette technique a permis au chercheur d'envoyer 10 000 requĂȘtes en environ 166 ms. -Notez que bien que cette amĂ©lioration rende l'attaque plus fiable dans les RC qui nĂ©cessitent que des centaines/milliers de paquets arrivent en mĂȘme temps, elle peut Ă©galement avoir certaines limitations logicielles. Certains serveurs HTTP populaires comme Apache, Nginx et Go ont un paramĂštre strict `SETTINGS_MAX_CONCURRENT_STREAMS` de 100, 128 et 250. Cependant, d'autres comme NodeJS et nghttp2 l'ont illimitĂ©.\ -Cela signifie essentiellement qu'Apache ne considĂ©rera que 100 connexions HTTP Ă  partir d'une seule connexion TCP (limitant ainsi cette attaque RC). +Notez que bien que cette amĂ©lioration rende l'attaque plus fiable pour des RC qui nĂ©cessitent que des centaines/milliers de paquets arrivent en mĂȘme temps, elle peut aussi rencontrer des limitations logicielles. Certains serveurs HTTP populaires comme Apache, Nginx et Go ont un rĂ©glage strict `SETTINGS_MAX_CONCURRENT_STREAMS` fixĂ© respectivement Ă  100, 128 et 250. Cependant, d'autres comme NodeJS et nghttp2 l'ont illimitĂ©.\ +Cela signifie essentiellement qu'Apache ne considĂ©rera que 100 connexions HTTP Ă  partir d'une seule connexion TCP (limitant cette attaque RC). -Vous pouvez trouver quelques exemples utilisant cette technique dans le dĂ©pĂŽt [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main). +Vous pouvez trouver quelques exemples utilisant cette technique dans le repo [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main). ## Raw BF -Avant la recherche prĂ©cĂ©dente, voici quelques charges utiles utilisĂ©es qui essayaient simplement d'envoyer les paquets aussi rapidement que possible pour provoquer une RC. +Avant les recherches prĂ©cĂ©dentes, voici quelques payloads utilisĂ©s qui essayaient simplement d'envoyer les paquets aussi rapidement que possible pour provoquer un RC. -- **RĂ©pĂ©teur :** Consultez les exemples de la section prĂ©cĂ©dente. -- **Intrus :** Envoyez la **requĂȘte** Ă  **Intrus**, dĂ©finissez le **nombre de threads** Ă  **30** dans le **menu Options** et sĂ©lectionnez comme charge utile **Null payloads** et gĂ©nĂ©rez **30**. +- **Repeater:** Check the examples from the previous section. +- **Intruder**: Envoyez la **requĂȘte** Ă  **Intruder**, dĂ©finissez le **nombre de threads** sur **30** dans le **menu Options**, sĂ©lectionnez comme payload **Null payloads** et gĂ©nĂ©rez **30.** - **Turbo Intruder** ```python def queueRequests(target, wordlists): @@ -281,73 +281,73 @@ asyncio.run(main()) ``` ## **MĂ©thodologie RC** -### Limite-dĂ©passement / TOCTOU +### DĂ©passement de limite / TOCTOU -C'est le type de condition de course le plus basique oĂč **les vulnĂ©rabilitĂ©s** **apparaissent** dans des endroits qui **limitent le nombre de fois que vous pouvez effectuer une action**. Comme utiliser le mĂȘme code de rĂ©duction dans un magasin en ligne plusieurs fois. Un exemple trĂšs simple peut ĂȘtre trouvĂ© dans [**ce rapport**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) ou dans [**ce bug**](https://hackerone.com/reports/759247)**.** +C'est le type le plus basique de race condition oĂč des **vulnĂ©rabilitĂ©s** apparaissent dans des endroits qui **limitent le nombre de fois oĂč vous pouvez effectuer une action**. Par exemple utiliser le mĂȘme code de rĂ©duction plusieurs fois dans une boutique en ligne. Un exemple trĂšs simple se trouve dans [**ce rapport**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) ou dans [**ce bug**](https://hackerone.com/reports/759247)**.** -Il existe de nombreuses variations de ce type d'attaque, y compris : +Il existe de nombreuses variantes de ce type d'attaque, notamment : -- Échanger une carte-cadeau plusieurs fois -- Évaluer un produit plusieurs fois -- Retirer ou transfĂ©rer de l'argent en excĂšs de votre solde de compte +- Utiliser une carte cadeau plusieurs fois +- Noter un produit plusieurs fois +- Retirer ou transfĂ©rer de l'argent en excĂšs du solde de votre compte - RĂ©utiliser une seule solution CAPTCHA -- Contourner une limite de taux anti-brute-force +- Contourner une limitation de taux anti-brute-force ### **Sous-Ă©tats cachĂ©s** -Exploiter des conditions de course complexes implique souvent de tirer parti d'opportunitĂ©s brĂšves pour interagir avec des sous-Ă©tats machine cachĂ©s ou **non intentionnels**. Voici comment procĂ©der : +L'exploitation de race conditions complexes implique souvent de profiter de brĂšves opportunitĂ©s pour interagir avec des sous-Ă©tats machine cachĂ©s ou **non intentionnels**. Voici comment aborder cela : 1. **Identifier les sous-Ă©tats cachĂ©s potentiels** -- Commencez par identifier les points de terminaison qui modifient ou interagissent avec des donnĂ©es critiques, telles que les profils d'utilisateur ou les processus de rĂ©initialisation de mot de passe. Concentrez-vous sur : -- **Stockage** : PrĂ©fĂ©rez les points de terminaison qui manipulent des donnĂ©es persistantes cĂŽtĂ© serveur plutĂŽt que celles qui gĂšrent des donnĂ©es cĂŽtĂ© client. -- **Action** : Recherchez des opĂ©rations qui modifient des donnĂ©es existantes, qui sont plus susceptibles de crĂ©er des conditions exploitables par rapport Ă  celles qui ajoutent de nouvelles donnĂ©es. -- **ClĂ©** : Les attaques rĂ©ussies impliquent gĂ©nĂ©ralement des opĂ©rations basĂ©es sur le mĂȘme identifiant, par exemple, le nom d'utilisateur ou le jeton de rĂ©initialisation. -2. **Effectuer un premier sondage** -- Testez les points de terminaison identifiĂ©s avec des attaques de condition de course, en observant toute dĂ©viation par rapport aux rĂ©sultats attendus. Des rĂ©ponses inattendues ou des changements dans le comportement de l'application peuvent signaler une vulnĂ©rabilitĂ©. +- Commencez par repĂ©rer les endpoints qui modifient ou interagissent avec des donnĂ©es critiques, comme les profils utilisateur ou les processus de password reset. Concentrez-vous sur : +- **Storage** : PrĂ©fĂ©rez les endpoints qui manipulent des donnĂ©es persistantes cĂŽtĂ© serveur plutĂŽt que ceux qui gĂšrent des donnĂ©es cĂŽtĂ© client. +- **Action** : Recherchez des opĂ©rations qui modifient des donnĂ©es existantes, plus susceptibles de crĂ©er des conditions exploitables que celles qui ajoutent de nouvelles donnĂ©es. +- **Keying** : Les attaques rĂ©ussies impliquent gĂ©nĂ©ralement des opĂ©rations indexĂ©es sur le mĂȘme identifiant, par ex. username ou reset token. +2. **Effectuer des tests initiaux** +- Testez les endpoints identifiĂ©s avec des attaques de race condition, en observant tout Ă©cart par rapport aux rĂ©sultats attendus. Des rĂ©ponses inattendues ou des changements dans le comportement de l'application peuvent signaler une vulnĂ©rabilitĂ©. 3. **DĂ©montrer la vulnĂ©rabilitĂ©** -- RĂ©duisez l'attaque au nombre minimal de requĂȘtes nĂ©cessaires pour exploiter la vulnĂ©rabilitĂ©, souvent juste deux. Cette Ă©tape peut nĂ©cessiter plusieurs tentatives ou de l'automatisation en raison du timing prĂ©cis impliquĂ©. +- RĂ©duisez l'attaque au nombre minimal de requĂȘtes nĂ©cessaire pour l'exploiter, souvent seulement deux. Cette Ă©tape peut nĂ©cessiter plusieurs tentatives ou de l'automatisation en raison du timing prĂ©cis requis. ### Attaques sensibles au temps -La prĂ©cision dans le timing des requĂȘtes peut rĂ©vĂ©ler des vulnĂ©rabilitĂ©s, surtout lorsque des mĂ©thodes prĂ©visibles comme les horodatages sont utilisĂ©es pour les jetons de sĂ©curitĂ©. Par exemple, gĂ©nĂ©rer des jetons de rĂ©initialisation de mot de passe basĂ©s sur des horodatages pourrait permettre d'obtenir des jetons identiques pour des requĂȘtes simultanĂ©es. +La prĂ©cision dans le timing des requĂȘtes peut rĂ©vĂ©ler des vulnĂ©rabilitĂ©s, surtout lorsque des mĂ©thodes prĂ©visibles comme des timestamps sont utilisĂ©es pour des security tokens. Par exemple, la gĂ©nĂ©ration de password reset tokens basĂ©e sur des timestamps pourrait produire des tokens identiques pour des requĂȘtes simultanĂ©es. **Pour exploiter :** -- Utilisez un timing prĂ©cis, comme une attaque par paquet unique, pour effectuer des requĂȘtes de rĂ©initialisation de mot de passe simultanĂ©es. Des jetons identiques indiquent une vulnĂ©rabilitĂ©. +- Utilisez un timing prĂ©cis, comme une attaque par paquet unique, pour effectuer des requĂȘtes de password reset concurrentes. Des tokens identiques indiquent une vulnĂ©rabilitĂ©. **Exemple :** -- Demandez deux jetons de rĂ©initialisation de mot de passe en mĂȘme temps et comparez-les. Des jetons correspondants suggĂšrent un dĂ©faut dans la gĂ©nĂ©ration de jetons. +- Demandez deux password reset tokens en mĂȘme temps et comparez-les. Des tokens identiques suggĂšrent une faiblesse dans la gĂ©nĂ©ration des tokens. -**VĂ©rifiez ce** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **pour essayer cela.** +**Consultez** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **pour essayer ceci.** ## Études de cas sur les sous-Ă©tats cachĂ©s ### Payer & ajouter un article -VĂ©rifiez ce [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) pour voir comment **payer** dans un magasin et **ajouter un article supplĂ©mentaire** que vous **n'aurez pas besoin de payer**. +Consultez [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) pour voir comment **payer** dans une boutique et **ajouter un article supplĂ©mentaire** que vous **n'aurez pas besoin de payer**. -### Confirmer d'autres e-mails +### Confirmer d'autres adresses e-mail -L'idĂ©e est de **vĂ©rifier une adresse e-mail et de la changer en une autre en mĂȘme temps** pour dĂ©couvrir si la plateforme vĂ©rifie la nouvelle adresse modifiĂ©e. +L'idĂ©e est de **vĂ©rifier une adresse e-mail et de la remplacer simultanĂ©ment par une autre** pour vĂ©rifier si la plateforme confirme la nouvelle adresse. -### Changer l'e-mail en 2 adresses e-mail basĂ©es sur des cookies +### Changer l'email en 2 adresses e-mail (basĂ© sur Cookie) -Selon [**cette recherche**](https://portswigger.net/research/smashing-the-state-machine), Gitlab Ă©tait vulnĂ©rable Ă  une prise de contrĂŽle de cette maniĂšre car il pourrait **envoyer** le **jeton de vĂ©rification d'e-mail d'une adresse Ă  l'autre**. +Selon [**this research**](https://portswigger.net/research/smashing-the-state-machine) Gitlab Ă©tait vulnĂ©rable Ă  une prise de contrĂŽle de cette façon parce qu'il pouvait **envoyer** le **token de vĂ©rification d'une adresse e-mail Ă  une autre**. -**VĂ©rifiez ce** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **pour essayer cela.** +**Consultez** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **pour essayer ceci.** -### États de base de donnĂ©es cachĂ©s / Contournement de confirmation +### États cachĂ©s de la base de donnĂ©es / Contournement de confirmation -Si **2 Ă©critures diffĂ©rentes** sont utilisĂ©es pour **ajouter** **des informations** dans une **base de donnĂ©es**, il y a une petite portion de temps oĂč **seules les premiĂšres donnĂ©es ont Ă©tĂ© Ă©crites** dans la base de donnĂ©es. Par exemple, lors de la crĂ©ation d'un utilisateur, le **nom d'utilisateur** et le **mot de passe** peuvent ĂȘtre **Ă©crits** et **ensuite le jeton** pour confirmer le compte nouvellement créé est Ă©crit. Cela signifie que pendant un court laps de temps, le **jeton pour confirmer un compte est nul**. +Si **2 Ă©critures diffĂ©rentes** sont utilisĂ©es pour **ajouter** **des informations** dans une **base de donnĂ©es**, il existe une courte pĂ©riode oĂč **seules les premiĂšres donnĂ©es ont Ă©tĂ© Ă©crites** dans la base. Par exemple, lors de la crĂ©ation d'un utilisateur le **nom d'utilisateur** et le **mot de passe** peuvent ĂȘtre **Ă©crits**, puis **le token** pour confirmer le compte nouvellement créé est Ă©crit. Cela signifie que pendant un court instant le **token pour confirmer un compte est null**. -Par consĂ©quent, **enregistrer un compte et envoyer plusieurs requĂȘtes avec un jeton vide** (`token=` ou `token[]=` ou toute autre variation) pour confirmer le compte immĂ©diatement pourrait permettre de c**onfirmer un compte** oĂč vous ne contrĂŽlez pas l'e-mail. +Par consĂ©quent, **s'enregistrer et envoyer plusieurs requĂȘtes avec un token vide** (`token=` ou `token[]=` ou toute autre variation) pour confirmer le compte immĂ©diatement pourrait permettre de **confirmer un compte** dont vous ne contrĂŽlez pas l'e-mail. -**VĂ©rifiez ce** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **pour essayer cela.** +**Consultez** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **pour essayer ceci.** -### Contournement de 2FA +### Contourner le 2FA -Le pseudo-code suivant est vulnĂ©rable Ă  une condition de course car pendant un trĂšs court laps de temps, le **2FA n'est pas appliquĂ©** pendant que la session est créée : +Le pseudo-code suivant est vulnĂ©rable Ă  une race condition parce que pendant un trĂšs court laps de temps la **2FA n'est pas appliquĂ©e** alors que la session est créée : ```python session['userid'] = user.userid if user.mfa_enabled: @@ -357,22 +357,23 @@ session['enforce_mfa'] = True ``` ### OAuth2 persistance Ă©ternelle -Il existe plusieurs [**fournisseurs OAUth**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). Ces services vous permettront de crĂ©er une application et d'authentifier les utilisateurs que le fournisseur a enregistrĂ©s. Pour ce faire, le **client** devra **permettre Ă  votre application** d'accĂ©der Ă  certaines de ses donnĂ©es Ă  l'intĂ©rieur du **fournisseur OAUth**.\ -Donc, jusqu'ici, c'est juste une connexion classique avec google/linkedin/github... oĂč vous ĂȘtes invitĂ© avec une page disant : "_L'application \ souhaite accĂ©der Ă  vos informations, voulez-vous l'autoriser ?_" +There are several [**OAUth providers**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). Ces services vous permettent de crĂ©er une application et d'authentifier les utilisateurs que le provider a enregistrĂ©s. Pour ce faire, le **client** devra **autoriser votre application** Ă  accĂ©der Ă  une partie de leurs donnĂ©es chez le **OAUth provider**.\ +Donc, jusqu'ici c'est juste un login commun avec google/linkedin/github... oĂč on vous affiche une page disant : "_Application \ veut accĂ©der Ă  vos informations, voulez-vous l'autoriser ?_" -#### Condition de course dans `authorization_code` +#### Race Condition dans `authorization_code` -Le **problĂšme** apparaĂźt lorsque vous **l'acceptez** et envoie automatiquement un **`authorization_code`** Ă  l'application malveillante. Ensuite, cette **application abuse d'une Condition de course dans le fournisseur de service OAUth pour gĂ©nĂ©rer plus d'un AT/RT** (_Token d'authentification/Token de rafraĂźchissement_) Ă  partir du **`authorization_code`** pour votre compte. En gros, elle va abuser du fait que vous avez acceptĂ© l'application pour accĂ©der Ă  vos donnĂ©es afin de **crĂ©er plusieurs comptes**. Ensuite, si vous **arrĂȘtez de permettre Ă  l'application d'accĂ©der Ă  vos donnĂ©es, une paire d'AT/RT sera supprimĂ©e, mais les autres resteront valides**. +Le **problĂšme** apparaĂźt lorsque vous **l'acceptez** et qu'il envoie automatiquement un **`authorization_code`** Ă  l'application malveillante. Ensuite, cette **application abuse d'une Race Condition dans le OAUth service provider pour gĂ©nĂ©rer plus d'un AT/RT** (_Authentication Token/Refresh Token_) Ă  partir du **`authorization_code`** pour votre compte. En gros, elle exploite le fait que vous avez autorisĂ© l'application Ă  accĂ©der Ă  vos donnĂ©es pour **crĂ©er plusieurs comptes**. Ensuite, si vous **cessez d'autoriser l'application Ă  accĂ©der Ă  vos donnĂ©es, une paire d'AT/RT sera supprimĂ©e, mais les autres resteront valides**. -#### Condition de course dans `Refresh Token` +#### Race Condition dans `Refresh Token` -Une fois que vous avez **obtenu un RT valide**, vous pourriez essayer de **l'abuser pour gĂ©nĂ©rer plusieurs AT/RT** et **mĂȘme si l'utilisateur annule les autorisations** pour l'application malveillante d'accĂ©der Ă  ses donnĂ©es, **plusieurs RT resteront valides.** +Une fois que vous avez **obtenu un RT valide**, vous pouvez essayer de **l'abuser pour gĂ©nĂ©rer plusieurs AT/RT** et **mĂȘme si l'utilisateur annule les permissions** pour l'application malveillante d'accĂ©der Ă  ses donnĂ©es, **plusieurs RT resteront valides.** -## **RC dans WebSockets** +## **RC in WebSockets** -Dans [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC), vous pouvez trouver un PoC en Java pour envoyer des messages websocket en **parallĂšle** afin d'abuser des **Conditions de course Ă©galement dans les Web Sockets**. +- In [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) vous pouvez trouver un PoC en Java pour envoyer des messages websocket en **parallĂšle** afin d'abuser des **Race Conditions aussi dans les Web Sockets**. +- Avec Burp’s WebSocket Turbo Intruder vous pouvez utiliser le moteur **THREADED** pour lancer plusieurs connexions WS et envoyer des payloads en parallĂšle. Commencez par l'exemple officiel et ajustez `config()` (nombre de threads) pour la concurrence ; c'est souvent plus fiable que le batching sur une seule connexion lorsqu'on exploite une Race Condition sur l'Ă©tat cĂŽtĂ© serveur via les handlers WS. Voir [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py). -## RĂ©fĂ©rences +## References - [https://hackerone.com/reports/759247](https://hackerone.com/reports/759247) - [https://pandaonair.com/2020/06/11/race-conditions-exploring-the-possibilities.html](https://pandaonair.com/2020/06/11/race-conditions-exploring-the-possibilities.html) @@ -380,5 +381,8 @@ Dans [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_P - [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine) - [https://portswigger.net/web-security/race-conditions](https://portswigger.net/web-security/race-conditions) - [https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/) +- [WebSocket Turbo Intruder: Unearthing the WebSocket Goldmine](https://portswigger.net/research/websocket-turbo-intruder-unearthing-the-websocket-goldmine) +- [WebSocketTurboIntruder – GitHub](https://github.com/d0ge/WebSocketTurboIntruder) +- [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py) {{#include ../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/websocket-attacks.md b/src/pentesting-web/websocket-attacks.md index ee379c368..a07fcb7ea 100644 --- a/src/pentesting-web/websocket-attacks.md +++ b/src/pentesting-web/websocket-attacks.md @@ -1,22 +1,22 @@ -# Attaques WebSocket +# WebSocket Attacks {{#include ../banners/hacktricks-training.md}} ## Qu'est-ce que les WebSockets -Les connexions WebSocket sont Ă©tablies par le biais d'une **nĂ©gociation HTTP** initiale et sont conçues pour ĂȘtre **durables**, permettant une messagerie bidirectionnelle Ă  tout moment sans avoir besoin d'un systĂšme transactionnel. Cela rend les WebSockets particuliĂšrement avantageux pour les applications nĂ©cessitant une **latence faible ou une communication initiĂ©e par le serveur**, comme les flux de donnĂ©es financiĂšres en direct. +Les connexions WebSocket sont Ă©tablies via une poignĂ©e de main **HTTP** initiale et sont conçues pour ĂȘtre **longue durĂ©e**, permettant l'Ă©change bidirectionnel de messages Ă  tout moment sans avoir besoin d'un systĂšme transactionnel. Cela rend les WebSockets particuliĂšrement avantageux pour les applications nĂ©cessitant une **faible latence ou une communication initiĂ©e par le serveur**, comme les flux de donnĂ©es financiĂšres en direct. ### Établissement des connexions WebSocket -Une explication dĂ©taillĂ©e sur l'Ă©tablissement des connexions WebSocket peut ĂȘtre consultĂ©e [**ici**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc). En rĂ©sumĂ©, les connexions WebSocket sont gĂ©nĂ©ralement initiĂ©es via JavaScript cĂŽtĂ© client comme indiquĂ© ci-dessous : +Une explication dĂ©taillĂ©e sur l'Ă©tablissement des connexions WebSocket est disponible [**here**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc). En rĂ©sumĂ©, les connexions WebSocket sont gĂ©nĂ©ralement initiĂ©es via du JavaScript cĂŽtĂ© client comme montrĂ© ci-dessous: ```javascript var ws = new WebSocket("wss://normal-website.com/ws") ``` -Le protocole `wss` signifie une connexion WebSocket sĂ©curisĂ©e avec **TLS**, tandis que `ws` indique une connexion **non sĂ©curisĂ©e**. +Le protocole `wss` signifie une connexion WebSocket sĂ©curisĂ©e avec **TLS**, alors que `ws` indique une connexion **non sĂ©curisĂ©e**. -Lors de l'Ă©tablissement de la connexion, une poignĂ©e de main est effectuĂ©e entre le navigateur et le serveur via HTTP. Le processus de poignĂ©e de main implique que le navigateur envoie une requĂȘte et que le serveur rĂ©pond, comme illustrĂ© dans les exemples suivants : +Lors de l'Ă©tablissement de la connexion, un handshake est effectuĂ© entre le navigateur et le serveur via HTTP. Le processus de handshake implique que le navigateur envoie une requĂȘte et que le serveur rĂ©ponde, comme illustrĂ© dans les exemples suivants : -Le navigateur envoie une requĂȘte de poignĂ©e de main : +Le navigateur envoie une requĂȘte de handshake : ```javascript GET /chat HTTP/1.1 Host: normal-website.com @@ -26,7 +26,7 @@ Connection: keep-alive, Upgrade Cookie: session=KOsEJNuflw4Rd9BDNrVmvwBF9rEijeE2 Upgrade: websocket ``` -RĂ©ponse de la poignĂ©e de main du serveur : +RĂ©ponse de handshake du serveur : ```javascript HTTP/1.1 101 Switching Protocols Connection: Upgrade @@ -35,18 +35,18 @@ Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk= ``` La connexion reste ouverte pour l'Ă©change de messages dans les deux sens une fois Ă©tablie. -**Points clĂ©s de la poignĂ©e de main WebSocket :** +**Points clĂ©s du WebSocket Handshake :** -- Les en-tĂȘtes `Connection` et `Upgrade` signalent le dĂ©but d'une poignĂ©e de main WebSocket. +- Les en-tĂȘtes `Connection` et `Upgrade` signalent le dĂ©but d'un WebSocket Handshake. - L'en-tĂȘte `Sec-WebSocket-Version` indique la version du protocole WebSocket souhaitĂ©e, gĂ©nĂ©ralement `13`. -- Une valeur alĂ©atoire encodĂ©e en Base64 est envoyĂ©e dans l'en-tĂȘte `Sec-WebSocket-Key`, garantissant que chaque poignĂ©e de main est unique, ce qui aide Ă  prĂ©venir les problĂšmes avec les proxies de mise en cache. Cette valeur n'est pas destinĂ©e Ă  l'authentification mais Ă  confirmer que la rĂ©ponse n'est pas gĂ©nĂ©rĂ©e par un serveur ou un cache mal configurĂ©. -- L'en-tĂȘte `Sec-WebSocket-Accept` dans la rĂ©ponse du serveur est un hachage de la `Sec-WebSocket-Key`, vĂ©rifiant l'intention du serveur d'ouvrir une connexion WebSocket. +- Une valeur alĂ©atoire encodĂ©e en Base64 est envoyĂ©e dans l'en-tĂȘte `Sec-WebSocket-Key`, garantissant que chaque handshake est unique, ce qui aide Ă  prĂ©venir les problĂšmes avec les proxies de cache. Cette valeur n'est pas utilisĂ©e pour l'authentification mais pour confirmer que la rĂ©ponse n'est pas gĂ©nĂ©rĂ©e par un serveur ou un cache mal configurĂ©. +- L'en-tĂȘte `Sec-WebSocket-Accept` dans la rĂ©ponse du serveur est un hash du `Sec-WebSocket-Key`, vĂ©rifiant l'intention du serveur d'ouvrir une connexion WebSocket. -Ces fonctionnalitĂ©s garantissent que le processus de poignĂ©e de main est sĂ©curisĂ© et fiable, ouvrant la voie Ă  une communication en temps rĂ©el efficace. +Ces caractĂ©ristiques assurent que le processus de handshake est sĂ©curisĂ© et fiable, permettant une communication temps rĂ©el efficace. ### Console Linux -Vous pouvez utiliser `websocat` pour Ă©tablir une connexion brute avec un websocket. +Vous pouvez utiliser `websocat` pour Ă©tablir une connexion bas-niveau avec un WebSocket. ```bash websocat --insecure wss://10.10.10.10:8000 -v ``` @@ -54,60 +54,177 @@ Ou pour crĂ©er un serveur websocat : ```bash websocat -s 0.0.0.0:8000 #Listen in port 8000 ``` -### MitM websocket connections +### MitM websocket connexions -Si vous constatez que des clients sont connectĂ©s Ă  un **HTTP websocket** depuis votre rĂ©seau local actuel, vous pourriez essayer une [ARP Spoofing Attack ](../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing) pour effectuer une attaque MitM entre le client et le serveur.\ -Une fois que le client essaie de se connecter, vous pouvez alors utiliser : +Si vous constatez que des clients sont connectĂ©s Ă  un **HTTP websocket** depuis votre rĂ©seau local actuel vous pouvez essayer une [ARP Spoofing Attack ](../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing) pour effectuer une attaque MitM entre le client et le serveur.\ +Une fois que le client tente de se connecter Ă  vous, vous pouvez alors utiliser: ```bash websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v ``` ### ÉnumĂ©ration des Websockets -Vous pouvez utiliser l'**outil** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **pour dĂ©couvrir, identifier et rechercher des** **vulnĂ©rabilitĂ©s** **connues dans les websockets automatiquement.** +Vous pouvez utiliser l'**outil** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **pour dĂ©couvrir, fingerprint et rechercher automatiquement des** **vulnĂ©rabilitĂ©s** dans les websockets. ### Outils de dĂ©bogage Websocket -- **Burp Suite** prend en charge la communication MitM des websockets de maniĂšre trĂšs similaire Ă  la communication HTTP classique. -- L'**extension Burp Suite** [**socketsleuth**](https://github.com/snyk/socketsleuth) **vous permettra de mieux gĂ©rer les communications Websocket dans Burp en obtenant l'** **historique**, en dĂ©finissant des **rĂšgles d'interception**, en utilisant des rĂšgles de **correspondance et de remplacement**, en utilisant **Intruder** et **AutoRepeater.** +- **Burp Suite** prend en charge les communications MitM websockets d'une maniĂšre trĂšs similaire Ă  celle utilisĂ©e pour les communications HTTP rĂ©guliĂšres. +- L'[**socketsleuth**](https://github.com/snyk/socketsleuth) **extension Burp Suite** vous permettra de mieux gĂ©rer les communications Websocket dans Burp en rĂ©cupĂ©rant l'**historique**, en dĂ©finissant des **rĂšgles d'interception**, en utilisant des rĂšgles **match and replace**, et en utilisant **Intruder** et **AutoRepeater.** - [**WSSiP**](https://github.com/nccgroup/wssip)**:** AbrĂ©viation de "**WebSocket/Socket.io Proxy**", cet outil, Ă©crit en Node.js, fournit une interface utilisateur pour **capturer, intercepter, envoyer des messages personnalisĂ©s** et visualiser toutes les communications WebSocket et Socket.IO entre le client et le serveur. -- [**wsrepl**](https://github.com/doyensec/wsrepl) est un **REPL websocket interactif** conçu spĂ©cifiquement pour les tests de pĂ©nĂ©tration. Il fournit une interface pour observer les **messages websocket entrants et envoyer de nouveaux**, avec un cadre facile Ă  utiliser pour **automatiser** cette communication. -- [**https://websocketking.com/**](https://websocketking.com/) c'est un **web pour communiquer** avec d'autres webs en utilisant des **websockets**. -- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) parmi d'autres types de communications/protocoles, il fournit un **web pour communiquer** avec d'autres webs en utilisant des **websockets.** +- [**wsrepl**](https://github.com/doyensec/wsrepl) est un **REPL websocket interactif** conçu spĂ©cifiquement pour le pentesting. Il fournit une interface pour observer les **messages websocket entrants et en envoyer de nouveaux**, avec un framework facile Ă  utiliser pour **automatiser** cette communication. +- [**https://websocketking.com/**](https://websocketking.com/) c'est une **application web pour communiquer** avec d'autres sites en utilisant des **websockets**. +- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) parmi d'autres types de communications/protocoles, fournit une **application web pour communiquer** avec d'autres sites en utilisant des **websockets.** -## DĂ©cryptage des Websocket +## DĂ©cryptage Websocket - [https://github.com/Anof-cyber/PyCript](https://github.com/Anof-cyber/PyCript) - [https://github.com/Anof-cyber/PyCript-WebSocket/](https://github.com/Anof-cyber/PyCript-WebSocket/) -## Laboratoire Websocket +## Websocket Lab -Dans [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course), vous avez un code pour lancer un web utilisant des websockets et dans [**ce post**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) vous pouvez trouver une explication. +In [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) you have a code to launch a web using websockets and in [**this post**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) you can find an explanation. -## Fuzzing Websocket +## Websocket Fuzzing -L'extension burp [**Backslash Powered Scanner**](https://github.com/PortSwigger/backslash-powered-scanner) permet dĂ©sormais Ă©galement de fuzzing des messages WebSocket. Vous pouvez lire plus d'informations Ă  ce sujet [**ici**](https://arete06.com/posts/fuzzing-ws/#adding-websocket-support-to-backslash-powered-scanner). +The burp extension [**Backslash Powered Scanner**](https://github.com/PortSwigger/backslash-powered-scanner) now allows to fuzz also WebSocket messages. You can read more infromation abou this [**here**](https://arete06.com/posts/fuzzing-ws/#adding-websocket-support-to-backslash-powered-scanner). -## DĂ©tournement de WebSocket entre sites (CSWSH) +### WebSocket Turbo Intruder (Burp extension) -Le **dĂ©tournement de WebSocket entre sites**, Ă©galement connu sous le nom de **dĂ©tournement de WebSocket cross-origin**, est identifiĂ© comme un cas spĂ©cifique de **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)** affectant les Ă©changes de WebSocket. Cette vulnĂ©rabilitĂ© survient lorsque les Ă©changes de WebSocket s'authentifient uniquement via des **cookies HTTP** sans **tokens CSRF** ou mesures de sĂ©curitĂ© similaires. +PortSwigger's WebSocket Turbo Intruder brings Turbo Intruder–style Python scripting and high‑rate fuzzing to WebSockets. Install it from the BApp Store or from source. It includes two components: -Les attaquants peuvent en tirer parti en hĂ©bergeant une **page web malveillante** qui initie une connexion WebSocket entre sites Ă  une application vulnĂ©rable. Par consĂ©quent, cette connexion est considĂ©rĂ©e comme faisant partie de la session de la victime avec l'application, exploitant le manque de protection CSRF dans le mĂ©canisme de gestion des sessions. +- Turbo Intruder: envoi de messages en volume Ă©levĂ© vers un seul endpoint WS en utilisant des moteurs personnalisĂ©s. +- HTTP Middleware: expose un endpoint HTTP local qui transfĂšre les corps en tant que messages WS sur une connexion persistante, de sorte que tout scanner basĂ© sur HTTP puisse sonder les backends WS. -Pour que cette attaque fonctionne, voici les exigences : +Basic script pattern to fuzz a WS endpoint and filter relevant responses: +```python +def queue_websockets(upgrade_request, message): +connection = websocket_connection.create(upgrade_request) +for i in range(10): +connection.queue(message, str(i)) -- L'**authentification websocket doit ĂȘtre basĂ©e sur des cookies** -- Le cookie doit ĂȘtre accessible depuis le serveur des attaquants (cela signifie gĂ©nĂ©ralement **`SameSite=None`**) et aucune **protection totale des cookies** activĂ©e dans Firefox et aucun **cookie tiers bloquĂ©** dans Chrome. -- Le serveur websocket ne doit pas vĂ©rifier l'origine de la connexion (ou cela doit ĂȘtre contournable) +def handle_outgoing_message(websocket_message): +results_table.add(websocket_message) + +@MatchRegex(r'{\"user\":\"Hal Pline\"') +def handle_incoming_message(websocket_message): +results_table.add(websocket_message) +``` +Utilisez des dĂ©corateurs comme `@MatchRegex(...)` pour rĂ©duire le bruit lorsque un seul message dĂ©clenche plusieurs rĂ©ponses. + +### Faire transiter WS derriĂšre HTTP (HTTP Middleware) + +Encapsulez une connexion WS persistante et transmettez les corps HTTP en tant que messages WS pour des tests automatisĂ©s avec des scanners HTTP : +```python +def create_connection(upgrade_request): +connection = websocket_connection.create(upgrade_request) +return connection + +@MatchRegex(r'{\"user\":\"You\"') +def handle_incoming_message(websocket_message): +results_table.add(websocket_message) +``` +Ensuite, envoyez HTTP localement ; le corps est transmis comme le message WS : +```http +POST /proxy?url=https%3A%2F%2Ftarget/ws HTTP/1.1 +Host: 127.0.0.1:9000 +Content-Length: 16 + +{"message":"hi"} +``` +Cela vous permet de piloter des backends WS tout en filtrant les Ă©vĂ©nements « intĂ©ressants » (p. ex., erreurs SQLi, auth bypass, comportement de command injection). + +### Gestion de Socket.IO (handshake, heartbeats, events) + +Socket.IO ajoute son propre framing au-dessus de WS. DĂ©tectez-le via le paramĂštre de requĂȘte obligatoire `EIO` (p. ex., `EIO=4`). Maintenez la session vivante avec Ping (`2`) et Pong (`3`) et commencez la conversation avec `"40"`, puis Ă©mettez des Ă©vĂ©nements comme `42["message","hello"]`. + +Exemple Intruder: +```python +import burp.api.montoya.http.message.params.HttpParameter as HttpParameter + +def queue_websockets(upgrade_request, message): +connection = websocket_connection.create( +upgrade_request.withUpdatedParameters(HttpParameter.urlParameter("EIO", "4"))) +connection.queue('40') +connection.queue('42["message","hello"]') + +@Pong("3") +def handle_outgoing_message(websocket_message): +results_table.add(websocket_message) + +@PingPong("2", "3") +def handle_incoming_message(websocket_message): +results_table.add(websocket_message) +``` +Variante d'adaptateur HTTP: +```python +import burp.api.montoya.http.message.params.HttpParameter as HttpParameter + +def create_connection(upgrade_request): +connection = websocket_connection.create( +upgrade_request.withUpdatedParameters(HttpParameter.urlParameter("EIO", "4"))) +connection.queue('40') +connection.decIn() +return connection + +@Pong("3") +def handle_outgoing_message(websocket_message): +results_table.add(websocket_message) + +@PingPong("2", "3") +def handle_incoming_message(websocket_message): +results_table.add(websocket_message) +``` +### DĂ©tection de prototype pollution cĂŽtĂ© serveur via Socket.IO + +En suivant la technique de dĂ©tection sĂ»re de PortSwigger, essayez de polluer les internals d'Express en envoyant un payload comme : +```json +{"__proto__":{"initialPacket":"Polluted"}} +``` +Si les greetings ou le comportement changent (par ex., echo inclut "Polluted"), vous avez probablement polluĂ© les prototypes cĂŽtĂ© serveur. L'impact dĂ©pend des sinks atteignables ; corrĂ©lez avec les gadgets dans la section Node.js prototype pollution. Voir : + +- Check [NodeJS – __proto__ & prototype Pollution](deserialization/nodejs-proto-prototype-pollution/README.md) for sinks/gadgets and chaining ideas. + +### WebSocket race conditions with Turbo Intruder + +The default engine batches messages on one connection (great throughput, poor for races). Use the THREADED engine to spawn multiple WS connections and fire payloads in parallel to trigger logic races (double‑spend, token reuse, state desync). Start from the example script and tune concurrency in `config()`. + +- Apprenez la mĂ©thodologie et les alternatives dans [Race Condition](race-condition.md) (voir “RC in WebSockets”). + +### WebSocket DoS: malformed frame “Ping of Death” + +CrĂ©ez des frames WS dont l'en‑tĂȘte dĂ©clare une taille de payload Ă©norme mais n'envoyez aucun corps. Certains serveurs WS font confiance Ă  la longueur et pré‑allouent des buffers ; la fixer proche de `Integer.MAX_VALUE` peut provoquer un Out‑Of‑Memory et un DoS distant non authentifiĂ©. Voir le script d'exemple. + +### CLI and debugging + +- Headless fuzzing: `java -jar WebSocketFuzzer-.jar ` +- Activez le WS Logger pour capturer et corrĂ©ler les messages en utilisant des IDs internes. +- Utilisez les helpers `inc*`/`dec*` sur `Connection` pour ajuster la gestion des IDs de message dans des adapters complexes. +- Les decorators comme `@PingPong`/`@Pong` et les helpers comme `isInteresting()` rĂ©duisent le bruit et maintiennent les sessions ouvertes. + +### Operational safety + +Le fuzzing WS Ă  haut dĂ©bit peut ouvrir de nombreuses connexions et envoyer des milliers de messages par seconde. Les frames malformĂ©s et les taux Ă©levĂ©s peuvent provoquer de vĂ©ritables DoS. N'utilisez ceci que lĂ  oĂč c'est autorisĂ©. + +## Cross-site WebSocket hijacking (CSWSH) + +**Cross-site WebSocket hijacking**, also known as **cross-origin WebSocket hijacking**, est identifiĂ© comme un cas spĂ©cifique de **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)** affectant les handshakes WebSocket. Cette vulnĂ©rabilitĂ© survient lorsque les handshakes WebSocket authentifient uniquement via des **HTTP cookies** sans **CSRF tokens** ni mesures de sĂ©curitĂ© similaires. + +Les attaquants peuvent exploiter cela en hĂ©bergeant une **malicious web page** qui initie une connexion cross-site WebSocket vers une application vulnĂ©rable. En consĂ©quence, cette connexion est traitĂ©e comme faisant partie de la session de la victime avec l'application, exploitant l'absence de protection CSRF dans le mĂ©canisme de gestion de session. + +Pour que cette attaque fonctionne, les conditions suivantes doivent ĂȘtre rĂ©unies : + +- L'authentification WebSocket **doit ĂȘtre basĂ©e sur des cookies** +- Le cookie doit ĂȘtre accessible depuis le serveur de l'attaquant (gĂ©nĂ©ralement **`SameSite=None`**) ; il ne doit pas y avoir **Firefox Total Cookie Protection** activĂ© dans Firefox ni **blocked third-party cookies** dans Chrome. +- Le serveur WebSocket ne doit pas vĂ©rifier l'origine de la connexion (ou cela doit ĂȘtre contournable) Aussi : -- Si l'authentification est basĂ©e sur une connexion locale (vers localhost ou un rĂ©seau local), l'attaque **sera possible** car aucune protection actuelle ne l'interdit (voir [plus d'infos ici](https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/)) +- Si l'authentification est basĂ©e sur une connexion locale (vers localhost ou un rĂ©seau local), l'attaque **sera possible** car aucune protection actuelle ne l'interdit (voir [more info here](https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/)) -### Attaque Simple +### Attaque simple -Notez que lors de l'**Ă©tablissement** d'une connexion **websocket**, le **cookie** est **envoyĂ©** au serveur. Le **serveur** peut l'utiliser pour **relier** chaque **utilisateur spĂ©cifique** Ă  sa **session websocket basĂ©e sur le cookie envoyĂ©**. +Notez que lors de l'**Ă©tablissement** d'une **connexion websocket**, le **cookie** est **envoyĂ©** au serveur. Le **serveur** peut l'utiliser pour **associer** chaque **utilisateur spĂ©cifique** Ă  sa **session websocket basĂ©e sur le cookie envoyĂ©**. -Ensuite, si par **exemple** le **serveur websocket** **renvoie l'historique de la conversation** d'un utilisateur si un msg avec "**READY"** est envoyĂ©, alors un **XSS simple** Ă©tablissant la connexion (le **cookie** sera **envoyĂ©** **automatiquement** pour autoriser l'utilisateur victime) **en envoyant** "**READY**" pourra **rĂ©cupĂ©rer** l'historique de la **conversation**. +Ensuite, si par **exemple** le **serveur websocket** **renvoie l'historique de la conversation** d'un utilisateur lorsqu'un message contenant "**READY**" est envoyĂ©, alors une **simple XSS** Ă©tablissant la connexion (le **cookie** sera **envoyĂ©** **automatiquement** pour authentifier l'utilisateur victime) **envoyant** "**READY**" pourra **rĂ©cupĂ©rer** l'historique de la **conversation**. ```html @@ -149,41 +266,50 @@ return messageEvent } ``` TĂ©lĂ©chargez maintenant le fichier `wsHook.js` depuis [https://github.com/skepticfx/wshook](https://github.com/skepticfx/wshook) et **enregistrez-le dans le dossier contenant les fichiers web**.\ -En exposant l'application web et en faisant en sorte qu'un utilisateur s'y connecte, vous pourrez voler les messages envoyĂ©s et reçus via websocket : +En exposant l'application web et en faisant en sorte qu'un utilisateur s'y connecte, vous pourrez voler les messages envoyĂ©s et reçus via websocket: ```javascript sudo python3 -m http.server 80 ``` -### Protections CSWSH +### CSWSH Protections -L'attaque CSWSH est basĂ©e sur le fait qu'un **utilisateur se connectera Ă  une page malveillante** qui **ouvrira une connexion websocket** Ă  une page web oĂč l'utilisateur est dĂ©jĂ  connectĂ© et s'authentifiera en tant que lui car la requĂȘte enverra les cookies de l'utilisateur. +L'attaque CSWSH repose sur le fait qu'un **utilisateur se connectera Ă  une page malveillante** qui ouvrira une **websocket connection** vers une page web oĂč l'utilisateur est dĂ©jĂ  connectĂ© et s'authentifiera en son nom, car la requĂȘte enverra les cookies de l'utilisateur. De nos jours, il est trĂšs facile de prĂ©venir ce problĂšme : -- **VĂ©rification de l'origine par le serveur websocket** : Le serveur websocket doit toujours vĂ©rifier d'oĂč un utilisateur se connecte pour empĂȘcher des pages inattendues de se connecter Ă  lui. -- **Jeton d'authentification** : Au lieu de baser l'authentification sur un cookie, la connexion websocket pourrait ĂȘtre basĂ©e sur un jeton gĂ©nĂ©rĂ© par le serveur pour l'utilisateur, inconnu de l'attaquant (comme un jeton anti-CSRF). -- **Attribut de cookie SameSite** : Les cookies avec la valeur `SameSite` comme `Lax` ou `Strict` ne seront pas envoyĂ©s depuis une page d'attaquant externe vers le serveur victime, par consĂ©quent, l'authentification basĂ©e sur les cookies ne sera pas rĂ©ussie. Notez que Chrome attribue maintenant la valeur **`Lax`** aux cookies sans ce drapeau spĂ©cifiĂ©, rendant cela plus sĂ©curisĂ© par dĂ©faut. Cependant, les deux premiĂšres minutes aprĂšs la crĂ©ation d'un cookie, il aura la valeur **`None`**, le rendant vulnĂ©rable pendant cette pĂ©riode limitĂ©e (il est Ă©galement prĂ©vu que cette mesure soit supprimĂ©e Ă  un moment donnĂ©). -- **Protection totale des cookies de Firefox** : La protection totale des cookies fonctionne en isolant les cookies au site dans lequel ils sont créés. Essentiellement, chaque site a sa propre partition de stockage de cookies pour empĂȘcher les tiers de lier l'historique de navigation d'un utilisateur. Cela rend **CSWSH inutilisable** car le site de l'attaquant n'aura pas accĂšs aux cookies. -- **Blocage des cookies tiers de Chrome** : Cela pourrait Ă©galement empĂȘcher l'envoi du cookie de l'utilisateur authentifiĂ© au serveur websocket mĂȘme avec `SameSite=None`. +- **Websocket server checking the origin**: Le serveur websocket devrait toujours vĂ©rifier d'oĂč un user se connecte afin d'empĂȘcher des pages inattendues de se connecter. +- **Authentication token**: PlutĂŽt que de baser l'authentification sur un cookie, la connexion websocket pourrait reposer sur un token gĂ©nĂ©rĂ© par le serveur pour l'utilisateur et inconnu de l'attaquant (comme un anti-CSRF token) +- **SameSite Cookie attribute**: Les cookies dont la valeur `SameSite` est `Lax` ou `Strict` ne seront pas envoyĂ©s depuis une page d'attaquant externe vers le serveur victime ; par consĂ©quent, l'authentification basĂ©e sur des cookies Ă©chouera. Notez que Chrome assigne maintenant la valeur **`Lax`** aux cookies sans ce flag spĂ©cifiĂ©, rendant cela plus sĂ»r par dĂ©faut. Toutefois, pendant les 2 premiĂšres minutes suivant la crĂ©ation d'un cookie, il aura la valeur **`None`**, le rendant vulnĂ©rable pendant cette pĂ©riode limitĂ©e (il est Ă©galement attendu que cette mesure soit retirĂ©e Ă  un certain moment). +- **Firefox Total Cookie Protection**: Total Cookie Protection fonctionne en isolant les cookies au site dans lequel ils sont créés. Essentiellement, chaque site a sa propre partition de stockage de cookies pour empĂȘcher des tiers de corrĂ©ler l'historique de navigation d'un utilisateur. Cela rend **CSWSH inutilisable** car le site de l'attaquant n'aura pas accĂšs aux cookies. +- **Chrome third-party cookies block**: Cela peut aussi empĂȘcher l'envoi du cookie de l'utilisateur authentifiĂ© au serveur websocket mĂȘme avec `SameSite=None`. -## Conditions de course +## Race Conditions -Les conditions de course dans les WebSockets sont Ă©galement un problĂšme, [consultez cette information pour en savoir plus](race-condition.md#rc-in-websockets). +Race Conditions in WebSockets are also a thing, [check this information to learn more](race-condition.md#rc-in-websockets). -## Autres vulnĂ©rabilitĂ©s +## Other vulnerabilities -Comme les Web Sockets sont un mĂ©canisme pour **envoyer des donnĂ©es cĂŽtĂ© serveur et cĂŽtĂ© client**, selon la maniĂšre dont le serveur et le client gĂšrent l'information, **les Web Sockets peuvent ĂȘtre utilisĂ©s pour exploiter plusieurs autres vulnĂ©rabilitĂ©s comme XSS, SQLi ou toute autre vulnĂ©rabilitĂ© web courante utilisant l'entrĂ©e d'un utilisateur depuis un websocket.** +Comme les Web Sockets sont un mĂ©canisme pour **send data to server side and client side**, selon la façon dont le serveur et le client traitent l'information, **Web Sockets can be used to exploit several other vulnerabilities like XSS, SQLi or any other common web vuln using input of s user from a websocket.** ## **WebSocket Smuggling** -Cette vulnĂ©rabilitĂ© pourrait vous permettre de **contourner les restrictions des proxies inverses** en leur faisant croire qu'une **communication websocket a Ă©tĂ© Ă©tablie** (mĂȘme si ce n'est pas vrai). Cela pourrait permettre Ă  un attaquant d'**accĂ©der Ă  des points de terminaison cachĂ©s**. Pour plus d'informations, consultez la page suivante : +This vulnerability could allow you to **bypass reverse proxies restrictions** by making them believe that a **websocket communication was stablished** (even if it isn't true). This could allow an attacker to **access hidden endpoints**. For more information check the following page: + {{#ref}} h2c-smuggling.md {{#endref}} -## RĂ©fĂ©rences +## References - [https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages](https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages) - [https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/](https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/) +- [WebSocket Turbo Intruder: Unearthing the WebSocket Goldmine](https://portswigger.net/research/websocket-turbo-intruder-unearthing-the-websocket-goldmine) +- [WebSocket Turbo Intruder – BApp Store](https://portswigger.net/bappstore/ba292c5982ea426c95c9d7325d9a1066) +- [WebSocketTurboIntruder – GitHub](https://github.com/d0ge/WebSocketTurboIntruder) +- [Turbo Intruder background](https://portswigger.net/research/turbo-intruder-embracing-the-billion-request-attack) +- [Server-side prototype pollution – safe detection methods](https://portswigger.net/research/server-side-prototype-pollution#safe-detection-methods-for-manual-testers) +- [WS RaceCondition PoC (Java)](https://github.com/redrays-io/WS_RaceCondition_PoC) +- [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py) +- [PingOfDeathExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/PingOfDeathExample.py) {{#include ../banners/hacktricks-training.md}}