fuzz工具SPIKE学习

1.什么是FUZZ?
fuzz测试是将故意格式错误的数据发送到程序以便在应用程序中生成故障或错误的过程。软件开发人员用这个测试自己的代码漏洞,与二进制和源代码分析一起,模糊测试是发现可利用软件漏洞的主要方式之一。有许多流行的和免费的软件fuzzer可用,本文介绍的是SPIKE。

2.什么是SPIKE
从技术上讲,SPIKE实际上是一个模糊器创建工具包,它提供了API,允许用户使用C语言基于网络的协议来创建自己的fuzzer。 SPIKE定义了一些它可供C编码器使用的原语,它允许它构造称为“SPIKES”的模糊消息,这些消息可以发送到网络服务,以期产生错误。
SPIKE是一个基于C的fuzzer创建工具包,但用户不必知道如何编写C程序来使用SPIKE。有一些命令行工具可以作为包含SPIKE原语的简单文本文件的解释器。SPIKE还包括一个简单的脚本编写功能,并且在SPIKE发行版中,有一些命令行工具可以作为包含SPIKE原语的解释器。

SPIKE包括一个基本脚本功能,允许我们使用SPIKE原语来模糊应用程序,而无需在C中编写自己的SPIKE fuzzer代码。SPIKE发行版提供了各种不同的解释器,允许我们指定这些SPIKE原语的某些相关子集,以便针对各种类型的网络应用程序使用。
对于基于TCP的服务器应用程序,我们可以通过将SPIKE命令写入.spk脚本文件并使用TCP SPIKE脚本解释器generic_send_tcp运行它们来利用此脚本功能,该脚本将在特定IP地址和 TCP端口发送指定的SPIKE。还有一个generic_send_udp,它会做类似的事情,但是在这个解释器中,SPIKES将通过UDP发送。
  我们将用generic_send_tcp解释器fuzz我们的应用程序。如下不带任何命令行参数的情况下运行它
