随着DNS劫持手段越来越容易被识破和防范,TCP流量劫持这一新的手段出现了 。这种攻击手段通过运营商路由设备将发往特定域名(或IP)的流量阻断,并返回预设的内容(通常是广告或重定向请求)。TCP流量劫持手段不光隐蔽,无法通过更换DNS服务器防范(用户更换其他DNS后仍会被劫持),容易推卸责任(就算用户投诉,往往也可以通过“用户中毒”或“网站被挂马”等说辞混淆视听),还容易根据用户个人信息(事先收集到的年龄、收入水平、所选套餐等)、时间段、用户平时浏览与购物习惯等精确推送广告,近来越发受到运营商青睐。
最近发现打开京东的时候,浏览器会跳转很多次,随后地址栏中jd.com后面就会跟上很长一段“尾巴”,像这样:
http://www.jd.com/?cu=true&utm_source=www.bangshouye.com&utm_medium=tuiguang&utm_campaign=t_4_A100183448E100021732,&utm_term=ebe3d4a0781e4fdb8f3246b9294e4739
从URL上看很容易就能推断出,这次访问被劫持了,而且劫持的动机很显然是套取电商的流量返利。通常,运营商和流氓软件、木马劫持用户流量的常套手段是DNS劫持,国内三大运营商都有涉及(任何搜索引擎搜索“DNS劫持”都有很多结果)。既通过本地默认DNS服务器,将用户常访问的网站域名解析到己方控制的Web服务器,再通过该服务器端的脚本,向用户浏览的网页插入iframe或Javascript,达到向用户投放广告或去掉竞争对手广告的目的。这种劫持攻击手段相对容易防范。例如用户发现后,通过使用知名的公共DNS(国内如114、阿里,甚至360,国外如Google Public DNS或Open DNS等服务)即可防范。
因为早已经知道运营商默认DNS不可信,所以我一开始就在路由器里设置了使用Google Public DNS(尽管浏览国内网站和使用App Store的体验不太好吧),但没想到还是受到了劫持。在通过Fiddler抓包探测之后,发现事情貌似并不是DNS劫持这么简单。抓包结果请看下图:

首先①访问jd之后,Google Public DNS将jd.com解析到了111.206.231.1,这个IP是www.jdcdn.com(也就是京东在北京联通的CDN机房的IP)②接下来离奇的事情发生了,“京东”服务器竟然返回了HTTP 302 Temporarily Moved,讲用户请求重定向到了http://www.bangshouye.com/page/706?m=r这一URL,页面内容为:
<!doctype html> <html> <head> <title>京东商城</title> <script type=”text/javascript”> var url = ‘http://click.union.jd.com/JdClick/?unionId=4&siteId=A100187118E100021732,&to=http://www.jd.com’.replace(/&/g, ‘&’); ; if (‘r’ == ‘r’) { location.href = url; } </script> <link type=”text/css” rel=”stylesheet” href=”/contents/styles/css.css” /> <style type=”text/css”> html,body{overflow:hidden;margin:0;padding:0;height:100%;} #footer{bottom:0;margin:0 auto;padding:5px 0;} </style> </head>
碍于篇幅这里就不把全部代码贴出来了,除了这些下面还有一些Google Analytics的追踪代码和一些广告联盟的代码。正常来说京东首页的题目应该是“京东网上商城-综合网购首选(JD.COM)-正品低价、品质保障、货到付款、配送及时、放心服务、轻松购物!”,而这个网页就一句“京东商城”,显然是个彻头彻尾的山寨货……
然后③上面代码中的js再次将页面跳转回jd(不过是京东销售联盟的链接click.union.jd.com),随后页面会继续在jd内跳转几次(估计是jd自己的行为),最终就到了这篇文章开头的那个带“尾巴”的网址了。
从以上现象可以推断得知:DNS解析没有问题(Google、阿里、114解析结果相同),因此这种劫持与常见的DNS劫持表现不同(IP地址是京东的,而本应是“京东”的服务器却将用户重定向到第三方的山寨网站)。这里能够想到的最大的可能性就是某种“不可抗力”截断了我和111.206.231.1间的通信,并冒充111.206.231.1给我返回了跳转到第三方网站的HTTP Header。
在排除了本地中木马(使用家中Windows、Mac多台电脑进行过测试)、浏览器流氓插件(同样是多个电脑、多平台、纯净安装的FF、Chrome及纯净模式下的IE进行了测试)的可能性之后,基本可以确定这个不可抗力是来自运营商。
(待续)