从BinDiff到0day 在IE中利用CVE-2019-1208

news2024/12/28 20:45:51

前言

如上所述,CVE-2019-1208UAF漏洞,这类安全漏洞可以破坏有效数据、引发进程crash、并且可以精心利用最终导致任意代码执行。而对于本文介绍的CVE-2019-1208而言,成功利用此漏洞的攻击者可以获得系统当前用户权限。如果当前用户具有admin权限,则攻击者可以劫持系统——从安装或卸载程序,查看和修改数据 到 创建具有完全权限的用户。

潜在影响

还有一种更有形的攻击情形,攻击者向不知情的用户发送钓鱼邮件,并诱使他们通过IE访问恶意网站(存在CVE-2019-1208的漏洞)。

或者,攻击者可以发送带有附件的垃圾邮件,其中包含该漏洞的exp。这些附件可以是启用了IE渲染引擎的Microsoft Office文档,也可以是嵌入了ActiveX控件的的应用程序,而ActiveX控件又包含exp。

攻击者还可以在一些合法网站上布置攻击代码,例如那些接受用户的输入的网站。

下图为VbsJoin的代码流:

 

漏洞是如何被发现的?

我的研究始于BinDiff,当时我正试图比较vbscript.dll的5月和6月的版本,寻找其中被更改的函数,而这个模块包含VBScript引擎的API函数。最终我发现通过SafeArrayAddRef,SafeArrayReleaseData和SafeArrayReleaseDescriptor函数进行了一些修复

然而,受我之前发现的漏洞CVE-2018-8373的启发,进一步分析后我使用VBScriptClass经过下列步骤触发了UAF漏洞:

  1. arr = Array(New MyClass),创建一个SafeArray并在arr[0]处保存VBScriptclass: MyClass

  2. Callback: arr = Array(0)Join(arr)将触发MyClass的回调函数Public Default Property Get。在此回调中,为变量创建了一个新的SafeArray,如下图所示而这个新的SafeArray不受SafeArrayAddRef函数的保护。因此,正常的代码流假设 被这个回调打破

     

  1. arr(0) = Join(arr),当从Public Default Property Get返回时,VBsJoin中的代码将会调用SafeArrayReleaseDataSafeArrayReleaseDescriptor来减少SafeArrayDataSafeArrayDescriptor的引用计数。但是,新的SafeArray不受SafeArrayAddRef保护,并且SafeArrayDataSafeArrayDescriptor的引用计数为0。

    因此,新的SafeArray的SafeArrayDataSafeArrayDescriptor将在函数SafeArrayReleaseDataSafeArrayReleaseDescriptor被free,如下图所示:

     

其中,代码快照显示内存中的arr = Array(New MyClass)(顶部),内存中的arr = Array(0)callback位于底部

将VbsJoin的返回值保存到arr(0)时,PoC在vbscript!AccessArray中崩溃(见下图),因为SafeArrayDescriptor被free,Variant arr仍然保存释放的SafeArrayDescriptor的指针。

 

显示PoC如何在vbscript!AccessArray中触发crash的代码快照

PoC是否成功触发UAF?

在某种程度上,这个回答是肯定的

为了演示如何完全触发UAF,我使用了basic string/binary string(BSTR)作为数据结构。SafeArray是一个多维数组,但由于VBsJoin只能处理一位数组,因此我更改了回调中的SafeArray的维度。

不幸的是,它仍然没有用,它会抛出一个运行时错误,指出数组类型在Join中不匹配。不过没有关系,我使用On Error Resume Next来绕过这个运行时错误,下图为修改过后的PoC:

 

在获得了0x20字节的已释放内存后,我使用大小为0x20字节的BSTR来伪造一个较大size的SafeArray。

通过使用堆风水,这个BSTR可以稳定地重用0x20字节的已释放内存,如下图所示:

 

我终于得到了一个伪造的一维数组SafeArray,一共有0x7fffffff个元素,每个元素大小为1字节,如下图:

伪造的SafeArray(顶部)和读/写的固定地址(底部)

 

到目前为止,我已经可以伪造一个SafeArray,可用于读/写0x00000000到0x7fffffff的内存

