专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 行业应用

WiFi流量绑架—— 浏览任意页面即可中毒

发布时间:2010-06-06 17:54:42 文章来源:www.iduyao.cn 采编人员:星星草
WiFi流量劫持—— 浏览任意页面即可中毒!

大家都知道公共场所的Wifi安全性很差,但并不清楚究竟有多差。大多以为只要不上QQ、不登陆网站账号就没事了,看看新闻小说什么的应该毫无关系。

  的确如此,看看新闻网页没有涉及任何敏感的账号信息。即便是数据明文传输,Hacker也只能嗅探到你看了哪些新闻,这些毫无价值的信息。

  不过如此守株待兔的嗅探,似乎也太被动了。既然我们能主动控制流量,何必用这种弱爆了的方法呢?

  --------------------------------------------------

  在上一篇文章《把笔记本改造成无线路由器 ——  手机抓包牛刀小试》里提到如何实现Wifi的流量拦截,并做出更大范围的攻击。

  今天,我们使用一种古老的技术,打造一个巧妙的时光机原型。让我们的脚本能穿越到未来运行,不再受时间与空间的限制,实现超长诅咒!

  

  

 

  

  原理其实非常简单,相信大家看完图就明白了。

  1. 当有人连上我们创建的AP时,他的命运已掌控在我们手中了!

  2~5.  他访问任何网站,我们的Web代理就能在其中插入一段脚本代码了。当然这不是一般的广告的代码,而是预加载各大网站的通用脚本库。

  6~7.  一切都在我们掌控之中,我们并非返回真正的脚本库文件。事实上一次预加载那么多文件,很是浪费带宽~ 我们只返回一个很小的“桩文件”,让他在实际运行时再加载真正的文件。此外,这个“桩文件”里我们还可以额外加些其他脚本:) 由于这些脚本库通常有着很长的缓存时间,因此只要在用户在清空缓存之前,始终从本地缓存里读取这个文件!

  8~12. 即使用户离开了公共场所,但常用的脚本文件都已被感染并缓存。只要未来某一天登陆我们预先感染的网站,脚本将穿越时空被唤醒!

  由此看来,只要实现了第1步,之后的几乎都是顺理成章了!

  

  不过并非所用的人都是小白,还是有不少警惕性高的用户,不会轻易连接没有密码的公开wifi。事实上很多餐厅咖啡店的wifi都是设置了公开的密码的。

  对于这种情况,我们就需要一个功率更大的AP了,并且将SSID与密码设置的和咖啡店的完全一致 —— 根据wifi的连接策略,同样的热点名将会优先选择信号更好的。如果密码也一样,他们就能顺利的连上我们的AP。于是我们的热点就像磁金石一样,将新来的用户统统吸过来,于是可以尽情的掌控了~~~

  

  不过最终的难点却不在此,要找出每个网站缓存最久的脚本资源才是重中之重。

  事实上,光看缓存时间是远远不够的 —— 有不少文件设置了很久的缓存,但是他们却经常的更新。最常见的就是带时间戳或哈希值的脚本URL,他们几乎三两天换一个,却有很长的缓存时间,这显然是不可取的。因此,我们需要根据资源的缓存时间上次修改时间,来衡量其稳定程度

  为了能方便从各大网站寻找稳定度较高的资源,我们使用PhantomJS来实现自动化分析。PhantomJS是没有界面的命令行Webkit浏览器,使用它来模拟网站的访问,能为我们节省大量的系统资源。

  我们监听page.onResourceReceived事件,即可获取所有资源请求的回应数据。之前已提到,缓存时间是必要条件,修改时间是充分条件。修改时间早说明这个资源不经常改变,可以放心用!

  首先我们过滤掉缓存很短的资源,很快就过期的资源是没有利用价值的。然后按上修改时间的先后排序,最终为每个站点选择稳定度最优的几个资源。

  代码实现很简单(sniffer.js):

复制代码
var MIN_STABLE_DAY = 2,
    MIN_CACHE_DAY = 7,
    MAX_ITEM = 2,
    PATH_URL = 'url.txt',
    PATH_LIST = '../asset/list.txt';


var webpage = require('webpage'),
    fs = require('fs');

var site = [],
    site_res = {},
    used = {};


//
// load list
//
fs.read(PATH_URL).split('\n').forEach(function(line) {
    line = line.trim();
    if (!line || line.substr(0, 1) == '#') {
        return;
    }

    site.push(line);
});



