从零开始:配置Android手机进行渗透测试

本文详细介绍了如何从零开始配置Android 12手机进行渗透测试,包括解锁引导加载程序、使用Magisk获取root权限、安装Burp证书以及使用Frida和RMS绕过证书固定等关键技术步骤。

从零开始:配置Android手机进行渗透测试

Jeff Barbi // *客座文章

背景

除非您经常进行移动应用渗透测试,否则您的方法很容易过时。每个新版本的Android都会带来额外的安全功能需要绕过,这使得三年前用于设置测试设备的过程变得过时。

如果您像我一样,每次配置新手机时都会重新发现一个新过程,而不是记录上次手机的设置方式。这是冗余且愚蠢的。更糟糕的是,这些信息分散在互联网上的代码仓库、博客和论坛帖子中。更糟糕的是,其中许多信息已经过时且不再有效。

以下内容旨在通过记录一个在撰写本文时(2022年10月)适用于Android 12的已知良好过程,为其他人节省时间。

我拿了一台出厂未root的Pixel 4A,运行最新的Android 12“snow cone”稳定版本,并记录了从头到尾配置它进行渗透测试所需的步骤。这包括击败越来越常见的证书固定。在每个部分的开头,我包含了所需的工具以及获取它们的位置。

我们将采取的操作顺序如下:

  1. 启用开发者模式、引导加载程序解锁和USB调试
  2. 解锁引导加载程序
  3. 使用Magisk修改出厂引导映像
  4. 将此新映像刷入引导加载程序,root手机
  5. 将Burp证书转换为Android期望的格式
  6. 使用自定义Magisk模块模板安装程序将Burp证书安装为受信任的CA
  7. 在手机上安装并运行Frida服务器
  8. 将Frida服务器代理与Runtime Mobile Security前端连接
  9. 通过RMS在挂钩进程中运行目标应用
  10. 使用自定义RMS插件绕过证书固定

我从一台出厂原装的手机开始:

我按照提示加入Wi-Fi、登录Google账户、接受服务条款等。

注意:本教程的主机运行的是基于Debian的Linux发行版。这些步骤应该适用于其他发行版和/或OSX,但某些语法可能不同。

Root手机

所需工具

  • Android Debug Bridge (adb)
    1
    2
    
    # apt install adb
    https://developer.android.com/studio/releases/platform-tools#downloads
    
  • fastboot
    1
    2
    
    # apt install fastboot
    https://developer.android.com/studio/releases/platform-tools.html#downloads
    

注意:像apt这样的软件包仓库会有这些工具的旧版本。它们可能有效,但我使用了开发者网站上的版本。

解锁引导加载程序

如果我们想安装Burp证书、Frida、击败证书固定等,我们需要root手机。这涉及将修改后的引导映像写入手机的引导加载程序。为此,我们需要解锁它。

启用开发者模式

转到设置 -> 关于手机。点击“版本号”7次。输入PIN后,您将看到“您现在是开发者!”的消息:

启用USB调试和OEM解锁

转到设置 -> 系统 -> 高级,您将看到一个新项目“开发者选项”。

在开发者选项菜单中,打开“OEM解锁”,您将看到一个警告:

确认OK,您的引导加载程序已解锁。

打开USB调试,您将看到另一个警告:

选择OK。

测试adb

现在USB调试已启用,我们可以使用adb和fastboot。

将手机连接到计算机并确认adb可以连接到手机:

1
2
3
$ adb devices -l
List of devices attached
13011JEC204262         device usb:5-1.4 product:sunfish model:Pixel_4a device:sunfish transport_id:2

然后使用adb重新启动进入fastboot模式:

1
$ adb reboot bootloader

手机将重新启动,我们现在可以在手机上运行fastboot命令。

检查fastboot是否可以连接到手机:

1
2
$ fastboot devices
13011JEC204262  fastboot

现在我们可以解锁引导加载程序:

