Peach Fuzzer漏洞挖掘实战

news2025/1/12 21:05:05

概述

本文主要介绍模糊测试技术,开源模糊测试框架Peach Fuzzer,最后使用Peach Fuzzer对Modbus Slave软件进行漏洞挖掘,并成功挖掘到0DAY漏洞。(文中涉及的漏洞已提交到国家漏洞库,现已修复)

模糊测试技术

模糊测试(Fuzz Testing)是一种黑盒测试技术,它通过自动生成一些随机、半随机或者经过分析的数据输入到程序中,来发现潜在的漏洞和错误。具体来说,模糊测试会将大量的随机数据输入到被测程序中,然后观察程序的行为,如果程序崩溃或出现异常,则说明发现了一个漏洞。模糊测试常常应用于网络协议、文件格式、解析器等需要接收输入数据并对其进行处理的软件系统。

在模糊测试中,测试用例通常是自动生成的,并尽量使其包含各种可能性的边界情况,例如最大值、最小值、非法输入、异常字符等。同时,模糊测试还可以根据具体的测试目标进行一些特定的配置,比如设置特定协议数据包的有效负载长度、使用不同的编码方式、调整模糊测试引擎的参数等。

模糊测试可以使用各种工具和框架来实现,例如American Fuzzy Lop(AFL)、Peach Fuzzer、Spike等。这些工具可以自动化生成测试用例并执行测试,同时还能够记录测试过程中产生的信息,帮助开发人员更快地定位问题。在实际应用中,模糊测试通常与其他测试技术(如静态分析、符号执行等)结合使用,以提高软件的质量和安全性。

Peach Fuzzer框架

Peach Fuzzer是一款基于模型的模糊测试工具,旨在帮助测试人员发现和利用软件程序中的漏洞和缺陷。它使用一种基于模型的方法,通过分析目标系统的协议、数据格式和行为规则来生成有效的测试用例。

Peach Fuzzer具有以下特点:

高度可定制性:

提供了一个高度可定制的框架,可以轻松地扩展和定制测试用例生成和数据分析功能,以满足各种测试需求。

模型驱动的测试:

测试过程是基于目标系统的数据模型进行的。通过对目标系统进行分析和建模,可以自动生成有效的测试用例,以验证系统的行为和规则。

多协议支持:

支持多种协议和数据格式,包括HTTP、FTP、SMTP、XML和JSON等,可以用于测试各种类型的应用程序和系统。

多平台支持:

支持多种操作系统和开发平台,包括Windows、Linux、macOS和Android等。

Peach Fuzzer框架的体系结构可以简化如下:

数据模型:表示输入和输出所需要的数据结构。

变异器:使用不同的变异策略,对数据执行变异。

生成器:生成字符串数据、整型数值等简单类型的数据,还可以生成复杂的分层的二进制数据,甚至是将简单的数据使用生成器拼接起来生成更复杂的数据类型的数据。

状态模型:在每个测试用例中,用户根据状态模型配置初始有限状态机,并进行维护。

代理:与测试引擎进行通信,对被测目标进行状态监视并对其进行执行控制。

测试引擎:使用解析器对pit配置文件进行解析,根据配置文件创建相应的组件并初始化,然后进入执行测试用例的主循环。

Peach Fuzzer使用方法

使用Peach Fuzzer进行模糊测试,最关键的是编写Pit配置文件。Pit文件是Peach Fuzzer测试用例生成器的核心配置文件,它是一种XML文件,包含多个元素,这些元素描述了测试用例生成器的数据模型、数据类型、范围、约束和默认值等信息。

Peach Pit文件通常包含以下几个部分:

Peach元素:定义Peach Pit文件的根元素。

DataModel元素:定义测试用例生成器的数据模型。数据模型由多个数据元素组成,每个数据元素表示一个测试用例的输入参数。

