Impacket rpcmap.py
指定した DCE/RPC 接続先で、管理インターフェースや探索によって利用可能な UUID、バージョン、opnum を調べます。
| 項目 | 内容 |
|---|---|
| 実装 | examples/rpcmap.py |
| カテゴリ | SMB / MSRPC / NTLM |
| 規模 | 378 行 |
| 配布 | setup.py の scripts=examples/*.py によりスクリプトとしてインストール |
CLI と入力
Section titled “CLI と入力”オプションの最新の定義は python examples/rpcmap.py -h で確認できます。
| 引数 | 説明 |
|---|---|
stringbinding | R|String binding to connect to MSRPC interface, for example: ncacn_ip_tcp:192.168.0.1[135] ncacn_np:192.168.0.1[\pipe\spoolss] ncacn_http:192.168.0.1[593] ncacn_http:[6001,RpcProxy=exchange.contoso.com:443] ncacn_http:localhost[3388,RpcProxy=rds.contoso:443] |
-brute-uuids | Bruteforce UUIDs even if MGMT interface is available |
-brute-opnums | Bruteforce opnums for found UUIDs |
-brute-versions | Bruteforce major versions of found UUIDs |
-opnum-max | Bruteforce opnums from 0 to N, default 64 |
-version-max | Bruteforce versions from 0 to N, default 64 |
-auth-level | MS-RPCE auth level, from 1 to 6, default 6 (RPC_C_AUTHN_LEVEL_PKT_PRIVACY) |
-uuid | Test only this UUID |
-debug | Turn DEBUG output ON |
-ts | Adds timestamp to every logging output |
-target-ip | IP Address of the target machine. If omitted it will use whatever was specified as target. This is useful when target is the NetBIOS name and you cannot resolve it |
-port | Destination port to connect to SMB Server(選択肢: 139, 445、既定値: 445) |
-auth-rpc | [domain/]username[:password] |
-auth-transport | [domain/]username[:password] |
-hashes-rpc | NTLM hashes, format is LMHASH:NTHASH |
-hashes-transport | NTLM hashes, format is LMHASH:NTHASH |
-no-pass | don’t ask for passwords |
詳細な処理フロー
Section titled “詳細な処理フロー”transport と RPC 自体の資格情報を別々に設定し、指定 binding へ接続します。MGMT interface の一覧を基本とし、option により UUID、version、opnum の候補を bind/call して応答/fault を分類します。発見 tuple は既知 UUID database と照合して表示します。
仕組みの詳細
Section titled “仕組みの詳細”rpcmap は既知 endpoint の一覧表示に加え、指定 string binding 上で interface
を能動的に調べます。transport への接続後、Management interface が使える場合は
server が列挙する interface ID を取得します。使えない場合や明示 option では、
UUID/version/opnum の候補に対して bind/call を行い、返る fault を分類します。
RPC transport authentication と RPC interface authentication は別設定です。
たとえば RPC over SMB では SMB session の credential で named pipe を開き、
その上の DCE/RPC auth trailer には別 credential/auth level を使えます。
set_transport_credentials() と set_rpc_credentials() を分けている理由です。
bind 成功は interface/version の存在を示し、op_rng_error は interface は
存在するが opnum が範囲外であることを示せます。一方 access denied は opnum
存在の可能性を残します。brute force は network 負荷と log を発生させるため、
上限、再接続、timeout を管理し、fault code を単純な成功/失敗に潰さないことが
探索精度を決めます。
主要な実装要素
Section titled “主要な実装要素”| シンボル | 位置 | 責務を追う入口 |
|---|---|---|
RPCMap | 54 | __init__()、get_rpc_transport()、set_transport_credentials()、set_rpc_credentials()、set_smb_info()、connect()、disconnect()、do()、bruteforce_versions()、bruteforce_opnums()、bruteforce_uuids()、handle_discovered_tup() |
Impacket 内部
Section titled “Impacket 内部”| モジュール | 使用する主な名前 |
|---|---|
impacket.http | AUTH_BASIC |
impacket.examples | logger, rpcdatabase |
impacket.examples.utils | parse_identity |
impacket | uuid, version |
impacket.dcerpc.v5.epm | KNOWN_UUIDS |
impacket.dcerpc.v5 | epm, mgmt, rpcrt, transport |
impacket.dcerpc.v5.rpcrt | DCERPCException |
impacket.dcerpc.v5.transport | DCERPCStringBinding, SMBTransport |
impacket.dcerpc.v5.rpch | RPC_PROXY_CONN_A1_0X6BA_ERR, RPC_PROXY_CONN_A1_401_ERR, RPC_PROXY_CONN_A1_404_ERR, RPC_PROXY_HTTP_IN_DATA_401_ERR, RPC_PROXY_INVALID_RPC_PORT_ERR, RPC_PROXY_RPC_OUT_DATA_404_ERR |
出力・副作用・必要権限
Section titled “出力・副作用・必要権限”- 照会や認証の試行が中心です。実行回数が多いと監査ログやアカウントロック、対象の負荷に影響します。
失敗経路と後始末
Section titled “失敗経路と後始末”- 失敗時は、名前解決、接続、認証、サービスの状態、権限のどこで止まったかを、プロトコルのステータスから切り分けます。
- 後始末に関係する実装として
disconnect()があります。新しい早期 return や例外経路でも到達するか確認します。
実装を変更するとき
Section titled “実装を変更するとき”dcerpc.v5.transport / rpcrt / epm / mgmt、examples.rpcdatabase に依存します。RPCMap は transport auth と RPC auth を別 state として持つため、統合しないでください。
- 構文:
python -m py_compile examples/rpcmap.py - CLI:
python examples/rpcmap.py -h - 関連テスト:
tests/SMB_RPC/test_rpch.py - 関連テスト:
tests/SMB_RPC/test_rpcrt.py - 関連テスト:
tests/dcerpc/test_epm.py - 関連テスト:
tests/misc/test_dcerpc_v5_ndr.py

