Impacket スクリプトスイート: getPac.py の徹底解説 🕵️

セキュリティツール

Active Directory環境におけるユーザー権限情報の取得と活用

Impacket Kerberos Active Directory PAC

Impacket は、ネットワークプロトコルを扱うためのPythonクラスのコレクションであり、特にWindows環境におけるSMBやMSRPCなどのプロトコル実装に焦点を当てています。Ethical Hacker やシステム管理者にとって、ネットワークの診断、セキュリティ評価、脆弱性検証などに不可欠なツール群を提供します。2024年8月時点で、Impacketは依然としてペネトレーションテストや攻撃シミュレーションで頻繁に利用されるツールキットの一つであり、その多機能性から攻撃者にも悪用されるケースが報告されています。

この強力なスイートには、リモート実行、Kerberos操作、シークレットダンプなど、多岐にわたる目的のためのスクリプトが含まれています。これらのスクリプトは、システムの挙動を理解したり、潜在的なセキュリティリスクを特定したりする上で非常に役立ちます。

本記事では、Impacket スイートの中でも特に getPac.py スクリプトに焦点を当て、その機能、使用方法、そして取得できる情報の重要性について詳しく解説していきます。Active Directory (AD) 環境におけるユーザー権限の核心である PAC (Privilege Attribute Certificate) を理解することは、セキュリティを強化する上で不可欠です。さあ、getPac.py の世界を探求しましょう!🚀

1. getPac.py とは何か?🤔

getPac.py は、Impacket スイートに含まれるPythonスクリプトの一つです。その主な目的は、Active Directory ドメイン内の特定のユーザーアカウントに関する PAC (Privilege Attribute Certificate) 情報を取得することです。

特筆すべき点は、このスクリプトを実行するために特別な管理者権限は必要なく、通常のドメインユーザー認証情報(ユーザー名とパスワード、またはハッシュ値、Kerberosチケット)があれば十分であるという点です。これにより、攻撃者は比較的低い権限のアカウントを侵害した場合でも、ドメイン内の他のユーザー(管理者を含む)の権限情報を偵察することが可能になります。

getPac.py は、Microsoftの [MS-SFU] (Services for User) プロトコル拡張における S4USelf (Service for User to Self) と、User to User (U2U) Kerberos 認証を組み合わせて PAC を取得します。この巧妙なアプローチにより、ターゲットユーザー自身の資格情報を使わずに、認証済みユーザーが代理で PAC を要求できるようになっています。

2. PAC (Privilege Attribute Certificate) とは何か?📜

PAC は、Kerberos チケット(特に Ticket Granting Ticket (TGT) や Service Ticket (TGS))に含まれる拡張データ構造です。Microsoft の Active Directory 環境における Kerberos 実装で利用され、ユーザーの認証情報だけでなく、認可情報を運ぶ役割を担います。

ユーザーがドメインコントローラー (KDC) に対して認証を行うと、KDC はそのユーザーの PAC を生成し、発行する TGT に含めます。ユーザーが特定のサービスへのアクセスを要求すると、TGS にも PAC が含まれ、サービス側はこの PAC を検証することで、ユーザーの権限(どのグループに所属しているかなど)を確認し、アクセス制御の判断を行います。これにより、サービスはアクセス要求ごとにドメインコントローラーに問い合わせる必要がなくなり、効率的な認可プロセスが実現されます。

PAC には以下のような重要な情報が含まれています:

  • ユーザー情報 (KERB_VALIDATION_INFO):
    • ユーザーのSID (Security Identifier)
    • 所属するグループのSIDリスト (プライマリグループSID含む)
    • SID履歴
    • ユーザーアカウント制御フラグ (UAC)
    • ログオンサーバー、ログオンドメイン名
    • パスワード最終設定日時、ログオン日時などのタイムスタンプ
  • クライアント情報 (PAC_CLIENT_INFO):
    • クライアント名
    • 認証時刻
  • UPN/DNS情報 (PAC_UPN_DNS_INFO):
    • ユーザープリンシパル名 (UPN)
    • ユーザーのDNSドメイン名
  • 署名データ (PAC_SIGNATURE_DATA):
    • KDCのサービスキー (krbtgtアカウントのキー) で署名されたサーバーチェックサム
    • サービスキーで署名された特権サーバーチェックサム
    • これらの署名は、PAC が改ざんされていないことを保証するために使用されます。