为了泄露一些读/写地址以便利用,我参考了Simon Zuckerbraun之前的研究并使用堆喷射来获得一些固定的读/写地址(0x28281000)

从UAF到RCE

如Simon Zuckerbraun的博客中所述,我使用Scripting.Dictionary对象来完成远程代码执行,但使用另一种方法来伪造一个假的Dictionary。这一次,我使用了BSTR并将它们带出来

Faked Dictionary内存布局如下:

 

  1. 使用内存读/写函数来读取原始的Dictionary内存,将其数据保存到一个BSTR,并将VBADictionary::Exists替换为kernel32!Winexec
  2. 将之后用到的Winexec参数\..\clac.exe写入此BSTR
  3. 将此BSTR保存到util_memory+0x1000,并修改util_memory + 0x1000 – 8 = 9以使fake_array(util_memory + 0x1000)成为对象
  4. 使用fake_array(util_memory + &h1000),利用dummy来触发Winexec函数

最终利用结果,成功弹出计算器:

 

这个漏洞对IE意味着什么?

在2019年8月13日,已在Windows 10中禁用的VBScript 又同时在Windows 7,8中禁止IE使用。因此,上文详述的PoC是在本地模式下开发的。但正如微软所说,仍然可以通过注册表或组策略启用此设置。同样,用户和组织应始终采用最佳实践:保证系统打上补丁和保持更新,禁用不需要(或限制使用)的组件,并派样网络安全意识,如垃圾邮件和其它社会工程学威胁

研究的完整细节在本技术简报中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/530514.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

理解Java虚拟机——JVM

