Active Directory中获取域管理员权限的攻击方法

2022-01-24 16:18:21 浏览数 (1)

攻击者可以通过多种方式获得 Active Directory 中的域管理员权限。这篇文章旨在描述一些当前使用的比较流行的。此处描述的技术“假设破坏”,即攻击者已经在内部系统上站稳脚跟并获得了域用户凭据(也称为后利用)。

对于大多数企业来说,不幸的现实是,攻击者从域用户到域管理员通常不需要很长时间。捍卫者心中的问题是“这是怎么发生的?”。

攻击通常从向一个或多个用户发送鱼叉式网络钓鱼电子邮件开始,使攻击者能够让他们的代码在目标网络内的计算机上运行。一旦攻击者的代码在企业内部运行,第一步就是执行侦察以发现有用的资源来升级权限、持久化,当然还有掠夺信息(通常是组织的“皇冠上的宝石”)。

虽然整个过程细节各不相同,但总体主题仍然存在:

  • 恶意软件注入(Spear-Phish、Web Exploits 等)
  • 侦察(内部)
  • 凭证盗窃
  • 剥削和特权升级
  • 数据访问和泄露
  • 持久性(保留访问)

我们从攻击者在企业内部站稳脚跟开始,因为这在现代网络中通常并不困难。此外,攻击者通常也不难从拥有工作站的用户权限升级到拥有本地管理员权限。这种升级可以通过利用系统上未修补的权限升级漏洞或更频繁地在 SYSVOL 中查找本地管理员密码(例如组策略首选项)来发生。

从域用户到域管理员的攻击技术:

1. SYSVOL 和组策略首选项中的密码

这种方法是最简单的,因为不需要特殊的“黑客”工具。攻击者所要做的就是打开 Windows 资源管理器并在域 SYSVOL DFS 共享中搜索 XML 文件。大多数情况下,以下 XML 文件将包含凭据:groups.xml、scheduledtasks.xml 和 Services.xml。

SYSVOL 是 Active Directory 中所有经过身份验证的用户都具有读取权限的域范围共享。SYSVOL 包含登录脚本、组策略数据和其他需要在有域控制器的任何地方可用的域范围数据(因为 SYSVOL 自动同步并在所有域控制器之间共享)。所有域组策略都存储在这里:\<DOMAIN>SYSVOL<DOMAIN>Policies

当创建一个新的 GPP 时,会在 SYSVOL 中创建一个关联的 XML 文件,其中包含相关的配置数据,如果提供了密码,它是 AES-256 位加密的,应该足够好了……

除了 2012 年之前的某个时候,微软在 MSDN 上发布了 AES 加密密钥(共享密钥),可用于解密密码。由于经过身份验证的用户(任何域用户或受信任域中的用户)对 SYSVOL 具有读取权限,因此域中的任何人都可以在 SYSVOL 共享中搜索包含“cpassword”的 XML 文件,该值是包含 AES 加密密码的值。

通过访问此 XML 文件,攻击者可以使用 AES 私钥来解密 GPP 密码。PowerSploit 函数Get-GPPPassword对于组策略偏好利用最有用。此处的屏幕截图显示了一个类似的 PowerShell 函数,它从 SYSVOL 中的 XML 文件中加密 GPP 密码。

其他文件类型也可能具有嵌入式密码(通常为明文),例如 vbs 和 bat。

您可能会认为,使用已发布的补丁程序阻止管理员将凭据放入组策略首选项中,这将不再是问题,尽管在执行客户安全评估时我仍然在 SYSVOL 中找到凭据。

减轻:

  • 在用于管理 GPO 的每台计算机上安装 KB2962486,以防止将新凭据放置在组策略首选项中。
  • 删除 SYSVOL 中包含密码的现有 GPP xml 文件。
  • 不要将密码放在所有经过身份验证的用户都可以访问的文件中。

有关此攻击方法的更多信息在帖子中进行了描述:在 SYSVOL 中查找密码并利用组策略首选项。

2.利用缺少补丁的域控制器上的MS14-068 Kerberos漏洞

