前言
我们知道NTLM协议的认证, 包括NTLMv1和NTLMv2两个版本。如果是v1的话,拿到Net NTLM Hash就相当于拿到了NTLM Hash,但是实际环境中更多的是遇到v2,因为密码强度较高,很难爆破出来,此时可以试一试Relay Attack。
Relay Attack就是将截获的Net NTLM Hash重放进行攻击,从而实现对其他机器的控制。

测试环境
所有的Relay攻击都是在此环境中进行测试,域控为Windows Server 2016。
攻击机Kali:192.168.43.169
Windows Server 2016:192.168.43.18
Windows7:192.168.43.158
Windows10:192.168.43.54
Relay to SMB
如果能直接Relay到SMB服务器,是最直接最有效的方法,可以直接控制该服务器(包括但不限于在远程服务器上执行命令,上传exe到远程服务器上执行,dump hash等)。
什么是SMB协议
SMB(Server Message Block),又称网络文件共享系统,一种应用层网络传输协议,由微软开发,主要功能是使网络上的机器能够共享计算机文件、打印机、串行端口和通讯等资源。它也提供经认证的进程间通信机能。
SMB签名
在开启了 SMB Signing 的情况下,在 SMB 协议利用 NTLM SSP 进行了身份验证后,后续的所有数据包,都会利用 NTLM SSP 生成的这个 session key 进行签名。SMB 服务端收到后续的数据包后,也会检查数据包的签名,如果签名不对,则拒收。
NTLM SSP 在生成 session key 的时候,会需要用到账号密码的原始 LM HASH 或 NT HASH。而 relay 型的攻击,都是站在一个中间人的位置,我们是不可能知道原始的 LM HASH 或 NT HASH 的(如果知道了也就不需要 Relay 这种攻击手法了)。所以,我们是无法计算出来这个 session key 的,自然也就无法对数据包进行签名。
NTLM && SMB
SMB的认证可以基于NTLM协议或者kerberos协议,前者使用了hash,后者使用了ticket,是构成SMB的PtH和PtT攻击的基础。 NTLM 并没有定义它所依赖的传输层协议。NTLM 消息的传输完全依赖于使用 NTLM 的上层协议来决定,可以是SMB,也可以是TCP,亦或HTTP。
NTLM 的上层协议基本可以是任何协议(如果上层是基于UDP 的协议的话,可能会不一样),所以这引出了跨协议的 NTLM-Relay 技巧。无论 NTLM 的上层协议是什么,其携带的NTLM的消息都是由NTLM SSP生成的,所以上层协议在 relay 的过程中,是可以被替换掉的。
利用条件
SMB版本信息
不同Windows版本所对应的Smb 版本,smb版本越高,内置的安全机制就越完善,利用难度也就越大,另外,它默认工作在tcp/udp的139和445端口上,属上层协议(偏应用层)。其中,使用计算机名访问时,SMB服务工作在NetBIOS协议之上,用的是TCP的139端口;使用IP地址访问时,用的是TCP的445端口。
- Smb v1 主要用于xp/2003以下的系统中
- Smb v2.x 主要用于win vista/7/2008/2008r2
- Smb v3.x 主要用于win 8 / 8.1 / 2012 / 2012r2 /2016
利用条件
- 目标机器不能开启smb签名,否则利用无效,一般情况下,windows server会默认开启,而windows单机系统[win 7/8/8.1/10]默认都不会开。
- 对一些打了ms08-068[KB957097]补丁的老系统[比如windows xp/2003以下的系统]利用也是无效的。
攻击场景
工作组环境
工作组环境中使用Relay Attack实用性较差,因为在工作中环境中,机器之间相互没有信任关系,每台机器的账号密码hash只保存在自己的smb文件中,这个时候再relay到其他机器,除非账号密码完全相同,否则不会成功,这时候不如直接哈希传递。
这个时候的攻击手段就是将机器reflect回机子本身。因此微软在ms08-068中对smb reflect到 smb 做了限制,防止了同一主机从SMB协议向SMB协议的Net-NTLMhash relay。这个补丁在CVE-2019-1384(Ghost Potato)被绕过。
域环境
域环境下域用户的账号密码Hash保存在域控的 ntds.dit里面。如果没有限制域用户登录到某台机子,那就可以将该域用户Relay到别人的机子,或者是拿到域控的请求,将域控Relay到普通的机子,比如域管运维所在的机子。(为啥不Relay到其他域控,因为域内就域控默认开启smb签名)
攻击演示
Responder
- 首先我们需要检测域内机器的SMB签名开放情况
我们可以利用responder下的RunFinger.py进行检测,可以看到只有域控开启了SMB签名(域内默认只有域控会开启SMB签名)

- 利用MultiRelay.py攻击,获得目标主机的shell:
python MultiRelay.py -t 192.168.43.158 -u ALL
现在 SMB 已经由 MultiRelay.py 脚本来进行中继,我们需要修改一下responder的配置文件 Responder.conf,不让其对 hash 进行抓取。
- 修改Responder.conf
将SMB和HTTP的On改为Off。
- 启动responder
responder -I eth0
此时我们在DC上随便传递一个SMB流量,例如:
net use \\whoami
此时我们便拿到了Win7的shell,最终结果如下:


Impacket
- smbrelayx.py
原理:攻击者伪造一个恶意的SMB服务器,当内网中有机器Client1访问这个攻击者精心构造好的SMB服务器时, smbrelayx.py 脚本将抓到 Client1 的 Net-NTLM Hash ,然后 smbrelayx.py 用抓取到的 Client1 的 Net-NTLM Hash 重放给 Client2 。
我们在域控上执行
dir \\192.168.43.169\c$

- Metasploit
我们可以提前用Metasploit生成一段payload,之后用smbrelayx.py的 -e选项在目标主机上传并运行我们的payload。
这里要注意,我们要设置set AutoRunScript migrate在成功得到session后自动迁移进程,如果没有自动迁移进程,那么在Removing file的时候,会话也随之关闭了。
之后在域控上执行dir \192.168.43.169\c$即可:
此时msfconsole上获得了Win7的会话

- Metasploit的smb_relay模块(ms08-068)
此模块也可以实现Relay Attack但是只支持NTLM v1,所以实际中多数会出现Failed to authenticate的情况。
这个攻击手段就是将机器reflect回机子本身。然而微软在ms08-068中对smb reflect到 smb 做了限制,防止了同一主机从SMB协议向SMB协议的Net-NTLMhash relay。这个补丁在CVE-2019-1384(Ghost Potato)被绕过。
Referer
Windows内网协议学习NTLM篇之Net-NTLM利用 - 安全客,安全资讯平台
https://zh.wikipedia.org/wiki/%E4%BC%BA%E6%9C%8D%E5%99%A8%E8%A8%8A%E6%81%AF%E5%8D%80%E5%A1%8A
https://www.freebuf.com/articles/244375.html