某种流量劫持攻击的原理简述和演示(原创)

Posted by goobey on June 26, 2017

回顾近几年国内发生的各类恶意劫持事件中,莫过于运营商劫持严重干扰到了个人和企业用户的正常使用和运营。鉴于互联网上已经有大量关于此类攻击的案例分析和阐述,为了完善的防御此类攻击,本文将换一个角度思考和分析,通过具体的劫持实验,从攻击者的立场用通俗的语音来简述过程。 即通过旁路设备监听HTTP请求,篡改正常返回的js代码和信息,实现隐蔽的劫持互联网网站计费信息的方案。

0x01劫持实验条件准备

  1. 获取互联网用户发往80端口的网络数据包,无需回传的数据包。
  2. 演示用户的浏览器使用基数最大的Windows + IE组合,确保方案的通用性。PS:经过测试,该演示方案对于Windows系统 , 移动端iPhone和Android平台上的默认浏览器均有效。
  3. 注册开通某商网站联盟账号,会从后台分配到一个跳转的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劫持过程简述

  1. 假设用户访问www.XXX.com,劫持者旁路侦听到该用户浏览器请求www.google-analytics.com/ga.js (ga.js 是Google Analytics的统计代码),Referer 目标站www.XXX.com。
  2. 先于www.XXX.com的服务器返回构造过的TCP包给用户,同时将篡改过的JS内容返回。

注入返回构造过的ga.js代码。详见下面截图: 执行完成后浏览器效果如下截图: 统计Cookie植入成功效果见截图:

0x03劫持原理和特点

  1. 部分网站会对js代码进行校验,并对CDN节点上的缓存内容做定时轮训匹配对比,判断是否被篡改。
  2. 部分网站会监控用户真实得到的HTML源代码,观察是否被非法注入或者强制跳转等等。流行的劫持方式之一,直接在用户访问www.XXX.com的时候劫持其访问,并直接302重定向跳转到自己的联盟url链接上,此类方式非常容易被甲方发现。

统计js劫持的特点:

  1. 该类js代码是由Google发布和更新,正常情况下不会有人对其返回进行校验。即便用户频繁重复请求或者请求失败,被劫持方不会被Google主动告知。
  2. 操作隐蔽且灵活,通过多种方式只需发送1k以下的数据包篡改js代码,即可完成劫持,无需额外的服务器再做跳转。
  3. 该类js代码用作通用的网站流量统计实现,在国内中小型web站点甚至大型网站,具有很强的通用性。

广域网环境需要几点限制条件:

  1. 能通过旁路分光设备做流量镜像,获取到http get 上行的数据包。
  2. 需要在真实服务器返回的TCP包到达前就将伪造包发到客户端,否则将失去效果。所以此类劫持方式理论上需要离用户侧尽量靠近。
  3. 通信运营商一般都会在节点配置部署URPF策略,伪造IP头的包通常会被丢弃。比如,在关键回写植入点的路由器上添加ACL规则,放行这部分回写包(例如约定某种格式或者特征)。