1
2
3
$ fastboot flashing unlock
OKAY [  0.104s]
Finished. Total time: 0.104s

警告屏幕将更改,“不要锁定引导加载程序”默认被选中。按音量增大键选择“解锁引导加载程序”,然后按锁定按钮。

手机将重新启动回到fastboot模式。按锁定按钮,手机将再次重新启动。引导加载程序现已解锁。

手机启动后,再次按照提示加入Wi-Fi、登录Google账户等。

再次启用USB调试

解锁引导加载程序会重置手机,禁用开发者模式和USB调试。像以前一样重新启用这些功能:

  • 设置 -> 关于手机。点击“版本号”7次,然后输入PIN。
  • 设置 -> 系统 -> 高级,进入“开发者选项”菜单。打开“USB调试”。

重新启动手机。在警告提示上点击允许:

安装Magisk应用

从此处下载Magisk应用作为APK文件:https://github.com/topjohnwu/Magisk/releases/latest

然后使用adb安装应用:

1
2
3
4
5
6
7
$ adb devices -l              
List of devices attached
13011JEC204262         device usb:5-1.4 product:sunfish model:Pixel_4a device:sunfish transport_id:4

$ adb install Magisk-v25.2.apk 
Performing Streamed Install
Success

使用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文件,然后解压缩引导映像:

