方格社区-淘金信息差

 找回密码
 立即注册

[金融] APP各种抓包教程

  [复制链接]
发表于 2023-1-20 00:01:30 | 显示全部楼层 |阅读模式
前言

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

86dae6463d991d30d87fe3d7c86e2aef.png

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

1d30f15140616b9e098b3e07a4f5acf2.png

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

c7a20c4e1a385c083984edc5e4bc322a.png

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

7166165a6c8a96bcc1a002d7b37e1804.png

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

6918bf9bd9e714c24a1bb1d18f7d7a91.png 62204700a1e39c4a82f35c7a07613243.jpeg 2、使用 Fiddler 对 APP 进行抓包

环境:

Fiddler v5.0.20204.45441

Pixel3 Android11 、已 root + Xposed

1、在 Fiddler 里面 Tools — Options

4fa9993fb4fc5efb200508d35ab5dde2.png

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

53c759abe382dcfcd32a5d22d2d1fad3.png

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

b5b7c16487648925b516fcf4d76f1a96.png

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

eb795ad960d5237fc957e3f6054d6069.png

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

cc5d9950c7578d18689a34011af05780.png

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

88e263ed943896fbdf585b393f6e958f.png 94ffdd0a2284ab6572783a946448b377.png 3、使用 Burpsuite + Fiddler 进行对 APP 进行抓包

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

56f1421c9213d1966a54def334c9a47a.png

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

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

修改手机网络设置

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

5bd1fc5a93ee296da364b9b3f96c99fe.png 4fffc640370c56890614f515af9afe21.gif 4、使用小黄鸟 HttpCanary 对 APP 进行抓包

环境:

HttpCanary v3.3.6

Pixel3 Android11 、已 root + Xposed首先安装 HttpCanary APP 应用

5cf5e1a541a44c5a87cd98e9532bd73c.png ab49d8ee98dc81a5b044e2bb8486d1f3.png b93ea09e35155ce098a846e67111595c.png

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

78f1c5a3f3a4f4a6ec8d56fdd5dbb457.png 3c28e6b71a768cfc77584fb5156181d4.png 这里要提一下 Android 系统默认对证书信任证书的问题

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

ec21b6c6c4ebf0ad1a63056d7928d024.png

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

024d89e69f78ecc42d0017a2d468d0b5.png 821490a8eab606e759bea60cd950d333.png 4b2ed30b0278fe24029580f7124164e2.png 5e8101bde9f97946f86f6f4033e6ef11.png

先导出 HttpCanary根 证书文件 .pem

86a3abf6d56279b9fabb15d140ec9778.png 0f10f897e42b19add9c26c89a45ac61a.png

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

a550c13ade0aae0ffeeb87b57e5510a2.png 2f080b52a8c1f4ec27d5365ea1d8a3cd.png

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

c5981bce8653e28769e4de3be9663665.png

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

ef43f5464c24f9b60b11db27cb3a1136.png 8c0c592b87a0d6e7cdb816b40aff2333.png

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

4a2ab6381b6e117d808190d2ccaf9fb8.png e29dc285a3573f298033d1f900e01a0b.png

