起毛

本文分为上、中、下三篇文章,介绍了现有的一些优秀的fuzzing开源项目,这些项目应用于不同的方向,包括针对通信协议的Fuzzers和针对文件的Fuzzers。
01通信协议模糊器
BooFuzz,一个用于通信协议的开源模糊工具1.什么是BooFuzz?
BooFuzz是一个开源的网络协议模糊测试框架。它是用Python语言编写的,可以部署在Windows、Linux和Mac平台上。BooFuzz继承了Sulley,它为网络协议的模糊测试提供了规范和功能。在此基础上,可以为特定目标编写Python脚本,为目标量身定制fuzz,但这需要开发人员对测试协议的格式有一定的了解。BooFuzz不会直接模糊服务器程序或客户端程序。为了更好地模拟真实情况下服务器或客户端的工作状态,其模糊测试对象是会话。
BooFuzz可以用来测试物联网设备的通信协议。路由器、HTTP服务器、Telnet等模块通常可以与外界进行交互,从而为攻击者提供了一个入口。如果这些模块或协议易受攻击,它们可能被直接用于远程攻击,从而带来严重的安全风险。BooFuzz根据测试人员编写的脚本生成大量变体消息,并发送给目标设备,实时监控目标设备,通过设备服务的可用性判断设备崩溃。
与Sulley不同的是,BooFuzz还具有以下特点:更简单的安装体验;支持多种协议,灵活多变;内置串行模糊测试,以太网和IP层,UDP广播;能更好的记录测试数据;测试结果CSV导出等。
由于BooFuzz继承了Sulley的框架,所以想要了解BooFuzz的框架,首先要了解Sulley的整体框架。Sulley框架如下:
从图中基本可以看出,Sulley主要包括四个组件,分别是数据生成、会话、代理和实用程序。其整体架构类似于peach和sfuzz,是很好的商业架构。
目前BooFuzz主要支持socket和串口serial两种底层通信方式。这两种通信模式可以扩展为TCPSocketConnection、UDPSocketConnection、SSLSocketConnection、RawL2SocketConnection、RawL3SocketConnection、SocketConnection和SerialConnection。
BooFuzz可以从socket底层开始封装测试,比如可以测试tcp、udp、ftp、http等协议。这种模糊工具的另一个典型特征是必须有一个监视器来监控崩溃。BooFuzz本身提供了三种监视器:networkmonitor、processmonitor和callbackmonitor。BooFuzz支持的编译算法比较简单,只支持字符串、num和字典数据的变化。
2.编写模糊脚本
2.1创建会话对象
所有的Fuzz都是针对对象的,也就是说,在开始Fuzz之前,我们必须先确定要Fuzz哪个程序。BooFuzz是对Session的模糊测试,所以我们需要先定义一个Session对象。当您创建会话时,您将传递一个目标对象,该目标对象本身接收一个连接对象。例如:
2.2定义消息
准备好会话对象后,您需要在协议中定义消息。具体可参考静态协议定义:https://boofuzz . readthe docs . io/en/stable/user/static-protocol-definition . html # static-primitives。
每个消息都以s_initialize函数开始,该模块的通用语法如下:
以下是fuzz FTP协议中的几种消息定义:
2.3连接请求
如果您需要一个以上的模糊请求,您需要以一定的顺序连接已定义的请求。User、pass、stor和retr消息在以前的fuzz FTP协议中定义。定义消息后,之前定义的请求应该按照一定的顺序连接,例如:
会话.连接)
session.connect,s_get)
session.connect,s_get)
session.connect,s_get)
意思是pass请求应该发生在用户请求之后,stor和retr应该发生在pass之后,但是两个请求之间没有明确的顺序关系。上面的代码相当于下图:
请参阅BooFuzz快速入门指南的官方文档:
https://boofuzz . readthedocs . io/en/stable/user/quick start . html
3、BooFuzz实战
3.1BooFuzz安装
这里只介绍kali linux中的安装。其他系统的安装方法请参考官方手册:
https://boofuzz.readthedocs.io/en/stable/user/install.html
BooFuzz需要不低于3.5的Python版本和pip安装,所以要保证pip和setuptools的最新版本,执行命令pip3 install -U pip setuptools更新pip和setuptools的版本,然后执行pip install boofuzz命令进行安装。
3.2实践思维
3.3启动模糊
步骤1根据网络数据包构造请求。
比如要对路由器的登录界面进行fuzz测试,先访问路由器的登录界面,用BurpSuite设置代理,抓包。请注意,在启动之前,您应该尽可能多地与设备进行交互。BooFuzz方法不仅仅限于物联网设备,还可以用于测试常见的服务程序。
在这里,我们将对bWapp的登录界面进行模糊测试。首先使用bWapp登录界面,使用BurpSuite捕获包。BurpSuite捕获的消息如下:
根据数据包消息,HTTP请求由BooFuzz框架定义:
步骤2设置会话信息
定义一个Session对象,其中的参数包括TCP连接、每个fuzz的时间间隔和每个fuzz日志的输出。格式如下:
下面是最简单的会话设置,包括IP地址和端口:
完成后,将我们构建的请求包作为唯一的节点添加到我们的对话图中:
会话.连接)
添加显示器
如前所述,确定目标设备是否崩溃的方法之一是确定设备是否在线。结合步骤2中引用的函数Remote_NetworkMonitor,此函数不是官方API,可能无法添加。其核心代码如下:
注意:所有部分设置好之后,需要调用session.fuzz进行测试。
编写一个完整的测试脚本。
进入boofuzz目录,创建测试脚本bfuzztest.py,编写脚本。完成的脚本内容如下:
开始起毛
执行python 3[脚本文件名]运行写好的脚本。
每次测试的日志数据都会保存到当前目录下boofuzz-results目录下的SQLite数据库中。运行boo open将在端口26000上打开一个Web服务器来控制和检查测试进度。只需在浏览器中访问localhost:26000即可。
对于测试过的漏洞,我们需要根据测试结果分析原因。Kali自带DB Browser for SQLite工具,可以用来打开boofuzz-result目录下的相关文件,查看fuzz的日志。您可以使用数据库查看软件查看其他系统中的日志。
从数据库中可以看到,构造的数据包按照我们的代码对相关字段进行了变异,从而达到了fuzz的效果。
4.相关博客
https://blog.csdn.net/song_lee/article/details/104334096
https://jackfromeast.site/2021-03/boofuzz-1.html
https://cloud.tencent.com/developer/article/1418469
https://www.cnblogs.com/yuzhouliu/p/15180591.html
附:bfuzztest.py脚本
02文件模糊器

