四年前开源的Grinder项目,和借助于它运转的nduja,着实让浏览器缝隙发掘飞入了寻常百姓家。但随着时刻的检测,Grinder也遇到了让人爱恨交加的为难:分明发生了Crash,可便是无法重现。有多少人和我相同,从初识Grinder的激动,到别离时的落寞,也见证了一代怀揣愿望的挖洞人的脚印。
在现有项目的基础上,对其进行改善,乃是一种前进,所以呈现了Morph项目。
Morph起先的定位便是处理Grinder架构中存在的实质问题:样本无法安稳重现,所以才有了前面《浏览器发掘结构Morph诞生记》中叙述的“静态随机数组”的测验,但随之带来的并发症却是:样本难以精简。
本文正是为处理这个问题而发生的,笔者选用一种Grinder log静态化的办法,将本来Grinder中选用DLL注入截获log句子的办法改善为提早生成静态精简样本的办法,从根本上处理样本无法安稳重现和难以精简两大难题,为浏览器缝隙发掘作业供给新的思路。
0×01 咱们需求什么格局的样本?
前面《浏览器发掘结构Morph诞生记》中介绍过一种“静态随机数组”办法,用来处理Grinder log记载简单呈现样本无法安稳重现的问题。笔者在开宣布Morph v0.2.5之后进行了大规模布置测验,也得到了一些能够安稳重现的Crash成果,但拿到样本想进一步剖析时,却遇到了难题。得到的Crash样本是如下方式的HTML文档:
html>
head>
script type='text/javascript'>
var mor_array = [675, 142, 861, 226, 112, 157, 667, ...... 147, 368, 10, 1];//元素个数有或许上万个
var mor_index = 0 ;
// Pick a random number between 0 and X
function rand( x ){
index = (mor_index++) % (mor_array.length);
return mor_array[index] % x;
}
function R(mod) {
return rand(10000) % mod;
}
......
function tweakattributes(elem,i){
for( var p in elem){//这儿的循环要顺次调用上面的mor_array数组中的元素
try {
r=rand_item(interesting_vals);
elem.setAttribute(p,r);
}
catch (exception) {}
}
}
......
function buildElementsTree(){
elementTree=[];
for (k=0;k200;k++){//这儿的循环要顺次调用上面的mor_array数组中的元素
r=rand_item( elements );
elementTree[k]=document.createElement(r);
elementTree[k].id="el"+k;
rb=R(document.all.length);
document.all[rb].appendChild(elementTree[k]);
tweakattributes(elementTree[k],k);
}
}
}
function morph_fuzz()
{
buildElementsTree();
......
}
script>
head>
body onload="morph_fuzz()">body>
html>
要想在上述样本中定位到是哪个js句子终究导致crash,有必要顺次读取静态数组,一步步调试履行buildElementsTree和tweakattributes函数中的for循环,拆解得到相关js句子。并且该句子有或许与之前循环的某个句子还有联络,有必要将两者或更多的句子都定位出来才干得到完好的POC样本。
清楚明了,如此剖析起来,是极端繁琐的。用一句话描述这些样本:食之无味,弃之可惜。
那咱们究竟需求什么格局的样本呢?搞过浏览器缝隙剖析的人员都知道,往常剖析的POC都是这样的:
html>
head>
script>
function exploit()
{
var e0 = null;
var e1 = null;
var e2 = null;
try {
e0 = document.getElementById("a");
e1 = document.createElement("div");
e2 = document.createElement("q");
e1.applyElement(e2);
e1.appendChild(document.createElement('button'));
e1.applyElement(e0);
e2.innerHTML = "";
e2.appendChild(document.createElement('body'));
}catch(e){ }
CollectGarbage();
}
script>
head>
body onload="exploit()">
form id="a">form>
body>
html>
略微盯梢调试即可确认crash发生的原因。别的,用Grinder成功重现出Crash样本的童鞋也知道,得到的POC样本一般都是这种格局:
html>
body>body>
script>var createdObjects={}
var c = document.createElement("CANVAS")
c.width = 1000
c.height = 1000
document.body.appendChild(c)
var img = new Image()
img.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAANlBMVEX///+6v8a2u8PKztPAxcu7wMf4+fm0ucH =="
try{ ctx = c.getContext("2d")} catch(e){}
try{ HTML0= document.createElement("MENU")} catch(e){}
try{ createdObjects["HTML0"]=HTML0} catch(e){}
try{ document.body.appendChild(HTML0)} catch(e){}
try{ P0= new Path2D()} catch(e){}
try{ createdObjects["P0"]=P0} catch(e){}
try{ ctx.height="36191.05884594913180334528604"} catch(e){}
try{ delete createdObjects['HTML0']} catch(e){}
try{ ctx.translate(-0.9872812044341117,0)} catch(e){}
try{ ctx.getLineDash()} catch(e){}
try{ CollectGarbage()} catch(e){}
[1] [2] [3] [4] 黑客接单网
在HTML5中 标签参加了一个新的特点ping。规划者参加它的理由是, Ping能够使浏览器对外发送一个异步恳求,一般用来广告的追寻、点击率计算或完结一次HTTP重定向。 可是听到监督、追寻这个词,...
前情概要:梦里那点事系列文章(上) 0×05 弱口令是个好东西 忽然有这么多方针,一时间不知从哪下手,这个时分直觉告诉我,机关单位站点也许是突破口。 经历告诉我,此类网站的管理员往往缺少安全防护认识。...
现在,最新的DVWA现已更新到1.9版别(http://www.dvwa.co.uk/),而网上的教程大多停留在旧版别,并且没有针对DVWA high等级的教程,因而萌发了一个编撰新手教程的主意,过错...
前语 平常搜集的一些姿态,用户绕过杀软履行mimikatz,这儿以360为例进行bypass 测验。 下载最新版360: 未经处理的mimikatz直接就被杀了 下面开端进行绕过360抓暗码 姿态一-...
榜首眼看这个应战,通常是过滤一些字符或许添加一些约束来阻挠指令履行,我经过输入&id到addr域,成功回来履行成果,能够确认这是一道指令履行的应战题。 下一步咱们来找出过滤和约束。经过测验,咱...
FireEye近期承认TRITON歹意活动正在针对一个新的要害基础设施建议进犯,咱们现在现已对该歹意行为采取了呼应办法。 2019年12月,FireEye揭露发布了咱们针对TRITON进犯的第一次剖析...