漏洞丨CVE20102883

作者丨黑蛋

一、漏洞描述

此漏洞编号CVE-2010-2883,看着是一个很简单的栈溢出漏洞,但是也要看怎么玩了。这个漏洞是Adobe Acrobat Reader软件中CoolType.dll在解析字体文件SING表中的uniqueName字段的调用了strcat函数,但是对参数没有做出判断,没有检查uniqueName字段长度,导致了栈溢出漏洞。此漏洞影响版本如下:
Adobe Acrobat 8.0
Adobe Acrobat 8.1
Adobe Acrobat 8.1.1
Adobe Acrobat 8.1.2
Adobe Acrobat 8.1.3
Adobe Acrobat 8.1.4
Adobe Acrobat 8.1.5
Adobe Acrobat 8.1.6
Adobe Acrobat 8.1.7
Adobe Acrobat 8.2
Adobe Acrobat 8.2.1
Adobe Acrobat 8.2.2
Adobe Acrobat 8.2.4
Adobe Acrobat 9.0
Adobe Acrobat 9.1
Adobe Acrobat 9.1.1
Adobe Acrobat 9.1.2
Adobe Acrobat 9.1.3
Adobe Acrobat 9.2
Adobe Acrobat 9.3
Adobe Acrobat 9.3.1
Adobe Acrobat 9.3.2
Adobe Acrobat 9.3.3
Adobe Acrobat
Apple Mac_Os_X
Microsoft Windows
Adobe Acrobat_Reader 8.0
Adobe Acrobat_Reader 8.1
Adobe Acrobat_Reader 8.1.1
Adobe Acrobat_Reader 8.1.2
Adobe Acrobat_Reader 8.1.4
Adobe Acrobat_Reader 8.1.5
Adobe Acrobat_Reader 8.1.6
Adobe Acrobat_Reader 8.1.7
Adobe Acrobat_Reader 8.2.1
Adobe Acrobat_Reader 8.2.2
Adobe Acrobat_Reader 8.2.3
Adobe Acrobat_Reader 8.2.4
Adobe Acrobat_Reader 9.0
Adobe Acrobat_Reader 9.1
Adobe Acrobat_Reader 9.1.1
Adobe Acrobat_Reader 9.1.2
Adobe Acrobat_Reader 9.1.3
Adobe Acrobat_Reader 9.2
Adobe Acrobat_Reader 9.3
Adobe Acrobat_Reader 9.3.1
Adobe Acrobat_Reader 9.3.2
Adobe Acrobat_Reader 9.3.3
这次我用的是9.0版本。

二、环境准备

虚拟机

调试工具

目标软件

16进制编辑器

Win7X86SP1、Kali

Ida、x32dbg

Adobe Acrobat_Reader 9.0

010Editor

三、漏洞复现

使用MSF生成EXP:

漏洞丨CVE20102883_第1张图片

 

然后在Win7中安装Adobe Acrobat_Reader 9.0:

漏洞丨CVE20102883_第2张图片

 

把Kali中的Exp拖到本机,再拷贝到Win7中,拖到Adobe中:

 

弹出计算器,证明漏洞存在,Exp也没有问题。

四、漏洞分析

首先我们需要做几个准备工作,1、改掉随机基址,省的麻烦,把用010Editor打开Adobe,修改如下地方:

漏洞丨CVE20102883_第3张图片

 

2、在把软件拖调试器中,忽略程序自身异常(因为我这边调试器接管异常,导致程序运行不下去,所以需要忽略)

漏洞丨CVE20102883_第4张图片

 

接下来就是正儿八经分析了,因为已知漏洞问题是在CoolType.dll,直接在安装文件夹下找到这个dll,拖到Ida中:

 

然后Alt+T,搜索sing:

漏洞丨CVE20102883_第5张图片

 

双击到标记的一条:

漏洞丨CVE20102883_第6张图片

 

