本文简要介绍了Fuzz 工具Peach的使用,并通过文件格式 Fuzz举例阐述了 Peach Pit 文件的编写。
本文转自“绿盟科技博客”:http://blog.nsfocus.net/peach-fuzz/
1、引言
Fuzz(模糊测试)是一种通过提供非预期的输入并监视异常结果来发现软件安全漏洞的方法。模糊测试在很大程度上是一种强制性的技术,简单并且有效,但测试存在盲目性。
典型地模糊测试过程是通过自动的或半自动的方法,反复驱动目标软件运行并为其提供构造的输入数据,同时监控软件运行的异常结果。
Fuzz被认为是一种简单有效的黑盒测试,随着Smart Fuzz的发展,RCE(逆向代码工程)需求的增加,其特征更符合一种灰盒测试。
Peach是一个优秀的开源Fuzz框架。
2、Peach简介
2.1 概述
Michael Eddington等人开发的Peach是一个遵守MIT开源许可证的模糊测试框架,最初采用Python语言编写,发布于2004年,第二版于2007年发布,最新的第三版使用C#重写了整个框架。
Peach支持对文件格式、ActiveX、网络协议、API等进行Fuzz测试;Peach Fuzz的关键是编写Peach Pit配置文件。
Windows下使用Peach3需要预先安装.net 4和windbg;Linux、OS X下需要安装Mono .net开发框架。
2.2 命令行参数
- -1:执行第1次测试。
- -a:启动Peach代理。不指定”channel”默认为本地代理(默认支持,无需显式启动);
“channel”可以指定为”tcp”远程代理。
- -c:统计测试用例数。
- -t:验证Peach Pit xml文件正确性。
- -p:并行Fuzz。运行Peach的机器总数为M,这是第N个。
- –debug:调试信息开关。
- –skipto:指定Fuzz跳过的测试用例数。
- –range:指定Fuzz的测试用例范围。
3、Peach文件Fuzz
3.1 Peach文件Fuzz流程图
3.2 Peach Pit
在使用Peach进行Fuzz之前需要编写被称为”Peach Pit”的xml配置文件,其中包含着如何进行Fuzz的关键信息,如下图:
其主要元素包括:
- DataModel
一个Pit文件至少会包括一个或多个DataModel,描述数据类型信息,关系(大小、数量、偏移量),和其它允许智能Fuzz的信息。如下图:
其属性包括:
1) name:数据模型的名字[必须]。
2) ref:引用模版数据模型[可选]。DataModel有ref属性时,与被引用DataModel类似
于子类与基类的关系,基类数据会被子类继承,子类子元素会覆盖基类同名子元素,
3) mutable:数据元素可变异性[可选,默认true]。
其主要子元素:Blob、Block、Choice、Flags、String、Number、Relation等。
1) Blob:常用于表示没有类型定义和格式的数据,如下图:
其主要属性包括:
- value:Blob默认值。
- length : blob的字节长度, blob长度判断会根据后续有token元素的位置计算。
- token:这个元素解析是否作为”标记”,默认false。
2) Block:用来组合一个或者多个的其他元素。Block和DataModel是很类似的,一个重要区别在于它们的位置,DataModel是顶级元素, Block是其子元素。
其不同于DataModel的属性包括:
- minOccurs:这个Block所必须出现的最低次数[可选] 。
- maxOccurs :这个Block可能会出现的最高次数[可选]。
3) Choice:每次选择其中一个元素,类似switch语句。如下图:
minOccurs为最小生成Choice数;maxOccurs为最大生成Choice数,-1为无上限;occurs为必须产生的次数,如果不能达到这个次数,异常退出。具体匹配实现按照Choice中Block顺序,crack(解析)数据时根据token匹配一个Block后,数据位置后移匹配Block大小,继续按照Choice中Block顺序从头匹配。
4) Flags: Flag元素定义包含在Flags容器中的位字段,如下图:
其主要属性包括:
- size:大小,以位数为单位[必须] 。
- position:flag的起始位置(以0为基准)[必须]。
5) String:定义一个或者双字节的字符串,如下图:
其主要属性包括:
- nullTerminated:字符串是以null结尾[可选] 。
- type:字符编码类型,默认”ascii”,可用选项有ascii, utf7, utf8, utf16, utf16be,
utf32 [可选]。
- padCharacter:填充字符串,来填充达到length的长度,默认是0x00[可选]。
6) Number:定义了长度为8,16,24,32 或者64位的二进制数字,如下图:
其主要属性包括:
- size:Number的大小,以位为单位。有效的选择是1-64 [可选]。
- endian:数字的字节顺序,默认是小端字节[可选]。
- signed:是否是有符号,默认是true[可选]。
7) Relation:用于连接两个大小、数据、偏移量相关元素,如下图:
type类型为size时,of表示Number 是Value字符串的字节数。expressionGet用于crack过程,表示读”Value”多少字节。expressionSet用于publishing过程,为Publisher 生成Number值。
- StateModel
用于定义测试的逻辑,实际上相当于一个状态机。如下图:
下级标签包括State,每个State中又可以包含若干个Action标签。
1) State:表示一个状态,不同的State之间可以根据一些判断条件进行跳转,通常和Action的when属性联合使用。如下图:
2) Action:用于完成StateModel中的各种操作,是给Publisher发送命令的主要方式。Action能发送输出、接收输入、打开连接,也能改变State等。主要属性:
- type:操作类型[必须]。主要类型:
start:启动Publisher,隐含动作,一般不需要。
stop:停止Publisher,隐含动作,一般不需要。
input:接收或者读取来自Publisher的输入,需要指定DataModel,用于crack和包含输入数据。
ouput:通过Publisher发送或者写输出,需要一个DataModel ,包含可选data,如下图:
- when:如果提供的表达式为true,完成操作;否则,跳过。
- ref:状态变更后的引用[type=changeState] 。
- method:call的方法 [必须, type=call],调用Publisher可选参数定义的方法,不
是所有Publisher都支持。
- Agent
是能够运行在本地或者远程的特殊的peach进程,这些进程能够启动监视器监控被测目标,如附加调试器、检测crash等。如下图:
远程Agent需要首先在远程目标机通过peach –a tcp启动远程代理,无需pit文件。本地peach pit文件添加如下图location,其中ip为目标机ip。
可用Monitor如下图:
Windows Debugger Monitor通过windbg控制一个windows调试实例,主要参数:
- CommandLine :运行的命令行,如下图:
文件fuzz时上述文件名fuzzed.wav需要与Publisher参数一致。如下图:
- SymbolsPath:windbg符号路径。
- StartOnCall :StateModel有匹配调用时附加调试器。
- NoCpuKill:默认false,表示当被测目标进程cpu占用为0时将其结束。
Peach3对非内核目标使用的混合调试模式,首先通过CreateProcess DEBUG_PROCESS参数创建调试进程,当检测到被测目标有感兴趣faults产生时会使用windbg的dbgeng.dll进行重现调试,最后利用windbg插件msec.dll的!exploitable命令对漏洞的可利用性进行初步判断,记录结果。
- Test
指定使用哪个Agent、StateModel,Publisher用什么方法发送数据,使用什么方法变异数据,日志文件路径等。可以有多个Test,使用时通过peach命令行指定要运行的Test名称,未指定默认运行名称为”Default”的Test。如下图:
Strategy(变异策略)包括:
- Random:默认会随机选择最大6个元素(可以通过参数MaxFieldsToMutate设置)利用随机mutator(变异器)进行变异。
- Sequential:Peach会顺序对每个元素使用其所有可用的Mutators进行变异。
- RandomDeterministic:Peach默认规则。这个规则对pit xml文件中元素根据Mutators
生成的Iterations链表做相对随机(由链表中元素数目决定)的顺序混淆,所以每个xml文件每次运行生成的测试用例多少、顺序固定,这样才能保证skipto的准确性。Peach3包括元素增、删、改、交换,经验值,逐位、双字等Mutators,见下图:
3.3 Fuzz Wav文件
- Wav文件格式
- Pit文件
参考文献
www.peachFuzzer.com