使用SPIKE fuzzer挖掘漏洞
字数 2014 2025-08-20 18:17:53
SPIKE Fuzzer 漏洞挖掘技术详解
一、SPIKE Fuzzer 简介
SPIKE 是一个模糊测试创建工具包,它提供了 API 允许用户使用 C 语言基于网络协议创建自己的模糊测试器。SPIKE 定义了一些可供 C 编码器使用的原语,允许构造称为"SPIKES"的模糊消息,这些消息可以发送到网络服务以产生错误。
SPIKE 的主要特点
- 内置丰富的模糊测试字符串:SPIKE 内置了大量用于模糊测试的字符串,能有效在程序中产生各种错误
- 块(Block)概念:可用于计算 SPIKE 代码生成的指定部分的大小,并以不同格式插入到 SPIKES 中
- 支持多种网络协议数据类型:可以各种格式接受数据,便于从不同程序中剪切和粘贴
- 基本脚本功能:允许使用 SPIKE 原语模糊应用程序而无需编写 C 代码
二、环境准备
系统要求
-
目标系统:
- 运行有漏洞应用程序 Vulnserver 的 Windows 系统(XP/Vista/7)
- 需要管理员权限运行 Ollydbg 调试器
- Vulnserver 默认监听 TCP 端口 9999
-
模糊测试系统:
- Linux 系统(推荐 BackTrack 4 Final 或更高版本)
- 已安装 SPIKE 工具
SPIKE 编译前修改建议
编辑 SPIKE/src/spike.c 文件:
- 找到
printf("tired to send a closed socket!\n")行 - 将紧随其后的两个
return 0;替换为exit(1); - 这样修改后,SPIKE 在尝试发送数据到已关闭套接字时会以非零返回值退出
编译命令:./configure; make
三、SPIKE 脚本基础
generic_send_tcp 解释器
用于基于 TCP 的服务器应用程序模糊测试,命令格式:
./generic_send_tcp host port spike_script SKIPVAR SKIPSTR
参数说明:
host:目标主机 IPport:目标端口spike_script:SPIKE 脚本文件名SKIPVAR:跳过前几个变量(从0开始计数)SKIPSTR:跳过前几个字符串(从0开始计数)
SPIKE 脚本常用命令
1. 字符串命令
s_string("string"); // 将字符串"string"作为SPIKE的一部分
s_string_repeat("string",200); // 重复字符串"string"200次
s_string_variable("string"); // 插入模糊字符串,"string"用于第一次迭代
2. 二进制数据命令
s_binary("\x41"); // 插入十六进制0x41的二进制表示(ASCII "A")
s_binary_repeat("\x41", 200); // 插入0x41的二进制表示200次
二进制数据可以多种格式指定:
"\x41""41""0x41"- 混合格式如
"410x41\x42"输出 ASCII "AAB"
3. 块定义命令
s_block_start("block1"); // 定义块"block1"的开始
s_block_end("block1"); // 定义块"block1"的结束
4. 块大小命令
s_blocksize_string("block1", 2); // 添加2字符长的字符串表示块"block1"的大小
s_binary_block_size_byte("block1"); // 添加1字节值表示块"block1"的大小
5. 其他有用命令
s_read_packet(); // 从服务器读取并打印接收到的数据
s_readline(); // 从服务器读取单行输入
printf(); // 向终端输出数据,提供更多控制台信息
四、SPIKE 脚本示例
示例1:简单命令模糊测试
s_readline(); // 打印从服务器接收的行
s_string_variable("COMMAND"); // 发送模糊字符串
示例2:HTTP POST 请求模糊测试
s_string("POST /testme.php HTTP/1.1\r\n");
s_string("Host: testserver.example.com\r\n");
s_string("Content-Length: ");
s_blocksize_string("block1", 5);
s_string("\r\nConnection: close\r\n\r\n");
s_block_start("block1");
s_string("inputvar=");
s_string_variable("inputval");
s_block_end("block1");
此脚本生成的消息格式:
POST /testme.php HTTP/1.1
Host: testserver.example.com
Content-Length: [size_of_data]
Connection: close
inputvar=[fuzz_string]
五、Vulnserver 模糊测试实战
1. 协议分析
首先通过交互了解 Vulnserver 协议:
- 连接服务器后发送 HELP 获取命令列表
- 测试各命令响应:
STATS test→STATS VALUE NORMALstats test→UNKNOWN COMMAND(区分大小写)TRUN hhh→TRUN COMPLETE- 不支持的命令 →
UNKNOWN COMMAND
2. 模糊测试策略
-
模糊测试位置:
- 代替支持的命令
- 作为带参数命令的参数(STATS, RTIME等)
- 作为不带参数命令的参数(HELP, EXIT)
-
调试设置:
- 在 OllyDbg 中运行 vulnserver.exe
- 按 F9 或点击 Play 按钮让程序运行
- 发生崩溃时调试器将捕获现场状态
3. 执行模糊测试
-
启动 Wireshark 捕获目标流量:
- 过滤器:
host 192.168.56.101 and tcp port 9999
- 过滤器:
-
运行 SPIKE 模糊测试:
/pentest/fuzzers/spike/generic_send_tcp 192.168.56.101 9999 vscommand.spk 0 0 -
分析结果:
- 通过 Wireshark 查看 SPIKE 发送的实际数据
- 第一个请求发送"COMMAND"字符串
- 后续请求发送各种模糊字符串
- 观察服务器响应判断是否崩溃
4. 高级模糊测试
针对特定命令进行模糊测试的脚本示例(TRUN命令):
s_readline(); // 读取欢迎消息
s_string("TRUN "); // 发送TRUN命令
s_string_variable("AAAA"); // 模糊测试参数部分
六、故障排查与技巧
-
SPIKE 会话中断恢复:
- 使用 SKIPVAR 和 SKIPSTR 参数从断点继续
- generic_send_tcp 会输出当前测试的变量和字符串信息
-
提高效率:
- 针对不同命令创建多个 SPIKE 脚本
- 优先测试可能处理复杂输入的命令(如TRUN、GMON等)
-
崩溃分析:
- 在 OllyDbg 中观察崩溃时的寄存器状态
- 记录导致崩溃的模糊字符串特征
- 通过 Wireshark 捕获重现崩溃的数据包
七、总结
SPIKE 是一个强大的模糊测试框架,通过本文介绍的方法可以:
- 快速搭建模糊测试环境
- 编写有效的 SPIKE 脚本
- 针对 Vulnserver 等目标进行系统化模糊测试
- 识别和分析潜在的软件漏洞
关键点在于理解目标协议结构、合理设计模糊测试策略,并通过调试器和网络分析工具有效捕获和分析测试结果。