域渗透之DCShadow攻击
目录
DCShadow 攻击刨析
2018年1月24日,Benjamin Delpy(神器 Mimikatz 的作者)和 Vincent Le Toux 在 BlueHat IL 会议期间公布了针对域活动目录的一种新型攻击技术 DCShadow。
在具备域管理员权限条件下,攻击者可以创建伪造的域控制器,将预先设定的对象或对象属性复制到正在运行域服务器中。
DCSync 从域服务器复制出东西,DCShadow 是将数据复制至域服务器。
Luc Delsalle 对这种技术进行了验证和详细的描述,并就红蓝对抗中蓝队对抗此种攻击技术的缺陷和补救方法。
从 DCShadow 目前展示的功能来看,主要只能用于红蓝对抗的隐蔽后门。但是 DCShadow 第一次澄清和实现了伪造一个 DC 的最小需求合集,这个贡献非常大。以 前很多攻击方法都卡在不能伪造域服务器,例如 MS15-011 和 MS15-014 等,有了 DCShadow 的基础,相信将来会有很多新的攻击方法。
DCShadow 攻击流程
根据 Luc Delsalle 的描述,DCShadow 的攻击过程包括 3 个主要个步骤:
1、在目标域的 AD 活动目录注册一个伪造的 DC 中;
2、使伪造的 DC 被其他的 DC 认可,能够参与域复制 ;
3、强制触发域复制,将指定的新对象或修改后的对象属性同步复制到其他 DC 中;
0x01 注册伪造的DC
一台机器要想注册成为域中的一台DC服务器,需要在域的活动目录中注册一个NTDS-DSA(nTDSDSA)类对象。注册的位置为CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=adsec,DC=com,如图所示。
图中adsec.com域有3台域服务器,分别是LABDC01、RESDC01及WIN2016-DC01,标红的正是我们实验环境的域服务器。我们测试的机器为Win7X86cn04,测试成功的则会生成一个新的NTDS-DSA(nTDSDSA)类对象,如下图所示。这里需要说明的是,工具本身测试成功后,不会留下这些,这里为了表述更清晰,对工具源码稍作了改动,将注册的结果保留了下来,以便大家分析。
需要注意的是,不能通过LDAP协议创建nTDSDSA对象,而是RPC方法。
查看CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=adsec,DC=com的安全描述符,可知必须有域管理员权限才具备写权限,如下图。所以发动DCShadow攻击首先必须具备域管理员权限。
不过普通域用户如果被赋予了完全权限,则普通用户也可以进行修改
0x02 注册的DC被其他DC认可,能够参与域复制
个刚注册的DC要想被域中其他DC认可,能够参与域复制,需要满足3个条件:
这台伪造DC具备认证凭证,能认证到域,即有域内账号,可以使用机器账号,实验环境中为WIN7X86CN04$;
伪造DC能认证其他DC来访问的账号,如果我们给WIN7X86CN04$添加SPN,则可以实现这一点。关键是需要添加哪些SPN,DCShadow的一个大贡献是找到了SPN的最小合集,只需要2个即可:DRS服务(GUID为E3514235–4B06–11D1-AB04–00C04FC2DCD2)和GS(Global Catalog)服务,如下图。
运行DRS服务,最少需要实现IDL_DRSBind、IDL_DRSUnbind、IDL_DRSGetNCChanges、IDL_DRSUpdateRefs这4个RPC接口,以便其他DC能够通过RPC获取需要复制的数据。Mimikatz工具的最新版已经集成了这4个接口。
信任新的域控制器
如前文所述,DCShadow攻击需要在Configuration区中添加新的nTDSDSA对象,以将其注册为复制过程中的新成员。然而,单单添加这个对象并不足以让我们的恶意服务器启动复制过程。实际上,为了成为复制过程的一员,我们需要满足两个前提条件:
1、被其他服务器信任,也就是说我们需要拥有有效的身份认证凭据。
2、支持身份认证,以便需要复制数据时其他DC能够连接到我们的恶意服务器。
恶意服务器可以通过有效的计算机账户成为可信的AD服务器。Kerberos SPN属性可以为其他DC提供身份认证支持。因此,每个nTDSDSA对象会通过serverReference属性链接到computer对象。
虽然理论上我们有可能使用用户账户完成这个任务,但使用计算机账户貌似更加方便,也更为隐蔽。事实上,利用这种方法我们可以实现服务器在DNS环境中的自动注册(这样其他DC就可以定位到我们的资源)、自动设置所需的属性以及自动管理身份认证秘钥。
这样一来,DCShadow就可以使用合法的计算机账户通过其他DC的身份认证。虽然computer对象以及nTDSDSA对象同样可以帮我们通过其他DC的身份认证,但我们还是需要让其他DC连接到恶意服务器,从该服务器上复制恶意信息。
我们可以使用Kerveros Service Principal Name(SPN,服务主体名称)来满足最后一个条件。许多文章中已经介绍过SPN方面的内容,Kerberos服务(KDC)需要使用SPN所关联的计算机账户来加密Kerberos票据。对我们而言,DCShadow可以在合法的computer对象上添加SPN,以通过身份认证。
在这方面工作上,Benjamin Delpy以及Vincent Le Toux发挥了非常关键的作用,他们找到了复制过程中所需的最小SPN集合。根据他们的研究成果,我们只需要两个SPN就可以让其他DC连接到恶意服务器:
1、DRS服务类(非常有名的GUID:E3514235–4B06–11D1-AB04–00C04FC2DCD2);
2、Global Catalog服务类(包含“GC”字符串)。
比如,我们的恶意服务器(在alsid.corp域中DSA GUID为8515DDE8–1CE8–44E5–9C34–8A187C454208的roguedc)所需的两个SPN如下所示:
发起攻击时,DCShadow会将这两个SPN设置为目标计算机账户。
0x03 注入恶意对象
根据 MS-DRSR规范中的描述,为了提供恶意数据,恶意域控制器必须实现某些RPC函数,即:IDL_DRSBind、IDL_DRSUnbind、IDL_DRSGetNCChanges以及IDL_DRSUpdateRefs。微软在公开规范文档中提供了这类IDL函数,现在Benjamin Delpy开发的Mimikatz工具中已经集成了这些函数。
DCShadow攻击的最后一个步骤就是启动复制过程。为了完成这一任务,我们可以采用如下两种策略:
1、等待其他DC上的KCC进程来启动复制过程(需要15分钟的延迟);
2、调用DRSReplicaAdd RPC函数启动复制过程。这样可以修改repsTo属性的内容,马上启动数据复制过程。
使用IDL_DRSReplicaAdd RPC发起复制过程是DCShadow攻击的最后一个步骤,这样我们就可以将任意数据注入到目标AD基础架构中。完成该任务后,想在域环境中添加任何后门就易如反掌(比如在管理员组中添加新成员,或者在可控用户账户上设置SID历史记录)。
0x04 整体过程
DCShadow整体攻击过程如下图所示
DCShadow攻击与利用
一、原理
我们知道可以利用Mimikatz远程从DC中复制数据,即Dcsync; 类似的dcshadow可以伪装成DC,让正常DC通过伪造的DC中复制数据。
步骤
1、通过dcshadow更改配置架构和注册SPN值,将我们的服务器注册为Active Directory中的DC
2、在我们伪造的DC上更改数据,并利用域复制将数据同步到正常DC上。
二:实验环境
测试环境:Dc机器2008r2 x64、伪装机器:win7 x64
准备条件:
我们获得了win7 管理员权限。
我们需要域管理员权限的用户。
1、在win7 中利用psexec 调用cmd:
此时我们已经在win7机器上打开了Mimikatz。
2、我们获得了域管用户,在win7 中利用psexec 调用cmd即可:
此时我们已经以域管理员的身份打开了Mimikatz。
利用方式一(修改数据):
在win7机器上执行:
lsadump::dcshadow /object:CN=dc,CN=Users,DC=seven,DC=com /attribute:description /value:“anquanke-test2018!!”
此时我们在win7上伪造了DC并修改了数据
接着我们在域管理员身份的cmd窗口运行:
lsadump::dcshadow /push
此时我们在域控执行了域复制。
在dc2008上查看结果:
利用方式二(添加域管):
在win7机器上执行:
lsadump::dcshadow /object:CN=dc,CN=Users,DC=seven,DC=com /attribute:primarygroupid/value:512
这一步我们在win7伪造了DC,并添加了一个域管理员用户。
接着我们在域管理员身份的cmd窗口运行:
lsadump::dcshadow /push
执行域复制后成功添加域管如下图:
利用方式三(添加sidhistory 后门):
利用条件:我们需要知道域管administrator sid
域管cmd窗口运行查看administrator sid:
whoami /all
接着在win7机器上执行:
lsadump::dcshadow /object:CN=dc,CN=Users,DC=seven,DC=com /attribute:sidhistory /value:S-1-5-21-1900941692-2128706383-2830697502-500
这一步我们在win7伪造了DC,并添加了一个sidhistory 后门。
接着我们在域管理员身份的cmd窗口运行:
lsadump::dcshadow /push
执行域复制成功添加sidhistory 后门。
使用dc用户建立ipc链接后可成功访问域控:
防御方法
本文介绍的DCShadow并不是漏洞,而是将非法数据注入AD基础架构的一种新型方法。不具备高权限的攻击者无法使用该方法来提升权限,也无法获取目标AD的管理访问权限。我们需要明确的一条底线是:如果我们的AD环境已经正确配置过并且处于安全状态,那么我们不需要采取任何紧急行动来进一步防护。面对DCShadow技术,我们不需要打上紧急补丁,也不需要应用特殊配置,这一点与WannaCry/NotPetya事件响应处置过程有所不同。由于DCShadow不是漏洞,因此微软也不会发布更新来封堵该方法。如果想对付这种技术则需要改变AD的现有工作方式,这样一来也会给系统运行带来不便。高权限的攻击者可以借助该方法悄悄发起攻击,因此我们应该更新检测策略来检测这种攻击。传统的事件日志分析方法可能无法检测到DCShadow攻击活动,为了有效检测这类行为,我们需要持续监视AD数据库,隔离非法的更改操作。