回顾近几年国内发生的各类恶意劫持事件中,莫过于运营商劫持严重干扰到了个人和企业用户的正常使用和运营。鉴于互联网上已经有大量关于此类攻击的案例分析和阐述,为了完善的防御此类攻击,本文将换一个角度思考和分析,通过具体的劫持实验,从攻击者的立场用通俗的语音来简述过程。 即通过旁路设备监听HTTP请求,篡改正常返回的js代码和信息,实现隐蔽的劫持互联网网站计费信息的方案。
0x01劫持实验条件准备
- 获取互联网用户发往80端口的网络数据包,无需回传的数据包。
- 演示用户的浏览器使用基数最大的Windows + IE组合,确保方案的通用性。PS:经过测试,该演示方案对于Windows系统 , 移动端iPhone和Android平台上的默认浏览器均有效。
- 注册开通某商网站联盟账号,会从后台分配到一个跳转的url,该链接会给用户设置 cookie,同时用做系统后期统计计费分成。
举例链接如下:
http://u.XXX.com/union/CtripRedirect.aspx?TypeID=2&Allianceid=1234&sid=56789&OUID=abc&jumpUrl=http://www.XXX.com
红色字体为不同的加盟账户被分配的不同编号,如若该参数被恶意篡改,该用户推广获得的收入分成将转移。
下图中的红色部分标明了该返回包进行了Set-Cookie计费和跳转。
0x02劫持过程简述
- 假设用户访问www.XXX.com,劫持者旁路侦听到该用户浏览器请求www.google-analytics.com/ga.js (ga.js 是Google Analytics的统计代码),Referer 目标站www.XXX.com。
- 先于www.XXX.com的服务器返回构造过的TCP包给用户,同时将篡改过的JS内容返回。
注入返回构造过的ga.js代码。详见下面截图:
执行完成后浏览器效果如下截图:
统计Cookie植入成功效果见截图:
0x03劫持原理和特点
- 部分网站会对js代码进行校验,并对CDN节点上的缓存内容做定时轮训匹配对比,判断是否被篡改。
- 部分网站会监控用户真实得到的HTML源代码,观察是否被非法注入或者强制跳转等等。流行的劫持方式之一,直接在用户访问www.XXX.com的时候劫持其访问,并直接302重定向跳转到自己的联盟url链接上,此类方式非常容易被甲方发现。
统计js劫持的特点:
- 该类js代码是由Google发布和更新,正常情况下不会有人对其返回进行校验。即便用户频繁重复请求或者请求失败,被劫持方不会被Google主动告知。
- 操作隐蔽且灵活,通过多种方式只需发送1k以下的数据包篡改js代码,即可完成劫持,无需额外的服务器再做跳转。
- 该类js代码用作通用的网站流量统计实现,在国内中小型web站点甚至大型网站,具有很强的通用性。
广域网环境需要几点限制条件:
- 能通过旁路分光设备做流量镜像,获取到http get 上行的数据包。
- 需要在真实服务器返回的TCP包到达前就将伪造包发到客户端,否则将失去效果。所以此类劫持方式理论上需要离用户侧尽量靠近。
- 通信运营商一般都会在节点配置部署URPF策略,伪造IP头的包通常会被丢弃。比如,在关键回写植入点的路由器上添加ACL规则,放行这部分回写包(例如约定某种格式或者特征)。