これらの情報は、ユーザーのアクセス権限を決定する上で極めて重要であり、攻撃者にとっては権限昇格やラテラルムーブメント(横方向への侵害拡大)のための貴重な情報源となります。

⚠️ 注意: PAC の構造や検証メカニズムには、過去に脆弱性が発見されています。例えば、2014年に公開された CVE-2014-6324 (MS14-068) は、PAC の検証不備を突いて権限昇格を可能にするものでした。虽然 getPac.py 自体は脆弱性を悪用するツールではありませんが、取得した PAC 情報は、他の攻撃手法と組み合わせる際に役立つ可能性があります。

3. getPac.py の使い方 💻

getPac.py を使用するには、まず Impacket がインストールされている必要があります。通常、Kali Linux などのペネトレーションテスト用ディストリビューションにはプリインストールされていますが、そうでない場合は Python のパッケージマネージャ (pip) を使ってインストールできます。

pip install impacket

または、GitHub リポジトリから直接インストールすることも可能です。

git clone https://github.com/fortra/impacket.git
cd impacket/
python setup.py install

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

impacket-getPac <認証に使用する資格情報> -targetUser <PACを取得したいユーザー名> [オプション]

または、Impacket の examples ディレクトリから直接実行する場合:

python getPac.py <認証に使用する資格情報> -targetUser <PACを取得したいユーザー名> [オプション]
引数/オプション 説明
credentials (必須) PAC取得処理を実行するために使用する認証情報。形式は <ドメイン名>/<ユーザー名>[:<パスワード>]。パスワードを省略すると、対話的に入力を求められます。
-targetUser <ユーザー名> (必須) PAC情報を取得したいターゲットユーザーのアカウント名。
-hashes <LMハッシュ>:<NTハッシュ> パスワードの代わりに NTLM ハッシュを使用して認証します。LM ハッシュは通常空(またはダミー値)で、NT ハッシュを指定します。例: -hashes :aabbccddeeff00112233445566778899
-aesKey <16進数キー> AES キー (128ビットまたは256ビット) を使用して Kerberos 認証を行います。
-k Kerberos 認証を使用します。事前に kinit などで有効な TGT を取得しておく必要があります。キャッシュされたチケット (ccache) が使用されます。このオプションを使用する場合、credentials 引数にはユーザー名のみ (<ドメイン名>/<ユーザー名>) を指定し、パスワードやハッシュは不要です。
-no-pass パスワードやハッシュを指定せずに認証を試みます (-k と併用)。
-dc-ip <IPアドレス> 接続先のドメインコントローラーの IP アドレスを明示的に指定します。指定しない場合、ドメイン名から DNS 経由で解決されます。
-target-ip <IPアドレス> ターゲットホストの IP アドレスを指定します (通常は DC と同じ)。getPac.py ではあまり使用されませんが、他の Impacket スクリプトとの一貫性のために存在します。
-debug デバッグ情報を出力します。プロトコルの詳細なやり取りを確認したい場合に役立ちます。

例1: パスワード認証でターゲットユーザー ‘victim’ の PAC を取得

impacket-getPac MYDOMAIN.LOCAL/attacker_user:AttackerP@ssw0rd -targetUser victim -dc-ip 192.168.1.100

例2: NTLM ハッシュ認証でターゲットユーザー ‘admin_user’ の PAC を取得 (パスワード入力プロンプトを使用)

impacket-getPac MYDOMAIN.LOCAL/attacker_user -targetUser admin_user -hashes :aabbccddeeff00112233445566778899 -dc-ip dc01.mydomain.local

例3: Kerberos チケット認証 (ccache) でターゲットユーザー ‘service_account’ の PAC を取得

# 事前に kinit で attacker_user の TGT を取得
kinit attacker_user@MYDOMAIN.LOCAL

# getPac.py を実行
impacket-getPac MYDOMAIN.LOCAL/attacker_user -targetUser service_account -k -no-pass -dc-ip 192.168.1.100

