文件类漏洞ShellCode的查找

题记:还是非常想把这个题目完成,放了这么久,也修改了几个版本,都不满意,今天算是推倒重新来写,尽可能把自己知道的东西写出来,学习需要不断的总结积累,上周日骑车出去,看到一句话:学习是一种信仰,记录下来,作为提醒自己去学习的警句。
目录
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很可能就在ShellCode 之中,此时有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方式栈溢出漏洞。从网络上是可以找到此漏洞的分析文档,而且还是中文的,英语什么的,最讨厌了。
如果想得到ShellCode,最简单的办法就是禁用JavaScript以后,AcroBat-高级-文档处理-编辑全部JavaScript,就可以查看到文档中使用的JavaScript,当然ShellCode 自然也就在其中。用其他方法同样可以得到ShellCode,若观察ShellCode的执行流程的话,还是需要在调试环境中进行跟踪。具体的漏洞原理这里就不解释,大家可以自己去分析,我想肯定有很多人比我要了解的多。
0x_5.总结
到这里文件类漏洞ShellCode的查找就结束了,我写的很啰嗦很细碎,也写的很乱,看完以后可以自行组织,其实就一句话:调试跟踪自然可以发现ShellCode。个人认为在漏洞分析过程中,除非是练习写ShellCode,其并不是重点,而是在漏洞是如何触发,恶意数据是如何精心构造并使正常的程序执行流程跳转到ShellCode中执行的过程才是漏洞调试的真正精彩之处,从中可以学习到很多知识,可以看到在漏洞分析利用方面很多意想不到的技巧。比如说MS-09-017-ppt的这个漏洞300501cd这个地址就很通用,换成其他的地址就会很大的局限性,为什么是这个地址,写EXP利用的人又是如何找到的?很值得思考。

作者 仙果 由网络安全攻防研究室(www.91ri.org)信息安全小组收集整理。