本文简要介绍了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测试的更多相关文章

  1. 2015 GOOGLE I/O大会看点总结:新的开发工具及云端测试工具

        http://ask.android-studio.org/?/article/48 尽管凌晨开始的主题演讲略显晦涩并继承了谷歌一贯的东一句西一句想起啥说啥的混乱风格,但期待用技术改变世界的技 ...

  2. mongoDB工具类以及测试类【java】

    java操作mongo工具类 package Utils; import com.mongodb.MongoClient; import com.mongodb.MongoCredential; im ...

  3. 开发了一个安卓小软件“CSV联系人导入导出工具”,欢迎测试

    开发了一个安卓小软件"CSV联系人导入导出工具",欢迎测试.本软件可以帮你快速备份和恢复联系人,不用担心号码遗失,软件操作简单,使用方便. 下载地址: 百度网盘:https://p ...

  4. 在 anyproxy 上做 mock 和 fuzz 测试

    引言 写这个工具,主要有几个原因: 最近老大在尝试不同视角的测试----健壮性测试,任务下来,所以挽起袖子就开撸了 app很可能因为后端api做了变更,返回了一个异常的值而出现难以预知的问题,健壮性受 ...

  5. 用c#开发的一款webservice调用小工具,方便测试

    本人经常与webservice打交道,webservice调用工具有soap ui,使用起来不是那么方便,所以我花了很长时间特意写了个小工具来调用Webservice方便测试,还有待进一步完善.使用方 ...

  6. 安卓性能测试工具-GT,安测试

    GT: 是腾讯出品的一款APP的随身调测平台,它是直接运行在手机上的“集成调测环境”(IDTE,  Integrated  Debug&Test  Environment).利用GT,仅凭一部 ...

  7. MySQL数据库Inception工具学习与测试 笔记

    MySQL语句的审核,在业界都已经基本被认同了,实际上也是对MySQL语句写法的统一化,标准化,而之前的人工审核,针对标准这个问题其实是很吃力的,标准越多,DBA越累,开发也越累. 那么在这个都追求自 ...

  8. 复刻smartbits的国产网络测试工具minismb-如何测试路由器

    复刻smartbits的国产网络性能测试工具minismb,是一款专门用于测试智能路由器,网络交换机的性能和稳定性的软硬件相结合的工具.可以通过此工具测试任何ip网络设备的端口吞吐率,带宽,并发连接数 ...

  9. 复刻smartbits的国产网络测试工具minismb-如何测试DPI引擎

    复刻smartbits的网络性能测试工具MiniSMB,是一款专门用于测试智能路由器,网络交换机的性能和稳定性的软硬件相结合的工具.可以通过此以太网测试工具测试任何ip网络设备的端口吞吐率,带宽,并发 ...

随机推荐

  1. makefile中ifeq与ifneq dev/null和dev/zero简介 dd命令

    ifeq语法是ifeq "<arg1>;" "<arg2>;"  ,功能是比较参数“arg1”和“arg2”的值是否相同,相同时为1 i ...

  2. 菜单条 Menu Bar Action

    //.h /***Action**/ QAction * act_openImage; QAction * act_openVideo; QAction * act_openAudio; /***Me ...

  3. dns之缓存。

    1.浏览器缓存.这里以chrome为例.在chrome上输入:chrome://net-internals/#dns 可以查看chrome浏览器的dns缓存信息. 这样. 2.windows系统缓存. ...

  4. Atcoder CADDi 2018 Solution

    C - Product and GCD Solved. 题意: 给出$n个数$的乘积,求$这n个数$的最大的可能是GCD 思路: 分解质因子,那么$每个质因子的贡献就是其质因子个数/ n的乘积$ #i ...

  5. uva1146 2-SAT问题

    题意大白书 二分答案,然后对于每个可能的答案,跑一遍2-SAT就好了. #include <iostream> #include <string.h> #include < ...

  6. 用opencv检测人眼并定位瞳孔位置

    最近的研究要用到定位瞳孔的位置,所以上网搜了下相关的代码.总结如下: 1) 定位瞳孔可以直接使用opencv中的自带的分类器(haarcascade_eye_tree_eyeglasses.xml)来 ...

  7. Mysql优化_ORDER BY和GROUP BY 的优化讲解(单路排序和双路排序)

    ORDER BY 子句尽量使用Index方式排序,避免使用FileSort方式排序,尽可能在索引列上外城排序操作,遵照索引键的最佳左前缀.如果不在索引列上,FileSort有两种算法,Mysql就要启 ...

  8. P1314 聪明的质监员(前缀和+二分)

    P1314 聪明的质监员 显然可以二分参数W 统计Y用下前缀和即可. #include<iostream> #include<cstdio> #include<cstri ...

  9. POI之Excel导入

    1,maven配置 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-oox ...

  10. 20145335郝昊《网络攻防》Bof逆向基础——ShellCode注入与执行

    20145335郝昊<网络攻防>Bof逆向基础--ShellCode注入与执行 实验原理 关于ShellCode:ShellCode是一段代码,作为数据发送给受攻击服务器,是溢出程序和蠕虫 ...