记录黑客技术中优秀的内容,传播黑客文化,分享黑客技术精华

Microsoft Windows JET引擎Msrd3x代码执行漏洞

2019-01-14 18:45

2018年9月,Fortinet FortiGuard实验室的研究人员发现了Windows JET引擎Msrd3x40的代码执行漏洞,根据Fortinet的披露流程研究人员将此漏洞报告给了微软。2019年1月,微软发布了安全公告,修复了该漏洞并将其标识为CVE-2019-0538。

易受攻击的DLL msrd3x40是支持从Windows 7到Windows 10所有Windows版本的组件。研究人员报告的漏洞可以使用精心设计的mdb文件触发。解析mdb PoC文件时,由于释放无效的堆地址而发生堆损坏,这可能导致代码执行漏洞。

分析

有两种方法可以重现此漏洞。

方法1

通过使用下面的参数用Excel oledb外部数据源加载PoC文件, Excel就会崩溃。该PoC文件可以位于任何本地或smb共享中。

输入PoC.mdb

方法2

在Windows 10中,可以在命令窗口中执行“cscript.exe trigger.vbs”。

trigger1.vbs脚本

以下是崩溃发生时的调用堆栈。

从上面的调用堆栈输出中,可以看到崩溃发生在函数“msrd3x40!free”中。可以通过以下命令启用cscript.exe整页堆:“gflags / p / enable cscript.exe / full”。

然后检查堆内存地址中堆内存释放失败的原因。内存处于MEM_RESERVE状态,如下所示:

通过逆向工程和跟踪,研究人员发现精心设计的mdb会错误地导致调用msrd3x40.dll,因为精心设计的mdb文件header版本字段为0,正常版本应为1。正常的mdb文件让程序进入header解密代码。但是,由于精心设计的mdb文件版本字段为0,就无法在msjet40.dll中完成header解密。

与精心制作的mdb版本进行比较并采用错误的分支

因此,精心设计的mdb文件将导致函数msjet40!ErrOpenForeignDatabase + 0x65并调用msrd3x40.dll!数据库。但处理正常的mdb文件不会调用msrd3x40.dll。因此,从这里开始,精心设计的mdb文件导致采用错误的代码分支。

错误版本导致msrd3x40.dll调用

DLL msrd3x40.dll解密精心设计的mdb header。偏移量0x42上的数据最初为0x86。在RC4解密mdb header之后,它使偏移量0x42处的数据变为0。然后会采用另一个代码分支,如下图所示:

到目前为止,仍然没有生成无效的堆内存地址。通过进一步的逆向工程和跟踪,研究人员发现用于生成无效堆内存的乘数因子来自以下代码:

运行上述Database :: AssignUserNumber函数后,关键乘法因子变量[esi + 6ch]等于0x100。

然后,研究人员跟踪无效堆内存生成,如下所示:

在msrd3x40.dll中生成的无效堆内存地址

在该函数中,[ecx + 6c]是先前获得的关键乘法因子0x100。在这里dx = 0x1。分配值后,[ecx+eax*2+194h]实际分配给字1,其中字1实际上是释放的无效存储器地址的低字。也就是说,在调用Database :: MarkCorrupt函数之前,目标对象堆指针是正确的。然而,在将值0x1字分配给上述存储器地址之后,就生成了无效堆指针。

从上面的分析,我们可以看到漏洞的根本原因是格式错误的mdb版本值0x00,它导致程序选择错误的分支,而且精心设计的mdb文件偏移量0x42是0x86,偏移量0x600 -0x7ff数据等于0,这使0x100值创建乘法因子。在下一个函数调用中,由于乘法因子而导致目标堆地址的低字被1覆盖,并且生成了无效的堆地址。释放无效堆地址时,就会导致崩溃。成功利用此漏洞可能导致远程执行代码。

知识来源: www.mottoin.com/tech/134107.html

阅读:87855 | 评论:0 | 标签:技术控 漏洞

想收藏或者和大家分享这篇好文章→复制链接地址

“Microsoft Windows JET引擎Msrd3x代码执行漏洞”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

学习黑客技术,传播黑客文化

推广

工具

标签云

本页关键词