Certify 是一个 C# 工具,用于枚举和滥用 Active Directory 证书服务 (AD CS) 中的错误配置。
@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",然后构建。
如果你想通过 PowerShell 包装器在内存中运行 Certify,首先编译 Certify 并将生成的程序集进行 base64 编码:
[Convert]::ToBase64String([IO.File]::ReadAllBytes("C:\Temp\Certify.exe")) | Out-File -Encoding ASCII C:\Temp\Certify.txt
然后可以使用以下方法在 PowerShell 脚本中加载 Certify(将 "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 参数会将所有输出流重定向到指定文件。
关于公开披露的问题,我们在发布白皮书后自我禁运了大约 45 天,才发布我们的攻击工具(Certify 以及 ForgeCert),以便给组织一个机会来应对 Active Directory 证书服务相关的问题。我们还预先为这两个项目发布了一些 Yara 规则/IOC,并在发布白皮书的同时发布了专注于防御的 PSPKIAudit PowerShell 项目。然而,我们发现,组织和供应商通常不会修复“理论性”攻击的问题或构建检测,直到有人通过概念验证证明某件事是可能的。
Certify 参考并借鉴了网上的一些资源:
AD CS 的研究工作建立在许多其他人的工作之上。白皮书中有完整的论述,但总结如下: