运营商劫持

原文:http://www.cnblogs.com/LittleHann/p/5775858.html

 

catalogue

1. 引言
2. DNS劫持
3. HTTP 劫持
4. 路由软件中植入劫持代码、用户PC本地木马
5. 劫持弹广告检测、防御手段
6. 检测方案

 

1. 引言

0x1: 原始的 DNS 投毒(DNS劫持)

DNS 作为互联网的基础设施之一,起到把域名转换成 IP 地址的作用,比如 www.baidu.com --> 115.239.211.112 。
各大运营商通常会以省为单位建设 2-4 台递归(或缓存)DNS 给用户使用,在 PPPoE 拨号时自动配置。 假若用户输错了域名,正常情况下 DNS 服务器会返回 NXDOMAIN(nonexistent domain)错误,然后浏览器或应用程序会报「域名无法解析」错误 
运营商通常会对 NXDOMAIN 结果进行污染,返回一个假冒的 IP 地址,这个 IP 地址指向运营商的服务器,于是你便看到了「贴心」的满屏广告的各种网址纠错页。
这种方式简单粗暴,用户一般也不会太反感,而且似乎也不会违反任何法律法规

0x2: 所谓的「良性」劫持(TCP劫持)

用户跨运营商访问网络时,运营商可能需要为用户支付网间结算费用。比如中国移动宽带用户访问位于中国电信网络的服务器,中国移动必须为这些流量或带宽支付给中国电信网间结算费用 
由于众所周知的原因,网间结算费用十分昂贵,为了节省网间互联费用,部分运营商部署了缓存服务器,在用户跨网访问时,采用技术手段将用户与目标服务器的连接劫持到自家的缓存服务器上

全站 HTTPS 是大势所趋,可以预见,在 HTTPS 流量越来越多的前提下,缓存劫持将变得越来越没有意义。和各大网站合作发展 CDN 才是王道

0x3: 「良性」劫持的危害(网间访问缓存)

1. 可能造成网站和 APP 功能故障
    1) 运营商的网间缓存更新时间及失效时间对用户和网站不可控,缓存的旧数据和新数据无法在时间上保持一致性,可能引发一些"奇怪"的问题。比如
        1.1) 好多软件的最新版本下载地址是不变的,由于缓存的原因会让你一直下载到旧版本。这可能会影响到部分软件的自动更新、自动升级功能
        1.2) 还有如网页中部分资源引用到旧数据导致网页排版和功能异常,验证码被缓存导致验证码怎么都输不对等问题 
    2) 由于劫持的方式是使用 HTTP 302 重定向指令,有的应用可能只接受 HTTP 200 OK 为正确的响应,不会识别 HTTP 302 Found 指令,造成通信故障。 
    3) 劫持后网址发生变化,可能会触发浏览器和部分程序的跨站保护功能,导致网页上的脚本程序无法执行。或者由于相对路径发生变化导致 HTTP 404 错误
    4) 从技术上缓存系统只能通过 URL 来区别不同的资源,不能识别具有相同 URL 的不同资源,这会导致资源加载错误。比如
        4.1) 看视频时,出现前一段和后一段内容不一致
        4.2) 下载 Windows 7 系统的驱动结果下载完成后发现是 Windows XP 的驱动
        4.3) 带有敏感用户信息的文件被缓存后对所有人可见等安全问题 

2. 缓存服务器具备篡改或出售缓存数据的隐患,对信息安全不利。目前部分地区的用户已经在网上讨论过下载 A 软件却被替换成 B 软件的情况 
3. 缓存服务器故障时,会造成大量用户"部分URL断网" 
4. 缓存服务器带宽和处理性能有限,据网上反映由于缓存服务器经常报 HTTP 403、502 错误,导致资源无法加载,或由于缓存服务器超载导致加载速度缓慢  
5. 缓存服务器可能触发部分网站的反爬虫(反机器人)、反盗链机制,缓存的内容是服务器报错信息,导致资源无法加载 
6. 破坏了 URL 对用户的透明性。假设用户将劫持后的链接分享给其他人,而联通对缓存服务器做了访问控制,将会导致链接无法在外部打开;另外如果缓存失效而又没有及时更新的话,可能导致用户无法通过此 URL 访问被引用的资源 
7. 损害了 IDC 和 CDN 的利益,此种网络劫持使 IDC 和 CDN 的流量大幅减少,影响 IDC 和 CDN 的流量收入 
8. 目前联通的劫持依靠 TCP 抢答的方式,但原始数据包还是会到达目标服务器并被正确响应。造成的结果就是
    1) 虽然你访问资源时被 HTTP 302 数据包重定向到了联通的缓存服务器,但原目标服务器的 HTTP 200 响应还是会被送到用户端,且由于得不到用户端的确定不断触发超时重传,极大地浪费了用户带宽 
    2) ISP通过流量镜像的方法抢在原目标服务之前向用户端response了数据包,但原目标服务器的 HTTP 200 响应还是会被送到用户端,用户端收到这个"重复的response包"之后,会向原目标服务器发送RST包

