Fuzzing:用SPIKE挖掘漏洞
前言:本文翻译于Stephen Bradshaw的论坛,原文链接为resources.infosecinstitute/intro-
to-fuzzing/,resources.infosecinstitute/fuzzer-automation-with-spike/。主要用于个人学习记录,英语不给力,将就着看吧。国内技术牛很早也总结了一篇,可以结合着学习netsecurity.51cto/art/
201111/302089.htm。
本文主题是如何通过fuzzing应用程序来寻可利用的漏洞。
Stephen Bradshaw特意开发了包含漏洞的Vulnserver服务器作为Fuzzing的目标。本文我们将进一步讨论SPIKE脚本与自动化的SPIKE fuzzing会话。
系统设置要求
要完成本文中的Fuzzing练习,我们需要建立两个系统--一是Windows操作系(Windows XP, Vi
sta or Windows 7),它将被作为fuzzing目标;另外一运行SPIKE的Linux系统来作为fuzzing的测试客户端。本文建议使用BackTrack 4 Final或Kali Linux系统,因为它们具备本次Fuzzing测试的所有必须环境。两个系统都可部署在虚拟机上。
接下来,我将通过IP地址来fuzzing目标系统。目标系统IP地址为192.168.56.101。
需要如下软件:
Fuzzing目标(windows):
● 脆弱性服务器,可以通过如下链接获取le/site/lupingreycorner/vulnserver.zip
● OllyDbg 1.10,可以通过如下链接获取www.ollydbg.de/
Fuzzing系统(Linux)
● SPIKE
● Wireshark
● Perl
● Netcat
如果用BackTrack作为Fuzzing主机,那么上面的软件都是预装的,无需再次安装。若是使用其他系统,SPIKE可以从www.immunitysec/resources-freesoftware.shtml下载安装。
在编译SPIKE之前,建议对spike.c文件稍做改动。在tar包的SPIKE/SPIKE/src目录的spike.c文件里,有包含两个“return 0;”字符串的代码段,在其前面的“printf(“tried to send to a closed socket!n”);”代码段中,用“exit(1); ”替换“return 0; ”。修改后SIKE将在返回空值时退出,这种功能对后面要运行的封装脚本是非常有用处的。修改完成后,正常在SPKIE的src目录下编译链接程序“./configure; make”。里面包含具体那些协议?
在fuzzing目标服务器上,我们需要Administrator权限来运行Ollydbg调试器。在Vista或者Windows7系统上,右键以管理员身份运行Ollydbg调试器。
运行Vulnserver服务器很简单,将文件和essfunc.dll放在与Ollydbg同一目录下,
用OllyDbg的open命令打开程序。程序默认监听TCP 9999端口,若想使用其他端口,需要将端口号作为的参数一起运行。
什么是Fuzzing?
Fuzzing是为了使程序产生失败或错误故意向程序发送错误格式数据的方法。fuzzing通常被攻击者用于挖掘软件漏洞。
当然,还是有一些其他流行的免费模糊测试器,但本文我们将关注在软件SPIKE上。
The SPIKE Fuzzer
从技术层面上讲,SPIKE是一个模糊测试创建工具集,它允许用户用C语言基于网络协议生成他们自己的测试数据。SPIKE定义了一些原始函数,这允许C程序员可以构建fuzzing数据向目标服务器发送,以期引起产生错误。既然SPIKE是专门被设计用来寻可利用bug的,so,对我们来说这是极好的。
正如我所介绍,SPIKE是一个基于C语言的模糊创建工具集,但是要想使用SPIKE你却不必
非得知道如何编写C代码,会修改就行。SPIKE还包含一些简单的脚本功能,其中有几个命令行工具,在下文中介绍。
SPIKE帮助文档不给力是出了名的,通过查看SPIKE的一些C源码,我们可以建立一系列元函数的列表。为了节省时间,本文将列出部分元函数。
目前也有不少关于SPIKE的论文与报告,但是最有意思的还是SPIKE作者Dave Aitel的日记(链接为www.immunitysec/downloads/usingspike3.ppt )简简单单的几页PPT,就勾勒出SPIKE灰常NB的漏洞挖掘实力。对此,我们很有必要探讨一番,看看那些对我们是有用的。
SPIKE的功能是什么?
SPIKE拥有大量的内置字符串用来模糊测试,这在测试程序的时候是非常有效地。SPIKE以一种十分有效地方式,来确定能使程序产生失败的值。这意味着我们不用自已攒出这些数据,经验丰富的作者将向我们提供这些数据。
SPIKE有块(blocks)的概念,这可以在SPIKES内部推测出指定部分的大小。产生的数据就
可以被SPIKE以不同的格式嵌入到自身测试数据中去。当需要在特定位置嵌入精确数据的时候,blocks是非常给力的,它大大节省了我们自行计算的时间。
SPIKE支持多种网络协议数据类型,并可在不同格式下,很容易的在不同程序中分割粘贴数据。
SPIKE脚本
如前所述,SPIKE包括一个基本的脚本功能,允许您使用SPIKE脚本测试应用程序,无需自己用C语言写SPIKE FUZZER代码。SPIKE的子函数很给力,所以我们可以针对不同的应用发送测试数据。
在基于TCP的应用服务程序下,我们可以通过用脚本解释器 generic_send_tcp来执行.spk脚本文件的方式,发送特定的数据到特定的IP地址、TCP端口。当然,还有一个generic_send_udp脚本解释器,它的作用类似,就是通过UDP的方式发送数据。
解释器generic_send_tcp将被用来fuzz我们的应用程序,BackTrack系统下,可以在/pentest/fuzzers/spike/目录下到,如果是你自己下载并编译的SPIKE程序,generic_sen
d_tcp在src目录下面。不带参数的运行结果如下:
root@bt4r1vm:/pentest/fuzzers/spike/# ./generic_send_tcp
argc=1
Usage: ./generic_send_tcp host port spike_script SKIPVAR SKIPSTR
./generic_send_tcp 192.168.1.100 701 something.spk 0 0
Usage: ./generic_send_tcp host port spike_script SKIPVAR SKIPSTR
./generic_send_tcp 192.168.1.100 701 something.spk 0 0
前三个参数很明确,分别定义了fuzzing主机的主机名、端口号以及SPIKE脚本的名字,参数4、5则在下面进行了详细的说明。
在SPIKE脚本中,“s_string_variables”是用来向fuzzed数据插入字符串的命令。若是用了一个以上的 “s_string_variables”参数,你可以跳过使用早起的“s_string_variables”为SKIPVAR设置为适当的值。例如,你的脚本中包含三个“s_string_variables”参数,并且你想忽略前两个参数,直接fuzz第三个参数,我们就可以设置 SKIPVAR 为2(变量的编号跟数组一样,从0开始)。
每一个“s_string_variables”也有一些列内置的模糊测试字符串值。如果你想跳过前10个字符,
想从第11个字符开始fuzzing,你就可以设置SKIPSTR参数为10(同样从0开始计起)。
当你使用generic_send_tcp时,它输出变量、字符串到测试中的命令行。因此如果你要恢复被打断的SPIKE会话,你可以用得着SKIPVAR、SKIPSTR这两个命令行参数参数。
为了最初仅用“0 0”这些参数开始fuzzing会话,,所以可以用test.spk脚本对主机192.168.1.101的9999端口发起fuzzing会话。用下面这些命令行(假设generic_send_tcp是在/pentest/fuzzers/spike/ 目录下):
root@bt4r1vm:~# /pentest/fuzzers/spike/generic_send_tcp 192.168.56.101 9999 test.spk 0
SPIKE脚本命令
为了写一个SPIKE脚本,我们首先需要知道一些可用的命令以及它们做了些什么。
如果你想了解SPIKE的命令组成,我们通过检查如.spk或spike.h等文件来探索发现。Spike.h文件会列举出可用的原函数(命令),.spk文件提供关于这些命令使用的例子。
我们要记住的是spike脚本功能只支持spike.h的子集。因此,你只能使用SPIKE的内置命令。
为了避免探索这些文件的麻烦,我在下边将列出一些更为有用的SPIKE的原始脚本。spike.h文件由C语言写成,它用C语言的语法与数据结构列出了每个SPIKE命令。对于那些不熟悉C的人来说,我通过用展示例子的方式来使你更加容易的复用代码,写出你自己的脚本。“//”在C中是用来加备注的(编译器在编译程序时将忽略//之后内容),所以接下来我会用这种方式为每个命令提供额外的解释 。当然,你可以忽略的这些解释或者添加自己的解释,这些内容都会被SPKE忽略掉。
接下来我会断断续续的介绍字符串、二进制数据、块以及其他有用的结构。
Strings字符串
strings命令提供给我们向SPIKES添加ASCII字符的方式。同样是字符串命令的 s_string_variable函数,事实上是一个向SPIKE添加fuzz 字符串的非常重要的命令。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论