Abusing Active Directory Certificate Services

摘要 (Abstract)

微软的 Active Directory 公钥基础设施 (Public Key Infrastructure, PKI) 实现, 被称为 Active Directory 证书服务 (Active Directory Certificate Services, AD CS), 在攻击和防御社区中基本上不为人所知。AD CS 被广泛部署, 为攻击者提供了凭据盗窃, 机器持久性, 域提升和隐蔽域持久性的机会。我们将介绍 Active Directory 中证书的相关背景, 详细说明通过证书盗窃和恶意注册用户及机器持久性来滥用 AD CS, 讨论一组可能导致域提升的常见错误配置, 并解释一种窃取证书颁发机构的私钥以伪造新的用户/机器 “黄金” 证书的方法。通过揭示 AD CS 的安全隐患, 我们希望提高攻击者和防御者对这个复杂, 广泛部署且常被误解的系统的安全问题的认识。

Introduction

近年来, Active Directory 安全性引起了极大的关注。虽然 Active Directory 的多个方面已经从安全角度得到了充分关注, 但有一个相对被忽视的领域是 Active Directory 证书服务 (AD CS)。AD CS 是微软的 PKI 实现, 它与现有的 Active Directory 林 (Forests) 集成, 提供从文件系统加密, 数字签名到用户身份验证 (本文的主要关注点) 等多种功能。尽管 AD CS 在 Active Directory 环境中并非默认安装, 但根据我们的经验, 它被广泛部署。

我们的研究始于 Active Directory 技术规范中的一句话:

“在 DC 的情况下, 用于验证客户端发出绑定请求的身份的外部身份验证信息来自客户端在 SSL/TLS 握手期间呈现的客户端证书, 该握手是在客户端发送 LDAP_SERVER_START_TLS_OID 扩展操作时发生的。”

这引发了一个问题, “如何使用证书进行 LDAP 身份验证?” 这让我们开始了解 AD CS 及其证书认证的操作方法。进一步调查使我们试图全面理解 AD CS 的组成部分及其安全隐患。

本文旨在尽可能全面地介绍对 AD CS 的潜在攻击以及如何防止和检测这些滥用行为的防御指南。我们从理解 AD CS 工作原理所需的背景知识开始, 包括它与 Active Directory 身份验证的集成, 然后讨论各种攻击和相关防御措施。具体来说, 我们重点介绍了证书窃取和恶意证书注册对用户和机器持久性的影响, 一组导致域提升的常见证书模板配置错误, 以及窃取证书颁发机构 (Certificate Authority, CA) 私钥 (如果没有硬件保护) 以伪造证书的方法。

本文简要回顾了 AD CS, 包括其组件和证书注册过程的工作原理。我们讨论了已颁发证书及其关联私钥的存储, 包括常见的文件格式以及 Windows 的存储方式。这包括使用 Windows 的数据保护 API (DPAPI) 结合 Mimikatz 和 SharpDPAPI 工具集来提取证书及其私钥的信息。

我们讨论了攻击者如何利用某些用户和机器证书通过多种协议对 Active Directory 进行身份验证, 构成一种攻击行业直到现在才大致知晓的凭据盗窃。此外, 我们研究了如何结合机器证书盗窃与 Kerberos 基于资源的约束委派 (RBCD) 来实现可靠的长期机器持久性。

除了盗取现有证书外, 我们还研究了攻击者如何为用户和计算机请求或续订证书, 提供与上述相同的持久性方法。虽然使用基于 GUI 的 mmc.exe 插件和 certreq.exe 一直可以发出请求, 但尚未存在一种满足在命令与控制 (C2) 通道上操作的需求的武器化方法。因此, 我们构建了 Certify 工具集来填补这一空白, 并将在本文发布后约 45 天发布。Certify 提供了本文中讨论的一系列审核和 AD CS 功能, 包括为当前认证用户或计算机请求新证书的能力。

然后, 我们将检查我们在许多环境中看到的一组常见错误配置。自从开始这项研究以来, 我们已经分析了许多网络的这些 AD CS 错误配置。在到目前为止的几乎每个网络中, 都可以使用这些攻击之一进行 AD 特权提升, 低特权用户 (例如, “Domain Users” 组的成员) 几乎总是能够立即妥协 Active Directory 林。我们还讨论了由注册 CA 错误配置导致的变体, 以及一个 NTLM 中继到 AD CS Web 注册端点的场景。

接下来, 我们探讨微软文档中的这一声明:

“如果 CA 私钥被泄露, 攻击者可以以 CA 身份执行操作。”