在 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模块`[1],该插件可以一键将所有用户证书自动转换为系统区证书

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

c8e30cfa57501a079a8f9c34541dadf5.png f7ed3c62c029ec7d2512ea420e53fa3e.png

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/*

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

2cb9c7095ab50a8abe6e188ec0215453.png 637a043ec2e1558efcc2c62eff0c2fc9.png 108e6fc89c742a8944764767f9d0e59a.png

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

下面是 HttpCanary 的工作原理

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

9e6c4ae36829252861d9410db00e6a24.png

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

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

6c464563dc45905c4c45d5e4019dfddc.gif 5、使用 Charles 对 APP 进行抓包

环境:

Charles v4.6.2

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

截取 Http 和 Https 网络封包。

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

支持修改网络请求参数。

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

支持模拟慢速网络。

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

0fcfc444b1fc4922b8617e4682b60959.png

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

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

Charles 下载地址:

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

d5aa021f37ff7ab9893ebf17d7005e5e.png

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

注册码生成地址:

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

68461282ac7a698b59db4c389102c195.png

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

3047a045da9d9c9c4cac7898b91079f6.png 02192cfc4015333f732a59006259a444.png

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

dcbe08e9faf483e19a7abcd2581ac76c.png

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

49de85a978d298a38a1938bcb0ab3604.png

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

63e877b45e04dd8fba02e4a4efc0fd4f.png 9b17b1543bd40aadf945e34d054a52f1.png

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

7ded786ef1712125b941440dc89f445c.png

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

7009c83bf35d0a2917583243e3bc2afc.png

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

43c4b6c306fe147562025481bc84f64b.png ac55d882fb7704a29c39325731d881e1.png

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

d1c41d6df08bc2ba0b229bd3a47a9fef.png

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

8701f6e9191268c14675b106ee4b7bcc.png 5b1d60f3748e5f0b69b6a2dbb992f08c.png 54808cd58d3b1b188a0e12b033a2eb6b.png 328ef64b03f2bd7cc4358b9d8bd9b2bd.png 4b5aaebaf01ac49101658b5cada54d6f.png

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

2004f73f507196474731abbd93978a55.png

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

0e1a090f3ff363e7c504dbd6f19827ba.png

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

5294ded81af384a48063b6cac87f852f.png

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

70b892ea4fe462a09acf2a682b0d08de.png 5a30de3bfb81162d76421add2b4858f8.png

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

f0a8d3f9c84eb8f325506805de8ac99a.png 24b5ad36a7fa888c1d3524ffc6eab484.png dc7c03b4d736ead2e13a469c31ac5df0.png HTTPS 解析

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

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

ba8e9fb5ccb90c39330532b8ba6db825.png

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

f54e28a0b5bce38869507c5a8af91ddf.png

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

81d6dbd8702a2c9e7c524da22af07a9c.png 6、使用 Charles + Burpsuite 进行对 APP 进行抓包

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

3e6a3cdda07b7bf2464d78859a7c52d3.png

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

cf90e14741c9c0d8b11960875e9be21a.png

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

e6b002525251da384e675c89c357acdf.png

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

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

e8dd9050a9533e1cbf4ea0cef4c1caf8.png

配置代理

1e5d855a911cb82bebcf02c56a3e2989.png

添加代理服务器

ad0b551c70241e72c589427ab5d1d197.png f121c73ee962a65042284fd5957b6f57.png

点击保存

76ac85c87210db3c78ccb8cb8993de02.png

配置规则

a9d731af8db2c1717071494f7be6d069.png

添加规则

fbab935dbd01c1910ae442b1f647d0ca.png

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

c6435ba15ce5a75b591483279b248b78.png f5bf7b747f9c71bcdfc1fc62b93ca5ea.png

打开/关闭 Postern

2c1c645c7674c335912ce2082a310d3f.png

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

c421376216d5989003277bc4af3ff3f7.png

但是如果遇到某些比较敏感的 APP,检测 root 的话,可以参考下面的两篇文章进行设置

  • 隐藏 Root - Zygisk 版面具 Magisk 过银行 App 等 Root 检测,Shamiko 模块的妙用[2]

  • magisk 安装与配置[3]


Charles 和 Fiddler 的比较

Fiddler 虽然也可以完成对手机的抓包,但是如果 App 设置了不走代理,那 Fiddler 就失败了,并且 Fiddler 每次都需要手动修改网络设置的代理,但是 Charles 与 Postern 联动配合就不需要手动修改网络设置,只需要配置好 Postern 和 Charles 的连接就可以了,并且可以对绝大部分的 App 进行抓包,不使用代理时,直接关闭 Postern 即可

目前来说,Fiddler 和 Charles 都是很流行的,但是相对来说,还是 Postern + Charles 适用范围更广一些。

31b3292968185f86c566077784e60b4b.gif 8、使用 Frida + Xposed + Objection + Burpsuite 进行对 APP 进行抓包SSL 证书绑定

什么是证书绑定呢?其实网上叫法蛮多的,SSL 证书绑定、英文名字:SSL Pinning 或者证书检验。总之无论怎么叫都是检验证书是否可信任。我们知道从 HTTP 到 HTTPS 数据在传输过程中添加了一层 SSL/TLS,让我们数据流量处于加密状态,不再是明文可见。这时候便有了 CA 证书。

bab074ce593c5bf92fbd66cf54d31233.png

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

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

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

单向校验

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

12e0a7e1f4fea927f06047e33cede848.png

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

使用 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[4] 插件需要到下面的 GitHub 链接自行下载

13cc4a88a0e989a7967343c75b1c8deb.png

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

961a1002eb246b9c32f4f278b87edabf.png

然后使用 Objection 进行绕过

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

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

70f14953887eab65f33a0bf68afa89dd.png

pip3 install objection

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

bcf94a1b6a04878a8c29aa1693ab0f5b.png

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

objection -g 包名 explore

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

frida-ps -Ua

c8b51647786205df4dffd6298a92e3ba.png

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

android sslpinning disable

f995db92c306d181ded38464fff74fda.png

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

4d81478fbca9473e76ac8e91c0d67874.png e33867240c3c0f6e9cd73c338b8bb39c.png

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

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

  • Android 抓包总结[5]
  • [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。

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

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

13912b06af23110174782b143f59bc85.png

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

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

b95fd6b641ac0cde5cde11fe18ffec7e.png

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

cc3af47829683704e8ee8303ac6c1e80.png

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

ae22e3670a722afbd81769006f9c58ce.png 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(可自定义) 抓包之服务器校验客户端证书[6]

执行下面的命令

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

2346112fcf35a8665c92fd4d8aca1abc.png

可以发现我们通过 hook 框架层代码得到了 client.p12证书密码为 111111,然后在 Burpsuite 里面选择 User options — TLS — Client TLS Certificates — Add 进行导入证书,Destination host写*进行匹配所有地址,证书类型选择File(PKCS#12),然后选择Next

fc2c87473e7a0a54eaca7bd8ee564d76.png

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

8ba602b0cf10441e66b6d48fda49e044.png 1b7c3cf2319bb690e514b777ab2b104f.png

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

5b77e1c7934c5fab01f17b3a5d533285.png

还有就是在某些特殊场景 web页面 或者 APP 需要在 PC 电脑端安装证书才能进行访问抓包的,那么就要根据实际情况去操作

c2890318ef620e17dbee78b4941d7551.gif 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 的脚本[7]

它的工作原理就是:

由于所有使用的 okhttp 框架的 App 发出的请求都是通过RealCall.java发出的,那么我们可以 hook 此类拿到 Request 和 Response, 也可以缓存下来每一个请求的 call 对象,进行再次请求,所以选择了此处进行 hook。find 前新增 check,根据特征类寻找是否使用了 okhttp3 库,如果没有特征类,则说明没有使用 okhttp; 找到特征类,说明使用了 okhttp 的库,并打印出是否被混淆。❗️❗️❗️ 这里我使用了真机进行测试,遇到下面的报错,应该是有检测到我真机的一些环境原因吧,因此我就使用了夜神模拟器进行下面的操作

00b0aa929b66cd39ede27dbec8500052.png

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

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

chmod 777 okhttpfind.dex

e3702361359e822567ed9850b1d59a9c.png 然后启动Frida服务端程序

bd3e1ce31792b61529fd6497664a2f62.png 接着执行命令启动 hook 脚本

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

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

okHttp 的 app 案例[8]

6cd6b21f4b252f3b14a767aa21003060.png 3dede9daf59dacb7e822c5779b524778.png

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

dcb4894725a418972d63d8545ab8a950.png

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

6b61c4108e8f80edf0bac81fd8afc8ac.png

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

总结

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

参考资料

  • fiddler 安装教程,算是一次记录吧~[11]
  • 如何使用 Burp suite 抓取 Fiddler 转发的流量包[12]
  • Android 抓包——HttpCanary[13]
  • Android10 导入系统证书的方法。[14]
  • 学完这篇 Charles 抓包教程,我直接把 fiddler 卸载了[15]
  • Charles+Postern 抓包[16]
  • 如何通过 Charles+BurpSuite 的配合在 PC 端抓到手机包[17]
  • Charles 乱码和 SSL 代理问题解决[18]
  • 走进移动安全(3)-抓包进阶
  • 双向认证 APP 自吐证书密码与抓包
  • [原创]安卓 APP 抓包之双向认证突破[19]
  • Frida 实现的 Android 端 App 抓包小工具[okhttp_poker][20]
参考资料[1]

Move Certificates模块: https://github.com/Magisk-Modules-Repo/movecert

[2]

隐藏Root - Zygisk版面具Magisk过银行App等Root检测,Shamiko模块的妙用: https://www.bilibili.com/read/cv15350941/

[3]

magisk安装与配置: https://freewechat.com/a/MzI3Mzk2OTkxNg==/2247483866/1

[4]

JustTrustMe: https://github.com/Fuzion24/JustTrustMe

[5]

Android抓包总结: https://xz.aliyun.com/t/6551#toc-9

[6]

抓包之服务器校验客户端证书: https://blog.csdn.net/qq409732112/article/details/120061517

[7]

Frida 实现拦截okhttp的脚本: https://github.com/siyujie/OkHttpLogger-Frida

[8]

okHttp的app 案例: http://m.bandao.cn/android/news/bandao_news.apk

[9]

[原创] 如何实现 Https拦截进行 非常规“抓包”(20.9.13-代码更新): https://bbs.pediy.com/thread-252100.htm

[10]

肉丝大佬 r0ysue 的安卓应用层抓包通杀脚本: https://github.com/r0ysue/r0capture

[11]

fiddler安装教程,算是一次记录吧~: https://blog.csdn.net/yeyue0922/article/details/88718363

[12]

如何使用Burp suite抓取Fiddler转发的流量包: https://blog.csdn.net/weixin_48691035/article/details/106781583

[13]

Android抓包——HttpCanary: https://www.modb.pro/db/432723

[14]

Android10导入系统证书的方法。: https://blog.csdn.net/fjh1997/article/details/106756012

[15]

学完这篇Charles抓包教程,我直接把fiddler卸载了: https://www.bilibili.com/read/cv15803460

[16]

Charles+Postern抓包: https://blog.csdn.net/tianyi19/article/details/121254560

[17]

如何通过Charles+BurpSuite的配合在PC端抓到手机包: https://blog.csdn.net/qq_38798840/article/details/125221320

[18]

Charles乱码和SSL 代理问题解决: https://blog.csdn.net/liuqinhou/article/details/127035359

[19]

[原创]安卓APP抓包之双向认证突破: https://bbs.pediy.com/thread-265404.htm

[20]

Frida实现的Android端App抓包小工具[okhttp_poker]: https://blog.csdn.net/siyujiework/article/details/108297912


回复

使用道具 举报

发表于 2023-1-20 01:34:20 来自手机 | 显示全部楼层
这技术贴太厉害了,硬是没看懂。
回复 支持 反对

使用道具 举报

发表于 2023-1-20 22:30:18 来自手机 | 显示全部楼层
来了        
回复 支持 反对

使用道具 举报

发表于 2023-1-25 16:46:42 来自手机 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2023-1-27 22:06:19 来自手机 | 显示全部楼层
能不能抓黄油的cg
回复 支持 反对

使用道具 举报

发表于 2023-3-8 00:14:18 来自手机 | 显示全部楼层
厉害        
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表