从零开始:配置安卓手机进行渗透测试
*Jeff Barbi // 客座文章
背景
除非您经常进行移动应用渗透测试,否则您的方法很容易过时。每个新版本的Android都会带来额外的安全功能需要绕过,使您三年前用于设置测试设备的过程变得过时。
如果您像我一样,每次配置手机时都会重新发现一个新过程,而不是记录上次手机的设置方式。这是冗余且愚蠢的。更糟糕的是,这些信息分散在互联网上的代码库、博客和论坛帖子中。更糟糕的是,这些信息大多已经过时,不再有效。
以下内容旨在通过记录一个在撰写本文时(2022年10月)适用于Android 12的已知良好过程,为他人节省时间。
我拿了一台出厂未root的Pixel 4A,运行最新的Android 12 “snow cone"稳定版本,并记录了从头到尾配置它进行渗透测试所需的步骤。这包括击败越来越常见的证书固定。在每个部分的开始,我包括所需的工具以及获取它们的位置。
我们将采取的操作顺序如下:
- 启用开发者模式、引导加载程序解锁和USB调试
- 解锁引导加载程序
- 使用Magisk修改出厂引导镜像
- 将此新镜像刷入引导加载程序,root手机
- 将Burp证书转换为Android期望的格式
- 使用自定义Magisk模块模板安装程序将Burp证书安装为受信任的CA
- 在手机上安装并运行Frida服务器
- 将Frida服务器代理与Runtime Mobile Security前端连接
- 通过RMS在挂钩进程中运行目标应用
- 使用自定义RMS插件绕过证书固定
我从一台出厂原装、开箱即用的手机开始:
我按照提示加入Wi-Fi,登录Google账户,接受服务条款等。
注意:本教程的主机运行基于Debian的Linux发行版。这些步骤应该适用于其他发行版和/或OSX,但某些语法可能不同。
Root手机
所需工具
Android Debug Bridge (adb)
|
|
fastboot
|
|
注意:像apt这样的包仓库会有这些工具的旧版本。它们可能有效,但我使用了开发者网站上的版本。
解锁引导加载程序
如果我们想安装Burp证书、Frida、击败证书固定等,我们需要root我们的手机。这涉及将修改后的引导镜像写入手机的引导加载程序。要做到这一点,我们需要解锁它。
启用开发者模式 转到设置 -> 关于手机。点击"版本号"7次。输入PIN后,您将看到"您现在是一名开发者!“的消息:
启用USB调试和OEM解锁 转到设置 -> 系统 -> 高级,您将看到一个新项目"开发者选项”。
在开发者选项菜单中,切换打开"OEM解锁”,您将看到一个警告:
确认OK,您的引导加载程序已解锁。
切换打开USB调试,您将看到另一个警告:
选择OK。
测试adb 现在USB调试已启用,我们可以使用adb和fastboot。
将手机连接到计算机并确认adb可以连接到手机:
|
|
然后使用adb重新启动到fastboot模式:
|
|
手机将重新启动,我们现在可以在手机上运行fastboot命令。
检查fastboot是否可以连接到手机:
|
|
现在我们可以解锁引导加载程序:
|
|
警告屏幕将更改,“不要锁定引导加载程序"默认选中。按音量增大键选择"解锁引导加载程序”,然后按锁定按钮。
手机将重新启动回到fastboot模式。按锁定按钮,手机将再次重新启动。引导加载程序现已解锁。
当手机启动时,再次按照提示加入Wi-Fi,登录Google账户等。
重新启用USB调试 解锁引导加载程序会重置手机,禁用开发者模式和USB调试。按照之前的方式重新启用这些:
- 设置 -> 关于手机。点击"版本号"7次,然后输入PIN。
- 设置 -> 系统 -> 高级,进入"开发者选项"菜单。切换打开"USB调试"。
重新启动手机。在警告提示上点击允许:
安装Magisk应用
在此处下载Magisk应用作为APK文件:https://github.com/topjohnwu/Magisk/releases/latest
然后使用adb安装应用:
|
|
使用Magisk修改引导镜像
Magisk可以为我们修改出厂引导镜像,我们将将其写入引导加载程序并root手机。
重要提示:修改引导镜像在不同手机上操作方式不同。以下内容适用于Pixel 4A和使用相同分区方案的其他Google手机。其他厂商手机的详细步骤在此处描述:https://www.xda-developers.com/how-to-install-magisk/
Nexus和Pixel设备的引导镜像在此处可用:https://developers.google.com/android/images
由于我使用Pixel 4A和Android 12,我下载了android 12.1.0 “sunfish"镜像:https://developers.google.com/android/images#sunfish
这是镜像的直接链接:https://dl.google.com/dl/android/aosp/sunfish-sq3a.220705.003.a1-factory-c1963f71.zip
重要提示:对于此步骤的其余部分,您下载的镜像与手机上的Android版本匹配至关重要。
修补镜像 解压缩zip文件,然后解压缩引导镜像:
|
|
使用adb将此文件推送到手机。我选择了Download目录,因为在Magisk中很容易找到:
|
|
现在打开Magisk应用并选择安装:
然后"选择并修补文件:”
然后"让我们开始吧。“您将看到安装日志输出,文件将写入与原始文件相同的目录:
使用adb将新文件从手机拉取(您可以使用制表符补全,文件名将以"magisk_patched"开头):
|
|
现在我们有了一个已root的boot.img文件,准备写入引导加载程序。
写入修补后的镜像 剩下的就是将我们修补后的镜像写入引导加载程序。
使用fastboot写入镜像:
|
|
验证root 当手机重新启动时,它现在应该已经root。我们可以用adb验证这一点:
|
|
手机上应该出现一个警告提示:
接受此提示,过程应该允许root:
|
|
安装Burp证书
使用Burp拦截请求会破坏TLS证书链。没有信任根,TLS将无法工作,我们无法使用Burp动态测试应用。
导出和转换证书 注意:以下步骤部分取自此处:https://blog.ropnop.com/configuring-burp-suite-with-android-nougat/
首先,启动Burp。然后导出证书:
|
|
然后将其从DER转换为PEM格式:
|
|
Android证书使用文件的哈希值命名。将cacert.pem重命名为这种格式:
|
|
现在我们准备将证书复制到手机。
使用MMT创建模块 在早期版本的Android上,我们可以简单地将证书写入手机并完成。较新版本的Android使用不同的分区方案,使得在root手机上将/system分区挂载为可写更加困难。即使作为root用户,像mount -o remount,rw /system这样的命令也不再有效。
因此,我们将使用Magisk Module Template Extended (MMT-Ex)将Burp证书写入手机。MMT自动化Magisk模块的安装,我们可以使用它来帮助安装我们的证书。
注意:以下步骤大致取自此处:https://github.com/Zackptg5/MMT-Extended/wiki
克隆仓库:
|
|
现在,我们将创建MMT在运行我们的模块时将在手机上重新创建的目录结构:
|
|
然后将手机上的现有证书拉取到此目录中,以便在运行模块时不会删除它们:
|
|
并添加Burp证书:
|
|
文件customize.sh本质上是我们模块的设置脚本。例如,在此处配置的任何文件系统权限将在模块安装时在设备上匹配。这样我们可以确保我们的新证书具有与手机上其余证书相同的文件权限。
修改customize.sh,根据文件中的示例替换第36行的REPLACE变量:
|
|
在文件中进行以下替换/添加(遵循示例):
|
|
压缩模块并将其推送到手机:
|
|
在Magisk中安装模块 在安装模块之前,我们需要启用Zygisk。打开Magisk应用,点击右上角的设置图标。切换打开"Zygisk:在zygote守护进程中运行部分Magisk:”
重新启动手机。
打开Magisk应用并导航到模块 -> 从存储安装:
选择zip文件,Magisk将将其安装为模块:
再次重新启动手机。
要验证证书现在受信任,导航到设置 -> 安全 -> 加密和凭据。您应该有一个Portswigger条目:
通过USB代理流量
安装了受信任的Burp证书后,我们可以拦截运行中的应用的流量。
确保adb正在运行并连接到手机。然后启动反向代理,它将路由手机上的给定本地端口到主机计算机上的给定本地端口。Burp默认监听8080,因此我们将使用:
|
|
现在将手机的网络连接设置为使用本地端口8080: 设置 -> 网络和互联网 -> 互联网 -> 您的SSID -> 右上角的编辑按钮
应用流量现在应该通过Burp监听器路由。
绕过证书固定
证书固定是一种确保不仅主机的证书有效,而且是该主机的预期证书的方法。没有其他证书会工作,即使它是有效的、签名的、受信任的证书。
这变得越来越常见,如果我们想代理和分析应用流量,这为我们提供了一个额外的障碍需要绕过。
所需工具
Frida工具
|
|
nodeJS和npm
|
|
Runtime Mobile Security (RMS)
|
|
使用RMS
RMS是一个Web界面,使用Frida在运行时提供调试功能和操作工具:https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security
Frida使用Google的V8引擎在挂钩进程中运行JavaScript。这使我们能够与函数交互并修改它们的行为;例如,更改TLS检查的返回值。我们可以使用它来击败诸如损坏的证书链或绕过证书固定等障碍。
安装Frida服务器
因此,我按照评论中的说明卸载了com.google.android.art:
|
|
然后我重新启动了手机,我能够安装Frida服务器。这可能在未来的Frida版本中得到修补(在撰写本文时我使用的是15.2.2)。
Frida客户端和服务器版本匹配很重要。
检查使用Frida-tools安装的Frida客户端版本。从Frida git仓库下载此版本的Frida服务器。然后解压缩xz文件,并将其推送到手机:
|
|
注意:每个Frida版本包括许多相关工具,具有各种架构的构建。确保获取您使用设备的架构的Frida服务器。
现在连接到手机并启动Frida服务器:
|
|
现在运行frida-ps -U,您应该看到包列表:
|
|
Frida工作,因此我们准备用RMS连接到