下面这一坨就是漏洞溢出的地方,如果有需要可以自行分析一下,或者使用其他手段找到溢出点:

漏洞丨CVE20102883_第7张图片

 

我们直接看strcat函数,地址是0x0803DCA4,这里基址是0x08000000,所以函数偏移是3DCA4,接下来我们就是动态追踪一下计算器弹出的具体过程,用x32dbg附加软件,F9运行,等软件加载完所需要的dll,然后
查看各个模块基址,找到CoolType.dll,基址是0x60690000,那么加上偏移就是0x3DCA4=0x606C DCA4:

漏洞丨CVE20102883_第8张图片

 

跳转到0x606CDCA4,下断点:

漏洞丨CVE20102883_第9张图片

 

接下来把我们生成的Exp拖到软件中,稍微等会,就断在了我们断点处,然后在堆栈窗口中转到EBP,观察溢出情况:

漏洞丨CVE20102883_第10张图片

 

我们先看看strcat函数的俩个参数,堆栈中转到ESP,可以看到,源数据和要拷贝的地址,而要拷贝的地址就是EBP:

漏洞丨CVE20102883_第11张图片

 

然后走过strcat函数,观察EBP的位置,发现已经被淹没覆盖:

漏洞丨CVE20102883_第12张图片

 

然后继续往下走,走到如下函数单步步入:

漏洞丨CVE20102883_第13张图片

 

然后步入下面这个call:

漏洞丨CVE20102883_第14张图片

 

然后步入第一个call:

漏洞丨CVE20102883_第15张图片

 

然后走到如下位置:

漏洞丨CVE20102883_第16张图片

 

这里的call是exp特意构造的,如果追寻eax的来源,就会发现他指向我们拷贝的数据中的一个地址,这里是把栈抬高到我们淹没EBP那里,进入这个函数就会发现,函数流程已经被我们劫持了,从这里开始就进入我们的流程:

漏洞丨CVE20102883_第17张图片

 

接下来会进入一系列ROP链(这里使用了堆喷技术,目的为了绕过DEP):

漏洞丨CVE20102883_第18张图片

 

走到这里,调用了一个CreateFile创建了一个iso88591文件,其参数都是Exp构造好的:

漏洞丨CVE20102883_第19张图片

漏洞丨CVE20102883_第20张图片 

 



文件在这:

漏洞丨CVE20102883_第21张图片

 

在这里可以看到EAX指向一个CreateFileMapping函数,创建文件映射:

漏洞丨CVE20102883_第22张图片

 

随后跳转到此函数:

漏洞丨CVE20102883_第23张图片

 

之后根据同样手法,进入MapViewOfFile函数,将一个文件映射对象映射到当前应用程序的地址空间:

漏洞丨CVE20102883_第24张图片跑了半天,又用之前的手法走到memcpy函数,如果留意的话,就会发现,这里是把shellcode写到MapViewOfFile返回的地址,因为这里是可写可读可执行,绕了半个地球,就是为了绕过DEP:

 

漏洞丨CVE20102883_第25张图片

 

然后这里就是正儿八经shellcode地方:

漏洞丨CVE20102883_第26张图片

 

 

经过一段解密,可以看到字符串calc.exe:

漏洞丨CVE20102883_第27张图片

 

从这里可以看到是通过CreateProcessA创建了计算器:

漏洞丨CVE20102883_第28张图片

 

以上就是Exp的运行过程,最后弹出计算器的结果。

五、总结

这个Exp的编写用了很多技术,包括利用了PDF文件可执行js代码的特性,然后使用栈溢出劫持运行流程到icucnv36.dll,这个模块没有ASLR保护,然后再通过ROP链,各种寄存器布置,然后新建文件,又将文件映射到内存,再把shellcode拷贝到这块区域。
参考链接:http://static.anquanke.com/download/b/security-geek-2019-q2/article-12.html

你可能感兴趣的:(安全,网络,web安全)