利用降级攻击对长连接App抓包 Posted by xmpace on 2019-08-05

出于研究的目的,我们经常需要对 App 抓包,抓包的方法大家都知道,装个 Charles,在设备上安装好根证书,设置好代理就可以了。

但有这么一类 App,不管你怎么设置,在 Charles 上就是抓不到请求,不止是抓不到内容,是连请求根本都看不到。比如某款国民外卖 App 就是这样。

为什么呢?如果说抓到请求解不出内容,那可能是证书的问题,但连请求都抓不到,那就只有一个可能,就是它压根就不是 Http(s) 通讯,否则的话,Charles 一定能抓到。

稍微研究一下,我们就会发现,这种 App 其实用了一种叫移动长连接的技术,这方面,美团技术团队发表过一篇 美团点评移动网络优化实践。移动长连接是啥意思呢?就是移动端与服务器建立好 TCP 连接后,这个连接就不断开了,后续的请求都走该连接发送和接收。这个长连接,一般都会用自己定义的协议实现,而不会直接在上面跑 Http 协议,因此,使用 Charles 一类的 Http 抓包工具也就抓不到请求了。

问题现在清楚了,要如何解呢?我们从文章中可以知道,其实长连接并不是一开始就用上了的,App 首先还是使用的 Http 请求,后来为了优化端到端的成功率才上的长连接,而且,为了以防万一,技术团队是做了降级方案的(换位思考,是你的话你也会做对吧^_^)。

由于客户端的请求都放在 TCP 通道上进行,当代理长连服务器需要升级或者由于极端情况发生了故障时,将会造成客户端的整体网络服务不可用。为了解决这个问题,我们准备了 Failover 降级方案。当 TCP 通道无法建立或者发生故障时,可以使用 UDP 面向无连接的特性提供另一条请求通道,或者绕过代理长连服务器之间向业务服务器发起 HTTP 公网请求。本文的后面章节有展示 Failover 机制的实际效果。

正是这个降级方案,给了我们机会,既然长连不通时会降级到 Http,那我们想办法切断 App 与长连服务器之间的连接就可以了。这可以通过屏蔽长连服务器的 IP 来实现。那么问题来了,怎么找到长连服务器的 IP 呢?

App 与长连服务器之间的包有什么特征呢?首先正常通信肯定是 TCP。其次,由于是长连,所以客户端是不会主动去断开这个连接的,也就是说是不会发送 FIN 包的(但不排除刚打开时跑马测速后会断开)。有了这两个特征,我们就可以开始筛选 IP 了。电脑打开 Wireshark ,开个热点给手机,找出符合这两个特征的 IP 后屏蔽就可以了。笔者的路由器刷的 Padavan 系统,可以直接用 iptables 屏蔽,所以就在路由器上屏蔽了。

iptables

好,来看下效果。

Charles

怎么样?显形了吧~