Impacket ticketer.py
SID、グループ、鍵から Golden/Silver Ticket を作るか、既存のチケットと PAC を加工して ccache に保存します。
| 項目 | 内容 |
|---|---|
| 実装 | examples/ticketer.py |
| カテゴリ | Kerberos / チケット処理 |
| 規模 | 1189 行 |
| 配布 | setup.py の scripts=examples/*.py によりスクリプトとしてインストール |
CLI と入力
Section titled “CLI と入力”オプションの最新の定義は python examples/ticketer.py -h で確認できます。
| 引数 | 説明 |
|---|---|
target | username for the newly created ticket |
-spn | SPN (service/server) of the target service the silver ticket will be generated for. if omitted, golden ticket will be created |
-request | Requests ticket to domain and clones it changing only the supplied information. It requires specifying -user |
-domain | the fully qualified domain name (e.g. contoso.com)(必須) |
-domain-sid | Domain SID of the target domain the ticker will be generated for(必須) |
-aesKey | AES key used for signing the ticket (128 or 256 bits) |
-nthash | NT hash used for signing the ticket |
-keytab | Read keys for SPN from keytab file (silver ticket only) |
-groups | comma separated list of groups user will belong to (default = 513, 512, 520, 518, 519) |
-user-id | user id for the user the ticket will be created for (default = 500) |
-extra-sid | Comma separated list of ExtraSids to be included inside the ticket’s PAC |
-extra-pac | Populate your ticket with extra PAC (UPN_DNS) |
-old-pac | Use the old PAC structure to create your ticket (exclude PAC_ATTRIBUTES_INFO and PAC_REQUESTOR |
-duration | Amount of hours till the ticket expires (default = 2436510). Ignored with -request, which preserves the KDC-issued lifetime |
-ts | Adds timestamp to every logging output |
-debug | Turn DEBUG output ON |
-user | domain/username to be used if -request is chosen (it can be different from domain/username |
-password | password for domain/username |
-hashes | NTLM hashes, format is LMHASH:NTHASH |
-dc-ip | IP Address of the domain controller. If ommited it use the domain part (FQDN) specified in the target parameter |
-impersonate | Sapphire ticket. target username that will be impersonated (through S4U2Self+U2U) for querying the ST and extracting the PAC, which will be included in the new ticket |
詳細な処理フロー
Section titled “詳細な処理フロー”keytab/password/hash/AES key と domain 情報を検証し、basic ticket と PAC buffer を作ります。-request 時は KDC 応答を template として取得します。validation info、UPN/DNS、attributes、requestor、追加 SID を反映後、PAC checksum と ticket encrypted part を enctype に応じて署名・暗号化し、saveTicket() へ渡します。
仕組みの詳細
Section titled “仕組みの詳細”このコマンドは KDC に通常発行を依頼するだけでなく、ticket と PAC を
client 側で構築・署名します。createBasicTicket() が AS-REP/TGS-REP の外形と
EncTicketPart を作り、createBasicPac() が validation info、client info、
checksum placeholder 等の PAC buffer を配置します。domain SID、user RID、
group RID はここで authorization data へ変換されます。
customizeTicket() は group、extra SID、UPN/DNS、requestor、PAC attributes、
寿命などを反映します。-request では既存 KDC 応答を template として利用し、
条件が合えば KDC が発行した PAC_REQUESTOR と PAC_ATTRIBUTES を保持します。
抽出できないときは生成した値に戻るため、修正済み KDC では検証に失敗する
場合があります。PAC は buffer を追加するたびに offset と alignment
が変わるため、内容だけでなく directory の size/offset を再計算する必要があります。
signEncryptTicket() は最初に PAC checksum field を規定値で計算し、server
checksum と KDC checksum の依存順を守って署名し、その後 ticket enc-part を
service/krbtgt key と key usage で暗号化します。RC4 と AES では key size、
checksum algorithm、cipher profile が違います。最後に session key を含む
ccache を保存し、生成 ticket が後続 client で使える形にします。
主要な実装要素
Section titled “主要な実装要素”| シンボル | 位置 | 責務を追う入口 |
|---|---|---|
TICKETER | 90 | __init__()、getFileTime()、getPadLength()、getBlockLength()、loadKeysFromKeytab()、createBasicValidationInfo()、createBasicPac()、createUpnDnsPac()、createAttributesInfoPac()、createRequestorInfoPac()、createBasicTicket()、getKerberosS4U2SelfU2U() ほか |
Impacket 内部
Section titled “Impacket 内部”| モジュール | 使用する主な名前 |
|---|---|
impacket | version |
impacket.dcerpc.v5.dtypes | RPC_SID, SID |
impacket.dcerpc.v5.ndr | NDRULONG |
impacket.dcerpc.v5.samr | GROUP_MEMBERSHIP, NULL, SE_GROUP_ENABLED, SE_GROUP_ENABLED_BY_DEFAULT, SE_GROUP_MANDATORY, USER_DONT_EXPIRE_PASSWORD, USER_NORMAL_ACCOUNT |
impacket.examples | logger |
impacket.krb5.asn1 | AD_IF_RELEVANT, AP_REQ, AS_REP, Authenticator, AuthorizationData, ETYPE_INFO2, EncASRepPart, EncTGSRepPart, EncTicketPart, PA_FOR_USER_ENC, TGS_REP, TGS_REQ, Ticket, seq_set, seq_set_iter |
impacket.krb5.constants | ApplicationTagNumbers, AuthorizationDataType, ChecksumTypes, EncryptionTypes, KERB_NON_KERB_CKSUM_SALT, PreAuthenticationDataTypes, PrincipalNameType, ProtocolVersionNumber, TicketFlags, encodeFlags |
impacket.krb5.keytab | Keytab |
impacket.krb5.crypto | Enctype, Key, _AES256CTS, _HMACMD5, _enctype_table, get_kerberos_key_for_enctype, string_to_key |
impacket.krb5.pac | KERB_SID_AND_ATTRIBUTES, KERB_VALIDATION_INFO, PAC_ATTRIBUTES_INFO, PAC_ATTRIBUTE_INFO, PAC_CLIENT_INFO, PAC_CLIENT_INFO_TYPE, PAC_LOGON_INFO, PAC_PRIVSVR_CHECKSUM, PAC_REQUESTOR, PAC_REQUESTOR_INFO, PAC_SERVER_CHECKSUM, PAC_SIGNATURE_DATA, PAC_UPN_DNS_INFO, PKERB_SID_AND_ATTRIBUTES_ARRAY, UPN_DNS_INFO_FULL, VALIDATION_INFO |
impacket.krb5.types | KerberosTime, Principal, Ticket |
impacket.krb5.kerberosv5 | getKerberosTGS, getKerberosTGT, sendReceive |
impacket.krb5 | constants, pac |
impacket.winregistry | hexdump |
impacket.krb5.ccache | CCache |
外部パッケージ(直接使用)
Section titled “外部パッケージ(直接使用)”| import 名 | 配布パッケージ | 経路・宣言状態 |
|---|---|---|
pyasn1 | pyasn1 | 直接 import、宣言済み |
six | six | 直接 import、宣言済み |
出力・副作用・必要権限
Section titled “出力・副作用・必要権限”- 照会や認証の試行が中心です。実行回数が多いと監査ログやアカウントロック、対象の負荷に影響します。
- オプションによりローカルファイルを作成または更新します。既存ファイルの扱いと秘密情報を含む出力の権限を確認してください。
失敗経路と後始末
Section titled “失敗経路と後始末”- 失敗時は、名前解決、接続、認証、サービスの状態、権限のどこで止まったかを、プロトコルのステータスから切り分けます。
実装を変更するとき
Section titled “実装を変更するとき”krb5.asn1 / constants / crypto / pac / keytab、NDR/SID、pyasn1 に依存します。TICKETER の create/customize/sign/save 段階が主要な拡張点です。PAC buffer offset と署名順序は wire contract です。
- 構文:
python -m py_compile examples/ticketer.py - CLI:
python examples/ticketer.py -h - 関連テスト:
tests/misc/test_ticketer.py - 関連テスト:
tests/SMB_RPC/test_ndr.py - 関連テスト:
tests/dcerpc/test_samr.py - 関連テスト:
tests/misc/test_ccache.py - 関連テスト:
tests/misc/test_crypto.py - 関連テスト:
tests/misc/test_dcerpc_v5_ndr.py - 関連テスト:
tests/misc/test_krb5_crypto.py

