看雪论坛
发新帖
19

[原创]众里寻他千百度----文件类漏洞ShellCode的查找

仙果 2010-9-25 00:57 8490
题目:众里寻他千百度----文件类漏洞ShellCode的查找

作者:仙果
主页:http://hi.baidu.com/zhanglinguo11
题记:还是非常想把这个题目完成,放了这么久,也修改了几个版本,都不满意,今天算是推倒重新来写,尽可能把自己知道的东西写出来,学习需
要不断的总结积累,上周日骑车出去,看到一句话:学习是一种信仰,记录下来,作为提醒自己去学习的警句。
目录
0x_1.何为文件类漏洞
0x_2.文件类漏洞的分类
0x_3.查找文件类漏洞ShellCode的方法
0x_4.例子
0x_5.总结

0x_1.何为文件类漏洞
     文件类漏洞只是一个通俗的叫法,且并不准确,一般来说文件类主要包含Office系列办公软件,Adobe Reader等PDF查看处理软件,KingSoft的
WPS系列等等的漏洞都属于文件类漏洞的范畴之内,网上讨论最多的文件类漏洞也是属于此类漏洞,不 知道flash的漏洞是否可以归为到此类漏洞当
中,个人认为播放器如Media Player等等播放软件在处理如m3u格式的文件触发的漏洞也是属于文件类漏洞,这应该叫做文件格式类漏洞。其触发漏
洞的原因是其在处理某些特殊构造的 样本时触发异常,导致可以控制程序的执行流程并顺利执行到指定的ShellCode。
以上纯属个人胡乱揣测,如有不对之处欢迎各位大牛小牛不大不小牛指正,仙果在此感激不尽。

0x_2.文件类漏洞的分类
     其实不能叫做分类,只是以本篇文章来说,自己在查找文件类漏洞的ShellCode的过程中遇到的各种情况进行的分类,非常之不准确,仅供参考。

0x_2.1 已公开漏洞
    这里主要是哪些已经被公开的漏洞,在网络上可以找到别人分析此漏洞的相关技术文档抑或漏洞说明文档,不管是英文的还是中文的,相应的
POC文档也已经公 开。此时分析漏洞中的ShellCode就会很简单,当确定拿到的样本存在既定的漏洞编号(CVE编号或者其他),应当在网上查找是否
有相应的分析,若存 在则可以根据别人的分析,一步一步跟踪调试,最终找到ShellCode的庐山真面目。

0x_2.2 非公开漏洞
    如果你拿到这类漏洞的样本,那就恭喜你,一个新鲜的0Day就到手了,别忘了发给我一份,求之不得啊,回到正题,当你不确定漏洞属于哪一类
别时也可以归为 此类。在虚拟机中把相应环境搭建好,运行样本,记录样本都做了哪些操作,文件类漏洞一般都会捆绑木马,那肯定有创建木马并
执行木马的操作,在相应的API 上断点跟踪,一般来说,只要ShellCode调用了相关的API就可以断下,此时就可以利用WinDbg调试器的Calls Stack
功能或者跳出当前执行的API函数流程,查看到ShellCode,它就赤裸裸的在你面前,任你宰割,爽吧。常用到的API函数主要有
CreateFile,WriteFile,ReadFile,WinExec等等。

很多漏洞都可以归为此类,再次强调这是自己的分类,没有任何的参考价值,如果需要知道正确的分类请百度之,百度不行就换谷歌,不解释。

0x_2.3.Office系列办公处理软件漏洞
    像Office等办公处理软件的漏洞,ShellCode会以十六进制形式存在文档中,如果对于文档格式以及ShellCode格式分析较多的话,就可以 直接
在文档中把ShellCode揪出来,而不用去调试跟踪漏洞,这节省了一大笔精力和时间,当然现在我做不到这点,这是俺的目标。对于我等菜鸟来说,
认 认真真的去调试跟踪 漏洞的触发过程,并在此过程中找到ShellCode才是正途,高人是用来仰望的,在此膜拜一下袁哥,
此外在漏洞利用过程中,会使用到一系列的跳转地址,这些跳转地址在多个系统环境下都是通用的,在编写漏洞利用的时候,为了兼顾通用性就会使
用到这些地址, 如jmp esp在中文系统下的通用地址为0x7ffa4512(不包括Win7),如果样本文档中出现了这个地址,在文档中应该形式如下:12 45
fa 7f ,在这个地址下断点,断下来后,离ShellCode 也就很近很近,有的情况下是直接跳转到ShellCode 去执行。还有其他的通用地址,这里就不
一一说明了,过程都是一样的,当然在特定的漏洞环境下是不会使用到这些地址的,此时会有其他的地址进行替代,这就需 要在调试状态下进行分
析,多测试几种系统和软件环境就可以相应的结论。

0x_2.4.PDF查看处理软件漏洞。
    以Adobe Reader为主的PDF查看软件出现的漏洞,是最近几年爆的最多的漏洞,Adobe也荣登漏洞之王,PDF的一个特性是可以内嵌JavaScript语
句,所以在IE里使用的堆喷射(spray)技术在PDF中同样可以使用,而PDF中的ShellCode 就跟在堆喷射的代码之后,在没有经过免杀编码的情况下
,ShellCode 的格式是"%u9090%feeb"形式的,如果经过编码那就形式多样了,自己也不知道该如何总结,如果对IE漏洞的ShellCode熟悉的话,解码
的 工作还是非常容易,只是工程量的问题而已。PDF下很少有类似Office的漏洞,大多数都是需要使用JavaScript进行堆喷射执行 ShellCode,今年
年初的时候爆出的CVE-2010-0188Adobe Reader 的Tiff图像处理缓冲区溢出漏洞就属于一个特例,ShellCode藏身于Tiff图片文件中,在调试中找出
ShellCode是一个办法,当然解码出 Tiff图片,直接把ShellCode拷贝出来也是一种办法。
此上只是自己的学习中的总结,肯定有不正确之处,还请大家多多见谅。

0x_3.查找文件类漏洞ShellCode的方法
    其实在之前的叙述中,已经把如何查找文件类漏洞ShellCode 的办法一一表述了,这里再把这个过程总结下,其只是一般情形,特殊情况需要特
殊对待。
0x_3.1确定漏洞是否公开,是否有相关技术分析文档或者漏洞描述。如果存在就给我们一个提示作用,告诉我们该往那些地方寻找,如CVE-2010-
0188的漏洞描述如下:
    Adobe Reader和Acrobat都是非常流行的PDF文件阅读器。
Adobe Reader和Acrobat采用的开源TIFF图像解析库libtiff实现上存在缓冲区溢出漏洞,
远程攻击者可能利用此漏洞通过诱使用户打开处理包含恶意TIFF图像的PDF文档在用户系统上执行任意指令,从而控制用户系统。
此安全问题其实是一个老漏洞(CVE-2006-3459)在Adobe产品中的重现。
在网上可以找到CVE-2006-3459的相关触发利用文档和源程序,为查找ShellCode打下基础。

0x_3.2针对未公开漏洞,在测试环境中观察漏洞样本所执行的动作,根据执行的动作选择相对应的API下断点,第一次有可能不准确,多准备几个断
点就可以解决这个问题,

0x_3.3查找漏洞样本中是否有通用的跳转地址,这些地址很有规律,当然这需要你去记住它,不算多也不算少,自己是没有记住,此类地址在Office
系列的漏洞利用中比较广泛(这里只讲文件类漏洞,其他类型的漏洞的不涉及),一般会有jmp esp ,pop ret等等之类。