自从MS14-068 被 KB3011780 修补(并且第一个公共 POC PyKEK发布)以来,已经过去了一年多。有一些检测方法可确保识别和标记利用 MS14-068 的尝试。然而,这并不意味着域控制器总是被打补丁或检测被配置。大多数组织在补丁发布后的一个月内使用KB3011780修补了他们的域控制器;但是,并非所有人都确保每个新的域控制器在升级为 DC 之前都安装了补丁。

简而言之,利用 MS14-068 只需不到 5 分钟,攻击者就可以有效地重写有效的 Kerberos TGT 身份验证票证,使其成为域管理员(和企业管理员)。如上图所示,这就像拿了一个有效的登机密码,然后在登机前在上面写上“飞行员”。然后在登机时,您被护送到驾驶舱,并在起飞前询问您是否想要咖啡。

MS14-068 的第一次公开利用是在补丁发布后 2 周,由 Sylvain Monné (@BiDOrD) 编写,名为 PyKEK。PyKEK 是一个 Python 脚本,只要它可以与未打补丁的 DC 通信,它就可以在网络上任何位置的任何支持 Python 的系统(Raspberry Pi?)上运行。最终得到一个 ccache 文件。获取 PyKEK 生成的 ccache 文件并使用 Mimikatz 将 TGT 注入内存以用作域管理员!使用此票证,可以访问 DC 上的 admin$ 共享!

缓解因素:现场修补或 Win2012/2012R2 DC 的成功有限

MS14-068利用过程:

  • 作为标准用户请求没有 PAC 的 Kerberos TGT 身份验证票证,DC 用 TGT 回复(没有通常包含组成员资格的 PAC,这是不寻常的)。
  • 生成一个没有密钥的伪造 PAC,因此生成的 PAC 使用域用户的密码数据使用 MD5 算法而不是 HMAC_MD5 进行“签名”。
  • 作为 TGS 服务票证请求的一部分,将无 PAC TGT 与伪造的 PAC 作为授权数据一起发送到 DC。
  • DC 似乎对此感到困惑,所以它丢弃了用户发送的无 PAC TGT,创建一个新的 TGT 并将伪造的 PAC 插入到自己的 Authorization-Data 中,并将此 TGT 发送给用户。
  • 此带有伪造 PAC 的 TGT 使用户能够成为易受攻击的 DC 上的域管理员。

Benjamin Delpy(Mimikatz 的作者)编写了一个名为Kekeo的 MS14-068 漏洞,它改进了 PyKEK。无论站点中是否有修补程序或 2012/2012R2 DC,它都会找到并定位易受攻击的 DC,并且可以正常工作。与 PyKEK 相同的利用路径,但在最后添加了另一个步骤,从而获得了一个有效的 TGT,该 TGT 可以提供给域中的任何 DC 以供访问。它通过使用漏洞生成的 TGT 来获得一个可以在任何地方工作的模拟 TGT 来做到这一点。

减轻:

  • 确保 DCPromo 流程在运行 DCPromo 之前包含一个补丁 QA 步骤,以检查 KB3011780 的安装。执行此检查的快速简便方法是使用 PowerShell:get-hotfix 3011780
  • 此外,实施自动化流程,确保在系统不合规时自动应用已批准的关键补丁。

3. Kerberos TGS Service Ticket离线破解(Kerberoast)

Kerberoast 可以作为普通用户从 Active Directory 中提取服务帐户凭据的有效方法,而无需向目标系统发送任何数据包。这种攻击是有效的,因为人们倾向于创建糟糕的密码。这种攻击成功的原因是大多数服务帐户密码的长度与域密码的最小值相同(通常为 10 或 12 个字符长),这意味着即使是暴力破解也不太可能花费超过密码最长密码期限(过期)。大多数服务帐户的密码都没有设置为过期,因此相同的密码可能会在数月甚至数年内有效。此外,

注意:当针对 Windows 系统托管的服务时,此攻击不会成功,因为这些服务映射到 Active Directory 中的计算机帐户,该帐户具有关联的 128 字符密码,不会很快被破解。

