DCShadow 是一种后期阶段的 kill chain 攻击,使攻击者在其特权凭据被泄露后,能够注册一个伪造的 Active Directory 域控制器(DC),并复制恶意更改,例如帮助他们建立持久性的修改。更具体地说,DCShadow 是开源黑客工具 Mimikatz 中 lsadump 模块的一条命令。它在 2018 年初引入,利用 Microsoft Directory Replication Service Remote(MS-DRSR)协议中的特定指令。
DCShadow 攻击很难防止。就像 DCSync 一样,它并不滥用可以通过补丁修复的漏洞;相反,它利用复制过程中的合法且必要的功能,而这些功能无法关闭或禁用。DCShadow 攻击同样难以检测,因为对手请求的变更会被注册、处理并作为合法的域复制来提交。
DCShadow 攻击概览
下面是 DCShadow 攻击步骤概览:
- 例如,攻击者可能会通过入侵安全性较差的组托管服务帐户(group-managed service account)来获取 Domain Admin 或 Enterprise Admin 权限。
- 攻击者使用 DCShadow,通过修改 AD 的配置架构以及工作站的 SPN,将某个计算机对象(例如工作站)注册为域控制器。现在,AD 会认为该工作站是域控制器,因此会被信任来复制更改。
- 攻击者会提交用于复制的变更,例如对密码数据、账户详细信息或安全组成员身份的更改。一旦触发复制,其他 DC 会发布并提交这些变更。
- 攻击者使用 DCShadow 将恶意(rogue)的域控制器从 AD database中移除,以掩盖其活动。
简单示例:使用 DCShadow 复制一个小的变更
假设你是攻击者,并已使用 DCShadow 注册了恶意(rogue)的域控制器。下面是你可以采取的步骤,用于在域中的所有 DC 上复制一个简单的变更。
步骤 1:切换为使用 SYSTEM 账户。
用于创建将要被复制的更改的进程,必须以 SYSTEM 帐户运行,而不是以域用户帐户运行;因为只有来自已注册 DC 的更改才会被复制。若未做到这一点,你可能会看到此错误代码:
ERROR kuhl_m_lsadump_dcshadow_force_sync_partition ; IDL_DRSReplicaAdd DC=JEFFLAB,DC=local 0x80090322 (2148074274)
在 Mimikatz 中以 SYSTEM 运行进程的一种方法是使用 PSExec:
PsExec.exe –i –s cmd.exe
要确认你现在是在 SYSTEM 下运行,请使用 whoami 命令。
然后使用 token::elevate 来确保所有线程都将以 SYSTEM 运行。
第 2 步。推送所需的更改。
现在您就可以推送更改了。以这个简单示例为例,让我们更改 Administrator 账号的描述:
lsadump::dcshadow /object:CN=Administrator,CN=Users,DC=JEFFLAB,DC=local /attribute:description /value:”DCShadow was here!”
第 3 步:触发复制。
要触发复制,请打开另一个窗口,并使用被入侵的 Domain Admin 账号(而不是 SYSTEM)运行以下命令:
lsadump::dcshadow /push
原始窗口将显示相应的事件:
第 4 步:确认更改。
转到域控制器并检查 description(说明)字段:
真实世界的攻击:使用 DCShadow 实现持久性
现在来看在真实世界的攻击中,攻击者会如何使用 DCShadow。要运行 DCShadow,他们必须已经拥有 Domain Admin 或 Enterprise Admin 权限,那么为什么还需要使用 DCShadow 呢?
一个原因是他们可能不想在数据外传(data exfiltration)时使用 Domain Admin 账户,因为这类账户通常会被密切监控,并且更容易触发告警。另一个原因是要通过 在其他林中获取管理权限。
但最常见的原因之一是创建持久性(persistence)——这样即使他们失去了对被攻破的管理员账户的访问权限,也仍能在域中保留立足点。接下来,我们来看一个可以使用 DCShadow 来实现持久性的办法。
基本流程如下:
- 查看 AdminSDHolder 对象,它为域中的受保护账户和组提供模板权限。
- 向 AdminSDHolder 添加具有“完全控制(Full Control)”权限的新账户。
- 使用 DCShadow 复制该更改。
步骤 1。查看 AdminSDHolder 对象。
要查看 AdminSDHolder 对象,我们将使用一些基础 PowerShell:
$AdminSDHolder = [adsi]'LDAP://CN=AdminSDHolder,CN=System,DC=JEFFLAB,DC=local'
$SDDL = $AdminSDHolder.ObjectSecurity.Sddl
我们可以使用 ConvertFrom-SDDLString 命令将结果转换为更易读的格式:
步骤 2:向 AdminSDHolder 容器添加一个帐户。
要创建持久性,我们必须使用其 SID 将一个帐户添加到 AdminSDHolder。我们只需要知道该对象的专有名称(distinguished name),下面的命令会将其 SID 存储到变量 $UserSid:
$UserToAdd = [adsi]'LDAP://CN=Bob Loblaw,OU=Business,OU=Users,OU=JEFFLAB,DC=JEFFLAB,DC=local'
$UserSid = New-Object System.Security.Principal.SecurityIdentifier($UserToAdd.objectSid[0], 0)
现在,我们可以使用该变量将该帐户添加到 AdminSDHolder,并授予其完全控制(Full Control)权限。将使用以下 PowerShell 命令:
$NewSDDL = $SDDL + "(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;" + $UserSid.Value + ")"
如果我们再看一遍 AdminSDHolder,现在可以看到该用户已作为最后一条记录出现:
第 3 步:使用 DCShadow 复制此更改。
既然我们已经以属性值的形式获得了新的权限,就可以使用 DCShadow 很轻松地应用它们。在以 SYSTEM 运行的情况下,可以使用以下命令来实现所需的更改:
mimikatz.exe "lsadump::dcshadow /object:CN=AdminSDHolder,CN=System,DC=JEFFLAB,DC=local /attribute:ntsecuritydescriptor /value:[output from the previous command]”
在这里,您可以看到该更改已经准备好进行复制:
然后,我们使用 lsadump::dcshadow/push 命令来触发复制。此处您可以看到已更新的 AdminSDHolder 对象,其中包含我们添加的用户;很快,它将出现在域中的每个受保护组中。
防止 DCShadow 攻击
这只是 DCShadow 可用于建立持久性或以其他方式削弱 Active Directory 安全性 的一种方式。之所以很难阻止这些攻击,是因为它们利用的是 Active Directory 的原生功能,而不是可以通过打补丁修复的漏洞。
防御的关键在于:攻击者要执行 DCShadow 攻击,必须具备 Domain Admin 或 Enterprise Admin 权限。因此,阻止该攻击的最有效策略就是防止任何人未经授权加入这些强大的安全组。
检测 DCShadow 攻击
使用 DCShadow 的一个关键优势是,攻击者可以进行不会被事件日志记录的更改——由于这些更改是通过复制完成的,因此看起来是合法的。尽管如此,你仍然可以通过事件日志找到正在发生攻击的迹象。下面是需要重点关注的关键事件。
对计算机 SPN 的更改
要让 DCShadow 工作,必须将两个特定的服务主体名称(service principal name,SPN)值添加到将用于冒充域控制器的计算机(也就是攻击者从中执行 DCShadow 的那台计算机)。这可以是任何已加入域的计算机。
这两个 SPN 分别是:
- 全局编录服务器 SPN — 其格式为 GC/<DNS 主机名>/<DNS 树林名称>.
- 目录复制服务(Directory Replication Service,DRS)SPN — 其格式为 <DRS 接口 GUID>/<DSA GUID>/<DNS 域名>,其中 <DRS 接口 GUID> 始终为 E3514235–4B06–11D1-AB04–00C04FC2DCD2。
我们可以通过观察:当一台并非域控制器的计算机上添加了这些 SPN,随后又移除这些 SPN 时,来发现 DCShadow 攻击的迹象。(注意:在我们的实验环境中,DCShadow 仅移除 Global Catalog 服务器 SPN;它会保留 DRS SPN。)
我们可以使用事件 ID 4742 来监控这些更改。该事件会显示是谁发起了更改,因此你可以知道正在用于执行攻击的“Domain Admin(域管理员)”账号是哪一个。
创建和删除 DC
DCShadow 攻击的另一一步是在 Configuration Namespace 的 Sites 容器中创建一个 DC。做法是为该服务器创建服务器条目以及 NTDS 设置。你可以在下面看到对应于我们合法的域控制器的这些对象:
DCShadow 会先创建一个 DC 及其设置,然后在更改完成复制后,立即删除相关条目以掩盖其痕迹。最终会留下一个看似奇怪的事件序列:先添加了一个新的 DC,随后又将其移除。
新增可以通过事件 ID 5137 进行跟踪。该事件包含恶意 DC(rogue DC)的名称、其 GUID 和对象类,以及负责创建它的账户:
事件 ID 5141 将在删除 DC 时显示相同的信息:
异常的 复制事件
通过监控复制也可以检测 DCShadow 攻击。不过,触发的复制事件可能难以与真实的复制事件区分。
不过,事件 ID 4929 仍然是一个有用的线索,因为它表明已移除源命名上下文,并将把 rogue DC 作为源指向。对于并非已识别的域控制器的计算机出现此事件,应引起高度警惕。
复制失败
此外,事件 4935 和 4936 的组合表明可能与 DCShadow 相关的复制失败。
Netwrix 如何提供帮助
Netwrix StealthDEFEND 是用于检测并响应 DCShadow 攻击的同类最佳解决方案:
检测
Netwrix StealthDEFEND 提供内置的 DCShadow 威胁检测。它会实时监控所有域复制与变更事件,以识别表明可能存在 DCShadow 攻击的行为。特别是,它会关注 DC 的添加和删除,并监视复制监控流量。
下面是 Netwrix StealthDEFEND 检测到新增域控制器的示例:
添加 DC 本身就足够可疑,但报告还指出该机器正在运行 Windows 10,而 Windows 10 不支持域控制器角色。通过展开事件详情,我们可以看到作为 DCShadow 攻击一部分所进行的具体更改:
响应
虽然及时检测 DCShadow 攻击至关重要,但这并不足够,尤其是因为这意味着对手已经入侵了一个高度特权的账号。然而,仅仅禁用该账号可能也不够,因为当你发现 DCShadow 攻击时,对手很可能已经掌握并正在使用一系列其他网络资源和可选方案。
Netwrix StealthDEFEND 提供丰富的自动化响应选项,帮助你轻松为每个预期的威胁或漏洞构建有效的应急预案(playbook)。在发生 DCShadow 攻击的情况下,应急预案应包含以下步骤:
- 通知组织中的相关人员:攻击已发生,并向他们提供有效响应所需的信息。Netwrix StealthDEFEND 会提供攻击的所有关键信息,包括攻击者、来源和目标。此外,它还能通过与 Slack、Microsoft Teams、ServiceNow 以及其他系统的便捷集成实现快速沟通,并可借助 PowerShell 或 webhook 功能。
- 阻止攻击者账户或工作站执行进一步的复制、身份验证或其他操作:
常见问题解答(FAQs)
DCShadow 是什么?
DCShadow 是 Mimikatz 工具中的一条命令,可让对手注册伪造的域控制器,并将恶意更改复制到整个域。
DCShadow 攻击是如何运作的?
攻击者通过修改 AD 配置架构以及工作站的 SPN 值,将自己的计算机注册为域控制器。然后他们就可以复制更改,包括用于确保其在域中持续存在的更改。
如何检测 DCShadow 攻击?
检测 DCShadow 攻击的最佳方式是使用自动化解决方案:持续监视可疑的域控制器新增,并监控复制流量是否存在异常活动。
应对 DCShadow 攻击的最佳方式是什么?
一旦检测到 DCShadow 攻击,时间至关重要。因此,最好具备自动化工作流:立即将事件上报给安全团队,并阻止该账号在域中进行任何进一步的更改。
分享到
了解更多
关于作者
Jeff Warren
首席产品官
Jeff Warren 负责监督 Netwrix 的产品组合,在安全领域的产品管理与开发方面拥有十多年的经验。在加入 Netwrix 之前,Jeff 曾在 Stealthbits Technologies 领导产品团队;他运用自己作为软件工程师的经验,开发创新且面向企业规模的安全解决方案。凭借亲力亲为的工作方式以及解决棘手安全挑战的能力,Jeff 致力于打造真正可落地、行之有效的实用解决方案。他拥有特拉华大学(University of Delaware)的信息系统(Information Systems)学士学位。