用于审计 Active Directory 证书服务 (AD CS) 的 PowerShell 工具包。
它基于 PKISolution 的 PSPKI 工具包(Microsoft 公共许可证)构建。此仓库包含比 PSGallery 中更新的 PSPKI 版本(请参阅 PSPKI 目录)。Vadims Podans(PSPKI 的创建者)慷慨地提供了此版本,因为它包含多个 bug 的补丁。
此 README 仅作为入门指南——如需完整的详细信息和防御指导,请参阅《Certified Pre-Owned》白皮书。
该模块包含以下主要功能:
警告: 此代码处于测试阶段!我们确信 Invoke-PKIAudit 不会对环境产生影响,因为它查询的数据量相当有限。我们尚未针对典型的 CA 服务器工作负载对 Get-CertRequest 进行严格测试。Get-CertRequest 直接查询 CA 的数据库,可能需要处理数千条结果,这可能会影响性能。
如果没有结果,这并不能保证您的环境是安全的!!
我们也不能保证我们的缓解建议能使您的环境安全或不会中断运营!
您有责任与您的 Active Directory/PKI/架构团队沟通,以确定最适合您环境的缓解措施。
如果代码出现故障,或者我们遗漏了一些内容,请提交 issue 或 pull request 以进行修复!
在 Windows 计算机上使用提升的 PowerShell 提示符(PowerShell 版本 5.1 或更高版本)安装以下内容:
* [PSPKI PowerShell 模块](https://github.com/PKISolutions/PSPKI)。使用以下命令安装:```
Install-Module -Name PSPKI
下载模块并将其提取到一个文件夹中。然后,使用以下命令导入模块:``` cd PSPKIAudit Get-ChildItem -Recurse | Unblock-File
Import-Module .\PSPKIAudit.psd1
# 审计 AD CS 错误配置
运行 `Invoke-PKIAudit` 将对当前域中的 AD CS 执行所有审计检查,包括枚举各种证书颁发机构和证书模板设置。要审计特定 CA,可以运行 `Invoke-PKIAudit -CAComputerName CA.DOMAIN.COM` 或 `Invoke-PKIAudit -CAName X-Y-Z`。
任何错误配置(ESC1-8)将作为 CA/模板结果的属性显示,以标识找到的特定错误配置。
如果要更改用于测试注册/访问控制的组/用户,请修改 `Invoke-PKIAudit.ps1` 顶部的 `$CommonLowprivPrincipals` 正则表达式。
如果要将所有 CA 信息导出为 CSV,请运行:`Get-AuditCertificateAuthority [-CAComputerName CA.DOMAIN.COM | -CAName X-Y-Z] | Export-Csv -NoTypeInformation CAs.csv`
如果要导出所有已发布模板信息(不仅仅是易受攻击的模板)到 CSV,请运行:`Get-AuditCertificateTemplate [-CAComputerName CA.DOMAIN.COM | -CAName X-Y-Z] | Export-Csv -NoTypeInformation templates.csv`
## 输出说明
输出主要分为两个部分:关于发现的 CA 的详细信息,以及关于可能易受攻击的模板的详细信息。
对于证书颁发机构结果:
| 证书颁发机构属性 | 描述 |
| ---------------- | ----------------------------------------------------------- |
| ComputerName | 运行 CA 的系统。 |
| CAName | CA 的名称。 |
| ConfigString | 完整的 COMPUTER\CA_NAME 配置字符串。 |
| IsRoot | CA 是否为根 CA。 |
| AllowsUserSuppliedSans | 是否设置了 `EDITF_ATTRIBUTESUBJECTALTNAME2` 标志。 |
| VulnerableACL | CA 是否具有易受攻击的 ACL 设置。 |
| EnrollmentPrincipals | 在 CA 级别拥有 `Enroll` 权限的主体。 |
| EnrollmentEndpoints | CA 的 Web 服务注册端点。 |
| NTLMEnrollmentEndpoints | 已启用 NTLM 的 CA Web 服务注册端点。 |
| DACL | 完整的访问控制信息。 |
| Misconfigurations | 标识存在的特定错误配置的 ESCX(如果有)。 |
对于证书模板结果:
| 属性 | 描述 |
| -------------------- | ----------------------------------------------------------------------------------------------------- |
| CA | 模板发布到的完整 CA ConfigString(若未发布则为 null)。 |
| Name | 模板名称。 |
| SchemaVersion | 模板的架构版本(1/2/3)。 |
| OID | 模板的唯一对象标识符。 |
| VulnerableTemplateACL | 如果模板具有易受攻击的 ACL 设置,则为 True。 |
| LowPrivCanEnroll | 如果低权限用户可以注册该模板,则为 True。 |
| EnrolleeSuppliesSubject | 如果存在 `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT` 标志(即用户可以提供任意 SAN),则为 True。 |
| EnhancedKeyUsage | 模板中启用的 EKU 用途。 |
| HasAuthenticationEku | 如果模板具有允许身份验证的 EKU,则为 True。 |
| HasDangerousEku | 如果模板具有“危险”EKU(Any Purpose 或 null),则为 True。 |
| EnrollmentAgentTemplate | 如果模板具有“证书请求代理”EKU,则为 True。 |
| CAManagerApproval | 注册是否需要经理审批。 |
| IssuanceRequirements | 授权签名信息。 |
| ValidityPeriod | 证书的有效期。 |
| RenewalPeriod | 证书的续订期。 |
| Owner | 拥有证书的主体。 |
| DACL | 完整的访问控制信息。 |
| Misconfigurations | 标识存在的特定错误配置的 ESCX(如果有)。 |
## ESC1 - 错误配置的证书模板
### 详细信息 <!-- omit in toc -->
此权限提升场景在满足以下条件时发生:
1. **企业 CA 授予低权限用户注册权限。** 企业 CA 的配置必须允许低权限用户请求证书。有关详细信息,请参阅白皮书开头的“背景 - 注册”部分。
2. **禁用了经理审批。** 此设置要求具有证书“经理”权限的用户审查并批准所请求的证书,然后才能颁发该证书。有关详细信息,请参阅白皮书开头的“背景 - 颁发要求”部分。
3. **不需要授权签名。** 此设置要求任何 CSR 由现有的授权证书签名。有关详细信息,请参阅白皮书开头的“背景 - 颁发要求”部分。
4. **过度宽松的证书模板安全描述符授予低权限用户证书注册权限。** 拥有证书注册权限允许低权限攻击者请求并获取基于该模板的证书。注册权限通过证书模板 AD 对象的安全描述符授予。
5. **证书模板定义了支持身份验证的 EKU。** 适用的 EKU 包括客户端身份验证(OID 1.3.6.1.5.5.7.3.2)、PKINIT 客户端身份验证(OID 1.3.6.1.5.2.3.4)或智能卡登录(OID 1.3.6.1.4.1.311.20.2.2)。
6. **证书模板允许请求者在 CSR 中指定 subjectAltName (SAN)。** 如果请求者可以在 CSR 中指定 SAN,则请求者可以请求任何人的证书(例如域管理员用户)。证书模板的 AD 对象通过其 mspki-certificate-name-flag 属性指定请求者是否可以在 SAN 中指定 subjectAltName。mspki-certificate-name-flag 属性是一个位掩码,如果存在 CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT 标志,则请求者可以指定 SAN。
**TL;DR** 这种情况意味着非特权用户可以请求可用于域身份验证的证书,并且他们可以指定任意替代名称(例如域管理员)。这可能导致为高权限用户(如域管理员)生成有效的证书!
### 示例 <!-- omit in toc -->```
[!] Potentially vulnerable Certificate Templates: