前言
每当遇到一些 APP 渗透测试项目的时候,抓不了包的问题令人有点难受,但是抓不了包并不能代表目标系统很安全,那么接下来我会整理一下目前我所了解到的一些抓包方法
- 1、Burpsuite
- 2、Fiddler
- 3、Burpsuite + Fiddler
- 4、小黄鸟 HttpCanary
- 5、Charles
- 6、Charles + Burpsuite
- 7、Postern + Charles + Burpsuite
- 8、Frida + Xposed + Objection + Burpsuite
- 9、Frida 写 Hook 代码来抓包
以下抓包测试请确保手机和电脑是处于同一个局域网下
1、使用 Burpsuite 对 APP 进行抓包
环境:
- Burpsuite Professional v2021.2
- Pixel3 Android11 、已 root + Xposed
在 Burpsuite 里面 Proxy — Options — Proxy Listeners — Add
然后在Speciffic address
选择172
网段的那个 IP 地址(即本机局域网 IP 地址)
在手机里面网络设置也要设置 手动代理模式
,输入的 IP和端口
都要与 Burpsuite 一样
然后在手机浏览器访问 https://burp
这个地址,去进行下载并安装 burp 证书,因为抓取 HTTPS 流量是需要证书的,点击 CA Certificate
即可进行下载
下载之后要对证书文件后缀名进行更改,因为手机是无法打开 .der
后缀的文件,所以要吧 .der
改为 .cer
,然后再进行安装证书
那么安装之后就可以进行抓取 APP 数据包了
2、使用 Fiddler 对 APP 进行抓包
环境:
Fiddler v5.0.20204.45441
Pixel3 Android11 、已 root + Xposed
1、在 Fiddler 里面 Tools — Options
2、在 options 弹框中切换至 HTTPS
,勾选图中标记的 2 个选项并点击 OK
3、勾选后会弹出安装证书的提示,根据提示一直点击 是
即可安装成功
4、接着在Tools — Options — Connections
,端口写 9999
(可随意更改),并勾选 Allow remote computers to connect
,点击 OK
5、重启 Fiddler ( 修改fiddler配置要重启后才能生效
)
6、修改手机网络设置
7、在浏览器访问上面设置的 IP 地址和端口号,我这里是 172.20.10.5:9999
(这里要根据实际情况),然后 FiddlerRoot certificate
进行下载证书,并自行安装
那么安装之后就可以进行抓取 APP 数据包了
3、使用 Burpsuite + Fiddler 进行对 APP 进行抓包
配置 Burpsuite 使用的代理监听是 127.0.0.1:8080
在 Fiddler 里面 Tools — Options — Gateway
配置的代理监听是 127.0.0.1:8080
(这里的配置与 Burpsuite 代理一致)
接着在 Tools — Options — Connections
,端口写 9999
(可随意更改),并勾选 Allow remote computers to connect
,点击 OK
修改手机网络设置
也就是说从手机的流量经过 Fiddler
进行转发到Burpsuite
4、使用小黄鸟 HttpCanary 对 APP 进行抓包
环境:
HttpCanary v3.3.6
Pixel3 Android11 、已 root + Xposed
首先安装 HttpCanary APP 应用
HttpCanary 支持 HTTP/HTTPS/HTTP2 网络数据包的抓取和分析,其实和 Charles
类似,要抓取 HTTPS 需要使用 MITM 中间技术对 TLS/SSL 数据包进行解密以及明文输出,因此需要安装自签的 CA 证书
这里要提一下 Android 系统默认对证书信任证书的问题
因为我的 Pixel3 手机是已经 root 了,而且是 Android11 系统,在安卓 7.0 之前系统,直接下载证书装入即可,安卓 7.0 及以上系统对于证书的安全策略做了修改,意味着,从 sdcard 安装用户级 CA 将无法拦截应用流量。我们需要将证书命名为计算出的哈希值后缀 .0
或者直接在手机里面的 用户凭据
可以看到后缀 .0的证书文件
名字,然后导入到根证书目录:/system/etc/security/cacerts
让系统默认可信任。因此安装证书的方式也有所不同,默认它是安装在用户那里的。
首先按照我下面的图顺序进行安装证书
先导出 HttpCanary根
证书文件 .pem
点击它,即可完成安装证书
那么这里就看到它是安装在用户那里的,但是由于我的设备是已经 root 了,要把这个证书安装在 系统
那里才能进行抓取 HTTPS 流量
那么这时就需要把证书的文件移动到系统目录下就可以了,这里选择导出 System Trusted(.0)
那么就把证书进行移动到系统证书目录 /etc/security/cacerts/
在 Android 10 以及以上安装证书到 /system/etc/security/cacerts/
会出现 system 无法写入使用 mount 报错如下:
1 | '/system' not in /proc/mounts |
由于 Android 10 采用了某些安全策略,将系统分区 /system挂载为只读
,就算你 root 了也没用,无法写入系统分区也就无法导入系统证书,在使用 HTTPCanary 这样的软件抓包分析的时候,很多 app 只认系统证书,不认用户证书
遇见此类情况有两种方式解决:
1、在 Magisk
里面安装 Move Certificates模块
,该插件可以一键将所有用户证书自动转换为系统区证书
使用方法:所有证书安装为用户证书后,安装此插件,并重启。
2、创建一个新的挂载点来覆盖 这种方式是内存覆盖的方式所以手机重启后失效。(想要持久化需考虑搞一个开机启动服务)
1 | # 创建一个临时目录,保存当前证书 |
再进来这个看证书的界面就已经看到已经把 用户
的证书安装在 系统
那里了
虽然 HttpCanary
是一个很不错的抓包工具,但是它并不能跟其他抓包工具进行一个联动转发抓包,所以当渗透测试人员在使用它进行抓包之后,可以直接在手机上进行修改数据包进行测试,但是可能在手机上工作效率没那么高,于是就把要测试的数据包复制出来到 Burpsuite 上进行修改并发包,这个过程也会浪费很多时间。
下面是 HttpCanary 的工作原理
HttpCanary 采用 VPN 的方式将网络包转发给本地代理服务器,本地代理服务器将数据包转发虚拟网关,由虚拟网关进行不同策略地拦截和协议解析,最后再将数据发送给终端
最重要的一层就是虚拟网关 Virtual Gateway
,需要对协议进行鉴定解析等等,包括数据包的拦截注入都是在这一层处理的,比如 HTTPS 的中间人(MITM)解析出明文包等
因此从上图观察它的工作原理进行分析之后,让我寻找到另一种方式抓包(它的工作方式也和 HttpCanary 有点相似
)可以用它来代替 HttpCanary
—— Postern + Charles + Burpsuite
组合,至于怎样操作,可以在文章下面 7、使用Postern + Charles + Burpsuite进行对APP进行抓包
进行详细阅读
5、使用 Charles 对 APP 进行抓包
环境:
Charles v4.6.2
Pixel3 Android11 、已 root + Xposed
charles 是一款非常优秀的抓包工具,全平台支持,在 mac,windows,linux 上都可以使用,既可以抓取 web 端的包,也可以抓 app 端的包
charles 主要的功能包括如下几点:截取 Http 和 Https 网络封包。
支持重发网络请求,方便后端调试。
支持修改网络请求参数。
支持网络请求的截获并动态修改。
支持模拟慢速网络。
代理服务器的工作原理如下所示:
客户端发起请求,请求通过 charles 转发给服务器,服务器返回响应,响应通过 charles 转发给客户端。
charles 所起的作用就相当于信使,把信息从 A 传递给 B,并且把回信从 B 传递给 A,正因为他这个信使的工作,所以他对信息的内容了如指掌(不管是原信还是回信),正因为如此,charles 也就可以篡改信息的内容,即篡改请求和响应。
Charles 下载地址:
然后自行安装之后,要对它进行激活
注册码生成地址:
激活 Charles
在 Help->Registered 输入 key 和生成的激活码即可
设置代理,在 Proxy — Proxy Settings
( 注意:此时我的Windows Proxy是去掉对勾的,因为这里我是想在PC端抓手机端的包,所以没必要打开电脑的本地代理
)
填入代理端口 8888
(或者自定义,但不能和系统已占用端口冲突),并且勾上 Support HTTP/2
和 Enable transparent HTTP proxying
,点击右下角 OK 即可
然后分别在 PC 端和手机端安装证书
选择 Help — SSL Proxying — Install Charles Root Certificate
就可以下载安装上 PC 端了
证书存储选择 受信任的根证书颁发机构
接下来再给手机端安装证书,步骤如下:
选择 Help — SSL Proxying — Install Charles Root Certificate on a Mobile Device or Remote Browser
点击后会弹出窗口提示设置的方法,按照提示在手机端将代理设置为电脑的 ip:8888( 我这里是192.168.1.251:8888
),这里要先确保手机和电脑连接同一个无线网络
。然后在手机的浏览器打开 http://chls.pro/ssl
,按提示下载证书即可。
如果 Charles 有弹出提示,一定要点击 Allow
首先按照我下面的图顺序进行安装证书
找到选择刚刚下载的证书文件,点击即可完成安装
它也是安装在 用户
那里,但是由于我的设备是已经 root 了,要把这个证书安装在 系统
那里才能进行抓取 HTTPS 流量
但是移动证书的前提要知道证书安装之后的证书文件是被命名为什么,于是可以在 用户凭据
这里可以看到
文件为 b905ae73.0
,它目前是在用户目录下 /data/misc/user/0/cacerts-added/
然后把它复制到 /etc/security/cacerts/
系统目录下
HTTPS 解析
然后在 Proxy — SSL Proxying Settings
进行 SSL Proxying Settings 设置
勾选 enable SSL Proxying 复选框代表开启 SSL Proxying 代理,并在 include 栏中添加域名和端口号。include 中的列表项代表 Charles 能够展示这些域名的 SSL 请求和响应的明文。
并且说明中也提示了我们 Charles 要想使用 SSL Proxying 代理,需要进行 SSL Certificates,即证书签名。这个我们在上面已经完成了。
Stop SSL Proxying
按钮可以控制 SSL 代理的开关。(必须要开启SSL Proxying)
到此,PC 端的设置都已经配置好了,然后就能进行抓包了
6、使用 Charles + Burpsuite 进行对 APP 进行抓包
选择勾选 Proxy — External Proxy Settings
就是要将 Charles 作为手机端的代理,再由 Charles 将包转发给 burpsuite,所以对于 Charles 来说,burpsuite 就成了一个 External Proxy Server
—— 外部代理服务器
勾选 HTTP
和 HTTPS
代理,这里 HTTP
和 HTTPS
的代理服务器地址都是 127.0.0.1:8080
(这里的配置与 Burpsuite 代理一致)
已经设置了外部代理了,就必须打开 burp(当然了主要是要打开 burp 中对 127.0.0.1:8080 的监听),否则就会出现 连不上网了
的现象。在 burp 的菜单栏中的 Proxy 选项下的 Options 中打开 127.0.0.1:8080
的代理监听(默认应该是已经打开的),在 Intercept 中关闭请求拦截。
完成上面的配置步骤后,从手机上打开浏览器搜索内容,应该已经可以在 Charles 窗口左侧的列表中找到想抓的包,并且也可以看到数据包从 Charles 转发到 Burpsuite 了
7、使用 Postern + Charles + Burpsuite 进行对 APP 进行抓包
在实际抓手机 App 包场景中,有很多种方案,经典的就是 Fiddler
、 Burpsuite
,但是 Fiddler
、 Burpsuite
会遇到一个问题,如果 App 为了防止中间人抓包,特意设置了不走代理这个选项,那单独直接用 Fiddler
、 Burpsuite
这些抓包工具就不能抓包的,那总不可能说不能抓包就认为目标系统很安全吧?为了抓到完整的包,于是就衍生出 Postern + Charles
这个组合,是因为 Charles
没有直接监听到 App,Charles
是监听到了 Postern
上,Postern
就是一个VPN
,所以 App 设置不走代理也没用,它是通过 VPN 将所有流量转发到 Charles 的 socks
代理,再打开 Charles 的 External Proxy Server
— (外部代理服务器)转发到 Burpsuite,从而实施中间人抓包
环境:
Postern 3.1.3
Charles v4.6.2
Burpsuite Professional v2021.2
Pixel3 Android11 、已 root + Xposed
先配置 Charles
在 Proxy — Proxy Settings
,勾选 Enable SOCKS proxy
进行设置 SOCKS
代理(按照下图的操作),端口号我这里设置 16666
(或者自定义,但不能和系统已占用端口冲突)
配置代理
添加代理服务器
点击保存
配置规则
添加规则
按照下图进行操作并点击保存
打开/关闭 Postern
那么只要上面的 使用Charles + Burpsuite进行对APP进行抓包
设置好之后,打开你想要抓的目标 APP 就可以看到数据包已经转发到 Burpsuite 了
但是如果遇到某些比较敏感的 APP,检测 root 的话,可以参考下面的两篇文章进行设置
Charles 和 Fiddler 的比较
Fiddler 虽然也可以完成对手机的抓包,但是如果 App 设置了不走代理,那 Fiddler 就失败了,并且 Fiddler 每次都需要手动修改网络设置的代理,但是 Charles 与 Postern 联动配合就不需要手动修改网络设置,只需要配置好 Postern 和 Charles 的连接就可以了,并且可以对绝大部分的 App 进行抓包,不使用代理时,直接关闭 Postern 即可
目前来说,Fiddler 和 Charles 都是很流行的,但是相对来说,还是 Postern + Charles 适用范围更广一些。
8、使用 Frida + Xposed + Objection + Burpsuite 进行对 APP 进行抓包
SSL 证书绑定
什么是证书绑定呢?其实网上叫法蛮多的,SSL 证书绑定、英文名字:SSL Pinning 或者证书检验。总之无论怎么叫都是检验证书是否可信任。我们知道从 HTTP 到 HTTPS 数据在传输过程中添加了一层 SSL/TLS,让我们数据流量处于加密状态,不再是明文可见。这时候便有了 CA 证书。
我们在抓取 HTTPS 数据包得时候,做的就是利用假的 CA 证书,来实现中间人劫持数据。一旦 app 校验了证书的指纹信息。我们的证书不再受信任了。自然而然就无法建立连接,所以必须想办法让 app 信任,才能继续抓包。当然这个分为两种情况:
(1)单项校验-客户端校验服务端的证书。
(2)双向认证-客户端不仅仅要校验服务端的证书,也会在 app 内放一张证书;服务端也会检验客户端里的证书。
单向校验
Android 系统中已经提供了检验证书的 api,我们只需要实现 checkClientTrusted
、 checkServerTrusted
、 verify
等方法即可。
这类的对抗需要我们将这些函数的校验进行置空,默认信任所有证书即可。
使用 Xposed + JustTruestMe 来突破 SSL Pinning
Xposed 是一个框架,它可以改变系统和应用程序的行为,而不接触任何 APK。它支持很多模块,每个模块可以用来帮助实现不同的功能。
JustTrustMe 是一个用来禁用、绕过 SSL 证书检查的基于 Xposed 模块。JustTrustMe 是将 APK 中所有用于校验 SSL 证书的 API 都进行了 Hook,从而绕过证书检查。
环境:
Pixel3 Android11 、已 root + Xposed
SSLUnpinning 2.0 插件
JustMePlush 插件
Frida-server-15.1.27-android-arm64
PC 端的 Frida v15.1.27
Objection v1.11.0
首先下载 Xposed 框架插件 SSLUnpinning
+ JustTrustMe
, SSLUnpinning
插件可以直接在 Xposed 商店下载,而 JustTrustMe 插件需要到下面的 GitHub 链接自行下载
我这里就使用 SSLUnpinning 2.0
插件和 JustMePlush
插件,效果都是一样的,插件安装完之后,记得启动插件,然后 重启手机
后插件才能生效
然后使用 Objection
进行绕过
Objection 是一款基于 frida 的 hook 框架,由于 frida 需要我们自己编写脚本,使用比较麻烦,objection 内置了在安卓和 IOS 逆向中常用的一些 hook 脚本,我们通过简单的命令行就可以进行 hook 动态篡改,非常方便
因为 Objection 是基于 Frida 的所以必须先安装 Frida 然后才能安装 Objection
pip3 install objection
按照上面的操作进行部署 Frida 环境之后,就启动 Frida服务端程序
接着用 Objection
注入到目标 APP 应用程序上
objection -g 包名 explore
如果不知道 APP 包名,可以用以下命令进行查看,但是依然前提要启动了 Frida服务端程序
frida-ps -Ua
然后输入关闭 APP 的 SSL 校验命令
android sslpinning disable
并在手机里面网络设置也要设置手动代理模式,输入的 IP 和端口都要与 Burpsuite 一样
即可完成绕过 SSL Pinning
进行抓包
如果出现还是依然无法绕过 SSL Pinning
的情况,可以参考下面两篇文章
- Android 抓包总结
- [Frida.Android.Practice (ssl unpinning)](https://github.com/WooyunDota/DroidDrops/blob/master/2018/Frida.Android.Practice.md “Frida.Android.Practice (ssl unpinning “Frida.Android.Practice (ssl unpinning)”)”)
双向校验
APP 除了校验服务端的证书,服务端还会检验 APP 的证书。HTTPS 双向证书校验在实际中几乎很少用到,因为服务器端需要维护所有客户端的证书,这
无疑增加了很多消耗,因此大部分厂商选择使用单向证书绑定。 对抗双向认证需要完成两个环节:
(1)让客户端认为 burp 是服务端 ,这一步其实就是破解 SSL pinning,方法和上述过程完全相同。
(2)让服务端认为 burp 是客户端 ,这一步需要导入客户端的证书到 burp,客户端的证书一定会存在本地代码中,而且还可能会有密码,这种情况下需要逆向客户端 app,找到证书和密码,并转为 pkcs12 格式导入到 burp。
User options -> SSL -> Client SSL Certificate
。
1 | 双向校验的app 案例: |
通常情况下应用会将证书放置在资源目录 app/asset
下,后缀名为 p12
、 pfx
的文件。当然也可能会伪装成其他文件,例如图片文件等。
怎么找到证书密码呢?一般要么逆向分析找到密码,要么通过 hook api java.security.KeyStore 使密码自吐。
(1)Jadx 中搜索证书的名字、或者证书链 x509certificate 分析定位到关键位置。
(2)服务器对客户端进行校验过程中,客户端将证书公钥发送给服务器,以及从服务器获取 session 和私钥解密过程中,需要 API 进行操作,API 存在于 java 层框架内,所以 hook 框架层代码 java.security.KeyStore,使密码自吐。
这里下图的案例 APK 解压之后在assets
目录下有一个client.p12
的证书文件,但是不知道它的密码,因此要使用 Frida 对目标 APP 进行 hook,让它密码自吐。
❗️❗️❗️ 注意:.p12
后缀的证书文件是由 .crt
证书和 key
文件合并成.p12
证书文件,并且在合并生成 .p12
文件的时候必须对证书进行加密(也就是加个证书密码),不加密码 Burpsuite 是无法导入的
1 | function hook_KeyStore_load() { |
脚本可以在大佬博客这里复制,并命名为 ssl.js
(可自定义) 抓包之服务器校验客户端证书
执行下面的命令
frida -U -f APP 包名 -l ssl.js –no-pause
可以发现我们通过 hook 框架层代码得到了 client.p12
证书密码为 111111
,然后在 Burpsuite 里面选择 User options — TLS — Client TLS Certificates — Add
进行导入证书,Destination host
写*
进行匹配所有地址,证书类型选择File(PKCS#12)
,然后选择Next
加载 assets
目录下的 client.p12
证书文件,和输入上面 hook 出的密码 111111
导入证书之后,就可以正常的抓包了,可以看下面的图,下面的 403
是没导入证书的时候,它就不允许你抓包访问,上面的 200
是我导入证书之后,就可以正常抓包了
还有就是在某些特殊场景 web页面
或者 APP
需要在 PC 电脑端安装证书才能进行访问抓包的,那么就要根据实际情况去操作
9、使用 Frida 写 Hook 代码来进行对 APP 模拟抓包
环境:
夜神模拟器 32 位 Android7.1.2 已 root
Frida-server-15.1.27-android-x86
PC 端的 Frida v15.1.27
Objection v1.11.0
使用 Charles 抓不到包怎么办呢,我们有 Frida
,可以通过 frida 来 hook 住 APP 构造网络请求和接收数据地方的代码,然后打印出来请求和返回数据,这样 APP 向服务器进行的网络请求和接收的数据便一览无余了。
一般网络请求和接收数据的代码都会写在一个类中,我们只要找到一个点来追踪去找到这个类就可以了。
在大佬的 Github 项目里面找到一个Frida 实现拦截 okhttp 的脚本
它的工作原理就是:
由于所有使用的 okhttp 框架的 App 发出的请求都是通过
RealCall.java
发出的,那么我们可以 hook 此类拿到 Request 和 Response, 也可以缓存下来每一个请求的 call 对象,进行再次请求,所以选择了此处进行 hook。 find 前新增 check,根据特征类寻找是否使用了 okhttp3 库,如果没有特征类,则说明没有使用 okhttp; 找到特征类,说明使用了 okhttp 的库,并打印出是否被混淆。
❗️❗️❗️ 这里我使用了真机进行测试,遇到下面的报错,应该是有检测到我真机的一些环境原因吧,因此我就使用了夜神模拟器
进行下面的操作
首先将 okhttpfind.dex
拷贝到 /data/local/tmp/
目录下,并赋予权限
adb push okhttpfind.dex /data/local/tmp/
chmod 777 okhttpfind.dex
然后启动Frida服务端程序
接着执行命令启动 hook 脚本
frida -U -l okhttp_poker.js -f APP 包名 –no-pause
如果有需要可追加参数 -o [output filepath] 保存到文件
然后复制被混淆后的类名(上图红色框圈住的内容),粘贴到 okhttp_poker.js 文件中(如下图),并进行保存
,Frida 会自动实时识别更新后的脚本内容执行相关操作
然后运行 hold()
命令开启 hook 拦截,然后操作 App 后,会出现拦截的内容如下:
如果想对 okHTTP 进行深入的研究可以前往这篇大佬的文章进行阅读 [原创] 如何实现 Https 拦截进行 非常规“抓包”(20.9.13-代码更新)
总结
整理了以上九种不同的抓包方式其实是可以应对目前市面上各大的 APP 抓包场景,当然抓包的方式肯定不只这九种,比如还有肉丝大佬 r0ysue
的安卓应用层抓包通杀脚本,有兴趣的大佬可以去尝试一下。其实能多掌握一些抓包的技巧,也许能够在测试的过程中发现更多意想不到的新技术。
参考资料
- fiddler 安装教程,算是一次记录吧~
- 如何使用 Burp suite 抓取 Fiddler 转发的流量包
- Android 抓包——HttpCanary
- Android10 导入系统证书的方法。
- 学完这篇 Charles 抓包教程,我直接把 fiddler 卸载了
- Charles+Postern 抓包
- 如何通过 Charles+BurpSuite 的配合在 PC 端抓到手机包
- Charles 乱码和 SSL 代理问题解决
- 走进移动安全(3)-抓包进阶
- 双向认证 APP 自吐证书密码与抓包
- [原创]安卓 APP 抓包之双向认证突破
- Frida 实现的 Android 端 App 抓包小工具[okhttp_poker]
XRSec has the right to modify and interpret this article. If you want to reprint or disseminate this article, you must ensure the integrity of this article, including all contents such as copyright notice. Without the permission of the author, the content of this article shall not be modified or increased or decreased arbitrarily, and it shall not be used for commercial purposes in any way