cfalta/PoshADCS
GitHub: cfalta/PoshADCS
针对ADCS证书模板权限滥用的PowerShell概念验证工具,演示通过篡改模板配置实现域内权限提升和用户冒充。
Stars: 193 | Forks: 19
# PoshADCS
PoshADCS 是我目前针对通过 ADCS(Active Directory 证书服务)寻找 Active Directory 域攻击路径的研究成果。该脚本目前仍处于非常初级的测试阶段,因此请仅在您了解自己在做什么的情况下使用。
## 长话短说
Active Directory 集成证书颁发机构(企业 CA)将其部分配置存储在 Active Directory 中。特别值得关注的是所谓的“证书模板”。
证书模板由客户端以及 CA 使用,用于确定如何填充证书请求以及生成的证书中的字段。通常,在任何使用 AD 集成 CA 的组织中,都会发布一些证书模板。
如果攻击者获得了对这些模板中任何一个的写入权限(Write 和 Enroll 或 WriteDACL)(例如通过服务账户),则可以“重写”任何模板,以便攻击者可以为任意用户(例如域管理员)注册智能卡证书,然后冒充该用户。
这既可以用作基于 ACL 的后门,也可以用作攻击向量。
## 什么是 ADCS?
Active Directory 证书服务是 Windows Server 的一个服务器角色,允许您在 Windows 上运行 PKI(公钥基础设施)。安装时,您可以决定是安装独立 CA 还是企业 CA。简单来说:独立 CA 只是在 Windows 上运行的证书颁发机构,而企业 CA 则与 Active Directory 集成。
通常,您将独立 CA 用于根 CA(因为它可以离线或断开连接),而将企业 CA 用于颁发 CA。
那么,“企业”和“集成”具体意味着什么呢?
我试图用一张图片展示相关的相互联系。虽然看起来像我小女儿画的,但我希望您能明白重点 ;-)

企业 CA 不仅将其配置存储在本地数据库中,还存储在 Active Directory 的配置分区中,位于以下键下:
`CN=Public Key Services, CN=Services, CN=Configuration, DC=domain, dc=com`
数据被分割在不同的容器中,如“AIA”或“Certificate Templates”。我们目前将重点关注与我们的攻击场景相关的那些。

* __Certificate Templates:__ 存储所有证书模板的配置。证书模板基本上是证书请求的蓝图(例如用于 SMIME 证书)。但是,此容器中的并非所有证书模板都一定可用于注册。
* __Enrollment Services:__ 存储可用于证书注册的 CA。Windows 主机使用此容器自动查找可以向其颁发证书的 CA。此容器中相应的 CA 对象有一个名为“certificate Templates”的成员属性。此属性包含该 CA 上可用于注册的所有证书模板(见上文)的列表。这通常只是所有现有模板的一个子集。
* __NtAuthCertificates:__ 存储被允许颁发智能卡登录证书的 CA。如果您尝试使用由不在此列表中的 CA 颁发的智能卡证书登录,身份验证将失败。每个企业 CA 都会自动添加到此处。
## 什么是证书模板?
如前所述,证书模板就像填充证书请求的蓝图。这是一个例子:用于“计算机证书”的证书模板(例如用于使用 802.1x 进行身份验证)包含与该使用场景相关的某些属性。此模板通常配置为使用请求主机的 DNS 名称作为证书中的公用名 (CN)。
因此,请求证书的计算机将根据模板中的设置填充证书请求。CA 也使用模板中的配置进行验证,因此即使客户端提交了错误的公用名,CA 也会在颁发证书之前将其更改为模板中定义的名称。

