二进制漏洞分析之 CVE-2021-1647
一、漏洞信息
- 漏洞简述
•漏洞名称:Microsoft Defender 缓冲区溢出漏洞
•漏洞编号:CVE-2021-1647
•漏洞类型:buffer overflow
•漏洞影响:远程代码执行
•CVSS评分:7.8 HIGH
•利用难度:中等
•基础权限:不需要
2.组件概述
MsMpEng.exe : Microsoft恶意软件保护服务。
mpengine.dll :Microsoft恶意软件保护引擎,提供了Microsoft防病毒和反间谍软件的扫描,检测。
- 漏洞利用
Microsoft Defender 发现新的文件时,提交给核心扫描引擎(MsMpEng)进行检测,在检测过程中发现是一个特定加壳PE文件,就进入检测引擎的脱壳流程,在解密流程中对加密块的进行解码时 存放解码数据的缓冲区大小可以被特定壳样本控制,所以就造成了缓冲区溢出。
- 漏洞影响
受此漏洞影响的最新版本的Microsoft恶意软件保护引擎 版本1.1.17600.5
注:MpEngine.dll的文件版本低于 1.1.17700.4的都受影响。
- 解决方案
解决此漏洞的Microsoft恶意软件保护引擎的第一个版本 版本1.1.17700.4。
链接:https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-1647
二、漏洞复现
(必有)
- 环境搭建
•靶机环境版本详述
–操作系统:Win10(10.0.19042 ?? Build 19042)
–虚拟机版本:VMware® Workstation 15 Pro
•靶机配置
–Microsoft Defender 反恶意软件客户端版本: 4.18.1909.6
–Microsoft Defender引擎版本: 1.1.16400.2
–Win10驱动调试配置可参考:
•https://blog.csdn.net/qq_21000273/article/details/52027708
•攻击机环境版本详述
–可运行Windbg 10 即可
•攻击机配置
–Windows Debugger Version 10.0.16299.15 AMD64
- 复现过程
第一步:安装好靶机系统后,立刻断网,不然Microsoft Defender会自动升级,切记;
第二步:将样本丢入靶机系统即可复现(弹出system权限的cmd)。
三、漏洞分析
- 基本信息
•漏洞文件:MpEngine.dll
•漏洞函数: CAsprotectDLLAndVersion::RetrieveVersionInfoAndCreateObjects
漏洞对象:asprotect 节区解码结构体
struct asprotect_dec_section_info
{
uint32_t rva;
uint32_t size;
};
•
背景知识
1.了解asprotect外壳loader的原理;
2.了解system权限下服务程序的调试方法;
详细分析
- 静态分析
1.先获取MpEngine模块的ImageBase = 0x7FF88C740000;
2.在IDA中设置ReBase:
3.定位到漏洞函数:RetrieveVersionInfoAndCreateObjects
4.漏洞伪代码:(或直接定位地址:00007FF88CF19C02)
此处代码是的作用是:计算Asprotect section解密需要的最大缓存空间,若是正常的组合序列”00001000 00031400 00033000 00000a00 0003c000 00001000 0003e000 00002600”经过上述代码计算得“0x41000”,若是经过精心构造的序列“00000000 00000000 00000000 00000000 00002000 00000000 00002000 00003000”经过上述代码计算得”0x2000”;
5.以“0x2000”结果为导向,后面会调用new申请一大块内存来存放解密后的数据:
6.接着会经过四次Asprotect section 解码,在第四次解码时(0x3000>0x2000)产生了溢出:
7.至此漏洞关键点分析完毕。
8.漏洞关键代码已经还原成C代码,请看附件。
- 函数调用链
- 动态调试手法
进程图:
由于MsMpEng.exe是具有system权限,应用层访问状态为“拒绝”的服务进程,所以一般的调试方法不会附加成功,所以采用了Windbg从内核到应用层进程切换的手法,觉得有必要把流程说一下:
1.加载符号:
.sympath SRVF:\symbols_folderhttps://msdl.microsoft.com/download/symbols
.reload
2.获取进程PEB: !process 0 0 MsMpEng.exe
(PEB=0xffff9909ce79e300)
3.进行侵入:
.process /p 0xffff9909ce79e300
.reload /f /user
.process /i /p 0xffff9909ce79e300
4.下 MsMpEng VM脱壳关键点:bu AsprotectIsMine
5.
6.RetrieveVersionInfoAndCreateObjects 下断点不能直接bu
7.投入样本到第五步时,F11 2次进入,这是可以直接在关键函数下断点了
8.建议在下断点之前先u一下,看看情况。
3.漏洞函数分析
已经将产生漏洞的函数关键循环进行了源码还原,请参照“静态分析”小节进行调试即可。
- 利用思路
1 | 此漏洞的利用复杂度较高,本想完美复现,奈何实力有限无法完成。需要对WIN10的内存管理以及Microsoft Defender VM的虚拟执行和内存管理相当精通,样本作者水平之高,令人叹服。后面有实力再继续分析,各位师傅可以参照文献“平头哥”的文章。
|
- 利用条件
漏洞利用的必备条件:恶意软件保护引擎的版本低于1.1.17700.4即可。
2.攻击向量
如下列表壳的Loader都可以作为输入目标:
Upxw64
Upxw
WExtract
NSPacker
Shrinker
PECompact2
Area51
Crypter1337
Aspack
PKLite
SfxCab
Asprotect
四、缓解措施
联网即可。
五、参考文献
1.加密与解密第四版,圣经必读;
2.平头哥的文章--“https://mp.weixin.qq.com/s/CjsntvNM6_zMZF1IGirMPg”
3.cn_windows_10_business_editions_version_20h2_x64_dvd_f978664f.iso
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2021-3-6 10:38
被mJqalJqN编辑
,原因: 上传附件