MS17-010 “永恒之蓝”漏洞分析与复现
看雪论坛作者ID:Sal_Tay
一
漏洞信息
1、 漏洞简述
漏洞名称:“永恒之蓝”漏洞
漏洞编号:MS17-010,CVE-2017-0143/0144/0145/0146/0147/0148
漏洞类型:缓冲区溢出漏洞
漏洞影响:信息泄露
CVSS评分:9.3(High)
利用难度:Medium
基础权限:不需要
2、组件概述
3、 漏洞影响
Windows Vista SP2; Windows Server 2008 SP2 and R2 SP1; Windows 7 SP1; Windows 8.1; Windows Server 2012 Gold and R2; Windows RT 8.1; and Windows 10 Gold, 1511, and 1607; and Windows Server 2016
4、解决方案
打开“控制面板”,单击“程序”,然后单击“打开或关闭 Windows 功能”。
在 Windows 功能窗口中,清除SMB1.0/CIFS 文件共享支持复选框,然后单击确定关闭窗口。
重新启动系统。
打开服务器管理器,然后单击管理菜单并选择删除角色和功能。
在功能窗口中,清除SMB1.0/CIFS 文件共享支持复选框,然后单击确定关闭窗口。
重新启动系统。
二1
漏洞复现
1、环境搭建
实验中需要用到三个机器,分别是调试机,靶机(被调试机),攻击机。
(1)双机内核调试
(2)安装并配置fuzzbunch
安装Python 2.6
安装PyWin32,需要以管理员权限进行安装
下载fuzzbunch
在shadowbroker-master的子目录windows中新建listeningposts文件夹,同时修改FuzzyBunch.xml文件内容,设置相应的ResourcesDir和LogDir参数值,修改结果如下图所示。(路径根据实际情况而定)
(3)靶机环境配置
打开靶机445端口,具体打开方法点这里
关闭防火墙:控制面板-系统和安全-Windows防火墙-打开或关闭Windows防火墙-全部选择关闭防火墙。
3、复现过程
use Eternalblue
三
漏洞分析
1、基本信息
2、 背景知识
(1) SrvOs2FeaListToNt()函数
(2)0xffdff000系统预留地址空间
kd> !pte 0xffdff000
VA ffdff000
PDE at C0603FF0 PTE at C07FEFF8
contains 000000000018A063 contains 00000000001E3163
pfn 18a ---DA--KWEV pfn 1e3 -G-DA--KWEV
3、 详细分析
(1)静态分析、Ida分析
struct _FEA{
BYTE fEA; //标记位
BYTE cbNAME; //记录名称长度
USHORT cbValue; //记录值的长度
}FEA;
struct _FEALIST{
ULONG cbList; //记录Fea List总长度
_FEA list[1];
}FEALIST, *PFEALIST;
int __stdcall SrvOs2FeaListSizeToNt(_FEALIST *FeaList)
{
_FEALIST *v1; // eax
char *v2; // edi
_FEA *v3; // esi
int v4; // ebx
int v6; // [esp+Ch] [ebp-4h]
v1 = FeaList; // a1
v6 = 0; // NtFeaList的大小
v2 = (char *)FeaList + FeaList->cbList; // 获取指向表结尾的指针v2
v3 = FeaList->list; // 指向表的开始
if ( FeaList->list < (_FEA *)v2 ) // 表的开始指针应该在结尾指针之前
{
while ( &v3[1] < (_FEA *)v2 ) // 从FeaList表的第一个元素开始,遍历整个表
{
v4 = v3->cbValue + v3->cbNAME; // 获取当前FEA的长度
if ( &v3[1].cbNAME + v4 > (BYTE *)v2 ) // 检查下一个FEA是否有效
break;
if ( RtlSizeTAdd(v6, (v4 + 12) & 0xFFFFFFFC, &v6) < 0 )// 增加NtFeaList的大小,每次12字节
return 0;
v3 = (_FEA *)((char *)v3 + v4 + 5); // 下一个FEA,加5意思是每个FEA后面有5字节的NULL
if ( v3 >= (_FEA *)v2 )
return v6;
v1 = FeaList; // 重置v1
}
LOWORD(v1->cbList) = (_WORD)v3 - (_WORD)v1; //此处发生计算错误
}
return v6;
}
(2)补丁Diff
LOWORD(v1->cbList) = (_WORD)v3 - (_WORD)v1;
*(DWORD*)(v1->cbList) = v3 - (_DWORD)v1;
2、动态分析
bp srv!SrvSmbOpen2+0x79 ".printf \"feasize: %p indatasize: %p fealist addr: %p\\n\",edx,ecx,eax;g;"
// 获取Fea大小和indata大小
bp srv!SrvOs2FeaListToNt+0x10 ".printf \"feasize before: %p\\n\",poi(edi);r $t0 = @edi;g;"
bp srv!SrvOs2FeaListToNt+0x15 ".printf \"NTFEA size: %p feasize after: %p\\n\",eax,poi(@$t0);g;"
// FEA List大小的前后变化,以及NTFEA List大小
bp srv!SrvOs2FeaListToNt+0x99 ".printf \"NEXT: FEA: %p NTFEA: %p\\n\",esi,eax;g;"
bp srv!SrvOs2FeaToNt+04d ".printf \"MOV2: dst: %p src: %p size: %p\\n\",ebx,eax,poi(esp+8);g;"
// 查看被分配的池
bp srv!SrvOs2FeaListToNt+0xd5
// 查看服务器返回的值
feasize: 00010000
indatasize: 000103d0
fealist addr: a1f050d8
feasize before: 00010000
NTFEA size: 00010fe8
feasize after: 0001ff5d
sub esi, eax
mov word ptr[eax], si
NEXT: FEA: a1f050dc NTFEA: 85da4008
MOV2: dst: 85da4011 src: a1f050e1 size: 00000000
NEXT: FEA: a1f050e1 NTFEA: 85da4014
MOV2: dst: 85da401d src: a1f050e6 size: 00000000
......
NEXT: FEA: a1f05ca3 NTFEA: 85da5c4c
MOV2: dst: 85da5c55 src: a1f05ca8 size: 00000000
NEXT: FEA: a1f05ca8 NTFEA: 85da5c58
MOV2: dst: 85da5c61 src: a1f05cad size: 00000000
NEXT: FEA: a1f05cad NTFEA: 85da5c64
MOV2: dst: 85da5c6d src: a1f05cb2 size: 0000f383
NEXT: FEA: a1f15035 NTFEA: 85db4ff0
MOV2: dst: 85db4ff9 src: a1f1503a size: 000000a8
srv!SrvOs2FeaListToNt+0xd5:
8949263a be0d0000c0 mov esi,0C000000Dh
kd> dt 85db503C _MDL
nt!_MDL
+0x000 Next : 0xffffffff _MDL
+0x004 Size : 0n96
+0x006 MdlFlags : 0n4100
+0x008 Process : (null)
+0x00c MappedSystemVa : 0xffdfef80 Void
+0x010 StartVa : (null)
+0x014 ByteCount : 0xffd00010
+0x018 ByteOffset : 0xffffffff
四
缓解措施
1、关闭445端口
参考文献:
看雪:MS17-010 SMB 远程命令执行漏洞利用分析 CSDN:【漏洞分析】MS17-010:深入分析“永恒之蓝”漏洞
看雪ID:Sal_Tay
https://bbs.pediy.com/user-home-917290.htm
# 往期推荐
1. 11个小挑战,Qiling Framework 入门上手跟练
2. VMP导入表修复
5. 祥云杯2021 Windows R0题 Rev_APC
球分享
球点赞
球在看
点击“阅读原文”,了解更多!