function go(url) {
    var page = webpage.create(),
        result = site_res[url] || (site_res[url] = []);


    function ms2day(tick) {
        return ~~(tick / (24 * 3600 * 1000));
    }

    page.onResourceReceived = function(response) {
        if (response.url in used) {
            return;
        }
        used[response.url] = true;

        if (! /\.js/i.test(response.url)) {
            return;
        }

        var last, now, exp;
        var sec;

        var i, headers = response.headers;
        for(i = headers.length - 1; i >= 0; --i) {
            var header = headers[i];

            switch(header.name.toLowerCase()) {
            case 'date':
                now = new Date(header.value);
                break;
            case 'expires':
                exp = new Date(header.value);
                break;
            case 'last-modified':
                last = new Date(header.value);
                break;
            }
        }

        if (!exp || !last) return;
        if (!now) now = new Date();

        var dayStable = ms2day(now - last);
        var dayCached = ms2day(exp - now);

        if (dayStable < MIN_STABLE_DAY || dayCached < MIN_CACHE_DAY) {
            return;
        }

        result.push({
            url: response.url,
            cache: dayCached,
            stable: dayStable
        });
    };


    function cb(status) {
        if (tid != -1) {
            clearTimeout(tid);
        }

        //
        // sort and display
        //
        if (result.length > 0) {
            result.sort(function(a, b){return a.stable - b.stable});

            if (result.length > MAX_ITEM) {
                result.length = MAX_ITEM;
            }

            console.log('==', url, '====================');
            for(var i = 0; i < result.length; i++) {
                var res = result[i];
                console.log(-res.stable + ' / +' + res.cache + '\t\t' + res.url);
            }
            console.log(' ');
        }

        //
        // breadth-first merge
        //
        if (++done == site.length) {
            var loop, merge = [];

            do {
                loop = false;

                for(var k in site_res) {
                    var e = site_res[k].pop();
                    if (e) {
                        loop = true;
                        merge.push( e.url.split('//')[1] );
                    }
                }
            } while(loop);

            fs.write(PATH_LIST, merge.join('\n'));
            console.log('DONE!');
        }
    }

    var tid = setTimeout(function() {
        page.close();
        tid = -1;
        cb();
    }, 60 * 1000);

    page.open('http://' + url, cb);
}

var done = 0;

function start() {
    for(var i = 0; i < site.length; i++) {
        setTimeout(function(url) {
            go(url);
        }, 2000 * i, site[i]);
    }
}

start();
复制代码

  我们测试几个常用的大网站(url.txt):

复制代码
www.hao123.com
www.taobao.com
www.renren.com
www.kaixin001.com

www.baidu.com
www.baidu.com/s?wd=ss
tieba.baidu.com
map.baidu.com

weibo.com
www.sina.com.cn

www.mop.com
www.tianya.cn
bbs.tianya.cn

www.youku.com

user.qzone.qq.com
qzone.qq.com

www.163.com
mail.163.com
www.126.com

www.sohu.com
复制代码

  根据返回的数据来看(-几天没修改 / +缓存几天),资源的修改时间远比缓存时间短,不过仍有少数可以利用的。

复制代码
$ phantomjs sniffer.js
== www.hao123.com ====================
-5 / +360               http://s0.hao123img.com/v3/Mr/T0/gh/sn/61/6/hao123.js
-92 / +360              http://s0.hao123img.com/res/js/track.js?380890

== www.taobao.com ====================
-6 / +3650              http://a.tbcdn.cn/s/kissy/gallery/??search-suggest/1.0/index-min.js,search-suggest/1.0/plugin/history-min.js,search-suggest/1.
0/plugin/local-query-min.js,search-suggest/1.0/plugin/storage-min.js,search-suggest/1.0/plugin/tab-min.js,search-suggest/1.0/plugin/telephone-min.js?t
=20130606190449
-6 / +3650              http://a.tbcdn.cn/s/kissy/1.3.0/??node-min.js,dom/base-min.js,event/dom/base-min.js,event/base-min.js,event/dom/focusin-min.js
,anim-min.js,event/custom-min.js,switchable-min.js,cookie-min.js,ajax-min.js,json-min.js,rich-base-min.js,base-min.js,combobox-min.js,component/base-m
in.js,menu-min.js,component/extension-min.js,xtemplate/facade-min.js,xtemplate/runtime-min.js,xtemplate/compiler-min.js?t=20130606190449

== www.kaixin001.com ====================
-14 / +365              http://s.kaixin001.com.cn/js/apps/reg/ARegister-00100c612.js
-80 / +365              http://s.kaixin001.com.cn/js/core/media/MediaBox-0002a9159.js

== www.baidu.com ====================
-5 / +3650              http://s1.bdstatic.com/r/www/cache/static/user/js/u_75caac89.js
-5 / +3650              http://s1.bdstatic.com/r/www/cache/static/global/js/home_f949edf5.js

== www.baidu.com/s?wd=ss ====================
-5 / +3650              http://s1.bdstatic.com/r/www/cache/static/global/js/common_7fd3f7db.js

