依稀记得,抓包只是简单的下载一个抓包 APP,然后简单配置几下,就能抓取许多应用流量数据。但是随着互联网越来越开放,反而越来越难抓取移动应用的流量包了。究其原因,我发现有以下几点:
以上比较难搞的就是第一点,开放的 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 显然都是惹不起的存在。
最小化环境依赖,无 root,安卓版本大于 7
没有条件我们要创造条件,随着 Android 手机性能普遍提升,高于 7 版本的手机都不会差到哪里去,针对这个可以安装一个虚拟机来进行抓包。推荐使用“vmos pro”,通过创建虚拟机环境,配合“xposed”框架(安装“trustme”模块,基本上能搞定绝大部分的 APP。当然更轻量一点可以使用“太极”、“VirtualXposed”、“平行空间”等轻量化虚拟方案来解决(虽然兼容性有待验证)
关键点在于
- 安装抓包 HttpCanary 软件生成的 SSL 证书
- 通过“TrustMe”模块让 APP 信任抓包证书
iOS 系统可以信任用户安装的证书,因此会简单很多,大部分情况下一个软件就能搞定,这里要推荐免费的“Stream”。如果“Stream”不行,就只能换其它付费软件,或者通过 PC 代理抓包了。
经过测试,有的 APP 没办法通过 Stream 进行抓包,按理说所以流量都会经过 Stream 创建 VPN 通道,但是时候 Stream 没办法识别到特定的流量?或者说,有的 APP 通过绕过 HTTP 代理的方式可以绕过 Stream 的抓包,这点我不是很清楚。
PC 端抓取移动应用的流量,都需要在手机上设置将流量重定向到 PC 机,然后还需要下载安装软件生成的 SSL 证书。PC 端另一个好处就是,可以很方便的分析查看数据内容,而手机抓包也往往需要导出到 PC 上查看。
简单配置步骤:
这里添加“0.0.0.0/0”表示允许所有外表设备流量进入。
这里每次切换代理的时候其实比较麻烦的,另一种简单的办法是使用小火箭配置一条 PC 代理的线路,抓包的时候切换到此线路,可以方便切换。
使用“Safari”打开,按照步骤来安装证书。
最后一切准备好之后,就可以打开你要抓取的 APP 进行抓包了。
配置步骤同“charles”,具体可以参考网络相关文章。
Wireshark 虽然功能十分非常的强大,但它并不是专门针对 HTTP 进行抓包的,因此会对新手可能不太友好,尤其是习惯了 Chrome DevTools 的开发者来说。
为了抓获 HTTPS 流量,还需要导入相关证书,因为 Wireshark 并没有内置 MITM 的行为(当然你也可以手动搭建 MITM 环境,然后导入到 Wireshark 进行分析)。它是直接在网卡层面(链路层)进行抓包,甚至可以抓取局域网内其它设备的流量数据。
TODO: 介绍通过 MITM 方式进行渗透测试,比如著名的 Burp Suite 等。
知己知彼,才能更好的解决问题,以上总结了一下移动端 (Android、iOS)设备上抓包的基本思路和方法,基本可以应付市面上大部分的 APP 了。如果一些 APP 只认自己的证书,还需要对 APP 进行开肠破肚,拿到它肚子里面的证书,进行后续操作。不同通篇都是在说如何通过 MITM 方式获取流量,如果更加暴力一点可以让 APP 直接将数据包吐出来,这就涉及如何针对一个 APP 的行为进行定制,也就是所谓的 HOOK,通过改变 APP 内部行为完成抓包的过程。