Impacket スクリプト impacket-describeTicket の使い方徹底解説 🕵️‍♂️

セキュリティツール

はじめに: 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 コマンドがそのまま利用できます。

依存関係: Impacket はいくつかの Python ライブラリ (例: 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 操作ツール。
  • OS の機能:
    • Windows: klist コマンドで現在のセッションのチケットを表示・管理できます。チケットキャッシュファイル (通常 LSA 内) から直接抽出するのは難しいですが、Mimikatz などがこれを行います。
    • Linux/macOS: klist コマンドでチケットキャッシュ (通常 /tmp/krb5cc_UID のようなファイル) を確認できます。このキャッシュファイル (ccache 形式) は impacket-describeTicket で直接読み込めます。
  • ネットワークキャプチャ: 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'
💡 ヒント: デフォルトでは ccache 形式として扱われます。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: その他の認可関連データ (オプション)。

⚠️ PAC の重要性

PAC を解析することで、ユーザーの正確な権限 (特に所属グループ) を知ることができます。これは、ペネトレーションテストにおいて権限昇格の可能性を探る上で非常に重要です。例えば、管理者グループ (Domain Admins など) の SID が PAC に含まれていれば、そのチケットを持つユーザーはドメイン管理者権限を持っていることがわかります。 また、Golden Ticket や Silver Ticket といった攻撃では、偽造した PAC を含むチケットが作成されます。impacket-describeTicket は、これらの不正なチケットを分析するのにも役立ちます。MS14-068 のような脆弱性では、PAC の署名検証の不備を突いて権限昇格が行われましたが、describeTicket.py を使ってチケット内の PAC を確認することで、攻撃が成功したか (特権グループが含まれているか) を判断できます。

実践的な例 💻

ここでは、いくつかの具体的なシナリオで 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 の世界を探求してみてください!🚀

コメント

タイトルとURLをコピーしました