ForgeCertは、BouncyCastle C# APIと、侵害した認証局(CA)の証明書と秘密鍵を使用して、Active Directoryに対して認証可能な任意のユーザーの証明書を偽造します。
この攻撃は、私たちの「Certified Pre-Owned」ホワイトペーパーにおいてDPERSIST1として体系化されています。このコードベースは、ホワイトペーパー公開から約45日後にリリースされました。
@tifkin_はForgeCertの主な作者です。
@tifkin_と@harmj0yは、関連するActive Directory証明書サービスの研究(ブログおよびホワイトペーパー)の主な作者です。
私たちのホワイトペーパーの「背景」および「盗まれたCA証明書による証明書の偽造 - DPERSIST1」セクションで説明されているように、認証局のCA証明書の秘密鍵は、CAサーバ上でDPAPIまたはハードウェア(HSM/TPM)のいずれかによって保護されています。さらに、証明書(秘密鍵を除く)はNTAuthCertificatesフォレストオブジェクトに公開され、これによりADへの認証を可能にするCA証明書が定義されます。まとめると、証明書がNTAuthCertificatesに存在するCAは、その秘密鍵を使用して、要求元クライアントからの証明書署名要求(CSR)に署名します。この図はそのプロセスを要約しています:

CAの秘密鍵の安全性は最も重要です。前述のとおり、秘密鍵がTPMやHSMなどのハードウェアソリューションで保護されていない場合、その鍵はData Protection API(DPAPI)で暗号化されてCAサーバのディスク上に保存されます。攻撃者がCAサーバを侵害できた場合、@gentilkiwiのMimikatzまたはGhostPackのSharpDPAPIプロジェクトを使用して、ハードウェアで保護されていないCA証明書の秘密鍵を抽出できます。ホワイトペーパーのTHEFT3では、マシン証明書に対するこのプロセスが説明されています。
発行された証明書の署名に使用される唯一の鍵素材はCAの秘密鍵であるため、攻撃者がそのような鍵(NTAuthCertificates内の証明書のもの)を盗んだ場合、ドメイン認証が可能な証明書を偽造できます。これらの偽造証明書は、ドメイン内の任意のプリンシパルに対して作成できます(ただし、認証が可能であるためにはアカウントが「アクティブ」である必要があるため、krbtgtのようなアカウントは機能しません)。また、証明書はCA証明書が有効である限り有効です(デフォルトでは通常5年ですが、それより長く設定することもできます)。
さらに、これらの証明書は通常の発行プロセスの成果物ではないため、CAはそれらが作成されたことを認識しません。したがって、これらの証明書は失効できません。
注: NTAuthCertificates内の任意のCA証明書(ルートCAまたは下位CA)の秘密鍵を使用して、フォレスト内での認証が可能な証明書を偽造できます。証明書/鍵が下位CAからのものである場合、証明書チェーンを検証するための正当なCRLを提供する必要があります。
ForgeCertは、BouncyCastleのX509V3CertificateGeneratorを使用して偽造を実行します。
C:\Temp>ForgeCert.exe
ForgeCert 1.0.0.0
Copyright c 2021
ERROR(S):
Required option 'CaCertPath' is missing.
Required option 'SubjectAltName' is missing.
Required option 'NewCertPath' is missing.
Required option 'NewCertPassword' is missing.
--CaCertPath 必須。CA秘密鍵を.pfxまたは.p12ファイルとして指定
--CaCertPassword CA秘密鍵ファイルのパスワード
--Subject (デフォルト: CN=User) 証明書のサブジェクト名
--SubjectAltName 必須。認証するユーザーのUPN
--NewCertPath 必須。新しい.pfx証明書の保存先パス
--NewCertPassword 必須。.pfxファイルのパスワード
--CRL 偽造証明書用のCRLのLDAPパス
--help このヘルプ画面を表示します。
--version バージョン情報を表示します。
注: CA秘密鍵の窃取と認証証明書の偽造に関する完全なチュートリアルについては、ホワイトペーパーのDPERSIST1を参照してください。
コンテキスト:
ca.pfxで、パスワードPassword123!で暗号化されています。[email protected]です。localadmin.pfxとして保存され、パスワードNewPassword123!で暗号化されます。C:\Tools\ForgeCert>ForgeCert.exe --CaCertPath ca.pfx --CaCertPassword "Password123!" --Subject "CN=User" --SubjectAltName "[email protected]" --NewCertPath localadmin.pfx --NewCertPassword "NewPassword123!"
CA Certificate Information:
Subject: CN=theshire-DC-CA, DC=theshire, DC=local
Issuer: CN=theshire-DC-CA, DC=theshire, DC=local
Start Date: 1/4/2021 10:48:02 AM
End Date: 1/4/2026 10:58:02 AM
Thumbprint: 187D81530E1ADBB6B8B9B961EAADC1F597E6D6A2
Serial: 14BFC25F2B6EEDA94404D5A5B0F33E21
Forged Certificate Information:
Subject: CN=User
SubjectAltName: [email protected]
Issuer: CN=theshire-DC-CA, DC=theshire, DC=local
Start Date: 7/26/2021 3:38:45 PM
End Date: 7/26/2022 3:38:45 PM
Thumbprint: C5789A24E91A40819EFF7CFD77150595F8B9878D
Serial: 3627A48F90F6869C3215FF05BC3B2E42
Done. Saved forged certificate to localadmin.pfx with the password 'NewPassword123!'
この偽造は攻撃者が制御するシステム上で実行でき、結果として得られる証明書はRubeusと一緒に使用してTGTを要求したり(ユーザーのNTLMを取得したりもできます)。
現在のForgeCertコードベースのTypeRefHashはb26b451ff2c947ae5904f962e56facbb45269995fbb813070386472f307cfcf0です。
ForgeCertのTypeLib GUIDはbd346689-8ee6-40b3-858b-4ed94f08d40aです。これは、このリポジトリに現在含まれているYaraルールに反映されています。
予防と検出のガイダンスについては、私たちのホワイトペーパーのPREVENT1、DETECT3、DETECT5を参照してください。
Fabian Baderは、Microsoft OCSPの調整による「ゴールデン証明書」の多くの使用法を軽減する方法についての優れた記事を公開しています。ただし、最終的な考察セクションで、彼は「この方法は決して完全ではありません。攻撃者は証明書作成プロセスを制御しているため、シリアル番号を有効なものに変更するだけで回避できます。」と述べていることに注意してください。これは彼のPRで実装されましたが、デフォルトではシリアル番号はランダム化されるため、OSCPによる防止は多くの場合に機能し、実装する価値があると私たちは考えています。
このプロジェクトが生成する種類の偽造証明書に対するYara/その他の検出ルールを構築する機会があると考えています。防御研究者の方で、これらのファイルにシグネチャを付ける良い方法を見つけた方がいらっしゃいましたら、ぜひお知らせください。それに応じて、ここでのYaraルールや防御ガイダンスを更新します。
「ゴールデンチケット」(偽造TGT)とこれらの「ゴールデン証明書」(偽造AD CS証明書)との間には明らかな類似点があります。krbtgtハッシュとCA秘密鍵はどちらもActive Directory環境のセキュリティにとって重要な暗号素材であり、どちらも任意のユーザーの認証情報を偽造するために使用できます。しかし、krbtgtハッシュはDCSyncを介してリモートで取得できるのに対し、CA秘密鍵は(少なくとも現在の知識では)CAマシン自体でのコード実行を通じてのみ回復する必要があります。krbtgtハッシュは比較的簡単にローテーションできますが、CA秘密鍵のローテーションははるかに困難です。
公開開示に関して、私たちはホワイトペーパーの公開から約45日間、攻撃ツール(ForgeCertおよびCertify)のリリースを自己差し控えました。これは、組織がActive Directory証明書サービスに関する問題に対処する機会を得るためです。しかし、組織やベンダーは、誰かが概念実証で何かが可能であることを証明するまでは、理論上の攻撃に対する問題を修正したり検出を構築したりしないことが多いと私たちは感じています。
これは、研究に対する一部の人々の反応に反映されています。「これはバカげている、CAの秘密鍵があれば証明書を偽造できるのは当然だ」と。これに対して私たちは、そう、多くのことは可能だが、「PoC||GTFO(概念実証か、さもなくば退場)」だと述べています。