MS14-068 漏洞分析
简介
2014.11.18 日,微软发布 MS14-068 补丁,修复了一个影响全部版本 Windows 服务器的严重漏洞。用于解决 Microsoft Windows Kerberos KDC 漏洞,该漏洞允许黑客任意普通用户提升权限成为域管理员身份。攻击者可以利用这些提升的权限控制域中所有的计算机,包括域服务器。
原理
Kerberos 认证流程
Server如何判断Client的该有什么样的权限?
Server 收到 Client 发来的 TGS 后,要根据 TGS 中 Client 申明所在的域组,和 Server 上的 ACL 进行比对,然后决定给予 Client 什么样的资源访问权限。微软使用 PAC 来表示 TGS 中 Client 申明的域组。
PAC
PAC (Privilege Attribute Certificate),特权属性证书。PAC 包含 Client 的 User 的 SID
、Group 的 SID
。PAC 决定了 Client 的组属性,即决定了 Client 的权限。
PAC 中 Group 的 SID 决定了 Client 权限。
PAC 为了保证自身的合法性,还包含 2 个签名,Key 为 krbtgt 的 NTLM,签名的内容除了 User SID、Group SID
外,还包括其他部分。
PAC 作为 TGT 的一部分,是加密的,密钥为 krbtgt 的 NTLM。
Client 向 KDC 的 AS 模块发起认证请求,AS 返回 TGT 时,会根据 Client 所在的组,生成 PAC,包含 Client 的 User SID、Group SID,以及用于确保 PAC 不被篡改的 2 个签名。将 PAC 作为 TGT 的一部分,发送给 Client。
Client 使用 TGT 向 KDC 的 TGS 模块发起访问 Server 服务时,KDC 的 TGS 模块首先解密TGT,并通过校验 2 个签名,以验证 PAC 的合法性。如果通过验证,KDC 的 TGS 模块用 2 个新的签名替代老的签名来保证 PAC 不被篡改。第一个签名的密钥为 Server 的 NTLM,第二个密钥为 Server 与 Client 的临时会话密钥(Server Session Key)。
重新签名后的 PAC 被放置在签发的访问票据 TGS 中,并使用 Server 的 NTLM 作为密钥加密TGS。Server 收到来自 Client 的 TGS 后,解密 TGS 验证合法性,校验 PAC 中的 2 个签名,确认 PAC 的合法性,然后确认 Client 的访问权限。
漏洞成因
Client 在发起认证请求时,通过设置 include-PAC
为 False
,则返回的 TGT
中不会包含 PAC
。
- 第一个原因
KDC 对 PAC 进行验证时,对于 PAC 尾部的签名算法,虽然RFC上规定必须是带有 Key 的签名算法才可以,但微软在实现上,允许任意签名算法,只要客户端指定任意签名算法,KDC 服务器就会使用指定的算法进行签名验证。因此,伪造的任意内容都可以是合法的,直接加上内容的值作为签名即可。
- 第二个原因
当设置了 include-PAC 为false,返回的TGT没有 PAC,随后构造一个假的PAC和TGT一并发送给 KDC, KDC 在收到TGT 和 PAC 后,仍然能够正确解析出没有放在 TGT 中的 PAC 信息。
PAC 必须是密文,经过 Key 加密的,所以 KDC 会从 收到的TGT 中取出 Session Key,把 PAC 信息解密并利用客户端设定的签名算法验证签名。
- 第三个原因
KDC 先验证缺少 PAC 的 TGT, 成功后,再去验证不在 TGT 中的 PAC 的合法性。如果 2 个均验证成功,KDC 把 PAC 中的 User SID、Group SID
取出来,重新使用进行签名,签名算法和密钥与设置 inclue-pac
标志位为 TRUE
时一模一样。将新产生的 PAC 加入到解密后的 TGT 中,再重新加密制作全新的 TGT 发送给 Client,注意不是 TGS。
利用流程:
- 发送 as-req,并且 include-PAC 为false
- 客户端收到 TGT(不带 PAC),利用 Session Key 构造一个假的 PAC(声明自己为域管),并指明签名算法,最后和 TGT 一起发送给KDC(TGS-req)
- KDC 会先验证 TGT ,再验证我们伪造的 PAC,均验证成功后,就会按照i nclue-pac = True 时的情况正常进行 kerberos 流程
- 最后返回给我们一个正常的声明为域管的合法 TGT
- 注入票据即可
利用
- 基于 MS14-068 制作TGT票据
- 使用 mimikatz 导入票据
mimikatz.exe "kerberos::ptc TGT_eviluser@testlab.com.ccache” exit
- 访问目标 c 盘目录