数据元素:定义测试用例输入参数的数据类型、范围、约束和默认值。数据元素可以是基本类型,例如整数、字符串和布尔值,也可以是复杂类型,例如结构体、数组和枚举类型。

StateModel元素:定义测试用例生成器的状态机模型。状态机模型描述了测试用例生成器的行为,例如测试用例的生成顺序、条件和转换等。

Action元素:定义测试用例生成器的动作。动作可以是发送网络数据包、写入文件、运行外部程序等。

Agent元素:定义测试用例生成器的代理。代理可以是客户端或服务器端,用于模拟测试用例的执行环境。

一个简单的Pit配置文件如下图所示:

Peach Fuzzer实战

Pit文件的编写至关重要,更多使用方法可以参考官方文档。现在,从编写简单Pit文件开始,以实际应用程序作为测试目标,熟悉和理解Pit文件的基本结构和参数配置,最后挖掘到0DAY漏洞。

首先,准备如下程序:

Peach Fuzzer程序:可从公开的源代码编译Peach Fuzzer,为简单起见,这里直接使用其他人编译后的Windows系统可执行程序Peach-3.1.124-win-x86-release。

目标程序:ModbusSlaveSetup32Bit.exe,Windows系统modbus工控协议从站模拟程序,曾被发现过漏洞。

调试器:使用Windows系统的Windbg调试程序,用于捕获模糊测试过程中的异常。

接下来安装并运行目标程序,Modbus Slave版本为7.5.1,如下图所示:

简单使用Modbus Slave程序,寻找可以模糊测试的功能点。在“File”菜单下的“Open”功能可以打开mbs后缀的文件。所以此次以mbs文件作为模糊测试的输入,编写Pit文件进行漏洞挖掘。

由于目前还不知道mbs文件的文件格式,所以在编写Pit文件定义数据模型时(DataModel)时,将其整个文件的内容作为模糊测时的变异数据。

定义数据模型的代码如下图所示:

其中Blob 元素常常用于代表缺少类型定义或格式的数据,hex表示内容为十六进制,value为空。

接下来定义状态模型,如下图所示:

其中Action元素中的filename的值是测试用例文件sample.mbs,这是一个空文件,需要在Peach.exe同目录下建立,StartModbusSlave是定义的调用方法。

然后再定义代理,如下图所示:

其中Monitor元素的class类型为WindowsDebugger,紧接着在参数WinDbgPath的Value中指定Windbg的目录(注意是文件夹),然后在CommandLine参数中指定运行目标程序打开变异后的测试用例的方法,最后在StartOnCall参数中指定调用StartModbusSlave方法。

最后定义Test元素,启动模糊测试,如下图所示:

其中状态模型(StateModel)元素的ref内容是之前定义的状态模型名称,Publisher元素的FileName内容是每次数据变异后保存的文件名,Logger元素的Path参数是配置的日志文件保存目录。

到此,一个针对mbs文件的模糊测试pit文件就完成了。最后执行命令Peach.exe  C:\fuzz\mbslave_mbs_pit.xml,启动模糊测试,如下图所示:

从模糊测试启动成功后,偶尔显示“File version error. Please upgrade to a newer version of Modbus Slave”对话框,如下图所示:

说明Modbus Slave软件在打开mbs后缀的文件时会检测文件版本,也就是说变异后的mbs文件版本不符合标准的mbs文件格式,导致模糊测试过程提前结束。

那么需要找到正确的文件版本,再调整数据模型(DataModel)的定义。使用反编译工具IDA打开mbslave.exe,根据字符串“File version error. Please upgrade to a newer version of Modbus Slave”找到对应的检查代码,如下图所示:

可以看到,确实检查了文件版本。经逆向分析,版本数据在mbs文件的前4个字节。此处选用最小的版本0xFA0进行测试,修改数据模型(DataModel)的配置,让其前4个字节固定为“A0 0F 00 00”,不参与数据变异,这样就可以通过版本检查代码。修改后的数据模型配置,如下图所示:

