揭秘Active Directory站点:枚举与攻击技术深度解析

本文深入探讨了Active Directory站点的攻击向量,详细介绍了如何利用站点ACL和GPO链接进行权限提升和域内横向移动,并展示了相关工具的实际利用方法。

Site Unseen: Enumerating and Attacking Active Directory Sites

Active Directory站点是一项用于优化AD内部环境中网络性能和带宽使用的功能。通常由跨多个国家或大陆的大型地理分散组织实施。 相较于其他基于ACL的攻击向量,Active Directory站点在攻击性研究社区中并未受到太多关注。本文旨在证明,不仅存在针对Active Directory站点的攻击向量,而且这些向量可能导致有影响的权限提升场景和域(或多个域)的沦陷。

我们将描述我们向BloodHound项目提交的一个拉取请求,以枚举站点ACL攻击路径,以及如何使用我们最近发布的、与基于GPO的攻击向量相关的工具来高效利用这些路径。所述沦陷场景可能允许攻击者提升其权限,并在Active Directory林内横向移动。

引言

站点与Active Directory环境的物理表示相关联,而非与其身份侧相关联。因此,研究社区可能从安全角度认为其不太有趣,并将其降级为一种情境性、生产相关/功能性、不提供真正攻击机会的特性。

虽然并非所有组织都依赖Active Directory站点进行网络分布是事实,但本文旨在证明,当它们存在时,基于站点的ACL攻击向量可能相当强大,并导致一个或几个域的沦陷。因此,站点可以被视为关键基础设施组件,值得包含在流行的攻击路径可视化工具(如BloodHound)中。

本文还将描述一种有文档记载但鲜为人知的、依赖站点的利用技术。利用此类向量可能允许攻击者在林中横向移动,而不受任何SID过滤配置的阻碍。我们将展示如何具体利用它,利用我们几个月前发布的近期GPO攻击工具。

1. Active Directory站点基础

第一部分将阐明Active Directory站点的确切含义,以及它们如何具体在Active Directory中实现。如果您熟悉这些概念,可以跳过。

如上文简要提到,Active Directory站点完全是关于网络效率和带宽使用优化。站点是分配了高度连接子网的对象——这些子网中的所有对象(计算机以及连接到这些计算机的用户)都是站点的一部分。站点将来自分组子网的资源关联起来,主要用于两个目的:

  • 复制。在Active Directory中,当对特定域控制器应用更改时,其他域控制器(对于域数据来自同一域,对于模式和配置分区则跨林——详见第5部分)需要复制它。有两种类型的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容器中(更多细节见第5部分)。

可以从“站点和服务”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),因为这些权限是可利用的(更多内容见下一部分)。
  • 将GPO到站点的GPLink边缘集成,以枚举GPO何时影响站点(使得控制此类GPO更加有趣)。

以下截图代表了拉取请求的预览。请注意,这仅用于提供信息。实际实现当然取决于BloodHound团队执行的拉取请求审查。如果拉取请求通过,视觉表示和实现可能会有所不同。

4. 利用站点进行“GPO风格”的权限提升和域沦陷

现在覆盖了枚举部分,下一节将具体描述可能影响站点对象的不同利用场景,以及如何利用它们。

a. 控制链接到站点的GPO

第一种利用场景是最直接的,发生在用户对链接到站点的组策略对象拥有任何类型的写入权限时。在这种情况下,该用户可能会向站点链接的GPO中注入恶意配置,并危及与该站点关联的任何(或所有)对象。

对于本节的其余部分,演示将在以下环境中进行。一家公司拥有一个Active Directory林,根域为corp.com。它有三个站点:默认的Default-First-Site-Name站点(用于组织在巴黎的主要办公室),以及其区域办事处的NewYork和Sidney站点。

让我们假设攻击者已攻陷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文件描述。虽然支持各种配置,但我们将通过注入一个简单的即时计划任务到GPO中,将我们控制的adove用户添加到本地管理员组。请注意,我们还通过使用计算机名称过滤器仅针对AD01-DC域控制器,因为我们不希望站点中的所有计算机都执行我们的任务。

现在可以简单地使用gpo inject命令将描述的配置注入到目标GPO中。

剩下要做的就是等待目标域控制器应用恶意计划任务,并将adove用户添加到本地管理员组——即corp.com域的域管理员组。域控制器的GPO刷新每5分钟发生一次,之后可以通过连接到管理共享C$来验证我们的用户确实是域控制器的本地管理员。

