正式推出:使用Peach进行模糊测试从入门到放弃
优采云 发布时间: 2022-11-25 16:39正式推出:使用Peach进行模糊测试从入门到放弃
概述
本文对模糊测试技术进行总结分析,介绍开源模糊测试框架Peach的结构原理及坑文件编写方法,旨在帮助对模糊测试感兴趣的小伙伴快速上手peach。以工控Modbus协议为例进行实验。文末采集
了本文所用到的工具和相关资料,供大家下载。
模糊概念
模糊测试(fuzzing)技术是一种安全测试技术。通过构造畸形输入数据,使软件出现崩溃等异常,从而发现软件中存在的安全问题。由于模糊测试技术具有全面遍历所有输入数据、代码覆盖全面、测试自动化、能够有效发现软件安全问题等特点,受到信息安全漏洞分析领域研究人员的广泛欢迎。
目前,Fuzzing技术已经成为软件测试和漏洞挖掘领域最有效的手段之一。Fuzzing技术特别适合发现零日漏洞,也是很多黑客或黑帽发现软件漏洞的首选技术。虽然fuzzing不能直接达到入侵的效果,但是fuzzing非常容易发现软件或者系统的漏洞。以此作为深入分析的切入点,更容易找到入侵路径。这就是黑客喜欢模糊测试技术的原因。
原则
1. Fuzzing技术首先是一种自动化技术,即软件自动执行相对随机的测试用例。由于是计算机软件自动执行,测试效率比人高出几个数量级。例如,一个优秀的测试人员一天最多能执行几十个测试用例,很难达到100个,而Fuzzing工具很容易在几分钟内执行数百个测试用例。
2. Fuzzing技术的本质是依靠随机函数产生随机测试用例。随机性意味着不重复、不可预测和意外的输入和结果。
3、根据概率论中的“大数定律”,只要我们重复的次数足够多,随机性足够强,就必然会出现概率极低的偶然事件。Fuzzing技术是大数定律的典型应用。足够多的测试用例和随机性,可以让那些隐藏得很深、很难出现的bug不可避免。
执行
在Fuzzing引擎算法中,主要有两种生成测试用例的方式:
1) Mutation-based:基于已知数据样本通过变异生成新的测试用例;
2)Generation-based:基于已知协议或接口规范建模生成测试用例;
在一般的 Fuzzing 工具中,这两个*敏*感*词*是结合使用的。基于变异的算法的核心要求是学习现有的数据模型,基于现有的数据和对数据的分析,然后生成随机数据作为测试用例。
实施过程
基于网络协议的Fuzz测试的实现过程如下:
1 获取待测协议的正常数据包
2 用变异数据替换数据包的某些部分
3 使用数据包*敏*感*词*向目标应用程序发送数据包
4 观察目标应用的反应
通常,客户端与被测设备正常交互的报文会被抓包器抓取为正常报文样本进行测试。通过任意方式更改随机数据。例如,可以对整个数据包进行加扰,或者对数据包的某一部分进行替换。无论采用何种方法来变异数据,关键是将大量随机数据放入数据包中,然后将该数据包发送到目标应用程序并观察目标应用程序的行为。
常用的fuzz框架
在研究网络协议模糊测试时,sulley和peach这两个框架是最常见的Fuzz框架。与sulley相比,peach有以下优点:
1、从功能上来说:苏利和桃子的功能是一样的。Peach可以对各种协议和文件进行模糊测试,而sulley只能测试网络协议。
2、开发角度:Peach侧重于xml文件的编写,比较容易理解,其余的几乎无法重写;sulley使用python代码编写测试,可以开发一些插件,*敏*感*词*等,适合深度开发。
3、维护方面:sulley目前已经停止维护,peach的相关资料和研究人员也比较多。
4、安装部署:sulley配置环境相对繁琐,peach配置环境相对简单。
桃子的介绍
Peach 是由 Deja vu Security Company 的 Michael Eddington 创建和开发的。是一个符合MIT开源许可证的模糊测试框架。它是第一个全面的开源模糊测试工具,包括进程监控和创建模糊测试器。模糊器的创建是通过 XML 语言实现的。Peach 已经进行了 7 年的主要开发,并发布了 3 个主要版本。最初用Python编写,2004年发布,2007年发布第二版,2013年初发布Peach 3,第三版用C#重写了整个框架。
Peach支持文件格式、ActiveX、网络协议、API等的Fuzz测试;Peach Fuzz 的关键是编写 Peach Pit 配置文件。
安装部署
Windows下使用Peach3需要提前安装Microsoft.NET4和windbg;在 Linux 和 OS X 下,你需要安装 Mono 包。
Peach 不是开源软件,而是 MIT 许可证下的免费软件。与 BSD 许可证一样,MIT 许可证对 Peach 的使用和修改没有任何限制。
我用的绿色版windows在peach文件夹里收录了peach最新的4个版本的软件包,分别是windows版(x86)、windows版(x64)、oxs版、linux版、python版,各位可以下载使用。
建筑学
Peach模糊测试工具是一个开源的模糊测试框架,包括数据模型(数据类型、mutator接口等)、状态模型(数据模型接口、状态、动作-输入输出等)、agent(包括本地调试器)如WindowsDebugger和网络监视器如PcapMonitor等),测试引擎(broker接口,状态模型接口,publisher,logger等)
Peach 具有以下高级概念:
1)数据模型:用来表示输入输出所需的数据结构。可以根据需要构建数据模型。在数据模型中,用户可以设置数据变量,为数据变量指定数据类型,如字符串类型、整型等,还可以设置数据变量的值,指定变量是否执行根据修改器的接口进行修改操作。也可以在数据模型中设置数据块,一个数据块可以收录
多个数据变量。也可以在数据变量之间设置关系,例如类型关系的大小。
2)Mutator:包括变异策略,不同的数据类型有不同的变异策略。
3)*敏*感*词*:Peach*敏*感*词*可以生成字符串数据、整数值数据等简单类型的数据,也可以生成复杂的分层二进制数据,也可以将简单的数据*敏*感*词*串联起来,生成更复杂数据类型的数据。
4)状态模型:在每个测试用例中,Peach根据状态模型,根据用户配置初始化状态机,并维护有限状态机,每个状态包括一个或多个操作。在每个状态下,Peach 状态机按顺序执行每个操作。用户可以为操作设置相应的执行条件。当一个状态下的所有操作都执行完后仍然保持当前状态时,状态机的执行结束。
5)代理:在Peach模糊测试过程中,Peach测试引擎与Peach代理通信,监控目标状态并控制其执行。用户必须为Peach agent设置一个Peach*敏*感*词*,以监控被测程序的状态,进行启动被测程序或停止目标被测程序等执行控制。每次测试迭代或测试子用例执行后,Peach agent都会将Peach monitor监控到的被测目标程序的异常状态信息(如crash)返回给Peach测试引擎。如果被测目标程序正常执行完毕,会返回正常结束标志信息给Peach测试引擎。
6)测试引擎:使用Peach解析器解析用户输入的配置文件(一般为pit格式的文件),根据配置文件创建并初始化相应的组件,如初始化状态模型的状态机,以及然后Peach测试引擎进入执行测试用例的主循环。测试引擎中的发布者可以为任何*敏*感*词*提供透明接口。常见的发布者包括文件发布者或TCP网络发布者。发布者是生成数据的一种传输形式。用户(二次开发者或用户)可以将自己的*敏*感*词*连接到不同的输出。记录器可以设置日志的路径和文件名,将测试执行过程中的状态信息记录到日志文件中。
手动的
Peach的测试对象包括几乎所有常见的Fuzz对象,如文件结构、com、网络协议、API等。
使用Peach进行fuzzing的主要步骤如下:
1.创建模型
2.选择/配置发布者
" />
3.配置agent/monitor
4.配置记录
命令参数
-1:执行第1次测试。<br />-a:启动Peach代理。不指定”channel”默认为本地代理(默认支持,无需显式启动);“channel”可以指定为”tcp”远程代理。<br />-c:统计测试用例数。<br />-t:验证Peach Pit xml文件正确性。<br />-p:并行Fuzz。运行Peach的机器总数为M,这是第N个。<br />–debug:调试信息开关。<br />–skipto:指定Fuzz跳过的测试用例数。<br />–range:指定Fuzz的测试用例范围<br />
坑文件文件格式
Peach 将用于数据定义的文件称为Peach 坑文件。在使用Peach的时候,主要的工作其实就是定义这样一个xml文件来指示Peach测试平台进行测试。桃坑文件基本上总是收录
以下部分:
<br /><br /> <br />原始数据结构定义 <br />测试逻辑,状态转换定义,如收到什么样的数据包之后,发出什么样对应的数据包 <br />检测 exception,crash 等 <br />指定将要使用到的 state,agent,publisher 等<br />Fuzzer 执行的进入点<br /><br /><br />1)整个文件被一个大标签 包括。<br /><br />2)文件中的第二级标签包括 Include,DataModel,StateModel,Agent,Test,Run 共 6种。<br /><br />3)Include 包含的外部文件,其中 defaults.xml 和 PeachTypes.xml 是必须的,里边含有Peach的基本方法、类、数据类型等。<br /><br />4)DataModel 用于定义数据结构,此标签下还可以有若干级、若干种下级标签。使用这些子标签可以比较容易的定义数据的类型,大小,各个数据块之间的关系,以及 CRC 校 验和等。还可以定义多个 DataModel,多个 DataModel之间可以有关系也可以没有关系。<br /><br />5)StateModel 用于定义测试的逻辑,实际上相当于一个状态机。下级标签包括 State, 每个 State 中又可以包含若干个 Action 标签。State 表示一个状态,不同的 State 之间可以根 据一些判断条件进行跳转。Action 用于执行打开文件,发送数据包之类的命令。<br /><br />6)Agent 是一个主要功能是用来监测被测目标的反应,如 crash 等。<br /><br />7)Test 这个标签域比较简单,一般只是制定使用哪个 Agent,哪个 StateModel,用什么 方法发数据,有时还会指定使用什么方法加工(变异)数据。<br /><br />8)Run 这个标签域也比较简单,指定当前这次 Fuzz 测试使用哪个 Test。<br />
包括配置
Include 元素允许将其他坑文件收录
到当前坑文件的名称空间中。引用收录
的 Pit 文件时,使用命名空间前缀后跟冒号的格式。格式为:name:DataModel,如下:
属性:
Ns——必须的。命名空间前缀。
来源——必填。源代码URL,使用“file:”前缀命名文件名。
数据模型配置
Peach Pit文件收录
至少一个DataModel元素,DataModel描述的数据包括类型信息、关系信息(大小、数量、偏移量)和其他允许模糊器进行智能变异的信息。DataModel 是 Peach 根元素的子元素之一,它通过添加子元素(例如 Number、Blob 或 String)来定义数据块的结构。
属性
姓名——必填。在引用模型或调试时,友好的 DataModel 名称非常有用。
参考 - 可选。引用 DataModel 模板。
可变 - 可选,默认为 true。元素是否可变。
约束——可选。确定帮助 Peach 确定是否已正确使用数据元素的表达式。
子元素
块、选择、自定义、标志、标志、数字、填充、字符串、XmlAttribute、XmlElement、关系、修复、转换器、放置
一个名为“HelloTide”的数据模型,它收录
一个字符串并输出“Hello Tide!” 看起来像这样:
一个 DataModel 可以引用其他 DataModel,并且可以继承具有 ref 属性的子元素。如下:
状态模型配置
StateModel 重新创建测试协议所需的基本状态机逻辑。它定义了如何向目标发送和接收数据。StateModels 的范围从非常简单到极其复杂。建议从保持状态模型简单开始,然后根据需要扩展它。
StateModel收录
一个子元素state,它封装了一个为Peach工作的逻辑单元,然后执行一个大的状态模型。状态由动作组成,每个动作可以执行与单个状态如何封装逻辑相关的任务。
Action 元素可以在 StateModel 中执行各种操作。Action 是向 Publisher 发送命令的主要方式,它可以发送输出、接收输入或打开一个连接。动作还可以更改为 StateModel 中的其他状态,在 DataModel 之间移动数据,以及调用代理定义的方法。
代理配置
代理是可以在本地或远程运行的特殊 Peach 进程。这些进程有一个或多个监视器,可以执行诸如加载调试器、查看内存消耗或检测错误等操作。代理中的监视器可以代表模糊器采集
信息并执行操作。
常用的代理包括:本地代理、TCP远程代理、ZeroMQ、REST Json代理,其中前两种使用较多。
本地代理
Peach 运行时支持进程内本地代理。如果未指定,则这是默认代理类型。配置本地代理如下:
TCP 远程代理
代理位于本地或远程计算机上的单独进程中,并通过 TCP 远程连接,TCP 是本地运行时支持的一种 RPC 形式。为了使用远程代理,代理进程必须首先运行。
代理配置
在远程主机上运行 peach.exe -a tcp
监控配置
Monitor主要有以下几种类型的监视器:windows监视器、OSX监视器、Linux监视器和跨平台监视器。每个平台都有许多类型的监视器。
windows*敏*感*词*包括:Windows Debugger Monitor、cleanup registry monitor、pageheap monitor、PopupWatcher monitor、windowsService monitor等。
OSX 监视器包括:CrashWrangler Monitor、CrashReporter Monitor
Linux 监视器包括:LinuxCrash
" />
跨平台监控包括:canakit中继监控、清理文件夹监控、IpPower9258监控、内存监控、Pcap监控、Ping监控、进程监控、Processkiller监控、保存文件监控、socket监控、ssh监控、ssh下载监控、vmware监控等.
官方文档如下:
举几个常见的例子供参考。
Windows 调试器监视器
WindowsDebugger 监视器控制 Windows 调试句柄。主要用于以下用途:进程调试、服务调试、内核调试。
必填参数
必须参数:<br />Commandline---用逗号分隔的窗口名字。<br />Processname---当找到一个窗口的时候,触发错误,默认为假。<br />Kernelconnectionstring---内核调试的连接字符串。<br />Service---要挂载的windows服务名称。如果停止或者崩溃,服务将会被启动。<br />
可选参数
Symbolspath---符号表路径或者服务。默认为:“SRV*http://msdl.microsoft.com/download/symbols”<br />Windbgpath---windbg的安装路径。尽量在本地。<br />Noncrystalline---直到从状态模型的匹配调用完成时,debugger才会被挂载。<br />Ignorefirstchanceguardpage---忽略第一个机会机会保护页面错误。这些有时是假阳性或反调试错误。默认为假。<br />Ignoresecondchanceguardpage---忽略第二个机会保护页面错误。这些有时是假阳性或反调试错误。默认为假。<br />Nocpukill---不要使用进程CPU使用率提前终止。默认为假。<br />Faultonearlyexit---如果进程存在,触发错误。默认为假。<br />Waitforexitoncall--如果时间间隔到了,-等待状态模型调用的进程退出和参数故障。<br />Waitforexittimeout---等待退出,timeout值单位为微秒。(-1位无穷大)默认位10000。<br />Restaroneachtest---为每次迭代重启进程。默认为假。<br />
其他参数示例
CrashWrangler 监视器
CrashWangler 监视器将启动一个进程并监视感兴趣的崩溃。该监视器使用 Apple 自己的 CrashWrangler 工具,可以从开发者网站下载。为了使该工具正常运行,必须在每台机器上对其进行编译。
范围:
Command---要执行的命令。<br />Arguments---命令行参数,可选,默认没有。<br />StartOnCall---状态模型调用的启动命令。可选,默认没有。<br />UseDebugMalloc---使用OSX Debug Malloc(比较慢),可选默认为假。<br />ExecHandler---Crash Wrangler 执行处理程序,可选,默认为exc_handler。<br />ExploitableReads---读a / v被认为是可利用的?可选,默认为假。<br />NoCpuKill---通过CPU使用禁用进程杀死。可选,默认为假。<br />CwLogFile---CrashWrangler记录文件。可选,默认为cw.log。<br />CwLockFile---CrashWrangler锁文件,可选,默认为cw.lock。<br />CwPidFile---CrashWrangler PID文件,可选,默认为cw.pid。<br />
Linux崩溃*敏*感*词*
LinuxCrash 监视器使用内核中内置的脚本捕获错误的进程。
范围:
Executable---目标可执行程序,被用于过滤崩溃,可选的,默认为所有。<br />LogFolder---记录文件的文件夹。可选默认为“/var/peachcrash”。<br />Mono---mono执行=程序所需的运行时的全路径。可选,默认为“/usr/bin/mono”<br />
测试配置
指定使用哪个Agent、StateModel、Publisher用什么方法发送数据、用什么方法变异数据、日志文件路径等。可以有多个Test。使用 peach 命令行时,指定要运行的测试的名称。如果您没有指定默认运行名称为“Default”的测试。如下所示:
属性:
Name---必备的,test元素的名字,默认为“Default”。<br />Waittime---每次测试之间的等待时间,默认为0。<br />Faultwaittime---在开始下一次迭代时等待错误的时间,默认为0。<br />controlIneration---我们只需控制迭代的频率,默认为0。<br />
有效的子元素:
Agent(可选)<br />StateModel(必须)<br />Publisher(必须)<br />Include(可选)<br />Exclude(可选)<br />Strategy(可选)<br />Logger(可选,推荐)<br />
例子:
记录器配置
Peach 有一个可扩展的记录系统,允许用户存储任意数量的记录。默认情况下,Peach 使用单独的文件系统记录器。
策略配置
策略(mutation strategy)包括:
随机:默认情况下,将随机选择最多 6 个元素(可以通过参数 MaxFieldsToMutate 设置)使用随机变异器进行变异。
Sequential:Peach 将使用其所有可用的 Mutator 依次改变每个元素。
RandomDeterministic:Peach 默认规则。该规则根据Mutators生成的Iterations列表,将pit xml文件中的元素按照相对随机的顺序(由链表中元素的个数决定)进行混淆,因此每个xml文件生成的测试用例的个数和顺序为fixed,从而保证跳转的准确性。
Peach3包括元素增删改查、交换、经验值、逐位、双字等Mutators。
示例运行
根据以上坑参数,做了一个HelloTide的例子,了解坑文件的基本参数配置和结构。
HelloTide的坑文件已经上传到github:
<br /><br /><br /> <br /> <br /> <br /><br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /><br /><br /> <br /> <br /> <br /> <br /> <br /> <br /><br /><br /> <br /><br /><br />
在 cmd 中运行 peach.exe samples\HelloTide.xml。运行后,Peach 会以这个原创
字符串为模板,对大量畸形数据进行变异,包括超长字符串、缺失 NULL 终止符的非法字符串、格式化字符串等。等待可能导致程序错误的字符串,然后一一打印出来。
log日志记录如下
解决方案:RFID智能手持PDA和标签在资产管理中的应用,有效增强企业竞争力
据调查,200人以上的企业缺乏完善的智能化管理系统,将导致固定资产损耗率10-15%,资产闲置率20%,固定资产重复采购率10% . 对企业的经营产生了不好的影响,直接增加了企业的经营成本,造成了资源的浪费。
" />
随着企业规模的扩大和人员的增加,固定资产的数量和种类以及存放地点呈线性增长,这就增加了固定资产管理的难度。传统资产管理采用人工纸质记录管理,耗时长。也很费力。要想缩短盘点时间,就得投入大量人力,人工纸质记录很容易出错。为了提高工作效率,使固定资产的日常管理更加顺畅,广州飞智创洋采用RFID技术结合RFID电子标签和RFID智能手持终端PDA,开发出一套RFID固定资产管理系统,使固定资产实现自动化管理和快速盘点,提高设备利用率,
RFID技术相当于新一代的自动识别技术。它具有读取数据信息速度快、效率高、自动化程度高、适应性广、能够存储大量数据信息、承载介质非常强大等一系列优点。此外,还可以利用RFID技术对固定资产进行快速、准确的识别和批量盘点,从而达到对固定资产全生命周期进行智能动态跟踪和集中监控的目的,从而为企业提供合理配置。资产。一个有效的依据。
" />
在飞扬RFID固定资产管理系统中,首先需要为企业的固定资产贴上RFID电子标签,采用一物一码的管理模式。标签中收录
的资产的所有信息都会随着资产情况的变化而变化。资产信息数据也将及时更新,确保数据的准确性和时效性,实现资产从进货、采购、验收、入库到报废的闭环全生命周期管理;通过RFID智能手持终端PDA,可以批量读取固定资产上的RFID电子标签,然后将数据传输到系统后台,可以对固定资产的入库、提取、盘点等操作进行数据采集,
广州飞智创洋(条码扫描*敏*感*词*丨PDA手持终端丨标签打印机丨RFID电子标签-广州飞智创洋)致力于条码、二维码、RFID等技术应用系统及RFID智能手持终端PDA的研发等应用设备,在这些专业领域有着多年的行业经验,得到了客户的高度认可!详情请咨询广州飞智创洋。