然后将sample.mbs的前4个字节也修改为“A0 0F 00 00”,如下图所示:

最后执行命令Peach.exe  C:\fuzz\mbslave_mbs_pit.xml,启动模糊测试,很快就捕获到了多个异常,如下图所示:

进入logs目录,找到EXPLOITABLE相关的文件夹,其下存放的1.Initial.Action.bin的文件就是漏洞触发的mbs文件,如下图所示:

根据调试器的日志文件,可以看到EIP寄存器已被定义为0x994a4f1d,这是一个不存在的地址,导致了异常,如下图所示:

至此,成功挖掘到一个0day漏洞。后经逆向分析,这是一个缓冲区溢出漏洞,感兴趣的读者可以自行调试。

项目地址

​​https://github.com/webraybtl/PeachFuzzer​​

概述

​​https://bbs.kanxue.com/thread-270106-1.htm​​

​​https://github.com/TideSec/Peach_Fuzzing​​

​​https://www.freebuf.com/articles/ics-articles/219996.html​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/444305.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电影《绿皮书》鉴赏

**《绿皮书》**由彼得法雷尔执导,维戈莫滕森和马萨拉阿里主演,改编自关于保镖托尼的真实故事。20世纪60年代,美国的种族关系紧张,黑人音乐家很少有机会演出。作为当时为数不多的黑人钢琴家之一,唐参加了许多音乐会巡演…

[chapter27][PyTorch][visdom]

前言: Visdom是Facebook专为PyTorch开发的实时可视化工具包,相当于TensorFlow中的Tensorboard,灵活高效且界面美观。 目录: 1: 环境安装 2: 参数简介 3: 监听单一数据 4: 监听多个数…

晶振电路并联一个电阻作用

晶振电路并联一个电阻的作用 前言 在设计电路时,通常看到一些主控的外部高速晶振并联了一个1MΩ的电阻,但是发现有的电路不用也可以正常工作,对这个就有点好奇啦? 电路图如下: 实际上晶振电路在工作时没有并联一个1…

如何使用Sublime来规范化代码的格式,让代码更加规范整齐,批量修改代码

如何使用Sublime来规范化代码的格式,让代码更加规范整齐,批量修改代码 设备/引擎:Mac(11.7)/cocos 开发工具:Sublime Text 开发语言:c/java 代码开发中经常需要将代码进行规范化处理&#x…

PHP +python+nodejs+springboot+vue 校园电子资料资源管理系统

能实现不出家门就可以通过网络进行系统管理,交易等,而且过程简单、快捷。同样的,在人们的工作生活中,也就需要互联网技术来方便人们的日常工作生活,实现工作办公的自动化处理,实现信息化,无纸化…

js录音支持h5 pc ios android

最近在做h5录音的页面要求可暂停录音,继续录音,写好后发现不兼容ios,无奈只能找兼容方法,找了一天也没找到,后来看到一个网站在ios上可以暂停录音,后来引入他的js文件果然能用了 网站放下面了 Recorder H5: 用于html5网页中的前…

ASP.NET ZERO Crack坚实的体系结构

ASP.NET ZERO Crack坚实的体系结构 据说ASP.NET ZERO是互联网应用程序新流程的起点,该流程包含现代用户界面,具有强大的体系结构和完整的源代码。它可以通过提供共享的应用程序来节省用户时间,这些应用程序是visual studio预构建解决方案所必…

PostMan笔记(一)简介+安装和设置

1. PostMan简介 Postman 是一款功能强大的 API 开发工具,支持多种 HTTP 请求方法和测试断言,能够快速调试和测试 API 接口,提高开发效率。本文将介绍 Postman 工具的使用方法。 安装和设置 首先,需要下载和安装 Postman 工具。…

[ChatGPT]-02-ChatGPT对安全的影响和开源的LLM大模型资源汇总

