简介
像Sulley一样,boofuzz融合了模糊测试器的所有关键元素:
• 数据生成简单快捷。
• 仪器化——也就是故障检测。
• 故障后目标重置。
• 测试数据记录。
与Sulley不同的是,boofuzz还具有以下特点:
• 安装体验更加简单!
• 支持任意通信介质。
• 内置支持串行模糊测试、以太网和IP层、UDP广播。
• 测试数据记录更加完善——一致、详尽、清晰。
• 测试结果CSV导出。
• 可扩展的仪器化/故障检测。
• 故障数量大大减少。
Sulley这个名字是出于对《怪兽电力公司》中那个巨大的蓝紫色毛茸茸生物的喜爱而命名的,因为他的毛茸茸。Boofuzz
同样以唯一一个已知能吓到Sulley自己的生物命名:Boo!
Boofuzz 安装为一个 Python 库,用于构建模糊测试脚本。有关详细和高级安装说明,请参阅安装 Boofuzz。
3.1 安装 Boofuzz
3.1.1 先决条件
Boofuzz 需要 Python 3.7。推荐使用 pip 进行安装。作为基础要求,需要以下包:
# Ubuntu/Debian
sudo apt-get install python3-pip python3-venv build-essential
# OpenSuse
sudo zypper install python3-devel gcc
# CentOS
sudo yum install python3-devel gcc
3.1.2 安装
强烈建议在虚拟环境中设置 Boofuzz(venv)。首先,创建一个目录来保存我们的 Boofuzz 安装:
mkdir boofuzz && cd boofuzz
python3 -m venv env
这将在当前文件夹中创建一个新的虚拟环境 env。请注意,虚拟环境中的 Python 版本是固定的,并在创建时选择。与全局安装不同,在虚拟环境中,python 别名为虚拟环境的 Python 版本。
接下来,激活虚拟环境:
source env/bin/activate
或者,如果你在 Windows 上:
请按照以下步骤安装和使用boofuzz:
- 激活虚拟环境:
确保你拥有最新版本的pip和setuptools:
(env) $ pip install -U pip setuptools
最后,安装boofuzz:
(env) $ pip install boofuzz
为了运行和测试你的模糊测试脚本,请确保总是先激活虚拟环境。
3.1.3 从源代码安装
- 如上所述,建议设置一个虚拟环境。根据你的具体设置,这大致等同于上述步骤。确保升级setuptools和pip。
- 下载源代码。你可以从https://github.com/jtpereyda/boofuzz下载zip文件,或者直接使用git克隆:
$ git clone https://github.com/jtpereyda/boofuzz.git
- 安装。在激活虚拟环境后,从boofuzz目录内运行pip:
$ pip install .
提示:
- 使用-e选项进行开发模式,允许在不重新安装的情况下自动看到更改:
$ pip install -e .
- 要安装开发工具(单元测试依赖项、测试运行器等):
$ pip install -e .[dev]
- 如果你处于代理后面:
$ set HTTPS_PROXY=http://your.proxy.com:port
- 如果你打算自己开发boofuzz,你可以在克隆源代码后创建虚拟环境(这样env/就在主boofuzz目录内)。
3.1.4 额外内容
process_monitor.py
进程监控器是一个用于检测崩溃并在Windows或Linux上重启应用程序的工具。虽然boofuzz通常在不同于目标的机器上运行,但进程监控器必须在目标机器本身上运行。
network_monitor.py
网络监控器是Sulley记录测试数据的主要工具,已被boofuzz的日志机制所取代。然而,有些人仍然更喜欢PCAP方法。
注意:网络监控器需要Pcapy和Impacket,这些不会随boofuzz自动安装。你可以手动使用pip install pcapy impacket安装它们。
如果你遇到错误,请查看项目页面上的Pcapy要求。
3.2 快速入门
Session对象是你的模糊测试会话的中心。创建它时,你需要传递一个Target对象,该对象本身将接收一个Connection对象。例如:
session = Session(
target=Target(
connection=TCPSocketConnection("127.0.0.1", 8021)
)
)
Connection对象实现ITargetConnection接口。可用选项包括TCPSocketConnection及其姐妹类,用于UDP、SSL和原始套接字,以及SerialConnection。
准备好Session对象后,你需要定义协议中的消息。一旦你阅读了必要的RFC、教程等,你应该对格式有足够的信心,可以使用各种块和原始类型定义你的协议。
每条消息是一个Request对象,其子项定义了该消息的结构。
以下是来自FTP协议的几个消息定义:
user = Request("user", children=(
String("key", "USER"),
Delim("space", " "),
String("val", "anonymous"),
Static("end", "\r\n"),
))
passw = Request("pass", children=(
String("key", "PASS"),
Delim("space", " "),
String("val", "james"),
Static("end", "\r\n"),
))
stor = Request("stor", children=(
String("key", "STOR"),
Delim("space", " "),
String("val", "AAAA"),
Static("end", "\r\n"),
))
retr = Request("retr", children=(
String("key", "RETR"),
Delim("space", " "),
String("val", "AAAA"),
Static("end", "\r\n"),
))
定义了消息后,你将使用刚刚创建的Session对象将它们连接成一个图:
session.connect(user)
session.connect(user, passw)
session.connect(passw, stor)
session.connect(passw, retr)
当进行模糊测试时,boofuzz会在模糊测试passw之前发送user,在模糊测试stor或retr之前发送user和passw。
现在你可以开始模糊测试了:
session.fuzz()
注意,此时你只有一个非常基础的模糊测试器。使其变得强大是你的任务。仓库中有一些示例和request_definitions可能会帮助你开始。
每次运行的日志数据将保存到当前工作目录中boofuzz-results目录下的SQLite数据库中。你可以随时使用以下命令重新打开该数据库的Web界面:
$ boo open <run-*.db>
要进行诸如检查响应等酷炫操作,你可能想使用Session中的post_test_case_callbacks。要将响应中的数据用于后续请求,请参阅ProtocolSessionReference。
你可能还对制作自己的Block/Primitive感兴趣。
记住boofuzz全是Python,高级用例通常需要定制。如果你正在做一些非常酷的事情,请查看社区信息并考虑贡献回来!
祝你模糊测试愉快,祝你好运!
3.3 贡献
3.3.1 问题和错误
如果你有错误报告或改进的想法,请在GitHub上创建一个问题,或者提交一个带有修复的拉取请求。
3.3.2 代码审查
所有的拉取请求都需经过专业的代码审查。如果你不希望你的代码被审查,请不要提交。
3.3.3 贡献者
有关从源代码安装boofuzz的详细信息,请参阅安装说明,包括开发者选项。
拉取请求清单
- 安装Python版本3.7+
- 验证测试通过:
tox
注意:在Linux上重新创建tox环境需要root权限,因为你的单元测试中有些是使用原始套接字工作的。tox将检查tox环境Python解释器是否设置了cap_net_admin和cap_net_raw+eip,如果没有,将会设置它们。
一旦设置了这些能力,运行tox就不需要扩展权限了。
注意:如果测试通过,请检查输出是否有新的flake8警告,这些警告指示PEP8违规。
- 格式化代码以满足我们的代码风格要求:
black .
使用# fmt: off和# fmt: on围绕一个块来禁用本地格式化。
- 如果你使用PyCharm,请使用它来检查你的更改是否引入了任何新的静态分析警告。
- 修改CHANGELOG.rst以说明你所做的更改。
- 如果添加了一个新模块,请考虑将其添加到Sphinx文档中(参见docs文件夹)。
3.3.4 维护者
审查清单
对于每个拉取请求: - 验证更改是合理的,并符合项目目标。
- 验证测试通过(持续集成对此是OK的)。
- 如果更改是重大的或非平凡的,请使用PyCharm进行静态分析检查。
- 验证CHANGELOG.rst已更新。
- 合并///
发布清单
当在GitHub上创建新版本时,发布通过GitHub Actions部署。
准备
- 创建发布分支。
- 根据PEP 0440和大致遵循语义化版本规则,增加上一个版本的版本号。
- 在boofuzz/init.py中。
- 在docs/conf.py中。
- 如果需要,将新版本添加到.github/ISSUE_TEMPLATE/2_bug_report.yml中。
- 修改CHANGELOG文件以备发布。
- 合并发布分支。
发布 - 在GitHub上创建发布。
- 验证GitHub Actions部署成功。
公共协议库
以下协议库是免费和开源的,但实现并不接近完整的协议覆盖:
• boofuzz-ftp
• boofuzz-http
如果您有开源的boofuzz协议套件要分享,请告知我们!