4.3.9 SerialConnection
class boofuzz.connections.SerialConnection(port=0, baudrate=9600, timeout=5,
message_separator_time=0.3, content_checker=None)
Bases:ITargetConnection
用于通用串行端口的ITargetConnection实现。
由于串行端口没有提供分离消息/数据包的默认功能,这个类提供了几种手段:
• timeout:在超时秒后返回接收到的字节。
• msg_separator_time:在电线上静默给定时间后返回接收到的字节。这对于没有机器可读分隔符的终端协议很有用。响应可能需要很长时间才能发送其信息,当数据停止到来时,你就知道消息已经完成。
• content_check:用户定义的函数接收到目前为止接收到的数据,并检查数据包。如果数据包尚未完成,函数应返回0,或者如果已收到有效消息的n字节,则返回n。剩余的字节将为下一次recv()调用存储。示例:
def content_check_newline(data):
if data.find('\n') >= 0:
return data.find('\n')
else:
return 0
如果这些方法都不使用,你的连接可能会永远挂起。
版本0.2.0变更:SerialConnection已移至connections子包中。现在完整的路径是boofuzz.connections.serial_connection.SerialConnection
参数
• port (Union[int, str]) – 串行端口名称或编号。
• baudrate (int) – 端口的波特率。
• timeout (float) – 对于recv()。从接收开始后超时秒,recv()将返回所有接收到的数据(如果有的话)。
• message_separator_time (float) – 在message_separator_time秒内没有接收到更多数据后,recv()将返回。可选。默认为None。
• content_checker (function(str) -> int) – 用户定义的函数。recv()将迄今为止接收到的所有字节传递给这个方法。如果方法返回n > 0,recv()将返回n字节。如果它返回0,recv()将继续读取。
close()
关闭与目标的连接。
返回:None
property info
返回连接信息的描述。
例如,“127.0.0.1:2121”
返回:连接信息描述
返回类型:str
open()
打开与目标的连接。确保调用close()!
返回:None
recv(max_bytes)
从目标接收最多max_bytes的数据。
参数
max_bytes (int) – 最大接收字节数。
返回:接收到的数据。
send(data)
向目标发送数据。仅在调用open()后有效!
参数
data – 要发送的数据。
返回:实际发送的字节数。
返回类型:int
4.3.9 SerialConnection
class boofuzz.connections.SerialConnection(port=0, baudrate=9600, timeout=5,
message_separator_time=0.3, content_checker=None)
继承自 ITargetConnection
为通用串行端口实现的ITargetConnection接口。
由于串行端口本身不提供分隔消息/数据包的默认功能,这个类提供了几种方法:
• timeout: 在超时秒数后返回接收到的字节。
• msg_separator_time: 在线路静默给定时间后返回接收到的字节。这对于没有机器可读分隔符的终端协议很有用。响应可能需要很长时间才能发送其信息,当数据停止传输时,你就知道消息已经完成。
• content_check: 用户定义的函数接收到目前为止接收到的数据,并检查数据包。如果数据包尚未完成,函数应返回0,或者如果已接收到有效消息的n字节,则返回n。剩余的字节将为下一次recv()调用存储。示例:
def content_check_newline(data):
if data.find('\n') >= 0:
return data.find('\n')
else:
return 0
如果这些方法都不使用,你的连接可能会永远挂起。
在版本0.2.0中更改:SerialConnection已移至connections子包中。现在完整的路径是boofuzz.connections.serial_connection.SerialConnection
参数
• port (Union[int, str]) – 串行端口名称或编号。
• baudrate (int) – 端口的波特率。
• timeout (float) – 对于recv()。从接收开始后超时秒数,recv()将返回所有接收到的数据(如果有的话)。
• message_separator_time (float) – 在message_separator_time秒内没有接收到更多数据后,recv()将返回。可选。默认为None。
• content_checker (function(str) -> int) – 用户定义的函数。recv()将所有到目前为止接收到的字节传递给这个方法。如果方法返回n > 0,recv()将返回n字节。如果它返回0,recv()将继续读取。
close()
Close connection to the target.
Returns
None
property info
Return description of connection info.
E.g., “127.0.0.1:2121”
Returns
Connection info descrption
Return type
str
open()
Opens connection to the target. Make sure to call close!
Returns
None
recv(max_bytes)
Receive up to max_bytes data from the target.
Parameters
max_bytes (int) – Maximum number of bytes to receive.
Returns
Received data.
send(data)
Send data to the target. Only valid after calling open!
Parameters
data – Data to send.
Returns
Number of bytes actually sent.
Return type
int
4.4 监控器
监控器是用于监控目标特定行为的组件。监控器可以是被动的,仅观察并提供数据,或者更为主动地与目标直接交互。一些监控器还具备启动、停止和重启目标的能力。
检测目标的崩溃或不当行为可能是一个复杂且非直接的过程,这取决于你拥有的目标主机上的工具;对于嵌入式设备尤其如此。Boofuzz提供了三种主要的监控器实现:
• ProcessMonitor,一个从Windows和Unix上的进程收集调试信息的监控器。它还可以重启目标进程并检测段错误。
• NetworkMonitor,一个通过PCAP被动捕获网络流量并将其附加到测试用例日志的监控器。
• CallbackMonitor,用于实现可以提供给Session类的回调。
4.4.1 监控器接口(BaseMonitor)
class boofuzz.monitors.BaseMonitor
基类:object
目标监控器的接口。所有监控器必须遵守此规范。
在0.2.0版本中新增。
alive()
当包含此监控器的目标被添加到会话时调用。使用此函数连接到例如RPC主机,如果您的目标位于另一台机器上。
如果监控器处于活动状态,您必须返回True。否则,您必须返回False。如果监控器未处于活动状态,此方法将被调用,直到它变为活动状态或抛出异常。您应该在监控器实现中处理超时/连接重试限制。
默认返回True。
返回:Bool
get_crash_synopsis()
如果任何监控器指示当前测试用例失败,即使此监控器未检测到崩溃,也会调用此方法。您应该返回崩溃摘要的人类可读表示(例如,十六进制转储)。您可以将完整的崩溃转储保存在某处。
返回:str
post_send(target=None, fuzz_data_logger=None, session=None)
在当前模糊节点传输后调用。使用它来收集目标数据并决定它是否崩溃。
如果目标仍然存活,您必须返回True。如果目标崩溃,您必须返回False。如果一个监控器报告了崩溃,整个测试用例将被标记为崩溃。
默认返回True。
返回:Bool
post_start_target(target=None, fuzz_data_logger=None, session=None)
在目标启动或重启后调用。
pre_send(target=None, fuzz_data_logger=None, session=None)
在当前模糊节点传输前调用。
默认无效果。
返回:None
restart_target(target=None, fuzz_data_logger=None, session=None)
重启目标。如果重启成功,必须返回True;如果重启不成功或此监控器无法重启目标,导致链中的下一个监控器尝试重启,则返回False。第一个成功的监控器将导致重启链停止应用。
默认调用stop和start,如果成功则返回True。
返回:Bool
retrieve_data()
在当前模糊节点是否崩溃目标之前调用,以检索数据。在模糊器继续到新的测试用例之前调用。
您应该返回任何应该记录的辅助数据。数据必须可序列化,例如,字节串。
默认返回None。
set_options(*args, kwargs)
调用以设置您的监控器选项(例如,本地崩溃转储存储)。*args和kwargs可以由实现类明确指定,然而您应该忽略任何您不认识的kwargs。
默认无效果。
返回:None
start_target()**
启动目标。如果启动成功,您必须返回True。如果不成功,您必须返回False。监控器将按添加到目标的顺序尝试启动目标;第一个成功的监控器将停止迭代。
返回:Bool
stop_target()
停止目标。如果停止成功,您必须返回True。如果不成功,您必须返回False。监控器将按添加到目标的顺序尝试停止目标;第一个成功的监控器将停止迭代。
返回:Bool
4.4.2 ProcessMonitor
进程监控器由两部分组成;实现BaseMonitor的ProcessMonitor类和一个应在目标主机上运行的第二个模块。
class boofuzz.monitors.ProcessMonitor(host, port)
进程监控器接口的代理类。
在版本<0.2.0中,boofuzz有通过RPC通信的网络和进程监控器。RPC客户端直接传递给会话类,并在RPC伙伴上动态解析所有方法调用。
从0.2.0版本开始,每个监控器类必须实现抽象类BaseMonitor,它定义了所有监控器之间的通用接口。为了帮助未来的类型提示工作,并明确区分网络和进程监控器,引入了这个显式的代理类,它将所有调用转发到RPC伙伴。
在版本0.2.0中新增。
alive()
此方法转发到RPC守护进程。
get_crash_synopsis()
此方法转发到RPC守护进程。
on_new_server(new_uuid)
如果自上次调用以来RPC守护进程已重启,则恢复所有设置的选项到RPC守护进程。
post_send(target=None, fuzz_data_logger=None, session=None)
此方法转发到RPC守护进程。
pre_send(target=None, fuzz_data_logger=None, session=None)
此方法转发到RPC守护进程。
restart_target(target=None, fuzz_data_logger=None, session=None)
此方法转发到RPC守护进程。
set_crash_filename(new_crash_filename)
自版本0.2.0起已弃用。
此选项应通过set_options设置。
**set_options(*args, kwargs)
旧的RPC接口指定使用set_foobar方法来设置选项。由于这些方法因RPC实现而异,此跳板方法将作为关键字参数传递的参数转换为set_foobar调用。
如果您调用set_options(foobar=“barbaz”),它将在RPC伙伴上调用set_foobar(“barbaz”)。
set_proc_name(new_proc_name)
自版本0.2.0起已弃用。
此选项应通过set_options设置。
set_start_commands(new_start_commands)
自版本0.2.0起已弃用。
此选项应通过set_options设置。
set_stop_commands(new_stop_commands)
自版本0.2.0起已弃用。
此选项应通过set_options设置。
start_target()
此方法转发到RPC守护进程。
stop_target()
此方法转发到RPC守护进程。
4.4.3 网络监控器
网络监控器由两部分组成:实现BaseMonitor接口的NetworkMonitor类和一个应在可以监控流量的主机上运行的第二个模块。
class boofuzz.monitors.NetworkMonitor(host, port)
网络监控器接口的代理类。
在版本<0.2.0中,boofuzz拥有通过RPC通信的网络和进程监控器。RPC客户端直接传递给会话类,并在RPC伙伴上动态解析所有方法调用。
从0.2.0版本开始,每个监控器类必须实现抽象类BaseMonitor,它定义了所有监控器之间的通用接口。为了帮助未来的类型提示工作,并明确区分网络和进程监控器,引入了这个显式的代理类,它将所有调用快速转发给RPC伙伴。
在版本0.2.0中新增。
alive()
此方法转发到RPC守护进程。
on_new_server(new_uuid)
如果自上次调用以来RPC守护进程已重启,则恢复所有设置的选项。
post_send(target=None, fuzz_data_logger=None, session=None)
此方法转发到RPC守护进程。
pre_send(target=None, fuzz_data_logger=None, session=None)
此方法转发到RPC守护进程。
restart_target(target=None, fuzz_data_logger=None, session=None)
此方法总是返回false,因为这个监控器不能重启目标。
retrieve_data()
此方法转发到RPC守护进程。
set_filter(new_filter)
自版本0.2.0起已弃用。
此选项应通过set_options设置。
set_log_path(new_log_path)
自版本0.2.0起已弃用。
此选项应通过set_options设置。
**set_options(*args, kwargs)
旧的RPC接口指定set_foobar方法来设置选项。由于这些方法因RPC实现而异,这个跳板方法将作为关键字参数传递的参数转换为set_foobar调用。
如果你调用set_options(foobar=“barbaz”),它将在RPC伙伴上调用set_foobar(“barbaz”)。
此外,这里设置的任何选项都会被缓存,并在RPC服务器因任何原因重启时重新应用(例如,它运行的虚拟机被重启)。
4.4.4 回调监控器
class boofuzz.monitors.CallbackMonitor(on_pre_send=None, on_post_send=None,
on_restart_target=None, on_post_start_target=None)
在Session中使用的新型回调监控器,用于提供回调数组。它的目的是在会话类中保持*_callbacks参数,同时通过将这些回调转发给监控器基础设施来简化会话的实现。
这个类的方法实现与参数的映射如下:
• restart_callbacks -> target_restart
• pre_send_callbacks -> pre_send
• post_test_case_callbacks -> post_send
• post_start_target_callbacks -> post_start_target
所有其他实现的接口成员只是存根,因为会话中不存在相应的参数。在任何情况下,实现一个自定义监控器可能比使用回调函数更明智。
在版本0.2.0中新增。
post_send(target=None, fuzz_data_logger=None, session=None)
此方法遍历所有提供的post_send回调并执行它们。它们的返回值被丢弃,异常被捕获并记录:
• BoofuzzTargetConnectionReset将记录失败
• BoofuzzTargetConnectionAborted将记录信息
• BoofuzzTargetConnectionFailedError将记录失败
• BoofuzzSSLError将记录信息或失败,取决于会话是否忽略SSL/TLS错误。
• 其他任何异常都被记录为错误。
所有异常在处理后都被丢弃。
post_start_target(target=None, fuzz_data_logger=None, session=None)
在目标启动或重启后调用。
pre_send(target=None, fuzz_data_logger=None, session=None)
此方法遍历所有提供的pre_send回调并执行它们。它们的返回值被丢弃,异常被捕获并记录,但之后被丢弃。
restart_target(target=None, fuzz_data_logger=None, session=None)
此方法尝试重启目标。如果没有设置重启回调,则返回false;否则返回true。
返回值:bool
4.5 日志记录
Boofuzz提供了灵活的日志记录。所有日志类都实现了IFuzzLogger接口。内置的日志类如下所述。
要同时使用多个日志记录器,请参见FuzzLogger。
4.5.1 日志记录接口 (IFuzzLogger)
class boofuzz.IFuzzLogger
继承自object
用于日志记录的抽象类。
使用时:
-
1. 打开测试用例。 2. 打开测试步骤。 3. 使用其他日志方法。 IFuzzLogger为Sulley框架和测试编写者提供了日志记录接口。 提供的方法旨在反映功能测试操作。与通用的调试/信息/警告方法不同,IFuzzLogger提供了一种记录测试用例、通过、失败、测试步骤等的手段。 这个假设的示例输出给出了如何使用日志记录器的想法: 测试用例:UDP.Header.Address 3300 测试步骤:模糊化 发送:45 00 13 ab 00 01 40 00 40 11 c9 . . . 测试步骤:进程监控检查 检查OK 测试步骤:DNP检查 发送:ff ff ff ff ff ff 00 0c 29 d1 10 . . . 接收:00 0c 29 d1 10 81 00 30 a7 05 6e . . . 检查:回复符合预期。检查OK 测试用例:UDP.Header.Address 3301 测试步骤:模糊化 发送:45 00 13 ab 00 01 40 00 40 11 c9 . . . 测试步骤:进程监控检查 检查失败:“进程返回退出代码1” 测试步骤:DNP检查 发送:ff ff ff ff ff ff 00 0c 29 d1 10 . . . 接收:None 检查:回复符合预期。检查失败 每个模糊化案例都会打开一个测试用例。每个高级测试步骤都会打开一个测试步骤。测试步骤可以包括例如: • 模糊化 • 设置(模糊化前) • 测试后清理 • 仪器检查 • 由于失败而重置 在测试步骤中,测试可以记录发送的数据、接收的数据、检查、检查结果和其他信息。 abstruct close_test() 在测试完成后调用。可以用来通知操作员或保存测试日志。 参数:None 类型:None 返回值:None 返回类型:None abstruct close_test_case() 在测试用例完成后调用。可以用来通知操作员或保存测试用例日志。 参数:None 类型:None 返回值:None 返回类型:None abstruct log_check(description) 记录对被测系统的检查。也称为“仪器检查”。 参数:description (str) – 接收到的数据。 返回值:None 返回类型:None abstruct log_error(description) 记录内部错误。这将通知操作员测试未成功完成。 参数:description (str) – 接收到的数据。 返回值:None 返回类型:None 抽象方法 log_fail(description='') 记录检查失败。这将标记模糊化案例为潜在的错误或异常。 参数:description (str) – 可选的补充数据。 返回值:None 返回类型:None abstruct log_info(description) 用于记录测试信息的通用方法。 参数:description (str) – 信息。 返回值:None 返回类型:None 抽象方法 log_pass(description='') 记录检查通过。 参数:description (str) – 可选的补充数据。 返回值:None 返回类型:None abstruct log_recv(data) 记录数据作为从目标接收。 参数:data (bytes) – 接收到的数据。 返回值:None 返回类型:None abstruct log_send(data) 记录数据作为即将发送到目标。 参数:data (bytes) – 传输的数据。 返回值:None 返回类型:None abstruct open_test_case(test_case_id, name, index, *args, **kwargs) 打开一个测试用例 - 即,一个模糊化变异。 参数 • test_case_id – 测试用例名称/编号。应该是唯一的。 • name (str) – 人类可读且唯一的测试用例名称。 • index (int) – 测试用例的数字索引。 返回值:None abstruct open_test_step(description) 打开一个测试步骤 - 例如,“模糊化”,“预模糊化”,“响应检查”。 参数:description – 模糊化步骤的描述。 返回值:None
boofuzz.IFuzzLoggerBackend
IFuzzLogger的别名
4.5.2 文本日志记录
class boofuzz.FuzzLoggerText(file_handle=<colorama.ansitowin32.StreamWrapper 对象>,
bytes_to_str=<function hex_to_hexstr>)
继承自 IFuzzLogger
此类用于格式化 FuzzLogger 数据以文本形式展示。它可以配置为输出到 STDOUT 或命名文件。
使用两个 FuzzLoggerText,可以配置 FuzzLogger 实例同时输出到控制台和文件。
INDENT_SIZE = 2
close_test()
在测试完成后调用。可用于通知操作员或保存测试日志。
参数:无
类型:无
返回值:无
返回类型:无
close_test_case()
在测试用例完成后调用。可用于通知操作员或保存测试用例日志。
参数:无
类型:无
返回值:无
返回类型:无
log_check(description)
记录对被测系统的检查。也称为“检测点检查”。
参数:description (str) – 接收到的数据。
返回值:无
返回类型:无
log_error(description)
记录内部错误。这将通知操作员测试未成功完成。
参数:description (str) – 接收到的数据。
返回值:无
返回类型:无
log_fail(description=“”)
记录未通过的检查。这将标记模糊测试用例为潜在的错误或异常。
参数:description (str) – 可选的补充数据。
返回值:无
返回类型:无
log_info(description)
用于记录测试信息的通用方法。
参数:description (str) – 信息。
返回值:无
返回类型:无
log_pass(description=“”)
记录通过的检查。
参数:description (str) – 可选的补充数据。
返回值:无
返回类型:无
log_recv(data)
记录数据作为从目标接收到的数据。
参数:data (bytes) – 接收到的数据。
返回值:无
返回类型:无
log_send(data)
记录数据作为即将发送到目标的数据。
参数:data (bytes) – 发送的数据
返回值:无
返回类型:无
*open_test_case(test_case_id, name, index, args, kwargs)
打开一个测试用例 - 即,模糊测试的变异。
参数
• test_case_id – 测试用例名称/编号。应该是唯一的。
• name (str) – 人类可读且唯一的测试用例名称。
• index (int) – 测试用例的数字索引。
返回值:无
open_test_step(description)
打开一个测试步骤 - 例如,“模糊测试”,“预模糊测试”,“响应检查”。
参数:description – 模糊测试步骤的描述。
返回值:无
4.5.3 CSV 日志记录
class boofuzz.FuzzLoggerCsv(file_handle=<colorama.ansitowin32.StreamWrapper 对象>,
bytes_to_str=<function hex_to_hexstr>)
继承自 IFuzzLogger
此类用于格式化 FuzzLogger 数据以供 pcap 文件使用。它可以配置为输出到命名文件。
close_test()
在测试完成后调用。可用于通知操作员或保存测试日志。
参数:无
类型:无
返回值:无
返回类型:无
close_test_case()
在测试用例完成后调用。可用于通知操作员或保存测试用例日志。
参数:无
类型:无
返回值:无
返回类型:无
log_check(description)
记录对被测系统的检查。也称为“检测点检查”。
参数:description (str) – 接收到的数据。
返回值:无
返回类型:无
log_error(description)
记录内部错误。这将通知操作员测试未成功完成。
参数:description (str) – 接收到的数据。
返回值:无
返回类型:无
log_fail(description=“”)
记录未通过的检查。这将标记模糊测试用例为潜在的错误或异常。
参数:description (str) – 可选的补充数据。
返回值:无
返回类型:无
log_info(description)
用于记录测试信息的通用方法。
参数:description (str) – 信息。
返回值:无
返回类型:无
log_pass(description=“”)
记录通过的检查。
参数:description (str) – 可选的补充数据。
返回值:无
返回类型:无
log_recv(data)
记录数据作为从目标接收到的数据。
参数:data (bytes) – 接收到的数据。
返回值:无
返回类型:无
log_send(data)
记录数据作为即将发送到目标的数据。
参数:data (bytes) – 发送的数据
返回值:无
返回类型:无
*open_test_case(test_case_id, name, index, args, kwargs)
打开一个测试用例 - 即,模糊测试的变异。
参数
• test_case_id – 测试用例名称/编号。应该是唯一的。
• name (str) – 人类可读且唯一的测试用例名称。
• index (int) – 测试用例的数字索引。
返回值:无
open_test_step(description)
打开一个测试步骤 - 例如,“模糊测试”,“预模糊测试”,“响应检查。”
参数:description – 模糊测试步骤的描述。
返回值:无