【51CTO.com专栏稿件】回顾近几年国内发生的各类恶意劫持事件中,莫过于通信运营商的流量劫持,该行为严重干扰到了个人和企业用户的正常使用和运营。鉴于互联网上已经有大量关于此类攻击的案例分析和阐述,为了更加有效的防御此类攻击,本文将换一个角度思考和分析,以劫持攻击者的立场,通过具体的劫持实验来简述过程。
目前国内做运营商劫持的主要模式,即通过旁路分光设备镜像流量,并监听用户HTTP GET上行请求,篡改正常返回的信息,从而实现隐蔽的劫持互联网网站信息。因劫持手法种类多样,限于篇幅,本文将只采用其中一种劫持第三方js代码的方式来进行阐述。
一、劫持演示准备
1、获取互联网用户发往80端口的网络数据包,无需回传的数据包。
2、演示用户的浏览器使用基数和安全程度较高的Chrome。经过笔者测试,该演示方案对于Windows系统 +其他浏览器的组合,以及移动端iPhone和Android平台上的默认浏览器均有效。
3、注册开通某商网站联盟账号,系统会从后台分配到一个可跳转的url,该url会给用户设置 cookie,同时用做系统后期统计计费分成。
例如申请到的url如下:
http://u.XXX.com/union/XXXRedirect.aspx?TypeID=2&Allianceid=1234&sid=56789&OUID=abc&jumpUrl=http://www.XXX.com
红色字体为不同的加盟账户被分配的不同编号,若该参数被恶意篡改,该用户推广获得的收入分成将转移。
用curl命令请求该链接,将获得如下图中返回包的截图。其中红色部分标明了该返回包进行了Set-Cookie计费和跳转操作。
二、劫持过程简述
1、 当用户访问www.XXX.com,同时劫持者旁路侦听到该用户浏览器请求了某第三方js代码。(本文将拿Google Analytics的统计代码ga.js 来举例,完整链接:www.google-analytics.com/ga.js),Referer 目标站www.XXX.com。
2、 先于www.XXX.com的服务器返回构造过的TCP包给用户,同时将篡改过的ga.js代码返回。
篡改过的ga.js代码,详见下面截图:
3、劫持完成后用户浏览器的访问不会有明显的异常感知,打开chrome的开发者工具查看访问情况,如下截图:
在用户的主机上打开wireshark 做抓包分析,可以看到被我方强制植入的统计Cookie已经成功,效果如下截图:
三、该类js劫持的特点
1、 该类js代码是由第三方发布和更新,正常情况下不会有人对其返回进行校验。即便用户频繁重复请求或者请求失败,被劫持方不会被主动告知。
2、 操作隐蔽且灵活,通过多种方式只需发送1k以下的数据包篡改js代码,即可完成劫持,无需额外的服务器再做跳转。
3、 该类js代码在国内中小型web站点甚至大型网站具有较高的使用率,比如本文中提到的ga.js通常用作网站流量统计实现。
四、排查和防御方式
1、 目前最流行的运营商劫持方式,即直接在用户访问www.XXX.com的时候对其访问劫持,并直接302重定向跳转到预先设定好的url链接上,此类方式较易被发现,目前国内大多数web站点均开启了https加密策略,可以部分有效的防御此种劫持攻击。
2、 对用户浏览器侧的js代码进行校验,并对CDN节点上的缓存内容做定时轮训匹配对比,判断是否被篡改。监控用户真实得到的web源代码,观察是否被非法注入或者强制跳转等等。
3、 因该类劫持攻击需要在真实服务器返回的TCP包到达前,就将伪造包发到用户浏览器,否则将失去效果。因此排查此类攻击方式应遵从,优先从用户侧排查,也可采用判断TTL不同返回值来做劫持层定位。
4、 通信运营商应该加强自身内部人员和设备管理,并在节点配置部署URPF策略,将伪造IP头的包全部丢弃。比如,排查在关键回写植入点的路由器上的ACL规则,拒绝放行特殊格式或者特征的回写包。
【本文是51CTO专栏机构作者“数字观星技术组”的原创文章,转载请联系原作者】