Fuzz
fuzz工具非常多 如libfuzz
honggfuzz
KernelFuzzer
也有专注进行web fuzz的wfuzz
但是fuzz功能可以分成两种 只是生成测试用例和检测程序使用测试用例后异常 这次使用radamsa和afl作为这两类工具
radamsa
安装
官方给出的命令
|
|
如何使用
|
|
echo "aaa"
可换成任意输出内容的命令 如cat test.txt
常用选项
|
|
fuzz 命令行程序
从命令行读取数据
典型就是md5sum
测试fuzz命令例子
echo "test" | radamsa | md5sum -
当然不可能fuzz一次就执行一行命令 编写一个简单的脚本 shell or python? python!
|
|
只是简单的单线程执行 但是存在两个问题 如何记录崩溃和崩溃输入 这个时候-seek
就能使用了 同时通过判断system
函数的返回值 修改为
|
|
我们的第一个fuzz程序(虽然这个脚本很简陋)
文件fuzz
和命令行主要区别只是读取方式和 文件格式一般会有一定要求 否则不能进入程序执行流程.所以一般fuzz严格的文件格式要使用专门的生成框架.
生成fuzz文件方法很简单
echo "test" | radamsa --output 'testfile'
读取文件生成
radamsa --output 'testfile' -g file testfile
网络fuzz
虽然radmasa
提供了这个选项 由于协议格式基本都是一个错误字节就报错 所以推荐使用Mutiny
来进行网络fuzz
echo "test" | radamsa --output ':80'
afl
介绍
这款工具除了可以自动从输入fuzz 还能自动检测崩溃 超时. 最大亮点是使用了 编译器插桩 在运行时通过编译时插入的代码可以了解到代码运行路径 覆盖率等信息
安装
|
|
使用
常用参数
|
|
例子
|
|
实际操作
从github选一个作为实际对象 我使用高级搜索 指定>500star c语言的项目后随意找了一个
|
|
实际选择指南
- star星数是很好的指标 代表发现的漏洞的影响力
- 选择 c/c++
- 优先选择可以直接编译成程序的 fuzz库还需要去学习怎么写成库入口程序进行fuzz
- 优先选择有完善的测试用例的 如jpg xml 或者自带
- 代码越多漏洞越多
- 如果是本地命令行程序或难以利用的程序 做好发现漏洞被忽略的准备
需要使用afl-gcc执行了编译 常用将gcc替换成afl-gcc的方法 (如果不经常进行编译)
|
|
然后
|
|
实际使用编译工具不同 可能需要查询文档 当然你只fuzz不做其他编译直接mv afl-gcc gcc
也行
编译
|
|
确认输出中的 checking for gcc... xxxx
是你的afl-fuzz 如果不是请执行上面的替换方法
|
|
这个程序提供了测试用例在test
目录 如果fuzz其他程序没有提供 就需要自己寻找
需要注意几点
- 尽量覆盖全部可能的格式
- 畸形并符合文件格式
- 不要存在大量无用数据 像一个3000像素大小的红色正方形图片比一个30像素的 在fuzz时并没有功能提升 只会让fuzz程序大量修改到没有用的图片数据区
这个samtools
有多个功能 我们测试split这个功能 (q:为什么 a:因为我只在这个找到了崩溃 你想试试其他功能和用例也可以)
|
|
稍等一会 就可以看到产生了崩溃
停止后 文件保存位置 你选择的输出目录这次是out/crashes/
测试崩溃
./samtools split out/crashes/id:000000,sig:11,src:000015,op:flip2,pos:2
应用崩溃了
fish: “./samtools split out/crashes/id…” terminated by signal SIGSEGV (Address boundary error)
之后?
可以选择构造exp当自己的0day 或者提交给开发者 我是倾向于提交给开发者的 而且构造exp已经有很多书籍
提交是什么
通知开发者程序存在问题 让开发者进行修复。
怎么提交?
根据程序开发者的不同 具体可能是(非全面)
- 小型商业公司 无漏洞奖金计划 我们可以从网上找到它的联系邮件 邮件通知
- 大型商业公司 有漏洞奖金计划 使用计划中的提交方式
- 开发者 非开源 邮件通知
- 开发者 托管在github等 如果问题不大可以直接使用issue 如果是远程利用之类请通知开发者
一般都需要提供以下信息
- os信息
- 程序版本信息
- 崩溃样本
- 其他信息
为什么要提交?
修复漏洞 防止用户收到攻击 为网络安全做贡献 当然也有其他现实因素 比如危害太小不提交也没用 简历加分等等