はじめに: Impacket と Kerberos の世界へようこそ
現代のネットワーク環境、特に Windows Active Directory (AD) 環境では、認証プロトコル Kerberos が中心的な役割を担っています。ユーザーやサービスがネットワークリソースに安全にアクセスするための「通行手形」とも言える Kerberos チケットの仕組みを理解することは、セキュリティ専門家やシステム管理者にとって不可欠です。
Impacket は、ネットワークプロトコルの操作に特化した強力な Python クラスのコレクションであり、セキュリティテストやシステム管理の現場で広く利用されています。Impacket には多数の便利なスクリプトが含まれており、その中でも impacket-describeTicket
(内部的には describeTicket.py
) は、Kerberos チケットの内容を詳細に解析し、人間が読める形式で表示するための非常に有用なツールです。🔑
なぜ Kerberos チケットの解析が重要なのでしょうか? チケットには、ユーザー情報、アクセス権限、有効期間、暗号化方式など、認証に関する重要な情報が詰まっています。これらの情報を読み解くことで、以下のような目的を達成できます。
- Kerberos 認証に関する問題のトラブルシューティング
- チケットのセキュリティ特性 (暗号化強度など) の評価
- ペネトレーションテストにおける権限昇格やラテラルムーブメントの足がかりの調査 (例: Kerberoasting、Golden Ticket、Silver Ticket の分析)
- インシデントレスポンスにおける侵害されたシステムからのチケットの分析
このブログ記事では、impacket-describeTicket
の基本的な使い方から、主要なオプション、出力内容の詳細、そして実際の活用シナリオまで、包括的に解説していきます。この記事を読むことで、あなたも Kerberos チケットの解析マスターに一歩近づけるはずです! 💪
準備するもの: Impacket と Kerberos チケット
impacket-describeTicket
を使用する前に、いくつかの準備が必要です。
1. Impacket のインストール
Impacket は Python で書かれているため、まず Python 環境が必要です。pip を使って簡単にインストールできます。
pip install impacket
または、GitHub リポジトリから直接クローンしてインストールすることも可能です。
git clone https://github.com/fortra/impacket.git
cd impacket
pip install .
Kali Linux などのペネトレーションテスト用ディストリビューションには、Impacket がプリインストールされていることが多いです。その場合、impacket-describeTicket
コマンドがそのまま利用できます。
pycryptodomex
, pyasn1
) に依存しています。pip でインストールすれば、通常は自動的に解決されます。
2. 解析対象の Kerberos チケット
当然ながら、解析するためには Kerberos チケットが必要です。チケットは様々な方法で取得できます。
- Impacket の他のスクリプト:
impacket-getTGT
: ユーザー名とパスワード/ハッシュを使って TGT (Ticket Granting Ticket) を取得します。impacket-getST
: TGT を使って特定のサービスに対する ST (Service Ticket) を取得します。
- 他のツール:
- Mimikatz: Windows 上で動作し、メモリから Kerberos チケットを抽出できます (
sekurlsa::tickets /export
)。 - Rubeus: .NET 製の Kerberos 操作ツールセット。チケットの要求、ダンプ、変換などが可能です。
- Kekeo: Mimikatz の作者による別の Kerberos 操作ツール。
- Mimikatz: Windows 上で動作し、メモリから Kerberos チケットを抽出できます (
- OS の機能:
- Windows:
klist
コマンドで現在のセッションのチケットを表示・管理できます。チケットキャッシュファイル (通常 LSA 内) から直接抽出するのは難しいですが、Mimikatz などがこれを行います。 - Linux/macOS:
klist
コマンドでチケットキャッシュ (通常/tmp/krb5cc_UID
のようなファイル) を確認できます。このキャッシュファイル (ccache 形式) はimpacket-describeTicket
で直接読み込めます。
- Windows:
- ネットワークキャプチャ: Wireshark などで Kerberos 認証の通信 (AS-REQ/AS-REP, TGS-REQ/TGS-REP) をキャプチャし、そこからチケットデータを抽出することも可能です (高度な技術が必要です)。
チケットは通常、ccache (Credentials Cache) 形式または kirbi 形式で保存されます。impacket-describeTicket
は両方の形式に対応しています。
基本的な使い方: チケットファイルを指定するだけ!
最も基本的な使い方は、解析したいチケットファイルを引数として渡すだけです。
impacket-describeTicket <ticket_file>
例えば、getTGT.py
で取得した TGT ファイル (例: user.ccache
) を解析する場合:
impacket-describeTicket user.ccache
Mimikatz でエクスポートした kirbi ファイル (例: [0;xxxxx]-xxxxx-xxxxx.kirbi
) を解析する場合:
impacket-describeTicket '[0;xxxxx]-xxxxx-xxxxx.kirbi'
-f
オプションを参照)。
基本的な出力内容
実行すると、チケットに関する様々な情報が出力されます。主な内容は以下の通りです。
- ファイル形式: 読み込んだチケットファイルの形式 (ccache or kirbi)。
- Principal Name: チケットに関連付けられたクライアントのプリンシパル名 (例:
user@REALM.COM
)。 - Credentials: チケット本体の情報。
- Ticket Version Number: Kerberos プロトコルのバージョン (通常 5)。
- Realm: チケットが発行された Kerberos レルム (通常 AD ドメイン名)。
- Server Name (sname): チケットが対象とするサービスのプリンシパル名 (TGT の場合は
krbtgt/REALM.COM@REALM.COM
)。 - Encrypted Data (enc-part): チケットの暗号化された部分。ここにはセッションキーやクライアント情報、PAC などが含まれますが、通常はこの段階では暗号化されているため内容は表示されません。
- etype: 暗号化に使用されたアルゴリズムの種類を示す番号 (例: 23=RC4-HMAC, 17=AES128-CTS-HMAC-SHA1-96, 18=AES256-CTS-HMAC-SHA1-96)。
- kvno: サービスアカウントのキーバージョン番号 (パスワード変更などでインクリメントされる)。
- cipher: 暗号化されたデータ本体 (16進数表示)。
これだけでもチケットの基本的な情報は把握できますが、impacket-describeTicket
の真価は、暗号化された部分を復号して、さらに詳細な情報を表示できる点にあります。
主要なオプションと機能 ✨
impacket-describeTicket
は、より詳細な解析を行うためのオプションを提供しています。-h
または --help
で利用可能な全オプションを確認できます。
impacket-describeTicket -h
ここでは特に重要なオプションをいくつか紹介します。
-f <format> : チケット形式の指定
チケットファイルの形式を明示的に指定します。ccache
または kirbi
を指定できます。通常は自動検出されますが、うまく認識されない場合に役立ちます。
# kirbi ファイルであることを明示
impacket-describeTicket -f kirbi ticket.kirbi
-k <key> または関連オプション: 暗号化部分の復号 🔑
これが impacket-describeTicket
の最も強力な機能の一つです。チケットの暗号化部分 (enc-part) を復号するための鍵を指定することで、セッションキーや PAC (Privilege Attribute Certificate) などの内部情報を表示できます。
鍵を指定する方法はいくつかあります。
-p <password>
: ユーザーまたはサービスのパスワードを直接指定します。-hp <hexpassword>
: パスワードの16進数表現を指定します。-u <user>
/-d <domain>
/-s <salt>
: パスワードから鍵を導出するためのユーザー名、ドメイン、ソルトを指定します (通常はパスワードだけで十分)。--rc4 <nthash>
: ユーザーまたはサービスの NT ハッシュ (RC4 キー) を指定します。--aes <hexkey>
: ユーザーまたはサービスの AES キー (128/256 ビット) を16進数で指定します。-k <key>
: (getTGT.py
などで TGT を取得した場合) TGT のセッションキーを直接指定して、その TGT を使って取得した ST を復号する場合などに使われます (やや高度な使い方)。
なぜ鍵が必要か? Kerberos チケットの enc-part は、TGT の場合は KDC のマスターキー (krbtgt アカウントのハッシュから導出)、ST の場合は対象となるサービスアカウントのパスワードハッシュから導出された鍵で暗号化されています。したがって、これらの鍵を知っていれば、チケットの暗号化部分を復号できます。
例えば、サービスアカウント svc_http
の NT ハッシュが abcdef1234567890abcdef1234567890
であることがわかっており、そのアカウントに対する ST (http_ticket.kirbi
) を解析する場合:
impacket-describeTicket --rc4 abcdef1234567890abcdef1234567890 http_ticket.kirbi
- Session Key: クライアントとサーバー (または KDC) 間で使用されるセッションキー。
- Client Name (cname): クライアントのプリンシパル名。
- Client Realm (crealm): クライアントのレルム。
- Auth Time: 認証が行われた時刻。
- Start Time: チケットが有効になる時刻。
- End Time: チケットの有効期限。
- Renew Till: チケットの更新期限 (更新可能な場合)。
- Flags: チケットの属性を示すフラグ (後述)。
- Addresses: チケットが有効なクライアントの IP アドレスリスト (通常は省略される)。
- PAC (Privilege Attribute Certificate): これが非常に重要! PAC はマイクロソフトによる Kerberos 拡張で、ユーザーの認可情報 (SID, グループメンバーシップ, ユーザー権利など) を含みます。PAC を解析することで、ユーザーがどのような権限を持っているかを詳細に知ることができます。
-no-pac : PAC の解析を無効化
鍵を指定して復号する場合、デフォルトで PAC の解析が試みられます。何らかの理由で PAC の解析をスキップしたい場合にこのオプションを使用します。
出力の詳細: フラグと PAC 📜
復号されたチケット情報の中でも、特に重要なのがフラグと PAC です。
チケットフラグ (Ticket Flags)
チケットフラグは、チケットの挙動や制約を示すビットフィールドです。代表的なフラグには以下のようなものがあります。
フラグ名 | 説明 | セキュリティ上の意味合い |
---|---|---|
FORWARDABLE | このチケットを使って、さらに別のホストへの認証のために新しいチケット (プロキシチケット) を要求できるか。 | 有効な場合、攻撃者がチケットを奪取すると、他のシステムへのアクセスに使用される可能性がある (制約付き委任など)。 |
FORWARDED | このチケットが転送されてきたものか (FORWARDABLE フラグを持つ TGT から発行されたか)。 | 認証経路の追跡に役立つ。 |
PROXIABLE | このチケットに基づいてプロキシチケットを要求できるか (FORWARDABLE と似ているが、用途が異なる)。 | FORWARDABLE と同様、委任シナリオで重要。 |
PROXY | このチケットがプロキシチケットであるか。 | 認証経路の追跡に役立つ。 |
RENEWABLE | チケットの有効期限が切れる前に、有効期間を延長 (更新) できるか。更新期限 (Renew Till) まで可能。 | 有効な場合、長期間有効な認証情報となりうる。攻撃者が更新可能な TGT を奪取すると、長期間アクセスを維持できる可能性がある (Golden Ticket の代替など)。 |
PRE-AUTHENT | チケット発行前に事前認証 (通常はユーザーのパスワードハッシュを使用) が行われたか。 | AS-REP Roasting 攻撃は、事前認証が無効なアカウントを対象とする。 |
HW-AUTHENT | スマートカードログオンなど、ハードウェアによる認証が行われたか。 | 認証方法の強化を示す。 |
OK-AS-DELEGATE | サービスアカウントが委任に対して信頼されているか (制約なし委任)。 | 非常に危険な設定。このフラグを持つアカウントのチケットを奪取されると、攻撃者はそのサービスになりすまして任意のユーザーとして他のサービスにアクセスできる可能性がある。 |
PAC (Privilege Attribute Certificate)
PAC は、Active Directory 環境における Kerberos 認証の中核的な要素の一つです。チケットの enc-part 内に埋め込まれ、ユーザーのセキュリティコンテキスト情報を提供します。impacket-describeTicket
で鍵を指定して復号すると、PAC の内容が解析されて表示されます。
PAC に含まれる主な情報:
- Logon Info: ユーザー SID、プライマリグループ SID、所属するグループの SID リスト、ユーザーアカウント制御フラグ (UAC)、パスワード最終設定日時、ログオンサーバーなど。
- Client Info: クライアント名、クライアント SID。
- Server Checksum / KDC Checksum: PAC の改ざんを検出するための署名。Server Checksum はサービスアカウントの鍵で、KDC Checksum は KDC (krbtgt) の鍵で署名されます。
- UPN DNS Info: UPN (User Principal Name) と DNS ドメイン名。
- Authorization Data: その他の認可関連データ (オプション)。
実践的な例 💻
ここでは、いくつかの具体的なシナリオで impacket-describeTicket
を使用する例を示します。
例1: TGT (ccache 形式) の基本解析
getTGT.py
でユーザー lowuser
の TGT を取得し、それを解析します。
# TGT を取得 (パスワード入力が求められる)
impacket-getTGT test.local/lowuser -dc-ip 192.168.1.100
# 取得した ccache ファイルを解析
impacket-describeTicket lowuser.ccache
出力例 (抜粋):
Ticket provided is ccache
Principal Name: lowuser@TEST.LOCAL
Credentials:
Ticket Version Number: 5
Realm: TEST.LOCAL
Server Name (sname): krbtgt/TEST.LOCAL@TEST.LOCAL
Encrypted Data (enc-part):
etype: 18 (aes256-cts-hmac-sha1-96)
kvno: 2
cipher: 0xdeadbeef... (long hex string)
この時点では、enc-part は暗号化されたままです。
例2: ST (kirbi 形式) の復号と PAC 解析
Mimikatz で CIFS サービス (ファイル共有) の ST をエクスポートし (例: [0;xxxxx]-cifs-dc.test.local.kirbi
)、サービスアカウント DC$
(ドメインコントローラーのマシンアカウント) の AES256 キーがわかっているとします。
# AES256 キーを指定してチケットを復号・解析
impacket-describeTicket --aes <DC$_AES256_KEY_HEX> '[0;xxxxx]-cifs-dc.test.local.kirbi'
出力例 (抜粋、復号成功時):
Ticket provided is kirbi
Principal Name: None (from kirbi, needs context)
Credentials:
Ticket Version Number: 5
Realm: TEST.LOCAL
Server Name (sname): cifs/dc.test.local@TEST.LOCAL
Encrypted Data (enc-part): DECRYPTED! ✅
etype: 18 (aes256-cts-hmac-sha1-96)
kvno: 15
Session Key: type=18, key=0x...
Client Name (cname): lowuser@TEST.LOCAL
Client Realm (crealm): TEST.LOCAL
Auth Time: 2025-04-01 06:50:00Z
Start Time: 2025-04-01 06:50:00Z
End Time: 2025-04-01 16:50:00Z
Renew Till: 2025-04-08 06:50:00Z
Flags: FORWARDABLE, RENEWABLE, PRE-AUTHENT (0x40a10000)
Addresses: None
PAC:
Type: KERB_VALIDATION_INFO (1) - PAC_TYPE_LOGON_INFO
LogonTime: ...
LogoffTime: ...
KickOffTime: ...
PasswordLastSet: ...
PasswordCanChange: ...
PasswordMustChange: ...
EffectiveName: lowuser
FullName: Low User
LogonScript:
ProfilePath:
HomeDirectory:
HomeDirectoryDrive:
LogonCount: ...
BadPasswordCount: ...
UserId: 1105 (Relative ID)
PrimaryGroupId: 513 (Domain Users)
GroupIds: [513, 520, 518, 519] (Relative IDs of groups)
UserFlags: ...
UserSessionKey: ...
LogonServer: DC
LogonDomainName: TEST
LogonDomainId: S-1-5-21-...
UserAccountControl: NORMAL_ACCOUNT, DONT_EXPIRE_PASSWD (0x10200)
SubAuthStatus: ...
SidCount: 4
GroupMembership SIDs:
S-1-5-21-...-513 (Domain Users)
S-1-5-32-545 (Users)
...
Type: PAC_CLIENT_INFO_TYPE (10) - PAC_TYPE_CLIENT_INFO
ClientId: ...
NameLength: 14
Name: lowuser
Type: UPN_DNS_INFO (12) - PAC_TYPE_UPN_DNS_INFO
UpnLength: 18
UpnOffset: ...
DnsDomainNameLength: 15
DnsDomainNameOffset: ...
Flags: 0
UPN: lowuser@test.local
DNS Domain Name: test.local
Type: KERB_CHECKSUM (6) - PAC_SERVER_CHECKSUM
Checksum: 0x... (Signature using service key)
Type: KERB_CHECKSUM (7) - PAC_PRIVSVR_CHECKSUM
Checksum: 0x... (Signature using KDC key - krbtgt)
このように、鍵を提供することで PAC の内容、特にユーザーの SID (1105)、所属グループ (513: Domain Users など)、ユーザーアカウント制御フラグなどが詳細に表示されます。🛡️
セキュリティにおける活用シナリオ 🛡️
impacket-describeTicket
は、様々なセキュリティ関連タスクで役立ちます。
- Kerberos 認証のデバッグ: 認証失敗の原因を調査する際に、取得したチケットの内容 (有効期限、フラグ、プリンシパル名、暗号化タイプなど) を確認することで、問題の切り分けに役立ちます。
- ペネトレーションテスト:
- 取得したチケット (特に TGT や高権限サービスの ST) を解析し、PAC からユーザーの権限やグループメンバーシップを確認します。
- Kerberoasting で取得した ST を解析し、暗号化タイプ (etype) を確認します。RC4 (etype 23) など弱い暗号化が使われていれば、オフラインでのパスワードクラックが容易になります。
- Golden Ticket や Silver Ticket が疑われる場合に、チケットの内容 (特に偽造された可能性のある PAC) を詳細に分析します。
- 委任設定 (FORWARDABLE, PROXIABLE, OK-AS-DELEGATE フラグ) を確認し、ラテラルムーブメントの経路を探ります。
- MS14-068 などの脆弱性を利用した攻撃後、生成されたチケットの PAC に特権グループが含まれているかを確認し、攻撃の成否を判断します。
- インシデントレスポンス: 侵害された可能性のあるホストから抽出された Kerberos チケット (メモリダンプやキャッシュファイルから) を解析し、攻撃者がどのようなアカウントやサービスにアクセスしようとしていたか、どのような権限を持っていたかを調査します。チケットのタイムスタンプ (Auth Time, Start Time, End Time) も重要な情報源となります。
- セキュリティ監査: 定期的に特定のサービスアカウントのチケットをサンプリングし、意図しない権限が付与されていないか、推奨されないフラグ (例: OK-AS-DELEGATE) が設定されていないかなどを確認します。
このように、チケットの内容を深く理解することは、Active Directory 環境のセキュリティを維持・向上させる上で不可欠なスキルと言えるでしょう。
まとめ
impacket-describeTicket
は、Impacket スイートの中でも特に Kerberos チケットの解析に特化した強力なツールです。チケットファイル (.ccache または .kirbi) を指定するだけで基本的な情報を表示でき、さらに適切な鍵 (パスワード、NT ハッシュ、AES キー) を提供することで、チケットの暗号化部分を復号し、セッションキーや PAC (Privilege Attribute Certificate) といった内部の詳細情報を明らかにすることができます。
チケットフラグや PAC から得られる情報は、認証トラブルシューティング、ペネトレーションテストにおける権限分析や攻撃経路の探索、インシデントレスポンスにおける状況把握など、様々なセキュリティシナリオにおいて非常に価値があります。👍
Active Directory と Kerberos は複雑ですが、impacket-describeTicket
のようなツールを使いこなすことで、その内部構造と動作への理解を深めることができます。ぜひこのツールを活用して、Kerberos の世界を探求してみてください!🚀
コメント