【技术分享】手把手教你“复活”乌云网【转】

时间:2016.9.19 来源:安全客

从乌云网升级说起

本人刚踏入安全圈不久,在学习的过程中除了阅读一些经典书籍外,像安全客、乌云网、Freebuf等网站也是我光顾最多的地方。在7月初,我有幸参加了今年的乌云峰会。然而,回来之后,激动的心情还没有平复,乌云网就进入升级状态!对于圈内人士来说,乌云网不仅是一个漏洞平台,也是一个巨大的知识库。现在乌云网因升级而导致不能访问,对于安全从业人员尤其是像我这样的安全小白来说,影响也是巨大的。某一天,我在浏览安全客的一篇知识帖——密码找回逻辑漏洞总结的时候,就遇到了问题:在这篇知识总结帖里引用了许多乌云网的漏洞及知识库文章。老司机们可能都看过所引内容,但是作为小白的我是真的没看过原文。现在一点链接就打开乌云网升级提示,怎么办?

天无绝人之路

7月底的某一天,忘了是在哪个网上看到一条消息,@hanc00l 同学在6月底把乌云网的全部公开漏洞和知识库文章爬了下来,并在虚拟机中搭建了乌云镜像站以提供漏洞及知识库文章搜索,然后公布在了Github上。这真是解决了燃眉之急啊,妈妈再也不用担心我的学习了!于是赶紧在第一时间下载了乌云镜像站虚拟机文件,并进行了试用。终于能够看到密码找回逻辑漏洞总结中所引用的乌云漏洞和知识库文章了,眼泪哗哗的!!

解决旧问题 又有新情况

乌云网公开漏洞、知识库搜索镜像(以下简称乌云网镜像)很好的解决了针对关键字进行搜索的问题。但是,我在使用中发现,又发现一个新的问题始终困扰着我:

在我浏览密码找回逻辑漏洞总结这篇文章的过程中,为了查看被引用的乌云网文章,直接点击链接当然是打不开的。想查看原文内容只有两种办法,一种方法是根据关键词在乌云镜像站中进行搜索,然后再打开链接;另一种方法是根据原链接构造乌云镜像站中的文章链接(乌云镜像站中漏洞编号、知识库文章编号和原乌云网中是一致的)。

也许是我太懒了,我总是觉得这两种方法都太烦琐,本来就是点一下鼠标的事儿,现在搞得这么复杂,既要切换页面,又要复制粘贴,手速再快也少不了10秒钟。我希望原来就是点一下鼠标的事儿,现在还是点一下鼠标!当然在点鼠标的过程中,需要浏览器对链接进行转换,将原来乌云网的链接转换成现在乌云网镜像的链接。这种转换对于用户来说是透明的,即点即开,就好像乌云网“复活”了一样。

自己动手 丰衣足食

上述想法明显是要改变浏览器针对特定链接的点击行为,所以首先就想到了写个浏览器插件。不过问题来了,没写过浏览器插件啊,现在写个插件貌似要经过审核才能用啊,而且我既用Chrome,又用Firefox,难道都要写两个插件!仔细一想,写个浏览器插件工作量太大,不太现实。还有其他方法吗?这时,我想到了以前用过的一个浏览器插件:油猴子Greasemonkey(在Chrome中是Tampermonkey)。在网上进行了一番搜索,没有找到前人所造的轮子,那就只能自己动手造轮子了。

油猴子是一个神奇的浏览器插件,通过执行相应的油猴子脚本,可以在浏览页面的过程中达到对页面进行修改(比如去广告、优化显示等)的目的。油猴子脚本使用Javascript编写,在Chrome和Firefox中都通用。脚本编写也很简单,就拿我这种对Javascript一知半解、平时最多也就写个弹窗的人来说,花了一个小时的时间学习了一下深入浅出 Greasemonkey也就完成了基本功能。

思路很简单:点击链接时,获取链接对应的URL地址,然后判断是否是乌云网漏洞或者知识库文章的页面地址,如果是的话就转换成乌云镜像站的URL地址。经过对比发现,乌云网漏洞或者知识库文章的URL地址和乌云镜像站的URL地址是一一对应的,其转换规则如下表所示。其中192.168.162.138:5000(注:这是最初我的乌云镜像站地址,现在重新下载了新的虚拟机镜像,地址变成了截图中的192.168.162.142:5000)是我自己所搭建的乌云镜像站的首页地址。

基于此规则,我编写了如下的油猴子脚本(第一次啊!)。

