自动准备 Android APK 文件以进行 HTTPS 检查的 CLI 应用程序
使用代理检查移动应用程序的 HTTPS 流量可能是了解其工作原理的最简单方法。然而,随着 Android 7 中引入的网络安全配置以及应用程序开发人员试图使用证书固定来防止 MITM 攻击,让应用程序与 HTTPS 代理一起工作已变得相当乏味。
apk-mitm
使整个过程自动化。您所要做的就是给它一个 APK 文件, apk-mitm
将:
您还可以使用apk-mitm
来使用 Android App Bundle 来修补应用程序,并且不需要对手机进行 root。
修改应用程序的常规行为以解决证书固定等安全功能需要在运行应用程序之前修改应用程序的源代码,或者在应用程序运行时“挂钩”应用程序以拦截函数调用。
apk-mitm
目前采用前一种修改应用程序代码的方法,首先使用 Apktool“分解”应用程序,对多个文件进行更改,然后将其重新组装在一起(再次使用 Apktool)。
这种方法的优点是不需要 root 设备,但也有一些缺点。最大的问题是应用程序并不是真正需要被反汇编的。无论如何,Apktool 都会尝试实现这一目标,但是,尤其是对于大型且复杂的应用程序,它经常会遇到问题。
这种方法的另一个问题是,某些证书固定方法,例如在本机二进制文件中执行的检查(如 Flutter 等框架的情况),要么非常难以规避,要么无法规避。因此,尝试其他方法来处理更棘手的应用程序可能会有所帮助。
具体来说,我想重点介绍 mitmproxy 的android-unpinner
项目以及 HTTP Toolkit 的底层frida-interception-and-unpinning
脚本。他们的方法使用 Frida 在运行时应用补丁,Frida 功能更强大,但也意味着如果没有 root 设备,它要么无法使用,要么更难以使用。
如果您有最新版本的 Node.js (14+) 和 Java (8+),您可以通过运行以下命令来安装apk-mitm
:
npm install -g apk-mitm
安装后,您可以运行以下命令来修补应用程序:
apk-mitm < path-to-apk >
修补名为example.apk
的 APK 文件可能如下所示:
$ apk-mitm example.apk
✔ Decoding APK file
✔ Modifying app manifest
✔ Replacing network security config
✔ Disabling certificate pinning
✔ Encoding patched APK file
✔ Signing patched APK file
Done ! Patched APK: ./example-patched.apk
现在,您可以在 Android 设备上安装example-patched.apk
文件,并使用 Charles 或 mitmproxy 等代理来查看应用程序的流量。
您还可以使用带有apk-mitm
Android App Bundle 来修补应用程序,方法是向其提供*.xapk
文件(例如来自 APKPure)或*.apks
文件(您可以使用 SAI 自行导出该文件)。如果您在 Linux 上执行此操作,请确保安装了zip
和unzip
。
有时您需要对应用程序进行手动更改才能使其正常工作。在这些情况下,您需要--wait
选项。启用它将使apk-mitm
在重新编码应用程序之前等待,从而允许您对临时目录中的文件进行更改。
如果您想尝试对 APK 进行不同的更改,那么使用--wait
可能不是最方便的选项,因为它迫使您每次使用它时都从头开始。在这种情况下,您可能想看看 APKLab。它是一个基于 VS Code 构建的 Android 逆向工程工作台,带有apk-mitm
支持,应该可以让您更快地进行迭代。
在某些设备(例如 Android TV)上,您可能无法将新证书添加到系统的根证书中。在这些情况下,您仍然可以将代理的证书直接添加到应用程序的网络安全配置中,因为这适用于任何设备。您可以通过运行apk-mitm
来完成此操作,并将--certificate
标志设置为代理使用的证书( .pem
或.der
文件)的路径。
如果应用程序使用 Google 地图并且地图在修补后损坏,则应用程序的 API 密钥可能仅限于开发人员的证书。您必须不受限制地创建自己的 API 密钥,并使用--wait
选项运行apk-mitm
以便能够替换应用的AndroidManifest.xml
文件中的com.google.android.geo.API_KEY
值。
如果apk-mitm
在解码或编码时崩溃,则问题可能与 Apktool 有关。在 GitHub 上检查他们的问题以找到可能的解决方法。如果您碰巧发现一个不受该问题影响的 Apktool 版本,您可以通过--apktool
选项指定其 JAR 文件的路径来指示apk-mitm
使用它。
麻省理工学院 © Niklas Higi