脅威の連鎖を断ち切ろう:証明書サービスの悪用を防ぐ

Security Splunk Threat Research Team

近年、デジタル証明書を悪用するいくつかのサイバー攻撃が世界的に注目を集めました。デジタル証明書は、個人、組織、デバイスなどのエンティティの身元を確認するための電子的な証明書で、オンライントランザクションで当事者間の信頼を築くために使われます。また一般的に、データの暗号化や署名、ユーザーやデバイスの認証、ネットワーク通信のセキュリティ保護にも使われています。デジタル証明書が悪用された最大規模の攻撃の1つが、2020年に起こったSolarWindsハッキングです。この攻撃では、攻撃者はActive Directoryフェデレーションサービス(ADFS)を悪用して秘密キーを入手し、証明書を偽造して正規ユーザーになりすますことで、検出を回避し、標的ネットワーク内でラテラルムーブメントを展開しました。セキュリティ関係者がこの攻撃活動の検出方法を公開し始めた頃、SpecterOps社が、証明書の窃取、アカウントの永続化、ドメインの昇格/永続化など、Active Directory証明書サービス(AD CS)の悪用につながる弱点を解説した調査レポートを公開しました。

このブログ記事では、世界中で確認されている、証明書を悪用する最新の攻撃の概要について説明します。また、証明書を入手するために使われるいくつかの手口、関連ログの収集方法、証明書を窃取する攻撃の緩和方法もご紹介します。

証明書ストアとは

Windowsの証明書ストアは、Windowsコンピューターで、「証明書」と呼ばれる重要ファイルが保管される特殊な場所です。これらの証明書は、コンピューターが他のコンピューターやWebサイトと安全に通信するための特別な鍵のようなものです。証明書の重要性は、SpecterOps社の『Certified Pre-Owned』調査レポートと、ADFSを悪用したGolden SAML攻撃の2つを見れば明らかです。どちらも代替認証方式、特に証明書が深く関わっています。

Windowsでの証明書の保管場所は、通常、レジストリの「HKEY_CURRENT_USER\SOFTWARE\Microsoft\SystemCertificates」か、ローカルシステムの場合は「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates」です。
また、ユーザーの個人証明書は「%APPDATA%\Microsoft\SystemCertificates\My\Certificates\」に保管されます。関連するユーザー秘密キーの保管場所は通常、CAPIキーの場合は「%APPDATA%\Microsoft\Crypto\RSA\User SID\」、CNGキーの場合は「%APPDATA%\Microsoft\Crypto\Keys\」です(Schroeder氏とChristensen氏の共著『Certified Pre-Owned』、2021年より)。

レジストリエディター

レジストリエディター(Splunk、2023年)

Windowsでの証明書サービス悪用の手口

Windowsのネイティブバイナリまたはサードパーティ製ユーティリティを使って証明書を抽出またはエクスポートする方法はさまざまです。このセクションでは、Windowsエンドポイントでのその実行方法をいくつかご紹介します。

Mimikatz

Mimikatzは、ソースコードにあるとおり、Windowsのネイティブバイナリを使って暗号ライブラリにアクセスします。Windows内のcryptdll.dllモジュールを利用して、暗号キーのエクスポート関数を読み込み、crypt32.dllモジュールを利用して、証明書や暗号メッセージに関する関数の多くを実装します。テストでは一見したところ、証明書ファイルの変更以外、Mimikatzで証明書がエクスポートされた形跡は残っていませんでした。しかし詳しく調べると、デバッグログのMicrosoft-Windows-CAPI2 (詳細は後述)に、Mimikatzによる証明書のエクスポートが記録されていました。ただし、CAPI2ログを有効にするよりも、Mimikatz自体の動作(名前の変更、再コンパイル、モジュールの読み込み、プロセスへのアクセスなど)を検出する方が効果的かもしれません。

Mimikatzによる2つの実装を詳しく見てみましょう。

lsadump::backupkeys /system: /export

または

lsadump::secrets

