请问如何写 iptables 规则来过滤运营商 HTTP 劫持?

2016-08-08 16:39:00 +08:00
 Peanut666
坐标四川移动光纤, DNS 已经全局走 SS 过滤了移动运营商的 53 端口的 DNS 劫持。因为经常用国内网站,所以全局 SS 不现实。
目前存在的问题是京东、华为商城等网站有运营商 HTTP 劫持到返利链接,多次投诉工信部都没有效果,因此想求助大家写个 iptables 规则来过滤 HTTP 劫持,我放在 Openwrt 路由器上。

已经用 wireshark 抓取了两次劫持的过程,
京东劫持 https://www.cloudshark.org/captures/46d552c3e33b
华为商城 https://www.cloudshark.org/captures/aca094df243a

麻烦大家帮忙分析一下伪造的劫持包特征,帮我写个 iptables 规则,感谢大家!

对了,感谢 @KCheshireCat 的思路,可惜我不会写 iptables 规则,就放在这里一下:
[其实可以用 Wireshark 来观察 tcp 连接被劫持的情况
像移动的劫持都是抢答带 ACK , FIN , PSH 标志的 http 302 封包,把你的页面或者 JS 脚本劫持走。
而正常的 http 302 应答包通常并不会同时标记这 3 个标志位。
可以朝这个方向考虑,写成 iptables 规则就是
iptables -A FORWARD -p tcp -m tcp --sport 80 -m u32 --u32 "0>>22&60@10&25=25&&0>>22&60@9>>2&60@0=0x48545450&&0>>22&60@9>>2&60@8=0x20333032" -j DROP
虽然可能会有误杀,但是劫持是再也没看到过]
我试过这个规则,针对四川移动的劫持无效。

看了这篇文章,也是关于流量劫持的
https://security.tencent.com/index.php/blog/msg/81
我也想试试攻击源定位,但是不会用XCAP构造被侦听的数据包(也就是直接发出访问京东首页的HTTP请求TCP包,不需要三次握手)多次发送,如果有朋友懂的话,麻烦指导我一下,感谢!
6045 次点击
所在节点    问与答
23 条回复
kttde
2016-08-08 16:44:19 +08:00
可以从 ttl 值这方面入手
Peanut666
2016-08-08 16:46:45 +08:00
@kttde 是的,我分析了下,伪造的包 TTL 不确定是 64 还是 51
kttde
2016-08-08 17:07:57 +08:00
jd 解析的 IP 地址是 117.131.205.1,那么这个 ip 发给你的第 1 个包的 ttl 值就是真的,Wireshark 序号 5,7,10,11,13 中,5 是最先发的 ttl 值是 51,10 和 11 的 ttl 值都是 74,13 序号往后走的 ttl 值都是 51,那么序号 10 和 11 就是假包,屏蔽 117.131.205.1 发过来的数据包 ttl 值是 74 的就可以了
gamexg
2016-08-08 17:24:39 +08:00
Peanut666
2016-08-08 17:27:05 +08:00
@kttde 谢谢分析,我看了下华为的劫持包是 ttl 值 73 ,再请教一下,按 ttl 来的屏蔽规则如何写呢?
Peanut666
2016-08-08 17:30:31 +08:00
@gamexg 谢谢,我看了下,不知道怎么用起来,囧
KCheshireCat
2016-08-08 21:09:36 +08:00
这个劫持设备发了两个包,两个例子抢答包 ttl 分别是 73,74

一个是 ACK 标志位的并没有携带数据的纯确认包,作用是确认收到了客户端 GET 请求

然后还有一个就是抢答包了,他的标记位是 PSH,ACK.这个包其实已经包含了前面那个包的功能

这个包没有标记 FIN,而 PSH 在 TCP 里常用,不能成为明显的特征

看 IP 头和 TCP 头也没有什么畸形构造,TTL 是个特征但不安定,应该放在最后考虑

这里其实可以思考 IP 头,TCP 头容易成为特征是因为有规范,定长

而劫持设备发送的劫持包通常是预先设置好模板然后填入不同变量,所以可以看作是定长的头部



