android抓包踩坑记录
由于需要公司业务需求,需要抓取APP中摄像机插件的网络包,踩了两天坑,这里做个总结吧。
事先准备
-
android-studio
- emulate
- sdk
需要android模拟器和adb调试工具。如果已经有其他模拟器的话,可以只安装adb调试工具即可
-
mitmproxy
一款代理抓包工具,本来是使用charles的,但是不知为何,我的ubuntu机器安装charles之后每个点击操作都要延迟三秒就换mitmproxy了
遇到的坑
网上寻找了大量的教程和视频,将下载代理工具的CA证书安装到Android之后,均无法抓取https的网络包。
之所以这样是因为在Android7.0及以上的系统中,应用只会任性系统预装的CA证书或应用指定的CA证书,而照网上教程安装的CA证书一般情况都会安装成用户证书,因此导致安装的CA证书,对于这些APP无法生效。
抓包原理
原先的网络请求是客户端向服务端发送网络请求,服务端返回的逻辑,如果需要抓取网络包的话,则需要在客户端与服务端中间代理一层,让客户端先给代理服务器发送网络请求,随后代理服务器可以将网络请求数据给记录下来之后再转发给服务器,同理服务端返回的数据也将有代理服务器记录下来,再转发给客户端。
而对于更加安全的https请求,使用这种中间人的方式则会困难许多 ,因为客户端只会信任一些权威机构认证过的CA证书(就是系统证书),因此如果想要抓取https的网络请求包,则需要将代理服务器伪造的CA证书,加入到客户端中(直接使用手机操作安装的证书是安装到用户信任证书中)而在Android7.0以及之后版本,再想抓取APP的https请求则需要将证书加入到系统证书
实操部分
由于安装系统证书需要具备root权限,因此安装使用的镜像不能带play,带play的正式版,正式版是不允许获得root权限的
博主采用的模拟器配置如下
开启mitmproxy代理服务器
进入官网根据自己的系统去下载对应的包
https://mitmproxy.org/
解压出来是如下的三个可执行文件
在当前路径下执行命令:
./mitmweb -p 8888 --set web_port=9000
- 其中-p后面的8888是指代理服务器用来代理客户端的端口,需要客户端连接这个端口
- web_port是指可在这个web服务器端口下查看抓取的数据包信息,数据包列表展示如下
配置客户端代理
客户端需要和代理服务器在同一网络下:
客户端的配置点击网络,WiFi
进入到wifi的高级选项下,设置代理,手动
其中代理主机名就是启动mitmproxy所在机器的ip,代理端口则为先前设置的8888
配置完成之后重连网络,此时应该可以抓取http请求了。
安装系统证书
连接上代理之后,需要使用连接代理的机器去访问,https://mitm.it/
博主这里使用手机去访问这个url,无法下载证书。后来切换至电脑端代理去访问这个url才下载成功的。
这边需要根据自身系统的不同下载不同的证书,此处需要抓android的包,所以下载的Android。
将下载后的文件mitmproxy-ca-cert.cer重命名成它的hash值.0,随后就可以加入到系统证书路径中了
使用如下命令计算出hash值
openssl x509 -inform PEM -subject_hash_old -in mitmproxy-ca-cert.cer
输出如下:
将文件重命名
mv mitmproxy-ca-cert.cer c8750f0d.0
至此证书已经处理完成,需要将其加入到系统证书路径下,即可抓取https请求。
将CA证书加入至系统证书路径下
首先获取root权限
adb root
对模拟器启用写入权限
# 查看当前模拟器下有多少设备
emulator -avd -list-avds
# 以系统可写的形式启动名为米家的模拟器(执行命令,需要模拟器此时是关闭状态的)
emulator -avd "mijia" -writable-system
模拟器重启完成之后需要adb获取root权限
# 获取root权限
adb root
# 重新挂载
adb remount
# 重启模拟器
adb reboot
# 再次进入root
adb root
adb remount# 将证书上传至system中的系统证书目录下。上述所有操作都是为了让这一步可以写成功
adb push c8750f0d.0 /system/etc/security/cacerts/
随后可以进入到设置中,查看系统证书目录下是否存在刚才上传的CA证书。
至此再操作APP即可抓取到https的网络包,可以在代理服务器的网页端查看。