Impacket rdp_check.py
RDP/CredSSP で指定したアカウントの認証可否を確認します。
| 項目 | 内容 |
|---|---|
| 実装 | examples/rdp_check.py |
| カテゴリ | SMB / MSRPC / NTLM |
| 規模 | 578 行 |
| 配布 | setup.py の scripts=examples/*.py によりスクリプトとしてインストール |
CLI と入力
Section titled “CLI と入力”オプションの最新の定義は python examples/rdp_check.py -h で確認できます。
| 引数 | 説明 |
|---|---|
target | [[domain/]username[:password]@] |
-6 / --ipv6 | Test on IPv6 |
-ts | Adds timestamp to every logging output |
-debug | Turn DEBUG output ON |
-hashes | NTLM hashes, format is LMHASH:NTHASH |
詳細な処理フロー
Section titled “詳細な処理フロー”TCP 接続後に TPKT/X.224 negotiation で protocol を選択し、TLS を確立します。SPNEGO/NTLM token を含む CredSSP TSRequest を交換し、server public-key binding と authentication 応答を検証します。RDP negotiation failure と credential rejection を区別して表示します。
仕組みの詳細
Section titled “仕組みの詳細”RDP connection はいきなり user credential を送るのではなく、X.224 connection request で security protocol を negotiation し、TLS、その上の CredSSP/NLA へ進みます。このコマンドは TPKT/TPDU/RDP negotiation structure を自前で 組み立て、server が TLS/CredSSP を受け入れるかを最初に確認します。
CredSSP では SPNEGO/NTLM token を TSRequest ASN.1 に包み、複数 round-trip で
challenge/response を交換します。TLS server certificate/public key に
対する binding を検証した後、TSCredentials に domain/user/password 情報を
格納して暗号化された channel へ送ります。単なる TCP 3389 接続確認とは異なり、
NLA authentication の可否まで観測します。
RDP negotiation failure code、TLS handshake error、NTLM reject、CredSSP protocol error は段階が違います。account が有効かという結果は対象の NLA policy、logon right、lockout policy に左右されます。また受信 length を信頼せず、 TPKT/ASN.1 field が buffer 内に収まることを確認してから decode します。
主要な実装要素
Section titled “主要な実装要素”| シンボル | 位置 | 責務を追う入口 |
|---|---|---|
TPKT | 58 | 構造体/定数定義 |
TPDU | 67 | __init__() |
CR_TPDU | 78 | 構造体/定数定義 |
DATA_TPDU | 88 | __init__() |
RDP_NEG_REQ | 99 | __init__() |
RDP_NEG_RSP | 108 | 構造体/定数定義 |
RDP_NEG_FAILURE | 113 | 構造体/定数定義 |
TSPasswordCreds | 118 | __init__()、getData() |
TSCredentials | 141 | __init__()、getData() |
TSRequest | 163 | __init__()、fromString()、getData() |
Impacket 内部
Section titled “Impacket 内部”| モジュール | 使用する主な名前 |
|---|---|
impacket.examples | logger |
impacket.examples.utils | get_connected_socket, parse_target |
impacket.structure | Structure |
impacket.spnego | ASN1_OCTET_STRING, ASN1_SEQUENCE, GSSAPI, asn1decode, asn1encode |
impacket | ntlm, version |
外部パッケージ(直接使用)
Section titled “外部パッケージ(直接使用)”| import 名 | 配布パッケージ | 経路・宣言状態 |
|---|---|---|
Cryptodome | pycryptodomex | 直接 import、宣言済み |
OpenSSL | pyOpenSSL | 直接 import、宣言済み |
出力・副作用・必要権限
Section titled “出力・副作用・必要権限”- 照会や認証の試行が中心です。実行回数が多いと監査ログやアカウントロック、対象の負荷に影響します。
失敗経路と後始末
Section titled “失敗経路と後始末”- 入力ファイルがない場合、壊れている場合、読み取りが途中で終わる場合、未対応の形式だった場合を区別します。
実装を変更するとき
Section titled “実装を変更するとき”独自 TPKT/TPDU/CredSSP structures、spnego、ntlm、OpenSSL/socket helper に依存します。TSRequest.fromString() と framing は untrusted network input を扱うため、length 検証を保ってください。
- 構文:
python -m py_compile examples/rdp_check.py - CLI:
python examples/rdp_check.py -h - 関連テスト:
tests/SMB_RPC/test_spnego.py - 関連テスト:
tests/misc/test_structure.py