红框内就是预计可以匹配的部分,让我选的话我会考虑匹配 Set-Cookie: apxlp=1;

然后我们看看抢答的正文



绿色的是设置初始变量,

红色是修改原有 cookie 的到期时间为 1970 年 1 月 1 日零点+1s,而 UNIX 认为 1970 年 1 月 1 日 0 点是时间纪元,并越过了 apxlp=1 这条没有处理

蓝色就是执行跳转的部分了使用 meta 节点做立即跳转,然后对 apple 设备做了特殊对待

使用 Set-Cookie: apxlp=1;作为关键词匹配



匹配成功

对应的 iptables 规则

iptables -A FORWARD -p tcp -m tcp --sport 80 -m u32 --u32 "130=0x5365742d&&134=0x436f6f6b&&138=0x69653a20&&142=0x6170786c&&146=0x703d313b" -j DROP

最后是关于 TTL 的

目前现代系统常见的初始 TTL 值一般是 64,128,256 这 3 种

观察握手时 TTL 可以发现两方到达 TTL 都小于 64,推测初始 TTL 为 64

而劫持包的 TTL 为 73 左右,初始 TTL 不可能是 64

那么要用 TTL 作为特征过滤可以参考这样

iptables -A FORWARD -s 117.78.34.197 -p tcp -m tcp --sport 80 -m ttl --ttl-gt 70 -m ttl --ttl-lt 80 -j DROP
iptables -A FORWARD -s 117.131.205.1 -p tcp -m tcp --sport 80 -m ttl --ttl-gt 70 -m ttl --ttl-lt 80 -j DROP

然而如果服务器使用了 CDN 那么 IP 很可能会变动,但不限制来源 IP,很可能会误伤

以上规则均未做验证,不保证有效
bdbai
2016-08-08 21:38:09 +08:00
为什么不直接投诉运营商呢。变着法子治标不治本啊。
mdzz
2016-08-08 21:44:26 +08:00
向广告商投诉试试
Peanut666
2016-08-08 22:37:48 +08:00
@bdbai 看开头,我写了,多次投诉工信部都没有效果。。。
Peanut666
2016-08-08 22:38:37 +08:00
@KCheshireCat 感谢分析,我回头试试!!
Peanut666
2016-08-08 22:39:30 +08:00
@mdzz 我给广告商 linktech 发邮件投诉了,居然不理我 T_T
bdbai
2016-08-08 23:17:38 +08:00
@Peanut666 投诉工信部之前你也应该先投诉运营商的。
Peanut666
2016-08-08 23:44:45 +08:00
@bdbai 运营商是投诉了滴,但是他们说不知道怎么回事儿→_→装疯卖傻,没办法。
bdbai
2016-08-09 00:09:55 +08:00
@Peanut666 沟通技巧问题😂我开始也这样,直接让他们找领导就解决了。
falcon05
2016-08-09 06:40:49 +08:00
我也是被联通劫持了, http 请求会在 body 结尾加段广告 js, 还好特征比较简单,用 iptables 配合 privoxy 过滤掉了
songw123
2016-08-09 09:39:42 +08:00
我在广东电信网内,也遇到京东之类被劫持到领克特或者亿起发的情况,测试了非常多的办法,最后选择了直接 DNS 切到阿里公共 DNS , 223.5.5.5 ,只有他们家的公共 DNS 没有被污染,其他家的都被污染,不清楚你那边情况如何,供参考
Peanut666
2016-08-09 12:56:04 +08:00
@songw123 我试过各种 DNS 了,但这种不是 DNS 劫持哟,比 DNS 劫持还难搞的 HTTP 劫持。
kttde
2016-08-09 21:43:27 +08:00
ttl 过滤
然而如果服务器使用了 CDN 那么 IP 很可能会变动,但不限制来源 IP,很可能会误伤

这一点比较好解决,直接指定 hosts 域名 ip ,电商网站最多 20 到 30 个,一般只劫持首页
Peanut666
2016-08-10 00:00:39 +08:00
@kttde 好的,谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/297916

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX