手机APP抓取HTTPS流量

Burpsuite 抓包

环境:Pixel3 Android 9(已root)

使用 Burpsuite 抓取 Android app 的 HTTP/HTTPS 流量比较方便,首先介绍此方法,具体步骤如下。

设置代理

首先将测试手机和电脑连接到同一个WIFI,其中电脑IP:192.168.113.98/24,手机IP:192.168.113.161/24。手机和电脑能相互通信:

image-20231218143351389

打开Burpsuite,设置监听为电脑IP+端口(192.168.113.98:9999):

image-20231218143835104

设置手机WIFI网络使用电脑192.168.113.98:9999代理,手机app的所有流量都走192.168.113.98:9999。流量走向为:APP=>wlan0(192.168.113.161)=>192.168.113.98:9999=>Burpsuite=>电脑=>外网:

image-20231218144524842

导入Burpsuite证书

抓包之前需要将Burpsuite的证书导入到手机中。在手机浏览器中输入 http://burp 即可下载CA证书,保存在SD卡中后可以在手机中选择安装:

image-20231218145152130 image-20231218145213665 image-20231218145230906 image-20231218145242738 image-20231218145308333

但是在最后安装证书的时候证书无法安装,导入时是灰色,不可选。在Android 9中,安装证书的方式和低版本有区别,不能直接安装,需要修改证书格式,并手动放置到证书目录中。参考:AOSP Android10导入BurpSuite CA证书抓包

在Burpsuite中导出证书,如果前面的步骤中手机没有浏览器,可以直接在Burpsuite中导出证书,然后adb push到手机上。

修改证书格式,并adb push到手机系统证书安装目录(/system/etc/security/cacerts)(openssl可以使用windows子系统wsl中的命令):

其中向/system/etc/security/cacerts写入文件时需要先执行 adb root & adb remount ,因为/system/etc/security/cacerts默认是只读的。如果执行有问题,可以参考笔者博客的《Notes》部分。

开始抓包

配置代理并导入证书之后,即可在Burpsuite中抓取到app https流量:

image-20231218153344704

Tcpdump + Wireshark + Android 9(root)/车机(root)

1
环境:Pixel3 Android 9(已root)

准备工作:

frida

tcpdump:https://www.androidtcpdump.com/android-tcpdump/downloads

tcpdump下载之后adb push到手机上,并chmod给其加上执行权限。

注:需要先开启抓包,然后再执行hook ssl key的脚本,确保在同一个SSL Session中,否则抓取的ssl key不能解密https数据包,因为重新启动APP,SSL Session会重新创建,会重新生成ssl key。

运行tcpdump开启抓包

1
tcpdump -i any -s 0 -w /sdcard/Download/capture.pcap

hook app获取ssl key

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// sslkeyfilelog.js
function startTLSKeyLogger(SSL_CTX_new, SSL_CTX_set_keylog_callback) {
console.log("start----")
function keyLogger(ssl, line) {
console.log(new NativePointer(line).readCString());
}
const keyLogCallback = new NativeCallback(keyLogger, 'void', ['pointer', 'pointer']);

Interceptor.attach(SSL_CTX_new, {
onLeave: function(retval) {
const ssl = new NativePointer(retval);
const SSL_CTX_set_keylog_callbackFn = new NativeFunction(SSL_CTX_set_keylog_callback, 'void', ['pointer', 'pointer']);
SSL_CTX_set_keylog_callbackFn(ssl, keyLogCallback);
}
});
}
startTLSKeyLogger(
Module.findExportByName('libssl.so', 'SSL_CTX_new'),
Module.findExportByName('libssl.so', 'SSL_CTX_set_keylog_callback')
)
// https://codeshare.frida.re/@k0nserv/tls-keylogger/
1
frida -U -l ./sslkeyfilelog.js  -f cn.damai

Wireshark 分析

adb pull 拉取抓取的数据包:

1
adb pull /sdcard/Download/capture.pcap

将frida脚本hook到的ssl key保存成文件sslkeys.txt,格式如下:

1
2
3
4
5
6
CLIENT_RANDOM 90084f71abb9eb6009e0a638b841c0a9010bc1401c44978771310d4a59d3d2ab 82d8a67d90a89d50287b7002296a8b64d9cb0f29ec493c7c8c019350b3be776e669afdcc02d39b1ae4e63b5e8c1c0489
CLIENT_RANDOM 77053bfeea04bfd2dd1bbf307eb0a7256e7512fc2a727c6285090546127cab6d 485754f21aa483eb7eeb11d4ea7e0293be380e52ea37aef2f797ad5b10e8d254753c81e4e9e0ee4bc833cf5a29588341
CLIENT_RANDOM 195cee7e1dd746ff38580e983bd7233165d74782c5c99c6154735ff665c065de cfc5c085daa975d9a8f7c70f282e79ae6d2a3554948c111aeda2e0789455c37731e1de3ab7f078856ee71fe4af857787
CLIENT_RANDOM 452c18b50582a85c1067574092430be96c659bb72034954f16eb3b7f1ea89c34 ee0a595b6757beab3c3457b2d59e16f4e485747b35bcaf377cadb400ad2f3b5a79c4c1796e5665872591310278da16c7
CLIENT_RANDOM 7510caa066bd214b46452da852e020a8f2ea8c4ef3b04ca9eff5b95a790ad3bf 1621399e0c38b6db441b82ac334fbcfbcfeec5435f48290b31dae6f89bdf1f0b9554371c719a6461a1033fba159e26a1
···

wireshark打开capture.pcap,采用如下过滤条件:

1
(http.request or tls.handshake.type eq 1) and !(ssdp) and (tcp.port==443)

可以看到wireshark无法解析https流量:

点击菜单栏:Wireshark=>Preferences=>Protocols=>TLS,导入sslkeys.txt文件:

image-20240527142125189

再次执行wireshark过滤条件,wireshark能解析https流量:

Frida Hook 抓包

1
环境:Pixel3 Android 9(已root)

准备工作:

frida

在APP中,有一些常见的用于发起网络请求的API,也包括自定义的API接口,hook这些API函数,就能获取请求和响应的数据。

工具:

https://github.com/siyujie/OkHttpLogger-Frida