快速开始
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,最后是 stor 和 retr。
在消息连接到图中之后就可以开始 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.py 和 http_with_body.py。
在运行之前,首先需要搭建一个 HTTP 服务器,这可以通过使用 Python 或是其它类似于 Apache 或 NGINX 的 web 服务器来实现。
$ python3 -m http.server
然后根据你的服务器使用的 IP 和端口运行 http_simple.py 和 http_with_body.py 即可。