Impacket GetNPUsers.py
事前認証を要求しないアカウントを LDAP で探します。必要に応じて AS-REP を取得し、オフライン解析用の形式で保存します。
| 項目 | 内容 |
|---|---|
| 実装 | examples/GetNPUsers.py |
| カテゴリ | Kerberos / チケット処理 |
| 規模 | 411 行 |
| 配布 | setup.py の scripts=examples/*.py によりスクリプトとしてインストール |
CLI と入力
Section titled “CLI と入力”オプションの最新の定義は python examples/GetNPUsers.py -h で確認できます。
| 引数 | 説明 |
|---|---|
target | [[domain/]username[:password]] |
-request | Requests TGT for users and output them in JtR/hashcat format (default False) |
-outputfile | Output filename to write ciphers in JtR/hashcat format |
-format | format to save the AS_REQ of users without pre-authentication. Default is hashcat(選択肢: hashcat, john) |
-usersfile | File with user per line to test |
-ts | Adds timestamp to every logging output |
-debug | Turn DEBUG output ON |
-hashes | NTLM hashes, format is LMHASH:NTHASH |
-no-pass | don’t ask for password (useful for -k) |
-k | Use Kerberos authentication. Grabs credentials from ccache file (KRB5CCNAME) based on target parameters. If valid credentials cannot be found, it will use the ones specified in the command line |
-aesKey | AES key to use for Kerberos Authentication (128 or 256 bits) |
-dc-ip | IP Address of the domain controller. If ommited it use the domain part (FQDN) specified in the target parameter |
-dc-host | Hostname of the domain controller to use. If ommited, the domain part (FQDN) specified in the account parameter will be used |
-ldaps / -use-ldaps | Use LDAPS instead of LDAP |
詳細な処理フロー
Section titled “詳細な処理フロー”domain identity から LDAP へ接続し、UF_DONT_REQUIRE_PREAUTH を含む user を抽出します。-request 時は user ごとに AS-REQ を構築して KDC へ送り、AS-REP の暗号部を指定形式へ変換します。-usersfile では LDAP 検索を省き、入力名を順番に試します。
仕組みの詳細
Section titled “仕組みの詳細”Kerberos pre-authentication が有効な通常 account では、client は user key で
暗号化した timestamp を AS-REQ に含め、KDC はそれを検証してから TGT を返します。
UF_DONT_REQUIRE_PREAUTH の account ではこの証明なしに AS-REP を返せるため、
応答の encrypted part を offline 検証可能な形で取得できます。このコマンドは
その directory 検索と KDC request を一続きにしています。
LDAP 経路では UAC flag と account 状態を検索し、候補 user を表にします。
-request がある場合だけ各 principal の AS-REQ を組み立てます。
-usersfile 経路は LDAP read 権限を必要とせず、入力された principal を
KDC へ直接問い合わせますが、存在しない user、pre-auth 必須、rate limit の
違いが応答に現れます。
getTGT() は AS-REP/KRB-ERROR を ASN.1 decode し、enctype に応じて cipher
text の分割位置と出力書式を変えます。hashcat と John では field 順や区切りが
異なるため、同じ byte 列を単に hex 化するだけではありません。KDC error を
「対象なし」と一括解釈せず、clock skew、principal 不明、pre-auth required を
区別することが正しい結果につながります。
主要な実装要素
Section titled “主要な実装要素”| シンボル | 位置 | 責務を追う入口 |
|---|---|---|
GetUserNoPreAuth | 50 | __init__()、printTable()、getUnixTime()、getTGT()、outputTGT()、run()、request_users_file_TGTs()、request_multiple_TGTs() |
Impacket 内部
Section titled “Impacket 内部”| モジュール | 使用する主な名前 |
|---|---|
impacket | version |
impacket.dcerpc.v5.samr | UF_ACCOUNTDISABLE, UF_DONT_REQUIRE_PREAUTH |
impacket.examples | logger |
impacket.examples.utils | ldap_login, parse_identity |
impacket.krb5 | constants |
impacket.krb5.asn1 | AS_REP, AS_REQ, KERB_PA_PAC_REQUEST, KRB_ERROR, seq_set, seq_set_iter |
impacket.krb5.kerberosv5 | KerberosError, sendReceive |
impacket.krb5.types | KerberosTime, Principal |
impacket.ldap | ldap, ldapasn1 |
外部パッケージ(直接使用)
Section titled “外部パッケージ(直接使用)”| import 名 | 配布パッケージ | 経路・宣言状態 |
|---|---|---|
pyasn1 | pyasn1 | 直接 import、宣言済み |
出力・副作用・必要権限
Section titled “出力・副作用・必要権限”- 照会や認証の試行が中心です。実行回数が多いと監査ログやアカウントロック、対象の負荷に影響します。
- オプションによりローカルファイルを作成または更新します。既存ファイルの扱いと秘密情報を含む出力の権限を確認してください。
失敗経路と後始末
Section titled “失敗経路と後始末”- 失敗時は、名前解決、接続、認証、サービスの状態、権限のどこで止まったかを、プロトコルのステータスから切り分けます。
実装を変更するとき
Section titled “実装を変更するとき”krb5.asn1 / constants / kerberosv5 / types、pyasn1、LDAP helper を使用します。getTGT()、outputTGT()、複数 user の request method が検索と KDC I/O の境界です。
- 構文:
python -m py_compile examples/GetNPUsers.py - CLI:
python examples/GetNPUsers.py -h - 関連テスト:
tests/SMB_RPC/test_ldap.py - 関連テスト:
tests/dcerpc/test_samr.py - 関連テスト:
tests/misc/test_krb5_crypto.py - 関連テスト:
tests/misc/test_krb5_gssapi.py

