使⽤peach⼯具进⾏fuzz测试
本⽂简要介绍了Fuzz ⼯具Peach的使⽤,并通过⽂件格式 Fuzz举例阐述了 Peach Pit ⽂件的编写。
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需要预先安装 4和windbg;Linux、OS X下需要安装Mono 开发框架。
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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。