虽然这一攻击从理论上讲已经被讨论过, 但我们没有找到关于武器化的明确文档。我们将展示如何使用 SharpDPAPI 和 Mimikatz 工具集提取未受硬件保护的 CA 私钥, 然后使用该密钥为域中的任何主体伪造证书。攻击者可以使用这些伪造的证书以域中的任何活动用户/计算机身份进行身份验证, 只要 CA 的证书仍然有效且受信任, 这些证书就无法被吊销。我们将讨论使用我们构建的工具 ForgeCert 来伪造新证书, 该工具将在前面提到的 45 天延迟发布计划中与 Certify 一起发布。

最后, 我们讨论了某些组织在构建 AD CS 时没有遵循微软的指导。这导致 AD CS 基础设施的安全性和抗破坏能力大大降低。我们还讨论了即使遵循了微软的指导, 攻击者也可能利用共享的 PKI 系统打破 AD 林信任边界。

本文中的许多信息零散地分布在互联网上, 尽管通常以某种理论形式存在。然而, 鉴于 AD CS 的广泛部署, 其与 Active Directory 林的核心集成以及它可能为攻击者提供的长期访问, 假设 AD CS 多年来未成为高级对手的目标是不明智的。

由于这些错误配置的严重性, 我们相信这些问题可能在许多网络中广泛存在 (基于我们分析的多个网络的数据), 以及修复它们所需的工程努力, 我们将推迟约 45 天发布我们武器化的工具集。在此之前, 我们将发布一个名为 PSPKIAudit 的 PowerShell 工具, 该工具利用 PKISolutions 的 PSPKI PowerShell 模块来枚举任何配置错误的模板。如果发现任何错误配置, 我们建议按照 “防御指南” 部分中的步骤进行操作。

由于我们在研究期间识别的 AD CS 滥用技术数量众多, 我们决定为每种攻击技术分配一个标识符, 以便可以轻松地与本文结尾的相关防御指南关联。这些攻击技术 ID 用于描述技术的每个部分的标题以及相关的防御部分, 以便控制措施可以轻松地映射回攻击技术。

Offensive Technique ID Description
THEFT1 Exporting certificates and their private keys using Window’s Crypto APIs
THEFT2 Extracting user certificates and private keys using DPAPI
THEFT3 Extracting machine certificates and private keys using DPAPI
THEFT4 Theft of existing certificates via file/directory triage
THEFT5 Using the Kerberos PKINIT protocol to retrieve an account’s NTLM hash
PERSIST1 Account persistence via requests for new authentication certificates for a user
PERSIST2 Account persistence via requests for new authentication certificates for a computer
PERSIST3 Account persistence via renewal of authentication certificates for a user/computer
ESC1 Domain escalation via No Issuance Requirements + Enrollable Client Authentication/Smart Card Logon OID templates + CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT
ESC2 Domain escalation via No Issuance Requirements + Enrollable Any Purpose EKU or no EKU
ESC3 Domain escalation via No Issuance Requirements + Certificate Request Agent EKU + no enrollment agent restrictions
ESC4 Domain escalation via misconfigured certificate template access control
ESC5 Domain escalation via vulnerable PKI AD Object Access Control
ESC6 Domain escalation via the EDITF_ATTRIBUTESUBJECTALTNAME2 setting on CAs + No Manager Approval + Enrollable Client Authentication/Smart Card Logon OID templates
ESC7 Vulnerable Certificate Authority Access Control
ESC8 NTLM Relay to AD CS HTTP Endpoints
DPERSIST1 Domain persistence via certificate forgery with stolen CA private keys
DPERSIST2 Domain persistence via certificate forgery from maliciously added root/intermediate/NTAuth CA certificates
DPERSIST3 Domain persistence via malicious misconfigurations that can later cause a domain escalation

我们还对预防控制 (PREVENTX) 和检测控制 (DETECTX) 进行了编号, 以便于关联。在每个进攻技术部分的末尾都提供了相应的 ID, 以便攻击可以轻松地前向映射到其相关的防御控制。

Defensive Technique ID Description
PREVENT1 Treat CAs as Tier 0 Assets
PREVENT2 Harden CA settings
PREVENT3 Audit Published templates
PREVENT4 Harden Certificate Template Settings
PREVENT5 Audit NtAuthCertificates
PREVENT6 Secure Certificate Private Key Storage
PREVENT7 Enforce Strict User Mappings
PREVENT8 Harden AD CS HTTP Enrollment Endpoints
DETECT1 Monitor User/Machine Certificate Enrollments
DETECT2 Monitor Certificate Authentication Events
DETECT3 Monitor Certificate Authority Backup Events
DETECT4 Monitor Certificate Template Modifications
DETECT5 Detecting Reading of DPAPI-Encrypted Keys
DETECT6 Use Honey Credentials
DETECT7 Miscellaneous

Prior Work

正如常见的情况一样, Benjamin Delpy 在他的 Mimikatz 和 Kekeo 工作中比我们领先了多年。在这里也是如此, 他早在 2016 年就添加了与 AD CS 交互的功能: