Board logo

标题: 绕过运营商HTTP劫持 [打印本页]

作者: linda    时间: 2016-9-29 08:54     标题: 绕过运营商HTTP劫持

中国的网络是奇葩的,原因之一是有奇葩的屌丝运营商。
许多小运营商(二级运营商、三级运营商、N级运营商)为了节省成本,会使用缓存系统。 这个缓存系统可以认为是一种CDN,如果做得好的话,不仅会节省成本,也会提高用户体验, 例如许多小区里大家看优酷视频从来不会缓冲,下载速度都有3MB/s以上的速度。 然而,这些缓存系统并不是CDN,而是一种非常没有节操的黑盒子。
许多用户和开发者都为此非常头疼。例如:
其劫持的手段也是非常的无节操的,主要受益于郭嘉的某墙开发的成果。其劫持原理大致如下:
是的,这正是伟大的墙发送RST的方法。
我们看一个例子,正常的请求应该是这样的:
$ curl -I http://mirrors.ustc.edu.cn/ubuntu/dists/lucid-updates/main/binary-amd64/Packages.bz2HTTP/1.1 200 OKServer: nginx/1.2.1Date: Thu, 19 Dec 2013 09:54:42 GMTContent-Type: text/plainContent-Length: 724863Last-Modified: Thu, 19 Dec 2013 09:02:00 GMTConnection: keep-aliveAccept-Ranges: bytes
被劫持的请求是这样的:
$ curl -I http://mirrors.ustc.edu.cn/ubuntu/dists/lucid-updates/main/binary-amd64/Packages.bz2HTTP/1.1 302 FoundConnection: closeLocation: http://59.108.200.39/files/512100000196E4FC/us.archive.ubuntu.com/ubuntu/dists/lucid-updates/main/binary-amd64/Packages.bz2
通常缓存服务器的IP是有限的,因此我们可以这样绕过运营商的劫持,在网关(或自己机器上)添加一条iptables规则:
iptables -A FORWARD -p tcp --sport 80 -m string --string "Location: http://59.108.200.39" --algo bm -j DROP
该规则的意义是,如果某个HTTP响应包(这里并没有真正判断是否HTTP,仅分析来自80端口的包)中含有 Location: http://59.108.200.39 字样,就直接丢弃。这样后续S真实的响应包就能被客户端接收,从而保证正确的通信。
注意,如果是在自己的机器上,则将FORWARD替换成INPUT。
这里我们要感谢该运营商没有像某墙那样的没节操,某墙在向C发送RST的同时,也向S发送了RST,而该缓存服务器并没有 向S发送RST,彻底破坏tcp通信。
原文:https://onebitbug.me/2013/12/19/escape-isp-http-hijacking/




欢迎光临 中神通公司技术论坛 (http://trustcomputing.com.cn/bbs/) Powered by Discuz! 6.0.0