Fuzzing的由来
正像瓦特为了解放人类双手提高生产率而发明蒸气机一样,一些或者某位杰出的黑客在研究漏洞发掘技术的时候发明了Fuzzing技术。可以说这是一种非常快速而有效的发掘技术。Fuzzing技术的思想就是利用“暴力”来实现对目标程序的自动化测试,然后监视检查其最后的结果,如果符合某种情况就认为程序可能存在某种漏洞或者问题。这里的“暴力”并不是说我们通常说得武力,而是说利用不断地向目标程序发送或者传递不同格式的数据来测试目标程序的反应。
为什么选择Fuzzing测试
我们在发现一些溢出漏洞的时候,往往是不断地给目标程序输入不同长度的字符串变量来测试目标程序是不是存在溢出漏洞的。


Fuzzer
Fuzzer就是指用来进行Fuzzing工作的工具。这里所列出的分类只是常见的一些,那些不常见的Fuzzer一般是跟据具体测试的目标程序性质来决定的。下面列出的分类中,很多Fuzzer都已经被一些著名的黑客或者安全公司实现,其效果是得到认可的,如果你要利用Fuzzing来发掘软件漏洞,大可以使用这些著名的Fuzzer工具,它将帮助你实现你想要的目的。
Fuzzing工具的分类
文件型
文件型Fuzzer主要针对有文件作为程序输入的情况下的Fuzzing。
1.对于可读的文件,你可以使用改变其内容的具体数值来进行Fuzzing
2.对于未公布格式的,你可以按照一定规律修改文件格式来进行Fuzzing
网络型
网络型Fuzzer是最为广泛的一种Fuzzer,因此这个方面的杰出的Fuzzer工具非常丰富。
1.对于Web应用型的程序 Fuzzing的主要用来发现XSS漏洞、注入漏洞之类等等
2.用来发现溢出或者拒绝服务式漏洞的网络型Fuzzer-基于协议的网络型Fuzzer
接口型
接口型Fuzzer是利用应用程序提供的外部接口来进行Fuzzing的工具。
ActiveX控件接口(放到后面的0day与网页木马制作一课中详细讲解)
库文件接口
系统函数接口
Fuzzer的工作原理
一种是不断地对目标程序进行随机数据或者某种类型格式的数据发送、输入,这种Fuzzer在使用中,往往会因为所发送的数据不符合目标程序要求的格式,而直接被程序拒绝,不能够深入检测程序内部。这样导致的直接结果就是会大大降低对目标程序漏洞的发掘,效率低下。
还有一种就是建立在“可能性覆盖”理论模型上的Fuzzer。
可能性覆盖理论
“可能性覆盖”理论是指将程序所有可能接受的外部数据,经过抽象划分为不同的类型,然后从每个类型中选取一个测试实例,使用这些测试实例进行对程序的Fuzzing检查。
举例说明
假设某个应用软件是我们测试的目标程序,我们称其为A,A可以接收两个整数型的数字作为参数,我们称这两个参数一个为B,一个为C,然后A对这个两个参数进行一系列运算后返回一个数值给用户。
分 析
首先,A的参数是两个,那么这里就出现了可能性判断,如果我们传递给A的参数数目少于两个或者多于两个呢?我们可以用字符来代表这两种可能性,少于两个参数的为Low,多于两个的为More,接着分析,我们知道这两个参数B和C必须是整数型的数字,那么如果一个参数是整数另外一个参数是小数呢?或者两个参数都是小数?又或者两个都是字符串型的呢?这种组合太多了,我们把这些可能性全部画成一张表,它应该是下面这个样子:

参数B 参数C 标记值
整数 整数 II
整数 小数 ID
整数 Long IL
整数 字符串 IC
小数 整数 DI
Long 整数 LI
字符串 整数 CI
小数 小数 DD
小数 Long DL
小数 字符串 DC
Long 小数 LD
Long 字符串 LC
Long Long LL
字符串 小数 CD
字符串 Long CL
字符串 字符串 CC
从上面的这个表格我们可以看到,关于A程序的输入有十六种可能性的组合,我们应该从这十六个组合中,对每一个组合选取一个实例,也就是找一个代表用来进行Fuzzing。例如对组合II,我们可以选择实例为(2,900),这代表了B是2,C是900,这样代表了两个参数都为整数的可能性,下面是组合ID,我们就选择(50,8.21),这样参数B为50一个整数,C为8.21一个小数,符合可能性组合ID,下面的组合你可以依此类推 。
现在,我们已经组合出了18种可能性(加上前面的Low和More),我们把这些可能性选取好的实例,编到Fuzzer中去,然后就可以让Fuzzer从中依次取出一个实例,对目标程序A进行Fuzzing了。
可能性覆盖理论的Fuzzer是比较科学的,建立在一定的数学模型上。
利用随机数据进行Fuzzing的Fuzzer,往往在很多时候会发现许多“可能性”组合Fuzzer发现不了的漏洞,这是因为随机数据型Fuzzer可以是一个永无休止的Fuzzing过程,而这些随机数据很能就会组合成一个意想不到的数据,使得目标程序崩溃或者出现漏洞,所以我们在做Fuzzing测试的时候,可以根据具体环境需要来进行发掘工作,因为随机数据型Fuzzing也许将会持续几天甚至是几周。
如何监视Fuzzing测试的结果
不能让我们整天坐在屏幕前用眼睛盯着程序看
要想实现Fuzzer对目标程序的运行情况监视,我们可以采用很多办法,对于网络型的程序,我们可以监视其返回数据情况,或者是不是出现了“The Connection Closed By Remote”这样非常明显的出错信息。对于本地程序,我们有很多选择,可以查询系统日志,因为系统日志往往记录下了,系统中所有发生的异常事件。或者使用监视一些用来显示警告、出错的函数是不是被目标程序调用,甚至在Windows下面,你可以直接利用Fuzzer程序在Fuzzing目标程序后,自动查看系统是不是多了一个叫做DW20的进程名称,它就是我们在Windows下使用某些软件或者系统出错后,常常会看见的“是否上报微软公司”的对话框程序。

摘自 黑防溢出漏洞发掘笔记

源链接

Hacking more

...