目录 一、初识JVM 二、JVM执行流程 三、内存区域划分(JVM运行时数据区) 3.1 本地方法栈(线程私有) 3.2 程序计数器(线程私有,无并发问题) 3.3 JVM虚拟机栈(线程私有&#xff0…

最全的分布式事务详情,它来啰~

我们首先得理解什么是分布式事务呢?分布式事务是指在分布式系统中,涉及多个计算机或服务器的操作序列,这些操作需要满足一致性和可靠性的要求。每个操作要么全部成功执行,要么全部回滚,以保持数据的一致性和完整性。 …

嵌入式通信协议【Modbus】Modbus TCP的帧格式

一、请求帧格式 Client request:例: 19 B2 00 00 00 06 06 03 00 27 00 02 1、头字节 上面是modbus客户端发出的报文内容,为modbus tcp/ip协议格式,其前面的六个字节为头字节( header handle); 19 B2 00 00 00 06 19 B2 00 00…

3D点云之语义分割(相关官方示例介绍)

之前在博客中提到,会考虑用深度学习来对3D点云进行处理,接下来迈出脚步,先整几个例子来熟悉它。例子原型来源于官网,博主在其基础上做了一些代码修改。 一. 例子参考 1. Keras中的资源 Code examples 2.openvinotoolkit open_…

20230515在亚马逊Amazon扣费之后的申诉

20230515在亚马逊Amazon扣费之后的申诉 2023/5/15 22:56 缘起:使用Amazon的12个月的免费存储桶,然后调用S3功能翻译! 但是,被扣费了! 由于绑定的信用卡是工行的,要求和亚马逊解除绑定,工行给了一…

第十章创建模式—外观模式

文章目录 外观模式解决的问题概念结构 案例优缺点使用场景Tomcat 源码 结构型模式描述如何将类或对象按某种布局组成更大的结构,有以下两种: 类结构型模式:采用继承机制来组织接口和类。对象结构型模式:釆用组合或聚合来组合对象。…

GEE:无监督聚类算法(wekaKMeans)

作者:CSDN @ _养乐多_ 本文将介绍如何使用 Google Earth Engine(GEE)进行卫星图像 K-means 聚类分析的基本步骤,并提供相应的示例代码。 结果如下图所示, 文章目录 一、K-means 原理二、代码详解三、代码链接一、K-means 原理 二、代码详解 var roi = table; Map.cent…

【前后端异常】axios post请求 返回415错误状态码的解决方法

错误描述: 进行有文件的表单提交时出现415错误,以前没遇到过记录一下 415错误的解释是说,服务器无法处理请求附带的媒体格式。以下是HTTP的状态码关于415返回码的说明: 415Unsupported Media Type服务器无法处理请求附带的媒体格…

awk的应用

awk的基本应用 一、awk的工作原理二、实际应用按行输出文本按字段输出文本时间的使用查看各个功能 一、awk的工作原理 awk与sed和grep共成为文本三剑客,都是针对文本非常实用的工具。 awk的工作原理: 遂行读取文本,默认以空格或者tab&#x…

NodeJs模块化之上半部分

模块化 什么是模块化 模块化是指解决一个复杂问题时,自顶向下 逐层把系统 拆解 成若干 模块 的过程。 对于整个系统来说,模块是可组合、分解和更换的单元。 编程领域中的模块化 编程领域中的模块化,就是遵守固定的规则,把一个…

( 位运算 ) 231. 2 的幂 / 342. 4的幂 ——【Leetcode每日一题】

❓题目一 231. 2 的幂 难度:简单 给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。 如果存在一个整数 x 使得 n 2 x n 2^x n2x ,则认为 n 是 2 的幂次方。 …

10款必装IDEA开发神器

那些IDEA开发神器 1.Material Theme Ul 安装步骤 打开IDEA,点击File -> Settings。在Settings窗口中,选择Appearance & Behavior -> Appearance。在Appearance选项卡下,找到Theme并选择Material Theme Ul。点击Apply按钮,然后点…

Liunx基础命令 - mv剪切命令

mv命令 – 移动或改名文件 mv命令来自英文单词”move“的缩写,中文译为”移动“,其功能与英文含义相同,能够用于对文件进行剪切和重命名操作。这是一个被高频使用的文件管理命令,我们需要留意它与复制命令的区别。cp命令是用于文…

C++标准库中的锁

C标准库中的锁 std::mutex.lock是我们在C中比较常见的锁,我们使用std::mutex.lock方法时,同时需要考虑何时使用std:mutex.unlock方法去解锁。如果在复杂的多线程情况下,加锁、解锁的时机很难把握,也不好实现。 RAII原则是所有的…

c++中this指针的使用

首先,我们都知道类的成员函数可以访问类的数据,那么成员函数如何知道哪个对象的数据成员要被操作呢? 原因在于每个对象都拥有一个指针:this指针,每一个对象都能通过this指针来访问自己的地址。 this 指针是所有成员函…

NOSQL——redis的安装,配置与简单操作

1.缓存的相关知识 1.1 缓存的概念 缓存是为了调节速度不一致的两个或多个不同的物质的速度,在中间对速度较慢的一方起到加速作用,比如CPU的一级、二级缓存是保存了CPU最近经常访问的数据,内存是保存CPU经常访问硬盘的数据,而且硬…

Git简易教程

安装与配置 教程链接 代码上传到远程仓库 workspace:当前所在的工作目录 stagingarea:修改暂存区 loacl repository:本地仓库 remote respository :远程仓库 我们首先在workspace目录编写代码、修改文件,然后需要使用…

三十五、nacos注册中心集群搭建、网关、过滤器

1、nacos注册中心集群的搭建 要想搭建nacos集群模式,这些集群中的每台nacos服务,都必须连接同一个数据库。因为我们的nacos都放在同一台主机上,所以我们必须为每台nacos起不同的端口号。 1.1修改nacos端口号 8849 8850 8851 E:\software\naco…

2023/5/15总结

Java基础(4) 标准类制作 成员变量使用private修饰构造方法:提供一个无参构造方法,提供一个带多个参数的构造方法 成员方法:提供每一个成员变量对应的setXxx()/getXxx(),提供一个显示对象信息show()创建对象并为其成员…

服务端渲染

服务端渲染 和 前后端分离&#xff01; 渲染 什么是渲染呢 ? 其实很简单, 就是把数据反应在页面上&#xff0c;说白了, 就是利用 js 的语法, 把某些数据组装成 html 结构的样子, 放在页面上展示。 举个例子 : 1. 准备一段 html 结构 <h1>hello world</h1> <di…