1
2
3
4
$ unzip -p sunfish*.zip */*.zip >image.zip
$ unzip -p image.zip boot.img >boot.img
$ file boot.img
boot.img: Android bootimg, kernel (0x8000), ramdisk (0x1000000), page size: 4096, cmdline (console=ttyMSM0,115200n8 androidboot.console=ttyMSM0 printk.devkmsg=on msm_rtb.filter=0x237 ehci-hcd.park=3 service_locator.ena)

使用adb将此文件推送到手机。我选择了Download目录,因为它在Magisk中很容易找到:

1
2
$ adb push boot.img /storage/self/primary/Download
boot.img: 1 file pushed, 0 skipped. 24.2 MB/s (67108864 bytes in 2.644s)

现在打开Magisk应用并选择安装:

然后“选择并修补文件”:

然后“开始”。您将看到安装日志输出,文件将写入与原始文件相同的目录:

使用adb将新文件从手机中拉出(您可以使用制表符补全,文件名将以“magisk_patched”开头):

1
2
$ adb pull /storage/self/primary/Download/magisk_patched-25200_VEmzX.img
/storage/self/primary/Download/magisk_patched-2...0 skipped. 36.6 MB/s (67108864 bytes in 1.748s)

现在我们有了一个rooted的boot.img文件,准备写入引导加载程序。

写入修补后的映像

剩下的就是将我们修补后的映像写入引导加载程序。

使用fastboot写入映像:

1
2
3
4
5
$ adb reboot bootloader
$ fastboot flash boot magisk_patched-25200_VEmzX.img
Sending 'boot_b' (65536 KB)                        OKAY [  1.930s]
Writing 'boot_b'                                   OKAY [  0.306s]
Finished. Total time: 2.459s

验证root

手机重新启动后,它现在应该已经root。我们可以用adb验证这一点:

1
2
$ adb shell
sunfish:/ su root

手机上应该会出现一个警告提示:

接受此提示,进程应允许root:

1
2
sunfish:/ # id
uid=0(root) gid=0(root) groups=0(root) context=u:r:magisk:s0

安装Burp证书

使用Burp拦截请求会破坏TLS证书链。没有信任根,TLS将无法工作,我们无法使用Burp动态测试应用。

导出并转换证书

注意:以下步骤部分取自此处:https://blog.ropnop.com/configuring-burp-suite-with-android-nougat/

首先,启动Burp。然后导出证书:

1
$ curl http://burp/cert -x localhost:8080 > /tmp/cacert.der

然后将其从DER格式转换为PEM格式:

1
$ openssl x509 -inform DER -in /tmp/cacert.der -out /tmp/cacert.pem

Android证书使用文件的哈希值命名。将cacert.pem重命名为以下格式:

1
2
$ HASH=$(openssl x509 -inform PEM -subject_hash_old -in /tmp/cacert.pem | head -1)
$ mv /tmp/cacert.pem /tmp/$HASH.0

现在我们准备将证书复制到手机。

使用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

克隆仓库:

1
$ git clone https://github.com/Zackptg5/MMT-Extended

现在,我们将创建MMT在运行我们的模块时将在手机上重新创建的目录结构:

1
2
3
4
5
$ cd MMT-Extended
$ mkdir -p ./system/etc/security
$ rm -rf ./zygisk
$ rm ./system/placeholder
$ cd ./system/etc/security

然后将手机上的现有证书拉入此目录,以便在运行模块时不会删除它们:

1
$ adb pull /system/etc/security/cacerts/ .

并添加Burp证书:

1
$ cp /tmp/$HASH.0 ./cacerts/

文件customize.sh本质上是我们的模块的设置脚本。例如,在此处配置的任何文件系统权限将在模块安装时与设备上的权限匹配。这样我们可以确保我们的新证书与手机上其他证书具有相同的文件权限。

修改customize.sh,根据文件中的示例替换第36行的REPLACE变量:

1
2
$ cd ../../../
$ vim customize.sh

在文件中进行以下替换/添加(遵循示例):

1
2
3
4
5
REPLACE="
/system/etc/security/cacerts
"

set_perm_recursive $MODPATH/system/etc/security/cacerts 0 0 0755 0644

将模块压缩并推送到手机:

1
2
$ zip -9 -r MMT.zip .
$ adb push MMT.zip /storage/self/primary/Download/

在Magisk中安装模块

在安装模块之前,我们需要启用Zygisk。打开Magisk应用,点击右上角的设置图标。打开“Zygisk:在zygote守护进程中运行部分Magisk”:

重新启动手机。

打开Magisk应用并导航到模块 -> 从存储安装:

选择zip文件,Magisk将安装它作为模块:

再次重新启动手机。

要验证证书现在是否受信任,导航到设置 -> 安全 -> 加密与凭据。您应该有一个Portswigger条目:

通过USB代理流量

安装了Burp证书并受信任后,我们可以拦截运行中的应用的流量。

确保adb正在运行并连接到手机。然后启动一个反向代理,它将路由手机上的给定本地端口到主机计算机上的给定本地端口。Burp默认监听8080,因此我们将使用:

1
2
3
4
5
6
$ adb devices -l
List of devices attached
13011JEC204262         device usb:5-1.4 product:sunfish model:Pixel_4a device:sunfish transport_id:1

$ adb reverse tcp:8080 tcp:8080
8080

现在将手机的网络连接设置为使用本地端口8080: 设置 -> 网络和互联网 -> 互联网 -> 您的SSID -> 右上角的编辑按钮

应用流量现在应通过Burp监听器路由。

绕过证书固定

证书固定是一种确保不仅主机的证书有效,而且是该主机的预期证书的方式。没有其他证书会起作用,即使它是有效的、签名的、受信任的证书。

这变得越来越常见,如果我们想代理和分析应用流量,这为我们提供了一个额外的障碍。

所需工具

  • Frida工具
    1
    2
    
    $ pip install frida-tools
    https://frida.re/docs/installation/
    
  • nodeJS和npm
    1
    2
    3
    4
    
    # apt install nodejs
    # apt install npm
    https://nodejs.org/en/download/
    https://docs.npmjs.com/downloading-and-installing-node-js-and-npm
    
  • Runtime Mobile Security (RMS)
    1
    2
    
    # npm install -g rms-runtime-mobile-security
    https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security
    

使用RMS

RMS是一个使用Frida在运行时提供调试功能和操作工具的Web界面:https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security

Frida使用Google的V8引擎在挂钩进程中运行JavaScript。这使我们能够与函数交互并修改它们的行为;例如,更改TLS检查的返回值。我们可以使用它来击败诸如损坏的证书链或绕过证书固定等障碍。

安装Frida服务器

因此,我按照评论中的说明卸载了com.google.android.art:

1
2
3
4
5
sunfish:/ pm path com.google.android.art
package:/data/apex/active/[email protected]

sunfish:/ pm uninstall com.google.android.art
Success

然后我重新启动了手机,能够安装Frida服务器。这可能会在未来的Frida版本中修复(在撰写本文时我使用的是15.2.2)。

Frida客户端和服务器版本匹配非常重要。

检查使用Frida-tools安装的Frida客户端版本。从Frida git仓库下载此版本的Frida服务器。然后解压缩文件,并将其推送到手机:

1
2
3
4
5
6
$ frida-ps --version                                                                                  
15.2.2
$wget -q https://github.com/frida/frida/releases/download/15.2.2/frida-server-15.2.2-android-arm64.xz
$ unxz frida-server-15.2.2-android-arm64.xz                                                           
$ adb push frida-server-15.2.2-android-arm64 /data/local/tmp             
frida-server-15.2.2-android-arm64: 1 file pushed, 0 skipped. 71.0 MB/s (47188552 bytes in 0.634s)   

注意:每个Frida版本都包含许多相关工具,针对各种架构构建。确保获取与您使用的设备架构匹配的Frida服务器。

现在连接到手机并启动Frida服务器:

1
2
3
4
5
6
$ adb shell 
sunfish:/ $ cd /data/local/tmp 
sunfish:/data/local/tmp $ su root 
sunfish:/data/local/tmp # chmod 777 ./frida-server-15.2.2-android-arm64                                                 
sunfish:/data/local/tmp # ./frida-server-15.2.2-android-arm64 &                                                         
[1] 14535

现在运行frida-ps -U,您应该看到一个包列表:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ frida-ps -U                                                                                                     
  PID  Name
-----  -------------------------------------------------------
2598   .dataservices                                          
2614   .qtidataservices                                       
10851  Facebook                                               
3687   Google                                                 
11718  Magisk                                                 
8655   Photos                                                 
12474  Settings                                               
1482   adbd                                                   
1317   adsprpcd
 <snip>

Frida工作正常,因此我们准备将其代理与RMS连接。

启动RMS

rms命令将在本地端口5000上启动Web界面:

1
2
3
4
5
6
7
$ rms
_________________________________________________________
RMS - Runtime Mobile Security
Version: 1.5.11
by @mobilesecurity_
Twitter Profile: https://twitter.com/mobilesecurity_
_________________________________________________________

在Web浏览器中导航到http://localhost:5000。

RMS也可以用于iOS手机,因此在“Mobile OS”下选择Android选项。

Facebook Android应用有证书固定,因此我们将使用它作为示例。在“Package name”下设置com.facebook.katana。

RMS可以生成一个已经挂钩Frida的应用,或者它可以附加到一个正在运行的进程。我从未在附加功能上取得多大成功,因此选择Spawn。

我们可以给Frida我们自己的JavaScript运行,但它附带了一组默认脚本来执行常见的绕过。此集合中包括多个证书固定绕过。

我在ssl_pinning_multi_bypass.js上取得了良好的结果,因此在“Load Default Frida Scripts”下选择此选项:

选择“Start RMS”,应用应在手机上打开,流量应显示在Burp代理中。

结束语

希望将所有这些信息收集在一个地方可以为将来的人节省时间。不可避免地,随着Google继续更改Android操作系统,这些步骤将变得过时。截至2022年10月,这个过程对我有效。希望对您也有效。

感谢Lance Pendergrass的一些技术,以及Carrie Roberts的灵感和指导。

— *Jeff在各种信息安全角色中工作了十多年,包括7年作为渗透测试员和最近转型为云安全工程师。感谢您与我们分享您的知识,Jeff!

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计