はじめに
Impacketは、ネットワークプロトコルを扱うためのPythonクラスのコレクションであり、特にWindows環境におけるセキュリティテストやネットワーク管理で広く利用されています。Fortra社 (旧SecureAuth社) によってメンテナンスされており、オープンソースとして提供されています。
Impacketには様々なツールが含まれていますが、この記事ではその中でもKerberos認証において重要な役割を果たすgetTGT.py
に焦点を当てて解説します。
getTGT.py
は、指定されたユーザーの認証情報(パスワード、NTLMハッシュ、AESキー)を使用して、Kerberos認証の最初のステップであるTicket Granting Ticket(TGT)を取得するためのスクリプトです。🔑
このブログ記事では、getTGT.py
の基本的な使い方から、主要なオプション、そして実際の使用例までを詳しく解説します。Kerberos認証の仕組みや、TGTがどのように利用されるのかについても触れていきますので、Active Directory環境のセキュリティに関心のある方や、ペネトレーションテスト、レッドチーム活動に従事する方にとって、有益な情報となるでしょう。
Kerberos認証とTGTについて
getTGT.py
を理解するためには、まずKerberos認証とTGTの概念を把握する必要があります。
Kerberos認証とは?
Kerberosは、ネットワーク上で安全にユーザーやサービスを認証するためのプロトコルです。特にActive Directory環境で標準的に利用されています。Kerberosは「チケット」と呼ばれる暗号化されたデータを利用して認証を行います。ユーザーは一度認証情報(通常はパスワード)を入力すれば、その後はチケットを使って様々なサービスにアクセスできます(シングルサインオン)。
Kerberos認証の主要な登場人物は以下の通りです。
- クライアント: サービスへのアクセスを要求するユーザーまたはコンピュータ。
- KDC (Key Distribution Center): ドメインコントローラー上で動作し、チケットの発行と管理を行う中心的なコンポーネント。KDCはさらに以下の2つのサービスで構成されます。
- AS (Authentication Service): 認証サービス。クライアントの最初の認証を行い、TGTを発行します。
- TGS (Ticket Granting Service): チケット認可サービス。TGTを検証し、特定のサービスへのアクセス許可証であるサービスチケット(ST)を発行します。
- サービス: クライアントがアクセスしたいリソース(ファイル共有、ウェブサイト、データベースなど)を提供するサーバー。
TGT (Ticket Granting Ticket) とは?
TGT(Ticket Granting Ticket:チケット認可チケット)は、Kerberos認証の最初のステップでKDCのASによって発行される特別なチケットです。これは、ユーザーが正当な認証情報(パスワードなど)を持っていることを証明するもので、「チケットを取得するためのチケット」とも言えます。
TGT取得の基本的な流れ(AS-REQ/AS-REP):
- クライアントは、ユーザー名とタイムスタンプなどをユーザーのパスワードから派生したキーで暗号化した「認証子」を含むAS-REQ (Authentication Service Request) メッセージをKDCのASに送信します。
- ASは、Active Directoryデータベースからユーザーのパスワードハッシュを取得し、認証子を復号して検証します。
- 検証が成功すると、ASはTGTとセッションキー(TGSとの通信で使用)を生成します。TGTはKDC(krbtgtアカウント)の秘密鍵で暗号化され、セッションキーはユーザーのパスワードから派生したキーで暗号化されます。
- ASは、暗号化されたTGTとセッションキーを含むAS-REP (Authentication Service Reply) メッセージをクライアントに返します。
クライアントは自身のパスワード派生キーでセッションキーを復号し、TGT(これはクライアント自身では復号できない)と共にキャッシュします。このTGTは、後続のステップで特定のサービスへのアクセスチケット(サービスチケット、ST)をTGSに要求する際に使用されます。
getTGT.py
は、まさにこのAS-REQ/AS-REPのプロセスを実行し、ユーザーの認証情報を使ってTGTを取得するためのツールなのです。取得されたTGTは通常、.ccache
という形式のファイルに保存され、他のImpacketツール(secretsdump.py
, psexec.py
, smbexec.py
など)で-k
オプションと共に利用することで、パスワードレスでの認証(Pass-the-Ticket)が可能になります。
ImpacketとgetTGT.pyの準備
getTGT.py
を使用するには、まずImpacketライブラリがインストールされている必要があります。
Impacketのインストール
ImpacketはPythonで書かれており、pipを使って簡単にインストールできます。Python 3.6以上が推奨されます。
方法1: pipを使用する
pip install impacket
方法2: GitHubからソースコードを取得してインストールする
git clone https://github.com/fortra/impacket.git
cd impacket
pip install .
または、開発版としてインストールする場合:
pip install -e .
インストール後、Impacketのexamplesディレクトリ(通常、Pythonのsite-packages/impacket/examples
内や、ソースからインストールした場合はimpacket/examples
ディレクトリ)にgetTGT.py
が存在することを確認してください。パスが通っていない場合は、スクリプトへのフルパスを指定するか、環境変数PATH
に追加する必要があります。
必要な情報
getTGT.py
を実行するには、以下の情報が必要になります。
- ターゲットドメイン名: Kerberosレルム名(通常はActive Directoryのドメイン名)。
- ユーザー名: TGTを取得したいユーザーのアカウント名。
- 認証情報: 以下のいずれかが必要です。
- ユーザーのパスワード
- ユーザーのNTLMハッシュ (LMハッシュは空でも可)
- ユーザーのAESキー (AES128またはAES256)
- ドメインコントローラー(KDC)のIPアドレスまたはホスト名 (オプション): 通常はDNS経由で自動検出されますが、明示的に指定することも可能です。
これらの情報を事前に収集しておく必要があります。特にNTLMハッシュやAESキーは、他のツール(例: secretsdump.py
)や手法(例: Mimikatz)を用いて取得する必要があります。
getTGT.py の基本的な使い方
getTGT.py
の基本的なコマンド構文は以下の通りです。
getTGT.py [オプション] <ドメイン>/<ユーザー名>[:<パスワード>]
引数
<ドメイン>/<ユーザー名>
(必須): ターゲットとなるドメイン名とユーザー名をスラッシュ(`/`)で区切って指定します。ドメイン名はKerberosレルムとして使用されます。[:<パスワード>]
(オプション): ユーザー名の後にコロン(`:`)を付けてパスワードを指定します。これを省略した場合、スクリプト実行時にパスワードの入力を求められます。ハッシュやAESキーを使用する場合は、この部分にパスワードを指定せず、後述の-hashes
または-aesKey
オプションを使用します。
主要なオプション
getTGT.py
には様々なオプションがありますが、ここでは特に重要なものをいくつか紹介します。
オプション | 説明 | 例 |
---|---|---|
-hashes <LMHASH:NTHASH> |
ユーザーのパスワードの代わりにLMハッシュとNTLMハッシュを指定してTGTを要求します(Pass-the-Hash / Overpass-the-Hash)。LMハッシュが不要または不明な場合は空にします(例: :NTHASH )。 |
-hashes :aabbccddeeff00112233445566778899 |
-aesKey <hex_key> |
ユーザーのパスワードの代わりにAESキー(128ビットまたは256ビット、16進数形式)を指定してTGTを要求します(Pass-the-Key)。RC4暗号化が無効な環境で有効です。 | -aesKey a1b2c3d4... |
-dc-ip <ip_address> |
KDC(通常はドメインコントローラー)のIPアドレスを明示的に指定します。DNSが利用できない環境や、特定のDCをターゲットにしたい場合に利用します。 | -dc-ip 192.168.1.100 |
-dc-host <hostname> |
KDCのホスト名を明示的に指定します。-dc-ip と同様の目的で使用します。 |
-dc-host dc01.corp.local |
-debug |
デバッグモードを有効にし、詳細なログ情報を出力します。トラブルシューティングに役立ちます。 | -debug |
-k |
Kerberos認証を使用します。これは通常、既存のTGT(例:ccacheファイル)を使ってサービスチケット(ST)を要求する場合に使いますが、getTGT.py 自体は主にTGTを取得するため、このオプションが直接使われるシナリオは限定的です。他のImpacketツールでは、-k と-no-pass を組み合わせてキャッシュされたTGTを使用します。 |
(主に他のImpacketスクリプトで使用) |
-no-pass |
パスワード、ハッシュ、AESキーのいずれも提供しない場合に指定します。-k オプションと組み合わせて、既存のccacheファイルからTGTを使用する場合などに利用されます。(getTGT.py では通常不要) |
(主に他のImpacketスクリプトで使用) |
-save-ccache <filename> |
取得したTGTを保存するccacheファイルの名前を指定します。デフォルトでは<ユーザー名>.ccache という名前で保存されます。 |
-save-ccache myuser_tgt.ccache |
-service <SPN> |
デフォルトのkrbtgt/<ドメイン> ではなく、特定のサービスプリンシパル名(SPN)を指定してTGTを取得しようとします。特殊なケースで使用されることがあります。 |
-service cifs/fileserver.corp.local |
-principalType <type> |
プリンシパル名のタイプを指定します(例: NT_PRINCIPAL)。デフォルトで多くの場合問題ありません。 | -principalType NT_ENTERPRISE |
通常、getTGT.py
の主な目的はTGTを取得して.ccache
ファイルに保存することです。取得した.ccache
ファイルは、環境変数KRB5CCNAME
にセットするか、他のImpacketスクリプトで-k -no-pass
オプションと共に使用することで、Pass-the-Ticket攻撃などに利用されます。
getTGT.py の使用例
ここでは、いくつかの具体的なシナリオにおけるgetTGT.py
の使用例を示します。
ドメイン名はcorp.local
、ユーザー名はtestuser
、ドメインコントローラーのIPアドレスは192.168.1.100
と仮定します。
1. パスワードを使用してTGTを取得する
ユーザーtestuser
のパスワードがPassword123
である場合:
getTGT.py corp.local/testuser:Password123
または、パスワードを対話的に入力する場合:
getTGT.py corp.local/testuser
Password: <ここでパスワードを入力>
成功すると、カレントディレクトリにtestuser.ccache
というファイルが作成されます。
2. NTLMハッシュを使用してTGTを取得する (Overpass-the-Hash)
ユーザーtestuser
のNTLMハッシュが0123456789abcdef0123456789abcdef
である場合(LMハッシュは空):
getTGT.py -hashes :0123456789abcdef0123456789abcdef corp.local/testuser
この方法は、パスワード自体を知らなくても、NTLMハッシュが漏洩している場合にTGTを取得できるため、「Overpass-the-Hash」と呼ばれます。Pass-the-Hash攻撃をKerberos認証に応用したものです。
3. AESキーを使用してTGTを取得する (Pass-the-Key)
ユーザーtestuser
のAES256キーがa1b2c3d4e5f6...
である場合:
getTGT.py -aesKey a1b2c3d4e5f6... corp.local/testuser
NTLMハッシュ(RC4暗号化で使用)が無効化されている環境でも、AESキーが利用可能であればこの方法でTGTを取得できます。これは「Pass-the-Key」と呼ばれます。
4. ドメインコントローラーを明示的に指定する
DNSが正しく設定されていない、または特定のDC(IP: 192.168.1.100)に接続したい場合:
getTGT.py -dc-ip 192.168.1.100 corp.local/testuser:Password123
ハッシュを使う場合:
getTGT.py -hashes :0123456789abcdef0123456789abcdef -dc-ip 192.168.1.100 corp.local/testuser
5. 取得したTGTを使用する (Pass-the-Ticket)
getTGT.py
でtestuser.ccache
を取得した後、このチケットを使って他のImpacketツールで認証を行う例です。
まず、環境変数KRB5CCNAME
にccacheファイルのパスを設定します。
export KRB5CCNAME=testuser.ccache
次に、例えばsecretsdump.py
を使ってターゲットホスト(例: targetserver.corp.local
)からハッシュ情報を取得します。-k
オプションでKerberos認証を指定し、-no-pass
でパスワード入力プロンプトを抑制します。
secretsdump.py -k -no-pass corp.local/testuser@targetserver.corp.local
同様に、psexec.py
でリモートシェルを取得する場合:
psexec.py -k -no-pass corp.local/testuser@targetserver.corp.local
これにより、元のパスワードやハッシュを再度入力することなく、キャッシュされたTGTを利用して認証が行われます。これがPass-the-Ticket攻撃の基本的な流れです。👍
セキュリティ上の意味合いと対策
getTGT.py
は、正当なネットワーク管理やセキュリティテストのツールとして非常に有用ですが、攻撃者にとっても価値のあるツールとなり得ます。漏洩した認証情報(パスワード、ハッシュ、キー)を使ってTGTを取得することは、多くの場合、Active Directory環境内でのさらなる侵害活動(ラテラルムーブメント、権限昇格)の起点となります。
攻撃シナリオ
- Overpass-the-Hash / Pass-the-Key: 侵害されたホストから抽出されたNTLMハッシュやAESキー(例: LSASSダンプからMimikatz等で抽出)を
getTGT.py
で使用し、そのユーザーになりすましてTGTを取得します。 - Kerberoasting: サービスアカウントのパスワードハッシュ(TGSチケットに含まれる)を取得するKerberoasting攻撃の前段階として、まず
getTGT.py
で有効なTGTを取得するために使われることがあります。(GetUserSPNs.pyなどが主役ですが、TGTが必要) - Pass-the-Ticket:
getTGT.py
で取得したTGT(.ccache
ファイル)を他のツール(psexec.py, smbexec.py, secretsdump.pyなど)で使用し、パスワードなしで他のマシンやサービスにアクセスします。
特に、管理者権限を持つアカウントのハッシュやキーが漏洩した場合、getTGT.py
とPass-the-Ticketを組み合わせることで、ドメイン全体に対する広範なアクセス権を奪われる可能性があります。2024年現在でも、ランサムウェアグループなどがImpacketツール群を悪用している事例が報告されています。
検知と対策
- 認証ログの監視: ドメインコントローラーのセキュリティイベントログ(特にイベントID 4768: Kerberos認証チケット(TGT)が要求された、4769: Kerberosサービスチケットが要求された)を監視します。異常な時間帯、場所からの認証要求、短時間での大量の認証失敗/成功、通常とは異なる暗号化タイプ(例: RC4が意図せず使われている)などを検知します。
- 強力なパスワードポリシー: 推測されにくい複雑なパスワードの使用を強制し、定期的な変更を義務付けます。これにより、パスワードそのものが漏洩するリスクや、Kerberoastingで取得されたハッシュが容易にクラックされるリスクを低減します。
- 認証情報の保護: Mimikatzなどのツールによるメモリからの認証情報抽出を防ぐため、LSA Protection (RunAsPPL) の有効化、Credential Guardの使用、管理者権限の厳格な管理、エンドポイントセキュリティソリューションの導入などを検討します。
- RC4暗号化の無効化: 可能であれば、古いRC4暗号化タイプを無効にし、AES暗号化のみをサポートするようにKerberosポリシーを設定します。これにより、NTLMハッシュを直接利用するOverpass-the-Hash攻撃が困難になります。(ただし、AESキーによるPass-the-Keyは依然として可能です)
- 特権アカウントの保護: Protected Usersグループの活用や、特権アクセス管理(PAM)ソリューションの導入により、高権限アカウントの認証情報を保護し、侵害された場合の影響を限定します。
- ネットワークセグメンテーションとファイアウォール: 適切なネットワークセグメンテーションとファイアウォールルールにより、攻撃者が侵害したホストからドメインコントローラーへ容易にアクセスできないようにします。
- EDR/NDRソリューション: エンドポイント検知対応(EDR)やネットワーク検知対応(NDR)ソリューションは、Impacketツールの実行や、Kerberos認証の異常な振る舞いを検知するのに役立ちます。🛡️
まとめ
impacket-getTGT
(getTGT.py
) は、Impacketスイートに含まれる強力なツールであり、指定されたユーザーの認証情報(パスワード、NTLMハッシュ、AESキー)を用いてKerberos TGTを取得する機能を提供します。
この記事では、Kerberos認証とTGTの基本概念から始め、getTGT.py
のインストール、基本的な使い方、主要なオプション(-hashes
, -aesKey
, -dc-ip
など)、そして具体的な使用例(パスワード、ハッシュ、AESキーでのTGT取得、Pass-the-Ticketへの連携)を解説しました。
getTGT.py
は、セキュリティテスト担当者がActive Directory環境のセキュリティ体制を評価する上で役立つツールですが、同時に攻撃者によって悪用されるリスクも伴います。Overpass-the-HashやPass-the-Keyといった攻撃手法は、漏洩した認証情報からドメイン内でのアクセス権限を拡大するための一般的な手口です。
したがって、Active Directory環境を保護するためには、強力な認証情報管理、適切なログ監視、セキュリティ設定の強化(RC4無効化、Credential Guard等)、そしてEDR/NDRのような検知ソリューションの導入が不可欠です。getTGT.py
のようなツールの動作原理と悪用シナリオを理解することは、効果的な防御策を講じるための第一歩となります。✨
コメント