欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

从零开始学Fuzzing系列:浏览器fuzz工具探究之框架篇

来源:本站整理 作者:佚名 时间:2016-01-16 TAG: 我要投稿


0×00写在前面
工欲善其事,必先利其器。笔者收集了近几年Github、Googlecode、SourceForge等站点发布的30余款浏览器漏洞挖掘工具,除相似重复外,几乎涵盖了所有已公开的开源项目,尽可能搭建环境试用、阅读源码、查阅资料,搞清了其中采用的技术原理,初步形成了这篇半叙述形式的分析报告。
希望通过本篇小文,能与大家共同领略前辈们在浏览器漏洞fuzz这一方向上留下的足迹与智慧。
备注:绿盟刘永军老师的《浏览器fuzz框架介绍》已对部分工具进行过介绍,行文简洁,值得拜读。鉴于原文涉及工具的详细实现较少,故撰写此文以作补充归纳,希望能向大家展现当前浏览器fuzz工具开发的基本思路,以供学习探讨。
0×01分类汇总
涉及的所有fuzz工具列表如下,若有感兴趣的童鞋,请Google之:

这些工具中,有的侧重于浏览器fuzz框架的设计,有的侧重于网页样本的生成策略。比如:
框架类:bamboo.js BFuzzer grinder cross_fuzz x-fuzzer
策略类:nduja fileja
综合类:clusterfuzz funfuzz chromefuzzer ajaxdemolisher lithium
其中Google团队的clusterfuzz堪称一套完善的分布式fuzz系统,未公开源码,只能从网上公开的使用说明窥探一二,12年已部署了几百台虚拟机同时fuzz,允许内部使用者提交fuzzer插件;Firefox团队的funfuzz(包含jsfunfuzz和DOMFuzz)也颇具影响。不得不提的是,国内绿盟团队demi6od大神开发的chromefuzzer,也颇具优秀的漏洞发现能力(demi6od本人多次获得了微软和谷歌的致谢)。
这些工具在核心框架的基础上,都增加了分布式调度、自定义fuzz策略、样本精简等特性,工程量巨大,待笔者研究透彻后分享出来。今天主要向大家介绍偏重于fuzz框架设计的五个基本工具的实现。
从本质上讲,浏览器fuzz框架需要解决以下几个关键问题:
1.随机样本的生成
2.浏览器进程监控
3.Crash样本保存
由于开发者思考角度不同,每个框架在这些问题的处理上,也许类似,也许不同。下面详述之。
0×02 Bamboo.js
这是一款在Fuzz效率和稳定性都有所兼顾的DOM Fuzzer,采用ruby语言结合Javascript共同完成,具有以下特点:
a.The fuzzing scope contains DOM level 1,2 and 3
b.The main module triggers semi-random object modifications and creates insecure references
c.Other modules can be added easily
d.Reliable logging by using WebSockets
e.Supported targets
项目源代码的目录结构如下:
bamboo.htm
bamboo.js
config.js
modules
 -tickle_references.js
server.rb
helper.js
经过梳理得知,该框架的核心流程如下图所示:

Bamboo首先生成随机进行DOM操作的Javascript语句,将其保存为字符串发送至服务端,由服务端根据该字符串组合为一个完整的网页样本(保存为log文件)。
然后依靠WebSocket通信将该网页样本从服务端返回至浏览器进程,由bamboo.js将该网页赋值给一个事先构造的iframe标签,从而达到加载执行网页样本的目的。
若测试过程中,网页样本导致浏览器进程崩溃,则可以断定服务端当前最近保存的log文件即为导致Crash的漏洞样本;若不崩溃,浏览器进程会根据SetTimeout设定的时间间隔,重新进行上述样本生成和iframe加载执行的fuzz过程。
样本字符串的生成具体由modules/*.js完成,官方源码自带的tickle_references.js插件部分摘录如下:
function fuzzOwnReferences(count)
{
  ......
  //R(2)和R(97)等函数为随机数函数,可以生成0~N-1之间的任意整数。
 if(r(2)>0)
    payload += 'getRandomObject(' + r(97) + ').appendChild(e_1);\n';
  else
    payload += 'document.body.appendChild(e_1);\n';
由上得知,本框架支持自定义样本生成策略,使用者可以编写自定义fuzz策略的插件放置在Modules目录。
浏览器和服务端采用WebSocket进行通信。Bamboo.js向服务端Server.rb发送生成的字符串,并接收服务端返回的网页样本:
function wsSwap(data)
{
  ws = new WebSocket("ws://" + host + ":5678");
  ws.onclose = function(evt){}
  ws.onerror = function(evt){}
  ws.onopen = function(evt){
    ws.send(data);
  }
  ws.onmessage = function(evt){
    createBuffer(evt.data)
  }
}
Server.rb主要作用是,将接收的字符串组合为完整的网页样本并保存为bamboo.log,然后反馈至浏览器进程:
def generate_template
  in_file = File.read("template.dat")
  return "" + in_file
end
EM.run do
  WebSocket::EventMachine::Server.start(:host => "0.0.0.0", :port => 10933) do |ws|
    ws.onmessage do |data, type|
      chunk = [generate_template + "\n", "\n"]
      File.open("bamboo.log", "w") { |f| f.write(chunk[0] + data + chunk[1]) }
      ws.send Base64.encode64(chunk[0] + data + chunk[1]), :type => type

[1] [2] [3] [4] [5] [6]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载