DCShadow攻击技术分析

2018年1月24日,Benjamin Delpy(神器Mimikatz的作者)和Vincent Le TouxBlueHat IL会议期间公布了针对域活动目录的一种新型攻击技术“DCShadow”。利用该技术,在具备域管理员权限条件下,攻击者可以创建伪造的域控制器,将预先设定的对象或对象属性复制到正在运行域服务器中,DCSync从域服务器复制出东西,DCShadow是将数据复制至域服务器。Luc Delsalle对这种技术进行了验证和详细的描述,并就红蓝对抗中蓝队对抗此种攻击技术的缺陷和补救方法。

本文首先分析DCShadow的攻击原理,其次实验重现攻击过程和中间非常痛苦的插曲,最后探讨了该技术在网络攻击中的应用场景。

 

0x01 实验环境

域服务器Windows 2016 R2 EN,主机名Win2016-DC01,运行域adsec.com;域内主机Windows 7 x86 CN,主机名Win7X86cn04。

 

0x02 DCShadow攻击原理

 

根据Luc Delsalle的描述,DCShadow的攻击过程包括3主要个步骤:

  • 在目标域的AD活动目录注册一个伪造的DC中;
  • 使伪造的DC被其他的DC认可,能够参与域复制;
  • 强制触发域复制,将指定的新对象或修改后的对象属性同步复制到其他DC中;

下面将分3个小节逐个介绍。

 

0x03 注册伪造的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攻击首先必须具备域管理员权限,但是我们可以通实验,做点手脚,就会好办一些,例如将完全权限赋予普通用户,则普通用户也可以修改,如下面的第二张图。这是后门的另外一种方式,将来会对这类后门进行系统的介绍。

DCShadow工具通过如下方式进行注册,图中绿色部分进行了稍微的修改。

 

0x04 注册的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个接口。

 

0x05 强制立即发起域复制

通常负责域复制和同步的进程是KCC进程,默认时间是15分钟校验一次,如果需要复制则发起;也可以使用Windows域服务器自带的系统工具repadmin ,该工具会调用DRSReplicaAdd 函数接口强制立即发起域复制,DCShadow正是通过调用DRSReplicaAdd 函数强制立即发起域复制,如下图。

 

0x06 实验重现

上图是实验结果,标红位置表示一个对象被成功复制。DCShadow攻击需要2个进程,一个进程必须是系统权限,用来运行RPC服务,以便其他DC能够访问RPC获取需要复制的数据,所以在本地管理员权限下,先运行命令“!+”以加载Mimikatz的驱动,接着运行命令“!processtoken”提升至系统权限,然后运行命令“lsadump::dcshadow /object:dcshadowTestUser /attribute:displayname /value:”Shadow Evil User””,用来修改域内账号dcshadowTestUser的显示名称。

接着启动第二个进程,为域管理员权限,或者第0x03节中提到的具备Servers对象完全控制权(或写权限)的用户权限,执行命令“sadump::dcshadow /push”,进行真正的注册和数据复制。

 

0x07 折磨人的插曲

实验环境中忘了一个小细节,导致实验总是不成功,而工具始终没有报错,所以不得不分析dcshadow的源码,花了3个晚上逐行分析,才最终找到原因—–测试所在的Win7x86cn04这台主机的防火墙服务是启动的,所以域服务器不能通过RPC访问获取需要复制的数据。

经过分析,发现mimikatz工具没有报错的原因是代码里一个宏定义有瑕疵,宏定义如图所示。

上面的宏定义中NTSTATUS的定义是有符号的LONG类型,所以没有问题。但是实际上Mimikatz定义和调用的很多函数返回的Status是无符号类型的,成功表示0,失败返回大于0的值,这时候使用NT_SUCCESS(Status)作为结果判断时,始终是正确的,这才是导致Mimikatz一直没有报错的原因,已经将这个小瑕疵邮件给了Benjamin Delpy本人,暂时未回复。

对工具的源码进行了稍微的改动,如下图,在调用IDL_DRSReplicaAdd强制发起复制后的NT_SUCCESS(Status)判断之后,加了一个输出,得到了下面第二张图的输出结果。

上面这张图中的0x6ba错误为“RPC 服务器不可用”,0x2104错误为“命名上下文要被删除或没有从指定的服务器上复制”,这个报错立马联想到是否开了防火墙,果不其然是开的。关掉后,重新测试,一马平川,积压三天的郁闷之气一扫而光。

 

0x08 结果分析

DCSHadow是在微软BlueHat上发布的,用于红蓝对抗,目的主要在于躲避SIEM的日志监控分析。在我们的测试环境中域服务器上产生了大量的日志,如下面几张连续的图。

从上面的日志截图可以看出,DCShadow的动作都在监控中,之所以会是这个效果,因为此前做其他的防御监测实验时,把日志策略中的一个开关打开“Local Computer Policy -> Computer Configuration -> Windows Settings -> Security Settings -> Advanced Audit Policy Configuration -> Account Management -> Audit Security Group Management”,以及对象变更的日志策略也加入审计范畴。Luc Delsalle的文章中也提到了这一点。默认情况下,这些策略都是不打开的,所以从这个角度来说,DCShadow的红蓝对抗效果还是比较明显的。

 

0x09 DCShadow的作用

从DCShadow目前展示的功能来看,主要只能用于红蓝对抗的隐蔽后门。但是DCShadow第一次澄清和实现了伪造一个DC的最小需求合集,这个贡献非常大。以前很多攻击方法都卡在不能伪造域服务器,例如MS15-011和MS15-014等,有了DCShadow的基础,相信将来会有很多新的攻击方法。

 

参考文献:

[1] https://www.dropbox.com/s/baypdb6glmvp0j9/Buehat%20IL%20v2.3.pdf

[2] https://blog.alsid.eu/dcshadow-explained-4510f52fc19d

译文链接:https://www.anquanke.com/post/id/96704

(完)