Impacket goldenPac スクリプト徹底解説

Active Directory環境における強力なツール

はじめに: goldenPac とは何か?

impacket-goldenPac (または単に goldenPac.py) は、有名なセキュリティツールキットである Impacket に含まれる Python スクリプトの一つです。このスクリプトは、主に Active Directory 環境におけるペネトレーションテストやセキュリティ評価で使用されます。

goldenPac の主な機能は、MS14-068 (CVE-2014-6324) という脆弱性を悪用することです。この脆弱性は、Kerberos Key Distribution Center (KDC) における Privilege Attribute Certificate (PAC) の署名検証の不備を利用するもので、2014年に発見・修正されました。脆弱性が存在するドメインコントローラーに対しては、攻撃者はドメイン管理者などの高い権限を持つ Kerberos チケット (TGT: Ticket Granting Ticket) を偽造することが可能です。

注意: MS14-068 は古い脆弱性であり、現代の適切にパッチが適用された Windows Server 環境では通常は利用できません。しかし、パッチ未適用の古いシステムが残存している場合や、特定の状況下では依然として脅威となる可能性があります。このツールの使用は、必ず許可された環境でのみ 行ってください。

goldenPac は、この脆弱性を利用して偽造した TGT (俗に言うゴールデンチケットの一種、ただし KRBTGT ハッシュは不要) を生成し、さらにそのチケットを利用してターゲットマシンに対して psexec のようなリモートコマンド実行機能を提供します。これにより、脆弱なドメインコントローラーが存在する場合、一般ユーザーの認証情報だけでドメイン内の任意のコンピュータへのアクセス権を取得できる可能性があります。

背景知識: ゴールデンチケットと MS14-068

ゴールデンチケット (Golden Ticket)

ゴールデンチケット攻撃は、Active Directory 環境における非常に強力な持続化(Persistence)および権限昇格の手法です。この攻撃では、攻撃者はドメインの「マスターキー」とも言える krbtgt アカウントのパスワードハッシュ(NTLM ハッシュまたは AES キー)を窃取します。

krbtgt アカウントは、ドメイン内のすべての Kerberos TGT (Ticket Granting Ticket) の署名と暗号化に使用されます。このアカウントのハッシュを知っていれば、攻撃者は任意のユーザー(存在しないユーザーも含む場合がある)になりすまし、任意の有効期間と任意のグループメンバーシップ(通常は Domain Admins などの最高権限グループ)を持つ TGT をオフラインで自由に偽造できます。

この偽造された TGT が「ゴールデンチケット」と呼ばれます。これを使用すると、ドメインコントローラーを含むドメイン内のほぼすべてのリソースにアクセスできるようになります。ゴールデンチケット攻撃は、Mimikatz というツールによって 2011年頃に広く知られるようになりました。

ゴールデンチケット攻撃(T1558.001)は、MITRE ATT&CK フレームワークにおいて、「Credential Access(認証情報アクセス)」および「Persistence(永続化)」の戦術に分類されています。

MS14-068 (CVE-2014-6324)

MS14-068 は、2014年11月にマイクロソフトが修正した Kerberos の脆弱性です。具体的には、KDC が PAC (Privilege Attribute Certificate) の署名を検証する方法に欠陥がありました。PAC は、ユーザーの SID、所属グループ、権限などの情報を含むデータ構造で、Kerberos チケット内に埋め込まれます。

通常、PAC は KDC (krbtgt アカウントのキー) によって署名され、改ざんを防いでいます。しかし、MS14-068 の脆弱性により、特定の条件下で KDC が PAC の署名を適切に検証しないことが判明しました。攻撃者は、この欠陥を利用して、自分自身が Domain Admins などの特権グループに所属しているかのように見せかける改ざんされた PAC を作成し、それを正規の TGT 要求プロセスに含めることができました。

具体的には、攻撃者はまず PAC を含まない TGT を要求し(PA-PAC-REQUEST フラグを false に設定)、次に MD5 のようなキーを使用しないハッシュアルゴリズムで「署名」した偽の PAC を作成します。この偽の PAC を TGS-REQ メッセージ(KRBTGT サービスをターゲットとする)に含めて送信すると、脆弱な KDC はこれを有効なものとして受け入れ、偽の PAC を含む新しい TGT を発行してしまいます。

