快速开始

Session 对象是模糊测试会话的核心。当创建 Session 对象时,需要给其传入一个 Target 对象, 而 Traget 对象本身又要接收一个 Connection 对象族中的对象。举个例子:

session = Session(
    target=Target(
        connection=TCPSocketConnection("127.0.0.1", 8021)))

Connection 对象族实现了 ITargetConnection 。 Connection 对象族包括 TCPSocketConnection 以及 UDP、SSL、 raw sockets 和 SerialConnection 等多个不同的套接字实现类。

创建好一个 Session 对象后,下一步需要定义协议中消息的格式。不过在那之前最好先阅读一下 RFC、tutorial 等文档熟悉你要 fuzzing 的协议的格式, 然后再利用 块和原语(block and primitive types) 来构造消息。

每个消息都是一个 Request 对象,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 会先对 user 进行模糊测试,之后才是 passw,最后是 storretr

在消息连接到图中之后就可以开始 fuzz 了:

session.fuzz()

当然,以上只是一个非常基础的模糊测试器,你可以根据自己的需要对其进行修改,官方仓库中有一些 例子请求定义(request_definitions) 值得参考。

每次运行 boofuzz 时产生的日志数据都会被保存到一个 SQLite 数据库中,该数据库位于当前工作目录下的 boofuzz-results 目录中。在任意时刻,你都可以通过以下命令打开数据库:

$ boo open <run-*.db>

如果你想做一些更酷的事情,比如实现验证响应机制,那么你可以使用 Session 中的 post_test_case_callbacks。 为了在后续的请求中使用来自前一个响应的数据,可以参看 ProtocolSessionReference

你或许对 Making Your Own Block/Primitive 也感兴趣。

记住,boofuzz 是一个纯 Python 开发的框架,所以一些更加高级的用法都需要自行定义。如果你正在做一些超级酷的事情,可以向社区 community info 贡献你的成果。

Happy fuzzing, and Godspeed!

More examples

Simple FTP

此处介绍一个针对 FTP 协议的模糊测试脚本,源码参看 ftp_simple.py。 为了运行该脚本,首先需要搭建一个 FTP 服务器

在 FTP 服务器搭建完毕之后,在命令行下使用 ./ftp 命令运行脚本即可。

注意:以上的 FTP 服务器默认情况下运行在 8021 端口,你可以根据需要自行修改。

Simple HTTP and HTTP with body

关于针对 HTTP 协议的模糊测试脚本可以参看 http_simple.pyhttp_with_body.py

在运行之前,首先需要搭建一个 HTTP 服务器,这可以通过使用 Python 或是其它类似于 Apache 或 NGINX 的 web 服务器来实现。

$ python3 -m http.server

然后根据你的服务器使用的 IP 和端口运行 http_simple.pyhttp_with_body.py 即可。