== www.renren.com ====================
-7 / +365               http://s.xnimg.cn/a56656/n/core/base-all2.js
-88 / +365              http://s.xnimg.cn/a53726/n/apps/login/login-v6.js

== tieba.baidu.com ====================
-4 / +30                http://tb1.bdstatic.com/tb/static-spage/component/feed_data/feed_data_c51ac7ba.js
-8 / +30                http://tb1.bdstatic.com/tb/static-common/js/tb_ui_ac13f64f.js

== map.baidu.com ====================
-7 / +365               http://webmap1.map.bdimg.com/init_0gj0re.js
-8 / +365               http://webmap2.map.bdimg.com/main_hntng4.js

== weibo.com ====================
-9 / +15                http://js.t.sinajs.cn/t5/register/js/page/login/index.js?version=201306141810
-30 / +15               http://js1.t.sinajs.cn/t4/apps/publicity/static/wbad.js?version=201306141810

== www.sina.com.cn ====================
-141 / +223             http://i2.sinaimg.cn/jslib/modules2/sina/util/1.0.5/util.js
-169 / +203             http://i2.sinaimg.cn/jslib/modules2/seajs/1.3.0/sea.js

== www.mop.com ====================
-365 / +300             http://mopimg.cn/tj/dcq.js
-427 / +300             http://mopimg.cn/dc/tj.js

== www.tianya.cn ====================
-38 / +29               http://static.tianyaui.com/global/ty/TY.js

== bbs.tianya.cn ====================
-7 / +29                http://static.tianyaui.com/global/lite/js/lite-all.js?v=201306070836
-15 / +25               http://static.tianyaui.com/global/lite/js/bbs/bbs.js?v=201306070836

== user.qzone.qq.com ====================
-31 / +7                http://imgcache.qq.com/ptlogin/ver/10031/js/h_login_11.js?max_age=604800&ptui_identifier=000D29EE4BA374D65D39E3C1BB890C8E50025
6813D2C4E549471141C

== www.163.com ====================
-32 / +90               http://img2.126.net/ntesrich/auto/indexU/dlbox-index-v1.0.1-130506.js
-51 / +90               http://img2.126.net/ntesrich/auto/indexU/fcbox-index-v1.0.0-130422.js

== www.sohu.com ====================
-42 / +90               http://js.sohu.com/pv/pvclick1211071116.js
-42 / +90               http://js.sohu.com/pv/spv1209061800.js

DONE!
复制代码

  

  很好,有了这些数据,就可实现我们计划了!

  下一篇将介绍使用NodeJS来打造这一计划。目前代码已基本调试完毕,等待实战测试!

1 楼 th3639 前天  
   有意思  你也可以测试一下 360 浏览器是否会拦截到。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

  • 《松本行弘的程序全世界》之面向对象

    《松本行弘的程序世界》之面向对象 最近读《SICP》把脑细胞搞死大半,还没看完2章,而且看得也是一知半解,实在是受不了了,...

  • GroovyHelp 3.2.7 GA公布

    GroovyHelp 3.2.7 GA发布 GroovyHelp简介   GroovyHelp是一款Javadoc及Groovydoc搜索查阅软件,它能够帮助Java开发人员以...

  • Velocity在Roller中的使用

    Velocity在Roller中的应用 Velocity是java世界中出现比较早,也比较成熟的、性能比较好的、应用也比较广泛的模板框架。   所...

  • Rpc远程调用框架的设计与兑现(2)

    Rpc远程调用框架的设计与实现(2) 接上: 3   基于Json的前后端数据交互 3.1   轻量级的数据交换形式 3.1.1    什么是Jso...

  • excel 单元格的锁定 以及 JXL的兑现方式

    excel 单元格的锁定 以及 JXL的实现方式 在使用excel表格时,有些列是不希望用户可以修改的,诸如审计日志里面确定的部分,而审计...

  • 仓秤跟散料秤:java连接opc Server

    仓秤和散料秤:java连接opc Server 这三篇都是之前写好的,一直没发。 这次一起发出来吧。   java连接硬件很痛苦,特别是对我这...

  • Rpc远程调用框架的设计与兑现(1)

    Rpc远程调用框架的设计与实现(1) Rpc远程调用框架的设计与实现 1     Rpc远程调用框架设计概述 1.1   研究背景 1.1.1...

  • 集合中的线程安全有关问题

    集合中的线程安全问题 一、why? Java中常用的集合框架推荐使用的三个实现:HashSet\ArrayList\HashMap都是线程不安全的.如...

  • Java定时任务的兑现

    Java定时任务的实现 本例依据Java自身提供的接口实现,通过监听器(Listener)和定时器(Timer)定时执行某个任务(Task)。 MyListener: ...

  • java中log日记的使用

    java中log日志的使用 一、介绍  Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控...

热门推荐: