Sulley fuzzer learning---1
字数 1653 2025-08-20 18:17:48
Sulley Fuzzer 框架全面学习指南
前言
Sulley是一个功能强大的模糊测试(Fuzzing)框架,由Pedram Amini和Aaron Portnoy开发。本指南将详细介绍Sulley框架的核心概念、架构和使用方法,帮助安全研究人员和开发人员有效利用该工具进行漏洞挖掘。
框架概述
Sulley是一个可扩展的fuzzer框架,由多个组件组成,其特点包括:
- 不仅专注于数据生成,还提供完整的模糊测试解决方案
- 能够系统性地监控网络并保留记录
- 检测和监控目标健康状况,支持多种恢复方法
- 检测、跟踪和分类发现的故障
- 支持并行fuzzing,显著提高测试速度
- 自动确定测试用例触发的特定错误
目录结构
Sulley采用精心设计的目录结构:
archived_fuzzies/ # 存储归档的fuzzers和生成的数据
audits/ # 保存PCAP、崩溃数据、代码覆盖率等分析结果
docs/ # 文档和API参考
requests/ # 请求库,按目标分类存储
sulley/ # 核心框架代码
legos/ # 用户定义的复杂基元
pgraph/ # Python图形抽象库
utils/ # 各种辅助程序
unit_tests/ # 单元测试
数据表示
基本原语
-
静态原语:
s_static(): 添加静态不可变值- 别名:
s_raw(),s_dunno(),s_unknown() - 示例:
s_static("pedram\x00was\x01here\x02")
-
二进制数据:
s_binary(): 处理多种格式的二进制数据- 示例:
s_binary("0xde 0xad be ef \xca fe 00 01 02 0xba0xdd f0 0d")
-
随机数据:
s_random(): 生成不同长度的随机数据- 参数:
min_length,max_length,num_mutations,fuzzable,name
-
分隔符:
s_delim(): 表示协议中的分隔符- 示例(HTML标签):
s_delim("<") s_string("BODY") s_delim(" ") s_string("bgcolor") s_delim("=") s_delim("\"") s_string("black") s_delim("\"") s_delim(">")
模糊库扩展
可以通过外部文件扩展模糊库:
.fuzz_strings: 每行一个字符串值.fuzz_ints: 每行一个整数值
块(Blocks)与组织结构
基本块操作
s_block_start(): 定义并打开新块s_block_end(): 关闭块- 块关闭后无法更新
块的高级功能
-
分组(Groups):
s_group(): 定义一组值- 示例(HTTP方法):
s_group("verbs", values=["GET", "HEAD", "POST", "TRACE"]) if s_block_start("body", group="verbs"): # 块内容
-
编码器(Encoders):
- 在传输前修改块内容
- 示例(Trend Micro XOR编码):
def trend_xor_encode(str): # 编码实现 return encoded_data
-
依赖(Dependencies):
- 根据条件控制块的渲染
- 参数:
dep,dep_value,dep_values,dep_compare - 示例:
s_short("opcode", full_range=True) if s_block_start("auth", dep="opcode", dep_value=10): # 认证序列
块辅助工具
-
大小计算器(Sizers):
s_size(): 计算关联块的大小- 参数:
length,endian,format,inclusive,signed,math,fuzzable,name
-
校验和(Checksums):
s_checksum(): 计算块的校验和- 支持的算法:
crc32,adler32,md5,sha1或自定义函数
-
重复器(Repeaters):
s_repeat(): 重复块多次- 参数:
min_reps,max_reps,step,fuzzable,name - 示例:
s_repeat("table entry", min_reps=100, max_reps=1000, step=50)
Legos(预定义组件)
Legos是用户定义的复杂组件,如:
- ASN.1/BER原语
- Microsoft RPC NDR原语
- 电子邮件地址、主机名等协议原语
- XDR类型
示例(ASN.1/BER字符串):
s_lego("ber_string", "anonymous")
自定义Lego示例
-
XML标签Lego:
class tag (blocks.block): def __init__ (self, name, request, value, options={}): blocks.block.__init__(self, name, request, None, None, None, None) self.value = value self.options = options if not self.value: raise sex.error("MISSING LEGO.tag DEFAULT VALUE") self.push(primitives.delim("<")) self.push(primitives.string(self.value)) self.push(primitives.delim(">")) -
ASN.1/BER整数Lego:
class integer (blocks.block): def __init__ (self, name, request, value, options={}): blocks.block.__init__(self, name, request, None, None, None, None) self.value = value self.options = options if not self.value: raise sex.error("MISSING LEGO.ber_integer DEFAULT VALUE") self.push(primitives.dword(self.value, endian=">")) def render (self): blocks.block.render(self) self.rendered = "\x02\x04" + self.rendered return self.rendered
实际应用示例
HTTP请求模糊测试
from sulley import *
# 初始化请求
s_initialize("HTTP BASIC")
# 定义HTTP方法组
s_group("verbs", values=["GET", "HEAD", "POST", "TRACE"])
# 定义主体块
if s_block_start("body", group="verbs"):
# 分解HTTP请求
s_delim(" ")
s_delim("/")
s_string("index.html")
s_delim(" ")
s_string("HTTP")
s_delim("/")
s_string("1")
s_delim(".")
s_string("1")
# 结束请求
s_static("\r\n\r\n")
s_block_end("body")
表条目模糊测试
# 表条目: [type][len][string][checksum]
if s_block_start("table entry"):
# 随机类型字段
s_random("\x00\x00", 2, 2)
# 字符串长度字段
s_size("string field", length=2)
# 字符串块
if s_block_start("string field"):
s_string("C" * 10)
s_block_end()
# 字符串校验和
s_checksum("string field")
s_block_end()
# 重复表条目
s_repeat("table entry", min_reps=100, max_reps=1000, step=50)
总结
Sulley框架提供了强大而灵活的模糊测试能力,通过:
- 丰富的数据原语支持各种协议测试需求
- 块和嵌套块结构实现复杂协议的表示
- 分组、编码器和依赖关系增强测试灵活性
- 块辅助工具简化常见协议模式实现
- Legos机制支持快速构建复杂协议组件
通过合理组合这些功能,安全研究人员可以构建针对各种协议和应用的强大模糊测试方案,有效发现潜在的安全漏洞。