-
-
[原创]boofuzz,第三方协议fuzz
-
发表于: 2024-8-19 16:02 2073
-
前言
在真实测试中会遇到一些情况,协议的连接方式很奇怪,比如蓝牙,这类协议通信可以使用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部分,其他的部分视不同情况而定
总结
注意,此情况只适用于某些固定格式的协议,如果你对代码覆盖率有很深的执念,那么此方法并不适合你;不过话又说回来了,并不是所有情况下都能得到代码覆盖率数据的;此方法也可以用作对目标协议前置的测试(当你不知道测什么的时候,不妨试试这个)
赞赏
他的文章
看原图
赞赏
雪币:
留言: