Impacket CheckLDAPStatus.py
Domain Controller が LDAP 署名と LDAPS のチャネルバインディングを要求するか調べます。
| 項目 | 内容 |
|---|---|
| 実装 | examples/CheckLDAPStatus.py |
| カテゴリ | Active Directory / LDAP / アカウント管理 |
| 規模 | 128 行 |
| 配布 | setup.py の scripts=examples/*.py によりスクリプトとしてインストール |
CLI と入力
Section titled “CLI と入力”オプションの最新の定義は python examples/CheckLDAPStatus.py -h で確認できます。
| 引数 | 説明 |
|---|---|
-dc-ip | IP Address of a domain controller or a DNS resolver for the domain.(必須) |
-domain | |
-debug | Turn DEBUG output ON |
-timeout | DNS timeout(既定値: 15) |
-ts | Adds timestamp to every logging output |
詳細な処理フロー
Section titled “詳細な処理フロー”CheckLDAP.list_dc() が対象 DC を確定し、run() が各 DC に対して LDAP signing と LDAPS CBT の検査を順に実行します。前者は LDAPConnection の bind 結果、後者は TLS 接続と channel binding を変えた認証結果から設定を判定します。timeout は DNS と接続の両方へ影響します。
仕組みの詳細
Section titled “仕組みの詳細”このコマンドの判定対象は「LDAP port が開いているか」ではなく、Domain Controller が認証時に署名と TLS channel binding をどのように要求するかです。 LDAP signing は平文 LDAP session 上の SASL/NTLM bind に署名がない場合の応答を 観察し、server が未署名 bind を拒否するかどうかで判定します。LDAPS CBT は TLS server certificate から channel binding data を作る正常系と、CBT を 欠落・不一致にした認証試行を分け、返された LDAP status の差を見ます。
-domain だけが与えられた場合、list_dc() は DNS の SRV 情報から候補 DC を
作ります。-dc-ip はこの discovery を省き、検査対象を一台に固定します。
複数 DC を持つ domain では policy が一様とは限らないため、結果は domain
全体の属性ではなく「検査した各 DC の現在の応答」として扱う必要があります。
TLS handshake failure、資格情報の拒否、CBT policy による拒否は同じ失敗では
ありません。check_ldaps_cbt() を変更するときは、OpenSSL の通信例外と LDAP
result code を分離し、認証そのものが成立しない状態を「CBT 強制」と誤判定
しないことが重要です。
主要な実装要素
Section titled “主要な実装要素”| シンボル | 位置 | 責務を追う入口 |
|---|---|---|
CheckLDAP | 30 | __init__()、list_dc()、run()、check_ldaps_cbt()、check_ldap_signing() |
Impacket 内部
Section titled “Impacket 内部”| モジュール | 使用する主な名前 |
|---|---|
impacket | version |
impacket.examples | logger |
impacket.ldap.ldap | LDAPConnection, LDAPSessionError |
外部パッケージ(直接使用)
Section titled “外部パッケージ(直接使用)”| import 名 | 配布パッケージ | 経路・宣言状態 |
|---|---|---|
OpenSSL | pyOpenSSL | 直接 import、宣言済み |
dns | dnspython | 直接 import、直接依存には未宣言 |
出力・副作用・必要権限
Section titled “出力・副作用・必要権限”- 照会や認証の試行が中心です。実行回数が多いと監査ログやアカウントロック、対象の負荷に影響します。
失敗経路と後始末
Section titled “失敗経路と後始末”- 失敗時は、名前解決、接続、認証、サービスの状態、権限のどこで止まったかを、プロトコルのステータスから切り分けます。
実装を変更するとき
Section titled “実装を変更するとき”impacket.ldap.ldap、OpenSSL、dns.resolver を使用します。主要責務は CheckLDAP に集約されています。dnspython は直接依存として宣言されていないため、配布方法を変更するときは注意が必要です。
- 構文:
python -m py_compile examples/CheckLDAPStatus.py - CLI:
python examples/CheckLDAPStatus.py -h - 関連テスト:
tests/SMB_RPC/test_ldap.py

