boofuzz中文翻译第三章

简介

像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:

  1. 激活虚拟环境:
    确保你拥有最新版本的pip和setuptools:
(env) $ pip install -U pip setuptools

最后,安装boofuzz:

(env) $ pip install boofuzz

为了运行和测试你的模糊测试脚本,请确保总是先激活虚拟环境。

3.1.3 从源代码安装
  1. 如上所述,建议设置一个虚拟环境。根据你的具体设置,这大致等同于上述步骤。确保升级setuptools和pip。
  2. 下载源代码。你可以从https://github.com/jtpereyda/boofuzz下载zip文件,或者直接使用git克隆:
$ git clone https://github.com/jtpereyda/boofuzz.git
  1. 安装。在激活虚拟环境后,从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的详细信息,请参阅安装说明,包括开发者选项。
拉取请求清单

  1. 安装Python版本3.7+
  2. 验证测试通过:
tox

注意:在Linux上重新创建tox环境需要root权限,因为你的单元测试中有些是使用原始套接字工作的。tox将检查tox环境Python解释器是否设置了cap_net_admin和cap_net_raw+eip,如果没有,将会设置它们。
一旦设置了这些能力,运行tox就不需要扩展权限了。
注意:如果测试通过,请检查输出是否有新的flake8警告,这些警告指示PEP8违规。

  1. 格式化代码以满足我们的代码风格要求:
black .

使用# fmt: off和# fmt: on围绕一个块来禁用本地格式化。

  1. 如果你使用PyCharm,请使用它来检查你的更改是否引入了任何新的静态分析警告。
  2. 修改CHANGELOG.rst以说明你所做的更改。
  3. 如果添加了一个新模块,请考虑将其添加到Sphinx文档中(参见docs文件夹)。
    3.3.4 维护者
    审查清单
    对于每个拉取请求:
  4. 验证更改是合理的,并符合项目目标。
  5. 验证测试通过(持续集成对此是OK的)。
  6. 如果更改是重大的或非平凡的,请使用PyCharm进行静态分析检查。
  7. 验证CHANGELOG.rst已更新。
  8. 合并///
发布清单

当在GitHub上创建新版本时,发布通过GitHub Actions部署。
准备

  1. 创建发布分支。
  2. 根据PEP 0440和大致遵循语义化版本规则,增加上一个版本的版本号。
    1. 在boofuzz/init.py中。
    2. 在docs/conf.py中。
    3. 如果需要,将新版本添加到.github/ISSUE_TEMPLATE/2_bug_report.yml中。
    4. 修改CHANGELOG文件以备发布。
  3. 合并发布分支。
    发布
  4. 在GitHub上创建发布。
  5. 验证GitHub Actions部署成功。
公共协议库

以下协议库是免费和开源的,但实现并不接近完整的协议覆盖:
• boofuzz-ftp
• boofuzz-http
如果您有开源的boofuzz协议套件要分享,请告知我们!

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值