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/            # 单元测试

数据表示

基本原语

  1. 静态原语

    • s_static(): 添加静态不可变值
    • 别名:s_raw(), s_dunno(), s_unknown()
    • 示例:s_static("pedram\x00was\x01here\x02")
  2. 二进制数据

    • s_binary(): 处理多种格式的二进制数据
    • 示例:s_binary("0xde 0xad be ef \xca fe 00 01 02 0xba0xdd f0 0d")
  3. 随机数据

    • s_random(): 生成不同长度的随机数据
    • 参数:min_length, max_length, num_mutations, fuzzable, name
  4. 分隔符

    • 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(): 关闭块
  • 块关闭后无法更新

块的高级功能

  1. 分组(Groups)

    • s_group(): 定义一组值
    • 示例(HTTP方法):
      s_group("verbs", values=["GET", "HEAD", "POST", "TRACE"])
      if s_block_start("body", group="verbs"):
          # 块内容
      
  2. 编码器(Encoders)

    • 在传输前修改块内容
    • 示例(Trend Micro XOR编码):
      def trend_xor_encode(str):
          # 编码实现
          return encoded_data
      
  3. 依赖(Dependencies)

    • 根据条件控制块的渲染
    • 参数:dep, dep_value, dep_values, dep_compare
    • 示例:
      s_short("opcode", full_range=True)
      if s_block_start("auth", dep="opcode", dep_value=10):
          # 认证序列
      

块辅助工具

  1. 大小计算器(Sizers)

    • s_size(): 计算关联块的大小
    • 参数:length, endian, format, inclusive, signed, math, fuzzable, name
  2. 校验和(Checksums)

    • s_checksum(): 计算块的校验和
    • 支持的算法:crc32, adler32, md5, sha1或自定义函数
  3. 重复器(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示例

  1. 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(">"))
    
  2. 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框架提供了强大而灵活的模糊测试能力,通过:

  1. 丰富的数据原语支持各种协议测试需求
  2. 块和嵌套块结构实现复杂协议的表示
  3. 分组、编码器和依赖关系增强测试灵活性
  4. 块辅助工具简化常见协议模式实现
  5. Legos机制支持快速构建复杂协议组件

通过合理组合这些功能,安全研究人员可以构建针对各种协议和应用的强大模糊测试方案,有效发现潜在的安全漏洞。

Sulley Fuzzer 框架全面学习指南 前言 Sulley是一个功能强大的模糊测试(Fuzzing)框架,由Pedram Amini和Aaron Portnoy开发。本指南将详细介绍Sulley框架的核心概念、架构和使用方法,帮助安全研究人员和开发人员有效利用该工具进行漏洞挖掘。 框架概述 Sulley是一个可扩展的fuzzer框架,由多个组件组成,其特点包括: 不仅专注于数据生成,还提供完整的模糊测试解决方案 能够系统性地监控网络并保留记录 检测和监控目标健康状况,支持多种恢复方法 检测、跟踪和分类发现的故障 支持并行fuzzing,显著提高测试速度 自动确定测试用例触发的特定错误 目录结构 Sulley采用精心设计的目录结构: 数据表示 基本原语 静态原语 : 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标签): 模糊库扩展 可以通过外部文件扩展模糊库: .fuzz_strings : 每行一个字符串值 .fuzz_ints : 每行一个整数值 块(Blocks)与组织结构 基本块操作 s_block_start() : 定义并打开新块 s_block_end() : 关闭块 块关闭后无法更新 块的高级功能 分组(Groups) : s_group() : 定义一组值 示例(HTTP方法): 编码器(Encoders) : 在传输前修改块内容 示例(Trend Micro XOR编码): 依赖(Dependencies) : 根据条件控制块的渲染 参数: dep , dep_value , dep_values , dep_compare 示例: 块辅助工具 大小计算器(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 示例: Legos(预定义组件) Legos是用户定义的复杂组件,如: ASN.1/BER原语 Microsoft RPC NDR原语 电子邮件地址、主机名等协议原语 XDR类型 示例(ASN.1/BER字符串): 自定义Lego示例 XML标签Lego : ASN.1/BER整数Lego : 实际应用示例 HTTP请求模糊测试 表条目模糊测试 总结 Sulley框架提供了强大而灵活的模糊测试能力,通过: 丰富的数据原语支持各种协议测试需求 块和嵌套块结构实现复杂协议的表示 分组、编码器和依赖关系增强测试灵活性 块辅助工具简化常见协议模式实现 Legos机制支持快速构建复杂协议组件 通过合理组合这些功能,安全研究人员可以构建针对各种协议和应用的强大模糊测试方案,有效发现潜在的安全漏洞。