// ==UserScript==
// @name 乌云链接转换器
// @namespace http://think3t.iteye.com/
// @version 0.1
// @description 将原乌云漏洞及知识库链接转换为指定的镜像库链接,实现无缝浏览!
// @author hktk_hrl
// @include *
// @exclude http://www.baidu.com/*
// @exclude https://www.baidu.com/*
// @exclude http://www.google.com/*
// @exclude https://www.google.com/*
// @require http://code.jquery.com/jquery-2.1.4.min.js
// @grant none
// ==/UserScript==
var mirrorHostName = ‘http://192.168.162.138:5000’; //镜像库域名或IP
var mirrorUrlPrefix = mirrorHostName + ‘/static’; //镜像库URL前缀,默认为http://ip:5000/static
$(‘body’).on(‘click’, ‘a’, function () {
var target = this;
//规则10:http://www.wooyun.org/bugs/wooyun-2012-011833 –> http://192.168.162.138:5000/static/bugs/wooyun-2012-011833.html
if (this.href.match(/http:\/\/www\.wooyun\.org\/bugs\/.*/)) {
newUrl = this.href.replace(/http:\/\/www\.wooyun\.org/, mirrorUrlPrefix) + ‘.html’;
this.href = newUrl;
console.log(‘Tampermonkey log: oldUrl=’ + this.href);
console.log(‘Tampermonkey log: newUrl=’ + this.href);
}
});
赶紧打开密码找回逻辑漏洞总结这篇文章测试一下。当点击乌云网链接之后跳转到本地乌云镜像站页面的那一刻,我的内心是相当激动的!再一次眼泪哗哗的……

精益求精

上述v0.1的脚本使用了几天之后,发现该脚本还不够完善,仍然存在一些问题:

脚本只对鼠标左键点击的链接起作用,鼠标中键点击或者右键菜单中打开链接都不起作用

脚本好像产生了一些负作用:百度或者谷歌搜索某一关键词之后,再次点击搜索按钮不起作用了。

怀疑是给页面中所有链接绑定新的点击事件后,影响到原来的事件响应了。

既然发现了问题,那就继续优化一下吧。既然绑定新事件可能会影响到原有的事件响应,那就不要绑定事件了,直接在页面加载过程中,将页面中所有的原乌云网链接转换为本地镜像站的链接。这样既不影响原来的点击事件,另外由于链接本身已经转换为乌云镜像站的链接,因此不管是左键、中键还是右键点击,都起作用了。按照这个思路,重新写了v0.2版本的脚本。

// ==UserScript==
// @name 乌云网漏洞及知识库链接转换器
// @namespace http://think3t.iteye.com/
// @version 0.2
// @description 将原乌云网漏洞及知识库链接转换为指定的镜像站链接,实现无缝浏览!
// @author hktk_hrl
// @include *
// @grant none
// ==/UserScript==
var mirrorHostName = ‘http://192.168.162.138:5000’; //乌云镜像站地址,请根据实际情况改写为自己可用的地址
var mirrorUrlPrefix = mirrorHostName + ‘/static’; //乌云镜像站URL前缀,默认为http://mirrorHostName/static
var bugsReg = /http:\/\/www\.wooyun\.org(\/bugs\/wooyun-\d+-\d+)/; //乌云漏洞页面URL匹配规则
var dropsReg = /http:\/\/drops\.wooyun\.org\/(.+)\/(\d+)/; //乌云知识库页面URL匹配规则
var allLinks = document.getElementsByTagName(‘a’);
for (var i = 0; i < allLinks.length; i++) {
var a = allLinks[i];
var oldUrl = a.href;
var arr, newUrl;
//漏洞页面规则:http://www.wooyun.org/bugs/wooyun-2012-011833 –> http://192.168.162.138:5000/static/bugs/wooyun-2012-011833.html
if (bugsReg.test(oldUrl)) {
arr = bugsReg.exec(oldUrl);
newUrl = mirrorUrlPrefix + arr[1] + ‘.html’;
a.href = newUrl;
}
//知识库页面规则:http://drops.wooyun.org/category/12345 –> http://192.168.162.138:5000/static/drops/category-12345.html
else if (dropsReg.test(oldUrl)) {
arr = dropsReg.exec(oldUrl);
newUrl = mirrorUrlPrefix + ‘/drops/’ + arr[1] + ‘-‘ + arr[2] + ‘.html’;
a.href = newUrl;
}
}
v0.2版本的脚本使用到现在,还没出现新的问题,一切都很顺利~~

上述脚本我已经上传至Greasy Fork脚本库,地址为乌云网漏洞及知识库链接转换器,需要的童鞋可自行安装。如果遇到问题,欢迎大家留言反馈。另外,直接打开油猴子脚本编辑器,粘贴上述代码并保存也是可以的。无论哪一种方法,都要将mirrorHostName变量的值(也就是http://192.168.162.138:5000)修改为你自己的乌云网镜像站地址。

总结

没用到什么高深的技术,但是确实解决了我所遇到的问题,节省了我的时间。俗话说得好:懒人改变世界,但前提是懒人愿意通过技术手段解放双手。我是懒人,懂点技术;撰写此文,与君共勉(老司机请一笑而过)!

此条目发表在未分类, 经验技术分类目录。将固定链接加入收藏夹。