文章目录 0.ChatGPT大模型带来的影响0.1 ChatGPT带来信息化革命性创新,目前尚不能处理专业知识但成长很快0.2 Chat GPT为网安行业带来新的创新方向,也将引领新一轮投融资热潮0.2.1 攻击方发起网络攻击的门槛降低0.2.2 防守方合理使用ChatGPT可大幅减少安…

零基础入门前端--JavaScript 循环结构语句

循环控制 控制程序重复执行若干次相同或似的逻辑,理解并正确使用循环控制,需要搞清楚循环的3个要素:起始值、变化量、终止条件。 ○ 起始值循环的起点,可以是【任意数据类型值】 ○ 变化量是指【改变起始值的方式】 ○ 终止条…

深度学习算法及卷积神经网络

目录标题 传统神经网络矩阵计算:正则化:激活函数sigmoid损失函数前向传播激活函数Relu数据预处理DROP-OUT 卷积神经网络(CNN)1.CNN网络的构成2. 卷积层2.1 卷积的计算⽅法2.2 padding2.3 stride2.4 多通道卷积2.5 多卷积核卷积2..6 特征图大小 3. 池化层…

无法打开“fsevents.node

在Mac 打开vue项目的时候「c c」出现这个,可能是一个项目多个ide打开, 如何解决呢? 图1 把 node_modules 文件夹删了,在编译一把。也就是 npm install npm install

配置中心Disconf、SpringCloudConfig、Apollo、Nacos比较

Config Server Center 1、Disconf 1、1简介 2014年7月百度开源的配置管理中心,同样具备配置的管理能力,不过目前已经不维护了,最近的一次提交是两年前了。 2、SpringCloudConfig 2-1、简介 2014年9月开源,Spring Cloud 生态…

技术选型|日志采集和管理工具您都了解哪些,看这篇就够了

简介 对于日志管理当前网络上提供了大量的日志工具,今天就给大家分析总结一下这些常用工具的特点,希望对你们在选型时有所帮助,如果有用记得一键三连。 1、Filebeat Filebeat是用于转发和集中日志数据的轻量级传送程序。作为服务器上的代理…

2_STM32最小系统设计

MCU最小系统:一个MCU在正常工作中,正常下载程序前提下的最简电路。 最简电路包含: 供电电路、复位电路、时钟电路(高速时钟、低速时钟):2个外部晶振、Boot启动模式选择(跳线帽)、下载电路(uart/JTAG/SWD)、后备电池VBAT(维持后备区…

使用vscode+cmake进行c++代码编写

1. 前言 因为vcode的主题格式比visual studio好看,而且注释使用ctr/注释非常方便。所以对于一下小型的c代码测试,例如用不到外部库,只需要纯c自己语法,我就想和python一样,在vscode上写。因此记录一下比较简单的典型的…

SAP ABAP 使用SICF发布HTTP API接口

一、SE24创建类:Z_HCX_HTTP 1、创建类: 2、切换到接口(interface)页签,输入IF_HTTP_EXTENSION ,回车。切换到方法(method)页签,双击IF_HTTP_EXTENSION~HANDLE_REQUEST进…

Linux学习记录——십구 进程间通信(1) 管道

文章目录 1、进程间通信介绍1、目的2、发展 2、管道1、原理2、简单模拟实现3、总结 3、匿名管道——控制进程4、命名管道1、原理2、模拟实现 1、进程间通信介绍 之前所学都是单个进程,多个进程之间如何运转? 1、目的 数据传输:一个进程需要…

Linux下SOCKET编程

一、SOCKET编程 1、socket()函数 int socket(int protofamily, int type, int protocol);//返回sockfd返回值sockfd是描述符。 socket函数对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字,而socket()用于创建一个socket描述符(socke…

2. C++使用Thread线程参数传递问题

1. 说明 在子线程函数中进行参数传递,实际上是Thread类的构造函数对传递的参数进行了拷贝,拷贝到线程独立的内存中,及时参数是引用的形式,也可以在新线程中进行访问,如果参数传递时的类型不一致,在线程的上…