1つ目のコマンドでは、lsadump関数を使ってDPAPIバックアップキーをエクスポートします。DPAPI (Data Protection API)は、Windowsで使われるデータ保護のためのAPIです。追加の監査ログがあってもおかしくないところですが、この関数によるエクスポート時に生成された他のログを見つけることはできませんでした。DPAPIとマスターキーのエクスポートについては、Roberto Rodriguez氏によるこちらの記事で詳しく説明されています。エクスポートでは、3つのファイル、.der、.keyx.rsa.pvk、.pfxがディスクに書き出されます。

Mimikatzのlsadump::backupkeysの出力

Mimikatzのlsadump::backupkeysの出力(Splunk、2023年)

次に、Mimikatz内の実際の暗号モジュールを詳しく見てみましょう。最初にcrypto::capiを読み込んでから、キーをエクスポートします。先ほどの.keyx.rsa.pvkの形式でファイルがディスクに書き出されます。

秘密キーをエクスポートできない場合、Mimikatzのcrypto::capiコマンドとcrypto::cngコマンドを実行すると、秘密キーをエクスポートできるようにCAPIとCNGが修正されます。ただし、crypto::capiでは現在のプロセス内でCAPIを修正できるのに対して、crypto::cngではlsass.exeのメモリーの修正が必要になります(Schroeder氏とChristensen氏の共著『Certified Pre-Owned』、2021年より)。

crypto::capi
crypto::keys /export

Mimikatzのcrypto::capiの出力

Mimikatzのcrypto::capiの出力(Splunk、2023年)

ここでは、Microsoft社のCAPI (CryptoAPI)、またはさらに新しい暗号化APIであるCNG (Cryptography Next Generation)を使って証明書ストアとのやり取りが行われます。これらのAPIは、証明書ストレージや認証(特にユーザー認証)に必要なさまざまな暗号化サービスを実行します(Schroeder氏とChristensen氏の共著『Certified Pre-Owned』、2021年より)。

crypto::certificates /export

このコマンドと前述のコマンドとの違いは、このコマンドでディスクにエクスポートできるのは証明書、つまりPFXファイルのみである点です。書き出されるファイルは.pfxと.derです。

Mimikatzのcrypto::certificatesの出力

Mimikatzのcrypto::certificatesの出力(Splunk、2023年)

ディスクに.pfxと.derファイルが出力されていることがわかります。

Mimikatzでディスクに書き出されたファイル

Mimikatzでディスクに書き出されたファイル(Splunk、2023年)
crypto::certificates /systemstore:local_machine /store:my /export

このコマンドでは、証明書をエクスポートするストアを指定しています。この場合も書き出されるファイルは.pfxと.derです。

証明書の出力

証明書の出力(Splunk、2023年)
crypto::scauth /caname:ca /upn:atomic@art.local

エクスポートとは特に関係ありませんが、このコマンドを使用すると、ストア内に新しいスマートカード証明書を作成できます。賢いツールですね。

Mimikatzのcrypto::scauthの出力

Mimikatzのcrypto::scauthの出力(Splunk、2023年)

CertUtil

Microsoft社は、Windowsの証明書ストアを管理するためのさまざまなネイティブユーティリティを提供しています。たとえば、よく使われるのがCertUtilCertMgrCertReqです。2021年のSolarWindsに対するサプライチェーン攻撃では、CertUtilを悪用してPFXファイルがエクスポートされていることが確認されました。SplunkCISA、FireEye社がそれぞれ検証したとおり、この攻撃ではGolden SAML攻撃によって証明書がエクスポートされています。以下の手順に従うか、Atomic Red Team (T1552.004)を使って、この攻撃をシミュレートできます。

certutil -Store My

このコマンドを実行すると、「My」ストア配下に保管されているすべての証明書がリストされます。証明書のシリアル番号を取得して証明書を抽出します。

CertUtil.exeの証明書出力

CertUtil.exeの証明書出力(Splunk、2023年)

エクスポート

certutil -p password -exportPFX My 31f5a395749a3fbe4833b2dcc53992f2 c:\temp\atomic.pfx

CertUtil -exportPFXの出力

CertUtil -exportPFXの出力(Splunk、2023年)

サーバーにアクセスした攻撃者は、証明書を直接抽出するだけでなく、CertSrv.mscインターフェイスまたはCertUtil.exeを使って証明書データベースを直接バックアップすることもあります。

CertUtil.exe -backupDb c:\\temp\\certificates\\

または

Certutil.exe -backup c:\\CABackup