此攻击涉及为目标服务帐户的服务主体名称 (SPN) 请求 Kerberos 服务票证 (TGS)。此请求使用有效的域用户身份验证票证 (TGT) 为在服务器上运行的目标服务请求一个或多个服务票证。域控制器不会跟踪用户是否真正连接到这些资源(或者即使用户有权访问)。域控制器在 Active Directory 中查找 SPN 并使用与 SPN 关联的服务帐户加密票证,以便服务验证用户访问权限。请求的 Kerberos 服务票证的加密类型是 RC4_HMAC_MD5,这意味着服务帐户的 NTLM 密码哈希用于加密服务票证。

注意:获取服务票证不需要提升权限,也不会向目​​标发送流量。

减轻:

最有效的缓解这种攻击的方法是确保服务帐户密码长度超过 25 个字符。 托管服务帐户和组托管服务帐户是确保服务帐户密码长、复杂且定期更改的好方法。提供密码保管的第三方产品也是管理服务帐户密码的可靠解决方案。

有关此攻击方法的更多信息,请参阅帖子:Cracking Kerberos TGS Tickets Using Kerberoast – Exploiting Kerberos to Compromise the Active Directory Domain。

有关检测潜在 Kerberoast 活动的信息在文章“检测 Kerberoast 活动”和“检测 Kerberoast 活动第 2 部分 - 创建 Kerberoast 服务帐户蜜罐”中进行了描述

4. 凭证盗窃洗牌

我将此部分称为“凭据盗窃洗牌”(或“凭据洗牌”),因为很难简单地封装此活动。把它想象成一种舞蹈。破坏单个工作站、提升权限和转储凭据。使用转储凭据横向移动到其他工作站、提升权限并转储更多凭据。

这通常会很快导致域管理员凭据,因为大多数 Active Directory 管理员使用用户帐户登录到他们的工作站,然后使用 RunAs(将他们的管理员凭据放在本地工作站上)或 RDP 连接到服务器(可以使用键盘记录器)。

第 1 步:入侵单个工作站并利用系统上的提权漏洞获取管理权限。运行Mimikatz或类似工具以转储本地凭据和最近登录的凭据。

第 2 步:使用从第 1 步收集的本地管理员凭据尝试向其他具有管理员权限的工作站进行身份验证。这通常是成功的,因为很难正确管理本地管理员帐户密码(现在您可能应该只使用Microsoft LAPS)。如果您在许多或所有工作站上拥有相同的管理员帐户名和密码,则在一个工作站上获得帐户名和密码的知识意味着对所有工作站都具有管理员权限。连接到其他工作站并在这些工作站上转储凭据,直到获得域管理员帐户的凭据。使用本地帐户是理想的,因为使用没有登录域控制器,并且很少有组织将工作站安全日志发送到中央日志系统 (SIEM)。

第 3 步:利用被盗凭据连接到服务器以收集更多凭据。运行 Microsoft Exchange 客户端访问服务器 (CAS)、Microsoft Exchange OWA、Microsoft SQL 和终端服务 (RDP) 等应用程序的服务器往往在内存中拥有大量来自最近经过身份验证的用户(或可能具有域管理员权限的服务)的凭据。

第4步:(掠夺和)利润! 使用被盗的域管理员凭据,没有什么可以阻止攻击者转储所有域凭据并保留.

笔记:

  • 使用域管理员帐户登录计算机会将凭据放置在 LSASS(受保护的内存空间)中。对此计算机具有管理员权限(或本地系统)的人可以从 LSASS 转储凭据,并可以重复使用这些凭据。
  • 使用用户帐户登录计算机,然后使用 RunAs 输入域管理员凭据会将凭据置于 LSASS(受保护的内存空间)中。对此计算机具有管理员权限(或本地系统)的人可以从 LSASS 转储凭据,并可以重复使用这些凭据。
  • 使用用户帐户登录计算机并通过在 RDP 凭据窗口中键入域管理员凭据打开与服务器的 RDP 会话,会将域管理员凭据暴露给在系统上运行键盘记录器的任何人(这可能是先前危害用户的攻击者帐户和/或计算机)
  • 如果有服务部署到在具有域管理员权限的服务帐户的上下文下运行的所有工作站或所有服务器(或两者),则只需破坏单个系统即可破坏整个 Active Directory 域。当服务使用显式凭据启动时,凭据会加载到 LSASS 中,以便服务在这些凭据的上下文中运行。对此计算机具有管理员权限(或本地系统)的人可以从 LSASS 转储凭据,并可以重复使用这些凭据。

