浅析 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需要预先安装.net 4和windbg;Linux、OS X下需要安装Mono .net开发框架。

2.2 命令行参数

image001

“channel”可以指定为”tcp”远程代理。

3、Peach文件Fuzz

3.1 Peach文件Fuzz流程图

image002

3.2 Peach Pit

在使用Peach进行Fuzz之前需要编写被称为”Peach Pit”的xml配置文件,其中包含着如何进行Fuzz的关键信息,如下图:

image003

其主要元素包括:

一个Pit文件至少会包括一个或多个DataModel,描述数据类型信息,关系(大小、数量、偏移量),和其它允许智能Fuzz的信息。如下图:

image004

其属性包括:

1) name:数据模型的名字[必须]。
2) ref:引用模版数据模型[可选]。DataModel有ref属性时,与被引用DataModel类似

于子类与基类的关系,基类数据会被子类继承,子类子元素会覆盖基类同名子元素,

3) mutable:数据元素可变异性[可选,默认true]。

其主要子元素:Blob、Block、Choice、Flags、String、Number、Relation等。

1) Blob:常用于表示没有类型定义和格式的数据,如下图:

image005

其主要属性包括:

2) Block:用来组合一个或者多个的其他元素。Block和DataModel是很类似的,一个重要区别在于它们的位置,DataModel是顶级元素, Block是其子元素。

其不同于DataModel的属性包括:

3) Choice:每次选择其中一个元素,类似switch语句。如下图:

image006

minOccurs为最小生成Choice数;maxOccurs为最大生成Choice数,-1为无上限;occurs为必须产生的次数,如果不能达到这个次数,异常退出。具体匹配实现按照Choice中Block顺序,crack(解析)数据时根据token匹配一个Block后,数据位置后移匹配Block大小,继续按照Choice中Block顺序从头匹配。
4) Flags: Flag元素定义包含在Flags容器中的位字段,如下图:

image007

其主要属性包括:

5) String:定义一个或者双字节的字符串,如下图:

image008

其主要属性包括:

utf32 [可选]。

6) Number:定义了长度为8,16,24,32 或者64位的二进制数字,如下图:

image009

其主要属性包括:

7) Relation:用于连接两个大小、数据、偏移量相关元素,如下图:

image010

type类型为size时,of表示Number 是Value字符串的字节数。expressionGet用于crack过程,表示读”Value”多少字节。expressionSet用于publishing过程,为Publisher 生成Number值。

用于定义测试的逻辑,实际上相当于一个状态机。如下图:

image011

下级标签包括State,每个State中又可以包含若干个Action标签。

1) State:表示一个状态,不同的State之间可以根据一些判断条件进行跳转,通常和Action的when属性联合使用。如下图:

image012

2) Action:用于完成StateModel中的各种操作,是给Publisher发送命令的主要方式。Action能发送输出、接收输入、打开连接,也能改变State等。主要属性:

start:启动Publisher,隐含动作,一般不需要。

stop:停止Publisher,隐含动作,一般不需要。

input:接收或者读取来自Publisher的输入,需要指定DataModel,用于crack和包含输入数据。

ouput:通过Publisher发送或者写输出,需要一个DataModel ,包含可选data,如下图:

image013

是所有Publisher都支持。

是能够运行在本地或者远程的特殊的peach进程,这些进程能够启动监视器监控被测目标,如附加调试器、检测crash等。如下图:

image014

远程Agent需要首先在远程目标机通过peach –a tcp启动远程代理,无需pit文件。本地peach pit文件添加如下图location,其中ip为目标机ip。

image015

可用Monitor如下图:

image016

Windows Debugger Monitor通过windbg控制一个windows调试实例,主要参数:

image017

文件fuzz时上述文件名fuzzed.wav需要与Publisher参数一致。如下图:

image018

Peach3对非内核目标使用的混合调试模式,首先通过CreateProcess DEBUG_PROCESS参数创建调试进程,当检测到被测目标有感兴趣faults产生时会使用windbg的dbgeng.dll进行重现调试,最后利用windbg插件msec.dll的!exploitable命令对漏洞的可利用性进行初步判断,记录结果。

指定使用哪个Agent、StateModel,Publisher用什么方法发送数据,使用什么方法变异数据,日志文件路径等。可以有多个Test,使用时通过peach命令行指定要运行的Test名称,未指定默认运行名称为”Default”的Test。如下图:

image019

Strategy(变异策略)包括:

生成的Iterations链表做相对随机(由链表中元素数目决定)的顺序混淆,所以每个xml文件每次运行生成的测试用例多少、顺序固定,这样才能保证skipto的准确性。Peach3包括元素增、删、改、交换,经验值,逐位、双字等Mutators,见下图:

image020

3.3 Fuzz Wav文件

image021

image022

image023

image024

image025

参考文献

www.peachFuzzer.com

《浅析Peach-Fuzz》文章下载
浅析Peach Fuzz

更多文章请访问:
http://www.nsfocus.com.cn/research/qyjs.html

源链接

Hacking more

...