この攻撃の重要な点は、krbtgt アカウントのハッシュを知る必要がないことです。必要なのは、ドメイン内の任意の有効なユーザーアカウント(ユーザー名とパスワード、またはハッシュ)だけです。これにより、一般ユーザーからドメイン管理者相当の権限を持つ TGT を取得することが可能になります。

goldenPac.py は、まさにこの MS14-068 脆弱性を利用して TGT を偽造し、その後のリモート実行までを自動化するツールです。

ポイント: ゴールデンチケット攻撃は krbtgt ハッシュが必要ですが、MS14-068 を利用する goldenPac は一般ユーザーの認証情報のみで(脆弱な DC があれば)特権 TGT を生成できます。

goldenPac の仕組み

goldenPac.py は、以下のステップで動作します。

  1. ユーザー認証情報の取得: コマンドライン引数から、ドメインユーザーのユーザー名、パスワード(または NTLM ハッシュ)、ターゲットとなるドメイン、およびターゲットとなるコンピューター名(FQDN)を受け取ります。
  2. ドメインコントローラー (DC) の特定: 指定されたドメイン名または -dc-ip オプションに基づき、KDC サービスを実行しているドメインコントローラーを特定します。
  3. PAC なし TGT の要求: 特定した DC に対し、PA-PAC-REQUEST フラグを false に設定して AS-REQ を送信し、PAC を含まない TGT を取得します。
  4. 偽造 PAC の作成: ユーザーが Domain Admins (SID: S-1-5-domain-512) などの特権グループに所属していることを示す PAC をローカルで作成します。この PAC は MD5 などの弱いアルゴリズムで「署名」されます。デフォルトでは、グループ ID 513 (Domain Users), 512 (Domain Admins), 520 (Group Policy Creator Owners), 518 (Schema Admins), 519 (Enterprise Admins) が含まれることが多いです。
  5. TGS 要求 (TGT 取得): ステップ 3 で取得した PAC なし TGT と、ステップ 4 で作成した偽造 PAC を使用して、KRBTGT サービスに対する TGS-REQ を送信します。脆弱な KDC は偽造 PAC を検証せずに受け入れ、偽造 PAC が埋め込まれた新しい TGT (実質的な特権 TGT) を発行します。
  6. Kerberos チケットのキャッシュ: 取得した特権 TGT を Kerberos クレデンシャルキャッシュ (ccache) ファイルに保存します (-w オプション指定時など)。
  7. ターゲットへの接続とコマンド実行:
    • 取得した特権 TGT を使用して、ターゲットコンピューター (-target または -target-ip で指定) の CIFS/SMB サービスに対するサービスチケット (TGS) を要求します。
    • このサービスチケットを使用して、ターゲットコンピューターに SMB 接続を確立します。
    • Impacket の psexec モジュールと同様の技術を使用し、ターゲットコンピューター上でリモートからコマンドを実行します。通常、サービスを作成・起動し、名前付きパイプ経由で対話的なシェル (cmd.exe) を提供するか、指定されたコマンドを実行します。

この一連の流れにより、MS14-068 脆弱性が存在する環境であれば、一般ユーザー権限からターゲットコンピューターの SYSTEM 権限でのコマンド実行が可能になります。

goldenPac の使い方

goldenPac.py は Impacket の examples ディレクトリに含まれています。基本的な使用法は以下の通りです。

python goldenPac.py [オプション] ドメイン/ユーザー名[:パスワード]@ターゲットFQDN [実行コマンド]

主要な引数とオプション