0x_3.4PDF中ShellCode的查找,之所以单独列出来是因为论坛里的朋友向我询问PDF中ShellCode改如何查找,这里重新说下,首先确认PDF样本是否
存在JavaScript,若存在则ShellCode很可能就在JavaScript 之中,此时有2中办法可以把ShellCode 提取出来,一是解码PDF中的文件流,二是使PDF
的JavaScript执行功能禁用(Adobe Reader -编辑-首选项-JavaScript-去掉启用JavaScript的勾),用PDF编辑软件查看文档中包含的ShellCode,这其
中有可能PDF 的ShellCode没有执行,但PDF编辑软件同样挂掉,此时就需要使漏洞不触发,具体办法大家去想,反正有很多种办法,像不使用漏洞针
对版本的PDF 软件啦之类,呵呵。相对应解码PDF文件流最简单,但是首先要找到ShellCode 对应的文件流(obj)才行,全部解码也行,这需要花费时
间和精力。当然解码出JavaScript并不一定包含ShellCode,它可能隐藏在漏洞触发的文件流中,JavaScript只是起到一个堆喷射的作用,此时就需
要把之前提到的两种办法结合起来了,不骗你,我还真遇到过这样的情况存在,漏洞的具体编号我已经忘记了,谁如果晓得,还请告诉我一下。之前
提到的在调试跟踪过程中查找ShellCode同样也适用于PDF,这个看个人决定使用哪种办法。

0x_4.例子
     本来想找Office-PPT的一个漏洞,编号是MS-09-017,CVE-2009-0556给大家做个演示,但是苦于手上是实在是没有这个样本,演示也无法继续,
如果谁有这个样本的话,请发给我一份,求之不得啊。若以后能拿到样本,这部分会补上的。
只有拿一个PDF的样本作为例子了,漏洞编号是CVE-2009-0027,PDF处理getIcon() JavaScript方式栈溢出漏洞。从网络上是可以找到此漏洞的分析文
档,而且还是中文的,英语什么的,最讨厌了。链接为:http://bbs.kanxue.com/showthread.php?p=692925
如果想得到ShellCode,最简单的办法就是禁用JavaScript以后,AcroBat-高级-文档处理-编辑全部JavaScript,就可以查看到文档中使用的
JavaScript,当然ShellCode 自然也就在其中。用其他方法同样可以得到ShellCode,若观察ShellCode的执行流程的话,还是需要在调试环境中进行
跟踪。具体的漏洞原理这里就不解释,大家可以自己去分析,我想肯定有很多人比我要了解的多。

0x_5.总结
      到这里文件类漏洞ShellCode的查找就结束了,我写的很啰嗦很细碎,也写的很乱,看完以后可以自行组织,其实就一句话:调试跟踪自然可
以发现 ShellCode。个人认为在漏洞分析过程中,除非是练习写ShellCode,其并不是重点,而是在漏洞是如何触发,恶意数据是如何精心构造并使
正常的程序执行流程跳转到ShellCode中执行的过程才是漏洞调试的真正精彩之处,从中可以学习到很多知识,可以看到在漏洞分析利用方面很多意
想不到的技巧。比如说MS-09-017-ppt的这个漏洞300501cd这个地址就很通用,换成其他的地址就会很大的局限性,为什么是这个地址,写EXP利用的
人又是如何找到的?很值得思考。
                                                                                          2010-09-25 凌晨1点于家中
