4.1 会话
class boofuzz.Session(session_filename=None, index_start=1, index_end=None, sleep_time=0.0,
restart_interval=0, web_port=26000, keep_web_open=True, console_gui=False,
crash_threshold_request=12, crash_threshold_element=3, restart_sleep_time=5,
restart_callbacks=None, restart_threshold=None, restart_timeout=None,
pre_send_callbacks=None, post_test_case_callbacks=None,
post_start_target_callbacks=None, fuzz_loggers=None,
fuzz_db_keep_only_n_pass_cases=0, receive_data_after_each_request=True,
check_data_received_each_request=False, receive_data_after_fuzz=False,
ignore_connection_reset=False, ignore_connection_aborted=False,
ignore_connection_issues_when_sending_fuzz_data=True,
ignore_connection_ssl_errors=False, reuse_target_connection=False, target=None,
web_address='localhost', db_filename=None)
继承自 Graph
扩展 pgraph.graph 并提供了一个用于构建协议对话的容器。
参数
• session_filename (str) – 用于序列化持久数据的文件名。默认为 None。
• index_start (int) –
• index_end (int) –
• sleep_time (float) – 在测试之间暂停的时间(秒)。默认为 0。
• restart_interval (int) – 在 n 个测试用例后重启目标,设置为 0 禁用(默认)。
• console_gui (bool) – 使用 curses 生成一个类似于 web 界面的静态控制台屏幕。在 Windows 下未经过测试。默认为 False。
• crash_threshold_request (int) – 在请求耗尽前允许的最大崩溃次数。默认为 12。
• crash_threshold_element (int) – 在元素耗尽前允许的最大崩溃次数。默认为 3。
• restart_sleep_time (int) – 当无法重启目标时暂停的时间(秒)。默认为 5。
• restart_callbacks (method 列表) – 注册的方法将在 post_test_case_callback 失败后被调用。默认为 None。
• restart_threshold (int) – 在丢失目标连接时的最大重试次数。默认为 None(无限次)。
• restart_timeout (float) – 连接尝试应重试的时间(秒)。默认为 None(无限次)。
• pre_send_callbacks (method 列表) – 注册的方法将在每次 fuzz 请求之前被调用。默认为 None。
• post_test_case_callbacks (method 列表) – 注册的方法将在每次 fuzz 测试用例之后被调用。默认为 None。
• post_start_target_callbacks (method 列表) – 在目标启动或重启后调用的方法,例如由进程监控器启动。
• web_port (int 或 None) – 用于通过 web 浏览器监控 fuzzing 活动的端口。设置为 None 以禁用 web 应用。默认为 26000。
• keep_web_open (bool) – 在会话完成后保持 web 界面打开。默认为 True。
• fuzz_loggers (ifuzz_logger.IFuzzLogger 列表) – 用于保存测试数据和结果。默认为 Log 到 STDOUT。
• fuzz_db_keep_only_n_pass_cases (int) – 通过仅保存在失败或错误之前的 n 个测试用例中的通过测试用例来最小化磁盘使用。设置为 0 以在每次测试用例后保存(高磁盘 I/O!)。默认为 0。
• receive_data_after_each_request (bool) – 如果为 True,Session 将尝试在传输每个非 fuzz 节点后接收回复。默认为 True。
• check_data_received_each_request (bool) – 如果为 True,Session 将验证在传输每个非 fuzz 节点后是否已接收一些数据,如果没有,则注册一个失败。如果为 False,则不执行此检查。默认为 False。除非 receive_data_after_each_request 为 False,否则仍会进行接收尝试。
• receive_data_after_fuzz (bool) – 如果为 True,Session 将尝试在传输 fuzzed 消息后接收回复。默认为 False。
• ignore_connection_reset (bool) – 将 ECONNRESET 错误(“目标连接重置”)记录为“info”而不是失败。
• ignore_connection_aborted (bool) – 将 ECONNABORTED 错误记录为“info”而不是失败。
• ignore_connection_issues_when_sending_fuzz_data (bool) – 忽略 fuzz 数据传输失败。默认为 True。通常启用此设置是有帮助的,因为目标可能会在消息明显无效时断开连接。
• ignore_connection_ssl_errors (bool) – 将 SSL 相关错误记录为“info”而不是失败。默认为 False。
• reuse_target_connection (bool) – 如果为 True,只使用一个目标连接而不是每个测试用例重新连接。默认为 False。
• 目标(Target)- 模糊测试会话的目标。目标必须完全初始化。默认为None。
• db_filename(str)- 用于存储测试结果和案例信息的sqlite数据库文件名。默认为./boofuzz-results/{uniq_timestamp}.db
• web_address - Boofuzz日志器暴露的地址。默认为'localhost'
add_node(node)
向图中添加一个pgraph节点。我们重载这个例程,以便在添加节点时自动生成并分配一个ID。
参数: node(pgraph.Node)- 要添加到会话图中的节点
add_target(target)
向会话中添加一个目标。可以添加多个目标以进行并行模糊测试。
参数: target(Target)- 要添加到会话的目标
build_webapp_thread(port=26000, address=‘localhost’)
connect(src, dst=None, callback=None)
在两个请求(节点)之间创建连接,并注册一个可选的回调函数,以在源和目的请求之间传输过程中进行处理。会话类维护一个顶级节点,所有初始请求都必须连接到该节点。示例:
sess = sessions.session()
sess.connect(sess.root, s_get("HTTP"))
如果只提供一个参数,sess.connect()将默认将提供的节点附加到根节点。这是一个方便的别名。以下行与上面示例中的第二行相同:
sess.connect(s_get(“HTTP”))
利用回调方法来处理如挑战响应系统等情境。回调方法必须遵循Session.example_test_case_callback()的消息签名。记得包括kwargs以向前兼容。
-
参数:
• src(str或Request(pgrah.Node))- 源请求名称或请求节点 • dst(str或Request(pgrah.Node),可选)- 目的请求名称或请求节点 • callback(def,可选)- 在节点传输之间传递接收到的数据的回调函数。默认为None。
返回值
源和目的之间的边。
返回类型
pgraph.Edge
*example_test_case_callback(target, fuzz_data_logger, session, test_case_context, args, kwargs)
提供给connect()或register_post_test_case_callback()方法的示例调用签名
参数: target(Target)- 具有类似套接字接口的目标。
• fuzz_data_logger(ifuzz_logger.IFuzzLogger)- 允许记录测试检查和通过/失败。提供时已打开测试用例和测试步骤。
• session(Session)- 调用post_send的会话对象。有用属性包括last_send和last_recv。
• test_case_context(ProtocolSession)- 测试用例范围数据的上下文。
ProtocolSession session_variables值通常在回调中设置,并通过ProtocolSessionReference类型的默认值在元素中引用。
• args - 实现应包括*args和**kwargs以向前兼容。
• kwargs - 实现应包括*args和kwargs以向前兼容。
属性 exec_speed
export_file()
将各种对象值转储到磁盘。
参见
import_file()
feature_check()
检查所有消息/功能。
返回值:无
fuzz(name=None, max_depth=None)
模糊整个协议树。
遍历并模糊所有模糊案例,根据self.skip跳过,并根据self.restart_interval重新启动。
如果你想让web服务器可用,你的程序在调用这个方法后必须持续运行。helpers.pause_for_signal()可用于此目的。
参数
• name(str)- 传递一个请求名称以仅模糊单个请求消息。传递一个测试用例名称以仅模糊单个测试用例。
• max_depth(int)- 最大组合深度;设置为1以进行“简单”模糊测试。
返回值:无
fuzz_by_name(name)
通过名称模糊特定测试用例或节点。
参数
- name(str)- 节点名称。
- fuzz_single_case(mutant_index)
已弃用:通过mutant_index模糊测试用例。
弃用说明:新的方法是将Session的开始和结束索引设置为相同的值。
参数
- mutant_index(int)- 正的非零整数。
返回值:无
import_file()
从磁盘加载各种对象值。
参见
export_file()
属性 netmon_results
num_mutations(max_depth=None)
图中总变异数。此例程的逻辑与 fuzz() 相同。请参阅 fuzz() 中的内联注释。此例程会适当更新成员变量 self.total_num_mutations。
参数
• max_depth (int) – 用于模糊测试的最大组合深度。如果此值为
• 1 (None 或大于) –
• fuzzing (因为当使用组合时,变异的数量通常非常大) –
返回:本会话中的总变异数。
返回类型:int
register_post_test_case_callback(method)
注册一个事后测试用例方法。
注册的方法将在每个模糊测试用例之后调用。
潜在用途:
• 关闭连接。
• 检查预期的响应。
回调事件的顺序如下:
pre_send() - req - callback … req - callback - post-test-case-callback
参数
method (function)
– 与 post_send() 具有相同参数的方法
属性 runtime
server_init()
由 fuzz() 调用以初始化变量、Web界面等。
test_case_data(index)
返回测试用例数据对象(供Web服务器使用)
参数
**index (int) **– 测试用例索引
返回
测试用例数据对象
返回类型:DataTestCase
transmit_fuzz(sock, node, edge, callback_data, mutation_context)
渲染并传输一个模糊节点,相应地处理回调。
参数
• sock (Target, optional) – 用于传输节点的类似套接字的对象
• node (pgraph.node.node (Node), optional) – 要传输的请求/节点
• edge (pgraph.edge.edge (pgraph.edge), optional) – 当前模糊路径从“节点”到下一个节点的边缘。
• callback_data (bytes) – 之前回调的数据。
• mutation_context (MutationContext) – 当前变异上下文。
transmit_normal(sock, node, edge, callback_data, mutation_context)
渲染并传输一个非模糊节点,相应地处理回调。
参数
• sock (Target, optional) – 用于传输节点的类似套接字的对象
• node (pgraph.node.node (Node), optional) – 要传输的请求/节点
• edge (pgraph.edge.edge (pgraph.edge), optional) – 当前模糊路径从“节点”到下一个节点的边缘。
• callback_data (bytes) – 之前回调的数据。
• mutation_context (MutationContext) – 活跃的变异上下文。
4.1.1 请求图可视化选项
以下方法可用于渲染数据,然后可用于可视化请求结构。
Session.render_graph_gml()
渲染GML图形描述。
返回:GML图形描述。
返回类型:str
Session.render_graph_graphviz()
渲染graphviz图形结构。
示例创建png:
with open('somefile.png', 'wb') as file:
file.write(session.render_graph_graphviz().create_png())
返回:代表整个图形的Pydot对象
返回类型:pydot.Dot
Session.render_graph_udraw()
渲染uDraw图形描述。
返回:uDraw图形描述。
返回类型:str
Session.render_graph_udraw_update()
渲染uDraw图形更新描述。
返回:uDraw图形描述。
返回类型:str
4.2 目标
class boofuzz.Target(connection, monitors=None, monitor_alive=None, max_recv_bytes=10000,
repeater=None, procmon=None, procmon_options=None, **kwargs)
基础:object
目标描述符容器。
接受一个ITargetConnection,并用适当的FuzzDataLogger调用包装send/recv。
封装pedrpc连接逻辑。
包含一个由Session.add_target()配置的日志记录器。
示例
tcp_target = Target(SocketConnection(host='127.0.0.1', port=17971))
参数
• connection (itarget_connection.ITargetConnection) – 测试系统的连接。
• monitors (List[Union[IMonitor, pedrpc.Client]]) – 此目标的监视器列表。
• monitor_alive – 当监视器活着时调用的函数列表。它被传递了变得活跃的监视器实例。使用它来例如在重启时设置选项。
• repeater (repeater.Repeater) – 用于发送的重复器。默认为None。
• procmon – 添加进程监视器的已弃用接口。
• procmon_options – 添加进程监视器的已弃用接口。
close()
关闭与目标的连接。
返回:None
monitors_alive()
等待监视器变得活跃/建立与RPC服务器的连接。此方法在每次重启目标以及将其添加到会话时调用。成功探测后,将调用回调,传递监视器。
返回:None
属性 netmon_options
open()
打开与目标的连接。确保调用close!
返回:None
pedrpc_connect()
属性 procmon_options
recv(max_bytes=None)
从目标接收最多max_bytes的数据。
参数
max_bytes (int) – 最大接收字节数。
返回:接收到的数据。
send(data)
向目标发送数据。仅在调用open!之后有效。
参数
data – 要发送的数据。
返回:None
set_fuzz_data_logger(fuzz_data_logger)
设置此对象的模糊数据日志记录器 - 用于发送和接收的模糊数据。
参数
fuzz_data_logger (ifuzz_logger.IFuzzLogger) – 新的日志记录器。
返回:None
4.2.1 Repeater
class boofuzz.repeater.Repeater(sleep_time)
基础:object
基础重复器类。
参数
sleep_time (float) – 重复之间的睡眠时间。
abstract log_message()
格式化消息以输出到日志文件。它应该包含有关您重复的信息。
abstract repeat()
决定操作是否应重复。
返回:如果操作应重复则返回True,否则返回False。
返回类型:Bool
abstract reset()
重置重复器的内部状态。
abstract start()
启动重复器。
以下是对该接口的具体实现:
4.2.2 TimeRepeater
class boofuzz.repeater.TimeRepeater(duration, sleep_time=0)
基础:Repeater
基于时间的重复器类。启动计时器,直到持续时间秒数过去。
引发:ValueError – 如果指定的时间<= 0,则引发。
参数
• duration (float) – 重复的持续时间。
• sleep_time (float) – 重复之间的睡眠时间。
log_message()
格式化消息以输出到日志文件。它应该包含有关您重复的信息。
repeat()
决定操作是否应重复。
返回:如果操作应重复则返回True,否则返回False。
返回类型:Bool
reset()
重置计时器。
start()
启动计时器。
4.2.3 CountRepeater
class boofuzz.repeater.CountRepeater(count, sleep_time=0)
基类:Repeater
基于计数的重放器类。重复固定次数。
引发
ValueError – 如果指定的计数<1,则引发。
参数
• count (int) – 要发送的数据包总数。重要提示:不要将此参数与重复次数混淆。指定1将发送确切的一个数据包。
• sleep_time (float) – 重复之间的休眠时间。
log_message()
格式化一条消息以输出到日志文件。它应该包含有关您重复的信息。
repeat()
决定操作是否应该重复。
返回:如果操作应该重复,则返回True,否则返回False。
返回类型:布尔值
reset()
重置重放器的内部状态。
start()
启动重放器。
4.3 连接
连接对象实现 ITargetConnection。可用选项包括:
• TCPSocketConnection
• UDPSocketConnection
• SSLSocketConnection
• RawL2SocketConnection
• RawL3SocketConnection
• SocketConnection (已弃用)
• SerialConnection
4.3.1 ITargetConnection
class boofuzz.connections.ITargetConnection
基类:object
用于对模糊目标进行连接的接口。目标连接可以多次打开和关闭。在使用send/recv之前必须打开,在之后必须关闭。
在版本0.2.0中更改:ITargetConnection已移至connections子包中。现在完整的路径是boofuzz.connections.itarget_connection.ITargetConnection
abstract close()
关闭连接。
返回
无
abstract property info
返回连接信息的描述。
例如,“127.0.0.1:2121”
返回:连接信息描述
返回类型:str
abstract method open()
打开到目标的连接。确保调用close!
返回:无
abstract method recv(max_bytes)
接收最多max_bytes的数据。
参数
max_bytes (int) – 最大接收字节数。
返回:接收到的数据。如果没有接收到数据,则返回bytes(‘’)。
返回类型:bytes
abstract method send(data)
向目标发送数据。
参数
data – 要发送的数据。
返回:实际发送的字节数。
返回类型:int
4.3.2 BaseSocketConnection
class boofuzz.connections.BaseSocketConnection(send_timeout, recv_timeout)
继承自 ITargetConnection
此类作为多个基于套接字的连接的基础。
在版本0.2.0中新增。
参数
• send_timeout (float) – 发送前等待超时的秒数。默认为5.0。
• recv_timeout (float) – 接收前等待超时的秒数。默认为5.0。
close()
关闭与目标的连接。
返回值:None
abstract method open()
打开与目标的连接。确保调用close!
返回值:None
4.3.3 TCPSocketConnection
class boofuzz.connections.TCPSocketConnection(host, port, send_timeout=5.0, recv_timeout=5.0,
server=False)
继承自 BaseSocketConnection
用于TCP套接字的BaseSocketConnection实现。
在版本0.2.0中新增。
参数
• host (str) – 目标系统的主机名或IP地址。
• port (int) – 目标服务的端口。
• send_timeout (float) – 发送前等待超时的秒数。默认为5.0。
• recv_timeout (float) – 接收前等待超时的秒数。默认为5.0。
• server (bool) – 设置为True以启用服务器端模糊测试。
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.4 UDPSocketConnection
class boofuzz.connections.UDPSocketConnection(host, port, send_timeout=5.0, recv_timeout=5.0,server=False, bind=None, broadcast=False)
extends BaseSocketConnection
用于UDP套接字的BaseSocketConnection实现。
在版本0.2.0中新增。
参数0。
• recv_timeout (float) – 接收前等待超时的秒数。默认为5.0。
• server (bool) – 设置为True以启用服务器端模糊测试。
• bind (tuple (host, port)) – 套接字绑定地址和端口。如果使用recv()则必须提供。
• broadcast (bool) – 设置为True以启用UDP广播。必须提供适当的广播地址才能使send()工作,并且对于recv()工作,绑定主机必为''。
Property info
返回连接信息的描述。
例如,“127.0.0.1:2121”
返回值:连接信息描述
返回类型:str
classmethod max_payload()
返回此连接一次可以发送的最大负载。
此方法通过一些复杂的CTypes魔法执行getsockopt(),以平台无关的方式确定最大UDP负载大小。
返回值:当前平台支持的UDP数据包的最大长度
返回类型:int
open()
打开与目标的连接。确保调用close!
返回值:None
recv(max_bytes)
从目标接收最多max_bytes的数据。
参数
max_bytes (int) – 最大接收字节数。
返回值:接收到的数据。
send(data)
向目标发送数据。仅在调用open!后有效!某些协议会截断;参见self.MAX_PAYLOADS。
参数
data – 要发送的数据。
返回值:实际发送的字节数。
返回类型:int
4.3.5 SSLSocketConnection
class boofuzz.connections.SSLSocketConnection(host, port, send_timeout=5.0, recv_timeout=5.0,
server=False, sslcontext=None,
server_hostname=None)
Bases TCPSocketConnection
用于SSL套接字的BaseSocketConnection实现。
在版本0.2.0中新增。
参数
• host (str) – 目标系统的主机名或IP地址。
• port (int) – 目标服务的端口。
• send_timeout (float) – 发送前等待的秒数,超时则失败。默认为5.0秒。
• recv_timeout (float) – 接收前等待的秒数,超时则失败。默认为5.0秒。
• server (bool) – 设置为True以启用服务器端模糊测试。
• sslcontext (ssl.SSLContext) – 要使用的Python SSL上下文。如果server=True或server_hostname=None,则为必需。
• server_hostname (string) – 服务器主机名,用于验证远程SSL/TLS服务器的身份
open()
打开与目标的连接。确保调用close!
返回:None
recv(max_bytes)
从目标接收最多max_bytes的数据。
参数:
max_bytes (int) – 最大接收字节数。
返回:接收到的数据。
send(data)
向目标发送数据。仅在调用open!后有效。
参数:
data – 要发送的数据。
返回:实际发送的字节数。
返回类型:int
4.3.6 RawL2SocketConnection
class boofuzz.connections.RawL2SocketConnection(interface, send_timeout=5.0, recv_timeout=5.0,
ethernet_proto=0, mtu=1518, has_framecheck=True)
Bases BaseSocketConnection
用于Raw Layer 2套接字的BaseSocketConnection实现。
在版本0.2.0中新增。
参数
• interface (str) – 目标系统的主机名或IP地址。
• send_timeout (float) – 发送前等待的秒数。默认为5.0秒。
• recv_timeout (float) – 接收前等待的秒数。默认为5.0秒。
• ethernet_proto (int) – 要绑定的以太网协议。如果提供,打开的套接字将绑定到此协议,否则使用Python的默认值0。如果此套接字用于接收,则必须提供。有效选项请参见Linux内核文档中的<net/if_ether.h>。通常,ETH_P_ALL (0x0003)不是一个好主意。
• mtu (int) – 设置此连接的最大传输单元大小。对于标准以太网,默认为1518。
• has_framecheck (bool) – 指示目标以太网协议是否需要4字节用于帧检查。默认为True(对于标准以太网)。
属性 info
返回连接信息的描述。
例如,“127.0.0.1:2121”
返回:连接信息描述
返回类型:str
open()
打开与目标的连接。确保调用close!
返回:None
recv(max_bytes)
从原始套接字接收数据包。如果max_bytes < mtu,则只返回前max_bytes的数据,并丢弃数据包的其余部分。否则,返回整个数据包。
参数
max_bytes (int) – 最大返回字节数。0表示返回整个数据包。
返回:接收到的数据
send(data)
向目标发送数据。仅在调用open!后有效!数据将被截断为self.max_send_size(默认:1514字节)。
参数
data – 要发送的数据。
返回:实际发送的字节数。
返回类型:int
4.3.7 RawL3SocketConnection
class boofuzz.connections.RawL3SocketConnection(interface, send_timeout=5.0, recv_timeout=5.0,
ethernet_proto=2048, l2_dst=b'\xff\xff\xff\xff\xff\xff',packet_size=1500)
Bases BaseSocketConnection
用于Raw Layer 2套接字的BaseSocketConnection实现。
在版本0.2.0中新增。
参数
• interface (str) – 发送和接收的接口。
• send_timeout (float) – 发送前等待的秒数。默认为5.0秒。
• recv_timeout (float) – 接收前等待的秒数。默认为5.0秒。
• ethernet_proto (int) – 要绑定的以太网协议。默认为ETH_P_IP (0x0800)。
• l2_dst (bytes) – 第二层目的地址(例如MAC地址)。默认为b’ÿÿÿÿÿÿ’(广播)
• packet_size (int) – 最大数据包大小(以字节为单位)。如果底层接口使用标准以太网作为第二层,则默认为1500。否则,可能适用不同的数据包大小(例如Jumboframes, 802.5 Token Ring, 802.11 wifi等),必须指定。
属性 info
返回连接信息的描述。
例如,“127.0.0.1:2121”
返回:连接信息描述
返回类型:str
open()
打开与目标的连接。确保调用close!
返回:None
recv(max_bytes)
从原始套接字接收数据包。如果max_bytes < packet_size,则只返回前max_bytes的数据,并丢弃数据包的其余部分。否则,返回整个数据包。
参数
max_bytes (int) – 最大返回字节数。0表示返回整个数据包。
返回:接收到的数据
send(data)
向目标发送数据。仅在调用open!后有效!数据将被截断为self.packet_size(默认:1500字节)。
参数
data – 要发送的数据。
返回:实际发送的字节数。
返回类型:int
4.3.8 SocketConnection
boofuzz.connections.SocketConnection(host, port=None, proto='tcp', bind=None, send_timeout=5.0,
recv_timeout=5.0, ethernet_proto=None,
l2_dst=b'\xff\xff\xff\xff\xff\xff', udp_broadcast=False, server=False,
sslcontext=None, server_hostname=None)
使用套接字的ITargetConnection实现。
支持UDP、TCP、SSL、原始链路2层和原始链路3层数据包。
注意:SocketConnection已弃用,并将在Boofuzz的未来版本中被移除。请使用从BaseSocketConnection派生的类。
版本0.2.0变更:SocketConnection已移至connections子包中。现在完整的路径是boofuzz.connections.socket_connection.SocketConnection
自版本0.2.0起弃用:请使用从BaseSocketConnection派生的类。
示例:
tcp_connection = SocketConnection(host='127.0.0.1', port=17971)
udp_connection = SocketConnection(host='127.0.0.1', port=17971, proto='udp')
udp_connection_2_way = SocketConnection(host='127.0.0.1', port=17971, proto='udp', bind=('127.0.0.1', 17972))
udp_broadcast = SocketConnection(host='127.0.0.1', port=17971, proto='udp', bind=('127.0.0.1', 17972),
udp_broadcast=True)
raw_layer_2 = (host='lo', proto='raw-l2')
raw_layer_2 = (host='lo', proto='raw-l2',
l2_dst='\xFF\xFF\xFF\xFF\xFF\xFF', ethernet_proto=socket_connection.
ETH_P_IP)
raw_layer_3 = (host='lo', proto='raw-l3')
参数
• host (str) – 目标系统的主机名或IP地址,或者使用raw-l2或raw-l3时的网络接口字符串。
• port (int) – 目标服务的端口。对于proto值'tcp'、'udp'、'ssl'是必需的。
• proto (str) – 通信协议("tcp"、"udp"、"ssl"、"raw-l2"、"raw-l3")。默认为"tcp"。raw-l2:在第2层发送数据包。必须包含链路层头部(例如以太网帧)。raw-l3:在第3层发送数据包。必须包含网络协议头部(例如IPv4)。
• bind (tuple (host, port)) – 套接字绑定地址和端口。使用'udp'协议时使用recv()是必需的。
• send_timeout (float) – 发送前等待超时的秒数。默认为5.0。
• recv_timeout (float) – 接收前等待超时的秒数。默认为5.0。
• ethernet_proto (int) – 使用'raw-l3'时的以太网协议。16位整数。使用'raw-l3'时默认ETH_P_IP (0x0800)。更多选项请参见Linux文档中的“if_ether.h”。
• l2_dst (str) – 第2层目标地址(例如MAC地址)。仅由'raw-l3'使用。默认为'ÿÿÿÿÿÿ'(广播)。
• udp_broadcast (bool) – 设置为True以启用UDP广播。必须提供适当的广播地址以便send()工作,并且对于recv()工作,绑定主机为空。
• server (bool) – 设置为True以启用服务器端模糊测试。
• sslcontext (ssl.SSLContext) – 要使用的Python SSL上下文。如果server=True或server_hostname=None,则是必需的。
• server_hostname (string) – server_hostname,用于验证远程SSL/TLS服务器的身份时是必需的。
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