网络安全
安卓 App 渗透测试:客户端与服务端

本篇整理自我的语雀学习笔记(课堂学习与实操记录),已转为纯文字版并按博客格式排版。
第一部分:客户端渗透:逆向对服务端渗透的支撑
安卓逆向对服务端渗透的帮助作用
1 找 api 接口
2 找硬编码的密钥 (api key、 jwt secret、ak sk )
3 找前端加密的算法逻辑
4 绕过双向认证(找p12证书和证书的密钥都需要逆向分析)
安卓逆向教程: https://github.com/ZJ595/AndroidReverse
安卓逆向工具 : https://github.com/WuFengXue/android-reverse
常见工具
反编译就是为了翻密钥,找密钥
jd-gui.jar
作用:把 jar 包反编译为 java 代码
(无法直接适配 apk,因为 apk 里不是 class 文件 ,是 art 的中间语言smali的dex文件, 需要使 用其他工具把 dex 转成 jar,才能在该工具中打开)
JEB
作用:反编译 apk
加壳/脱壳
软件壳简介
什么是加壳:软件的保护机制,加壳可以防御攻击者反编译
查壳:查看软件是否加壳,加了什么壳,壳是什么版本
查壳工具:
ApkScan-PKID.jar
自动脱壳
脱壳 :https://github.com/CodingGay/BlackDex
脱壳后的文件都是 dex 文件,需要把 dex 文件转为 jar 包,才能在分析工具中打开
转换工具:
dex-tools-v2.4
d2j-dex2jar.bat 你的dex文件目录的路径/*.dex
d2j-dex2jar.bat ./com.kmxs.reader/*.dex
转换好的 jar 包可以直接在 jd-gui 打开即可
第二部分:服务端渗透实战
Android简介
基于linux内核的类linux系统,google 开发维护,原生基于kotlin,运行在 dalvik 虚拟机(安卓5之前)、art 虚拟机中
- Android 服务端:一般企业和web共用接口,常见的开发技术有 springboot、go、node 或serverless
- Android 客户端:apk 文件,常见的开发技术有 kotlin(原生)、Jetpack Compose(原生)、flutter (google开发的框架)、react native(js写apk)、uniapp(vue写apk)、u3d (做游戏)、ue (做游戏)
环境配置
模拟器
雷电(课程使⽤)、夜神、逍遥
选择系统 android 9 (默认)
雷电多开器
1 打开 system 可写
2 打开 root 权限
打开 开发者 模式
设置app->关于
抓包
系统证书安装
Android >7 之后,安卓不再信任用户证书、安卓不再允许 http 访问,Android 7 之后必须安装系统根证书才能被信任
证书准备
1 burp 导出证书
2 der 类型的证书是二进制格式证书,安卓无法使用,需要进行base64 编码转为 pem 格式证书
下载openssl (配置环境变量): https://slproweb.com/products/Win32OpenSSL.html
openssl x509 -inform DER -in 你的der证书⽂件名 -out 导出的pem证书⽂件名
openssl x509 -inform DER -in 1.der -out 1.pem
3 读取证书签名信息
openssl x509 -inform PEM -subject_hash_old -in pem证书⽂件名
openssl x509 -inform PEM -subject_hash_old -in 1.pem
4 把 pem 证书重名为 9a5ba575.0 (安卓系统只能看懂这种⽂件名的证书)
导入证书 adb 安卓调试桥
雷电⾃带,可以配置环境变量
查看 安卓设备(usb连接、模拟器)
adb devices
切换安卓设备为root⽤户后,再打开安卓设备shell
adb root
adb shell
把证书传到安卓系统
adb push 9a5ba575.0 **/system/etc/security/cacerts**
adb remount
adb push 9a5ba575.0 /system/etc/security/cacerts
改证书⽂件权限
adb shell chmod 644 /system/etc/security/cacerts/9a5ba575.0
重启安卓系统
抓包测试
wifi 代理 (实际不⽤)
缺点:
- 每次都要⼿动配置 wifi 代理,很麻烦
- app 很容易检测到 wifi 代理,直接拒绝访问
- flutter 写的 app 不⽀持 wifi 代理
1 设置wifi 代理
2 改burp的监听地址
3 访问百度测试
VPN 代理
使⽤第三⽅⼯具 Postern(通过 vpn 虚拟⽹卡接管 安卓系统的所有流量)
1 配置代理
2 配置规则
如果想抓包就改为 通过代理连接
如果不想抓包了,改为直连即可
抓包限制
1 app 可能会检测是否开启了 wifi 代理,是否开启了 vpn,是否是模拟器
2 app 可能会检测设备是否 root
3 app 可能会验证证书是否是服务器发来的可信证书 (证书绑定单向认证 ssl pinning)
4 app 可能会验证证书是否是服务器发来的可信证书,同时服务器也会验证客户端的证书是否可信 (双向认证mtls)
怎么判断抓包被限制了?
- 抓包前 app ⼀切正常
- 开启抓包后,app 闪退、断⽹、抓的包都是乱码
绕过限制
证书绑定的单向认证绕过 (JustTrustMe)
证书绑定就是:App 不再盲目信任系统证书库,而是只信任指定的证书。App 在代码里硬编码了服务器证书的特征(比如公钥的哈希值)
如何绕过证书绑定?
对 app 进行hook(hook就是在程序运行时状态下改变程序的逻辑),删除app验证证书是否可信的代码
hook 常⻅的⼯具
- xposed : hook安卓系统的框架
- lsposed(推荐): hook 安卓系统或hook某⼀个软件
- magisk : root 管理⼯具,隐藏root,可以注⼊到 zgnote 与 lsposed 联⽤
magisk 安装
Magisk Terminal Emulator_17.7.apk
m 输入丫,点击允许
Magisk_v25.2.apk
Root Explorer_v4.10.1.apk
点击允许
如果不⼩⼼点错拒绝了,进⼊ magisk 中可以修改
重命名 /system/xbin/su 改为 su.bak
改完后强制重启,再次打开magisk,成功
LSPosed 安装
安装 LSPosed-manager.apk
把LSPosed-v1.8.4-6609-zygisk-release.zip 传到模拟器中
在 安卓系统的 Pictures ⽬录下就能看到刚刚传进来的⽂件
打开 magisk
到 pictures ⽬录中选择刚传进来的LSPosed-v1.8.4-6609-zygisk-release.zip
安装完毕,强制重启
打开 LSPosed ,看到 “已激活” 就安装成功
JustTrustMe 安装
安装 JustTrustMe
安装后 在 LSPosed 中启⽤该模块
开启 hook
需要 hook 哪个 app 就勾选哪个 app,如果目标使用了证书绑定,即可绕过证书绑定抓包
原理:apk 运行时删除了 X509 SSL 类相关的证书验证代码(fluter 开发的app无效,一般对kotlin 原生开发的app最有效)
frida 27042
Frida是一款强大的跨平台动态代码插桩(Hook)工具,主要⽤于安全研究、逆向⼯程和应⽤调试,它允许开发者在运⾏时向应⽤程序内存中注⼊⾃定义的JavaScript脚本,从⽽监视、修改甚⾄绕过应⽤⾏为
客户端 (以管理员身份运行 命令行)
pip install frida
pip install frida-tools
服务端
把服务端传输到安卓系统
**adb push frida-server-17.2.15-android-x86_64 /data/local/tmp/**
进⼊ root 终端
adb root
adb shell
为 frida-server-17.2.15-android-x86_64 赋予执⾏权限
chmod 777 ./frida-server-17.2.15-android-x86_64
后台运⾏ frida-server-17.2.15-android-x86_64 ,并查看端⼝,默认是 27042
./frida-server-17.2.15-android-x86_64 & 后台运行, 默认端口 : 27042
netstat -anltup显示网络连接、监听端口及相关进程信息
使用adb把安卓系统中的27042端口映射到windows电脑
adb forward tcp:27042 tcp:27042
frida使用
查看安卓系统安装了哪些apk :
frida-ps -Uai
chmod 777 ./frida-server-17.2.15-android-x86_64
frida 绕过 ssl pinning 脚本
frida 脚本和 上述的 JustTrustMe 会冲突,需要先把 JustTrustMe关闭
frida-android-repinning.js 作⽤: 替换app中原本绑定的证书,强制app信任⾃⼰⽣成的burp证书
1 导⼊burp的证书到安卓系统中
burp 的证书默认是 der 格式,可以直接重命名为 cert.crt
**adb push cert.crt /data/local/tmp/cert.crt **
2 运⾏ frida 脚本
**frida-ps -Uai**
3 frida运⾏后,模拟器会⾃动打开对应的app进⾏ ssl 证书的重绑定, 即可抓包
frida -U -f 软件包名称 -l frida脚本的名字
frida -U -f com.taptap -l .\frida-android-repinning.js
双向认证绕过
服务器需要验证客户端的证书,客户端也需要验证服务端的身份
绕过唯一途径:
逆向 apk 找证书 和密钥
- 客户端对服务器验证:app内预置的根证书会验证服务器证书的有效性
- 服务器对客户端验证:服务器会要求 app 提交自己的证书,服务器收到证书后,对证书进行验证
绕过唯一途径:逆向 apk 找到 证书 (p12证书)和密钥
参考:https://mp.weixin.qq.com/s/0uItUS5P8gFQ1Cu5-jkCgQ
- 解压获得 p12 证书文件
- 逆向 so ,获取到 p12 证书文件密钥
- 把证书导入到 burpsuite 中进行抓包
未来的途径:eBPF 内核抓包 (Android 12 以上版本才支持)
你的赏识是我前进的动力

