接着上一篇文章FUZZ工具—Boofuzz框架来对框架进行实际的使用;
官方提供了很多案例模板,且网上关于boofuzz的使用介绍很多,也比较成熟,在各个领域都有,可以通过官方提供的案例也看得出来,然后覆盖的面也非常的全,目前也就只有ble、zigbee这种无线电通信协议的覆盖不了,下面用一个简单的测试来学习一下boofuzz的使用,来挖掘一下漏洞;
Vulnserver
Vulnserver是一个多线程的基于Windows的TCP服务器,它侦听端口9999上的客户端连接(默认情况下),并允许用户运行许多不同的命令,这些命令容易受到各种类型的可利用缓冲区溢出的攻击。它在github的地址为https://github.com/stephenbradshaw/vulnserver
下载对应程序,启动vulnserver
使用nc命令,连接服务端9999端口即可。发出HELP命令(区分大小写),查看程序有哪些功能
查看服务的请求和返回内容,然后构建FUZZ脚本;
Fuzzing Vulnserver
根据服务地址和请求头构造简单的FUZZ脚本;
from boofuzz import *
def main():
session = Session(
target=Target(
connection = TCPSocketConnection("172.25.64.1", 9999),
),
)
s_initialize("trun")
s_string("TRUN", fuzzable=False)
s_delim(" ", fuzzable=False)
s_string("FUZZ")
s_static("\r\n")
session.connect(s_get("trun"))
session.fuzz()
if __name__ == "__main__":
main()
简单看一下执行日志结果,可以看到case1的执行结果日志,发送的数据,但是看不到返回的结果情况;
用脚本跑了一会,就中断了,直接挂掉了,到脚本所在目录下的boofuzz-results中查看FUZZ结果;用数据库软件打开文件;
通过过滤is_truncated字段,可以观察到只有send的超长数据包才会truncated,根据经验应该是缓冲区溢出了;
通过这里如果想要完整构造fuzz脚本需要解决几个问题
- 打印返回数据,并记录log文档里以方便排查问题;
- 程序如果遇到存在问题的playload会存在中断的问题,如果要继续跑完剩下的playload就需要在执行之前对程序进程的状态进行监听,如果没有对应进程需要重新启动;
这里先增加返回数据打印看看;
from boofuzz import *
def main():
session = Session(
target=Target(
connection = TCPSocketConnection("172.25.64.1", 9999),
),
)
s_initialize("trun")
s_string("TRUN", fuzzable=False)
s_delim(" ", fuzzable=False)
s_string("FUZZ")
s_static("\r\n")
session.connect(s_get("trun"), callback=get_banner)
session.fuzz()
def get_banner(target, my_logger, session, *args, **kwargs):
banner_template = "Welcome to Vulnerable Server! Enter HELP for help."
try:
banner = target.recv(10000)
except:
print("Unable to connect. Target is down. Exiting.")
exit(1)
my_logger.log_check('Receiving banner..')
if banner_template.encode() in banner:
my_logger.log_pass('banner received')
else:
my_logger.log_fail('No banner received')
print("No banner received, exiting..")
exit(1)
if __name__ == "__main__":
main()
通信新增打印返回函数,以接受程序打印的数据;
boofuzz也提供本地服务以查看进度和执行结果,访问http://127.0.0.1:26000可以看到结果;但是只能是程序在跑的时候,程序结束后进程结束服务也会关闭,其展示的内容除了进度详细的日志跟输出的内容是一致的,但是本地存的数据库文件也不包含我们设置的banner信息,所以这里我们需要将打印的日志内容输出到excel中,方便排查;
然后上图可以看到,在跑一段时间后程序会挂掉,为了方便测试要监控程序进程然后检测到进程中没有我们需要的程序时就启动它;
然后发现boofuzz提供了监控进程的脚本,把脚本和对应程序放到一个目录下,然后对26002端口进行监控;
boofuzz/process_monitor.py at master · jtpereyda/boofuzz · GitHub
boofuzz api target中提供了进程监控的能力:Target — boofuzz 0.4.1 documentation
procmon = pedrpc.Client(host, 26002),
procmon_options = {
"proc_name" : "vulnserver.exe",
"stop_commands" : ['wmic process where (name="vulnserver") delete'],
"start_commands" : ['vulnserver.exe'],
}
最终fuzz脚本;
from boofuzz import *
from sys import exit
def get_banner(target, my_logger, session, *args, **kwargs):
banner_template = "Welcome to Vulnerable Server! Enter HELP for help."
try:
banner = target.recv(10000)
except:
print("Unable to connect. Target is down. Exiting.")
exit(1)
my_logger.log_check('Receiving banner..')
if banner_template.encode() in banner:
my_logger.log_pass('banner received')
else:
my_logger.log_fail('No banner received')
print("No banner received, exiting..")
exit(1)
def main():
s_initialize("Vulnserver")
s_group("verbs", values=["TRUN", "GMON", "KSTET"])
if s_block_start("test", group="verbs"):
s_delim(" ")
s_string("AAA")
s_string("\r\n")
s_block_end("test")
# csv_log = open('fuzz_results.csv', 'wb')
# my_logger = [FuzzLoggerCsv(file_handle=csv_log)]
logger = FuzzLoggerCsv(file_handle = open("fuzz_results.csv","wb"))
session = Session(
target = Target(
connection = SocketConnection("172.25.64.1", 9999),
procmon = pedrpc.Client("127.0.0.1", 26002),
procmon_options = {
"proc_name" : "vulnserver.exe",
"stop_commands" : ['wmic process where (name="vulnserver") delete'],
"start_commands" : ['vulnserver.exe'],
}
),
)
session.add_logger(logger)
session.connect(s_get("Vulnserver"), callback=get_banner)
session.fuzz()
if __name__ == "__main__":
main()
但是我这里process_monitor.py在监控的时候会报错,从而连接不上,没有找到原因。。。
不过第二个要求已经是进阶要求了,日常的fuzz一般不需要如此,或者有其他的办法,基本上能覆盖;
Boofuzz衍生
学习了解这个工具是因为在参与安全认证过程中机构要求提供相关资料,然后我们现有的流程也确实缺少了这一步操作,所以就了解了一下;
因为boofuzz目前已经可以fuzz多种协议,自然就想到了ble、zigbee等多种物联网协议,然后查看了api文档Connections — boofuzz 0.4.1 documentation,发现这些是不支持的,串口也只是uart交互之类fuzz,没有dongle或者usb的交互能力,不过倒是可以借助boofuzz框架自己实现一个;思路是
- 实现一个类似SerialConnection的函数,比如叫DeviceConnection之类的,用于连接蓝牙或者zigbee dongle;
- 连上目标mac的设备,然后进行设备认证,或者也可以不进行认证直接fuzz,使用boofuzz的能力;
- 当然后面部分还是要定制化处理,通用的部分也只能针对通用协议来进行,非通用私有的部分还是只能手动过了认证之后一点点fuzz;
找了一下看看有没有大神已经实现了
https://github.com/Charmve/BLE-Security-Attack-Defence
BlueFuzz/bluetooth_scanner.py at master · lucaboni92/BlueFuzz (github.com)
发现直接用脚本实现跟dongle的交互,然后fuzz也是可以,只是fuzz的playload就需要自己整理,或者可以拿boofuzz的来用。
参考
初探BooFuzz - 先知社区
IoT 设备网络协议模糊测试工具boofuzz实战_江下枫的博客-CSDN博客