通常,PowerShell 是一种很好的管理方法,因为通过 PowerShell 远程处理(通过 Enter-PSSession 或 Invoke-Command)连接到远程系统是一种网络登录——没有凭据存储在远程系统的内存中。这是理想的,也是微软正在将 RDP 转向管理员模式的原因。有一种方法可以通过 PowerShell 远程处理连接到远程系统,并且能够通过 CredSSP 使用凭证。问题是 CredSSP 不安全。

Joe Bialek 在 PowerShellMagazine.com 上写了这篇文章:

管理员在使用 PowerShell 远程处理时面临的一个常见问题是“双跳”问题。管理员使用 PowerShell 远程连接到服务器 A,然后尝试从服务器 A 连接到服务器 B。不幸的是,第二次连接失败。 原因是,默认情况下,PowerShell 远程处理使用“网络登录”进行身份验证。网络登录通过向远程服务器证明您拥有用户凭证而不将凭证发送到该服务器来工作(请参阅Kerberos和NTLM身份验证)。因为远程服务器不拥有您的凭据,所以当您尝试进行第二次跃点(从服务器 A 到服务器 B)时,它会失败,因为服务器 A 没有用于向服务器 B 进行身份验证的凭据。 为了解决这个问题,PowerShell 提供了 CredSSP(凭据安全支持提供程序)选项。使用 CredSSP 时,PowerShell 将执行“网络明文登录”而不是“网络登录”。网络明文登录通过将用户的明文密码发送到远程服务器来工作。使用 CredSSP 时,服务器 A 将收到用户的明文密码,因此能够向服务器 B 进行身份验证。双跳有效!

更新:此测试是使用 Windows Server 2012 完成的。Microsoft 已对 Windows Server 2012R2 和 Windows 8.1 进行了更改,以消除将明文凭据存储在内存中的情况。这意味着运行 Mimikatz 的攻击者将不再看到您的明文凭据。攻击者仍会看到您的 NT 密码散列和 Kerberos TGT,两者都是密码等效的,可用于通过网络对您进行身份验证。 此外,即使您的明文凭据未保存在内存中,它仍会发送到远程服务器。攻击者可以在本地安全机构子系统服务 (LSASS.exe) 中注入恶意代码,并在传输过程中拦截您的密码。因此,虽然您可能再也看不到 Mimikatz 的密码,但攻击者仍然可以恢复您的密码。

所以,请不要使用 CredSSP。

类似的问题是WinRM(PowerShell 远程处理使用)中称为“AllowUnencrypted”的配置设置。将此值设置为“True”将从涉及此系统的任何 WinRM 连接中删除加密,包括 PowerShell 远程处理。

传递哈希演变为传递凭据

大多数人都听说过哈希传递 (PtH),它涉及发现与帐户关联的密码哈希(通常是 NTLM 密码哈希)。PtH 的有趣之处在于,不需要破解散列来发现相关密码,因为在 Windows 网络中,散列是用来证明身份的(帐户名和密码散列的知识是验证所需的全部内容)。Microsoft 产品和工具显然不支持传递哈希,因此需要第三方工具,例如Mimikatz。

一旦发现密码哈希,Pass-the-Hash 就会为攻击者打开许多大门,但还有其他选择。

Pass-the-Ticket (PtT)涉及获取现有的 Kerberos 票证并使用它来模拟用户。Mimikatz支持收集当前用户的 Kerberos 票证,或者为通过系统身份验证的每个用户收集所有 Kerberos 票证(如果配置了 Kerberos 无约束委派,这可能很重要)。一旦获得 Kerberos 票证,就可以使用 Mimikatz 传递它们并用于访问资源(在 Kerberos 票证生命周期内)。