getPac.py の実行に成功すると、ターゲットユーザーの PAC に含まれる情報が整形されて表示されます。主な出力内容は以下の通りです。

  • PAC for user: ターゲットユーザー名
  • Credentials used: 認証に使用したユーザー名
  • Impersonating: ターゲットユーザー名 (PAC が誰のものかを示す)
  • PAC_CLIENT_INFO: クライアント名と認証時刻
  • KERB_VALIDATION_INFO:
    • LogonTime, LogoffTime, KickoffTime: 各種タイムスタンプ
    • PasswordLastSet, PasswordCanChange, PasswordMustChange: パスワード関連のタイムスタンプ
    • EffectiveName, FullName, LogonScript, ProfilePath, HomeDirectory, HomeDirectoryDrive: ユーザープロファイル関連情報
    • LogonCount, BadPasswordCount: ログオン試行回数
    • UserId, PrimaryGroupId: ユーザーとプライマリグループの RID (Relative ID)
    • GroupIds: 所属する全てのグループの RID リスト
    • UserFlags, UserSessionKey: フラグとセッションキー
    • LogonServer, LogonDomainName, LogonDomainId: ログオン関連情報
    • UserAccountControl: アカウント制御フラグ (16進数とフラグ名の両方)
    • SidHistory: SID 履歴 (存在する場合)
    • ResourceGroupDomainSid, ResourceGroupIds: リソースグループ情報 (存在する場合)
  • PAC_UPN_DNS_INFO: UPN と DNS ドメイン名
  • PAC_SIGNATURE_DATA (Server): サーバーチェックサム署名
  • PAC_SIGNATURE_DATA (PrivSvr): 特権サーバーチェックサム署名

これらの情報を分析することで、ターゲットユーザーがどのような権限を持っているか(特にどのグループに所属しているか)、アカウントの状態(ロックアウトされているか、パスワード期限など)、その他の関連情報を詳細に把握できます。

💡ヒント

出力されるグループ ID (RID) は相対識別子です。これらの RID がどのグループ名に対応するかを知るには、lookupsid.py などの他の Impacket スクリプトや Active Directory の管理ツールを使用して、ドメインの既知の SID やグループ情報を参照する必要があります。例えば、RID 512 は通常 “Domain Admins” グループに対応します。

4. セキュリティ上の意味合いと悪用シナリオ 😈

getPac.py は、それ自体が直接的な攻撃(例: コード実行やデータ窃取)を行うツールではありません。しかし、攻撃の偵察 (Reconnaissance) フェーズにおいて非常に強力な武器となり得ます。取得した PAC 情報は、以下のような攻撃シナリオにつながる可能性があります。

  • 権限昇格パスの特定: 侵害した低権限ユーザーから、管理者アカウントや特権グループのメンバーアカウントの PAC を取得することで、それらのアカウントが持つ権限を把握できます。これにより、どのグループをターゲットにすればドメイン管理者権限などを奪取できるかの戦略を立てやすくなります。
  • ラテラルムーブメントの計画: 特定のサービスアカウントやユーザーアカウントがアクセス可能なリソース(サーバー、共有フォルダなど)は、そのアカウントのグループメンバーシップに依存します。PAC 情報を分析することで、侵害したアカウントを踏み台にして、次にどのシステムやアカウントを狙うべきかの計画を立てるのに役立ちます。
  • ターゲットの選定: ドメイン内の複数のユーザーの PAC を収集・比較することで、より権限が高く、かつパスワードが弱い、あるいはアカウント管理が不十分である可能性のあるターゲットアカウントを特定しやすくなります。例えば、PasswordLastSet のタイムスタンプが非常に古いアカウントは、パスワードが変更されていない可能性があり、ブルートフォース攻撃やパスワードスプレー攻撃のターゲットとして魅力的かもしれません。
  • 他の攻撃ツールとの連携: 取得した PAC 情報(特にグループメンバーシップや SID)は、Golden Ticket や Silver Ticket 攻撃 (ticketer.py を使用)、あるいは特定の権限を悪用する他の攻撃(例: DCSync)を行う際に、偽造するチケットの内容をより本物らしく見せかけるために利用される可能性があります。例えば、Silver Ticket を作成する際には、ターゲットサービスの PAC 構造を模倣することで、検知を回避しやすくなるかもしれません。

getPac.py は、通常のユーザー権限で他のユーザーの重要な認可情報を取得できてしまうため、Active Directory 環境における内部偵察活動の初期段階で頻繁に使用される可能性があります。

5. 検出と対策🛡️

getPac.py のようなツールによる PAC 情報の不正な取得を完全に防ぐことは難しいですが、検出の可能性を高め、リスクを軽減するための対策は存在します。

  • Kerberos イベントログの監視: ドメインコントローラー上の Kerberos 関連のイベントログ (特にイベント ID 4768 (TGT要求) や 4769 (TGS要求)) を監視します。getPac.py は S4USelf と U2U を利用するため、通常とは異なるパターン(例: あるユーザーが短時間で多数の他のユーザーの PAC を要求する、特定の低権限ユーザーから高権限ユーザーへの TGS 要求が頻発する)が見られる可能性があります。
  • ネットワークトラフィック分析: Kerberos の AS-REQ, AS-REP, TGS-REQ, TGS-REP パケットを監視し、特に PA-FOR-USER (S4USelf) や PA-PAC-REQUEST、チケット内の PAC 構造に異常がないか分析します。
  • エンドポイント検出応答 (EDR): getPac.py (または Impacket スクリプト群) の実行自体を検知する EDR ソリューションを導入します。Python プロセスの引数やネットワーク接続パターンから不審な挙動を検知できる場合があります。
  • 異常な認証パターンの検出 (UEBA): User and Entity Behavior Analytics (UEBA) ソリューションは、ユーザーの通常の認証パターンからの逸脱を検知するのに役立ちます。あるユーザーが普段アクセスしないユーザーの情報を頻繁に照会するような挙動は、不審な活動としてフラグ付けされる可能性があります。
  • 最小権限の原則の徹底: ユーザーやサービスアカウントには、業務遂行に必要な最小限の権限のみを付与します。これにより、仮にアカウントが侵害されたとしても、取得される情報や悪用される権限を限定できます。
  • 強力なパスワードポリシーと認証:推測されにくい複雑なパスワードの使用を強制し、多要素認証 (MFA) を可能な限り導入します。これにより、最初の認証情報の侵害を防ぎます。
  • 特権アカウントの厳格な管理: Domain Admins などの特権グループのメンバーシップを最小限に保ち、これらのアカウントの使用を厳しく監視・制限します。特権アクセス管理 (PAM) ソリューションの導入も有効です。
  • 定期的なセキュリティ監査: Active Directory の設定、グループメンバーシップ、アカウントの状態などを定期的に監査し、不要なアカウントや過剰な権限がないか確認します。
  • PAC 検証の強化 (限定的): Windows は PAC 検証機能を提供していますが、Golden Ticket や Silver Ticket 攻撃の完全な防御にはならないことが知られています。しかし、設定を有効にしておくことは一定の防御層にはなり得ます。
  • セキュリティ意識向上トレーニング: 従業員に対して、フィッシング詐欺やソーシャルエンジニアリングのリスクについて教育し、不審なアクティビティを報告するよう奨励します。

これらの対策を組み合わせることで、getPac.py のような偵察ツールによる情報収集のリスクを低減し、攻撃者が次のステップに進むのを困難にすることができます。💪

6. まとめ ✨

Impacket スイートの getPac.py は、Active Directory 環境において、通常のユーザー権限で他のユーザーの PAC (Privilege Attribute Certificate) 情報を取得できる強力な偵察ツールです。PAC にはユーザーの SID、グループメンバーシップ、アカウント制御フラグなどの重要な認可情報が含まれており、攻撃者はこれを利用して権限昇格のパスを探ったり、ラテラルムーブメントを計画したりします。

このツールの存在は、Active Directory のセキュリティを維持する上で、以下の点を強調しています。

  1. 認証情報管理の重要性: たとえ低権限のアカウントであっても、その認証情報が漏洩すると、ドメイン全体の構造や権限に関する情報が露呈するリスクがあります。
  2. 最小権限の原則の価値: 不要な権限を与えないことで、侵害時の影響範囲を限定できます。
  3. 継続的な監視と監査の必要性: 不審な認証パターンや特権情報の照会を早期に検知することが、攻撃の連鎖を断ち切る鍵となります。

getPac.py のようなツールは、防御側にとっても、自組織の Active Directory 環境における情報露出のリスクを評価し、対策を強化するためのテストツールとして活用できます。Impacket とそのスクリプト群を理解し、適切な防御策を講じることで、より堅牢な Active Directory 環境を構築しましょう。🛡️🔐

コメント

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