Logo
Memu
Action
Document Page

依稀记得,抓包只是简单的下载一个抓包 APP,然后简单配置几下,就能抓取许多应用流量数据。但是随着互联网越来越开放,反而越来越难抓取移动应用的流量包了。究其原因,我发现有以下几点:

  1. Android 7 (Nougat) 以上系统安全性提升 (不再信任用户随便安装的证书),与此同时就是获取 root 权限成本很高(菊厂的手机就连万能的某宝都没有办法)
  2. HTTPS 的普及,开发者的安全意识提升。(感谢 letsencrypt 让普通人开发者也能用上 SSL 证书)


以上比较难搞的就是第一点,开放的 Android 似乎变得有点“不开放”了? 反观 iOS 系统信任用户安装的证书。之所以要提到“用户安装的证书”,这得简单了解一下“抓包”的原理。

抓包原理

准确的说,抓包一般是指抓取应用层的数据 (Application Layer),其中的代表自然是 HTTP 协议了,绝大部分的网站/App 和服务端交换都是走的 HTTP 协议,因此有时候我们抓包一般特指抓取 HTTP 数据包,然后抓不到自然就是指抓不到有关 HTTP 的请求内容。


抓包也可以理解成主动的窃听,为了获取数据内容,必须要想办法在数据流的路径中进行截获。一般的情况是,我没办法在数据的路径上做监听,那我就重定向数据流,让数据主动经过我设置的路径上。这样当数据经过我们设置的“关卡”时,不就任由我们宰割了吗? 具体方法是,配置代理让数据经过代理服务器。但是有些 APP 不是很听话,它选择忽略你指向的道路,这个也简单,可以通过 VPN 建立隧道的方式,让所有的应用都走这条通道,自然包括那些不听话的应用了。(这是因为 HTTP 工作在应用层,而 VPN 工作在更低的链路层,自然所有在链路层之上的协议都需要乖乖的走 VPN 通道,这也是为啥码农的工种越是底层越牛逼吃香)


当然这远远没有结束,虽然我们看起来获取到了所有 HTTP 的流量,但是这些 APP 似乎都不工作了。因为我们为了获取 HTTPS 的内容,抓包软件会伪造一份 SSL 证书糊弄 APP,然后再假装自己是 APP 发送请求糊弄服务器,这样只要两头都糊弄成功,就可以成功拿到数据包。但是显然糊弄失败了,看起来这是一个失败的中间人攻击 (MITM)。一般而言失败的原因都是糊弄 APP 失败了,因为我们伪造的证书,APP 不认!而服务器一般不会对发起方做特别的检查,所以服务器是最好糊弄了 (这也是大部分抓包的目的,糊弄服务器)。为了糊弄 APP,我们一般会将自己伪造的证书添加到系统的信任列表里面,然后一般的 APP 觉得既然系统都信任了也就选择相信我们伪造的证书了,这样我们就达到了自己目的了。但是有些 APP 活成精了,只相信自己肚子里面的证书。这个时候我们也很无奈,只能把 APP 剥开,从它的肚子里面把证书拿出来,然后到时候再把证书甩它脸上,这样下来许多 APP 都乖乖的从我们了。


还有的一些 APP,已经得道修仙了,发明了一套自己的语言,就如同听印度人说英语一样,自带加密属性;这类 APP 一般不怕你抓包,虽然表面上抓到了数据包,但是实际上没有啥卵用。这里 APP 一般都不是我们的目标范围,因为能自创语言的 APP 显然都是惹不起的存在。

常见方式

Android 抓包

最小化环境依赖,无 root,安卓版本大于 7

没有条件我们要创造条件,随着 Android 手机性能普遍提升,高于 7 版本的手机都不会差到哪里去,针对这个可以安装一个虚拟机来进行抓包。推荐使用“vmos pro”,通过创建虚拟机环境,配合“xposed”框架(安装“trustme”模块,基本上能搞定绝大部分的 APP。当然更轻量一点可以使用“太极”、“VirtualXposed”、“平行空间”等轻量化虚拟方案来解决(虽然兼容性有待验证)

  • 本机抓包:HttpCanary。

关键点在于

  • 安装抓包 HttpCanary 软件生成的 SSL 证书
  • 通过“TrustMe”模块让 APP 信任抓包证书


iOS 抓包

iOS 系统可以信任用户安装的证书,因此会简单很多,大部分情况下一个软件就能搞定,这里要推荐免费的“Stream”。如果“Stream”不行,就只能换其它付费软件,或者通过 PC 代理抓包了。

经过测试,有的 APP 没办法通过 Stream 进行抓包,按理说所以流量都会经过 Stream 创建 VPN 通道,但是时候 Stream 没办法识别到特定的流量?或者说,有的 APP 通过绕过 HTTP 代理的方式可以绕过 Stream 的抓包,这点我不是很清楚。

  • 进阶考虑:Surge (穷)

PC 抓包

PC 端抓取移动应用的流量,都需要在手机上设置将流量重定向到 PC 机,然后还需要下载安装软件生成的 SSL 证书。PC 端另一个好处就是,可以很方便的分析查看数据内容,而手机抓包也往往需要导出到 PC 上查看。

Charles (付费好用)

简单配置步骤:

  1. “Proxy”->“Access Control Setting...” 添加允许外部流量进入(这样手机才能走 Charles 流量):

这里添加“0.0.0.0/0”表示允许所有外表设备流量进入。


  1. 手机配置好代理,在 WiFi 设置里面,添加指向电脑的代理:

这里每次切换代理的时候其实比较麻烦的,另一种简单的办法是使用小火箭配置一条 PC 代理的线路,抓包的时候切换到此线路,可以方便切换。


  1. “Help”->“SSL Proxying”->“Install Charles Root Certificate on a Mobile Device or Remote Browser” 进行证书的安装。会提示你操作步骤。

使用“Safari”打开,按照步骤来安装证书。


最后一切准备好之后,就可以打开你要抓取的 APP 进行抓包了。

Finddle (免费也强大)

配置步骤同“charles”,具体可以参考网络相关文章。

Wireshark

Wireshark 虽然功能十分非常的强大,但它并不是专门针对 HTTP 进行抓包的,因此会对新手可能不太友好,尤其是习惯了 Chrome DevTools 的开发者来说。

为了抓获 HTTPS 流量,还需要导入相关证书,因为 Wireshark 并没有内置 MITM 的行为(当然你也可以手动搭建 MITM 环境,然后导入到 Wireshark 进行分析)。它是直接在网卡层面(链路层)进行抓包,甚至可以抓取局域网内其它设备的流量数据。

高级玩法

TODO: 介绍通过 MITM 方式进行渗透测试,比如著名的 Burp Suite 等。

总结

知己知彼,才能更好的解决问题,以上总结了一下移动端 (Android、iOS)设备上抓包的基本思路和方法,基本可以应付市面上大部分的 APP 了。如果一些 APP 只认自己的证书,还需要对 APP 进行开肠破肚,拿到它肚子里面的证书,进行后续操作。不同通篇都是在说如何通过 MITM 方式获取流量,如果更加暴力一点可以让 APP 直接将数据包吐出来,这就涉及如何针对一个 APP 的行为进行定制,也就是所谓的 HOOK,通过改变 APP 内部行为完成抓包的过程。

Footer