本篇整理自我的语雀学习笔记(课堂学习与实操记录),已转为纯文字版并按博客格式排版。


第一部分:客户端渗透:逆向对服务端渗透的支撑

安卓逆向对服务端渗透的帮助作用

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

加壳/脱壳

软件壳简介

https://apkpure.com/cn/

什么是加壳:软件的保护机制,加壳可以防御攻击者反编译

查壳:查看软件是否加壳,加了什么壳,壳是什么版本

查壳工具:

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 (做游戏)

环境配置

模拟器

雷电(课程使⽤)、夜神、逍遥

https://www.ldmnq.com/

选择系统 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 以上版本才支持)

https://ecapture.cc/zh/

https://github.com/gojue/ecapture