Kerberos 委派攻击原理之 S4U2 利用详解
为了更好地防止约束委派的滥用,请查看"从 Kekeo 到 Rubeus"文章中的"s4u"部分。
几周前,我和同事李 · 克里斯滕森(在他的帮助下我完成了这篇文章和相关材料)花了一些时间深入研究了活动目录的 S4U2Self 和 S4U2Proxy 协议扩展。 就在最近,本杰明 · 德尔皮 和 Ben Campbell在推特上就同一话题进行了一次有趣的公开对话。 对话的结果是本杰明发布了一个修改过的 Kekeo,使得滥用 S4U 错误配置更为容易。 在我写这篇文章的时候,Ben 还发表了一篇关于这个话题的优秀文章,每个人在继续阅读本文之前都应该读一读他的文章。 说真的,读者们真的应该先去看看 Ben 的文章。
李和我想写出我们对这项技术的理解,以及在交战中如何滥用任何错误配置。 其中一部分内容将与 Ben 的文章重叠,但是我们已经合并了一些不同的方面,我们认为至少可以增加一些价值。 Ben 还介绍了 Linux 方面的漏洞利用,我们在本文中不会涉及到这一点。
这个问题的核心是特权委派——允许一个用户在活动目录中假冒成另一个用户。 这种委派(当前)有两种形式: 无约束和有约束的委派。 如果你不关心技术细节,请直接跳到滥用 S4U 部分。
无约束委派
【网络安全学习资料】
假设你有一个服务器(或服务帐户) ,由于某种原因需要假冒为另一个用户。 一个常见的场景是,当用户使用 Kerberos 或其他协议向 Web 服务器进行身份验证时,服务器希望与 SQL 后端进行良好的集成。 活动目录提供了两种实现此目的的通用方法: 约束委派和无约束委派。
在 Windows 2000中,无约束委派曾经是唯一可用的选项,并且后来保留了这个功能(可能是出于向后兼容的原因)。 我们只简单介绍一下这种委派类型,因为 Sean Metcalf 有一篇很棒的文章深入介绍了这种委派类型。 在那篇文章中 Sean 说,"当 Kerberos 无约束委派在服务器上启用,服务器托管了在 TGS-REQ (步骤3)中引用的服务主体名称中指定的服务时,DC 域控制器将用户 TGT 的一个副本放到服务票证中。 当向服务器提供用户的服务票证(TGS)以进行服务访问时,服务器打开 TGS 并将用户的 TGT 放入 LSASS 中供后续使用。 此时,应用程序服务器就可以无限制地假冒该用户!” .
下面是来自微软官方对于该协议的图形概述:
Tl;dr: TGT 将被塞入内存,攻击者可以在以下情况下提取和重用 TGT :
你可以攻击具有无约束委派设置的服务器。
你可以欺骗未启用"帐户是敏感的,不能委派"设置的域用户(见下面的“保护措施”章节) ,以连接到计算机上的任何服务。 包括单击 \SERVER\Share。
这允许攻击者假冒该用户到域上的任何服务或计算机! 很明显这种情况比较糟糕。 相比之下,如果不启用无约束委派,则只会提交一个没有填充 TGT 的普通服务票证,这样攻击者就不会获得额外的横向扩展的优势。
如何判断哪些机器具有无约束委派设置? 这实际上非常简单: 搜索任何具有 userAccountControl 属性的机器,该属性包含 ADS_UF_TRUSTED_FOR_DELEGATION。 你可以使用 LDAP 过滤器‘(userAccountControl:1.2.840.113556.1.4.803:=524288)’,这是 PowerView 的 Get-DomainComputer 函数在传递 -Unconstrained 标志时所做的:
约束委派
【