模糊测试基础

这篇文章主要是对模糊测试的一个入门级的认识,没有太多干货,主要是一些概念性的东西,为以后深入学习做一点铺垫。
用于模糊测试的模糊测试器分为两类:

  • 一类是基于变异(mutation-based)的模糊测试器,这一类测试器通过对已有的数据样本进行变异来创建测试用例
  • 另一类是基于生成(generation-based)的模糊测试器,该类测试器为被测系统使用的协议或是文件格式建模,基于模型生成输入并据此创建测试用例。

模糊测试各阶段

  1. 确定测试目标
  2. 确定输入向量
  3. 生成模糊测试数据
  4. 执行模糊测试数据
  5. 监视异常
  6. 判定发现的漏洞是否可能被利用

模糊测试方法

  1. 预生成测试用例:理解规约,生成测试边界条件或是违反规约的测试用例。
  2. 随机生成输入:简单地向目标应用发送伪随机数据。
  3. 手工协议变异测试:测试者就是模糊测试器。
  4. 变异或强制性测试:从一个有效的协议样本或是数据格式开始,持续不断地打乱数据包或是文件中的每一个字节、字、双字或是字符串。
  5. 自动协议生成测试:理解协议规约或文件定义,创建文法,识别出数据包或文件中的动态和静态部分,动态部分可以被模糊化变量替代。

模糊测试器类型

  1. 本地模糊器
    命令行模糊测试器
    环境变量模糊测试器
    文件格式模糊测试器
  2. 远程模糊测试器
    网络协议模糊测试器
    Web应用模糊测试器
    Web浏览器模糊测试器
  3. 内存模糊测试器

网络协议模糊测试:
简单协议:仅有简单认证或没有认证,通常基于可打印的ASCII字符而不是二进制数据;
复杂协议:通常由二进制数据和偶尔包含人可读的ASCII字符串构成,认证可能通过加密或是某种形式的混淆来实现。(SPIKE、Peach模糊测试框架)

数据表示和分析

协议:在两台计算机端点之间控制或使能连接,通信和数据传输的约定或标准。
协议中的字段:协议的主要作用就是定义“协议中各部分数据如何被解释”,设计协议时有三种典型的方法:定长字段变长字段分隔字段
简单文本协议:使用的用于通信的数据值都在可打印字符范围内。
二进制协议:二进制协议数据流中都是原始数据,而不是可读的文本,如果不理解协议,协议数据包就没有任何意义。二进制协议通常使用数据块。块最前面是块大小的值,后面是块中的实际数据。对模糊测试来说,数据块是一个重要的概念。如果打算创建一个模糊测试器来向数据块中注入数据,就必须仔细调整块大小的值,否则,接收到数据的应用就理解不了数据包。

网络协议模糊测试

对网络协议进行模糊测试也需要识别出可被攻击的接口,通过变异或生成方式得到能够触发错误的模糊测试值,然后将这些模糊测试值发送给目标应用,监视目标应用的错误。 现有的网络协议模糊测试倾向与采用两种风格:

  • 一种风格是采用通用框架,可以对多种协议进行模糊测试。(SPIKE工具和ProtoFuzz工具)
  • 另一种网络模糊测试器的风格是面向特定协议。(ircfuzz、dhcpfuzz、InfigoFTPSStressFuzzer)

面向特定协议的模糊测试器通常只是些小脚本或小应用,通用框架则需要更大的开发工作量。

测试方法

  • 强制(基于变异的)模糊测试
    在网络模糊测中,测试者通常使用嗅探器,在测试之前使用静态方法或是在运行时使用动态方法抓取合法的协议数据。随后,模糊测试器对抓取到的数据进行变异,将其发送给目标应用。对实现了基本回放攻击保护的协议,简单的强制网络模糊测试除了对初始会话相关的代码(如认证过程)产生效果外,不会有其他任何作用。如果协议包含校验码,模糊测试器还需要能动态更新校验码字段。
    这种方法适用于私有协议的模糊测试。
    下一种方法更适合常见的网络协议模糊测试。
  • 智能强制(基于生成的)模糊测试
    首先得花精力实际研究协议规范,智能模糊测试器可以依赖用户提供的配置文件,使得模糊测试的过程更智能。用户提供的配置通常包含描述协议语言的元数据。

使用SPIKE进行模糊测试

SPIKE Peach 通用目的模糊测试器(GPF) Autodafe

对第三方私有协议进行模糊测试

通过对客户端和服务器之间的通信数据进行变异来测试,但无法确切知道该协议还有多大比例的部分没有被观察到。为了更好地分析目标协议,可以对客户端和服务器的二进制代码开展逆向工程。逆向工程的代价非常高,只有具有超高技巧的,有经验的工程师才能执行逆向工程。在逆向之前要确保已经充分利用了他人的工作成果,确保已经通过Google检索过相关信息,可能已经有人写过我们所需的非官方文档WiresharkEthereal的源代码中已经包含了许多被彻底研究过的、较为知名的私有协议的定义。

启发式技术

代理模糊测试 ProxyFuzzer
模糊测试器代理转发客户端和服务器之间的数据
改进的代理模糊测试
反汇编启发式技术在进行模糊测试时,使用运行时插桩工具(如调试器)监视被测目标上的代码执行。
使用PaiMei逆向工程框架PyDbg组件,可以开发出实现了基本概念的目标监视模糊测试器的反馈调试器。从 http://www.fuzzing.org 上可以下载得到相关的源代码。

生物信息学

生物信息学:利用应用数学、信息学、统计学和计算机科学的方法研究生物学问题(通常在分子层上)。
生物信息学中最基础的分析是排列两个序列(不管长度是否相同),并找出最大相似度。
Protocol Informatics(PI)Python框架是应用生物信息理论进行网络协议分析的框架,它的目标是通过分析大量观察到的数据,自动推断协议的字段边界。
PI框架应用了Smith-Waterman(SW)本地序列对齐算法、Needleman-Wunsch(NW)全局序列对齐算法、相似矩阵和进化树方法,成功地从HTTP、TCMP和SMB协议中识别除了协议字段。

遗传算法

遗传算法(Genetic Algorithm,GA)是模拟进化软件使用的一种近似搜索技术。
对遗传算法而言,通常需要定义以下三方面的内容:

  • 表示方法:解决方案(个体)的表示方法。
  • 适应度函数:用来评估得到的方案(个体)对环境适应度的函数。
  • 生产函数:负责变异和让两个方案(个体)交配的函数。

reference
《模糊测试 强制发掘安全漏洞的利器》