0x4: 采用 HTTP 302 跳转进行缓存劫持而不是直接反向代理篡改原始数据原因

HTTP 302 跳转方式部署起来最容易,成本最低。因为不需要对原有设备进行改造,只需要在交换机上以分光并联的方式进行连接即可。劫持设备的 DPI(深度包检测)系统可以实时探测用户和正常服务器的通信内容,可根据网络状况、劫持服务器负载、用户身份、访问内容、劫持概率等按需进行劫持。劫持时,只要伪造目标服务器的身份抢在真正的服务器之前向用户发送一条 HTTP 302 报文让用户跳转到新地址即可完成劫持。劫持设备与路由设备分离,方便维护
而如果直接篡改原始数据,则需要对原有设备进行改造,串联进路由设备,对每一个通过的数据包进行探测,决定放行或劫持。由于无法从目的 IP 判断数据包应发往真正的服务器还是截持服务器,这种系统还要为每个用户维护一份连接会话信息来作区分。可以想象的是,这套系统将对网络性能产生巨大的负面影响,并且难以维护

0x5: IPUSH

1. 网络定向直投系统(也称IPUSH),是由中国电信开发的划时代网络技术,可以以各种格式定时、定点将广告推送到网络在线用户端的浏览主页面。通过这个传播平台,不论电信用户在IE浏览器地址栏中输入任何网址进行浏览,网络定向直投系统均可将广告主动送达用户,不依赖于某个固定的网站。可以自由选择目标市场区域,灵活投放,全面覆盖
2. IPUSH提供用户在相关搜索引擎(百度、google)输入内容,系统通过输入内容中的关键字,向用户推送与关键字绑定的图片、动画等多媒体交互式广告内容
3. 根据用户访问的网站地址,推送与指定网站URL绑定的广告内容
4. 以区域为单位,以宽带用户为依托的电信级网关广告 

网络定向直投广告的表现形式

1. URL全屏定向直投
只要是指定地区的宽带用户上网浏览内容,系统就向其点对点推送广告,第一时间独占了目标受众的眼球

2. 超级搜索引擎
根据受众在百度或者google进行关键字搜索的在线及时行为,自动触发与关键字绑定的广告,精准得出现在此类产品感兴趣的目标受众面前,在所有参与搜索引擎竞价排名的竞争对手中独占鳌头

3. 用户上网行为广告推送
根据受众在网上浏览某个网站或网站的某个栏目,系统自动判断对产品感兴趣的受众,从而主动向该受众定向推送交互式的全屏广告

网络定向方式

1. 地域定向推送: 针对不同区域的用户,在指定时间段内上网,即自动跳出互动广告
2. 关键字搜索: 可以在普通用户进行搜索行为时,根据预设的关键字自动跳出互动广告
3. 特定网址绑定: 绑定指定网站/页面,一旦用户访问相应网站/页面,自动跳出互动广告

目前存在的网络广告形式以弹出窗口、浮动广告、固定广告为主,但其局限广告在执行站点上展示,而且容易被浏览器或第三方软件所屏蔽。而网络定向直投的系统无论用户访问任何网页,都能及时收到由网络定向直投系统推送的广告,并且不会被目前已知的任何插件或空间屏蔽,极大的增加了广告投放的成功率

通过置换页面的形式和电信网络的组合利用,避开各类软件的屏蔽

Relevant Link:

https://www.v2ex.com/t/255600
http://www.chinanews.com/cj/2015/05-22/7295090.shtml
https://www.v2ex.com/t/251341
https://www.v2ex.com/t/251297
https://www.v2ex.com/t/251148
https://www.v2ex.com/t/251297#reply45
http://wenku.baidu.com/view/24aa3308844769eae009ed78.html
http://wenku.baidu.com/view/87cbdfd7c1c708a1284a44a8.html
http://yanjunyi.com/blog/posts/yunnan-telecom-intercept-record.html
http://www.williamlong.info/archives/439.html
http://www.williamlong.info/archives/369.html
http://www.williamlong.info/archives/335.html
http://www.williamlong.info/archives/3658.html
https://www.v2ex.com/t/149254
https://www.v2ex.com/t/145087

 

2. DNS劫持

