mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/135-pentesting-msrpc.md'] t
This commit is contained in:
parent
363820417f
commit
423dbdfdd9
@ -6,7 +6,7 @@
|
||||
|
||||
Microsoft Remote Procedure Call (MSRPC) プロトコルは、クライアントサーバーモデルであり、プログラムが別のコンピュータ上にあるプログラムからサービスを要求することを可能にしますが、ネットワークの詳細を理解する必要はありません。このプロトコルは、最初はオープンソースソフトウェアから派生し、その後Microsoftによって開発され、著作権が付与されました。
|
||||
|
||||
RPCエンドポイントマッパーは、TCPおよびUDPポート135、TCP 139および445のSMB(ヌルまたは認証されたセッション)、およびTCPポート593のWebサービスを介してアクセスできます。
|
||||
RPCエンドポイントマッパーは、TCPおよびUDPポート135、TCP 139および445のSMB(ヌルまたは認証されたセッションで)、およびTCPポート593のWebサービスを介してアクセスできます。
|
||||
```
|
||||
135/tcp open msrpc Microsoft Windows RPC
|
||||
```
|
||||
@ -18,7 +18,7 @@ RPCエンドポイントマッパーは、TCPおよびUDPポート135、TCP 139
|
||||
|
||||
## **公開されているRPCサービスの特定**
|
||||
|
||||
TCP、UDP、HTTP、およびSMBを介したRPCサービスの公開は、RPCロケータサービスおよび個々のエンドポイントをクエリすることによって判断できます。rpcdumpなどのツールは、**IFID**値によって示されるユニークなRPCサービスの特定を容易にし、サービスの詳細と通信バインディングを明らかにします:
|
||||
TCP、UDP、HTTP、SMBを介したRPCサービスの公開は、RPCロケータサービスおよび個々のエンドポイントをクエリすることによって判断できます。rpcdumpなどのツールは、**IFID**値によって示されるユニークなRPCサービスの特定を容易にし、サービスの詳細と通信バインディングを明らかにします:
|
||||
```
|
||||
D:\rpctools> rpcdump [-p port] <IP>
|
||||
**IFID**: 5a7b91f8-ff00-11d0-a9b2-00c04fb6e6fc version 1.0
|
||||
@ -34,7 +34,7 @@ use auxiliary/scanner/dcerpc/management
|
||||
use auxiliary/scanner/dcerpc/tcp_dcerpc_auditor
|
||||
rpcdump.py <IP> -p 135
|
||||
```
|
||||
すべてのオプションは `tcp_dcerpc_auditor` を除いて、ポート135のMSRPCをターゲットにするために特別に設計されています。
|
||||
All options except `tcp_dcerpc_auditor` are specifically designed for targeting MSRPC on port 135.
|
||||
|
||||
#### 注目すべきRPCインターフェース
|
||||
|
||||
@ -83,9 +83,64 @@ rpcdump.py <IP> -p 135
|
||||
|
||||
[rpctools](https://resources.oreilly.com/examples/9780596510305/tree/master/tools/rpctools)の**rpcdump.exe**は、このポートと対話できます。
|
||||
|
||||
### 自動インターフェース列挙と動的クライアント生成(NtObjectManager)
|
||||
## MSRPCインターフェースの自動ファジング
|
||||
|
||||
PowerShellの専門家**James Forshaw**は、オープンソースの*NtObjectManager*モジュール内のほとんどのWindows RPC内部を公開しました。これを使用すると、任意のRPCサーバーDLL / EXEを数秒で**完全機能のクライアントスタブ**に変換できます - IDL、MIDL、または手動のアンマシャリングは不要です。
|
||||
MS-RPCインターフェースは、大規模でしばしば文書化されていない攻撃面を公開しています。オープンソースの[MS-RPC-Fuzzer](https://github.com/warpnet/MS-RPC-Fuzzer) PowerShellモジュールは、James Forshawの`NtObjectManager`を基にして、Windowsバイナリにすでに存在するインターフェースメタデータからRPCクライアントスタブを*動的に*作成します。スタブが存在するようになると、モジュールは変異した入力で各手続きを攻撃し、結果を記録することができ、**IDLの1行も書かずにRPCエンドポイントの再現可能で大規模なファジングが可能になります**。
|
||||
|
||||
### 1. インターフェースのインベントリ
|
||||
```powershell
|
||||
# Import the module (download / git clone first)
|
||||
Import-Module .\MS-RPC-Fuzzer.psm1
|
||||
|
||||
# Parse a single binary
|
||||
Get-RpcServerData -Target "C:\Windows\System32\efssvc.dll" -OutPath .\output
|
||||
|
||||
# Or crawl the whole %SystemRoot%\System32 directory
|
||||
Get-RpcServerData -OutPath .\output
|
||||
```
|
||||
`Get-RpcServerData` は、UUID、バージョン、バインディング文字列(名前付きパイプ / TCP / HTTP)および **完全な手続きプロトタイプ** をすべてのインターフェースから抽出し、それらを `rpcServerData.json` に保存します。
|
||||
|
||||
### 2. ファズァを実行する
|
||||
```powershell
|
||||
'.\output\rpcServerData.json' |
|
||||
Invoke-RpcFuzzer -OutPath .\output `
|
||||
-MinStrLen 100 -MaxStrLen 1000 `
|
||||
-MinIntSize 9999 -MaxIntSize 99999
|
||||
```
|
||||
関連オプション:
|
||||
|
||||
* `-MinStrLen` / `-MaxStrLen` – 生成された文字列のサイズ範囲
|
||||
* `-MinIntSize` / `-MaxIntSize` – 変異した整数の値範囲(オーバーフローテストに便利)
|
||||
* `-Sorted` – **パラメータ依存関係**を考慮した順序で手続きを実行し、1つの呼び出しの出力が次の入力として使用できるようにする(到達可能なパスが劇的に増加)
|
||||
|
||||
ファザーは2つの戦略を実装しています:
|
||||
|
||||
1. **デフォルトファザー** – ランダムなプリミティブ値 + 複雑な型のデフォルトインスタンス
|
||||
2. **ソートファザー** – 依存関係を考慮した順序付け(`docs/Procedure dependency design.md`を参照)
|
||||
|
||||
すべての呼び出しは`log.txt`に原子的に書き込まれます; クラッシュ後、**最後の行が問題のある手続きを即座に教えてくれます**。各呼び出しの結果は3つのJSONファイルに分類されます:
|
||||
|
||||
* `allowed.json` – 呼び出しが成功し、データを返しました
|
||||
* `denied.json` – サーバーが*アクセス拒否*で応答しました
|
||||
* `error.json` – その他のエラー / クラッシュ
|
||||
|
||||
### 3. Neo4jで可視化する
|
||||
```powershell
|
||||
'.\output\allowed.json' |
|
||||
Import-DataToNeo4j -Neo4jHost 192.168.56.10:7474 -Neo4jUsername neo4j
|
||||
```
|
||||
`Import-DataToNeo4j` は、JSON アーティファクトをグラフ構造に変換します。ここで:
|
||||
|
||||
* RPC サーバー、インターフェース、手続きは **ノード** です
|
||||
* インタラクション(`ALLOWED`、`DENIED`、`ERROR`)は **リレーションシップ** です
|
||||
|
||||
Cypher クエリを使用して、危険な手続きを迅速に特定したり、クラッシュの前に行われた呼び出しの正確なチェーンを再生したりできます。
|
||||
|
||||
⚠️ ファズザーは *破壊的* です:サービスのクラッシュや BSOD を予期してください – 常に隔離された VM スナップショットで実行してください。
|
||||
|
||||
### 自動インターフェース列挙と動的クライアント生成 (NtObjectManager)
|
||||
|
||||
PowerShell の達人 **James Forshaw** は、オープンソースの *NtObjectManager* モジュール内のほとんどの Windows RPC 内部を公開しました。これを使用すると、任意の RPC サーバー DLL / EXE を **完全機能のクライアントスタブ** に数秒で変換できます – IDL、MIDL、または手動のアンマシャリングは不要です。
|
||||
```powershell
|
||||
# Install the module once
|
||||
Install-Module NtObjectManager -Force
|
||||
@ -104,7 +159,7 @@ $rpcinterfaces[0].Procedures[0] | Format-List *
|
||||
# Reverse the MS-EFSR (EfsRpc*) interface into C#
|
||||
Format-RpcClient $rpcinterfaces[0] -Namespace MS_EFSR -OutputPath .\MS_EFSR.cs
|
||||
```
|
||||
生成されたスタブ内には、次のようなメソッドが含まれています:
|
||||
生成されたスタブ内には、次のようなメソッドが含まれています:
|
||||
```csharp
|
||||
public int EfsRpcOpenFileRaw(out Marshal.NdrContextHandle ctx, string FileName, int Flags) {
|
||||
// marshals parameters & calls opnum 0
|
||||
@ -123,8 +178,6 @@ $client.EfsRpcOpenFileRaw([ref]$ctx, "\\\127.0.0.1\test", 0)
|
||||
```
|
||||
認証 (Kerberos / NTLM) と暗号化レベル (`PacketIntegrity`, `PacketPrivacy`, …) は `Connect-RpcClient` cmdlet を介して直接提供できます – 高特権の名前付きパイプを保護する **セキュリティ記述子** を **バイパス** するのに理想的です。
|
||||
|
||||
---
|
||||
|
||||
### コンテキスト対応RPCファジング (MS-RPC-Fuzzer)
|
||||
|
||||
静的インターフェースの知識は素晴らしいですが、実際に求めているのは *コンテキストハンドル* と複雑なパラメータチェーンを理解する **カバレッジガイドファジング** です。オープンソースの **MS-RPC-Fuzzer** プロジェクトは、まさにそのワークフローを自動化します:
|
||||
@ -143,20 +196,18 @@ Invoke-MSRPCFuzzer -Pipe "\\.\pipe\efsrpc" -Auth NTLM `
|
||||
-Iterations 100000 `
|
||||
-OutDir .\results
|
||||
```
|
||||
単一のバッファ外書き込みまたは予期しない例外は、トリガーとなった正確な opnum + フuzzed ペイロードとともに即座に表面化します - 安定した概念実証エクスプロイトの完璧な出発点です。
|
||||
単一のバッファ外書き込みまたは予期しない例外は、トリガーした正確な opnum + フォズペイロードとともに即座に表面化します - 安定した概念実証エクスプロイトの完璧な出発点です。
|
||||
|
||||
> ⚠️ 多くの RPC サービスは **NT AUTHORITY\SYSTEM** として実行されるプロセス内で動作します。ここでのメモリ安全性の問題は、通常、ローカル特権昇格または (SMB/135 経由で公開される場合) *リモートコード実行* に変換されます。
|
||||
|
||||
---
|
||||
> ⚠️ 多くのRPCサービスは、**NT AUTHORITY\SYSTEM**として実行されるプロセス内で動作します。ここでのメモリ安全性の問題は、通常、ローカル特権昇格または(SMB/135経由で公開されている場合)*リモートコード実行*に変換されます。
|
||||
|
||||
## 参考文献
|
||||
|
||||
- [Automating MS-RPC vulnerability research (2025, Incendium.rocks)](https://www.incendium.rocks/posts/Automating-MS-RPC-Vulnerability-Research/)
|
||||
- [MS-RPC-Fuzzer – context-aware RPC fuzzer](https://github.com/warpnet/MS-RPC-Fuzzer)
|
||||
- [NtObjectManager PowerShell module](https://github.com/googleprojectzero/sandbox-attacksurface-analysis-tools/tree/master/NtObjectManager)
|
||||
|
||||
- [https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/](https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/)
|
||||
- [https://www.cyber.airbus.com/the-oxid-resolver-part-2-accessing-a-remote-object-inside-dcom/](https://www.cyber.airbus.com/the-oxid-resolver-part-2-accessing-a-remote-object-inside-dcom/)
|
||||
- [https://0xffsec.com/handbook/services/msrpc/](https://0xffsec.com/handbook/services/msrpc/)
|
||||
- [MS-RPC-Fuzzer (GitHub)](https://github.com/warpnet/MS-RPC-Fuzzer)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user