APP各种抓包教程 Hook | SSL Pinning |Frida

APP各种抓包教程 Hook | SSL Pinning |Frida

前言

每当遇到一些 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 地址)

APP各种抓包教程 Hook | SSL Pinning |Frida

在手机里面网络设置也要设置 手动代理模式 ,输入的 IP和端口 都要与 Burpsuite 一样

APP各种抓包教程 Hook | SSL Pinning |Frida

然后在手机浏览器访问 https://burp 这个地址,去进行下载并安装 burp 证书,因为抓取 HTTPS 流量是需要证书的,点击 CA Certificate 即可进行下载

APP各种抓包教程 Hook | SSL Pinning |Frida

下载之后要对证书文件后缀名进行更改,因为手机是无法打开 .der 后缀的文件,所以要吧 .der 改为 .cer ,然后再进行安装证书

APP各种抓包教程 Hook | SSL Pinning |Frida

那么安装之后就可以进行抓取 APP 数据包了

APP各种抓包教程 Hook | SSL Pinning |Frida

2、使用 Fiddler 对 APP 进行抓包

环境:

Fiddler v5.0.20204.45441
Pixel3 Android11 、已 root + Xposed

1、在 Fiddler 里面 Tools — Options

APP各种抓包教程 Hook | SSL Pinning |Frida

2、在 options 弹框中切换至 HTTPS ,勾选图中标记的 2 个选项并点击 OK

APP各种抓包教程 Hook | SSL Pinning |Frida

3、勾选后会弹出安装证书的提示,根据提示一直点击 是 即可安装成功
4、接着在Tools — Options — Connections,端口写 9999(可随意更改),并勾选 Allow remote computers to connect ,点击 OK

APP各种抓包教程 Hook | SSL Pinning |Frida

5、重启 Fiddler ( 修改fiddler配置要重启后才能生效 )
6、修改手机网络设置

APP各种抓包教程 Hook | SSL Pinning |Frida

7、在浏览器访问上面设置的 IP 地址和端口号,我这里是 172.20.10.5:9999(这里要根据实际情况),然后 FiddlerRoot certificate 进行下载证书,并自行安装

APP各种抓包教程 Hook | SSL Pinning |Frida

那么安装之后就可以进行抓取 APP 数据包了

APP各种抓包教程 Hook | SSL Pinning |Frida

3、使用 Burpsuite + Fiddler 进行对 APP 进行抓包

配置 Burpsuite 使用的代理监听是 127.0.0.1:8080

APP各种抓包教程 Hook | SSL Pinning |Frida

在 Fiddler 里面 Tools — Options — Gateway 配置的代理监听是 127.0.0.1:8080(这里的配置与 Burpsuite 代理一致)

APP各种抓包教程 Hook | SSL Pinning |Frida


接着在 Tools — Options — Connections ,端口写 9999(可随意更改),并勾选 Allow remote computers to connect ,点击 OK

APP各种抓包教程 Hook | SSL Pinning |Frida

修改手机网络设置

APP各种抓包教程 Hook | SSL Pinning |Frida

也就是说从手机的流量经过 Fiddler 进行转发到Burpsuite

APP各种抓包教程 Hook | SSL Pinning |Frida

4、使用小黄鸟 HttpCanary 对 APP 进行抓包

环境:

HttpCanary v3.3.6
Pixel3 Android11 、已 root + Xposed

首先安装 HttpCanary APP 应用

APP各种抓包教程 Hook | SSL Pinning |Frida
APP各种抓包教程 Hook | SSL Pinning |Frida
APP各种抓包教程 Hook | SSL Pinning |Frida

HttpCanary 支持 HTTP/HTTPS/HTTP2 网络数据包的抓取和分析,其实和 Charles 类似,要抓取 HTTPS 需要使用 MITM 中间技术对 TLS/SSL 数据包进行解密以及明文输出,因此需要安装自签的 CA 证书

APP各种抓包教程 Hook | SSL Pinning |Frida
APP各种抓包教程 Hook | SSL Pinning |Frida

这里要提一下 Android 系统默认对证书信任证书的问题

