深入解析 Active Directory 站点攻击与枚举技术
Site Unseen: 枚举和攻击 Active Directory 站点
Active Directory 站点是一项用于优化 AD 内部环境中网络性能和带宽使用量的功能,通常由跨多个国家或地区的大型组织实施。
相较于其他基于 ACL 的攻击向量,Active Directory 站点在攻击研究社区中未受到足够关注。本文旨在证明针对 Active Directory 站点的攻击向量不仅存在,而且可能导致严重的权限提升场景和域环境沦陷。
我们将描述提交给 BloodHound 项目的拉取请求,用于枚举站点 ACL 攻击路径,并展示如何利用近期发布的 GPO 攻击工具高效利用这些路径。这些攻击场景可能允许攻击者提升权限并在 Active Directory 林内横向移动。
目录
引言
Active Directory 站点基础
为何关注站点安全?
站点枚举:将 Active Directory 站点集成到 BloodHound
利用站点实现"GPO 风格"的权限提升和域沦陷
滥用 Active Directory 站点进行林内横向移动
结论
引言
站点与 Active Directory 环境的物理表示相关联,而非身份层面。因此,研究社区可能认为从安全角度来看它们不太有趣,并将其视为情境性、生产相关/功能性特征,不提供真正的攻击机会。
虽然并非所有组织都依赖 Active Directory 站点进行网络分发,但本文旨在证明,当站点存在时,基于站点的 ACL 攻击向量可能相当强大,并导致一个或多个域沦陷。因此,站点应被视为关键基础设施组件,值得包含在流行的攻击路径可视化工具(如 BloodHound)中。
本文还将描述一种依赖站点的有文档记录但较少为人知的利用技术。这种向量的利用可能允许攻击者在林内横向移动,而不受任何 SID 过滤配置的阻碍。我们将展示如何具体利用它,利用几个月前发布的 GPO 攻击工具。
1. Active Directory 站点基础
本节将阐明 Active Directory 站点的具体定义及其在 Active Directory 中的实际实现方式。
如上文简要提及,Active Directory 站点主要关注网络效率和带宽使用优化。站点是与高度连接子网关联的对象——这些子网中的所有对象(计算机以及连接到这些计算机的用户)都是站点的一部分。站点将分组子网中的资源关联起来,主要有两个目的:
复制:在 Active Directory 中,当对特定域控制器应用更改时,其他域控制器(同一域的域数据,以及跨林的架构和配置分区)需要复制它。Active Directory 复制有两种类型:站点内复制和站点间复制。由于单个站点内的资源可以快速通信,站点内复制默认定期执行(每 5 分钟)。由于站点间复制在网络方面要求更高,带宽被压缩,Active Directory 允许管理员通过站点链接定义复制设置(默认 180 分钟)。
身份验证:站点应分配一个或多个服务器,这些服务器不过是负责该站点的域控制器。属于站点的对象将优先选择配置为站点服务器的域控制器。
默认情况下,林中只存在一个站点(名为 Default-First-Site-Name)。在创建另一个站点之前,所有对象都自动分配到此站点,所有复制都在站点内执行。如果管理员希望添加另一个站点,必须配置它并分配站点链接。站点链接允许在两个站点之间进行复制,并定义复制设置(例如复制计划)。默认情况下,站点链接是可传递的,这意味着如果站点 A 链接到站点 B,站点 A 链接到站点 C,则站点 B 通过传递性链接到站点 C。这是通过站点桥自动完成的,如果管理员未显式禁用站点链接的传递属性。
完全可能由于配置错误而存在孤立站点,彼此未链接。这显然可能导致环境中的严重问题,因为复制过程不会发生,导致域控制器数据之间的差异。
最后,重要的是要提到 Active Directory 站点与域分区没有任何关联。一个站点可能包含来自林中各种不同域的客户端和域控制器。这就是为什么 Active Directory 域处理内部网络资源的逻辑分段,而站点构成环境的物理、地理表示。
更具体地说,站点、子网和站点链接都是位于配置命名上下文中的 LDAP 对象,该上下文在林范围内复制——在 CN=Sites,CN=Configuration,DC=corp,DC=com 容器中。
可以从站点和服务 Active Directory GUI 管理站点。
2. 为何关注?
既然 Active Directory 站点背后的概念更清晰了,从攻击角度来看,我们为什么应该关注它?特别是如果站点仅用于网络效率目的分组对象?
事实证明,可以将组策略对象(GPO)分配给 Active Directory 站点。站点对象具有 gPLink 属性,描述站点关联的所有对象将应用的 GPO。这是有道理的,因为某些特定位置的配置可能需要通过站点应用(防火墙规则、浏览器收藏夹、视觉标识等)。但这也为基于 GPO 的攻击向量提供了有趣的机会。
确实,如果攻击者能够以某种方式将恶意 GPO 链接到站点,或毒化已链接到它的 GPO,他们可能危害站点的所有对象,包括充当站点服务器的域控制器。
几种基于 ACL 的攻击路径可能实现这种场景,这就是为什么 Active Directory 站点 ACL 应被视为有趣的——甚至在枚举 Active Directory 环境时可能是关键的。
3. 站点枚举:将 Active Directory 站点集成到 BloodHound
我们观察到,与站点在 Active Directory 攻击研究中的低普及度一致,目前似乎没有工具收集和枚举站点 ACL 以突出潜在的高影响攻击路径。更具体地说,用于 Active Directory 攻击路径枚举和可视化的 BloodHound 工具尚未包含此类数据。
尽管影响站点的危险 ACL 可能不像与其他更常见对象类型相关的错误配置那样频繁,但由于它们可能具有的高潜在影响,在存在时捕获它们很重要。这就是为什么我们刚刚向 SharpHound、SharpHoundCommon 库以及 BloodHound 项目提交了拉取请求。这些拉取请求实现了以下功能:
从 Active Directory 环境枚举数据时收集有关站点、站点服务器和站点子网的数据。
通过将每个站点与相关服务器和子网对象关联,在 BloodHound 界面中表示站点数据。
将站点添加到默认高价值目标,因为对站点的控制可能导致与站点关联的所有对象(包括至少一个充当站点服务器的域控制器)的潜在危害。
创建针对站点对象的控制边缘(GenericAll、GenericWrite、WriteGPLink),因为这些权限是可利用的(更多内容见下一部分)。
从组策略对象到站点集成 GPLink 边缘,以枚举 GPO 何时影响站点(使得对此类 GPO 的控制更加有趣)。
以下屏幕截图表示拉取请求的预览。请注意,这仅用于信息目的。实际实现当然取决于 BloodHound 团队执行的拉取请求审查。如果拉取请求通过,视觉表示和实现可能会有所不同。
4. 利用站点实现"GPO 风格"的权限提升和域沦陷
现在覆盖了枚举部分,下一节将具体描述可能影响站点对象的不同利用场景,以及如何利用它们。
a. 控制链接到站点的 GPO
第一个利用场景是最直接的,发生在用户对链接到站点的组策略对象具有任何类型的写入权限时。在这种情况下,所述用户可能将恶意配置注入到站点链接的 GPO 中,并危害与站点关联的任何(或所有)对象。
对于本节的其余部分,演示将考虑以下环境。一家公司有一个 Active Directory 林,根域为 corp.com。它有三个站点:默认的 Default-First-Site-Name 站点(用于组织在巴黎的主要办公室),以及用于其区域办公室的 NewYork 和 Sydney 站点。
假设攻击者危害了 adove 用户,该用户控制 Paris_Servers_Firewall_Rules GPO。此 GPO 链接到 Default-First-Site-Name 默认站点,该站点有一个服务器,来自 corp.com 根域的 AD01-DC。
这可以通过将恶意配置注入 Paris_Servers_Firewall_Rules GPO 来利用,并等待 AD01-DC 域控制器应用它以危害 DC 的域。
为此,可以使用最近发布的 GroupPolicyBackdoor.py 工具。它提供了一个稳定的 Python GPO 操作利用框架。项目的 wiki 详细描述了工具的工作原理,并提供了命令示例。简而言之,希望注入目标 GPO 的配置由 ini 文件描述。虽然支持各种配置(参见 modules_templates 目录),但我们将向 GPO 注入一个简单的即时计划任务,将我们控制的 adove 用户添加到本地管理员组。请注意,我们还通过使用计算机名称过滤器仅针对 AD01-DC 域控制器,因为我们不希望站点中的所有计算机执行我们的任务。
然后可以简单地使用 gpo inject 命令将描述的配置注入目标 GPO。
剩下要做的就是等待目标域控制器应用恶意计划任务,并将 adove 用户添加到本地管理员组——意味着 corp.com 域的域管理员组。域控制器的 GPO 刷新每 5 分钟发生一次,之后可以通过连接到管理共享 C$来验证我们的用户确实是域控制器的本地管理员。
然后可以使用 GroupPolicyBackdoor.py 通过 gpo clean 命令移除注入的配置,以移除利用痕迹。
b. 利用对站点的 GenericAll、GenericWrite 或 WriteGPLink 权限
第二个利用场景发生在用户对站点具有 GenericAll、GenericWrite 或 WriteGPLink 权限时。这可能由于嵌套组成员资格或配置失误而发生,这些在 Active Directory 环境中常见。但这也可能源于故意的管理选择。确实,Active Directory 明确允许管理员委派管理站点的组策略链接的能力。
GenericAll、GenericWrite 和 WriteGPLink ACL 都允许从攻击者角度做一件有趣的事情:改变站点的 gPLink 属性。
gPLink 属性是一个 LDAP 属性,指示哪个 GPO 链接到容器(域、组织单位或,在我们的案例中,站点)。有了修改 gPLink 值的能力,攻击者可能欺骗链接到目标容器的对象应用恶意 GPO。这可以通过两种方式实现。
第一种方式是最直接的。如果攻击者控制域中的任何 GPO,他们将能够将恶意配置注入其中,然后利用其 GenericAll、GenericWrite 或 WriteGPLink 权限将其链接到目标站点。再次,这可以使用 GroupPolicyBackdoor.py 工具执行。将恶意配置注入 GPO 所需的命令与上述相同。然后可以使用 links link 命令执行链接改变的 GPO。
如果攻击者没有对 GPO 的控制,GenericAll、GenericWrite 或 WriteGPLink ACL 仍然可以在有限先决条件下被滥用。所涉及的技术首次由 Petros Koutroumpis 在其伟大的研究"OU having a laugh"中描述。我们后来在此基础上演示了该技术如何用于危害组织单位中的受保护对象或利用有限 OU 权利。我们还发布了一个自动化攻击的工具,OUned.py。
攻击背后的原则在 Petros Koutroumpis 的文章以及我们的文章中详细解释。我们不会再次详细讨论它。攻击的核心原则是向目标容器(这里,站点)的 gPLink 属性添加一个 GPO 链接。此 GPO 链接指向解析为攻击者控制下的机器的 DNS 名称。
与站点关联的对象然后将尝试在攻击者的机器上获取 GPO,该机器将模拟有效的组策略容器(LDAP)以及有效的组策略模板(SMB)以提供客户端尝试应用的恶意 GPO,从而危害所述客户端。
以下是使用 OUned.py 的快速演示。假设 aacre 用户对 NewYork 站点具有 WriteGPLink 权限,该站点有 AD01-DC2 站点服务器作为 corp.com 的域控制器。
OUned.py 接受配置文件。所述文件描述了将作为漏洞利用的一部分传递给目标对象的恶意配置。在当前情况下,文件将再次是一个简单的即时任务,将受控的 aacre 用户添加到本地管理员组,即 NewYork 站点的域控制器的域管理员组。请注意,我们仅通过定义过滤器针对域控制器;如果您不希望站点的所有对象应用您的恶意配置,这可能很重要。
让我们使用定义的配置启动 OUned.py。OUned 毒化站点的 gPLink 属性,然后等待与 NewYork 站点关联的对象更新其 GPO。它只会将恶意即时任务传递给站点的服务器 AD01-DC2。
最多 5 分钟后,AD01-DC2 域控制器尝试刷新其 GPO,并将尝试应用恶意 GPO。通过 OUned.py 工具的漏洞利用模拟有效的 GPC 以及有效的 GPT,并提供恶意 GPO。完成后,可以按 CTRL+C 触发清理操作(主要是恢复站点的 gPLink 属性)。
最后,我们可以验证 aacre 用户现在是 AD01-DC2 域控制器的本地管理员——意味着 corp.com 域被危害。
5. 滥用 Active Directory 站点进行林内横向移动
最后一部分描述了另一个涉及 Active Directory 站点的有趣攻击向量,这次用于横向移动。更具体地说,这种技术允许已危害林中一个域的攻击者危害林中的其他域,无论 SID 过滤配置如何。
这种技术在 Jonas Bülow Knudsen、Martin Sohn Christensen 和 Tobias Thorbjørn Munch Torp 的广泛研究"SID filter as security boundary between domains?"中得到了很好的描述。这项研究由 7 篇文章组成,描述了各种林内和林间横向移动技术。我们感兴趣的在第 4 部分中描述。
本节的目标是尝试使这种技术更广为人知,并展示可以使用 GroupPolicyBackdoor.py 以相当实用的方式利用它。
a. 攻击理论
本文前面提到,站点相关对象位于 LDAP 目录的配置命名上下文中。
命名上下文,也称为目录分区,指定中央目录的特定部分,具有独立的复制范围和时间安排数据。默认情况下,Active Directory 实现三个不同的分区:
架构分区:中央目录的这部分充当蓝图,描述林中存在的对象及其结构。此分区在林范围内复制,意味着林中的每个域控制器都有架构分区的相同副本,即使它们来自不同的域。复制过程(站点间或站点内)确保分区在整个林中相同。
配置分区:此分区主要保存与网络拓扑和与复制相关的资产(如站点)的信息。与架构分区相同,林中的每个域控制器都有配置分区的相同版本,这些版本在它们之间复制。
域分区:域分区包含与本地域关联的目录对象,如用户和计算机。此分区在域内复制,但不与林中的其他域共享。
这里有趣的点是配置分区在整个林中复制,并且林中任何域的每个域控制器都持有此分区的可写副本。
这具体意味着已危害林中任何域(例如子域)的攻击者可以改变林的配置分区。这反过来意味着所述攻击者可以修改 AD 站点的配置。正如我们整篇文章所演示的,站点可以与组策略对象关联。因此,从他们危害的域,攻击者能够将恶意 GPO 链接到包含林中其他域的域控制器的一个或多个站点。在配置命名上下文复制后,目标域的域控制器将应用恶意 GPO,导致它们被危害。
更具体地说配置分区的权限,默认情况下以下主体对其具有写入权限:林根域的域管理员组、企业管理员和企业域控制器组,以及存储配置分区的任何域控制器的 NT AUTHORITY\SYSTEM 本地帐户。在林中根域以外的任何域上,成为域管理员不足以改变配置分区。要这样做,有必要作为域控制器的 SYSTEM 帐户执行命令。
请注意,描述的更多精彩内容 请关注我的个人公众号 公众号(办公 AI 智能小助手)对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)
公众号二维码
公众号二维码







评论