资源描述
网络协议模糊测试
1. 网络协议模糊测试
网络协议模糊器的测试对象重要是各类网络产 品中的网络协议解析模块 ,目的是测试其在组装、解 析网络协议过程中是否存在漏洞。其思想是模糊器通过 Socket 与被测目的之间进行通信, 向被测目的 应用发送变异或包含错误的模糊值, 并监视目的应 用以发现错误。使用网络协议模糊器进行模糊测试, 需要一方面 研究各类协议的规范和标准 ,以便创建合理的测试 数据。
目前 ,最常见的网络协议模糊测试实行方案 有两种 :方案Ⅰ为客户端和服务端测试模式, 即模糊器和被测对象分别为测试过程的两个端点。此时, 模糊器可充当客户端的角色, 用来测试服务端程序的安全性, 例如 Web 服务程序。同 时 ,模糊器也可以充当服务端的角色 ,用来测试客户 端程序的安全性. 模糊器中的监控模块用来对被测对象的行为进行收集、分析以判断是否存在异常情况。
方案Ⅱ网络协议模糊测试的实行方案是为了测试防火墙、路由器、安全网关等等部署在网络中间的设备。模糊器构造的数据被发送至协议服务器的过程中, 位于模糊器和协议服务器之间的被测对象对其起到了重组和解析的作用 ,一旦重组和解析过程中犯错,也许导致被测对象出现异常状态。模糊器中的监控模块用来对被测对象的异常状态进行收集、分析,最终定位漏洞所在。通过此方法可发现被测对象在网络协议解决过程中的安全漏洞。
2. 测试对象
理论上,潜在测试目的涉及任何可以接受网络数据的任务软件。OSI7层模型中从数据链路层到应用层每一层都有也许存在实现问题,再对测试目的进行全面审计时,每一层都要进行测试。
3. 测试方法
3.1 强制(基于变异)模糊测试
先使用嗅探器抓取合法的协议数据,随后对抓到的数据进行变异,将其发送给目的应用。但在目的应用实现了基本回放袭击保护或协议包含校验码的两种情况下,这种模糊测试无法达成盼望的测试效果。
3.2 智能强制(基于生成)模糊测试
智能强制模糊测试一方面需要实际研究协议规范。智能模糊测试器仍然依靠强制性袭击,可以依赖用户提供的配置文献,使模糊测试的过程更智能。
3.3 通过修改客户端进行变异模糊测试
将测试嵌入到已经实现了用我们盼望的协议与服务进行通信的应用中,这样就不用实现在模糊测试器中实现整个协议,给模糊测试器的开发者带来好处,最小化所需投入的经历。
4. 错误检测
4.1 手工方式(基于调试器)
在进程上附加使用调试器
4.2 自动化方式(基于代理)
设计一个方案来代替手工调试过程。不使用调试器,由模糊测试者编写一个面向目的平台的调试代理并在目的应用上运营之。监视目的进程中发生的异常,并于远程系统上的模糊测试器进行通信。
5. UNIX平台自动化网络协议模糊测试
5.1 使用SPIKE模糊测试框架
SPIKE用模糊字符串库中的内容迭代模糊变量,达成模糊测试。模糊此符传可以是任何数据类型,甚至是XDR编码的二进制数据数组。SPIKE是一个GPL的API和一套工具,它使你可以快速创建任何网络协议压力测试的测试器。大多数协议都是围绕着非常类似的数据格式化建立的。这些协议中的许多都已经在SPIKE中得到支持。其他的协议也不久会得到支持。
SPIKE使用C语言编写,运营平台UNIX,框架结构如下图所示
框架试图方便逆向工程师和安全研究人员复制一个未知的协议,框架涉及模糊测试器和支持代码,涉及以下内容:
(1).webfuzz,提供一许多小工具,以组合一个灵活而全面的web应用程序模糊测试工具。Webfuzz完全依赖于浏览器来生成它的规定,它总是对的解析java和脚本语言。
(2). Msrpcfuzz:尝试运营ncan_tcp程序,它基本上是随机发送参数,假如端口忽然关闭,就发现了一个潜在的严重错误。
5.2 针对协议的模糊测试器
SPIKE包含一部分预先写好的针对具体协议的模糊测试器,以下是这些模糊测试器的列表:
HTTP模糊测试器
Microsoft RPC模糊测试器
X11模糊测试器
Citrix模糊测试器
Sun RPC模糊测试器
针对协议的模糊测试脚本
SPIKE还包含一些可以嵌入到多个SPIKE内涵的通用模糊测试器中的脚本。脚本列表如下所示
5.3 基于脚本的通用模糊测试器
SPIKE有几个通用模糊测试器,他们接受脚本作为输入,下面列出能在SPIKE中找到的通用模糊测试器:
TCP监听模糊测试器(客户端)
TCP/UDP发送模糊测试器
行缓冲TCP发送模糊测试器
5.4 Pop3模糊测试脚本
在pop3中可以查看pop3.spk查看pop3模糊测试脚本
s_string_variable("USER");
s_string(" ");
s_string_variable("Administrator");
s_string("\r\n");
s_string("PASS ");
s_string_variable("jbone");
s_string_variable("\r\n");
s_string_variable("STAT");
s_string("\r\n");
s_string("LIST ");
s_string_variable("1");
s_string("\r\n");
s_string("RETR ");
s_string_variable("1");
s_string("\r\n");
s_string("DELE ");
s_string_variable("1");
s_string("\r\n");
s_string_variable("NOOP\r\n");
s_string_variable("RSET\r\n");
s_string_variable("QUIT\r\n");
5.5 常用API
s_string(char *listring):该函数将一个固定字符串添加到SPIKE,被加入的字符串的值不会被修改。
s_string_variable(unsigned char *variable):该函数将一个可变字符串添加到SPIKE。这个字符串在相应的ibanliang被解决的时候会被模糊字符串替换掉。
s_binary(char * instring):该函数将二进制数据添加到SPIKE。加入的数据值不会被修改。
6. Windows平台上的网络协议的模糊测试
在windows下使用C#进行模糊测试工具开发,可以创建和谐的用户界面。直接调用。Net封装函数,节省工作量。
6.1 构建数据包
运用数据包变异方法,用户基于已有的合法数据包创建一个模板,在模板中知名需要修改的部分,从而满足模糊测试的需要。
6.2 抓取数据
WinPcap使用c语言编写,所以在C#环境下,使用Metro Packet库来抓取数据包。
6.3 解析数据
在抓取到数据后,对被抓取的数据进行解析,以易于被理解的格式展现数据都的内容。
6.4 模糊测试变量
在观测和抓取到网络数据后,我们需要允许用户表达数据包中适合进行变异的位置,以便进行模糊测试。为此我们允许用户在以十六进制方式显示的数据内容中加入简朴的标签,表白进行模糊测试的部分。ProtoFuzz工具使用下面这些标签:
[XX]-表达强制,将使用所有也许的字节值用方括号括起来的字节进行模糊测试。将每一个字节模糊测试256次。
<XX>-表达字符串,从用户控制的文本文献中获得预定义的,可变长的,以十六进制方式表达的字符串进行模糊测试。
6.5 发送数据
创建一个可以有用户指定数据包中任何字节的值的裸数据包,由程序员来保证数据包符合RFC定义的结构,提供更好的细节控制能力,是的用户可以对协议头进行模糊测试。
6.6 ProtoFuzz工具代码结构
展开阅读全文