Impacket describeTicket.py
ccache または kirbi 形式のチケットを読み取り、鍵があれば暗号化部分と PAC も復号して表示します。
| 項目 | 内容 |
|---|---|
| 実装 | examples/describeTicket.py |
| カテゴリ | Kerberos / チケット処理 |
| 規模 | 771 行 |
| 配布 | setup.py の scripts=examples/*.py によりスクリプトとしてインストール |
CLI と入力
Section titled “CLI と入力”オプションの最新の定義は python examples/describeTicket.py -h で確認できます。
| 引数 | 説明 |
|---|---|
ticket | Path to ticket.ccache |
-debug | Turn DEBUG output ON |
-ts | Adds timestamp to every logging output |
-p / --password | Cleartext password of the service account |
-hp / --hex-password | Hex password of the service account |
-u / --user | Name of the service account |
-d / --domain | FQDN Domain |
-s / --salt | Salt for keys calculation (DOMAIN.LOCALSomeuser for users, DOMAIN.LOCALhostsomemachine.domain.local for machines) |
--rc4 | RC4 KEY (i.e. NT hash) |
--aes | AES128 or AES256 key |
--asrep-key | AS reply key for PAC Credentials decryption |
詳細な処理フロー
Section titled “詳細な処理フロー”入力形式を判定して ticket と metadata を読み、password、hex password、RC4/AES key、AS-REP key から候補 key を生成します。ticket encrypted part を復号後、PAC buffer を type ごとに解析し、SID、group、flags、checksum、時刻を表示します。ccache から Kerberoast 形式を出す経路もあります。
仕組みの詳細
Section titled “仕組みの詳細”ticket file は「暗号化された ticket」と、その利用に必要な session key や principal metadata を含みます。ccache の場合は credential entry から ticket、 client/server principal、session key を読みます。kirbi/KRB-CRED では enc-part の形式を解き、同等の情報へ正規化します。まず container format を判定する ことが解析の第一段階です。
ticket の enc-part を読むには service principal の long-term key が必要です。
password と domain/user から salt を使って key を生成する経路、RC4/AES key を
直接与える経路、AS-REP key を使う経路があり、ticket の enctype と key usage
に合う候補だけを試します。checksum failure は「parse failure」ではなく、
鍵・salt・principal 情報の不一致を示します。
復号後は EncTicketPart の flags、時刻、authorization data を表示し、
PAC があれば buffer directory を辿って group membership、SID、UPN/DNS、
client/device claims、device info、checksum 等を展開します。claims は
非圧縮のものを解析し、未対応の圧縮形式は復号できないことを表示します。
PAC 内の FILETIME、NDR pointer、flag は表示用に
変換しますが、raw 値も追跡可能に保つと未知拡張の調査に役立ちます。
主要な実装要素
Section titled “主要な実装要素”| シンボル | 位置 | 責務を追う入口 |
|---|---|---|
User_Flags | 46 | 構造体/定数定義 |
SE_GROUP_Attributes | 51 | 構造体/定数定義 |
USER_ACCOUNT_Codes | 57 | 構造体/定数定義 |
UF_FLAG_Codes | 82 | 構造体/定数定義 |
Upn_Dns_Flags | 109 | 構造体/定数定義 |
Attributes_Flags | 114 | 構造体/定数定義 |
parse_ccache() | 220 | モジュール関数 |
parse_pac() | 355 | モジュール関数 |
kerberoast_from_ccache() | 670 | モジュール関数 |
parse_args() | 713 | モジュール関数 |
main() | 758 | モジュール関数 |
Impacket 内部
Section titled “Impacket 内部”| モジュール | 使用する主な名前 |
|---|---|
impacket | version |
impacket.dcerpc.v5.dtypes | FILETIME, PRPC_SID |
impacket.dcerpc.v5.rpcrt | TypeSerialization1 |
impacket.examples | logger |
impacket.krb5 | constants, pac |
impacket.krb5.asn1 | AD_IF_RELEVANT, EncTicketPart, TGS_REP |
impacket.krb5.ccache | CCache |
impacket.krb5.constants | ChecksumTypes |
impacket.krb5.crypto | InvalidChecksum, Key, _enctype_table, generate_kerberos_keys |
impacket.ldap.ldaptypes | LDAP_SID |
外部パッケージ(直接使用)
Section titled “外部パッケージ(直接使用)”| import 名 | 配布パッケージ | 経路・宣言状態 |
|---|---|---|
Cryptodome | pycryptodomex | 直接 import、宣言済み |
pyasn1 | pyasn1 | 直接 import、宣言済み |
出力・副作用・必要権限
Section titled “出力・副作用・必要権限”- 主処理はローカルファイルの解析です。入力を信頼せず、offset、length、形式識別子を検証してからデータを参照してください。
失敗経路と後始末
Section titled “失敗経路と後始末”- 失敗時は、名前解決、接続、認証、サービスの状態、権限のどこで止まったかを、プロトコルのステータスから切り分けます。
実装を変更するとき
Section titled “実装を変更するとき”krb5.ccache / asn1 / crypto / pac、pyasn1、Cryptodome.Hash.MD4、LDAP SID helper に依存します。parse_ccache() と parse_pac() が形式境界です。
- 構文:
python -m py_compile examples/describeTicket.py - CLI:
python examples/describeTicket.py -h - 関連テスト:
tests/SMB_RPC/test_rpcrt.py - 関連テスト:
tests/misc/test_ccache.py - 関連テスト:
tests/misc/test_crypto.py - 関連テスト:
tests/misc/test_krb5_crypto.py - 関連テスト:
tests/misc/test_krb5_gssapi.py

