Translated ['pentesting-web/race-condition.md'] to jp

This commit is contained in:
Translator 2024-08-18 15:57:18 +00:00
parent e4d9e2b378
commit 719b1459f4

View file

@ -35,8 +35,8 @@ GCPハッキングを学び、実践する<img src="../.gitbook/assets/grte.p
#### HTTP/2シングルパケット攻撃対HTTP/1.1ラストバイト同期 #### HTTP/2シングルパケット攻撃対HTTP/1.1ラストバイト同期
* **HTTP/2**単一のTCP接続を介して2つのリクエストを送信することをサポートし、ネットワークのジッターの影響を軽減します。ただし、サーバー側の変動により、2つのリクエストでは一貫したレースコンディションの悪用には不十分な場合があります。 * **HTTP/2**単一のTCP接続2つのリクエストを送信することをサポートし、ネットワークのジッターの影響を軽減します。ただし、サーバー側の変動により、2つのリクエストでは一貫したレースコンディションの悪用には不十分な場合があります。
* **HTTP/1.1 'ラストバイト同期'**20-30のリクエストのほとんどの部分を事前に送信し、小さな断片を保持し、それを一緒に送信することで、サーバーへの同時到着を実現します。 * **HTTP/1.1 'ラストバイト同期'**20-30のリクエストのほとんどの部分を事前に送信し、小さな断片を保持し一緒に送信することで、サーバーへの同時到着を実現します。
**ラストバイト同期の準備**には以下が含まれます: **ラストバイト同期の準備**には以下が含まれます:
@ -45,7 +45,7 @@ GCPハッキングを学び、実践する<img src="../.gitbook/assets/grte.p
3. TCP\_NODELAYを無効にして、Nagleのアルゴリズムを利用して最終フレームをバッチ処理します。 3. TCP\_NODELAYを無効にして、Nagleのアルゴリズムを利用して最終フレームをバッチ処理します。
4. 接続を温めるためにピングを送信します。 4. 接続を温めるためにピングを送信します。
保持されたフレームのその後の送信は、Wiresharkを介して確認できる単一パケットでの到着をもたらすべきです。この方法は、通常RC攻撃に関与しない静的ファイルには適用されません。 保持されたフレームのその後の送信は、Wiresharkで確認できる単一のパケットで到着するはずです。この方法は、RC攻撃に通常関与しない静的ファイルには適用されません。
### サーバーアーキテクチャへの適応 ### サーバーアーキテクチャへの適応
@ -61,7 +61,7 @@ PHPのセッションハンドラーのようなフレームワークは、セ
## 攻撃の例 ## 攻撃の例
* **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シングルパケット攻撃1エンドポイント**:リクエストを**Turbo intruder**に送信できます(`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`)。リクエスト内の**`%s`**の値をブルートフォースしたいに変更できます。例えば、`csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s`のように。そして、ドロップダウンから**`examples/race-single-packer-attack.py`**を選択します:
<figure><img src="../.gitbook/assets/image (57).png" alt=""><figcaption></figcaption></figure> <figure><img src="../.gitbook/assets/image (57).png" alt=""><figcaption></figcaption></figure>
@ -75,7 +75,7 @@ engine.queue(target.req, password, gate='race1')
ウェブがHTTP2をサポートしていない場合HTTP1.1のみ)、`Engine.BURP2`の代わりに`Engine.THREADED`または`Engine.BURP`を使用してください。 ウェブがHTTP2をサポートしていない場合HTTP1.1のみ)、`Engine.BURP2`の代わりに`Engine.THREADED`または`Engine.BURP`を使用してください。
{% endhint %} {% endhint %}
* **Tubo Intruder - HTTP2シングルパケット攻撃複数のエンドポイント**: 1つのエンドポイントにリクエストを送信し、その後RCEをトリガーするために他のエンドポイントに複数のリクエストを送信する必要がある場合、`race-single-packet-attack.py`スクリプトを次のように変更できます: * **Tubo Intruder - HTTP2シングルパケット攻撃複数のエンドポイント**: 1つのエンドポイントにリクエストを送信し、その後RCEをトリガーするために他のエンドポイントに複数のリクエストを送信する必要がある場合、`race-single-packet-attack.py`スクリプトを次のように変更できます:
```python ```python
def queueRequests(target, wordlists): def queueRequests(target, wordlists):
engine = RequestEngine(endpoint=target.endpoint, engine = RequestEngine(endpoint=target.endpoint,
@ -109,7 +109,7 @@ engine.openGate(currentAttempt)
* **Repeater**でも、Burp Suiteの新しい「**Send group in parallel**」オプションを使用できます。 * **Repeater**でも、Burp Suiteの新しい「**Send group in parallel**」オプションを使用できます。
* **limit-overrun**の場合、グループに**同じリクエストを50回**追加するだけで済みます。 * **limit-overrun**の場合、グループに**同じリクエストを50回**追加するだけで済みます。
* **connection warming**のために、**グループ**の**最初**にウェブサーバーの非静的部分への**リクエスト**を**追加**することができます。 * **connection warming**のために、**グループ**の**最初**にウェブサーバーの非静的部分への**リクエスト**を**追加**することができます。
* **遅延**を**1つのリクエストと別のリクエストの処理の間**に2つのサブステートステップで行うには、両方のリクエストの間に**追加のリクエストを追加**することができます。 * **delaying**プロセスの**一つのリクエストと別のリクエストの間**の処理において、2つのサブステートステップで、**両方のリクエストの間に追加のリクエストを追加**することができます。
* **multi-endpoint** RCの場合、**隠れた状態**に送信される**リクエスト**を最初に送信し、その後に**隠れた状態を悪用する50のリクエスト**を送信することができます。 * **multi-endpoint** RCの場合、**隠れた状態**に送信される**リクエスト**を最初に送信し、その後に**隠れた状態を悪用する50のリクエスト**を送信することができます。
<figure><img src="../.gitbook/assets/image (58).png" alt=""><figcaption></figcaption></figure> <figure><img src="../.gitbook/assets/image (58).png" alt=""><figcaption></figcaption></figure>
@ -244,7 +244,7 @@ response = requests.get(url, verify=False)
元の研究では、この攻撃には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リクエストを送信することができました。&#x20; 元の研究では、この攻撃には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リクエストを送信することができました。&#x20;
この改善により、同時に到着する必要がある数百または数千のパケットを必要とするRC攻撃がより信頼性の高いものになりますが、いくつかのソフトウェア制限がある可能性もあります。Apache、Nginx、Goなどの人気のあるHTTPサーバーには、`SETTINGS_MAX_CONCURRENT_STREAMS`の設定がそれぞれ100、128、250に厳格に制限されています。しかし、NodeJSやnghttp2のような他のものは無制限です。\ この改善により、同時に到着する必要がある数百/数千のパケットを必要とするRC攻撃において、攻撃がより信頼性の高いものになる一方で、いくつかのソフトウェア制限がある可能性があることに注意してください。Apache、Nginx、Goなどの人気のあるHTTPサーバーには、`SETTINGS_MAX_CONCURRENT_STREAMS`の設定がそれぞれ100、128、250に厳格に制限されています。しかし、NodeJSやnghttp2のような他のものは無制限です。\
これは基本的に、Apacheが単一のTCP接続から100のHTTP接続のみを考慮することを意味しこのRC攻撃を制限します これは基本的に、Apacheが単一のTCP接続から100のHTTP接続のみを考慮することを意味しこの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](https://github.com/Ry0taK/first-sequence-sync/tree/main)で見つけることができます。
@ -314,14 +314,14 @@ asyncio.run(main())
* 商品を複数回評価する * 商品を複数回評価する
* アカウント残高を超えて現金を引き出したり転送したりする * アカウント残高を超えて現金を引き出したり転送したりする
* 単一のCAPTCHA解決策を再利用する * 単一のCAPTCHA解決策を再利用する
* アンチブルートフォースレート制限を回避する * ブルートフォース対策のレート制限を回避する
### **Hidden substates** ### **Hidden substates**
複雑なレースコンディションを悪用することは、隠れたまたは**意図しないマシンのサブステート**と相互作用するための短い機会を利用することを含むことがよくあります。これにアプローチする方法は次のとおりです: 複雑なレースコンディションを悪用することは、隠れたまたは**意図しないマシンのサブステート**と相互作用するための短い機会を利用することを含むことがよくあります。これにアプローチする方法は次のとおりです:
1. **潜在的な隠れたサブステートを特定する** 1. **潜在的な隠れたサブステートを特定する**
* ユーザープロファイルやパスワードリセットプロセスなど、重要なデータを変更または相互作用するエンドポイントを特定することから始めます。以下に焦点を当てます: * ユーザープロファイルやパスワードリセットプロセスなど、重要なデータを変更または相互作用するエンドポイントを特定ます。以下に焦点を当てます:
* **ストレージ**:サーバー側の永続データを操作するエンドポイントを、クライアント側のデータを扱うものよりも優先します。 * **ストレージ**:サーバー側の永続データを操作するエンドポイントを、クライアント側のデータを扱うものよりも優先します。
* **アクション**:既存のデータを変更する操作を探します。これは新しいデータを追加するものよりも悪用可能な条件を作成する可能性が高いです。 * **アクション**:既存のデータを変更する操作を探します。これは新しいデータを追加するものよりも悪用可能な条件を作成する可能性が高いです。
* **キー**:成功した攻撃は通常、同じ識別子(例:ユーザー名やリセットトークン)に基づく操作を含みます。 * **キー**:成功した攻撃は通常、同じ識別子(例:ユーザー名やリセットトークン)に基づく操作を含みます。
@ -332,7 +332,7 @@ asyncio.run(main())
### 時間に敏感な攻撃 ### 時間に敏感な攻撃
リクエストのタイミングの精度は脆弱性を明らかにすることができ、特にタイムスタンプのような予測可能な方法がセキュリティトークンに使用される場合に顕著です。例えば、タイムスタンプに基づいてパスワードリセットトークンを生成すると、同時リクエストに対して同一のトークンが許可される可能性があります。 リクエストのタイミングの精度は脆弱性を明らかにすることができ、特にタイムスタンプのような予測可能な方法がセキュリティトークンに使用される場合に顕著です。例えば、タイムスタンプに基づいてパスワードリセットトークンを生成すると、同時リクエストに対して同一のトークンが生成される可能性があります。
**悪用するには:** **悪用するには:**
@ -340,7 +340,7 @@ asyncio.run(main())
**例:** **例:**
* 同時に2つのパスワードリセットトークンをリクエストし、それらを比較します。一致するトークンはトークン生成の欠陥を示唆します。 * 同時に2つのパスワードリセットトークンをリクエストし、それらを比較します。一致するトークンはトークン生成に欠陥があることを示唆します。
**これを試すには** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **をチェックしてください。** **これを試すには** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **をチェックしてください。**
@ -356,13 +356,13 @@ asyncio.run(main())
### 2つのメールアドレスへのメール変更クッキーに基づく ### 2つのメールアドレスへのメール変更クッキーに基づく
[**この研究**](https://portswigger.net/research/smashing-the-state-machine)によると、Gitlabはこの方法で乗っ取られる脆弱性があり、**1つのメールの** **メール確認トークンをのメールに送信する**可能性があります。 [**この研究**](https://portswigger.net/research/smashing-the-state-machine)によると、Gitlabはこの方法で乗っ取られる脆弱性があり、**1つのメールの** **メール確認トークンをのメールに送信する**可能性があります。
**これを試すには** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **をチェックしてください。** **これを試すには** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **をチェックしてください。**
### 隠れたデータベースの状態 / 確認バイパス ### 隠れたデータベースの状態 / 確認バイパス
**2つの異なる書き込み**が**データベース内に情報を追加するために使用される**場合、**最初のデータのみがデータベースに書き込まれ**小さな時間の部分があります。例えば、ユーザーを作成する際に、**ユーザー名**と**パスワード**が**書き込まれ**、**新しく作成されたアカウントを確認するためのトークン**が書き込まれます。これは、**アカウントを確認するためのトークンがnullである**小さな時間があることを意味します。 **2つの異なる書き込み**が**データベース内に情報を追加するために使用される**場合、**最初のデータのみがデータベースに書き込まれ**小さな時間の部分があります。例えば、ユーザーを作成する際に、**ユーザー名**と**パスワード**が**書き込まれ**、**新しく作成されたアカウントを確認するためのトークン**が書き込まれます。これは、短い時間の間、**アカウントを確認するためのトークンがnullである**ことを意味します。
したがって、**アカウントを登録し、空のトークン**`token=`または`token[]=`または他のバリエーション)で確認するために複数のリクエストを送信することで、メールを制御していないアカウントを**確認する**ことができる可能性があります。 したがって、**アカウントを登録し、空のトークン**`token=`または`token[]=`または他のバリエーション)で確認するために複数のリクエストを送信することで、メールを制御していないアカウントを**確認する**ことができる可能性があります。
@ -370,7 +370,7 @@ asyncio.run(main())
### 2FAのバイパス ### 2FAのバイパス
以下の擬似コードは、セッションが作成されている間に**2FAが強制されていない**非常に短い時間があるため、レースコンディションに対して脆弱です: 以下の擬似コードは、セッションが作成されている間に**2FAが強制されていない**非常に短い時間があるため、レースコンディションに脆弱です:
```python ```python
session['userid'] = user.userid session['userid'] = user.userid
if user.mfa_enabled: if user.mfa_enabled:
@ -393,7 +393,7 @@ session['enforce_mfa'] = True
## **WebSockets における RC** ## **WebSockets における RC**
[**WS\_RaceCondition\_PoC**](https://github.com/redrays-io/WS\_RaceCondition\_PoC) では、**レースコンディションを Web ソケットでも悪用するために、並行して WebSocket メッセージを送信する Java の PoC**を見つけることができます。 [**WS\_RaceCondition\_PoC**](https://github.com/redrays-io/WS\_RaceCondition\_PoC) では、**レースコンディションを Web ソケットでも悪用するために、並行して WebSocket メッセージを送信する**Java の PoC を見つけることができます。
## 参考文献 ## 参考文献
@ -402,10 +402,11 @@ session['enforce_mfa'] = True
* [https://hackerone.com/reports/55140](https://hackerone.com/reports/55140) * [https://hackerone.com/reports/55140](https://hackerone.com/reports/55140)
* [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)
* [https://portswigger.net/web-security/race-conditions](https://portswigger.net/web-security/race-conditions) * [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/)
{% hint style="success" %} {% hint style="success" %}
AWS ハッキングを学び、実践する<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\ AWS ハッキングを学び、実践する:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
GCP ハッキングを学び、実践する<img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) GCP ハッキングを学び、実践する: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
@ -413,7 +414,7 @@ GCP ハッキングを学び、実践する:<img src="../.gitbook/assets/grte.
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください! * [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください!
* **💬 [**Discord グループ**](https://discord.gg/hRep4RUj7f) または [**Telegram グループ**](https://t.me/peass) に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォローしてください。** * **💬 [**Discord グループ**](https://discord.gg/hRep4RUj7f) または [**Telegram グループ**](https://t.me/peass) に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォローしてください。**
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) の GitHub リポジトリに PR を提出してハッキングトリックを共有してください。** * **ハッキングのトリックを共有するには、[**HackTricks**](https://github.com/carlospolop/hacktricks) と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) の GitHub リポジトリに PR を送信してください。**
</details> </details>
{% endhint %} {% endhint %}
@ -421,7 +422,7 @@ GCP ハッキングを学び、実践する:<img src="../.gitbook/assets/grte.
<figure><img src="../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure> <figure><img src="../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
\ \
[**Trickest**](https://trickest.com/?utm\_source=hacktricks\&utm\_medium=text\&utm\_campaign=ppc\&utm\_term=trickest\&utm\_content=race-condition) を使用して、世界で最も**高度な**コミュニティツールによって駆動される**ワークフローを簡単に構築し、自動化**します。\ [**Trickest**](https://trickest.com/?utm\_source=hacktricks\&utm\_medium=text\&utm\_campaign=ppc\&utm\_term=trickest\&utm\_content=race-condition) を使用して、世界で最も**高度な**コミュニティツールによって**ワークフローを簡単に構築し、自動化**します。\
今すぐアクセスを取得: 今すぐアクセスを取得:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=race-condition" %} {% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=race-condition" %}