因为我的 Pixel3 手机是已经 root 了,而且是 Android11 系统,在安卓 7.0 之前系统,直接下载证书装入即可,安卓 7.0 及以上系统对于证书的安全策略做了修改,意味着,从 sdcard 安装用户级 CA 将无法拦截应用流量。我们需要将证书命名为计算出的哈希值后缀 .0 或者直接在手机里面的 用户凭据 可以看到后缀 .0的证书文件 名字,然后导入到根证书目录:/system/etc/security/cacerts 让系统默认可信任。因此安装证书的方式也有所不同,默认它是安装在用户那里的。

APP各种抓包教程 Hook | SSL Pinning |Frida

首先按照我下面的图顺序进行安装证书

APP各种抓包教程 Hook | SSL Pinning |Frida

APP各种抓包教程 Hook | SSL Pinning |Frida

APP各种抓包教程 Hook | SSL Pinning |Frida

APP各种抓包教程 Hook | SSL Pinning |Frida

先导出 HttpCanary根 证书文件 .pem

APP各种抓包教程 Hook | SSL Pinning |Frida
APP各种抓包教程 Hook | SSL Pinning |Frida

点击它,即可完成安装证书

APP各种抓包教程 Hook | SSL Pinning |Frida
APP各种抓包教程 Hook | SSL Pinning |Frida

那么这里就看到它是安装在用户那里的,但是由于我的设备是已经 root 了,要把这个证书安装在 系统 那里才能进行抓取 HTTPS 流量

APP各种抓包教程 Hook | SSL Pinning |Frida

那么这时就需要把证书的文件移动到系统目录下就可以了,这里选择导出 System Trusted(.0)

APP各种抓包教程 Hook | SSL Pinning |Frida

APP各种抓包教程 Hook | SSL Pinning |Frida

那么就把证书进行移动到系统证书目录 /etc/security/cacerts/

APP各种抓包教程 Hook | SSL Pinning |Frida
APP各种抓包教程 Hook | SSL Pinning |Frida

在 Android 10 以及以上安装证书到 /system/etc/security/cacerts/会出现 system 无法写入使用 mount 报错如下:

'/system' not in /proc/mounts
'/dev/block/dm-4' is read-only

由于 Android 10 采用了某些安全策略,将系统分区 /system挂载为只读,就算你 root 了也没用,无法写入系统分区也就无法导入系统证书,在使用 HTTPCanary 这样的软件抓包分析的时候,很多 app 只认系统证书,不认用户证书

遇见此类情况有两种方式解决:

1、在 Magisk 里面安装 Move Certificates模块,该插件可以一键将所有用户证书自动转换为系统区证书

https://github.com/Magisk-Modules-Repo/movecert

使用方法:所有证书安装为用户证书后,安装此插件,并重启。

APP各种抓包教程 Hook | SSL Pinning |Frida

APP各种抓包教程 Hook | SSL Pinning |Frida

2、创建一个新的挂载点来覆盖 这种方式是内存覆盖的方式所以手机重启后失效。(想要持久化需考虑搞一个开机启动服务)