OverPass-the-Hash(又名 Pass-the-Key)涉及使用获取的密码哈希来获取 Kerberos 票证。此技术清除当前用户的所有现有 Kerberos 密钥(散列),并将获取的散列注入内存以用于 Kerberos 票证请求。下次资源访问需要 Kerberos 票证时,注入的哈希(现在是内存中的 Kerberos 密钥)用于请求 Kerberos 票证。Mimikatz 提供了执行 OverPass-the-Hash 的能力。这是一种比 PtH 更隐蔽的方法,因为有多种方法可以检测 PtH。 注意:如果获取的哈希是 NTLM,则 Kerberos 票证是 RC4。如果散列是 AES,则 Kerberos 票证使用 AES。

还有其他类型的凭据盗窃,但这些是最受欢迎的:

  • Pass-the-Hash:获取哈希并用于访问资源。哈希在用户更改帐户密码之前一直有效。
  • Pass-the-Ticket:获取 Kerberos 票证并用于访问资源。票证有效期至票证有效期到期(通常为 7 天)。
  • OverPass-the-Hash:使用密码哈希获取 Kerberos 票证。哈希在用户更改帐户密码之前一直有效。

减轻:

  • 管理员应该有单独的管理员工作站来进行管理活动. 管理员帐户不应登录到执行电子邮件和网页浏览等用户活动的常规工作站。这限制了凭证被盗的机会。请注意,智能卡不能防止凭据盗窃,因为需要智能卡身份验证的帐户具有关联的密码哈希,该哈希在后台用于资源访问。智能卡仅确保对系统进行身份验证的用户拥有智能卡。一旦用于对系统进行身份验证,智能卡双因素身份验证 (2fA) 就成为一个因素,使用帐户的密码哈希(放置在内存中)。此外,一旦为智能卡身份验证配置了帐户,系统就会为该帐户生成一个新密码(并且永远不会更改)。
  • 查看域管理员、域管理员、企业管理员、架构管理员和其他自定义 AD 管理员组中的所有帐户。重新验证具有 Active Directory 管理员权限的每个帐户,以验证是否确实需要(或只是需要)完整的 AD 管理员权限。从与人类相关的帐户开始,然后专注于服务帐户。
  • 使用Microsoft LAPS之类的产品,工作站和服务器上的所有本地管理员帐户密码都应该是长的、复杂的和随机的。
  • 配置组策略以防止本地管理员帐户通过网络进行身份验证。以下示例 GPO 阻止本地帐户通过网络(包括 RDP)登录,并且完全阻止域管理员和企业管理员登录。GPO 包括以下设置:
    • 拒绝从网络访问此计算机:本地帐户、企业管理员、域管理员
    • 拒绝通过远程桌面服务登录:本地帐户、企业管理员、域管理员
    • 拒绝本地登录:企业管理员、域管理员

注意:首先使用服务器配置进行测试,因为它会破坏某些“特殊”场景(如集群)。

3. 访问 Active Directory 数据库文件 (ntds.dit)

Active Directory 数据库 (ntds.dit) 包含有关 Active Directory 域中所有对象的所有信息。此数据库中的数据被复制到域中的所有域控制器。此文件还包含所有域用户和计算机帐户的密码哈希。域控制器 (DC) 上的 ntds.dit 文件只能由可以登录到 DC 的人员访问。

显然,保护此文件至关重要,因为访问 ntds.dit 文件可能会导致整个域和林受损。

以下是获取 NTDS.dit 数据的方法(非全面)列表,无需域管理员:

备份位置(备份服务器存储、媒体和/或网络共享)

使用备份共享中的 ntds.dit 文件访问 DC 备份和后门域。确保存储 DC 备份的任何网络可访问位置都得到适当保护。只有域管理员才能访问它们。别人会吗?他们实际上是域管理员!

在升级到域控制器之前,找到在成员服务器上暂存的 NTDS.dit 文件。

IFM 与 DCPromo 一起使用以“从媒体安装”,因此被提升的服务器不需要通过网络从另一个 DC 复制域数据。IFM 集是 NTDS.dit 文件的副本,可以在共享上暂存以提升新的 DC,也可以在尚未提升的新服务器上找到它。此服务器可能未得到适当保护。

通过对虚拟化主机的管理员权限,可以克隆虚拟 DC 并离线复制相关数据。

