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}}