在中国,由于全国各地区被各个网络运营商分割,并且考虑到互相之间的利益关系以及网络访问速度,DNS解析的流程其实相当"复杂",路径非常之多

0x1: 运营商区域DNS Server遭到缓存投毒攻击

CVE-2007-2926

Relevant Link:

https://security.tencent.com/index.php/blog/msg/14

 

3. HTTP 劫持

HTTP 协议本身未提供任何的安全措施,你和服务器之间的通信可以被任何中间设备窃听、记录、篡改,甚至目标服务器本身都可以伪造

1. 上网时正常页面被植入广告或恶意代码,连使用手机 APP 都不能幸免
2. 上 A 网站却有一定机率被跳转到 B 网站
3. 访问网站被多次跳转并被添加返利小尾巴等 

由于信息不加密,意味著运营商可以随意记录并出售你的上网数据。更为安全的 HTTPS 协议则完全没有上述提到的问题,只要你别忽略浏览器的报的证书错误(如访问 12306.cn 时),你和服务器之间的连接就是安全的。之前淘宝没启用 HTTPS 加密连接之前,经常有人在淘宝上买完东西后马上收到诈骗电话,订单号、收件人等各种私密信息均被泄露,估计和某些运营商脱不了关系,这种劫持属于违法甚至犯罪行为
目前,国内外的许多网站已开启全站 HTTPS 加密,如 Google 的各类产品(包括 YouTube)、 Facebook 、 Twitter 、 Wikipedia 、淘宝、天猫、百度搜索。另外知乎和 V2EX 都已支持 HTTPS 方式访问(但没有强制 HTTPS),听京东的同学讲京东也正在测试全站 HTTPS 。 Google 已经表示对于启用全站 HTTPS 的站点,在搜索排名上会优先显示,鼓励各网站启用 HTTPS 。新版的 Chrome 和 Firefox 浏览器已经支持速度更快的 HTTP/2 ,但只支持启用了 HTTPS 的站点。可见,将来会有越来越多的网站转而使用 HTTPS ,明文的 HTTP 会被冷落, HTTP 劫持终会成为历史

0x1: 运营商HTTP劫持的原理

在用户的浏览器连上被访问的网站服务器,发送了HTTP请求后,运营商的路由器会首先收到此次HTTP请求,之后运营商路由器的旁路设备标记此TCP连接为HTTP协议,之后可以抢在网站服务器返回数据之前发送HTTP协议的302代码进行下载软件的劫持,浏览器收到302代码后就会跳转到错误的软件下载地址下载软件了,随后网站服务器的真正数据到达后反而会被丢弃(客户端会向原目标server发送RST包),或者,旁路设备在标记此TCP连接为HTTP协议后,直接返回修改后的HTML代码,导致浏览器中被插入了运营商的广告,随后网站服务器的真正数据到达后最终也是被丢弃

技术分享

1. 客户端C向服务器S发出一个HTTP请求 
2. 运营商网关将该请求分光(复制)送到缓存服务器 
3. 缓存服务器如果发现命中缓存,则伪装成S返回一个302响应,该响应通常比S的正确响应早到,因此C接受了该响应,而忽略了S的响应,从而跳转到缓存服务器取数据 
//这同时也是伟大的墙发送RST的方法 

0x2: 劫持的现象

ISP运营商抢在原始目标Server之前向客户端发送Response回包,回包的内容已经是"劫持后的数据",劫持的形式包括

1. ISP直接返回一个302
    1) 跳转到一个新的URL(例如404页面)
    2) 继续跳转原始URL,但是在尾部加上"小尾巴",例如广告联盟(包括返利): www.baidu.com/s?wd=test&tn=SE_pshl0065_bassux8m。这个"小尾巴"表示来源渠道商,用户带上这个小尾巴访问目标网站后(例如百度),目标网站需要向广告联盟支付推广费用,TCP流量劫持参与者就可以从中获利
2. ISP在原始网页(缓存中)中增加新内容
    1) iframe:  <frame src="http://zgshihu.com/z/z_sz.php" name="fb" frameborder="0">
    2) js跳转链接: <script type="text/javascript">parent.location.href="http://www.amazon.cn?tag=eqifa5307-23&ascsubtag=704747|1|"; </script>

比较典型的是将大型电商网站的流量导到返利联盟,通过返利联盟获得当前用户成交金额的返利

Relevant Link:

http://www.williamlong.info/archives/4181.html
http://news.mydrivers.com/1/264/264415.htm
http://blog.caoyue.me/post/isp-tcp-hijacking
https://www.v2ex.com/t/120079
https://security.tencent.com/index.php/blog/msg/81

 

