AD CS:如何使用PSPKIAudit审计和分析您的PKI?
I. 概述
在本文中,我们将探索如何审计Windows Server下的AD CS(Active Directory证书服务)证书颁发机构服务器,以识别潜在风险、漏洞或错误配置。
此审计适用于两个主要场景:
- 常规安全流程,如年度测试或计划性检查
- 强化操作的前期准备
了解PKI配置的当前状态有助于更好地理解技术挑战,并制定适合自身环境的安全策略。
II. 关于PKI审计
PKI基础设施的审计可以采取多种形式,常与针对证书颁发机构服务器的渗透测试相混淆。然而,这两种方法是互补但截然不同的。错误配置可能不会立即构成威胁,但在不久的将来可能变得至关重要。
相反,渗透测试未能破坏基础设施并不意味着其已正确加固。
还存在更传统的审计形式,无论是手动还是自动化的。流行工具如PingCastle或Purple Knight可以分析PKI的某些方面,特别是:
- 发布的证书模板
- 在Active Directory中与这些模板关联的ACL
- 引用的撤销信息(CRL/AIA)
然而,出于性能考虑,这些工具仅限于Active Directory中暴露的数据,不会直接查询证书颁发机构(CA)的数据库,特别是在涉及独立CA或与目录集成不良的CA时。
实际上,大多数关键元素都驻留在CA数据库中:颁发的证书、管理角色和权限、安全设置(算法、密钥大小、CSP)或配置的扩展。
III. 自动化审计
存储在Active Directory中的信息不足以正确审计PKI基础设施。许多关键元素——如CA设置、颁发的证书或某些安全选项——并未在目录中暴露。
为了更深入,可以使用多种工具自动化审计:
- Certutil,Windows原生工具
- PowerShell模块PSPKI,非常完整但需要一些自定义开发
- 基于PSPKI的PSPKIAudit模块,定期更新,旨在检测已知漏洞
我们将在本文后续部分使用最后一个工具。
A. PSPKIAudit介绍
PSPKIAudit是一个基于PSPKI的开源PowerShell模块。它旨在自动(或手动)分析ADCS证书颁发机构服务器,以检测已知的配置缺陷。
该模块深度评估配置以检测CA是否易受已知攻击(ESC):
代码 | 名称/漏洞类型 | 描述 |
---|---|---|
ESC1 | 错误配置的证书模板 | 允许使用任意身份(例如,主题名称=Supply)颁发证书的模板 |
ESC2 | 错误配置的证书模板 | 允许具有扩展特权的非受限用户自动注册的模板 |
ESC3 | 错误配置的注册代理模板 | 用户可以在没有足够控制的情况下为其他帐户请求证书 |
ESC4 | 易受攻击的证书模板ACL | 证书模板上的ACL允许未经授权的用户修改或使用它 |
ESC5 | 易受攻击的PKI AD对象ACL | AD中与PKI相关的对象(模板、服务)具有危险的写入权限 |
ESC6 | EDITF_ATTRIBUTESUBJECTALTNAME2 | CA允许客户端指定任意SAN(主题替代名称),为冒充打开大门 |
ESC7 | 易受攻击的CA ACL | CA服务器本身的ACL允许用户成为CA管理员 |
ESC8 | NTLM中继到AD CS HTTP端点 | CA暴露Web界面(例如certsrv)易受NTLM中继攻击 |
Misc | 显式映射 | 可以滥用的Kerberos显式映射帐户和证书 |
PSPKIAudit模块主要依赖两个主要命令:
Invoke-PKIAudit
:启动AD CS环境的自动扫描以审计当前设置Get-CertRequest
:通过直接查询其数据库来检查证书颁发机构颁发的证书
B. 安装
在使用PSPKIAudit模块之前,需要一些先决条件。不一定要直接在证书服务器上执行。
第三方工作站即可,只要具备:
- PSPKI模块
- 用于证书和Active Directory的RSAT套件
还需要一个对CA具有读取权限的帐户。默认情况下将使用管理员帐户,但如果正确定义了权限,完全可以使用服务帐户。
首先在服务器上安装先决条件:
|
|
然后安装PSPKI模块(先决条件):
|
|
然后我们可以下载并使用我们的模块。从项目的GitHub下载ZIP格式的内容,并将其解压缩到文件夹中。
内容显示如下形式。
然后需要使用Unblock-File
命令解锁脚本目录的内容:
|
|
如果没有收到错误,则表示模块已成功导入。
C. 自动分析
我们将首先启动自动扫描。从PS1窗口或ISE编辑器开始,首先导入PSPKI模块以避免任何问题,然后使用以下命令启动分析:
|
|
此命令查找在Active Directory中注册的证书服务器,并依次执行分析。您可以使用-ComputerName
或-CAName
参数指定特定服务器或证书颁发机构。
要探索其他参数和高级选项,可以参考GitHub上的PKIAudit模块页面。
命令启动后,请等待片刻:每个证书颁发机构的信息将显示在屏幕上。
如果没有显示任何结果或者Misconfiguration列为空,则表示在分析过程中未检测到已知漏洞。
在这里,我们发现证书模板存在漏洞和错误配置,这在我们的案例中是故意的:ESC4。
根据文档,ESC4漏洞涉及证书模板上配置错误的权限(ACL)。当未经授权的用户或组对敏感模板具有注册(Enroll)或自动注册(Autoenroll)权限时,就会出现这种情况,从而为通过颁发恶意证书进行权限提升打开了大门。
我们可以在模板级别验证这一点。这里,经过身份验证的用户拥有过多的权限!
如果有其他错误,请花时间分析结果。在我们的实验室中,这是唯一报告的警报。
D. 手动分析
PSPKIAudit模块还允许基于对颁发的证书和CA内部参数的解释进行手动分析。
这种方法对安全架构师和Windows专家特别有用,因为它提供了超越自动检测漏洞的潜在弱点的更精细视图。
通过交叉引用CA数据库(通过Get-CertRequest
命令)的信息与PKI安全最佳实践,可以:
- 检测使用不当用途颁发的证书(例如,特权帐户的客户端身份验证)
- 识别异常长的有效期
- 发现通过注册代理(Enrollment Agents)无控制颁发的证书
- 或检查关键扩展,如主题替代名称
这种手动分析虽然技术性更强,但对于建立适合环境的强大修复计划至关重要。
现在,使用以下命令启动证书扫描:
|
|
在大型环境中,我建议限制搜索或将其分段。还将结果导出到CSV文件以便更好地解释,或导出到变量,这完全取决于数据库的大小,这里我们讨论的是超过10,000个证书。
通过深入分析CA颁发的证书的SAN扩展,我们识别出一个可疑证书。
具体来说,一个标准用户"mehdi"成功生成了以管理员帐户名称为主题替代名称(SAN)的请求。这种配置极具问题,因为它允许非特权用户通过看似合法的证书冒充管理员身份。
这种情况清楚地表明了与ESC6漏洞相关的缺陷(启用了EDITF_ATTRIBUTESUBJECTALTNAME2),它允许具有任意SAN的请求。
风险和后果:
- 以管理员身份进行身份验证劫持(Kerberos/LDAPS)
- 绕过基于身份访问控制
- 创建"黄金"证书以维持或扩展权限
- 破坏AD基础设施内的信任
我们应该立即撤销此证书,即使这只是一个受控测试。如果此类配置出现在生产环境中,则代表关键漏洞。
还可以分析证书请求的来源,通过识别提交每个请求的进程。这可以检测异常:例如,根据您公司的实践,通过PowerShell ISE、Certify.exe或Web浏览器(certsrv)发送的请求在某种上下文中可能是合法的,但在另一种上下文中可能可疑。
使用以下命令列出请求来源:
|
|
在这里,我们发现大多数请求是从PowerShell ISE生成的,这在我们的实验室中是正常的。
使用PKIReport工具还可以获得关于发出证书请求的前几位用户/帐户和前5位证书名称的视图和清单,以及使用的签名协议和其他信息。此工具即将推出,将在未来的文章中介绍。
E. 观察结果
许多配置将监控工作集中在Active Directory上(通过SOC、日志、访问控制),而完全忽略了信任链,尽管它们同样敏感。
在这种情况下,具有伪造SAN或滥用用途的恶意证书请求很容易被忽视,逃脱经典检测,并允许恶意操作,如权限提升、身份冒充或持久化。
IV. 结论
与PKI基础设施相关的漏洞不断发展,并越来越成为攻击者优先探索的领域。
在我的审计和强化任务中,我注意到许多组织固守历史选择,担心破坏表面上稳定的系统。然而,在PKI领域,停滞通常构成比变更更大的风险。
因此,必须将PKI审计视为身份安全的一个独立组成部分,与Active Directory目录控制同等重要,同时跟踪变更并进行定期清单。