コンテンツにスキップ

Impacket rdp_check.py

カテゴリ目次へ戻る / コマンド全体目次へ戻る

RDP/CredSSP で指定したアカウントの認証可否を確認します。

項目内容
実装examples/rdp_check.py
カテゴリSMB / MSRPC / NTLM
規模578 行
配布setup.py の scripts=examples/*.py によりスクリプトとしてインストール

オプションの最新の定義は python examples/rdp_check.py -h で確認できます。

引数説明
target[[domain/]username[:password]@]
-6 / --ipv6Test on IPv6
-tsAdds timestamp to every logging output
-debugTurn DEBUG output ON
-hashesNTLM hashes, format is LMHASH:NTHASH

TCP 接続後に TPKT/X.224 negotiation で protocol を選択し、TLS を確立します。SPNEGO/NTLM token を含む CredSSP TSRequest を交換し、server public-key binding と authentication 応答を検証します。RDP negotiation failure と credential rejection を区別して表示します。

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 します。

シンボル位置責務を追う入口
TPKT58構造体/定数定義
TPDU67__init__()
CR_TPDU78構造体/定数定義
DATA_TPDU88__init__()
RDP_NEG_REQ99__init__()
RDP_NEG_RSP108構造体/定数定義
RDP_NEG_FAILURE113構造体/定数定義
TSPasswordCreds118__init__()、getData()
TSCredentials141__init__()、getData()
TSRequest163__init__()、fromString()、getData()
モジュール使用する主な名前
impacket.exampleslogger
impacket.examples.utilsget_connected_socket, parse_target
impacket.structureStructure
impacket.spnegoASN1_OCTET_STRING, ASN1_SEQUENCE, GSSAPI, asn1decode, asn1encode
impacketntlm, version
import 名配布パッケージ経路・宣言状態
Cryptodomepycryptodomex直接 import、宣言済み
OpenSSLpyOpenSSL直接 import、宣言済み
  • 照会や認証の試行が中心です。実行回数が多いと監査ログやアカウントロック、対象の負荷に影響します。
  • 入力ファイルがない場合、壊れている場合、読み取りが途中で終わる場合、未対応の形式だった場合を区別します。

独自 TPKT/TPDU/CredSSP structures、spnego、ntlm、OpenSSL/socket helper に依存します。TSRequest.fromString() と framing は untrusted network input を扱うため、length 検証を保ってください。