Impacket getPac.py
S4U2self と U2U の交換を使って対象ユーザーの PAC を取得し、各バッファの内容を表示します。
| 項目 | 内容 |
|---|---|
| 実装 | examples/getPac.py |
| カテゴリ | Kerberos / チケット処理 |
| 規模 | 321 行 |
| 配布 | setup.py の scripts=examples/*.py によりスクリプトとしてインストール |
CLI と入力
Section titled “CLI と入力”オプションの最新の定義は python examples/getPac.py -h で確認できます。
| 引数 | 説明 |
|---|---|
credentials | domain/username[:password]. Valid domain credentials to use for grabbing targetUser’s PAC |
-targetUser | the target user to retrieve the PAC of(必須) |
-debug | Turn DEBUG output ON |
-ts | Adds timestamp to every logging output |
-hashes | NTLM hashes, format is LMHASH:NTHASH |
詳細な処理フロー
Section titled “詳細な処理フロー”指定資格情報で TGT を取得し、対象 user の PA-FOR-USER を含む TGS request を構築します。返却 ticket の encrypted part を復号し、authorization data から PACTYPE を取り出して logon info、client info、署名、UPN/DNS info を buffer type ごとに解析します。
仕組みの詳細
Section titled “仕組みの詳細”PAC は ticket 内の authorization data に格納され、通常は service key で
暗号化された EncTicketPart の中にあります。このコマンドは S4U2self と
user-to-user を組み合わせ、呼び出し元が復号できる形の ticket を KDC に
発行させて PAC を観察します。
まず service account の TGT を取得し、PA-FOR-USER checksum を含む
S4U2self TGS-REQ を作ります。U2U では追加 ticket を request に含め、KDC が
session key で保護した service ticket を返せるようにします。応答を適切な
key usage で復号し、EncTicketPart.authorization-data から AD-IF-RELEVANT、
さらに PACTYPE を取り出します。
PAC は buffer directory と可変長 payload の集合です。printPac() は
logon info、client info、server/KDC checksum、UPN/DNS info を type ごとに
NDR/構造体へ dispatch します。未知 buffer を飛ばせること、offset/size が
ticket 内に収まること、署名値を通常データと誤解しないことが parser の重要な
不変条件です。
主要な実装要素
Section titled “主要な実装要素”| シンボル | 位置 | 責務を追う入口 |
|---|---|---|
S4U2SELF | 53 | __init__()、printPac()、dump() |
Impacket 内部
Section titled “Impacket 内部”| モジュール | 使用する主な名前 |
|---|---|
impacket | version |
impacket.dcerpc.v5.rpcrt | TypeSerialization1 |
impacket.examples | logger |
impacket.examples.utils | parse_identity |
impacket.krb5 | constants |
impacket.krb5.asn1 | AD_IF_RELEVANT, AP_REQ, AS_REP, Authenticator, EncTicketPart, PA_FOR_USER_ENC, TGS_REP, TGS_REQ, Ticket, seq_set, seq_set_iter |
impacket.krb5.crypto | Enctype, Key, _HMACMD5, _enctype_table |
impacket.krb5.kerberosv5 | getKerberosTGT, sendReceive |
impacket.krb5.pac | KERB_VALIDATION_INFO, PACTYPE, PAC_CLIENT_INFO, PAC_CLIENT_INFO_TYPE, PAC_INFO_BUFFER, PAC_PRIVSVR_CHECKSUM, PAC_SERVER_CHECKSUM, PAC_SIGNATURE_DATA, PAC_UPN_DNS_INFO, UPN_DNS_INFO |
impacket.krb5.types | KerberosTime, Principal, Ticket |
impacket.winregistry | hexdump |
外部パッケージ(直接使用)
Section titled “外部パッケージ(直接使用)”| import 名 | 配布パッケージ | 経路・宣言状態 |
|---|---|---|
pyasn1 | pyasn1 | 直接 import、宣言済み |
six | six | 直接 import、宣言済み |
出力・副作用・必要権限
Section titled “出力・副作用・必要権限”- 照会や認証の試行が中心です。実行回数が多いと監査ログやアカウントロック、対象の負荷に影響します。
失敗経路と後始末
Section titled “失敗経路と後始末”- 失敗時は、名前解決、接続、認証、サービスの状態、権限のどこで止まったかを、プロトコルのステータスから切り分けます。
実装を変更するとき
Section titled “実装を変更するとき”krb5.asn1 / crypto / pac / types、pyasn1 と NDR serialization に依存します。S4U2SELF.dump() が exchange、printPac() が buffer dispatch を担当します。
- 構文:
python -m py_compile examples/getPac.py - CLI:
python examples/getPac.py -h - 関連テスト:
tests/SMB_RPC/test_rpcrt.py - 関連テスト:
tests/misc/test_crypto.py - 関連テスト:
tests/misc/test_krb5_crypto.py - 関連テスト:
tests/misc/test_krb5_gssapi.py - 関連テスト:
tests/misc/test_pac_helpers.py - 関連テスト:
tests/misc/test_winregistry.py