正如您在上面的屏幕截图中所见,然而也可以允许注册客户端提交任意的公用名。这会带来一定的风险,因为 CA 必须信任客户端提供正确的 CN。CA 管理员可以通过 Active Directory 中模板对象的 ACL 来限制对证书模板的访问。模板的 ACL 不仅定义了谁可以修改模板,还定义了谁可以注册模板。
证书注册可以自动发生(权限 = Auto Enrollment)或手动发生(权限 = Enroll)。自动注册通过组策略配置,并在处理策略期间由组策略客户端强制执行。如果启用了自动注册,组策略客户端将查找并注册所有设置了自动注册权限的可用证书模板。
## 攻击证书模板
从系统管理员的角度来看,证书模板看起来截然不同。每个企业 CA 都附带一些默认模板,通常的做法是,如果您想使用某个模板,您需要复制一个默认模板并使用该副本。
如果您想给 Windows 客户端颁发证书以便它可以参与 802.1x,您可以使用“Computer”模板。如果您想向用户颁发 SMIME 证书,您将使用“User”模板的副本。
每个模板都以其预期用途命名,这加强了只能从“computer”模板颁发计算机证书的想法。然而,两个不同的模板之间没有根本区别。如果填充了正确的参数,每个模板都可以颁发任何类型的证书。
如果攻击者获得了对任何模板的访问权限(Write/Enroll 或 WriteDACL),则可以重新配置该模板以颁发智能卡登录证书。攻击者甚至可以为任何给定用户注册这些证书,因为定义证书 CN 的设置是在模板中控制的。
长话短说,攻击者可以通过为该用户注册智能卡登录证书来冒充任何用户。如果域已经使用智能卡进行身份验证,则所有要求都已满足,攻击应该可以开箱即用。
如果目标环境中当前未使用智能卡,只要满足以下条件,攻击仍然有效:
* 颁发智能卡证书的企业 CA 的证书需要存在于“CN=NtAuthCertificates, CN=Public Key Services, CN=Services, CN=Configuration, DC=domain, dc=com”下。这是在 CA 设置期间自动完成的,因此应该不是问题。
* 您显然需要一张智能卡。这可以是物理智能卡,但是携带真正的智能卡意味着需要物理访问,这可能是一个挑战。幸运的是,有一种解决方案叫做“虚拟智能卡”。稍后会详细介绍。
* 域控制器需要从以下模板之一颁发的证书:Domain Controller、Domain Controller Authentication、Kerberos Authentication。这可能是唯一可能无法满足的关键要求。但是,如果有企业 CA 并启用了自动注册,根据我的经验,域控制器很可能已经自动获得了证书。
## 虚拟智能卡来救场
由于将物理智能卡带到您可能只有远程访问权限的主机上可能是一个挑战,因此有一种解决方案叫做虚拟智能卡。虚拟智能卡在 Windows 8 中实现,允许您使用 TPM 芯片创建虚拟智能卡设备。
由于大多数现代商务客户端都配备了 TPM 芯片,这应该不是问题。事实上,虚拟智能卡对于攻击来说比真正的智能卡更有用,因为它们在 Windows 客户端和服务器上开箱即用,无需任何特殊驱动程序,甚至可以通过 RDP 工作。
因此,您可以在受损的客户端上使用虚拟智能卡登录到没有 TPM 的服务器,就像使用用户名/密码一样。
创建虚拟智能卡很简单,因为 Windows 提供了一个名为 tpmvscmgr.exe 的管理工具。只需运行以下命令即可生成具有默认 PIN 码 (12345678) 的智能卡。
`tpmvscmgr.exe /create /name VSC01 /pin default /adminkey random /generate`

## 概念验证
我编写了一个概念验证脚本,实现了上述攻击。它接受要冒充的域用户的 samaccountname 和您有权访问的证书模板的名称。
该脚本将重写模板以允许智能卡注册,获取证书,然后将模板重置为其原始配置 :-)

标签:ACL, Active Directory, ADCS, AI合规, Azure 安全, Conpot, IPv6, Libemu, Libemu, Modbus, Plaso, PoC, PowerShell, Terraform 安全, Windows安全, 协议分析, 后门, 域环境, 域管权限, 数据展示, 暴力破解, 权限提升, 概念验证, 横向移动, 红队, 编程规范, 访问控制列表, 证书服务, 证书模板, 超级时间线, 足迹探测, 身份冒用