引数/オプション 説明
ドメイン/ユーザー名[:パスワード]@ターゲットFQDN 必須の接続情報。
ドメイン: ターゲットドメインの FQDN (例: contoso.local)。
ユーザー名: ドメイン内の有効なユーザーアカウント。
パスワード: ユーザーのパスワード。省略するとプロンプトが表示されます。
ターゲットFQDN: コマンドを実行したいターゲットコンピューターの FQDN (例: dc01.contoso.localfileserver.contoso.local)。ターゲットも FQDN である必要があります。
実行コマンド ターゲットコンピューターで実行したいコマンド (例: whoami)。省略した場合、対話的な cmd.exe シェルが起動します。None を指定すると、コマンドを実行せずに TGT を -w オプションで指定したファイルに保存します。
-hashes LMHASH:NTHASH パスワードの代わりに NTLM ハッシュを使用します (Pass-the-Hash)。LM ハッシュは通常不要なので、:NTHASH の形式で指定します (例: :aabbccddeeff00112233445566778899)。
-aesKey HEXKEY Kerberos 認証に AES キーを使用します (AES128 または AES256)。krbtgt の AES キーではなく、指定したユーザーアカウントの AES キーです。
-k Kerberos 認証を使用します。既存の ccache ファイル (環境変数 KRB5CCNAME で指定) から認証情報を取得しようとします。-no-pass と併用することが多いです。
-no-pass パスワードの入力を求めません。-hashes-k と一緒に使用します。
-dc-ip IPアドレス ドメインコントローラーの IP アドレスを直接指定します。ドメイン名の FQDN が DNS で解決できない場合に便利です。
-target-ip IPアドレス ターゲットコンピューターの IP アドレスを直接指定します。ターゲットの FQDN が DNS で解決できない場合に便利です。
-w ファイルパス 取得したゴールデンチケット (TGT) を指定したファイルパスに ccache 形式で保存します。後で他の Kerberos ツール (wmiexec.py, smbexec.py など) で利用できます。
-c アップロードファイル 指定したファイルをターゲットにアップロードし、実行コマンド 引数で指定された引数と共に実行します。
-ts 出力の各行にタイムスタンプを追加します。
-debug デバッグ情報を詳細に出力します。問題解決に役立ちます。

実行例

例1: パスワード認証で対話シェルを取得

python goldenPac.py contoso.local/testuser@dc01.contoso.local

(パスワードの入力を求められます)

例2: パスワードを直接指定して whoami を実行

python goldenPac.py contoso.local/testuser:Password123@fileserver.contoso.local whoami

例3: NTLM ハッシュを使用し、DC とターゲットの IP を指定

python goldenPac.py contoso.local/testuser@TARGET_FQDN \
-hashes :aabbccddeeff00112233445566778899 \
-dc-ip 192.168.1.10 \
-target-ip 192.168.1.20

(TARGET_FQDN はターゲットマシンの実際の FQDN に置き換えてください)

例4: チケットをファイルに保存し、コマンドは実行しない

python goldenPac.py contoso.local/testuser:Password123@dc01.contoso.local \
-w /tmp/golden.ccache \
None

後でこのチケットを使用する場合:

export KRB5CCNAME=/tmp/golden.ccache
python psexec.py -k -no-pass contoso.local/Administrator@dc01.contoso.local

(goldenPac で生成したチケットは通常、偽造 PAC により高い権限を持っているため、Administrator など任意のユーザーとして振る舞えます)

注意点と前提条件

  • 脆弱性の存在: ターゲットドメインのドメインコントローラーが MS14-068 に対して脆弱である必要があります。パッチ済みの環境では動作しません。
  • FQDN の使用: ドメイン名とターゲットホスト名は FQDN (Fully Qualified Domain Name) で指定する必要があります。DNS が正しく設定されていない場合は、/etc/hosts ファイルに追記するか、-dc-ip および -target-ip オプションを使用します。
  • 時刻同期: Kerberos 認証は時刻に敏感です。攻撃者のマシンとドメインコントローラーの時刻が大きくずれていると認証に失敗する可能性があります (通常は 5 分以内)。
  • ユーザーアカウント: 攻撃に使用するユーザーアカウントは、ドメイン内に実在し、有効である必要があります。(2021年11月の Windows Update 以降、存在しないユーザーでのチケット要求は通常拒否されます)。
  • ネットワークアクセス: 攻撃者のマシンからドメインコントローラー (Kerberos ポート 88/TCP, 88/UDP) およびターゲットマシン (SMB ポート 445/TCP) へのネットワークアクセスが必要です。

検出と対策

goldenPac やその基盤となる MS14-068 攻撃、およびゴールデンチケット攻撃に対する検出と対策は重要です。

検出方法

  • パッチ管理の確認: まず、ドメインコントローラーに MS14-068 (KB3011780) のセキュリティ更新プログラムが適用されているかを確認することが最も基本的な対策です。
  • Kerberos イベントログの監視:
    • ドメインコントローラーのセキュリティイベントログで、イベント ID 4768 (TGT 要求) と 4769 (TGS 要求) を監視します。MS14-068 攻撃では、PAC のない TGT 要求 (AS-REQ 内の PA-PAC-REQUEST が false) が特徴的な場合があります。
    • 偽造された PAC を含む TGS 要求に関連する異常なログパターンを探します。異常に権限の高いグループ (Domain Admins など) を持つチケットが、通常そのような権限を持たないユーザーによって要求された場合、不審な兆候です。
    • チケットの有効期間が異常に長い (ゴールデンチケットの場合)、または暗号化タイプが通常と異なる場合も注意が必要です。
  • ネットワークトラフィックの分析: Kerberos トラフィック (ポート 88) を監視し、異常なリクエストパターンや既知の攻撃ツール (Mimikatz, Impacket) のシグネチャを検出します。
  • エンドポイントでの検出 (EDR):
    • goldenPac が使用する psexec のようなリモート実行手法は、ターゲットマシン上で不審なプロセス生成 (cmd.exe の子プロセスとしての実行) やサービス作成 (例: イベント ID 7045) を引き起こす可能性があります。
    • Impacket スクリプトの実行自体 (Python プロセスからの異常なネットワーク接続など) を検出できる場合もあります。
  • ユーザー行動分析 (UEBA): 通常の活動パターンから逸脱したユーザーの認証試行やリソースアクセスを検出します。例えば、一般ユーザーが突然ドメインコントローラーへの管理者アクセスを試みるなど。

対策方法

  • パッチ適用: 最も重要です。 ドメインコントローラーおよびすべての Windows システムに最新のセキュリティパッチを適用し、MS14-068 などの既知の脆弱性を修正します。
  • KRBTGT アカウントの保護:
    • krbtgt アカウントのパスワードを定期的 (例: 180日ごと) に、かつ複雑なものに変更します。
    • 重要: パスワードは 2回 変更する必要があります。1回目の変更後、古いハッシュで署名されたチケットがまだ有効な期間が存在するため、2回目の変更で完全に無効化します。
    • krbtgt アカウントへのアクセスを厳しく制限し、監視します。
  • 特権アクセス管理 (PAM):
    • Domain Admins などの特権グループのメンバーシップを最小限に抑えます。
    • Just-In-Time (JIT) アクセスや、特権アカウントのパスワードを管理・保護するソリューション (例: LAPS, CyberArk, Thycotic) を導入します。
    • 管理作業には専用の管理ワークステーション (PAW: Privileged Access Workstation) を使用し、通常の業務用アカウントとは分離します。
  • 多要素認証 (MFA): 特に特権アカウントやリモートアクセスに対して MFA を導入することで、認証情報が漏洩した場合のリスクを低減します。
  • セキュリティ監視の強化: SIEM や EDR ソリューションを活用し、上記「検出方法」で挙げたような不審なアクティビティをリアルタイムで検知し、対応できる体制を構築します。
  • Active Directory の階層化 (Tiering Model): Active Directory を管理層 (Tier 0, 1, 2) に分割し、上位層 (特に Tier 0 のドメインコントローラーや特権アカウント) へのアクセスを下位層から厳しく制限します。
まとめ: パッチ適用、KRBTGT アカウントの定期的なパスワード変更 (2回!)、特権アクセスの最小化、そして強力な監視体制が、これらの攻撃に対する防御の鍵となります。

倫理的な考慮事項と結論

impacket-goldenPac は、特定の脆弱性を悪用し、Active Directory 環境内で強力なアクセス権を獲得できるツールです。ペネトレーションテスターやセキュリティ研究者にとっては、システムの弱点を特定し、防御策を評価するための有効な手段となり得ます。

しかし、その能力の高さゆえに、悪意のある攻撃者によって悪用されるリスクも非常に高いツールです。このツールを使用する際は、以下の点を強く意識する必要があります。

  • 許可の取得: 必ず、テスト対象となるシステムの所有者から書面による明確な許可を得てください。無許可での使用は違法行為であり、深刻な結果を招く可能性があります。
  • 目的の明確化: テストの目的と範囲を明確に定義し、必要最小限の操作に留めてください。
  • 影響の理解: ツールの実行がシステムやネットワークに与える潜在的な影響を理解し、予期せぬ問題が発生した場合の対応計画を準備しておいてください。

結論として、impacket-goldenPac は MS14-068 脆弱性が存在する環境において、権限昇格と横展開を実証するためのツールです。現代の環境ではこの脆弱性自体は稀ですが、Active Directory セキュリティの複雑さと、古い脆弱性であっても放置することのリスクを理解する上で、その仕組みを知ることは依然として価値があります。常に倫理的なガイドラインに従い、責任ある方法で使用することが不可欠です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です