
Certifyは、Active Directory証明書サービス(AD CS)における設定ミスを列挙し悪用するためのC#ツールです。
@harmj0y と @tifkin_ がCertifyおよび関連するAD CS研究(ブログおよびホワイトペーパー)の主な作者です。
コマンドの概要と包括的な使用法の詳細は、wiki にあります。
Certifyは、2021年のBlack Hatでの講演「Certified Pre-Owned: Abusing Active Directory Certificate Services」と共にリリースされました。
予防と検出のガイダンスについては、ホワイトペーパーを参照してください。
Certifyのバイナリをリリースする予定はないため、ご自身でコンパイルする必要があります :)
Certifyは.NET 4.7.2に対してビルドされており、Visual Studio 2022 Community Editionと互換性があります。プロジェクトの.slnファイルを開き、「Release」を選択してビルドするだけです。
CertifyをPowerShellラッパーを介してメモリ内で実行したい場合は、まずCertifyをコンパイルし、結果のアセンブリをBase64エンコードします。
[Convert]::ToBase64String([IO.File]::ReadAllBytes("C:\Temp\Certify.exe")) | Out-File -Encoding ASCII C:\Temp\Certify.txt
次に、以下の方法でCertifyをPowerShellスクリプトに読み込むことができます("aa..."の部分はBase64エンコードされたCertifyアセンブリ文字列に置き換えてください)。
$CertifyAssembly = [System.Reflection.Assembly]::Load([Convert]::FromBase64String("aa..."))
その後、Main()メソッドと任意の引数を次のように呼び出すことができます。
[Certify.Program]::Main("enum-templates --filter-enabled --filter-vulnerable".Split())
PSRemotingが出力を処理する方法のため、stdoutを文字列にリダイレクトして返す必要があります。幸い、Certifyにはそれを支援する関数があります。
補足:PowerShellを介したCertifyの実行の手順に従ってCertify.ps1を作成した場合は、スクリプトに以下のようなものを追加してください。
[Certify.Program]::MainString("enum-templates --filter-enabled --filter-vulnerable")
その後、次のようなコマンドでPSRemotingを介してCertifyを実行できるはずです。
$s = New-PSSession dc.theshire.local
Invoke-Command -Session $s -FilePath C:\Temp\Certify.ps1
または、Certifyの/outfile:C:\FILE.txt引数を使用すると、すべての出力ストリームを指定したファイルにリダイレクトできます。
公開開示について:私たちは、攻撃ツール(CertifyおよびForgeCert)のリリースを、ホワイトペーパー公開後約45日間自己保留し、組織がActive Directory証明書サービスに関する問題に対処する機会を確保しました。また、両プロジェクトのYaraルール/IOCを先行的にリリースし、ホワイトペーパーと共に防御に特化したPowerShellプロジェクトPSPKIAuditも公開しました。しかし、組織やベンダーは、誰かが概念実証で可能性を証明するまで、「理論上の」攻撃に対する問題を修正したり検出を構築したりしないことが歴史的に多いと私たちは見ています。
Certifyは、参考および着想として以下のオンラインリソースを使用しました。
AD CSの研究は、多くの他の人々の研究に基づいています。ホワイトペーパーに完全な説明がありますが、以下に要約します。