首页
社区
课程
招聘
[原创]boofuzz,第三方协议fuzz
发表于: 2024-8-19 16:02 1972

[原创]boofuzz,第三方协议fuzz

2024-8-19 16:02
1972

前言

在真实测试中会遇到一些情况,协议的连接方式很奇怪,比如蓝牙,这类协议通信可以使用Python连接,但是要想使用boofuzz做模糊测试是十分困难的,因为官方的连接方式并不包括这种类型的协议;最近测试任务中遇到了带证书和账户的MQTT协议,boofuzz本身是支持SSL连接的,但问题就是账户没法加进去,所以需要对fuzz脚本做一些定制化

正文

环境

MQTT服务端

PyCharm+Python3(boofuzz+paho-mqtt)

思路

实现方式说起来很简单,只需要用paho库连接到MQTT服务端,确保能正常监听和收发包,fuzz部分我们只使用boofuzz的样本变异功能;

看起来很简单,事实上涉及到了boofuzz的自定义连接,由于boofuzz本身想要开启样本变异必须调用session.fuzz函数,而想要开启session则必须创建网络连接;之前曾经尝试使用boofuzz的SSL连接,事实上是无法成功的,会陷入奇奇怪怪的报错(血与泪的经验);所以大致逻辑就是先用paho连接MQTT服务端,然后创建一个空的连接,使boofuzz连接到一个没有任何返回也不会产生任何崩溃的端口,在发送变异后的样本处使用paho的发送功能

代码部分

此处只演示部分代码,因为不同协议连接方式不同,不能一概而论,但是boofuzz改造部分是一样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
from boofuzz import *
 
# 创建一个自定义的空连接类
    class EmptyConnection(TCPSocketConnection):
        def __init__(self, host, port):
            super().__init__(host, port)
 
        def open(self):
            pass
 
        def close(self):
            pass
 
        def recv(self, _=1024):
            return b""
 
        def send(self, data):
            print(f"Sending fuzz data: {data}")
            client.publish("v1/event/computer/resource/000c29963b29", data)
            pass
 
    # 使用自定义的空连接类创建目标
    empty_connection = EmptyConnection("localhost", 0# 使用占位符地址和端口
    target = Target(connection=empty_connection)
    session = Session(target=target)
 
    # 开始模糊测试
    while True:
        try:
            # 初始化模糊测试数据
            s_initialize("MQTT Fuzz")
            with s_block('{"body":'):
                s_static('{"body":')
                s_static('{"cpu":')
                #s_string('0.004999999888241291',fuzzable=True)
                s_static('0.004999999888241291')
                s_static(',"mem":')
                s_string('0.244140625',fuzzable=True)
                s_static(',"network":{"receive":')
                s_string('14.853154182434082',fuzzable=True)
                s_static(',"send":')
                s_string('9.8922290802001953',fuzzable=True)
                s_static('},"state":"')
                s_string('normal',fuzzable=True)
                s_string('","volumes":{"/dev/sda2":')
                s_string('7')
                s_string('}},"seq":')
                s_static(str(int(round(time.time() * 1000))))
                s_static('}')
 
            # 添加模糊测试步骤
            session.connect(s_get("MQTT Fuzz"))
            session.fuzz()
            time.sleep(1# 等待一段时间以确保消息发送完毕
        except Exception as e:
            print(f"Error during fuzzing: {e}")
            break

从EmptyConnection类可以看出boofuzz也是可以实现模块化设计的;此处需要注意类中的其他函数,我们这里只用到了send部分,其他的部分视不同情况而定

总结

注意,此情况只适用于某些固定格式的协议,如果你对代码覆盖率有很深的执念,那么此方法并不适合你;不过话又说回来了,并不是所有情况下都能得到代码覆盖率数据的;此方法也可以用作对目标协议前置的测试(当你不知道测什么的时候,不妨试试这个)


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//