前段时间一直在研究fuzz工具,这里就写篇文章总结一下下。
在安全测试中,模糊测试(fuzz testing)是一种介于完全的手工渗透测试与完全的自动化测试之间的安全性测试类型。能够在一项产品投入市场使用之前对潜在的应当被堵塞的攻击渠道进行提示。
模糊测试(fuzz testing)和渗透测试(penetration test)都是属于安全测试的方法,它们有同也有异,渗透测试一般是模拟黑客恶意入侵的方式对产品进行测试,对测试者的执行力要求很高,成本高,难以被大规模应用。而模糊测试,它能够充分利用机器本身,随机生成和发送数据;与此同时,又能够引进业内安全专家在安全性方面的建议。模糊测试其数据具有不确定性,也没有明显的针对性,简单来说就是没有逻辑,没有常理。只要将准备好的那些杂乱的程序插入其中,然后等待bug的出现,而出现的漏洞是测试员们先前无法预知的。
模糊测试的执行过程很简单,大致如下:
1、准备好随机或者半随机方式生成的数据;
2、将准备好的数据导入被测试的系统;
3、用程序打开文件观察被测试系统的状态;
4、根据状态判断是否存在漏洞。
由此可见,模糊测试deep整个执行过程是依靠工具进行的自动化或半自动化测试。通常在这种情况下,我们可以引入模糊测试的方法。我们尝试抓取到客户端和服务器之间的通信数据,根据抓包出来的这些数据分析出客户端与服务器之间的通信协议,然后根据协议的定义,自行编造数据发起攻击,尝试找到可能的漏洞。相比于直接看targetserver进行代码审计成本要低,而这种关注协议层面的攻击,其效率更高。但是,这种测试方法,若要进行协议分析难度会很大,而且,人工编造数据成本很高。所以,我们就可以引入fuzz testing,机器生成和发送数据的能力足够强,我们可以将生成数据的任务交给机器去完成,解决了人工编造数据成本高的问题。当然,协议的分析主要还是依赖人工来进行,模糊测试领域内有一些自动化的协议分析手段,但从效率和效果上来说,在面对复杂协议的时候,人工分析的方式更为有效。
不扯废话,这里直接上工具,具体的测试流程大家有兴趣的可以看看《模糊测试——强制发掘安全漏洞的利器》这本书,书中有详细的介绍。
1:首先是一款web应用漏洞fuzz工具-teenage mutant ninja turtles v 1.5
这是我最喜欢的一款工具,个人觉得不错,这款工具先前FreeBuf有发文介绍过,我也正是在freeBuf看到才开始学着使用该工具的。
现在很多大中型网站都在服务器前段架设了WAF、IPS等过滤设备,常见的SQL注入、XSS、XXE等都会在这一层面被过滤掉,或者给渗透测试造成了各种不方便。
该工具主要就是生成混淆的测试代码,绕过常见的过滤设备,使用了如下一些常见的混淆方法:
Using Case Variation
Using SQL Comments
Using URL Encoding
Using Dynamic Query Execution
Using Null Bytes
Nesting Stripped Expressions
Exploiting Truncation
Using Non-Standard Entry Points
Combine all techniques above
该软件主要包含三个测试项目:
1、基于fuzzdb的一些测试Payload;
2、Web应用程序错误的数据库(比如返回的错误信息等);
3、Web应用程序中Payload部分可自行修改。
下载地址(需要*),我下载下来了,这是百度云链接,密码: 9u9g。
2:Sulley
它是一个强大的基于Python的fuzzing框架的怪物,Sulley不仅仅是一个fuzzer;它还有拥有优秀的崩溃报告,自动虚拟化技术(VMWare automation)。在fuzzing的过程中你可以在任意时刻,甚至是目标程序崩溃的时候,从新启动程序到前一刻,继续寻找bug之旅。
3:SPIKE
SPIKE是一个尝试编写一个易于使用的通用协议的接口,有助于反向工程师新的和未知的网络协议。它有几个工作实例。包括一个Web服务器使用NTLM身份验证暴力破解器和实例代码解析Web应用程序和dce-rpc(入侵防护)。
可参考百度文库《使用SPIKE进行安全测试》、《Fuzzing-用SPIKE挖掘漏洞》,感觉这也是一大神器啊。
4:Bunny
它是Google出品的,Bunny是针对C程序的,实时反馈,高性能的,通用协议盲注入fuzzer。通过编译器技术实现无缝注入准确可靠的指令hook到目标程序中去。这些hook使得fuzzer可以实时获取函数调用、执行路径以及各类输入的返回值。Bunny使在不带来明显性能开销情况下,实时监控内部运行流程成为可能。
目前版本支持Linux、FreeBSD、OpenBSD以及Cygwin on IA32/IA64。
有兴趣的可以去看看《软件漏洞挖掘Fuzz工具之二_Bunny》一文。
几大优点:
1、使用简单,修改项目的配置文件中的gcc即可,如:CC=/path/to/bunny-gcc ./configure;
2、很小的性能消耗;
3、从zlib,libpng到openssh,各种模块支持。不需要修改测试程序;
4、支持灵活配置,支持9中fuzz类型。可以控制fuzz深度等等。自动保存crash case。支持并行fuzz等。
基本算法:
1、使用已知的输入文件,初始化一个fuzzing队列;
2、尝试几个fuzzing 队列中确定的输入,记录执行路径;
3、如果执行路径与之前不同,记录使用的测试用例,并把该用例压栈;
4、任何函数调用参数或者返回值已知运行路径变化,则记录;
5、如果程序出错了,记录并保持测试用例;
6、测试所有用例,直到fuzzing队列为空。
5:Scratch
Scratch是一种先进的驱逐舰(“测试”),可以从一个简单的包找到各种各样的漏洞。它复杂的解析二进制文件以确定是什么数据模糊,同时Scratch也配备了一个模糊的二进制协议如SSL和SMB框架。
6:LXAPI
LXAPI的Python程序的选择方法和设计bugtesting开发的本地及远程漏洞。它包括模糊测试,杂项shellcode的方法和一个简单的GUI,LxAPI is currently a work-in-progress.这款工具我没用过,不过看到有大神用的很溜,佩服啊。
7:antiparse
antiparser是模糊测试和故障注入API的fuzz工具。antiparser的目的是提供一个API,可用于模型的网络协议和文件格式的复合数据类型。一旦已经创建了一个模型,该antiparser有各种方法产生随机数据集的方式,将偏离理想触发软件错误或安全漏洞。需要Python 2.3或更高版本。
8:Autodafe
Autodafe是一个模糊的框架,可以用来识别的协议和应用程序边界验证等问题,Martin Vuagnoux所写。
9:dfuz
这是远程协议的测试工具,可以做很多事情,如发送随机数据、随机大小等,连同你想要的数据。它有很多的方式告诉程序使用这个数据,通过使用规则的文件,这将被解析的程序本身,并有几个选项和方法,使其非常具体、非常灵活。这不仅是一个远程协议的测试本身,它是一个脚本,就像电机一样,你可以创建任何类型的有效载荷。User-friendly(UNIX)。使用起来个人觉得还是比较简单的,易操作。
10:Evolutionary Fuzzing System (EFS)
它是一款试图动态模仿一个协议,使用代码覆盖和其他反馈机制的fuzz工具。
11:General Purpose Fuzzer (GPF)
用C写的,GPF拥有一批模式从简单的纯随机测试到更复杂的协议的标识。没用过,在鬼仔的博客那儿看到的。
12:Protocol Informatics
Slides, whitepaper and code from the last publicly seen snapshot from Marshall Beddoe’s work.我研究了半天,还是没搞懂,统计没学好,不行啊。
13:Schemer
XML驱动的通用文件和协议测试。基于XML定义的模版的测试。
14:SMUDGE
这是一款纯python协议测试的工具。
15:taof
用Python写的,跨平台的GUI驱动的网络协议,它的模糊测试环境为UNIX和Windows系统。
16:EFuzz
EFuzz是一个易于使用的Win32 TCP/UDP协议fuzzerwhich在本地和远程服务发现未知的缓冲区溢出。使用配置文件来定义规范的请求范围。包括C源代码,在GPL下发布。因为我对c比较熟悉,所以我觉得这个还是比较好上手的。
小结
就先介绍这么些个吧,以后再慢慢补充,对于这些工具的学习资料,如果大家比较感兴趣的话,建议*去找,国内的资料不太多。
引用百科上的一段话:模糊测试能够说明bug在程序中的出现。并不证明不存在这样的 bug。而且,通过模糊测试会极大地提高您对应用程序的健壮性及抵御意外输入的安全性的自信心。如果您用 24 小时对程序进行模糊测试而其依然无事,那么随后同种类型的攻击就不大可能再危及到它。(并不是不可能,提醒您,只是可能性很小。)如果模糊测试揭示出程序中的 bug,就应该进行修正,而不是当bug随机出现时再对付它们。模糊测试通过明智地使用校验和、XML、垃圾收集和/或基于语法的文件格式,更有效地从根本上加固了文件格式。
所以,今后在对一个系统进行测试时,不妨试试fuzz testing吧。