对于一个程序来说,几个字节的错位就可能毁掉整个应用程序。这些使程序崩溃的畸形文件通过破坏程序的字节来破坏它们自己的栈和堆。在旧的无记忆操作系统中,格式错误的文件通常会导致整个计算机崩溃。此外,还有JS文件、HTML等与web相关的文件,可能会造成安全问题。
类型歧义测试通常的做法是:先准备一个正确的文件插入到程序中,然后用随机数据替换文件的某些部分,最后用程序打开模糊的文件,观察程序是否异常,或者有什么异常。
下面将介绍两种工具:Driller和Domato。
——Driller,一个开源的文件模糊工具
1.什么是司钻?
司钻依赖模糊测试工具AFL和二元分析工具angr。Driller是在AFL基础上开发的碰撞模糊测试工具。Driller在AFL的基础上增加了一个动态符号执行引擎。当模糊测试被卡住时,它使用动态符号执行来突破这些限制,生成满足模糊需要的新输入,使模糊能够继续执行。具体来说,通过监控AFL的执行,我们可以决定何时开始符号执行,以探索一条新的路径。如果位图显示AFL执行X轮后没有发现新的状态转换,这意味着AFL卡住了。此时调用angr进行符号执行。每个特定的输入对应于路径组中的一个路径。在路径组的每个步骤中,检查每个分支以确保最新的跳转指令引入了前一个AFL未知的路径。当发现这样的跳转时,查询SMT解算器以创建输入来驱动执行到新的跳转。这个输入被反馈到AFL,AFL将在未来的模糊步骤中变异。这种反馈循环使我们能够平衡昂贵的符号执行时间和廉价的模糊时间,并减少模糊对程序操作的低语义洞察力。
Driller结合了AFL高效低耗快速的优点和动态符号执行探索能力的优点,避免了AFL难以突破特殊边界和动态符号执行路径爆炸的问题。然而,基于符号执行增强的模糊测试技术仍然会受到符号执行中约束求解问题的限制,符号执行的引入可能会削弱模糊测试本身的可扩展性。
2.钻机的安装
此安装过程使用ubuntu16.04。
2.1、环境准备
安装一些必要的软件包
安装编译qemu时所需的环境
2.2.安装AFL
创建一个新文件夹来保存所有流程文件。
您可以从GitHub下载AFL源代码。
进入源文件夹并执行编译命令。
编译qemu
2.3、安装司钻
安装和使用Driller时,最好在单独的Python虚拟环境中进行,这里使用的是Aconda环境。
第1部分:安装Anaconda
下载Anaconda的安装脚本
授予执行权限
运行脚本
修改shell的环境配置
刷新并重新运行
第二部分:建立虚拟司钻环境
使用Aconda构建一个名为driller的虚拟环境。
进入虚拟环境
第三部分:安装司钻
安装angr
安装cle安装跟踪器
安装司钻
可以导入钻孔机,安装成功。
3.钻机的使用
这种安装方法采用了司钻和AFL平行作业流程。解决输入问题的钻孔机部分和AFL fuzz部分分别放在两个终端运行。
创建Fuzz的程序源代码是buggy.c,其内容如下:
编译buggy.c
因为用的是AFL QEMU模式,所以不需要标桩源码。
打开一个终端,用AFL模糊。
下一步是开始AFL的模糊化过程:
输入为7/42a8时发生崩溃。
进程计时:显示fuzzer的运行时间,最后一次发现新路径的时间,最后一次崩溃的时间和最后一次挂起的时间。
总体结果:显示运行周期、总路径、崩溃和挂起的总数。
循环进度:显示正在处理的测试样本数量和由于超时而放弃的输入数量。
地图覆盖率:第一行显示了已经命中的分支元组的数量与位图可以容纳的数量的比率。左边是当前输入,右边是整个输入语料库的值。第二行显示了二进制文件中元组命中计数的变化。
阶段进度:显示正在测试的策略、进度、总执行时间和执行速度。正常执行速度应该在500以上。
Fingers in Depth:显示fuzzer最喜欢的路径的数量和基于应用于代码的最小化算法真正获得更好边缘覆盖的测试用例的数量,以及崩溃和超时的数量。注意这里tmout和hang是有区别的。tmout的数量包括所有超过超时的测试用例,即使它们没有超过足够的超时并被归类为挂起。
模糊化策略产量:用于跟踪各种模糊化策略获得路径的比例和执行这些策略的尝试次数,验证各种方法的有效性。
路径几何:第一个数据指的是模糊化过程中达到的路径深度,pending指的是还有多少输入数据没有被测试。Pend fav指的是fuzzer在这个队列中真正想要到达的条目。接下来是在这个模糊化部分找到的新路径的数量,以及在并行化模糊化时从其他模糊化器实例导入的路径的数量。最后的数据可以度量观察到的轨迹的一致性,如果程序对于相同的输入总是表现相同,则一致性是100%。
创建一个run_driller.py脚本来运行driller,其内容如下:
打开另一个终端,运行司钻部分。
成功启动后,将显示以下内容。
测试一段时间后,我们可以打开输出文件夹中的fuzzer-master,可以看到有三个文件夹,crashes,hangs,queue,存储生成的对应样本,还有三个文件,分别是fuzz _ bitmap,fuzzer _ stats,plot _ data。
崩溃文件夹包含导致测试程序接收致命信号的测试用例。输入崩溃可以看到触发的崩溃,获得的崩溃可以通过xxd查看。
挂起文件夹包含导致测试程序超时的测试用例,这次是0。
队列文件夹包含每个唯一执行路径的测试用例,以及用户给出的起始文件。
看里面的文件,afl从最初的输入“init”逐渐逼近“7/42a8”,会让我们的程序崩溃。

3.相关文档和博客:
[1] Stephens N,Grosen J,Salls C,等. Driller:通过选择性符号执行增强模糊化[C]//网络和分布式系统安全研讨会.2016.
[2]博客钻孔机工具分析:https://blog.csdn.net/Chen_zju/article/details/80791281
免责声明:本平台仅供信息发布交流之途,请谨慎判断信息真伪。如遇虚假诈骗信息,请立即举报
举报