# 创建一个临时目录,保存当前证书
mkdir /sdcard/tmp/
# 复制现有证书到临时目录
cp /system/etc/security/cacerts/* /sdcard/tmp/
# 创建内存挂载
mount -t tmpfs tmpfs /system/etc/security/cacerts
# 将现有证书复制回 tmpfs 挂载
mv /sdcard/tmp/* /system/etc/security/cacerts/
# 更新 perms 和 selinux
chown root:root /system/etc/security/cacerts/*
chmod 644 /system/etc/security/cacerts/*
chcon u:object_r:system_file:s0 /system/etc/security/cacerts/*

再进来这个看证书的界面就已经看到已经把 用户 的证书安装在 系统 那里了

APP各种抓包教程 Hook | SSL Pinning |Frida

APP各种抓包教程 Hook | SSL Pinning |Frida
APP各种抓包教程 Hook | SSL Pinning |Frida

虽然 HttpCanary 是一个很不错的抓包工具,但是它并不能跟其他抓包工具进行一个联动转发抓包,所以当渗透测试人员在使用它进行抓包之后,可以直接在手机上进行修改数据包进行测试,但是可能在手机上工作效率没那么高,于是就把要测试的数据包复制出来到 Burpsuite 上进行修改并发包,这个过程也会浪费很多时间。

下面是 HttpCanary 的工作原理

HttpCanary 采用 VPN 的方式将网络包转发给本地代理服务器,本地代理服务器将数据包转发虚拟网关,由虚拟网关进行不同策略地拦截和协议解析,最后再将数据发送给终端

APP各种抓包教程 Hook | SSL Pinning |Frida


最重要的一层就是虚拟网关 Virtual Gateway ,需要对协议进行鉴定解析等等,包括数据包的拦截注入都是在这一层处理的,比如 HTTPS 的中间人(MITM)解析出明文包等

因此从上图观察它的工作原理进行分析之后,让我寻找到另一种方式抓包(它的工作方式也和 HttpCanary 有点相似 )可以用它来代替 HttpCanary —— Postern + Charles + Burpsuite组合,至于怎样操作,可以在文章下面 7、使用Postern + Charles + Burpsuite进行对APP进行抓包 进行详细阅读

APP各种抓包教程 Hook | SSL Pinning |Frida

5、使用 Charles 对 APP 进行抓包

环境:

Charles v4.6.2
Pixel3 Android11 、已 root + Xposed

charles 是一款非常优秀的抓包工具,全平台支持,在 mac,windows,linux 上都可以使用,既可以抓取 web 端的包,也可以抓 app 端的包
charles 主要的功能包括如下几点:

截取 Http 和 Https 网络封包。

支持重发网络请求,方便后端调试。

支持修改网络请求参数。

支持网络请求的截获并动态修改。

支持模拟慢速网络。

代理服务器的工作原理如下所示:

APP各种抓包教程 Hook | SSL Pinning |Frida

客户端发起请求,请求通过 charles 转发给服务器,服务器返回响应,响应通过 charles 转发给客户端。

charles 所起的作用就相当于信使,把信息从 A 传递给 B,并且把回信从 B 传递给 A,正因为他这个信使的工作,所以他对信息的内容了如指掌(不管是原信还是回信),正因为如此,charles 也就可以篡改信息的内容,即篡改请求和响应。

Charles 下载地址:

https://www.charlesproxy.com/download/

APP各种抓包教程 Hook | SSL Pinning |Frida

然后自行安装之后,要对它进行激活

注册码生成地址:

https://www.zzzmode.com/mytools/charles/

APP各种抓包教程 Hook | SSL Pinning |Frida

激活 Charles

在 Help->Registered 输入 key 和生成的激活码即可

APP各种抓包教程 Hook | SSL Pinning |Frida

APP各种抓包教程 Hook | SSL Pinning |Frida

设置代理,在 Proxy — Proxy Settings ( 注意:此时我的Windows Proxy是去掉对勾的,因为这里我是想在PC端抓手机端的包,所以没必要打开电脑的本地代理 )

APP各种抓包教程 Hook | SSL Pinning |Frida

填入代理端口 8888(或者自定义,但不能和系统已占用端口冲突),并且勾上 Support HTTP/2 和 Enable transparent HTTP proxying ,点击右下角 OK 即可

APP各种抓包教程 Hook | SSL Pinning |Frida

然后分别在 PC 端和手机端安装证书
选择 Help — SSL Proxying — Install Charles Root Certificate 就可以下载安装上 PC 端了

APP各种抓包教程 Hook | SSL Pinning |Frida
APP各种抓包教程 Hook | SSL Pinning |Frida

证书存储选择 受信任的根证书颁发机构

APP各种抓包教程 Hook | SSL Pinning |Frida

接下来再给手机端安装证书,步骤如下:
选择 Help — SSL Proxying — Install Charles Root Certificate on a Mobile Device or Remote Browser

APP各种抓包教程 Hook | SSL Pinning |Frida

点击后会弹出窗口提示设置的方法,按照提示在手机端将代理设置为电脑的 ip:8888( 我这里是192.168.1.251:8888 ),这里要先确保手机和电脑连接同一个无线网络 。然后在手机的浏览器打开 http://chls.pro/ssl ,按提示下载证书即可。

APP各种抓包教程 Hook | SSL Pinning |Frida

APP各种抓包教程 Hook | SSL Pinning |Frida

如果 Charles 有弹出提示,一定要点击 Allow

APP各种抓包教程 Hook | SSL Pinning |Frida

首先按照我下面的图顺序进行安装证书

APP各种抓包教程 Hook | SSL Pinning |Frida

APP各种抓包教程 Hook | SSL Pinning |Frida

APP各种抓包教程 Hook | SSL Pinning |Frida
APP各种抓包教程 Hook | SSL Pinning |Frida
APP各种抓包教程 Hook | SSL Pinning |Frida

找到选择刚刚下载的证书文件,点击即可完成安装

APP各种抓包教程 Hook | SSL Pinning |Frida

它也是安装在 用户 那里,但是由于我的设备是已经 root 了,要把这个证书安装在 系统 那里才能进行抓取 HTTPS 流量

APP各种抓包教程 Hook | SSL Pinning |Frida

但是移动证书的前提要知道证书安装之后的证书文件是被命名为什么,于是可以在 用户凭据 这里可以看到

APP各种抓包教程 Hook | SSL Pinning |Frida

文件为 b905ae73.0 ,它目前是在用户目录下 /data/misc/user/0/cacerts-added/

APP各种抓包教程 Hook | SSL Pinning |Frida

APP各种抓包教程 Hook | SSL Pinning |Frida

然后把它复制到 /etc/security/cacerts/ 系统目录下

APP各种抓包教程 Hook | SSL Pinning |Frida

APP各种抓包教程 Hook | SSL Pinning |Frida

APP各种抓包教程 Hook | SSL Pinning |Frida

HTTPS 解析

然后在 Proxy — SSL Proxying Settings 进行 SSL Proxying Settings 设置
勾选 enable SSL Proxying 复选框代表开启 SSL Proxying 代理,并在 include 栏中添加域名和端口号。include 中的列表项代表 Charles 能够展示这些域名的 SSL 请求和响应的明文。

并且说明中也提示了我们 Charles 要想使用 SSL Proxying 代理,需要进行 SSL Certificates,即证书签名。这个我们在上面已经完成了。

APP各种抓包教程 Hook | SSL Pinning |Frida

Stop SSL Proxying 按钮可以控制 SSL 代理的开关。(必须要开启SSL Proxying)

APP各种抓包教程 Hook | SSL Pinning |Frida

到此,PC 端的设置都已经配置好了,然后就能进行抓包了

APP各种抓包教程 Hook | SSL Pinning |Frida

6、使用 Charles + Burpsuite 进行对 APP 进行抓包

选择勾选 Proxy — External Proxy Settings 就是要将 Charles 作为手机端的代理,再由 Charles 将包转发给 burpsuite,所以对于 Charles 来说,burpsuite 就成了一个 External Proxy Server —— 外部代理服务器

APP各种抓包教程 Hook | SSL Pinning |Frida

勾选 HTTP 和 HTTPS 代理,这里 HTTP 和 HTTPS 的代理服务器地址都是 127.0.0.1:8080(这里的配置与 Burpsuite 代理一致)

APP各种抓包教程 Hook | SSL Pinning |Frida

已经设置了外部代理了,就必须打开 burp(当然了主要是要打开 burp 中对 127.0.0.1:8080 的监听),否则就会出现 连不上网了 的现象。在 burp 的菜单栏中的 Proxy 选项下的 Options 中打开 127.0.0.1:8080 的代理监听(默认应该是已经打开的),在 Intercept 中关闭请求拦截。

APP各种抓包教程 Hook | SSL Pinning |Frida

完成上面的配置步骤后,从手机上打开浏览器搜索内容,应该已经可以在 Charles 窗口左侧的列表中找到想抓的包,并且也可以看到数据包从 Charles 转发到 Burpsuite 了

APP各种抓包教程 Hook | SSL Pinning |Frida

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(或者自定义,但不能和系统已占用端口冲突)

APP各种抓包教程 Hook | SSL Pinning |Frida

配置代理

APP各种抓包教程 Hook | SSL Pinning |Frida

添加代理服务器

APP各种抓包教程 Hook | SSL Pinning |Frida

APP各种抓包教程 Hook | SSL Pinning |Frida

点击保存

APP各种抓包教程 Hook | SSL Pinning |Frida

配置规则

APP各种抓包教程 Hook | SSL Pinning |Frida

添加规则

APP各种抓包教程 Hook | SSL Pinning |Frida

按照下图进行操作并点击保存

APP各种抓包教程 Hook | SSL Pinning |Frida

APP各种抓包教程 Hook | SSL Pinning |Frida

打开/关闭 Postern

APP各种抓包教程 Hook | SSL Pinning |Frida

那么只要上面的 使用Charles + Burpsuite进行对APP进行抓包 设置好之后,打开你想要抓的目标 APP 就可以看到数据包已经转发到 Burpsuite 了

APP各种抓包教程 Hook | SSL Pinning |Frida

但是如果遇到某些比较敏感的 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 证书。

APP各种抓包教程 Hook | SSL Pinning |Frida

我们在抓取 HTTPS 数据包得时候,做的就是利用假的 CA 证书,来实现中间人劫持数据。一旦 app 校验了证书的指纹信息。我们的证书不再受信任了。自然而然就无法建立连接,所以必须想办法让 app 信任,才能继续抓包。当然这个分为两种情况:

(1)单项校验-客户端校验服务端的证书。

(2)双向认证-客户端不仅仅要校验服务端的证书,也会在 app 内放一张证书;服务端也会检验客户端里的证书。

单向校验

Android 系统中已经提供了检验证书的 api,我们只需要实现 checkClientTrusted 、 checkServerTrusted 、 verify 等方法即可。

APP各种抓包教程 Hook | SSL Pinning |Frida

这类的对抗需要我们将这些函数的校验进行置空,默认信任所有证书即可。

使用 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 链接自行下载

APP各种抓包教程 Hook | SSL Pinning |Frida

我这里就使用 SSLUnpinning 2.0 插件和 JustMePlush 插件,效果都是一样的,插件安装完之后,记得启动插件,然后 重启手机 后插件才能生效

APP各种抓包教程 Hook | SSL Pinning |Frida

然后使用 Objection 进行绕过

Objection 是一款基于 frida 的 hook 框架,由于 frida 需要我们自己编写脚本,使用比较麻烦,objection 内置了在安卓和 IOS 逆向中常用的一些 hook 脚本,我们通过简单的命令行就可以进行 hook 动态篡改,非常方便

因为 Objection 是基于 Frida 的所以必须先安装 Frida 然后才能安装 Objection

APP各种抓包教程 Hook | SSL Pinning |Frida
pip3 install objection

按照上面的操作进行部署 Frida 环境之后,就启动 Frida服务端程序

APP各种抓包教程 Hook | SSL Pinning |Frida

接着用 Objection 注入到目标 APP 应用程序上

objection -g 包名 explore

如果不知道 APP 包名,可以用以下命令进行查看,但是依然前提要启动了 Frida服务端程序

frida-ps -Ua
APP各种抓包教程 Hook | SSL Pinning |Frida

然后输入关闭 APP 的 SSL 校验命令

android sslpinning disable
APP各种抓包教程 Hook | SSL Pinning |Frida

并在手机里面网络设置也要设置手动代理模式,输入的 IP 和端口都要与 Burpsuite 一样

APP各种抓包教程 Hook | SSL Pinning |Frida
APP各种抓包教程 Hook | SSL Pinning |Frida

即可完成绕过 SSL Pinning 进行抓包

如果出现还是依然无法绕过 SSL Pinning 的情况,可以参考下面两篇文章

双向校验

APP 除了校验服务端的证书,服务端还会检验 APP 的证书。HTTPS 双向证书校验在实际中几乎很少用到,因为服务器端需要维护所有客户端的证书,这
无疑增加了很多消耗,因此大部分厂商选择使用单向证书绑定。 对抗双向认证需要完成两个环节:

(1)让客户端认为 burp 是服务端 ,这一步其实就是破解 SSL pinning,方法和上述过程完全相同。

(2)让服务端认为 burp 是客户端 ,这一步需要导入客户端的证书到 burp,客户端的证书一定会存在本地代码中,而且还可能会有密码,这种情况下需要逆向客户端 app,找到证书和密码,并转为 pkcs12 格式导入到 burp。User options -> SSL -> Client SSL Certificate。

双向校验的app 案例:
https://www.wandoujia.com/apps/8280413

通常情况下应用会将证书放置在资源目录 app/asset下,后缀名为 p12 、 pfx的文件。当然也可能会伪装成其他文件,例如图片文件等。

APP各种抓包教程 Hook | SSL Pinning |Frida

怎么找到证书密码呢?一般要么逆向分析找到密码,要么通过 hook api java.security.KeyStore 使密码自吐。

(1)Jadx 中搜索证书的名字、或者证书链 x509certificate 分析定位到关键位置。

APP各种抓包教程 Hook | SSL Pinning |Frida

(2)服务器对客户端进行校验过程中,客户端将证书公钥发送给服务器,以及从服务器获取 session 和私钥解密过程中,需要 API 进行操作,API 存在于 java 层框架内,所以 hook 框架层代码 java.security.KeyStore,使密码自吐。
这里下图的案例 APK 解压之后在 assets 目录下有一个 client.p12 的证书文件,但是不知道它的密码,因此要使用 Frida 对目标 APP 进行 hook,让它密码自吐。

APP各种抓包教程 Hook | SSL Pinning |Frida

❗️❗️❗️ 注意:.p12后缀的证书文件是由 .crt证书和 key 文件合并成.p12证书文件,并且在合并生成 .p12 文件的时候必须对证书进行加密(也就是加个证书密码),不加密码 Burpsuite 是无法导入的

APP各种抓包教程 Hook | SSL Pinning |Frida
function hook_KeyStore_load() {
    Java.perform(function () {
        var StringClass = Java.use("java.lang.String");
        var KeyStore = Java.use("java.security.KeyStore");
        KeyStore.load.overload('java.security.KeyStore$LoadStoreParameter').implementation = function (arg0) {
            console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
            console.log("KeyStore.load1:", arg0);
            this.load(arg0);
        };
        KeyStore.load.overload('java.io.InputStream', '[C').implementation = function (arg0, arg1) {
            console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
            console.log("KeyStore.load2:", arg0, arg1 ? StringClass.$new(arg1) : null);
            this.load(arg0, arg1);
        };

        console.log("hook_KeyStore_load...");
    });
}

setImmediate(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

APP各种抓包教程 Hook | SSL Pinning |Frida

加载 assets 目录下的 client.p12 证书文件,和输入上面 hook 出的密码 111111

APP各种抓包教程 Hook | SSL Pinning |Frida

APP各种抓包教程 Hook | SSL Pinning |Frida

APP各种抓包教程 Hook | SSL Pinning |Frida

导入证书之后,就可以正常的抓包了,可以看下面的图,下面的 403 是没导入证书的时候,它就不允许你抓包访问,上面的 200 是我导入证书之后,就可以正常抓包了

APP各种抓包教程 Hook | SSL Pinning |Frida

还有就是在某些特殊场景 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 的库,并打印出是否被混淆。
❗️❗️❗️ 这里我使用了真机进行测试,遇到下面的报错,应该是有检测到我真机的一些环境原因吧,因此我就使用了夜神模拟器进行下面的操作

APP各种抓包教程 Hook | SSL Pinning |Frida

首先将 okhttpfind.dex 拷贝到 /data/local/tmp/ 目录下,并赋予权限

adb push okhttpfind.dex /data/local/tmp/

chmod 777 okhttpfind.dex
APP各种抓包教程 Hook | SSL Pinning |Frida


然后启动Frida服务端程序

APP各种抓包教程 Hook | SSL Pinning |Frida


接着执行命令启动 hook 脚本

frida -U -l okhttp_poker.js -f APP 包名 –no-pause

如果有需要可追加参数 -o [output filepath] 保存到文件

okHttp 的 app 案例

APP各种抓包教程 Hook | SSL Pinning |Frida

APP各种抓包教程 Hook | SSL Pinning |Frida

然后复制被混淆后的类名(上图红色框圈住的内容),粘贴到 okhttp_poker.js 文件中(如下图),并进行保存,Frida 会自动实时识别更新后的脚本内容执行相关操作

APP各种抓包教程 Hook | SSL Pinning |Frida

然后运行 hold() 命令开启 hook 拦截,然后操作 App 后,会出现拦截的内容如下:

APP各种抓包教程 Hook | SSL Pinning |Frida

如果想对 okHTTP 进行深入的研究可以前往这篇大佬的文章进行阅读 [原创] 如何实现 Https 拦截进行 非常规“抓包”(20.9.13-代码更新)

总结

整理了以上九种不同的抓包方式其实是可以应对目前市面上各大的 APP 抓包场景,当然抓包的方式肯定不只这九种,比如还有肉丝大佬 r0ysue 的安卓应用层抓包通杀脚本,有兴趣的大佬可以去尝试一下。其实能多掌握一些抓包的技巧,也许能够在测试的过程中发现更多意想不到的新技术。

参考资料

from

转载请注明出处及链接

Leave a Reply

您的电子邮箱地址不会被公开。 必填项已用*标注

3 × 5 =