这个劫持设备发了两个包,两个例子抢答包 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,很可能会误伤
以上规则均未做验证,不保证有效