Peach Fuzzer testing
漆雕硕
2023-12-01
http://bbs.pediy.com/archive/index.php?t-75032.html
很多朋友给我反馈说《0day安全:软件漏洞分析技术》中测试方面讲的一带而过,太薄太弱。于是我想顺便把这些东西总结一下,也作为《0day》第二版的一个主要更新的章节。(另一个主要更新将是vista的安全机制剖析与VS2005中的安全编译选项)
开始之前声明下,这些知识的一个很头疼问题就是文档不全,寡人一个人势单力薄,很难全面掌握,只是写出自己工作和学习中的一些经验体会。这次系列教程想做成类似讨论的形式,大家在学习完一节后自己又发现什么tips和诀窍的话,希望能在跟贴中拿出来一起分享,一起进步。
独乐乐,与人乐乐,孰乐?
大概准备分成以下几个部分来讲这块内容:
第一讲:fuzz platform的架构与peach的入门
第二讲:PNG文件格式fuzz实验1——数据定义
第三讲:PNG文件格式fuzz实验2——drop evil file
第四讲:PNG文件格式fuzz实验3——monitor exception
第五讲:PNG文件格式fuzz实验4——handle GUI problem
第六讲:网络协议fuzz实验
第七讲:…如果寡人还活着,且还有力气的话…
这是个构思,还没有成为现实,而且能有百分之多少成为现实,咳咳,我也说不上来。另外教程中给出的都是最简单的fuzzer,不要指望直接把这些代码跑起来就能得到0day。However,完成实际fuzzer的知识点将被尽可能多的覆盖到。
开始前在说一句:来听寡人在这里鸡歪的朋友应该至少理解了《0day安全:软件漏洞分析技术》中前5章的内容,否则建议还是先去学下那些基本原理,要不然辛辛苦苦crash了软件,连是defects还是vulnerbility都分不清楚。
按照对能力的要求,个人认为 漏洞挖掘 >漏洞分析>漏洞利用
言归正传,今天第一次,从最基本最简单的开始。
忽略fuzz的历史渊源之类的东西,愿意了解的去翻下0day第16章,稍微写过一点。多罗嗦一句,加上自己的一点感触:成熟精准的fuzz测试应当算是种介于白盒和黑盒之间的灰盒测试吧。
一个成熟的fuzz platform应该具有以下几个模块:
1:原始数据定义模块:一般都需要测试人员自己完成,比如定义原始数据包格式或者文件格式等
2:数据加工(变异)模块:用来在原始数据定义的基础上,衍生出成千上万的测试用例,如畸形文件或者畸形数据包等
3:测试逻辑:用于运行目标程序,发送测试用例,关闭目标程序。如果测试协议的话,发送测试用例有可能需要模拟若干次用于握手的数据包;测试GUI程序的文件格式的话,说不定还要模拟鼠标点击等。
4:错误监测与日志模块:在测试过程中,监测一切相关进程的各种exception、crash等信息,并在错误发生时保存现场,记录对应的case,栈信息,寄存器信息等重要状态,以备后面的分析之用。
说的简单点,fuzz就是要自己写个数据格式的模板,然后让platform按照这个模板衍生出许多evil的数据,然后把这些数据丢给想测试的程序,看他们崩不崩。。。
在这四大块中,“数据变异模块”和“错误检测与日志记录模块”应当由fuzz platform提供
数据定义一般得由测试人员自己来写。最终的fuzzer能不能找到问题,能不能找准问题的关键就在这里。你对数据结构理解的越深,对程序思考的越多,写出来的fuzzer就越高效。
测试逻辑一般有测试人员部分完成。最简单的就是一条命令run 某个程序把测试用例跟在后面当参数。要是协议,就得加上若干个send revive和状态判断逻辑了,遇到GUI的话可能还得去模仿鼠标点击。
优秀的fuzz platform应当提供方便的数据衍生变异功能。在《0day》中简单介绍过使用C语言的SPIKE。在这个教程中我将着重介绍另外一个非常优秀的fuzz platform——peach(这里我就不把它僵硬的翻成蜜桃了)
Peach使用Python编写,开源,你甚至可以为它随意添加模块,扩展出更强大的功能。前面提到的四个部分在peach platform中结构清晰,功能明确。Peach的测试对象包括了几乎所有常见的fuzz对象,例如文件结构,com,网络协议,API等等
今天第一讲,我们就来简单的认识一下这个platform,以后的实验也会基于这个platform来讨论。
Peach的作者是Michael Eddington,不知道peach这个名字的来源和他的大肚子有没有关系,呵呵。首先去网站下载peach:
http://peachfuzzer.com/
下载,安装,注意安装前需要若干python的preinstall,缺的话自己去找来下
假设安装目录是c:\peach
打开安装目录可以看到有一个sample子目录,里面有若干个.xml文件。
使用Peach时实际上主要工作就是定义这样一个xml文件指示platform去做测试。Michael Eddington把这样的xml代码文件叫做peach pit。
用XML编辑器或者直接用VS2005(推荐用VS哦,后面会告诉你为什么)打开这些文件中的任何一个,可以发现peach pit文件实际上很简单,基本上总是包含以下这几个部分:
<?xml…版本,编码之类…>
<Peach …版本,作者介绍之类…>
<Include ...注意有两个文件是永远都要被包含进来的/>
<DataModel >
…原始数据结构定义…
</DataModel>
<StateModel >
…测试逻辑,如收到什么样的数据包之后,发出什么样对应的数据包…
</StateModel>
<Agent >
…检测exception,crash等…
</Agent>
<Test >
…指定将要使用到的state,agent,publisher等…
</Test>
<Run >
…Fuzzer执行的进入点,相当于main吧…
</Run>
</Peach>
1:整个文件被一个“大”标签<Peach> </Peach>括着
2:文件中的第二级标签包括Include,DataModel,StateModel,Agent,Test,Run共6种。(这六种标签并不是全部必须的)
3:Include包含的外部文件,其中defaults.xml和PeachTypes.xml是必须的,里边含有peach的基本方法,类,数据类型等等
4:DataModel用于定义数据结构,此标签下有下级标签若干级、若干种。使用这些子标签可以轻易的定义数据的类型,长短,各个数据块之间的关系,甚至CRC校验之类的东西也能轻易的定义进去。可以定义多个DataModel,多个DataModel之间可以有关系也可以根本无关。后续文章会着重讲解。
5:StateModel用于定义测试的逻辑,实际上就是一个状态机。下属标签包括state,每个state中又可以包含若干个action标签。State表示一个状态,不同的state之间可以根据一些判断条件进行跳转。Action用于执行打开文件,发送数据包之类的命令。后续文章会着重讲解。
6:Agent是一个稍微复杂点的概念,其中一个非常重要的功能就是用来监测crash等。今天的讲座中暂不涉及,在后面稍微高阶点的应用讨论中会集中讲解
7:Test这个标签域相当简单,一般只是制定使用哪个Agent,哪个StateModel,用什么方法发数据(网络还是文件?),有时还会在这里指定使用什么方法加工(变异)数据
8:Run应该是最简单的标签了,有点像我们熟悉的main函数,指定当前这次fuzz测试使用那个Test。
对照我们上面的这个简单介绍,我们先high level的看一下samples目录下那个最最简单的HelloWorld.xml吧。
Include 标签和前面那些介绍版本信息和作者信息的飘过不说了。
DataModel就定义了一个字符串,“Hello World!”
StateModel中只有一个状态,当然也就不存在状态转换之类的工作了
由于实在太简单,这里根本不需要Agent了
再看Test,看标签里边的第二行,Publisher有很多种类,代表把我们加工好的畸形数据(测试用例)往哪里丢,这里的stdout表示直接屏幕输出,常用的还有文件输出,socket输出等等。
最后的run是最没啥好看的,不说了。
我们要做的就是运行下这个Peach Pit文件
C:\peach\peach.py C:\peach\samples\HelloWorld.xml
我们可以看到屏幕上一开始打印“Hello World!”,之后Peach会以这个原始的字符串为模板加工出许许多多畸形的数据出来,包括了超长串,NULL结束符缺失的非法串,重复,格式化串等等等等有可能引起程序出错的,然后依次打印出来。
这个helloworld基本演示了peach pit文件的基本结构和peach运行的框架,随着我们介绍的深入,我们会一点一点讨论到扩展出一个能够实际应用的peach pit出来,如果可能的话,还会再讨论一些扩展Peach的话题。
有点困了,下次见吧,如果等不急就去peach的网站看 Tutorial或者samples文件夹下面的代码吧。下次我们集中讲数据的定义,并且要定义出一个PNG文件模板出来。