获取对虚拟 DC 存储数据的访问权限,并有权访问域凭据。你运行 VMWare 吗?VCenter 管理员是完全管理员(DA 等同于 VMWare)。使用 VCenter 管理员权限:克隆 DC 并将数据复制到本地硬盘驱动器。 还可以在 VM 挂起时从 VM 内存中提取 LSASS 数据。不要低估您的虚拟管理员对虚拟域控制器的影响。 您的 vCenter 管理员组在 AD 中?您可能想要更改... 将适当的权限委派给适当的组,不要让攻击者能够通过服务器管理员帐户对 AD 进行后门。 您的虚拟管理员需要被视为域管理员(当您拥有虚拟 DC 时)。

破坏有权登录到域控制器的帐户。

Active Directory 中有几个组大多数人不希望拥有域控制器的默认登录权限。

这些组默认情况下能够登录到域控制器:

  • Enterprise Admins(林中每个域中域管理员组的成员)
  • 域管理员(域管理员组的成员)
  • 管理员
  • 备份运算符
  • 账户运营商
  • 打印操作员

这意味着如果攻击者可以破坏 Account Operators 或 Print Operators 中的帐户,则 Active Directory 域可能会受到破坏,因为这些组具有域控制器的登录权限。

减轻:

  • 限制有权登录到域控制器的组/帐户。
  • 限制具有完整 Active Directory 权限的组/帐户,尤其是服务帐户。
  • 保护 Active Directory 数据库 (ntds.dit) 的每个副本,并且不要将其置于信任级别低于域控制器的系统上。

那么,当一个帐户被委派给域控制器的登录权限时会发生什么?

如果该帐户在域控制器上具有管理员权限,则在 DC 上转储凭据很简单。

使用Mimikatz转储所有域凭据

Mimikatz 可用于从域控制器转储所有域凭据。

使用Mimikatz转储 LSASS 内存(获取域管理员凭据)

Mimikatz 可用于转储 LSASS,然后从不同系统上的 LSASS.dmp 文件中提取登录凭据。在域控制器上,这几乎总是会产生域管理员凭据。

使用任务管理器转储 LSASS 内存(获取域管理员凭据)

转储 LSASS 后,可以使用Mimikatz 从不同系统上的 LSASS.dmp 文件中提取登录凭据。在域控制器上,这几乎总是会产生域管理员凭据。

使用 NTDSUtil 创建从媒体安装 (IFM) 集(获取 NTDS.dit 文件)

NTDSUtil 是用于本机使用 AD DB (ntds.dit) 的命令实用程序,并且可以为 DCPromo 创建 IFM 集。IFM 与 DCPromo 一起使用以“从媒体安装”,因此被提升的服务器不需要通过网络从另一个 DC 复制域数据。IFM 集是在此实例中创建的 NTDS.dit 文件的副本,位于 c:temp

此文件可能暂存在共享中以用于推广新的 DC,或者它可能位于尚未升级的新服务器上。此服务器可能未得到适当保护。

从 NTDS.dit 文件(和注册表系统配置单元)转储 Active Directory 域凭据。

一旦攻击者拥有 NTDS.dit 文件的副本(以及用于解密数据库文件中的安全元素的某些注册表项),就可以提取 Active Directory 数据库文件中的凭据数据。

一旦攻击者从注册表和 NTDS.dit 文件中获得系统配置单元,他们就拥有所有 AD 凭据!此屏幕截图来自安装了 Impacket python 工具的 Kali 盒子。DIT 是使用 Impacket 中的 secretsdump.py python 脚本转储的。

截至 2015 年 10 月,还有一种Windows 方法利用 PowerShell 方法从 NTDS.dit 文件(和注册表系统配置单元)转储凭据,称为来自 DSInternals.com 的 Get-ADDBAccount(尽管它仅适用于 Windows 8 和 Windows Server 2012 及更高版本由于早期 Windows 版本中的错误)。

一旦攻击者转储了域数据库,就有很多选项可以持久化和保留高级权限,包括创建和使用可用于基于单个域的入侵利用整个森林的金票。

0 人点赞