CertUtil -backupの出力

CertUtil -backupの出力(Splunk、2023年)

ここで使用したCertUtil.exeコマンドではいずれも、ファイルがディスクに書き出されます。アラート対象のイベントとしての妥当性は低いかもしれませんが、ネットワーク全体でファイルの書き出しと証明書の移動を監視することはある程度役に立つでしょう。

PowerShell

PowerShellでは、Export-PFXCertificateまたはExport-Certificateコマンドレットを使って証明書を抽出できます。どちらの方法も、攻撃者が証明書を抽出するのに十分な能力があります。

PowerShellのExport-Certificateの出力

PowerShellのExport-Certificateの出力(Splunk、2023年)

Certmgr.msc

証明書マネージャーのCertMgr.mscでは、権限のあるユーザーが証明書をディスクにエクスポートできます。

CertMgr

CertMgr (Splunk、2023年)

エクスポートを選択すると、証明書のエクスポートウィザードが表示され、手順に沿って証明書をエクスポートできます。

証明書のエクスポートウィザード

証明書のエクスポートウィザード(Splunk、2023年)

最後まで手順を進めると、簡単な操作でエクスポートを完了できます。

また、証明書サーバー/認証局で、UIを使ってデータベースのバックアップを実行することもできます。

バックアップウィザード

バックアップウィザード(Splunk、2023年)

Windowsでの証明書サービス悪用の検出

Windowsで以下のイベントログを監視すると、証明書の削除、要求、エクスポートの検出に役立ちます。

  1. セキュリティイベントログ:証明書の削除、バックアップ、エクスポートなど、セキュリティに関する操作のイベントが記録されます。証明書に関連するイベントは、通常、イベントID 4876 (データベースのバックアップ)、4887 (証明書の発行)、4886 (証明書の要求)です。
  2. Microsoft-Windows-CAPI2のOperationalログ:証明書の削除やエクスポートなど、暗号化に関する操作のイベントが記録されます。証明書に関連するイベントは、通常、イベントID 70です。
  3. Microsoft-Windows-CertificateServicesClient-Lifecycle-System/Userイベントログ:ローカルの証明書ストアから証明書がエクスポートされるとイベントID 1007が記録されます。
  4. SysmonのEDRプロセスログとコマンドラインログ: SysmonのイベントID 1またはWindowsセキュリティイベントID 4688は、プロセスとコマンドラインの監視に役立ちます。
  5. PowerShellのスクリプトブロックログ:イベントID 4104でExport-CertificateコマンドレットとExport-PFXCertificateコマンドレットを監視できます。

次の例は、前述のソースを理解するために役立ちます。PowerShellを使って、プロバイダーのイベントを収集できます。CertificateServicesClient-LifecycleのSystemとUserでは、イベントIDは同じです。次の例はSystemの出力です。

(Get-WinEvent -ListProvider Microsoft-Windows-CertificateServicesClient-Lifecycle-System).Events | Format-Table Id, Description
PS C:\\Users\\Administrator> (Get-WinEvent -ListProvider Microsoft-Windows-CertificateServicesClient-Lifecycle-System).Events | Format-Table Id, Description Id Description -- ----------- 1001 A certificate has been replaced. Please refer to the "Details" section for more information. 1002 A certificate has expired. Please refer to the "Details" section for more information. 1003 A certificate is about to expire. Please refer to the "Details" section for more information. 1004 A certificate has been deleted. Please refer to the "Details" section for more information. 1005 A certificate has been archived. Please refer to the "Details" section for more information. 1006 A new certificate has been installed. Please refer to the "Details" section for more information. 1007 A certificate has been exported. Please refer to the "Details" section for more information. 1008 A certificate has been associated with its private key. Please refer to the "Details" section for more information. 1009 A certificate could not be associated with its private key. Please refer to the "Details" section for more information.

これらのイベントID (EID)はすべて収集対象になりますが、特に重要なのが、証明書のエクスポートを示すEID 1007です。また、EID 1006や、EID 1008とEID 1009のようなエラーイベントも監視したいところです。

CAPIログのイベントID 70と認証ライフサイクルログのイベントID 1007を収集するには、以下のように指定します。

[WinEventLog://Microsoft-Windows-CertificateServicesClient-Lifecycle-User/Operational]
disabled = 0
renderXml = 1
index = win

[WinEventLog://Microsoft-Windows-CertificateServicesClient-Lifecycle-System/Operational]
disabled = 0
renderXml = 1
whitelist = $XmlRegex=’(?:1007).+’
index = win

[WinEventLog://Microsoft-Windows-CAPI2/Operational]
disabled = 0
renderXml = 1
whitelist = $XmlRegex=’(?:70).+’
index = win

適切なソースの収集方法がわかったところで、Splunk脅威調査チーム(STRT)が作成した新しい分析をいくつかご紹介しましょう。

Windows Export Certificate

この分析では、認証ライフサイクルログのイベントID 1007が監視されます。イベントID 1007は、ローカル証明書ストアから証明書がエクスポートされたときに生成されます。

証明書のエクスポートの検出

証明書のエクスポートの検出(Splunk、2023年)

Windows Steal Authentication Certificates CS Backup

この分析では、イベントID 4876に基づいて、Active Directory証明書サービスストアがバックアップされたことが検出されます。このイベントは、CertSrv.mscのUIまたはCertUtil.exeの-BackupDBオプションを使ってバックアップが実行されたときに常に生成されます。

証明書サービスストアのバックアップの検出

証明書サービスストアのバックアップの検出(Splunk、2023年)

Windows Steal Authentication Certificates Certificate Request

この分析では、証明書サービスのAD CSに新しい証明書が要求されたことが検出されます。この操作は本来悪質なものではありませんが、証明書の要求に関連する他のイベントとともに追跡し、相関付けて監視することが推奨されます。アカウントから証明書が要求されると、CAでイベントID 4886「証明書サービスは証明書の要求を受信しました」が生成されます。

証明書要求の検出

証明書要求の検出(Splunk、2023年)

Windows Steal Authentication Certificates Certificate Issued

この分析では、証明書サービスのAD CSで新しい証明書が発行されたことが検出されます。この操作は本来悪質なものではありませんが、証明書の発行に関連する他のイベントとともに追跡し、相関付けて監視することが推奨されます。CAでは、証明書が発行されると、イベントID 4887「証明書サービスは証明書の要求を許可し、証明書を発行しました」が生成されます。

証明書発行の検出

証明書発行の検出(Splunk、2023年)

Windows PowerShell Export Certificate

この分析では、PowerShellのスクリプトブロックログが監視され、Export-Certificateコマンドレットが検出されます。このコマンドレットによるエクスポートは、Windowsエンドポイントのローカル証明書ストアから証明書を盗み出す攻撃で使われることがあります。

証明書のエクスポートの検出

証明書のエクスポートの検出(Splunk、2023年)

Windows Mimikatz Crypto Export File Extensions

この分析では、Mimikatz内の暗号モジュールに関連する、ハードコードされた拡張子が検出されます。証明書の移動やダウンロードは必ずしも悪質な操作ではありませんが、Mimikatzでハードコードされた名前を監視することは、証明書の不正エクスポートの検出に役立ちます。

エクスポートファイルの拡張子の検出

エクスポートファイルの拡張子の検出(Splunk、2023年)

Windows Steal Authentication Certificates CryptoAPI

この分析では、WindowsイベントログCAPI2 (CryptoAPI 2)が監視され、不審な証明書抽出が検出されます。通常、このイベントログはPKIに関する問題の診断に使われますが、証明書のエクスポートを検出するためにも役立ちます。このイベントログには、多数のさまざまなプロセスからの一般的なPKI要求がすべて記録されるため、大量のイベントが出力されます。証明書がエクスポートされたときに生成されるのはイベントID 70「証明書の秘密キーの取得」です。STRTは、Cobalt StrikeでMimikatzを実装し、そのバイナリを使ってこの分析をテストしました。

CAPIのログ

CAPIのログ(Splunk、2023年)

STRTがこれまでに作成した分析は、こちらの分析ストーリーですべてご覧いただけます。

Windowsでの証明書サービスの悪用対策

Windowsシステムから証明書を抽出する脅威を緩和するためのベストプラクティスがいくつかあります。重要な取り組みの1つは、アクセス制御を適用し、各ユーザーに与える権限を最小限にすることで、証明書や秘密キーへのアクセスを制限することです。また、証明書のピン留め(ピンニング)を使って、不正な証明書や盗まれた証明書の使用を防ぐことも大切です。

そのほかのベストプラクティスとして、証明書失効リスト(CRL)を使用して、証明書の失効状況を監視し、失効した証明書が使用されていないことを確認すること、ソフトウェア制限ポリシーを適用して、Mimikatzのような悪質なソフトウェアの実行を制限すること、エンドポイント保護用のマルウェア対策ソフトウェアを導入して、悪質なアクティビティを監視、ブロックすること、セキュリティイベントログを定期的に監視して、不審なアクティビティがないかどうかを確認すること、従業員トレーニングを実施して証明書を保護することの重要性を理解してもらうことも挙げられます。

既知の脆弱性対策として、ソフトウェアとシステムにセキュリティパッチやアップデートを定期的に適用して、すべてを最新の状態に保つことも重要です。また、不審なアクティビティを検出したときにすばやく対応できるようにするには、インシデント対応計画を整備し、計画を定期的にテストすることが不可欠です。さらに、AD CSの一般的なセキュリティハイジーンに加えて、SpecterOps社が提供する、CSリスクの評価に役立つ攻守ツールや、緩和策を詳しく解説した『Certified Pre-Owned』ガイドを活用することも検討しましょう。

証明書のセキュリティ対策が重要な理由

リモートからアクセスするエンドポイントが増え、重要データが組織内だけでなくクラウドインフラにも置かれる今日、証明書は認証とアクセスのセキュリティ確保に欠かせない要素です。証明書が盗まれると、悪意を持った内部関係者または攻撃者に企業機密ファイルへのアクセスを許してしまう可能性があります。証明書のエクスポートを監視し、Active Directory証明書サービスの悪用を防ぐことは、機密情報を盗み出そうとする攻撃を防止するために必須の対策です。

このブログを、証明書サービスに関する詳細を提供してくれた@inthecards77に捧げます。

詳細情報

セキュリティ分析ストーリーの最新コンテンツは、GitHubSplunkbaseからダウンロードできます。Splunk Security Essentialsでは、プッシュアップデートによってすべての検出方法を利用できます。

すべてのセキュリティコンテンツの一覧は、Splunkマニュアルリリースノートに掲載されています。

フィードバック

ご意見やご要望がございましたら、GitHubから遠慮なくお寄せください。Slackチャネル「#security-research」にご参加いただくこともできます。SlackのSplunkユーザーグループへの招待が必要な場合は、こちらの手順に従ってください。

寄稿者

この記事の執筆にあたってご協力いただいた以下の方々に感謝を申し上げます。Teoderick Contrera、Michael Haag、Mauricio Velazco、Rod Soto、Jose Hernandez、Patrick Barreiss、Lou Stella、Bhavin Patel、Eric McGinnis。

参照資料

このブログはこちらの英語ブログの翻訳、横田 聡によるレビューです。

関連記事

人間のためのAI:初級者向けフィールドガイド
セキュリティ
17 分程度

人間のためのAI:初級者向けフィールドガイド

この初級者向けフィールドガイドを読んで、AIの世界に飛び込みましょう。LLM、生成AI、エージェンティックAIの謎を解き明かし、その進化とサイバーセキュリティ領域での重要な用途を探ります。
今日の主なリスク管理フレームワーク
セキュリティ
8 分程度

今日の主なリスク管理フレームワーク

財務、セキュリティ、情報、サードパーティなどのさまざまなリスクを、リスク管理フレームワーク(RMF)を使わずに効果的に管理する方法はあるでしょうか。それはまずないでしょう。この記事では、RMFについて詳しく説明します。
SplunkとAmazon Security Lakeの統合で実現するOpen Cybersecurity Schema Frameworkを利用した分析
セキュリティ
3 分程度

SplunkとAmazon Security Lakeの統合で実現するOpen Cybersecurity Schema Frameworkを利用した分析

Splunkは、Amazon Security Lakeの初期からのメンバーとして活動してきました。このため、アマゾン ウェブ サービス(AWS)社とSplunkの両社のお客様はOCSFに準拠したデータを効率的に取り込み、脅威の検出、調査、対応をより効果的に行うことができます。