在这里插入图片描述
在SPIKE脚本中,可以指定“s_string_variables”,这些命令用于将实际模糊字符串插入到发送的每个SPIKE中。 如果在脚本中使用多个“s_string_variables”,则可以通过为SKIPVAR设置适当的值来跳过使用“s_string_variables”的早期实例。 例如,如果在SPIKE脚本中包含三个“s_string_variables”,并且想要忽略前两个变量并且仅模糊第三个变量,则应将SKIPVAR设置为2(变量的编号从0开始向上计数,因此 第三个变量用数字2表示。
  每个“s_string_variables”还有一个由SPIKE构建的不同fuzz字符串值的数组,它将在SPIKE模糊测试会话中迭代。 如果要跳过这些字符串中的前10个字符串,并在字符串11处开始模糊测试,则可以将SKIPSTR设置为10(从0开始计数)。
  使用generic_send_tcp时,它会向命令行输出有关当前正在测试的变量和字符串的信息,因此,如果SPIKE会话中断并且需要稍后继续它,则可以使用这两个命令行参数来执行此操作。
  要从头开始模糊测试会话,只需设置这些参数为“0 0”,从头开始使用脚本文件“trun.spk”在端口9999上针对win启动模糊测试会话,可以使用如下命令
在这里插入图片描述
trun.spk是我们自己编写的脚本,要编写SPIKE脚本,首先需要知道一些可用的命令是什么以及它们的作用
我们可以查看自带的审计各种协议的脚本进行了解
找到脚本的路径
在这里插入图片描述
查看脚本
在这里插入图片描述
下面分类来介绍:
1.Strings
  Strings命令提供了一种将ASCII字符数据添加到SPIKES中的方法。 字符串命令中还包括s_string_variable命令,它是SPIKE中最重要的命令之一,因为它实际上可以向SPIKE添加fuzz字符串。
s_string(“string”); // 打印字符串,内容为 “string”
s_string_repeat(“string”,200); // 重复字符串“string” 200 次
s_string_variable(“string”); //将模糊字符串插入“SPIKE”,字符串“string”将用于此变量的第一次迭代,以及用于迭代其他s_string_variables的任何SPIKES
2.Binary Data
  提供了一种向SPIKES添加二进制数据的方法。 它们支持多种指定二进制数据的方法。

s_binary(“\x41”); //插入十六进制0x41 = ASCII“A”的二进制表示
s_binary_repeat(“\x41”, 200); //插入0x41的二进制表示200次

3.Defining Blocks
  在SPIKE脚本中指定命名块的起点和终点。 这允许您使用块大小命令在SPIKES中定义这些数据部分的大小。
s_block_start(“block1”); // 指定 “block1”的起点
s_block_end(“block1”); // 指定“block1”的终点

4.Block Sizes
  在脚本生成的SPIKES内的命名块内插入使用各种不同尺寸格式的数据。
s_blocksize_string(“block1”, 2); //向SPIKE添加一个长度为2个字符的字符串,表示块“block1”的大小
s_binary_block_size_byte(“block1”); //向SPIKE添加1个字节的值,表示块“block1”的大小
  要查看其他一些选项,只需在SPIKE src目录中的spike.h文件中grep命令搜索“block_size”或“blocksize”

5.其他命令
s_read_packet(); //读取并打印到从服务器接收的数据
s_readline(); //从服务器读取一行输入

我们需要了解我们用于与目标应用程序通信的网络协议的结构,以便将我们的模糊测试数据导入适用的应用领域。
  可以通过多种方式获得对网络协议的理解 - 通过查看RFC文档,使用客户端应用程序生成流量,使用Wireshark或tcpdump等工具捕获结果,对于非常简单的协议,可以直接与应用程序交互,看看它是如何工作的。
  在此次实验中Vulnserver,首先演示直接交互,然后演示wireshark交互分析。由于我们是fuzz的Vulnserver,假设我们发送给程序的数据导致了程序的异常,我们希望看到它发生了什么,可以在调试器中运行该程序这样我们可以及时查看到崩溃现场。 在Windows系统上启动OllyDbg,载入vulnserver.exe,然后按F9键,点击OllyDbg工具栏上的Play按钮或从OllyDbg Debug菜单中选择Run以允许程序在调试器中运行。此时,程序正常运行,但是如果我们在Vulnserver进程中触发崩溃,调试器将获得控制权并获取当前寄存器和堆栈的状态以便我们分析。接下来进行我们的实验。

双击运行vulnserver,默认是9999端口。
在这里插入图片描述
在kali上使用nc连接
在这里插入图片描述
连接之后我们还输入了help查看功能参数等
按照给出的帮助,我们选择TRUN命令测试
在这里插入图片描述
TRUN COMPLETE是服务器的回显
我们试图通过这种方式询问程序接受了哪些类型的消息来完成工作,为 fuzz测试请求做准备。
根据HELP回显,该程序支持许多“命令”,并且这些命令中的有些命令需要输入参数来进行操作。
考虑到这一点,我们可以将fuzz数据插入应用程序的支持命令里:
1.代替支持的命令
2.作为某些带参数的命令的参数(STATS,RTIME,LTIME等)。
3.作为某些不带参数的命令的参数(HELP,EXIT)。
  现在我们已经了解了如何与Vulnserver进行通信,以及在Vulnserver“协议”中我们可以插入我们的fuzz数据的位置。

下面的实验非常简单,但是它可以很好地演示一般的fuzz过程 - 我们确定程序如何从用户接收输入数据,并使用该方法将fuzz数据插入到应用程序中
在vulnserver也显示出连接的客户端信息
在这里插入图片描述
我们以TRUN命令还例子进行fuzz
在kali中nano编辑一个spike脚本
在这里插入图片描述
“readline”函数从服务器读取欢迎消息。
“s.string”函数发送“TRUN”的固定文本。
“s_string_variable”函数发送不同的文本,旨在导致崩溃。
进行fuzz
在这里插入图片描述
很快,vulnserver就崩溃了
在这里插入图片描述

接下来使用od附件观察崩溃时的堆栈情况
OD载入
在这里插入图片描述
点击运行按钮,保持在运行状态
在kali中重新输入刚才的命令进行fuzz
在这里插入图片描述
此时在win上的od已经可以看到EIP、EBP等内容均已被填充
在这里插入图片描述
一般来说,此时就可以表明该软件存在栈溢出漏洞。为了实验的完整性,以及针对SPIKE这一专门针对网络协议的Fuzzer的特性,我们可以使用wireshark进行配合fuzz。

5.3 实验任务三
Win上重新载入
在这里插入图片描述
kali上开启wireshark进行抓包,同时在终端输入同样的命令进行fuzz
在这里插入图片描述
开始fuzz不久,win上的vulnserver已经崩溃
在这里插入图片描述
现在关注切换到kali关注wireshark
在这里插入图片描述
因为知道通信是在9999端口进行的,所以可以通过下图的过滤条件进行过滤
在这里插入图片描述
找到第一个SYN数据包并右键单击它。 单击“Follow TCP Stream”,如下所示。
在这里插入图片描述
将出现第7层(应用层)对话,如下所示。
蓝色文本来自Windows服务器,红色文本是从Kali客户端发送的(即SPIKE脚本发出)。
第一条消息是“TRUN COMMAND”,它没有导致崩溃,因此服务器回答“TRUN COMPLETE”,如下所示。
在这里插入图片描述
使用下图命令表示过滤出stream index=2的封包
右键单击第一个SYN数据包,然后单击“Follow TCP Stream”,如下所示。
在这里插入图片描述
这是Spike发送的第二条消息,带有很多“A”字符,如下所示。
滚动到底部查看服务器的回复。 服务器崩溃了 - 它没有回复蓝色的“TRUN COMPLETE”消息,如下所示。

在这里插入图片描述

参考资源
1.SPIKE作者的演示文稿http://www.immunitysec.com/downloads/usingspike3.ppt
2.riusksk泉哥关于SPIKE应用于其他协议fuzz的研究riusksk.me/2011/12/30/spike-fuzz/
3.关于SPIKE Fuzz的经典文章https://resources.infosecinstitute.com/intro-to-fuzzing/
4.关于使用SPIKE进行加密协议分析的论文
https://www.researchgate.net/publication/254012568_Extension_of_SPIKE_for_Encrypted_Protocol_Fuzzing

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值