先说一下解决方法吧,毕竟日子还是要过的
- 参考下面的分析,可以看出,劫持主要是通过tcp会话劫持搞定的。主要特征是,tcp包的flag是PSH+ACK。包中含有302 Found的字符串
- 我们可以写一条iptables规则
iptables -N check_for_9011
iptables -I INPUT -p tcp -m tcp --sport 80 --tcp-flags FIN,SYN,RST,PSH,ACK,URG PSH,ACK -m string --string "302 Found" --algo bm --from 45 --to 80 -j check_for_9011
iptables -I check_for_9011 -m string --string "劫持包中其他特征" --algo bm --from 70 –to 180 -j DROP
以上iptables 规则检查源端口为80,且tcp-flags 为PSH,ACK的包,如果返回包中包含:”302 Found”,然后丢给check_for_9011 chain ,这个chain 会有另外一个规则额外处理,会匹配是否含有" 劫持包中其他特征"的字样,如果发现丢弃该包。
0x01 症状表现
访问小米论坛,底部出现您有一条未读消息,侧面有领红包的标志。眉头一紧,发现这事蹊跷哇。于是乎抓包分析一下,权当技术积累,还望同志们一起去举报这帮逼养的。
0x02 抓包分析
首先在wireshark中查看html页面。xiaomi论坛的响应采用chunked+gzip编码。wireshark并不能自动解码。如图
解码方式如下:
- 显示与保存数据,选择原始数据
- save as 保存下来
- 使用010editor 将从开头到13fd那里的内容,都删除掉
- 使用gzip解压
- gzip会出错的,但是我们可以强行解压
gzip -dc 2.gz
然后我们可以开始分析了,发现页面中并无不妥的地方。顿时陷入僵局。于是我们换一个角度分析,查看一下所有的http response。如图
发现一个很奇怪的地方,为什么我们访问一个application/javascript的东西,被302跳转了呢。于是我们follow tcp看一下,如图
我日,竟然有两个http响应头!!第一个给我返回302跳转到一个网站。而后面的http 200才是小米论坛服务器的真正响应。
原理很简单,tcp劫持嘛。我们可以看一下
图中,277是恶意tcp响应,296是服务器正常响应。277恶意数据包伪造tcp的序列号,与我们建立正常连接。等到296正常响应到达的时候,发现tcp已经全乱了。于是被tcp out-of-order了。
那我们该如何发现这种情况呢。可以对比一下两个ip包
![7-1.png](https://upload-images.jianshu.io/upload_images/3190992-a11febd1f5449a0a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
可以对比一下,正常ttl是35,但是被恶意劫持的ip包的ttl是35。一般ttl出现较大的变动,都是被恶意劫持了。
0x03 网站分析
首先回到上面那个302跳转的js,乍一看,这是小米论坛的文件哇。但是仔细一看,发现js文件底部被加了新东西。如图
![8.png](https://upload-images.jianshu.io/upload_images/3190992-21cfa26bb85bf681.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
可以看出,被插入两个script,一个iframe。地址分别是https://p.chinadmp.cn/apia/s/1101/061afed5b9a6.js
,https://chencheng-js.xinterface.cn/x02_1808171813.js
和https://m.58futurism.cn/cnzzOp/zkl.html
。底部还被插入一个img标签,地址是http://yumcs.xiaohuau.xyz:7002/api/v1/goELK/urlES.gif
下面分析img标签,在wireshark中,我们可以看到,会访问http://yumcs.xiaohuau.xyz:7002/api/v1/goELK/urlES.gif?title=%E7%B1%B3%E5%85%942%EF%BC%8C%E5%B0%8F%E5%AF%BB%E5%84%BFs1%EF%BC%8CT1%E7%9A%84%E5%8C%BA%E5%88%AB%EF%BC%9F%20-%20%E5%B0%8F%E7%B1%B3%E7%A4%BE%E5%8C%BA%E5%AE%98%E6%96%B9%E8%AE%BA%E5%9D%9B&ua=TW96aWxsYSBBcHBsZVdlYktpdCBDcmlPUyBNb2JpbGUgU2FmYXJp&url=http%3A%2F%2Fbbs.xiaomi.cn%2Ft-14092153&uid=a4badb264f88
这个地址。主要是上报我们访问的地址与网页的title,推测可能是方便统计。
第一个script,访问https://p.chinadmp.cn/apia/s/1101/061afed5b9a6.js。
分析如下:
-
判断被劫持的网站是否在列表中,如果在,就停止劫持。
可以看出,都是大站,如果劫持,则很容易被发现,导致被投诉。
-
执行一段eval(function (p, a, c, k, e, d)的加密js代码。解密方式如下
- 将eval改成console.log
- 将该段代码,复制带浏览器中运行一下,即可得到解密代码
- 解密后代码如下,很多函数
-
执行功能代码,为了方便,我还是加注释
var G = {},
slotcode = "061afed5b9a6",
cnzz_domain = "https://p.chinadmp.cn";
if (win["yx" + slotcode]) {
return
}
win["yx" + slotcode] = true;
G.configP = {
ast: 100,
c_time: 10,
is_cnzz_url: 1,
pos: 3,
s_count: 0,
s_intvl: 0,
s_rate: 100
};
I(); //设置G的ajax参数
C(); //设置cookie参数
D();//设置劫持的html参数等
L();//劫持结果上报给服务器
vertion = '2018-3-2 14:32:19'
})(window, document, navigator)
} catch (e) {
var _a = document.createElement("script");如果劫持出错的话,则向服务器上报出错信息,方便随后定位
_a.type = "text/javascript";
_a.src = "//p.chinadmp.cn/apia/logstores/ad_req_error/track?APIVersion=0.6.0&error=" + (+new Date()) + "|" + "061afed5b9a6" + "|v3|" + window.location.href + "|" + e.message;
_a.style.display = "none";
document.body.appendChild(_a);
第二个script,访问https://chencheng-js.xinterface.cn/x02_1808171813.js
,分析如下
- 解密代码
将其格式化后,复制到浏览器运行即可。在这里我们可以看出,大部分代码都被混淆。这里只能硬刚去分析了。不过,主要行为,其实都是引用最开始的那串数组中的字符串。对字符串解码,可以看出大部分操作都在这里。这里主要是判断一下,针对微信的劫持。 - 加载两个script
- 第一个script,访问http://chencheng-js.xinterface.cn/asi_1809131803.js
可以看出,原来是app下载推广链接。这里将控制手机,访问列表中的app下载地址。 - 第二个script 访问http://chencheng-js.xinterface.cn/x02hx_20180911627.js
主要是判断用户的浏览器,然后跳转到优酷!!然后弹出领红包!!!!!
至此,我们就分析完了。通过tcp劫持,并且只劫持小站页面。确实很难让人发现。
- 第一个script,访问http://chencheng-js.xinterface.cn/asi_1809131803.js
0x04 防范
- 远离小宽带公司
- 使用openwrt过滤掉非正常TTL的IP数据包
0x05 后记
最开始的那个关于js文件的302跳转,原理是将原js地址,经过base64编码,放在参数中。可能会导致ssrf。