[讨论]漏洞分析的那些事儿(2012.08.05更新)

发布者:仙果
发布于:2011-11-02 22:16
题目:漏洞分析的那些事儿

作者:仙果

题记:忙了很长一段时间,也没有出任何成果,感觉自己正处于一个瓶颈期,该有的基础没有打牢,而需要研究的东西太多,自己感兴趣的方面也特别多,多而繁杂,
没有主线是目前最好的写照,所以很难得能够静下心来写点东西。一直在提醒自己要把这篇文章写出来,特别是最近每天都在提醒自己要写要写一定要写,这是一种很煎熬的感觉,不得不写这就是我现在的状态。
也许这是作为一个文科生的悲哀,一定要把这个完成。
      本文会是一篇经验和漏洞分析资源的整合,方便在漏洞分析方面没有入门的同学和朋友。有问题大家一起讨论,衷心希望在本版块大家都能够找到需要的知识和解答。
      文章会不定期更新,大家想知道什么方面的知识也可以跟帖提出,我会尽量解答,其他的朋友也会给你解答的。

目录:
一   漏洞分析方面的资源
二   漏洞分析的准备工作
0x1   样本获取
0x2   环境搭建
0x3   工具
三   漏洞分析的测试阶段
四   漏洞的分析阶段
五   其他方面的工作

一  漏洞分析方面的资源
     说到资源,看雪论坛本身就是一个很好的资源,很多志同道合的朋友在这里讨论学习,我的很多知识都是在这里学习到的。遇到了不懂的地方,可以在这里进行讨论,总有一个人会回答你的问题,平时你也可以解答别人提出的问题,大家共同进步。
     一个很好的资源就是看雪安全文档库,上面集中了很多人的心血都是非常精辟的文章,平时没事了多去翻翻总是有心中一亮的感觉。
     看雪软件安全文档库(http://kssd.pediy.com)
     需要从书本上学习的话,有几本书可以推荐下
     《0day安全:软件漏洞分析技术》:链接是新版,比08年的第一版要丰富了很多,是国内首屈一指的全面讲解漏洞分析各个方面的书。强烈推荐。
     《加密与解密(第三版) 》:书我已经不用再介绍,除了算法和.net加密解密部分,基本翻完了的。
     其他的资源大家可以慢慢的搜集,比较常用到的资源,可以用来做参考书的就以上这些了,如果能把以上关于漏洞的知识完全弄明白的话,你就会成为一个非常厉害的高手。
      说一些题外话,全当我在梦呓也可以。漏洞分析是一个很驳杂的学科(我把它看成一门学科),所以想要把漏洞分析做好,
需要掌握的知识有很多。汇编是基础,虽不要求能用汇编写出一个大型程序,但基本汇编要领和体系结构还是需要熟练掌握。C/C++语言基本,
懂得C/C++的编程,对漏洞分析方面的帮助会特别大,很多程序都是C/C++编写而成,C/C++类,虚函数,指针/引用 和数据结构都是容易触发漏洞的脆弱点,
对于理解程序处理流程进而逆向出高级代码有很大的帮助,自己最最欠缺的是这方面的知识和技能。
其他面向对象的高级编程语言/脚本,其中包括Perl,Python等等,对于写POC测试代码会非常有帮助。
      上面提到做漏洞分析最好具备的基础,其他方面比如操作系统架构,内存分配释放,进程的相关知识,都是需要学习的。如果分析flash的漏洞就需要对ActionScript 3代码进行学习,
了解AVM2虚拟机的相关架构,JAVA方面的漏洞也是如此。更不用说现在比较流行的移动平台,需要对ARM汇编学习,移动平台下的调试也需要学习。
      需要学习的东西很多,而一个人的精力有限,在这里也向大家请教如何更有效的学习。我没有达到上述的要求,这是自己的目标。即使你跟我一样没有任何基础也不要灰心,只要努力就能进入漏洞分析的大门。
自己下阶段的目标是学习C/C++的类和虚函数,到时候也会在这里和大家进行讨论。

二   漏洞分析的准备工作
0x1   样本获取
       若要分析一个漏洞,首先就要有漏洞样本,而样本从何而来,总体来说有以下几个渠道:
0x1.1
       http://www.exploit-db.com:非常出名的漏洞公布站点,新的漏洞基本都可以在这里找到,漏洞类型也比较丰富,不光有二进制漏洞,还有其他类型如SQL注入。
经常有些文章很不错英语比较好的同学可以关注下。国内类似的站点有乌云,Sebug.net,还有就是一些大牛的博客了,经常会更新一些漏洞信息。
0x1.2
        Metasploit:这个自不必多说,免费版是非常好的漏洞测试和利用工具,我们可以拿来提取和分析样本,更新也是非常的快。ShellCode也可以从Metasploit提取而不用自己写。
Exploit-db网站上的很多样本示例都是Metasploit的Ruby代码。
0x1.3
        朋友交流:这个是很私下的事情,比如某A大牛发现了一个软件的BUG,但是无法确定能否利用,于是就发给了B大牛,共同研究讨论。这种渠道很难得,如果你有这么样的朋友,
请珍惜吧。呵呵。
0x1.4
        地下交易:当无法从正常渠道拿到漏洞样本的时候,地下交易就有了市场,恐怕也是国内网络安全的一个趋势,并不对这种方式做任何评论。从中确实能够拿到漏洞样本来分析,过一段时间以后地下交易的漏洞样本就会公开,可供拿来分析了。
还有些就是只限于某个圈子,圈子外的人是拿不到样本的,也就无从分析。
0x1.5
     其他:这里的其他主要包括挖漏洞和某些抓漏洞。
挖漏洞称为FUZZING,有很多方法,最基本的就是二进制FUZZING,循环字节替换,很笨拙但是却很有效,理论上可以找到所有的漏洞,只要你构造的FUZZ样本能覆盖到所有的路径。当你FUZZING时发现一个崩溃的样本就可以进行分析,
这时你就找到了软件的某个脆弱点,即使不能成功利用,也是非常有成就感的一个事情,证明这时软件编写者未能完全考虑到的情况被你发现。
抓漏洞是一个技术活,搭建好蜜罐就可以开始抓了,据说很多大公司都有自己的蜘蛛爬虫在网络上不间断的分析网站链接,一旦有新的漏洞在网络上利用传开,很快就可以被蜘蛛爬虫发现并记录下来。
据说很多0Day漏洞就是这么被发现的。通过蜘蛛爬虫得到漏洞样本后就可以进行分析了,全是体力活。

0x2   环境搭建
      在测试环境搭建方面,推荐大家使用虚拟机,包括VMware Workstation ,Virtual BOX ,Virtual PC 等虚拟化工具。其中最出名的当属VMware Workstation,性能和易用性都不错,当开多个虚拟系统的时候占用的主机内存会很高,所以主机的性能越高越好,内存越大越好。
    特别需要注意的是某些漏洞在主机与虚拟机中的情况并不一致,这种情况特别是在RPC相关的漏洞中特别明显,如果想要做到稳定利用,最好做到主机和虚拟机都进行同样的测试并以主机为准。
操作系统安装在虚拟机中,接下来就应该准备测试的软件环境了。
   进行测试的软件往往发布有多个版本,因此需要明确测试软件的版本。比如Adobe Reader 从版本6至最新的10.1那么多,在确定漏洞所能针对的版本以后,就需要选择某个特定版本进行安装测试,例如选择Adobe Reader 9.0。某个漏洞只能针对Adobe Reader 8.2,那也只能选择对应版本。
若不知道漏洞具体能够针对的软件版本,则使用二分法进行漏洞确认。最好的情况是查看十六进制数据就能够确认漏洞,这需要长时间的经验积累过程。
    某些特殊的软件需要组合起来才能触发漏洞,因此在漏洞分析之前要确定漏洞成功触发所需要的软件环境,并依此搭建。

0x3   工具
使用工具的目的是为了能够更容易更快速的分析漏洞的成因和触发漏洞的详细过程。工具的选择也是因人而异,大牛可以通过IDA的静态代码就可以找到漏洞触发的本质所在,我等小菜就必须通过动态调试+静态分析+查找资料来分析漏洞。
具体来说有以下几个工具。
IDA:相信每个对反汇编了解的朋友都知道这个工具,据说最新版本为6.2但下载不到,能下载的版本为6.1界面很友好,掌握好IDA这个工具还是要花费一番力气的。
推荐一本书《IDA Pro 权威指南》,可以买本实体书,随时翻看。

Windbg:微软自己的动态调试工具,足够强大,具体使用方法网上已经有很多教程,大家可以自行翻看。
OD:破解和分析漏洞的必备,很多方面都用得到的。很多实用的脚本,非常强大。因为我分析漏洞用的是Windbg,OD使用的较少,很多用法都忘记的差不多了,基本的操作其实与Windbg一样的,反之也是成立的,只要学会其中一种即可,2中工具都能够精通当然最好。
SoftIce:使用此工具的朋友据说已经不错,但确实非常强大,偶尔还是会用到,容易引起蓝屏和死机。
Immunity Debugger:新兴的动态调试工具,界面与OD类似。操作也类似,据说是购买了OD的源码,强大之处是可以编写Python脚本辅助分析,网上也有很多现成的脚本,在漏洞利用方面比较好,可以很容易编写ROP代码和确认漏洞可否利用。
其他工具:还有很多工具没有介绍到,需要具体漏洞具体分析,如RPC漏洞就需要网络数据嗅探工具,辅助分析发包。包括Perl和ruby都是可能用到的工具。

三   漏洞分析的测试阶段
        上述的一些环境和工具准备好以后,现在就可以开始进行漏洞测试,你可能会有这样的疑问:为什么不直接到漏洞分析,偏偏还要走到这一步,不是多此一举吗?答案是显而易见的,漏洞测试也是非常的关键,这里我进行解释一下,首先当拿到一个样本时,你不能确定它是否就是漏洞,
如果是漏洞,利用形式是什么?有无便捷的漏洞分析方法?如果不是漏洞,是否是软件安装没有对应漏洞可以作用的版本等等一系列问题。进行漏洞测试时最好把上述的问题都能解决掉,这样漏洞触发原理分析时才会更有针对性也会节省很多的精力在判断漏洞与否方面。以下我简述一些需要
特别注意的情况,当然也比较片面,大家可以举一反三,不足之处见谅。
0x1 需要注意的情况
        主要有三个方面:软件配置、网络状态、操作系统准备
0x1.1        软件配置
        之所以提出这个问题是因为某些软件在默认安装的状态下是不会触发某些漏洞,配置上出现了问题才导致漏洞的产生;有些软件默认状态下存在漏洞,但修改了默认配置,有些漏洞就不会触发,这样的情况就会导致漏洞测试的不完整。下面我会举例子来说明这个问题。
例如CVE-2009-4324编号Adobe Reader 的漏洞,原型如下:
util.printd("1.345678901.345678901.3456 : 1.31.34", new Date());
util.printd("1.345678901.345678901.3456 : 1.31.34", new Date());
try {this.media.newPlayer(null);} catch(e) {}
util.printd("1.345678901.345678901.3456 : 1.31.34", new Date());

此漏洞的触发需要Adobe Reader 默认安装并且支持Javascript执行,选择路径如下:编辑-首选项-Javasript-启用Acrobat Javascript。如果把此项取消掉,这个Adobe Reader 的漏洞便不会触发,此时测试也就无从谈起。
第二个拿IE来做例子,ActiveX是IE的一类插件,这个是大家都知道的一个常识,如果你只是安装IE而不安装对应的ActiveX,进行测试的时候IE只会弹出JavaScirpt错误警告但不会崩溃或者漏洞得意成功执行。总之一句话,当你拿到样本时需要特别注意留意一些样本中
泄露的信息,然后查看软件配置,是否符合漏洞触发的条件。
        同时一款软件可以有很多个版本,IE此时有IE6、IE7、IE8、IE9、IE10等,Adobe Reader大版本有6、7、8、9、10等,Adobe Flash 的版本就多到可以不一一列举了。当你不能确定漏洞样本所能针对的软件版本时,就需要尽可能的多测试一些版本,之前提到过过的二分法是一个不错的选择。
0x1.2        网络状态
        这点呢主要是说明网络状态对漏洞测试的影响,特别是RPC类的远程漏洞,对网络的要求比较苛刻。比如说MS08-067 Windows 远程RPC漏洞,很出名的一个洞,现在某些木马中也会嵌入这个漏洞在内网中进行渗透,漏洞触发测试需要关闭Windows 自身防火墙,开启IPS$共享,
139和445端口也要开启(Windows XP),三个条件缺一不可。
0x1.3 操作系统准备
        此种情况其实主要针对Unix和Linux系统,其也有很多个内核版本,在测试linux内核有关的漏洞时,需要特别注意漏洞针对的内核版本。linux漏洞对内核版本的要求特别高,而Windows 包括其上的应用程序的漏洞,对        Windwos 系统版本的要求就没有那么严格,基本上可以搭建一个基本的漏洞测试模型出来,linux则不行,这是需要特别注意的地方。

声明:该文观点仅代表作者本人,转载请注明来自看雪