4. 路由软件中植入劫持代码、用户PC本地木马

5. 劫持弹广告检测、防御手段

0x1: script1

<script type="text/javascript"> 
    if (top.location !== self.location) {
    top.location=self.location;
 }
</script>

0x2: script2

<style> html{display : none ; } </style> 
<script>
if( self == top ) {
          document.documentElement.style.display = ‘block‘ ;
   } else {
       top.location = self.location ;
   }
</script>

0x3: HTTPS

0x4: TTL检测

一般 ISP 劫持的时候不会去处理 TTL 。理论上可以根据 TTL 来追踪到哪一点出了问题,一次TCP会话中TTL值相差很大或者IPId突然跳变

0x5: 攻击源定位

1. tracert 被劫持的目标网站IP,得到每一跳的路由IP,并且得到一个正常情况下的Standar TTL
//TCP劫持设备(旁路侦听数据包)一般是基于包而非状态的,我们构造被侦听的数据包(也就是直接发出访问目前Server IP的HTTP请求TCP 包,不需要三次握手)多次发送,TTL值从1开始递增,精确地传递数据包到每一个路径上,直到出现伪造响应——没有问题的位置是不会有响应的,第一个出现 伪造响应的位置就是出问题的位置
2. 用python的Scapy向目标被劫持Server IP发送TCP包,TTL从0开始递增
3. 正常情况下TTL只有到达Standar TTL才会收到目标Server的正常回包,但是如果链路上发生了TCP劫持,在TTL还未到达Standar TTL之前就会收到正常回包,因为旁路劫持设备不会去检测请求包的TTL词,它会以为当前收到的请求包是一个正常的访问请求,会尝试抢在原始目标Server之前发送缓存中的数据包
4. 在客户端看到的现象就是会收到一个Time-to-live Exceeded的ICMP包、以及一个来自原始Server IP的正常回包

0x6: Id(Identification)检测

例如真实包的TTL是53,Id是按顺序自增的,而伪造的包的TTL是64,Id始终是0

技术分享

技术分享

0x7: Scapy检测脚本

#!/bin/python
#  
# 

import sys
from scapy.all import * 
conf.verb=0

print "TCP Hijacking Delector by lake2"
print "[+] Sniffing ...."
ip_arr = {}
while 1:
    a=sniff( filter="tcp and src host not 10.26.234.44", count=50)
    for b in a:
        ip_src = b.sprintf(r"%IP.src%")
        ip_ttl = b.sprintf(r"%IP.ttl%")
        if ip_arr.has_key(ip_src):
            c = int(ip_ttl) - int(ip_arr[ip_src])
            if abs(c) > 4:
                print ip_src + " has been hijacking !!!   current pack‘s ttl : " + str(ip_ttl) + "  <-> " + str(ip_arr[ip_src])
        else:
            ip_arr[ip_src] = ip_ttl
    print "=>"

0x8: iptables阻断劫持设备抢先返回的劫持包

iptables -A FORWARD -p tcp --sport 80 -m string --string "Location: http://59.108.200.39" --algo bm -j DROP
//该规则的意义是,如果某个HTTP响应包中含有 Location: http://59.108.200.39 字样,就直接丢弃。这样后续S真实的响应包就能被客户端接收,从而保证正确的通信

Relevant Link:

https://en.wikipedia.org/wiki/Framekiller
https://www.elie.net/publication/busting-frame-busting-a-study-of-clickjacking-vulnerabilities-on-popular-sites
http://dbanotes.net/security/iframekiller_anti_iframe_clicjacking.html
https://security.tencent.com/index.php/blog/msg/10
http://bobao.360.cn/learning/detail/333.html
http://www.bk80.com/blog/1092.html
https://onebitbug.me/2013/12/19/escape-isp-http-hijacking/

 

6. 检测方案

1. 从流量中过滤出RST包,并保存dst ip
2. 这些dst ip可能是遭到了ISP的TCP劫持,这些ip相当于一个"高疑似度IP",很有可能是电商、大型网站
3. 下一步需要拿全国各省各市的ADSL拨号,拨入对应城市三级ISP的网络中
4. 循环发1000 TCP包,检测这个过程中是否发生"TTL波动",即如果当地存在ISP TCP劫持,则收到的TTL值和访问正常网站的TTL值多数情况下会不一样,即使运营商采取了随机插入的策略,在多次(1000次以上)访问过程中,也有很大几率产生TTL差值波动
5. 最终得到的是存在ISP TCP劫持的ISP城市
posted @ 2017-07-19 20:54  李涛军  阅读(6537)  评论(0编辑  收藏  举报