本主题帖已收到 0 次赞赏,累计¥0.00
最新回复 (28)
19
仙果 2010-9-25 01:00
2
dico 2010-9-25 08:06
3
谢谢仙果大牛的辛苦劳动,第一个来支持您!
6
dge 2010-9-25 09:59
4
看来兄弟对文件格式的漏洞情有独钟啊。
4
instruder 2010-9-25 10:10
5
若存在则ShellCode很可能就在ShellCode 之中   笔误了,顶下,哈哈,正在学习
19
仙果 2010-9-25 10:16
6
谢谢提醒,已经改正
lapcca 2010-9-25 11:34
7
谢谢仙果大牛的辛苦劳动,支持您!
40
riusksk 2010-9-25 11:49
8
他对pdf更是情有独钟,因为他就是好这口的
dawnkeen 2010-9-25 12:21
9
收藏了。
2
kkmylove 2010-9-25 12:27
10
顶一下 辛苦了
19
仙果 2010-9-25 18:27
11
你不说不觉得
一说还真是!
呵呵
过两天再写一篇PDF漏洞的分析
预告下
garyzjq 2010-9-25 19:04
12
长见识了,谢谢楼主普及哈~~一直对文件方面的漏洞理解模模糊糊的
zhukeding 2010-9-27 21:26
13
如果方便的话,希望楼主来分office的分析。感觉PDF中的shellcode,还是比较容易找出来的
19
仙果 2010-9-27 21:48
14
其实Office漏洞中的ShellCode也是很容易就可以找到的,相对的来说,PDF中的ShellCode可以藏的更隐蔽一些,这些都可以从内存中看到的,在调试状态下,原形毕露。
容易不容易找到,这个需要看EXP编写者对于漏洞利用的通用性和免杀的要求,最简单的利用完全可以用硬编码去实现。
1
yiyiguxing 2010-9-27 22:00
15
这些都是LZ自己总结的经验吧,挺好的。
不过我一般还是喜欢下断点,找SHELLCODE,呵呵
19
仙果 2010-9-27 22:41
16
恩,确实是自己的总结。
我不太注重找ShellCode,喜欢调试漏洞,发现其漏洞原理
下断点,这个要花费时间和精力,有省时省力的办法,何乐而不为呢
webwizard 2010-9-28 02:15
17
膜拜膜拜
1
yiyiguxing 2010-9-28 14:17
18
其实,利用断点找完SHELLCODE后,直接就回溯找漏洞触发的地方了,这两个是一体的。。。
19
仙果 2010-9-28 14:48
19
有些漏洞不会这么简单,通过栈回溯只会找到跳转到ShellCode的入口,而不是漏洞触发的原理所在,
况且现在都用堆喷射,能找到ShellCode ,栈回溯在堆中,而且很多垃圾数据,如何继续回溯呢?
1
yiyiguxing 2010-9-29 14:35
20
怎么算垃圾数据呢?不管SHELLCODE的头部EIP在那,在堆中,还是在栈中,总要有跳过来的指令:
call  [register+0x40]
jmp [register+0x40]这种形式。。即使是JMP过来的,通过回溯也总能找到它之前本身的程序代码吧
19
仙果 2010-9-29 15:02
21
[QUOTE=yiyiguxing;864843]怎么算垃圾数据呢?不管SHELLCODE的头部EIP在那,在堆中,还是在栈中,总要有跳过来的指令:
call  [register+0x40]
jmp [register+0x40]这种形式。。即使是JMP过来的,通过回溯也总能找到它之前本身的程序代码吧[/QUOTE]

垃圾数据我指的是在堆中或者栈中填充的无用数据,当然这个数据也不是真的无用,只是为了更好更通用的跳转到ShellCode中去执行。
你提到的这种形式在常见的普通的缓冲区溢出中可以适用,有些溢出比如虚函数指针溢出,Flash的溢出等等,一般在堆中会填充很多的NOP还要加上绕过DEP的代码,通过栈回溯找到的程序代码的难度会很大,当然并不是不可能。
   最近爆的PDF的漏洞,编号是CVE-2010-2883,这是一个栈溢出漏洞,它把寄存器ESP给覆盖了,栈回溯也被覆盖的乱七八糟,这个时候通过栈回溯是找不到的,而且在堆中填充了大量的RET地址的代码,网上爆出了样本,可以分析下,就会明白我说的。
19
仙果 2010-9-29 15:04
22
不好意思发了2遍,今天论坛太卡了。。卡死我了都。。。
1
yiyiguxing 2010-9-29 17:07
23
有样本么?兄弟,给发一个,我看看。。
19
仙果 2010-9-29 17:20
24
http://pastebin.com/yLv57H9Z
样本在次,分析起来很复杂
SunV 2010-9-30 15:04
25
下载txt,拜读
grantlove 2010-10-1 20:31
26
学习大牛的杰作
boyving 2010-10-3 18:38
27
支持大牛了。
wwihacker 2017-8-11 13:00
28
好久不来了,  从今天起,必须学习了
Craigtang 2017-9-8 14:01
29
我最近也在研究PDF的fuzz    仙果大大  求交流指导啊
返回



©2000-2017 看雪学院 | Based on Xiuno BBS | 域名 加速乐 保护 | SSL证书 又拍云 提供 | 微信公众号:ikanxue
Time: 0.014, SQL: 10 / 京ICP备10040895号-17