APP测试系列-Android APP绕过安全检测机制
一、前言
前段时间遇到一个 APP 无法通过 正常手段 进行 HTTPS 流量的抓取, 且带有 Root 检测,Root 过的手机无法正常打开 APP,于是对该 APP 开展了简单的学习分析。
问题场景:Android APP 、某厂商加壳、代理检测+root检测,无法通过正常手段抓取 HTTPS 流量。
二、绕过 ROOT 检测
Magisk 在 v24 版本之后取消了 Magisk hide 和在线仓库,现可直接通过 Zygisk(Magisk v24之后的版本自带)来实现对指定的 APP 进行 Root 隐藏。新版本 Magisk 下载地址:https://github.com/topjohnwu/Magisk/releases ,笔者使用版本为 Magisk 26.1,下载安装完成 Magisk 后重启手机(注意这属于 Root 部分,该文章不会详细阐述,请根据自己的手机上网搜索相关的文章进行安装)。
具体 APP 使用了 Root 检测导致 APP 无法正常使用情况,如:界面提示 Root 机器无法运行、 APP 软件闪退、软件卡在某一页面,等等情况。
注意:手机刷入 Magisk 实现 Root 的手机环境需要自己提前准备,这边不作展示,因为每台机子有些许差异,笔者使用的是 Mi 8 刷 Pixel experience 环境,具体文章可参考:APP测试系列-小米8 线刷 Pixel Experience
方法一:使用高版本 Magisk 绕过
在 Magisk v24 之后 Zygisk 自带 “遵守排除列表” 功能,可通过该功能对指定的 APP 进行 Root 隐藏 ,即手机实际已经 Root 但手机可单独告诉指定的 APP: “我是 Android,我没 Root,开门让我进去”。具体操作: 打开 Magisk APP -》点击右上角设置-》点击开启 Zygisk-》重启手机-》再次打开 Magisk 进入设置打开遵守排除列表-》 点击配置排除列表-》 勾选需要隐藏 Root 的 App 程序
,然后再次打开测试 APP 查看是否已经绕过了 Root 检测。
方法二:使用 Shamiko 插件绕过
当然除了自带的 Root 隐藏,也可以通过 Shamiko 插件模块进行 Root 隐藏,若第一种方法不行,可尝试这一种,这里提供多一个思路。具体插件安装步骤: 打开 Magisk APP -》点击右下角模块-》点击从本地安装找到提前下载的 Shamiko 插件安装包-》 点击重启,重启手机后查看模块出现 Shamiko 即安装完成
,Shamiko 插件地址:https://github.com/LSPosed/LSPosed.github.io/releases
安装完插件后就可以配置需要隐藏的 APP 列表绕过 Root 检测,具体操作: 打开 Magisk APP -》点击右上角设置-》关闭"开启的遵守排除列"-》重启手机-》重新打开 Magisk APP 右上角设置-》配置排除列表-》点击勾选需要绕过的 App
,然后打开 APP 查看是否绕过了 Root 检测。
方法差异
Shamiko 与 zygisk magisk自带的遵守排除列表的区别:若使用 zygisk magisk(即高版本 Magisk v24+) 自带的排除列表功绕过 Root 检测,这样排除列表中的应用则无法使用 magisk 和 xposed 模块,当想对某个排除列表中的应用使用虚拟框架和模块,就需要使用到 Shamiko 模块,这边只了解两种方法差异,不作详细探究。
三、绕过 SSL Pinning
Android 相关知识点
Hook 技术
Hook 通常被称为 钩子,指 Android 应用程序在运行中通过修改或扩展现有代码的行为来实现某种特定功能或实现定制化需求的技术。换个思路理解就类似于我们日常 Burp 抓包修改,当 Android 应用在运行过程中,我们通过 Hook 技术(钩子)插入或修改应用程序的代码使其执行我们想要效果。
其中主要 Hook 实现技术又分为:
- 动态代理:通过创建一个代理对象来拦截目标对象的方法调用,并在调用前后执行自定义代码。在 Android 中,可以使用 Java 的动态代理机制或者第三方库(如 Xposed、Frida 框架)来实现动态代理。
- 字节码注入:通过修改应用程序的字节码来插入自定义的代码。这可以通过使用字节码操作库(如 ASM、DexPatcher)或者 Xposed 框架来实现。字节码注入可以在应用程序运行时修改代码逻辑,甚至可以替换整个方法的实现。
Hook 框架
Frida
动态插桩工具包,Frida 允许开发者使用 JavaScript 编写自定义脚本与目标应用程序进行交互并修改其行为,Frida 还提供 了 API,可以进行动态代码注入、函数挂钩、内存操作、脱壳等。
Xposed
基于 Root 权限的框架,用于在 Android 设备上修改应用程序的行为。Xposed 的核心概念是 “挂钩”(hooking)即通过在应用程序的运行时环境中插入代码来拦截和修改方法调用,开发者可以在不修改应用程序源代码的情况下,对应用程序的行为进行修改和扩展。Xposed 模块通常使用 Java 或 Kotlin 编写,并且可以通过 Xposed 框架提供的 API 来与目标应用程序进行交互。
HTTPS 加密机制
通常对于 Android APP HTTPS 流量的抓取,笔者一般情况下习惯使用 Friddle + Burp 的组合进行流量的抓取,具体文章可参考:APP测试系列-Android客户端流量抓包,但当 APP 使用了其它的机制或加密方式则可能导致无法抓取该 APP HTTPS 的流量,这时候就需要分析一下 HTTPS 的加密机制了。
SSL/TLS 加密协议
HTTPS 在 HTTP 基础上添加了 SSL/TLS 加密层的协议,其中一用途就是为了防止 MITM中间人攻击 。日常我们使用 Burp 抓包也知道,想要获取 HTTPS 网站的明文数据包我们需要安装 Burp CA 证书才能拦截和解密通信数据,有时候我们在抓取 HTTPS 流量时,例如抓取安全设备网站页面通常数据包都是加密的,这是因为网站使用了较新的 TLS 版本和加密套件或者使用了特定的客户端证书,此时 Burp CA 证书的解密方式就失效了,所以就只能抓取到一窜加密的数据。
SSL PINNING
SSL pinning(SSL证书锁定)是一种用于增强应用程序安全性的技术,主要用在防止中间人攻击和证书欺骗。主要验证机制如下:
- 应用程序内置公钥:应用程序开发者将服务器的公钥或证书指纹嵌入到应用程序代码中,通常是在应用程序的配置文件或代码的特定位置。
- 运行时验证:当应用程序建立与服务器的连接时,它会验证服务器的公钥或证书指纹是否与预置的值匹配。如果匹配成功,则建立安全连接;如果不匹配,则认为连接不安全,可能存在中间人攻击。
通过 SSL Pinning,应用程序可以确保与服务器建立安全连接的过程中不被中间人攻击所破坏。即使攻击者使用伪造的证书,由于与预置的公钥或证书指纹不匹配,验证过程将失败,普通的 Burp CA 也就自然无法抓取该程序的 HTTPS 流量。
如何判断应用程序使用了 SSL pinning ?
在日常测试中,经过多次的前车之鉴,当常规方法不能抓取 HTTPS 流量时,自然而然就想到程序是否使用了 SSL Pinning ,当然我们也可以对程序的分析来进行判断。例如将该程序 apk 进行逆向分析,全局搜索其代码有没有使用如:HttpURLConnection、HttpClient、OkHttp、Volley 等库,并分析其逻辑,显然这种方式对于测试者来说过于复杂。所以我们直接跳过分析尝试绕过 SSL Pinning 若能抓到即为使用了 SSL Pinning 降低测试成本 。
Frida + Objection 绕过 SSL Pinning
Frida 我们在前面已经简单的介绍过了,这边再引入一个开源工具:Objection , Objection 是基于 Frida 框架开发的一个工具,它提供了一组便捷的功能和脚本,以简化在移动应用程序中使用 Frida 进行动态分析和漏洞利用的过程。其中 Objection 内置了 SSL Pinning 绕过脚本,所以我们可以尝试使用 Frida + Objection 去绕过 Android 应用的 SSL Pinning,具体步骤如下:
1、下载 adb 用于电脑与手机的连接,下载地址:https://developer.android.google.cn/studio/releases/platform-tools?hl=zh-cn
2、使用具备数据传输的 usb 数据线,然后电脑与手机连接,需要开启手机的 开发者模式 ,usb 使用文件传输模式,然后就可以使用 adb 连接手机 。 adb 目录下终端执行 adb.exe devices
,然后点击手机弹出的允许 USB 调试
然后 终端执行 adb shell
即可进入 Android adb shell ,默认为普通权限,su
后为 root
权限
3、电脑安装 Objection
1 | pip3 install objection |
因为 Objection 是依赖于 frida 框架的,所以再安装完 Objection,frida 也同步安装了,这时候需要查看电脑安装 frida 的版本,因为下一步手机上的 frida-server 版本必须要和电脑上的 frida 版本一致,不然会报错,此次 frida 版本为 16.1.4
1 | frida --version |
4、手机上通过 adb 上传 frida-server 版本为 16.1.4,frida-server 下载地址: https://github.com/frida/frida/releases
1 | # 默认开启进入 adb shell 为 root 权限,因为上传需要 root 权限 |
进入 /data/app_test
给予 frida-server-16.1.4-android-arm64
777 权限(运行需要)
1 | # 进入 frida-server-16.1.4-android-arm64 所在的目录,这边为 /data/app_test |
5、准备利用 Objection 绕过 SSL Pinning,首先查找 app 的包名是什么,个人习惯使用 GetAPKInfo 工具来获取 APP 包名,例如下面的例子
1 | java -jar GetAPKInfo.jar apk包路径 |
6、返回 adb 启动 frida-server
1 | ./frida-server-16.1.2-android-arm64 (若 + & 则在 Android 后台运行) |
7、启动 Objection ,通过进入 Objection 关掉 Root 和 SSL Pinning
1 | objection -g 刚才通过GetAPKInfo获取待测app的包名 explore |
当使用上述命令后即对指定包的 APP 启动了 Objection 工具 ,然后手机上会调用启动 APP ,此时手机会自动弹出 APP 界面并运行
此时就可以在 Objection 上禁用该 APP 的 Root 和 SSL Pinning
1 | android root disable |
8、此时可利用常规手段 Fiddler + Burp 进行 HTTPS 流量抓包,即可绕过 SSL Pinning 机制获取 HTTPS 流量包,Fiddler 下载链接:https://telerik-fiddler.s3.amazonaws.com/fiddler/FiddlerSetup.exe
1)配置抓取 HTTPS 流量,Tools-》Options-》HTTPS
勾选 HTTPS
勾选后会弹出安装证书的提示,根据提示一直点击 是 安装即可。
2)配置代理端口 Tools — Options — Connections
,端口选择 9000(可随意更改),勾选 Allow remote computers to connect ,点击 OK,重启 Fiddle 使配置生效
3)配置手机端代理与 Fiddler 设置的端口一致,让 APP 流量走 Fiddler 这里手机也是同一 WIFI 下的本机 IP。
配置后,在手机浏览器访问上面设置的 IP 地址和端口号,我这里是 192.168.1.102:9000(这里要根据实际情况),然后 FiddlerRoot certificate 进行下载证书,并自行安装配置
5)Fiddler 配置,Tools-》Options-》Gateway-》Manual Proxy Configuration
填写 127.0.0.1:8080 使与 Burp 的监听地址一致。
6)Burp
开启监听,等待 Fiddler
流量转发过来
7)最后返回待测 APP 上点击功能点,流量从 Fiddler 转发到了 Burp,这里就不用展示了,在遇到需要测试的 APP 存在 SSL Pinning 自己可去实践一下即可。
四、总结
本文实践起来不算复杂,但需要理解 adb、手机 Root 、hook、抓包 等技术的基础原理,通过串联几种基础的技术进而加深了解 Android 测试过程中遇到问题以及解决方法。
五、参考
1 | https://saucer-man.com/information_security/930.html#cl-1 |