然后可以使用gpo clean命令使用GroupPolicyBackdoor.py删除注入的配置,以删除利用痕迹。

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接受一个配置文件。OUned.py最近被修改为接受模块文件作为输入,其格式与GroupPolicyBackdoor使用的格式相同。所述文件(此处为ImmediateTask_create_computer.ini)描述了将作为漏洞利用一部分交付给目标对象的恶意配置。在本例中,文件将再次是一个简单的即时任务,将受控的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账户执行命令。

请注意,所描述的攻击向量不受任何与SID过滤相关的强化措施的阻碍。

攻击起作用的一个先决条件是,通过站点定位的域控制器应至少与已攻陷域的一个域控制器具有网络连接。确实,恶意GPO通常将托管在已攻陷的域中;获取它因此需要从目标域控制器到已攻陷域控制器的LDAP和SMB流量。这个先决条件在绝大多数情况下都会得到满足。确实,如果已攻陷和目标域控制器位于同一站点,站点内复制要求域控制器彼此通信。类似地,如果已攻陷和目标域在相邻站点(通过站点链接直接链接的站点)中放置域控制器,通常至少一台已攻陷域控制器应可被目标站点的一台服务器访问(即所谓的“桥头服务器”)。对于网络未完全路由,且复制通过可传递站点链接执行的情况,此先决条件可能无法满足。然而,始终可以跨站点链接移动并攻陷与目标站点链接的站点,以便最终转向它。

b. 实践

与基于GPO的攻击向量通常的情况一样,描述本技术的文章可能不总是提供关于如何利用它的端到端实践演示。本节旨在描述如何具体执行利用,使用GroupPolicyBackdoor.py。

为了说明目的,我们将考虑一个Active Directory林,其根域为corp.com。此域有一个子域dev.corp.com。该林只有一个站点,默认的Default-First-Site-Name,其中包含林的所有资产。攻击者已攻陷dev.corp.com子域,并希望从那里攻陷林的根域corp.com。攻击者控制devadm用户,并且是dev.corp.com的域管理员。

执行攻击需要两个步骤。首先,应在已攻陷的域上创建恶意GPO(也可以向现有GPO中注入恶意配置)。这可以使用GroupPolicyBackdoor.py的gpo create命令实现。在这里,我们将创建一个名为LATERAL的GPO。

一旦创建了GPO,就可以向其注入恶意配置。与往常一样,为了简单起见,我们将注入一个即时任务,将来自子域的受控用户devadm添加到本地管理员组。将针对AD01-DC机器(corp.com的域控制器)。

恶意GPO已准备就绪,其GUID为4F594057-88EC-4C8C-9FC9-A167B0A75242。攻击者现在需要将其链接到Default-First-Site-Name站点。为此,如上节所述,有必要以dev.corp.com域控制器的SYSTEM身份执行命令。有几种方法可以做到这一点。最直接的方法是使用计划任务。虽然例如可以使用impacket套件中的atexec.py实用程序,但如果目标机器上安装了EDR,这可能不是最佳解决方案。让我们继续利用GPO:我们将向子域的默认域控制器策略注入一个计划任务,该任务将以SYSTEM身份运行,并使用powershell cmdlet将恶意GPO链接到站点。

现在,剩下要做的就是等待。最多5分钟后,修改后的默认域控制器策略GPO将使DEV01-DC的SYSTEM账户执行链接操作。Default-First-Site-Name站点的gPLink值将使用额外的恶意GPO LATERAL进行更新。

配置分区的复制然后在5分钟后发生(因为我们在与目标相同的站点中)。最后,又5分钟后,AD01-DC机器执行恶意GPO LATERAL,将devadm用户添加到本地管理员组,即corp.com的域管理员。

为了验证这一点,可以连接到AD01-DC的管理共享C$。

与往常一样,可以使用GroupPolicyBackdoor.py清理注入的配置并删除创建的GPO。

结论

涉及Active Directory站点的攻击路径可能不是最常见的,也不是最方便利用的。然而,当它们确实存在时,它们可能相当关键,因为它们可能导致完全域(或多个域)的沦陷。

从防御角度来看,定期审查分配给Active Directory站点对象的ACL可能很重要。如果您的组织出于管理目的委托站点相关权利,则尤其如此。此外,可以创建与基于GPO的攻击向量相关的工件的检测规则,例如GPO修改、创建或敏感容器gPLink属性的更改。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计