Boofuzz中文详解

发布时间:2023-05-18

一、Boofuzz安装

Boofuzz是一个Python编写的模糊测试框架,支持TCP和UDP协议上的模糊测试,能够对自定义的协议进行测试。安装Boofuzz需要安装Python和pip。在终端输入以下命令:

pip install boofuzz

如果需要进行网络模糊测试,则还需要安装WinPCAP或Npcap。

二、Boofuzz测试覆盖率

Boofuzz可以提供测试覆盖率,帮助检测已经测试的代码部分。 首先需要启动被测试的应用程序,例如TCP服务器。然后将其IP地址和端口设置为Boofuzz脚本中的目标IP和端口:

target = boofuzz.Target(connection=boofuzz.SocketConnection("192.168.1.1", 1234, proto='tcp'))

启动测试时,需要将coverage=True设置为True:

boofuzz.Session(target=target, fuzz_loggers=fuzz_logger, crash_threshold=1, fuzz_db_keep_only_last=True, start_callbacks=start_cb, pre_send_callbacks=pre_send_cb, post_send_callbacks=post_send_cb, check_results=True, halt_on_error=True, coverage=True)

测试完成后,可以使用covreport命令生成覆盖率报告:

boofuzz covreport

三、Boofuzz教程

Boofuzz的核心是FuzzSession类。可以使用以下脚本作为模板:

import boofuzz
def main():
    target = boofuzz.Target(connection=boofuzz.SocketConnection("192.168.1.1", 1234, proto='tcp'))
    session = boofuzz.Session(target=target)
    s_initialize(name="Request")
    s_static("GET")
    s_delim(" ", fuzzable=False)
    s_string("/index.html")
    s_delim(" ", fuzzable=False)
    s_string("HTTP/1.1")
    s_static("\r\n\r\n")
    session.connect(s_get("Request"))
    session.fuzz()
if __name__ == "__main__":
    main()

这个示例会发送HTTP GET请求到192.168.1.1:1234。首先需要使用s_initialize定义请求,然后定义具体的请求格式和内容。最后使用s_get获取请求,并使用session.fuzz()进行模糊测试。

四、Boofuzz实战

在实际应用中,可以使用Boofuzz对自己编写的协议进行模糊测试。例如测试自己编写的FTP服务器:

import boofuzz
def main():
    target = boofuzz.Target(connection=boofuzz.SocketConnection("192.168.1.1", 21, proto='tcp'))
    session = boofuzz.Session(target=target)
    s_initialize(name="Request")
    s_static("USER")
    s_delim(" ", fuzzable=False)
    s_string("anonymous")
    s_static("\r\n")
    s_static("PASS")
    s_delim(" ", fuzzable=False)
    s_string("test")
    s_static("\r\n")
    session.connect(s_get("Request"))
    session.fuzz()
if __name__ == "__main__":
    main()

这个示例会发送FTP USERPASS请求到192.168.1.1:21。可以修改s_string中的字符串进行测试。

五、Boofuzz源码分析

Boofuzz的核心代码在boofuzz/models.py中。 Session类作为Boofuzz的核心类,包含了连接、请求等控制逻辑,同时支持协议的多线程、模糊测试请求的自动生成等高级功能。 Fuzzable子类是所有具有模糊测试能力的对象的基类,包括字符串、数字、枚举等。使用时只需要继承Fuzzable并重载generate方法即可实现自定义的模糊测试。 Logger类实现了Boofuzz的日志功能,可以高效地记录所有测试的请求和响应、崩溃日志等信息。 Target类封装了所有与目标应用程序的连接信息,包括IP地址、端口号、协议类型等信息。

六、Boofuzz指导

在使用Boofuzz进行模糊测试时,需要注意以下几点:

  1. 合理地选择测试用例。测试用例应该涵盖目标协议的各种情况,包括有效的和无效的输入。
  2. 根据目标协议的特点选择模糊测试方法。可以采用逆向分析、符号执行等技术辅助测试。
  3. 注意测试过程中占用的系统资源。Boofuzz的多线程、高并发可能会对系统性能造成影响,需要合理分配测试资源。

七、Boofuzz模糊测试

Boofuzz使用基于机器学习的模糊测试方法,能够自动地生成大量测试用例并对响应进行分析,使测试能够更加深入、全面。 可以使用以下脚本进行模糊测试:

import boofuzz
def main():
    target = boofuzz.Target(connection=boofuzz.SocketConnection("192.168.1.1", 80, proto='tcp'))
    session = boofuzz.Session(target=target)
    s_initialize(name="Request")
    s_static("GET")
    s_delim(" ", fuzzable=False)
    s_string("/index.html")
    s_delim(" ", fuzzable=False)
    s_string("HTTP/1.1")
    s_static("\r\n\r\n")
    session.connect(s_get("Request"))
    session.fuzz()
if __name__ == "__main__":
    main()

这个示例会发送HTTP GET请求到192.168.1.1:80。Boofuzz会自动地生成大量测试用例并进行测试,同时记录所有响应信息。

八、Boofuzz实战入门

可以使用以下脚本进行测试:

import boofuzz
def main():
    target = boofuzz.Target(connection=boofuzz.SocketConnection("192.168.1.1", 1234, proto='tcp'))
    session = boofuzz.Session(target=target)
    s_initialize(name="Request")
    s_static("Testing\x00")
    session.connect(s_get("Request"))
    session.fuzz()
if __name__ == "__main__":
    main()

这个示例会发送一个含有空字符的字符串到192.168.1.1:1234。可以修改s_static的内容进行测试。

九、Boofuzz测试结果

Boofuzz会自动地生成测试结果报告,并记录所有崩溃日志和响应信息。 在测试过程中,可以使用以下命令查看当前的测试信息:

boofuzz monitor info

在测试完成后,可以使用以下命令生成测试结果报告:

boofuzz sessionsummary