使用peach工具进行fuzz测试
本文简要介绍了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
使用peach工具进行fuzz测试的更多相关文章
- 2015 GOOGLE I/O大会看点总结:新的开发工具及云端测试工具
http://ask.android-studio.org/?/article/48 尽管凌晨开始的主题演讲略显晦涩并继承了谷歌一贯的东一句西一句想起啥说啥的混乱风格,但期待用技术改变世界的技 ...
- mongoDB工具类以及测试类【java】
java操作mongo工具类 package Utils; import com.mongodb.MongoClient; import com.mongodb.MongoCredential; im ...
- 开发了一个安卓小软件“CSV联系人导入导出工具”,欢迎测试
开发了一个安卓小软件"CSV联系人导入导出工具",欢迎测试.本软件可以帮你快速备份和恢复联系人,不用担心号码遗失,软件操作简单,使用方便. 下载地址: 百度网盘:https://p ...
- 在 anyproxy 上做 mock 和 fuzz 测试
引言 写这个工具,主要有几个原因: 最近老大在尝试不同视角的测试----健壮性测试,任务下来,所以挽起袖子就开撸了 app很可能因为后端api做了变更,返回了一个异常的值而出现难以预知的问题,健壮性受 ...
- 用c#开发的一款webservice调用小工具,方便测试
本人经常与webservice打交道,webservice调用工具有soap ui,使用起来不是那么方便,所以我花了很长时间特意写了个小工具来调用Webservice方便测试,还有待进一步完善.使用方 ...
- 安卓性能测试工具-GT,安测试
GT: 是腾讯出品的一款APP的随身调测平台,它是直接运行在手机上的“集成调测环境”(IDTE, Integrated Debug&Test Environment).利用GT,仅凭一部 ...
- MySQL数据库Inception工具学习与测试 笔记
MySQL语句的审核,在业界都已经基本被认同了,实际上也是对MySQL语句写法的统一化,标准化,而之前的人工审核,针对标准这个问题其实是很吃力的,标准越多,DBA越累,开发也越累. 那么在这个都追求自 ...
- 复刻smartbits的国产网络测试工具minismb-如何测试路由器
复刻smartbits的国产网络性能测试工具minismb,是一款专门用于测试智能路由器,网络交换机的性能和稳定性的软硬件相结合的工具.可以通过此工具测试任何ip网络设备的端口吞吐率,带宽,并发连接数 ...
- 复刻smartbits的国产网络测试工具minismb-如何测试DPI引擎
复刻smartbits的网络性能测试工具MiniSMB,是一款专门用于测试智能路由器,网络交换机的性能和稳定性的软硬件相结合的工具.可以通过此以太网测试工具测试任何ip网络设备的端口吞吐率,带宽,并发 ...
随机推荐
- [py]数据描述符优先级
实例查找属性的顺序: 类属性 > 数据描述符 > 实例属性 > 非数据描述符 > __getattr__ 类属性>数据描述符>实例属性 class Str: def ...
- [py][lc]python高阶函数(匿名/map/reduce/sorted)
匿名函数 - 传入列表 f = lambda x: x[2] print(f([1, 2, 3])) # x = [1,2,3] map使用 传入函数体 def f(x): return x*x r ...
- Saltstack入门
一.Salt概述 一个配置管理系统,能够维护预定义状态的远程节点(比如,确保指定的报被安装,指定的服务在运行). 一个分布式远程执行系统,用来在远程节点(可以是单个节点,也可以是任意规则挑选出来的节点 ...
- (6)Cocos2d-x 3.0坐标系详解
Cocos2d-x坐标系和OpenGL坐标系相同,都是起源于笛卡尔坐标系. 笛卡尔坐标系 笛卡尔坐标系中定义右手系原点在左下角,x向右,y向上,z向外,OpenGL坐标系为笛卡尔右手系. 屏幕坐标系和 ...
- chrome 关闭安全模式
chrome.exe --disable-web-security --user-data-dir
- 004-notepad++安装。
1.下载地址. 官网:https://notepad-plus-plus.org/ 2.安装.
- android系统提供的几种颜色Color
http://blog.csdn.net/feiyangxiaomi/article/details/38338305 记录一下android自带颜色. Constants public static ...
- Web安全之BurpSuite抓取HTTPS请求
出现了问题,第一步要干什么呢? 当然是要去官方网站去找FAQ和help,先来练习一下英语 https://portswigger.net/burp/help/proxy_options_install ...
- 自动化运维工具SaltStack安装配置
SaltStack是一种全新的基础设置管理方式,部署轻松,在几分钟内可运作起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯.通过部署SaltStack环境,我们可以在成千上万台服务 ...
- 2018-2019-1 20189215 《Linux内核原理与分析》第六周作业
<庖丁解牛>第五章书本知识总结 system_call并不是一个普通的函数,只是一段汇编代码的起点,且内部没有严格遵守函数调用堆栈机制. 通过set_system_trap_gate函数绑 ...