本文作者:不染(灼剑(Tsojan)安全团队成员)
App 服务端测试基本就是 Web 安全那一套,但如果抓不到服务器的包?哎~就很难受,空报告?
本篇文章总结了几个比较好用点的 Android 端抓包的姿势,当然远不止这几种。
0x01 知识点总结
因为图比较多,可能翻起来有点麻烦,所以先在这做个简单的知识点总结
- 绕过 root 检测
- 绕过 SSL Pinning
- BurpSuite 抓包
- Fiddler BurpSuite 联动
- Charles Burp 联动
- Proxifier 夜神模拟器 BurpSuite 联动
- Drony BurpSuite 联动
- 绕过双向验证
- 小程序抓包
0x02 绕过 root 检测
一些插件需要在开启 root 的情况下使用,但部分安全措施做的较好的 app 又会对 root 环境做检测,所以尝试绕过 root 检测。
模拟器和测试手机的安卓版本建议在 7 以下,生态较好。
比较常见的是利用 xposed/VitualXposed 的插件来绕过(模拟器中的应用商店也可以安装 xposed 框架)
比如 xposed hide 插件
Magisk 环境下也可以安装 EdXposed 框架
Magisk 面具框架自带 MagiskHide 功能,可以开启来绕过 root 检测
同时也需要在具体抓包的 App 中设置 Hide 属性
0x03 BurpSuite 抓包
BurpSuite 就不多介绍了,先安装证书
浏览器挂上 BurpSuite 代理后,访问 http://burpsuite,下载证书
并把 der、crt 等格式证书转换成 pem 格式
x509 -inform der -in test.cer -out test.pem (记得添加路径)
之后再安装到手机当中
设置>安全>从 SD 卡安装证书
并为证书命名
查看信任的凭据,在用户一栏中查看已安装的证书
成功使用 BurpSuite 抓取流量
Magisk 有个插件叫做 Move Certificates ,该插件可以一键将所有用户证书自动转换为系统区证书
使用方法:所有证书安装为用户证书后,安装此插件,并重启。
后续各软件与 BurpSuite 联动的时候,都需要注意各软件之间的 IP 及端口保持一致。
0x04 绕过SSL Pinning
4.1 什么是 SSL Pinning:
开发者预先把证书相关信息预置到 App 中再打包,这样在 https 通讯过程中 App 本地可以与服务器返回的 CA 证书可以做合法性校验,如果发现不一致,那么可能就是由于中间人攻击(比如 Fiddler/Charles 抓包工具),App 客户端可以终止 https 链接。而在新版本的系统规则中,应用只信任系统默认预置的 CA 证书,如果是第三方安装的证书(比如 Fiddler 安装的)则不会信任
4.2 一句话总结 SSL Pinning 原理:
将服务端证书相关信息打包在客户端里,在进行通信时,对比客户端和服务端证书是否一致。
4.3 绕过 SSL Pinning 验证
4.3.1 Xposed插件
下载 JustTrustMe 安装包并安装到手机里,在 Xposted 中激活并重启手机,就可以抓取手机中的流量。
SSLUnpinning 2.0 插件和 JustMePlush 插件当然也可以
4.3.2 使用 Objection 绕过
Objection 是一个基于 Frida 开发的命令行工具,它可以很方便的 Hook Java 函数和类,并输出参数,调用栈,返回值。
因为 Objection 是基于 Frida 的所以必须先安装 Frida 然后才能安装 Objection
数据线连接手机后打开调试模式(PC 端已有 adb 环境的前提下)
先用 adb 命令查看有几台设备
把下载好的 frida-server 拷贝到手机中
进入到手机中,并提升为 root 权限,启动 frida-server 脚本
frida-ps -U
命令查看,下图所示即为正常启动
使用adb shell pm list packages
查看手机中的包名及数量
需要关闭手机上 Magisk 的 magisk hide 功能(不关闭会有冲突)
使用命令:objection —gadget 包名 explore
此时 Objection 将注入到目标应用程序上
关闭 app 的 SSL 校验:android sslpinning disable
上图所示即为关闭成功,下图所示为成功抓取流量
0x05 Fiddler BurpSuite 联动
Fiddler 是一款非常专业的 http 协议调试代理工具,这款软件支持众多的 http 调试任务,包括通过捕获浏览器的会话以及使用它捕获 HTTPS 会话等
利用 Fiddler 与 BurpSuite 联动连抓取流量
首先对 Fiddler 进行设置,在 HTTPS →解密 HTTPS 流量→操作→根证书导出到桌面
接着将 FiddlerRoot.pem 安装到手机中
可以看到,Fiddler 的根证书安装好了
接着需要信任根证书
然后在连接→ Fiddler 在端口上侦听,默认为 8888 即可
接着在手机中,把网络的 IP 设置为 10.170.0.246,端口设置为 8888
在 Fiddler 的网关→手动代理配置,设置代理为 10.170.2.246:8080
BurpSuite 的 IP 及端口号与 Fiddler 保持一致
成功接收到转发的流量
0x06 Charles BurpSuite 联动
Charles 是常用的网络封包截取工具,Charles 通过将自己设置成系统的网络访问代理服务器,使得所有的网络访问请求都通过它来完成,从而实现了网络封包的截取和分析。
可以利用 Charles 转发流量,配合 BurpSuite 做联动抓包使用。
将 charles 证书保存到本地,选择 help→SSL Proxying→Save Charles Certificate
设置>安全>从 SD 卡安装证书
安装成功后如图所示
默认 charles 只可以抓取 http 协议的包,https 的更安全,需要如下配置:
菜单栏 Proxy–>SSL Proxying Setting–>选择 SSL Proxying——>点击 add
在弹框中 port 里填写 443(443 代表通用 https 端口号), host 中的*代表抓取所有地址的包
第一次设置成功代理后,随便打开一个需要网络的应用,PC 端会自动弹出以下提示,选择 allow 允许 Charles 代理
需要和 BurpSuite 联动,需要额外添加代理
菜单栏 Proxy–>External Proxy Settings–>选择 Use external proxy servers
抓取 http 包则设置 Web Proxy(HTTP)选项(IP 及端口与 BurpSuite 保持一致)
抓取 https 包则设置 Secure Web Proxy(HTTPS)选项(IP 及端口与 BurpSuite 保持一致)
成功接收到转发流量
0x07 Proxifier 夜神模拟器 BurpSuite 联动
Proxifier 软件是一款极其强大的 socks5 客户端,同时也是一款强大的工具。Proxifier 支持 TCP,UDP 协议,支持Xp,Vista,Win7,支持 socks4,socks5,http 代理协议,可以让不支持通过代理服务器工作的网络程序能通过HTTPS 或 SOCKS 代理或代理链。
利用 Proxifier 代理 PC 中模拟器的进程流量,并与 BurpSuite 联动来抓包。
代码语言:javascript复制
代码语言:javascript复制
代码语言:javascript复制
从任务管理器中查看夜神模拟器的进程,查看文件所在的位置
在 Proxifier 中设置夜神模拟器进程,并注意代理设置所在第一行
成功抓取夜神模拟器的进程流量
0x08 Drony BurpSuite 联动
Drony 支持 App 定向的 http,https 抓包。手机上装的 app 多了,会很多数据上来,要加过滤规则,正式环境测试环境都要加连上了代理,有些普通使用的 app (非抓包 app)会没法使用,会出现经常要设置代理,关闭代理,需要又要设置(有些手机会保存代理 ip 还好,不保存的还要每次手写)。
Drony 可以解决上述痛点,不需要手机在 wifi 里设置代理。可以通过该 app 直接指定目标 app 才走代理,对其他 app 不可见。
将手机上的所有流量都重定向到 drony 自身
这样 drony 就可以管理所有手机上的网络流量,然后对手机上不同 APP 的流量进行单独配置,再转发到 BurpSuite上。
电脑开启 wifi,并查看
将 BurpSuite 的 IP 及端口设置为此
再打开 Drony 后往右滑动,打开设置界面,选择无线网络
选择 dronyTest
设置好主机名和端口后,代理类型选择手动(BurpSuite 的 IP 及端口也设置为如此,保持统一)
过滤默认值默认为允许全部,点击编辑过滤规则
添加过滤规则,其中行动一栏选择本地代理链全部
过滤规则添加好如下图所示
返回至日志模块,开启 Drony
手机谷歌浏览器访问 www.baidu.com,成功接收到转发流量
0x09 绕过双向验证
9.1 一句话总结双向证书验证
当服务器启用了双向认证之后,除了客户端去验证服务器端的证书外,服务器也同时需要验证客户端的证书,也就是会要求客户端提供自己的证书,如果没有通过验证,则会拒绝连接,如果通过验证,服务器获得用户的公钥。
9.2 解决思路:
9.2.1 反编译找证书私钥
- 先通过工具反编译 APK 文件,找到证书的文件。一般证书文件可能会放在 assets 或者 res 目录下可以直接搜索证书文件
- 证书文件格式后缀如:crt、cer、p12、pfx等等。
- 找到证书文件后打开它会发现是需要私钥的。拿到证书文件名后,在反编译好的源代码中查找相关函数,找到私钥。
- 导入输入私钥后的证书到 burpsuite 后,即可正常抓包。
可以关键字搜索 “key”、“password”、“ssl” 等关键字,快速定位到私钥位置。 难点还是反编译后遇到难脱的壳和代码混淆的问题。
9.2.2 Hook SSL 对数据解密数据的地方
虽然 https 在传输过程中是加密的,但在终端显示的时候,必然会解密,不然 APP 上都没法显示了。
所以如果能知道安卓解密 SSL 加解密是哪个类, Hook 这个类, 类里相关方法的输入输出肯定就是传输的明文数据。
0x10 小程序抓包
10.1 绕SSL Ping、防代理抓包
基本步骤跟上述差不多,姿势足够用了。如果还不行的话,需要写 Hook 代码来 Hook 掉函数
10.2 双向验证绕过
基本步骤与上述差不多,只是小程序访问后,会把包下载到本地,可以破解本地小程序包来搞定。
小程序包下载机制:
当点开一个微信小程序,如果本地这个文件夹下找到即将运行的小程序,会从微信服务器下载到本地,在以后的某个时刻又运行这个小程序,运行时,微信服务器会通知有没有小程序新版本,如有新版本,会在后台静默下载,小程序继续运行,新版本要到下一次运行才会启用,这就是微信小程序的更新机制。
打开微信,打开想反编译的微信小程序,在小程序打开后,就可以切换到 RE 或 MT Plus 文件管理器去找源文件。
从根目录开始。/data/data/com.tencent.mm/MicroMsg/.../appbrand/pkg/,路径中有一段...,这里表示不确定具体一个,一般是很长的数字和字母组成的文件(如下图所示)
对于小程序 wxapkg 包的反编译主要是使用 js 插件 wxappUnpacker。
随着微信对于小程序的加密、混淆打包、分包及插件机制,小程序反编译的成功率大大降低
之后就是常规的破解小程序包的源码,找到证书,并根据证书名称找到私钥,再安装到抓包软件上的常规套路。
0x11 结语
这几种抓包姿势基本够用,或者换一些工具,比如 HttpCanary、Packet Capture、r0capture 等等,基本也是安装软件>下载证书>转换格式>安装证书>配置 IP、端口>开始抓包调试。如果还不够用,那可能就需要 Java 代码层面进行函数 hook,篇幅所限,以后有机会再介绍给各位大佬。