diff --git a/src/mobile-pentesting/android-app-pentesting/README.md b/src/mobile-pentesting/android-app-pentesting/README.md index bd137d98f..89d2ad30e 100644 --- a/src/mobile-pentesting/android-app-pentesting/README.md +++ b/src/mobile-pentesting/android-app-pentesting/README.md @@ -1,34 +1,35 @@ -# Android 应用程序渗透测试 +# Android 应用程序 Pentesting {{#include ../../banners/hacktricks-training.md}} -## Android 应用程序基础 +## Android 应用基础 + +强烈建议先阅读此页面,以了解与 Android 安全相关的 **最重要的部分** 以及 Android 应用中 **最危险的组件**: -强烈建议您开始阅读此页面,以了解与 Android 安全性相关的 **最重要部分和 Android 应用程序中最危险的组件**: {{#ref}} android-applications-basics.md {{#endref}} -## ADB (Android 调试桥) +## ADB (Android Debug Bridge) -这是您连接到 Android 设备(模拟或物理)所需的主要工具。\ -**ADB** 允许从计算机通过 **USB** 或 **网络** 控制设备。此工具使 **双向复制** 文件、**安装** 和 **卸载** 应用程序、**执行** shell 命令、**备份** 数据、**读取** 日志等功能成为可能。 +这是连接 Android 设备(模拟或真实设备)所需的主要工具。\ +**ADB** 允许从计算机通过 **USB** 或 **Network** 控制设备。该工具支持双向 **复制** 文件、**安装** 和 **卸载** 应用、**执行** shell 命令、**备份** 数据、**读取** 日志等功能。 -查看以下 [**ADB 命令**](adb-commands.md) 列表,以了解如何使用 adb。 +查看以下 [**ADB Commands**](adb-commands.md) 列表以学习如何使用 adb。 ## Smali -有时修改 **应用程序代码** 以访问 **隐藏信息**(可能是经过良好混淆的密码或标志)是很有趣的。然后,反编译 apk、修改代码并重新编译可能会很有趣。\ -[**在本教程中**,您可以 **学习如何反编译 APK、修改 Smali 代码并使用新功能重新编译 APK**](smali-changes.md)。这在 **动态分析期间的几项测试中可能非常有用**。因此,**始终记住这种可能性**。 +有时对应用的代码进行修改以获取 **隐藏的信息**(例如被严重混淆的密码或 flags)是有意义的。此时,反编译 apk、修改代码并重新编译可能非常有用。\ +[**In this tutorial** you can **learn how to decompile and APK, modify Smali code and recompile the APK** with the new functionality](smali-changes.md)。这可以作为在即将进行的 dynamic analysis 中若干测试的 **替代方法**。请 **始终记住这一可能性**。 -## 其他有趣的技巧 +## Other interesting tricks -- [在 Play 商店中伪装您的位置](spoofing-your-location-in-play-store.md) -- [Shizuku 特权 API(基于 ADB 的非根特权访问)](shizuku-privileged-api.md) -- [利用不安全的应用内更新机制](insecure-in-app-update-rce.md) -- [滥用无障碍服务(Android RAT)](accessibility-services-abuse.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) +- [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) +- [Abusing Accessibility Services (Android RAT)](accessibility-services-abuse.md) +- **下载 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) - 从设备提取 APK: ```bash adb shell pm list packages @@ -39,7 +40,7 @@ package:/data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk adb pull /data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk ``` -- 使用 [APKEditor](https://github.com/REAndroid/APKEditor) 合并所有拆分和基础 APK: +- 使用 [APKEditor](https://github.com/REAndroid/APKEditor) 合并所有 splits 和 base apks: ```bash mkdir splits adb shell pm path com.android.insecurebankv2 | cut -d ':' -f 2 | xargs -n1 -i adb pull {} splits @@ -60,167 +61,171 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed ../../linux-hardening/privilege-escalation/android-rooting-frameworks-manager-auth-bypass-syscall-hook.md {{#endref}} -## 静态分析 +## Static Analysis -首先,分析 APK 时,您应该**查看 Java 代码**,使用反编译器。\ -请[**在这里阅读有关不同可用反编译器的信息**](apk-decompilers.md)。 +首先,分析 APK 时你应该使用反编译器**查看 Java 代码**。\ +请, [**read here to find information about different available decompilers**](apk-decompilers.md). -### 寻找有趣的信息 +### Looking for interesting Info -仅通过查看 APK 的**字符串**,您可以搜索**密码**、**URL** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep))、**api** 密钥、**加密**、**蓝牙 UUID**、**令牌**以及任何有趣的内容……甚至查找代码执行的**后门**或身份验证后门(硬编码的管理员凭据)。 +仅仅查看 APK 的 **strings** 就可以搜索 **passwords**、**URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep))、**api** keys、**encryption**、**bluetooth uuids**、**tokens** 以及其他任何有趣的信息……甚至要留意代码执行的 **backdoors** 或认证后门(应用中硬编码的管理员凭据)。 **Firebase** -特别注意**firebase URL**,并检查其是否配置不当。[有关 Firebase 的更多信息以及如何利用它,请点击这里。](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) +特别注意 **Firebase** URL 并检查其是否配置不当。[More information about whats is FIrebase and how to exploit it here.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) -### 应用程序的基本理解 - Manifest.xml, strings.xml +### Basic understanding of the application - Manifest.xml, strings.xml -**检查应用程序的 _Manifest.xml_ 和 **_strings.xml_** 文件可以揭示潜在的安全漏洞**。这些文件可以通过反编译器访问,或通过将 APK 文件扩展名重命名为 .zip 然后解压缩来访问。 +**检查应用的 _Manifest.xml_ 和 **_strings.xml_** 文件可以揭示潜在的安全漏洞**。这些文件可以通过反编译器访问,也可以将 APK 重命名为 .zip 然后解压来获取。 -**从 _Manifest.xml_ 中识别的漏洞包括:** +从 **Manifest.xml** 中可识别的**漏洞**包括: -- **可调试应用程序**:在 _Manifest.xml_ 文件中设置为可调试 (`debuggable="true"`) 的应用程序存在风险,因为它们允许连接,可能导致被利用。有关如何利用可调试应用程序的进一步理解,请参考有关在设备上查找和利用可调试应用程序的教程。 -- **备份设置**:对于处理敏感信息的应用程序,`android:allowBackup="false"` 属性应明确设置,以防止通过 adb 进行未经授权的数据备份,尤其是在启用 USB 调试时。 -- **网络安全**:_res/xml/_ 中的自定义网络安全配置 (`android:networkSecurityConfig="@xml/network_security_config"`) 可以指定安全细节,如证书固定和 HTTP 流量设置。一个例子是允许特定域的 HTTP 流量。 -- **导出活动和服务**:在清单中识别导出活动和服务可以突出可能被滥用的组件。在动态测试期间的进一步分析可以揭示如何利用这些组件。 -- **内容提供者和文件提供者**:暴露的内容提供者可能允许未经授权访问或修改数据。文件提供者的配置也应仔细审查。 -- **广播接收器和 URL 方案**:这些组件可能被利用进行攻击,特别注意如何管理 URL 方案以防止输入漏洞。 -- **SDK 版本**:`minSdkVersion`、`targetSDKVersion` 和 `maxSdkVersion` 属性指示支持的 Android 版本,强调出于安全原因不支持过时、易受攻击的 Android 版本的重要性。 +- **Debuggable Applications**: 如果在 _Manifest.xml_ 中将应用设置为 debuggable(`debuggable="true"`),则存在风险,因为这允许连接并可能被利用。有关如何利用 debuggable 应用的更多信息,请参考关于在设备上查找和利用 debuggable applications 的教程。 +- **Backup Settings**: 对于处理敏感信息的应用,应显式设置 `android:allowBackup="false"`,以防止通过 adb 在 usb debugging 启用时进行未授权的数据备份。 +- **Network Security**: 自定义网络安全配置(`android:networkSecurityConfig="@xml/network_security_config"`)位于 _res/xml/_ 中,可指定证书 pin、HTTP 流量设置等安全细节。例如,可以为特定域允许 HTTP 流量。 +- **Exported Activities and Services**: 在 manifest 中识别 exported activities 和 services 可以突出可能被滥用的组件。在动态测试阶段的进一步分析可以揭示如何利用这些组件。 +- **Content Providers and FileProviders**: 暴露的 content providers 可能允许未授权访问或修改数据。还应仔细检查 FileProviders 的配置。 +- **Broadcast Receivers and URL Schemes**: 这些组件可能被用来进行利用,尤其要关注 URL scheme 的处理方式以防止输入相关漏洞。 +- **SDK Versions**: `minSdkVersion`、`targetSDKVersion` 和 `maxSdkVersion` 属性指示支持的 Android 版本,强调不应支持过时且存在漏洞的 Android 版本以确保安全性。 -从 **strings.xml** 文件中,可以发现敏感信息,如 API 密钥、自定义模式和其他开发者注释,强调了仔细审查这些资源的必要性。 +从 **strings.xml** 文件中,可以发现敏感信息,如 API keys、自定义 schema 以及开发者备注,说明需要仔细检查这些资源。 ### Tapjacking -**Tapjacking** 是一种攻击,其中**恶意** **应用程序**被启动并**定位在受害者应用程序的顶部**。一旦它可见地遮挡了受害者应用程序,其用户界面被设计成欺骗用户与之互动,同时将互动传递给受害者应用程序。\ -实际上,它是**让用户无法知道他们实际上是在对受害者应用程序执行操作**。 +**Tapjacking** 是一种攻击,攻击者启动一个**恶意** **应用** 并**将其置于受害者应用之上**。一旦它遮挡了受害应用,其用户界面设计会诱导用户与其交互,同时将交互传递给受害应用。\ +实际上,它是**让用户无法察觉自己实际上是在对受害应用执行操作**。 -在这里找到更多信息: +更多信息请见: {{#ref}} tapjacking.md {{#endref}} -### 任务劫持 +### Task Hijacking -一个**活动**的**`launchMode`** 设置为**`singleTask`**,且未定义任何 `taskAffinity`,则容易受到任务劫持。这意味着,如果在真实应用程序之前安装并启动了一个**应用程序**,它可能会**劫持真实应用程序的任务**(因此用户将与**恶意应用程序**互动,以为自己在使用真实应用程序)。 +如果一个 **activity** 的 **`launchMode`** 设置为 **`singleTask` 且未定义 `taskAffinity`**,则会容易受到 Task Hijacking。也就是说,如果在真实应用之前安装并启动了另一个应用,该应用可能**劫持真实应用的任务**(用户会以为自己在使用真实应用,实际上在与**恶意应用**交互)。 -更多信息在: +更多信息见: {{#ref}} android-task-hijacking.md {{#endref}} -### 不安全的数据存储 +### Insecure data storage -**内部存储** +**Internal Storage** -在 Android 中,**存储**在**内部**存储中的文件**设计**为仅由**创建**它们的**应用程序**访问。此安全措施由 Android 操作系统**强制**执行,通常足以满足大多数应用程序的安全需求。然而,开发者有时会使用 `MODE_WORLD_READABLE` 和 `MODE_WORLD_WRITABLE` 等模式来**允许**文件在不同应用程序之间**共享**。然而,这些模式**并不限制**其他应用程序(包括潜在恶意应用程序)对这些文件的访问。 +在 Android 中,存储在 **internal** 存储中的文件设计为仅可被**创建它们的应用**访问。这一安全措施由 Android 操作系统强制执行,通常足以满足大多数应用的安全需求。然而,开发者有时会使用诸如 `MODE_WORLD_READABLE` 和 `MODE_WORLD_WRITABLE` 的模式来**允许**不同应用之间**共享**文件。但这些模式**不会限制**其他应用(包括潜在的恶意应用)对这些文件的访问。 -1. **静态分析:** -- **确保**仔细审查 `MODE_WORLD_READABLE` 和 `MODE_WORLD_WRITABLE` 的使用。这些模式**可能会暴露**文件给**意外或未经授权的访问**。 -2. **动态分析:** -- **验证**应用程序创建的文件上的**权限**。具体来说,**检查**是否有任何文件被**设置为全球可读或可写**。这可能会带来重大安全风险,因为这将允许**任何安装在设备上的应用程序**,无论其来源或意图如何,**读取或修改**这些文件。 +1. **Static Analysis:** +- **检查** 是否使用了 `MODE_WORLD_READABLE` 和 `MODE_WORLD_WRITABLE`。这些模式**可能会暴露**文件,导致**非预期或未授权访问**。 +2. **Dynamic Analysis:** +- **验证** 应用创建的文件的**权限设置**。特别是,**检查**是否有文件被设置为可被全局读取或写入。这会带来重大安全风险,因为这将允许安装在设备上的**任何应用**(无论来源或目的)**读取或修改**这些文件。 -**外部存储** +**External Storage** -处理**外部存储**上的文件(如 SD 卡)时,应采取某些预防措施: +处理外部存储(如 SD 卡)上的文件时,应采取以下预防措施: -1. **可访问性**: -- 外部存储上的文件是**全球可读和可写**的。这意味着任何应用程序或用户都可以访问这些文件。 -2. **安全问题**: -- 鉴于访问的便利性,建议**不要在外部存储上存储敏感信息**。 -- 外部存储可以被任何应用程序移除或访问,从而降低安全性。 -3. **处理来自外部存储的数据**: -- 始终对从外部存储检索的数据**执行输入验证**。这至关重要,因为数据来自不受信任的来源。 -- 强烈不建议在外部存储上存储可执行文件或类文件以进行动态加载。 -- 如果您的应用程序必须从外部存储检索可执行文件,请确保这些文件在动态加载之前**经过签名和加密验证**。此步骤对于维护应用程序的安全完整性至关重要。 +1. **可访问性**: +- 外部存储上的文件是**全局可读可写**的。这意味着任何应用或用户都可以访问这些文件。 +2. **安全顾虑**: +- 鉴于访问便利,建议**不要将敏感信息存储在外部存储上**。 +- 外部存储可以被移除或被任何应用访问,因此安全性较低。 +3. **处理来自外部存储的数据**: +- 从外部存储读取数据时**始终进行输入验证**。这是关键,因为这些数据来自不受信任的来源。 +- 强烈不建议将可执行文件或 class 文件存放在外部存储以供动态加载。 +- 如果应用必须从外部存储检索可执行文件,确保这些文件在动态加载前**已签名并经过加密校验**。此步骤对于维护应用的安全完整性至关重要。 -外部存储可以在 `/storage/emulated/0`、`/sdcard`、`/mnt/sdcard` 中访问。 +外部存储可在 /storage/emulated/0 , /sdcard , /mnt/sdcard 访问 > [!TIP] -> 从 Android 4.4(**API 17**)开始,SD 卡具有一个目录结构,**限制应用程序访问特定于该应用程序的目录**。这防止恶意应用程序获得对其他应用程序文件的读写访问。 +> 从 Android 4.4(**API 17**)开始,SD 卡有一个目录结构,**限制应用只能访问专属于该应用的目录**。这可防止恶意应用获取对其他应用文件的读写访问。 **以明文存储的敏感数据** -- **共享首选项**:Android 允许每个应用程序轻松地在路径 `/data/data//shared_prefs/` 中保存 xml 文件,有时可以在该文件夹中找到明文的敏感信息。 -- **数据库**:Android 允许每个应用程序轻松地在路径 `/data/data//databases/` 中保存 sqlite 数据库,有时可以在该文件夹中找到明文的敏感信息。 +- **Shared preferences**: Android 允许每个应用轻松将 xml 文件保存在路径 `/data/data//shared_prefs/`,有时可以在该文件夹中发现明文的敏感信息。 +- **Databases**: Android 允许每个应用轻松将 sqlite 数据库存储在路径 `/data/data//databases/`,有时可以在该文件夹中发现明文的敏感信息。 -### TLS 破坏 +### Broken TLS -**接受所有证书** +**Accept All Certificates** -出于某种原因,有时开发者会接受所有证书,即使例如主机名与以下代码行不匹配: +有时开发者会接受所有证书,即使例如 hostname 不匹配,也会出现类似如下代码行: ```java SSLSocketFactory sf = new cc(trustStore); sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); ``` -测试这个的一个好方法是尝试使用像 Burp 这样的代理捕获流量,而不在设备中授权 Burp CA。此外,您还可以使用 Burp 为不同的主机名生成证书并使用它。 +A good way to test this is to try to capture the traffic using some proxy like Burp without authorising Burp CA inside the device. Also, you can generate with Burp a certificate for a different hostname and use it. -### 破损的加密 +### 加密学缺陷 -**糟糕的密钥管理流程** +**密钥管理不当** -一些开发人员将敏感数据保存在本地存储中,并使用在代码中硬编码/可预测的密钥进行加密。这是不应该这样做的,因为某些反向工程可能允许攻击者提取机密信息。 +一些开发者将敏感数据保存在本地存储中,并使用硬编码/可预测的密钥进行加密。这不应该这样做,因为一些逆向工程可能允许攻击者提取机密信息。 -**使用不安全和/或过时的算法** +**使用不安全和/或已废弃的算法** -开发人员不应该使用 **过时的算法** 来执行授权 **检查**、**存储** 或 **发送** 数据。这些算法包括:RC4、MD4、MD5、SHA1... 如果 **哈希** 用于存储密码,例如,应该使用带盐的抗暴力破解的哈希。 +开发者不应使用**已废弃的算法**来执行授权**检查**、**存储**或**发送**数据。这些算法中的一些有:RC4、MD4、MD5、SHA1……例如,如果使用**hashes**来存储密码,应使用对暴力破解具有抵抗力的哈希并加盐。 ### 其他检查 -- 建议对 **APK 进行混淆**,以增加攻击者的反向工程难度。 -- 如果应用程序是敏感的(如银行应用),它应该执行 **自己的检查以查看手机是否已被 root** 并采取相应措施。 -- 如果应用程序是敏感的(如银行应用),它应该检查是否正在使用 **模拟器**。 -- 如果应用程序是敏感的(如银行应用),它应该 **在执行之前检查自身的完整性** 以确认是否被修改。 -- 使用 [**APKiD**](https://github.com/rednaga/APKiD) 检查构建 APK 时使用的编译器/打包器/混淆器 +- 建议**对 APK 进行混淆**,以增加逆向工程的难度。 +- 如果应用是敏感应用(如银行应用),应执行**自己的检测来判断手机是否已 root**,并据此采取措施。 +- 如果应用是敏感应用(如银行应用),应检测是否在**emulator**上运行。 +- 如果应用是敏感应用(如银行应用),应**在执行前检查自身完整性**以判断是否被修改。 +- 使用 [**APKiD**](https://github.com/rednaga/APKiD) 来检查构建 APK 时使用了哪个 compiler/packer/obfuscator -### React Native 应用程序 +### React Native Application + +Read the following page to learn how to easily access javascript code of React applications: -阅读以下页面以了解如何轻松访问 React 应用程序的 JavaScript 代码: {{#ref}} react-native-application.md {{#endref}} -### Xamarin 应用程序 +### Xamarin Applications + +Read the following page to learn how to easily access C# code of a xamarin applications: -阅读以下页面以了解如何轻松访问 Xamarin 应用程序的 C# 代码: {{#ref}} ../xamarin-apps.md {{#endref}} -### 超级打包应用程序 +### Superpacked Applications -根据这篇 [**博客文章**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/) 超级打包是一种将应用程序内容压缩为单个文件的 Meta 算法。该博客讨论了创建一个可以解压这些应用程序的应用的可能性……以及一种更快的方法,涉及 **执行应用程序并从文件系统中收集解压的文件。** +According to this [**blog post**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/) superpacked is a Meta algorithm that compress the content of an application into a single file. The blog talks about the possibility of creating an app that decompress these kind of apps... and a faster way which involves to **execute the application and gather the decompressed files from the filesystem.** -### 自动化静态代码分析 +### Automated Static Code Analysis -工具 [**mariana-trench**](https://github.com/facebook/mariana-trench) 能够通过 **扫描** 应用程序的 **代码** 来发现 **漏洞**。该工具包含一系列 **已知源**(指示工具 **用户控制的输入** 的 **位置**)、**汇**(指示工具 **危险** **位置**,恶意用户输入可能造成损害)和 **规则**。这些规则指示 **源-汇** 的 **组合**,表明存在漏洞。 +The tool [**mariana-trench**](https://github.com/facebook/mariana-trench) is capable of finding **vulnerabilities** by **scanning** the **code** of the application. This tool contains a series of **known sources** (that indicates to the tool the **places** where the **input** is **controlled by the user**), **sinks** (which indicates to the tool **dangerous** **places** where malicious user input could cause damages) and **rules**. These rules indicates the **combination** of **sources-sinks** that indicates a vulnerability. -通过这些知识,**mariana-trench 将审查代码并找到可能的漏洞**。 +With this knowledge, **mariana-trench will review the code and find possible vulnerabilities on it**. -### 泄露的秘密 +### Secrets leaked -一个应用程序可能包含秘密(API 密钥、密码、隐藏的 URL、子域名……)在其中,您可能能够发现。您可以使用像 [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks) 这样的工具。 +An application may contain secrets (API keys, passwords, hidden urls, subdomains...) inside of it that you might be able to discover. You could us a tool such as [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks) + +### Bypass Biometric Authentication -### 绕过生物识别认证 {{#ref}} bypass-biometric-authentication-android.md {{#endref}} -### 其他有趣的功能 +### 其他有趣的函数 -- **代码执行**: `Runtime.exec(), ProcessBuilder(), native code:system()` -- **发送短信**: `sendTextMessage, sendMultipartTestMessage` -- **声明为 `native` 的本地函数**: `public native, System.loadLibrary, System.load` -- [阅读此文以了解 **如何反向工程本地函数**](reversing-native-libraries.md) +- **Code execution**: `Runtime.exec(), ProcessBuilder(), native code:system()` +- **Send SMSs**: `sendTextMessage, sendMultipartTestMessage` +- **Native functions** declared as `native`: `public native, System.loadLibrary, System.load` +- [Read this to learn **how to reverse native functions**](reversing-native-libraries.md) ### **其他技巧** + {{#ref}} content-protocol.md {{#endref}} @@ -231,238 +236,290 @@ content-protocol.md ## 动态分析 -> 首先,您需要一个可以安装应用程序和所有环境(主要是 Burp CA 证书、Drozer 和 Frida)的环境。因此,强烈建议使用已 root 的设备(无论是模拟的还是非模拟的)。 +> 首先,你需要一个可以安装应用并配置好所需环境(主要是 Burp CA cert、Drozer 和 Frida)的环境。因此,强烈建议使用已 root 的设备(无论是否为模拟器)。 ### 在线动态分析 -您可以在 [https://appetize.io/](https://appetize.io) 创建一个 **免费账户**。该平台允许您 **上传** 和 **执行** APK,因此它对于查看 APK 的行为非常有用。 +你可以在 [https://appetize.io/](https://appetize.io/) 创建一个**免费账号**。该平台允许你**上传**并**执行** APK,因此有助于观察 APK 的行为。 -您甚至可以在网页上 **查看应用程序的日志** 并通过 **adb** 连接。 +你甚至可以在网页中**查看应用的日志**并通过 **adb** 连接。 ![](<../../images/image (831).png>) -通过 ADB 连接,您可以在模拟器中使用 **Drozer** 和 **Frida**。 +借助 ADB 连接,你可以在模拟器内使用 **Drozer** 和 **Frida**。 ### 本地动态分析 #### 使用模拟器 -- [**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/) **(免费版:Personal Edition,需要创建账号。建议**下载**包含**VirtualBox**的版本以避免潜在错误。)** - [**Nox**](https://es.bignox.com)(免费,但不支持 Frida 或 Drozer)。 > [!TIP] -> 创建新模拟器时,请记住,屏幕越大,模拟器运行越慢。因此,如果可能,请选择小屏幕。 +> 在任何平台创建新模拟器时,请记住屏幕越大,模拟器运行越慢。因此尽可能选择小屏幕。 -要在 Genymotion 中 **安装 Google 服务**(如 AppStore),您需要单击以下图像中红色标记的按钮: +要在 Genymotion 中**安装 google services**(如 AppStore),需要点击下图中红色标记的按钮: ![](<../../images/image (277).png>) -此外,请注意在 Genymotion 的 **Android VM 配置中**,您可以选择 **桥接网络模式**(如果您将从不同的 VM 连接到 Android VM 使用工具,这将非常有用)。 +另外,请注意在 **Genymotion 的 Android VM 配置** 中可以选择 **Bridge Network mode**(如果你要从另一个带有工具的 VM 连接到该 Android VM,这会很有用)。 -#### 使用物理设备 +#### 使用实体设备 -您需要激活 **调试** 选项,如果您可以 **root** 它,那就更好了: +你需要激活**调试**选项,如果能**root**设备会更好: -1. **设置**。 -2. (从 Android 8.0 开始)选择 **系统**。 -3. 选择 **关于手机**。 -4. 按 **构建号** 7 次。 -5. 返回,您将找到 **开发者选项**。 +1. **Settings**. +2. (FromAndroid 8.0) Select **System**. +3. Select **About phone**. +4. Press **Build number** 7 times. +5. Go back and you will find the **Developer options**. -> 一旦您安装了应用程序,您首先应该尝试它并调查它的功能、工作原理,并与之熟悉。\ -> 我建议使用 MobSF 动态分析 + pidcat 进行此初步动态分析,这样我们就可以 **了解应用程序的工作原理**,同时 MobSF **捕获** 许多您可以稍后查看的 **有趣** **数据**。 +> 一旦安装了应用,第一件事应该是尝试使用它,调查它的行为、工作方式并熟悉它。\ +> 建议使用 MobSF dynamic analysis + pidcat 执行此初步动态分析,这样我们在学习应用如何工作的同时,MobSF 会**捕获**许多稍后可以查看的**有趣数据**。 -### 意外数据泄露 +### 非预期的数据泄露 **日志记录** -开发人员应谨慎公开 **调试信息**,因为这可能导致敏感数据泄露。推荐使用工具 [**pidcat**](https://github.com/JakeWharton/pidcat) 和 `adb logcat` 来监控应用程序日志,以识别和保护敏感信息。**Pidcat** 因其易用性和可读性而受到青睐。 +开发者应谨慎避免公开暴露**调试信息**,因为这可能导致敏感数据泄露。推荐使用工具 [**pidcat**](https://github.com/JakeWharton/pidcat) 和 `adb logcat` 来监控应用日志,以识别并保护敏感信息。**Pidcat** 因其易用性和可读性而更受欢迎。 > [!WARNING] -> 请注意,从 **Android 4.0 及更高版本** 开始,**应用程序只能访问自己的日志**。因此,应用程序无法访问其他应用的日志。\ -> 无论如何,仍然建议 **不要记录敏感信息**。 +> 请注意,从**Android 4.0 及更高版本**开始,**应用只能访问自身的日志**,因此无法访问其他应用的日志。\ +> 无论如何,仍建议**不要记录敏感信息**。 -**复制/粘贴缓冲区缓存** +**剪贴板缓冲** -Android 的 **基于剪贴板** 的框架使应用程序能够实现复制粘贴功能,但也带来了风险,因为 **其他应用程序** 可以 **访问** 剪贴板,可能会暴露敏感数据。对于应用程序的敏感部分(如信用卡详细信息),至关重要的是 **禁用复制/粘贴** 功能,以防止数据泄露。 +Android 的**基于剪贴板**的框架支持应用间的复制粘贴功能,但存在风险,因为**其他应用**可以**访问**剪贴板,可能会暴露敏感数据。对于应用中的敏感部分(例如信用卡信息),应**禁用复制/粘贴**功能以防止数据泄露。 **崩溃日志** -如果应用程序 **崩溃** 并 **保存日志**,这些日志可能会帮助攻击者,特别是当应用程序无法被反向工程时。为了降低这种风险,避免在崩溃时记录日志,如果必须通过网络传输日志,请确保通过 SSL 通道发送以确保安全。 +如果应用**崩溃**并**保存日志**,这些日志可能会帮助攻击者,特别是在应用无法被逆向时。为降低风险,应避免在崩溃时记录日志;如果必须将日志通过网络传输,确保通过 SSL 通道发送以保证安全。 -作为渗透测试者,**请尝试查看这些日志**。 +作为 pentester,**尝试查看这些日志**。 **发送给第三方的分析数据** -应用程序通常集成像 Google Adsense 这样的服务,由于开发人员的不当实现,可能会 **泄露敏感数据**。为了识别潜在的数据泄露,建议 **拦截应用程序的流量** 并检查是否有任何敏感信息被发送到第三方服务。 +应用常常集成像 Google Adsense 这样的服务,如果开发者实现不当,可能会无意中**leak**敏感数据。要识别潜在的数据泄露,建议**拦截应用流量**并检查是否有敏感信息被发送到第三方服务。 -### SQLite 数据库 +### SQLite DBs -大多数应用程序将使用 **内部 SQLite 数据库** 来保存信息。在渗透测试期间,查看创建的 **数据库**、**表** 和 **列** 的名称以及所有保存的 **数据**,因为您可能会发现 **敏感信息**(这将是一个漏洞)。\ -数据库应位于 `/data/data/the.package.name/databases`,如 `/data/data/com.mwr.example.sieve/databases` +大多数应用会使用**内部 SQLite 数据库**来保存信息。在渗透测试期间,查看创建的**数据库**、**表名**和**列名**以及所有保存的数据,因为你可能会发现**敏感信息**(这将构成一个漏洞)。\ +数据库应该位于 `/data/data/the.package.name/databases`,例如 `/data/data/com.mwr.example.sieve/databases` -如果数据库保存机密信息并且 **加密** 但您可以在应用程序中 **找到** **密码**,这仍然是一个 **漏洞**。 +如果数据库保存机密信息并且是 **encrypted b**ut you can **find** the **password** inside the application it's still a **vulnerability**. 使用 `.tables` 枚举表,使用 `.schema ` 枚举表的列。 -### Drozer(利用活动、内容提供者和服务) +### Drozer (Exploit Activities, Content Providers and Services) -来自 [Drozer 文档](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf):**Drozer** 允许您 **假设 Android 应用程序的角色** 并与其他应用程序交互。它可以做 **任何已安装应用程序可以做的事情**,例如利用 Android 的进程间通信(IPC)机制并与底层操作系统交互。\ -Drozer 是一个有用的工具,可以 **利用导出活动、导出服务和内容提供者**,正如您将在以下部分中学习的那样。 +From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** allows you to **assume the role of an Android app** and interact with other apps. It can do **anything that an installed application can do**, such as make use of Android’s Inter-Process Communication (IPC) mechanism and interact with the underlying operating system. .\ +Drozer is s useful tool to **exploit exported activities, exported services and Content Providers** as you will learn in the following sections. -### 利用导出活动 +### 利用已导出的 Activities -[**如果您想刷新 Android 活动的概念,请阅读此文。**](android-applications-basics.md#launcher-activity-and-other-activities)\ -还要记住,活动的代码从 **`onCreate`** 方法开始。 +[**Read this if you want to refresh what is an Android Activity.**](android-applications-basics.md#launcher-activity-and-other-activities)\ +也请记住,Activity 的代码从 **`onCreate`** 方法开始执行。 -**授权绕过** +**Authorisation bypass** -当一个活动被导出时,您可以从外部应用程序调用其界面。因此,如果一个包含 **敏感信息** 的活动被 **导出**,您可能会 **绕过** **认证** 机制 **以访问它**。 +当一个 Activity 被导出(exported)时,你可以从外部应用调用其界面。因此,如果一个包含**敏感信息**的 activity 被**导出**,你可能可以**绕过****认证**机制**访问**它。 -[**了解如何使用 Drozer 利用导出活动。**](drozer-tutorial/index.html#activities) +[**Learn how to exploit exported activities with Drozer.**](drozer-tutorial/index.html#activities) -您还可以从 adb 启动导出活动: +你也可以通过 adb 启动一个已导出的 activity: -- 包名是 com.example.demo -- 导出活动名称是 com.example.test.MainActivity +- PackageName is com.example.demo +- Exported ActivityName is com.example.test.MainActivity ```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)中才是危险的。 +**NOTE**: MobSF will detect as malicious the use of _**singleTask/singleInstance**_ as `android:launchMode` in an activity, but due to [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), apparently this is only dangerous on old versions (API versions < 21). -> [!提示] -> 请注意,授权绕过并不总是一个漏洞,这取决于绕过的工作方式和暴露的信息。 +> [!TIP] +> 注意:授权绕过不一定就是一个漏洞,这取决于绕过的工作原理以及暴露了哪些信息。 -**敏感信息泄露** +**Sensitive information leakage** -**活动也可以返回结果**。如果您设法找到一个导出且未保护的活动调用**`setResult`**方法并**返回敏感信息**,则存在敏感信息泄露。 +**Activities can also return results**。如果你能找到一个 exported 且未受保护的 activity 调用 **`setResult`** 方法并**返回敏感信息**,则会发生敏感信息泄露。 #### Tapjacking -如果未防止tapjacking,您可能会滥用导出活动使**用户执行意外操作**。有关[**tapjacking是什么的更多信息,请查看链接**](#tapjacking)。 +如果没有防止 Tapjacking,你可以滥用已导出的 activity 使 **user perform unexpected actions**。有关更多信息,请参见 [**what is Tapjacking follow the link**](#tapjacking)。 -### 利用内容提供者 - 访问和操纵敏感信息 +### Exploiting Content Providers - Accessing and manipulating sensitive information -[**如果您想刷新内容提供者是什么,请阅读此内容。**](android-applications-basics.md#content-provider)\ -内容提供者基本上用于**共享数据**。如果一个应用程序有可用的内容提供者,您可能能够**提取敏感**数据。测试可能的**SQL注入**和**路径遍历**也很有趣,因为它们可能存在漏洞。 +[**Read this if you want to refresh what is a Content Provider.**](android-applications-basics.md#content-provider)\ +Content providers 基本上用于 **share data**。如果一个 app 存在可用的 content providers,你可能能够从中 **extract sensitive** 数据。也建议测试可能存在漏洞的 **SQL injections** 和 **Path Traversals**。 -[**了解如何使用Drozer利用内容提供者。**](drozer-tutorial/index.html#content-providers) +[**Learn how to exploit Content Providers with Drozer.**](drozer-tutorial/index.html#content-providers) -### **利用服务** +### **Exploiting Services** -[**如果您想刷新服务是什么,请阅读此内容。**](android-applications-basics.md#services)\ -请记住,服务的操作始于方法`onStartCommand`。 +[**Read this if you want to refresh what is a Service.**](android-applications-basics.md#services)\ +记住,Service 的动作从 `onStartCommand` 方法开始。 -服务基本上是可以**接收数据**、**处理**它并**返回**(或不返回)响应的东西。因此,如果一个应用程序导出了一些服务,您应该**检查**代码以了解它在做什么,并**动态**测试以提取机密信息、绕过身份验证措施...\ -[**了解如何使用Drozer利用服务。**](drozer-tutorial/index.html#services) +Service 本质上是可以接收数据、处理数据并(可选地)返回响应的组件。因此,如果应用导出了一些 services,你应该检查其代码以了解其行为,并对其进行动态测试以提取机密信息、绕过认证措施等。\ +[**Learn how to exploit Services with Drozer.**](drozer-tutorial/index.html#services) -### **利用广播接收器** +### **Exploiting Broadcast Receivers** -[**如果您想刷新广播接收器是什么,请阅读此内容。**](android-applications-basics.md#broadcast-receivers)\ -请记住,广播接收器的操作始于方法`onReceive`。 +[**Read this if you want to refresh what is a Broadcast Receiver.**](android-applications-basics.md#broadcast-receivers)\ +记住,Broadcast Receiver 的动作从 `onReceive` 方法开始。 -广播接收器将等待某种类型的消息。根据接收器如何处理消息,它可能会存在漏洞。\ -[**了解如何使用Drozer利用广播接收器。**](#exploiting-broadcast-receivers) +广播接收器会等待某种类型的消息。取决于接收器如何处理该消息,它可能存在漏洞。\ +[**Learn how to exploit Broadcast Receivers with Drozer.**](#exploiting-broadcast-receivers) -### **利用方案/深度链接** +### **Exploiting Schemes / Deep links** -您可以手动查找深度链接,使用像MobSF这样的工具或像[this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)这样的脚本。\ -您可以使用**adb**或**浏览器**打开声明的**方案**: +你可以手动查找 deep links,使用像 MobSF 这样的工具或像 [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py) 这样的脚本。\ +你可以使用 **adb** 或 **浏览器** 打开已声明的 **scheme**: ```bash adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name] ``` -_请注意,您可以**省略包名**,手机将自动调用应该打开该链接的应用程序。_ +_请注意,您可以**省略包名**,手机会自动调用应打开该链接的应用。_ ```html Click me with alternative ``` -**代码执行** +**执行的代码** -为了找到**将在应用中执行的代码**,请转到由深度链接调用的活动,并搜索函数**`onNewIntent`**。 +为了找到应用中将被执行的**代码**, 转到 deeplink 所调用的 activity 并搜索函数 **`onNewIntent`**。 ![](<../../images/image (436) (1) (1) (1).png>) **敏感信息** -每次找到深度链接时,请检查**它是否通过 URL 参数接收敏感数据(如密码)**,因为任何其他应用程序都可能**冒充深度链接并窃取该数据!** +每次找到 deep link 时,检查**它不会通过 URL 参数接收敏感数据(例如密码)**,因为任何其他应用都可能**冒充该 deep link 并窃取这些数据!** -**路径中的参数** +**Parameters in path** -您**还必须检查任何深度链接是否在 URL 的路径中使用参数**,例如:`https://api.example.com/v1/users/{username}`,在这种情况下,您可以强制路径遍历,访问类似于:`example://app/users?username=../../unwanted-endpoint%3fparam=value` 的内容。\ -请注意,如果您在应用程序中找到正确的端点,您可能能够导致**开放重定向**(如果路径的一部分用作域名)、**账户接管**(如果您可以在没有 CSRF 令牌的情况下修改用户详细信息,并且漏洞端点使用了正确的方法)以及任何其他漏洞。更多[信息在这里](http://dphoeniixx.com/2020/12/13-2/)。 +你**还必须检查是否有 deep link 在 URL 的 path 内使用参数**,例如:`https://api.example.com/v1/users/{username}`,在这种情况下你可以通过访问类似 `example://app/users?username=../../unwanted-endpoint%3fparam=value` 来强制进行 path traversal。\ +注意,如果你在应用内部找到正确的 endpoints,你可能能够触发一个 **Open Redirect**(如果路径的一部分被用作域名)、**account takeover**(如果你能在没有 CSRF token 的情况下修改用户详情且该 vuln endpoint 使用了正确的方法)以及其他任何 vuln。更多信息请见 [info about this here](http://dphoeniixx.com/2020/12/13-2/). -**更多示例** +**More examples** -一个[有趣的漏洞赏金报告](https://hackerone.com/reports/855618)关于链接 (_/.well-known/assetlinks.json_)。 +An [interesting bug bounty report](https://hackerone.com/reports/855618) about links (_/.well-known/assetlinks.json_). -### 传输层检查和验证失败 +### 传输层检查与验证失败 -- **证书并不总是被 Android 应用程序正确检查**。这些应用程序常常忽视警告,接受自签名证书,或者在某些情况下,恢复使用 HTTP 连接。 -- **SSL/TLS 握手期间的协商有时较弱**,使用不安全的密码套件。此漏洞使连接容易受到中间人(MITM)攻击,允许攻击者解密数据。 -- **私密信息泄露**是一个风险,当应用程序通过安全通道进行身份验证,但随后在其他交易中通过非安全通道进行通信。这种方法未能保护敏感数据,例如会话 cookie 或用户详细信息,免受恶意实体的拦截。 +- **证书并不总是被正确检查**,Android 应用中常见忽略警告并接受 self-signed certificates,或在某些情况下退回使用 HTTP 连接。 +- **SSL/TLS 握手期间的协商有时较弱**,使用不安全的 cipher suites。该漏洞使连接易受 man-in-the-middle (MITM) 攻击,允许攻击者解密数据。 +- **Leakage of private information** 是一种风险,当应用使用安全通道进行认证但随后在其他事务上通过非安全通道通信时,会导致未能保护敏感数据(例如 session cookies 或用户信息)免遭恶意实体拦截。 #### 证书验证 -我们将重点关注**证书验证**。必须验证服务器证书的完整性以增强安全性。这一点至关重要,因为不安全的 TLS 配置和通过未加密通道传输敏感数据可能会带来重大风险。有关验证服务器证书和解决漏洞的详细步骤,[**此资源**](https://manifestsecurity.com/android-application-security-part-10/)提供了全面的指导。 +我们将关注 **证书验证**。必须验证服务器证书的完整性以提高安全性。这一点至关重要,因为不安全的 TLS 配置和通过未加密通道传输敏感数据可能带来重大风险。有关验证服务器证书和修复漏洞的详细步骤,[**this resource**](https://manifestsecurity.com/android-application-security-part-10/) 提供了全面的指导。 -#### SSL 钉扎 +#### SSL Pinning -SSL 钉扎是一种安全措施,应用程序将服务器的证书与存储在应用程序内部的已知副本进行验证。这种方法对于防止 MITM 攻击至关重要。强烈建议处理敏感信息的应用程序实施 SSL 钉扎。 +SSL Pinning 是一种安全措施,应用将服务器证书与存储在应用中的已知副本进行比对。此方法对于防止 MITM 攻击至关重要。强烈建议在处理敏感信息的应用中实现 SSL Pinning。 #### 流量检查 -要检查 HTTP 流量,必须**安装代理工具的证书**(例如,Burp)。如果不安装此证书,经过代理的加密流量可能不可见。有关安装自定义 CA 证书的指南,[**请点击这里**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine)。 +要检查 HTTP 流量,需要**安装代理工具的证书**(例如 Burp)。如果不安装此证书,经过加密的流量可能无法通过代理可见。有关安装自定义 CA 证书的指南,[**click here**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine)。 -针对**API Level 24 及以上**的应用程序需要修改网络安全配置以接受代理的 CA 证书。这一步对于检查加密流量至关重要。有关修改网络安全配置的说明,[**请参考此教程**](make-apk-accept-ca-certificate.md)。 +针对 **API Level 24 and above** 的应用需要修改 Network Security Config 以接受代理的 CA 证书。此步骤对于检查加密流量至关重要。有关修改 Network Security Config 的说明,[**refer to this tutorial**](make-apk-accept-ca-certificate.md)。 -如果**Flutter**被使用,您需要遵循[**此页面**](flutter.md)中的说明。这是因为,仅将证书添加到存储中是行不通的,因为 Flutter 有自己有效 CA 的列表。 +如果使用 **Flutter**,需要按照 [**this page**](flutter.md) 的说明操作。这是因为仅将证书添加到存储中不起作用,Flutter 有其自己的有效 CA 列表。 -#### 绕过 SSL 钉扎 +#### 静态检测 SSL/TLS pinning -当实施 SSL 钉扎时,绕过它变得必要以检查 HTTPS 流量。为此有多种方法可用: +在尝试运行时绕过之前,先快速映射 APK 中强制 pinning 的位置。静态发现有助于你规划 hooks/patches 并专注于正确的代码路径。 -- 自动**修改** **apk**以**绕过** SSLPinning,使用[**apk-mitm**](https://github.com/shroudedcode/apk-mitm)。此选项的最大优点是,您无需 root 权限即可绕过 SSL 钉扎,但您需要删除应用程序并重新安装新版本,这并不总是有效。 -- 您可以使用**Frida**(下面讨论)来绕过此保护。这里有一个使用 Burp+Frida+Genymotion 的指南:[https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/) -- 您还可以尝试使用[**objection**](frida-tutorial/objection-tutorial.md)**自动绕过 SSL 钉扎**:`objection --gadget com.package.app explore --startup-command "android sslpinning disable"` -- 您还可以尝试使用**MobSF 动态分析**(下面解释)**自动绕过 SSL 钉扎** -- 如果您仍然认为有一些流量未被捕获,您可以尝试**使用 iptables 将流量转发到 burp**。阅读此博客:[https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) +Tool: SSLPinDetect +- Open-source static-analysis utility that decompiles the APK to Smali (via apktool) and scans for curated regex patterns of SSL/TLS pinning implementations. +- Reports exact file path, line number, and a code snippet for each match. +- Covers common frameworks and custom code paths: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers, and Network Security Config XML pins. -#### 寻找常见的网络漏洞 +Install +- Prereqs: Python >= 3.8, Java on PATH, apktool +```bash +git clone https://github.com/aancw/SSLPinDetect +cd SSLPinDetect +pip install -r requirements.txt +``` +使用 +```bash +# Basic +python sslpindetect.py -f app.apk -a apktool.jar -在应用程序中搜索常见的网络漏洞也很重要。有关识别和缓解这些漏洞的详细信息超出了本摘要的范围,但在其他地方有广泛的覆盖。 +# Verbose (timings + per-match path:line + snippet) +python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v +``` +示例模式规则 (JSON) +使用或扩展 signatures 来检测专有/自定义 pinning 样式。你可以加载自己的 JSON 并进行大规模 scan。 +```json +{ +"OkHttp Certificate Pinning": [ +"Lcom/squareup/okhttp/CertificatePinner;", +"Lokhttp3/CertificatePinner;", +"setCertificatePinner" +], +"TrustManager Override": [ +"Ljavax/net/ssl/X509TrustManager;", +"checkServerTrusted" +] +} +``` +注意事项和技巧 +- 在大型应用上通过 multi-threading 和 memory-mapped I/O 进行快速扫描;预编译的 regex 可以减少开销/误报。 +- Pattern collection: https://github.com/aancw/smali-sslpin-patterns +- 接下来需要分流的典型检测目标: +- OkHttp: CertificatePinner usage, setCertificatePinner, okhttp3/okhttp package references +- Custom TrustManagers: javax.net.ssl.X509TrustManager, checkServerTrusted overrides +- Custom SSL contexts: SSLContext.getInstance + SSLContext.init with custom managers +- Declarative pins in res/xml network security config and manifest references +- 使用匹配到的位置来在动态测试之前规划 Frida hooks、静态补丁或配置审查。 + + + +#### 绕过 SSL Pinning + +当实现了 SSL Pinning 时,为了检查 HTTPS 流量需要绕过它。对此有多种方法可用: + +- Automatically **modify** the **apk** to **bypass** SSLPinning with [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). The best pro of this option, is that you won't need root to bypass the SSL Pinning, but you will need to delete the application and reinstall the new one, and this won't always work. +- You could use **Frida** (discussed below) to bypass this protection. Here you have a guide to use Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/) +- You can also try to **automatically bypass SSL Pinning** using [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` +- You can also try to **automatically bypass SSL Pinning** using **MobSF dynamic analysis** (explained below) +- If you still think that there is some traffic that you aren't capturing you can try to **forward the traffic to burp using iptables**. Read this blog: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) + +#### 寻找常见的 Web 漏洞 + +同样重要的是在应用内搜索常见的 Web 漏洞。关于识别和缓解这些漏洞的详细信息超出本摘要的范围,但在其他地方有详尽覆盖。 ### Frida -[Frida](https://www.frida.re) 是一个动态插桩工具包,供开发人员、逆向工程师和安全研究人员使用。\ -**您可以访问正在运行的应用程序并在运行时挂钩方法以更改行为、修改值、提取值、运行不同的代码...**\ -如果您想对 Android 应用程序进行渗透测试,您需要知道如何使用 Frida。 +[Frida](https://www.frida.re) 是一个面向开发者、逆向工程师和安全研究人员的动态插装工具包。\ +**你可以访问运行中的应用并在运行时 hook 方法来改变行为、修改值、提取值或执行不同的代码...**\ +如果你想 pentest Android 应用,你需要知道如何使用 Frida。 -- 学习如何使用 Frida:[**Frida 教程**](frida-tutorial/index.html) -- 一些与 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 教程**](frida-tutorial/index.html) +- 用于 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) +- 尝试按照 [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) 中所示将 Frida 以此方式加载以绕过 anti-debugging / anti-frida 机制(工具 [linjector](https://github.com/erfur/linjector-rs)) -#### 反插桩和 SSL 钉扎绕过工作流程 +#### 反插装 & SSL pinning 绕过 工作流程 {{#ref}} android-anti-instrumentation-and-ssl-pinning-bypass.md {{#endref}} -### **内存转储 - Fridump** +### **转储内存 - Fridump** -检查应用程序是否在内存中存储不应存储的敏感信息,如密码或助记符。 +检查应用是否在内存中存储了不应该存储的敏感信息,例如密码或助记词。 -使用[**Fridump3**](https://github.com/rootbsd/fridump3),您可以转储应用程序的内存: +使用 [**Fridump3**](https://github.com/rootbsd/fridump3) 可以用以下命令转储应用的内存: ```bash # With PID python3 fridump3.py -u @@ -471,68 +528,68 @@ python3 fridump3.py -u frida-ps -Uai python3 fridump3.py -u "" ``` -这将把内存转储到 ./dump 文件夹中,在那里你可以使用类似的 grep: +这将把内存转储到 ./dump 文件夹,之后你可以在其中使用 grep,例如: ```bash strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$" ``` -### **Keystore中的敏感数据** +### **Keystore 中的敏感数据** -在Android中,Keystore是存储敏感数据的最佳位置,然而,拥有足够权限的情况下仍然**可以访问它**。由于应用程序倾向于在此处存储**明文敏感数据**,因此渗透测试应以root用户身份进行检查,或者某些具有物理访问权限的人可能能够窃取这些数据。 +在 Android 中,Keystore 是存放敏感数据的最佳位置,但在拥有足够权限的情况下,仍然**可能访问它**。由于应用倾向于在此处**以明文存储的敏感数据**,因此 pentests 应作为 root user 检查此项,否则有物理访问设备的人可能会窃取这些数据。 -即使应用程序将数据存储在keystore中,数据也应该是加密的。 +即使应用将数据存储在 Keystore 中,数据也应当被加密。 -要访问keystore中的数据,可以使用此Frida脚本:[https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js) +要访问 keystore 中的数据,你可以使用这个 Frida 脚本: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js) ```bash frida -U -f com.example.app -l frida-scripts/tracer-cipher.js ``` -### **指纹/生物识别绕过** +### **Fingerprint/Biometrics Bypass** -使用以下 Frida 脚本,可以 **绕过指纹认证**,Android 应用可能会执行此操作以 **保护某些敏感区域:** +使用下面的 Frida 脚本,可能可以 **bypass fingerprint authentication**,这是 Android applications 为了 **protect certain sensitive areas:** 所采取的措施。 ```bash frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f ``` -### **背景图像** +### **后台快照** -当您将应用程序置于后台时,Android 会存储应用程序的 **快照**,因此当它恢复到前台时,它会在应用程序之前开始加载图像,看起来像是应用程序加载得更快。 +当你把应用置于后台时,Android 会存储该应用的**快照**,以便在恢复到前台时先加载该图像,从而看起来像应用更快地启动。 -然而,如果这个快照包含 **敏感信息**,那么有权限访问快照的人可能会 **窃取这些信息**(请注意,您需要 root 权限才能访问它)。 +然而,如果该**快照**包含**敏感信息**,有权限访问该快照的人可能会**窃取这些信息**(注意,需要 root 权限才能访问)。 快照通常存储在: **`/data/system_ce/0/snapshots`** -Android 提供了一种方法来 **通过设置 FLAG_SECURE** 布局参数来防止屏幕截图的捕获。使用此标志后,窗口内容被视为安全,防止其出现在屏幕截图中或在不安全的显示器上查看。 +Android 提供了一种方法,即通过设置 **FLAG_SECURE 布局参数来防止屏幕截图**。使用该 flag 后,窗口内容将被视为安全,阻止其出现在屏幕截图中或在非安全显示设备上被查看。 ```bash getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); ``` -### **Android 应用分析器** +### **Android Application Analyzer** -此工具可以帮助您在动态分析过程中管理不同的工具:[https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer) +这个工具可以在动态分析期间帮助你管理不同的工具: [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer) -### 意图注入 +### Intent Injection -开发人员经常创建代理组件,如活动、服务和广播接收器,处理这些意图并将其传递给 `startActivity(...)` 或 `sendBroadcast(...)` 等方法,这可能存在风险。 +开发者经常创建代理组件,例如 activities、services 和 broadcast receivers 来处理这些 Intents,并将它们传递给诸如 `startActivity(...)` 或 `sendBroadcast(...)` 之类的方法,这可能存在风险。 -危险在于允许攻击者通过错误引导这些意图来触发未导出的应用组件或访问敏感内容提供者。一个显著的例子是 `WebView` 组件通过 `Intent.parseUri(...)` 将 URL 转换为 `Intent` 对象,然后执行它们,这可能导致恶意意图注入。 +危险在于允许攻击者通过误导这些 Intents 来触发非导出的 app 组件或访问敏感的 content providers。一个显著的例子是 `WebView` 组件通过 `Intent.parseUri(...)` 将 URL 转换为 `Intent` 对象并随后执行它们,这可能导致恶意的 Intent 注入。 -### 重要要点 +### Essential Takeaways -- **意图注入** 类似于网络的开放重定向问题。 -- 利用涉及将 `Intent` 对象作为额外参数传递,这可能被重定向以执行不安全的操作。 -- 它可以将未导出的组件和内容提供者暴露给攻击者。 -- `WebView` 的 URL 到 `Intent` 的转换可能促进意外操作。 +- **Intent Injection** 类似于 web 的 Open Redirect 问题。 +- 利用通常涉及将 `Intent` 对象作为 extras 传递,这些 Intent 可能被重定向以执行不安全的操作。 +- 它可能将非导出组件和 content providers 暴露给攻击者。 +- `WebView` 将 URL 转换为 `Intent` 的行为可能促使发生非预期的操作。 -### Android 客户端侧注入及其他 +### Android Client Side Injections and others -您可能对这种类型的漏洞有所了解。您必须特别小心 Android 应用中的这些漏洞: +你可能在 Web 上见过这类漏洞。在 Android 应用中必须对这些漏洞格外小心: -- **SQL 注入:** 在处理动态查询或内容提供者时,确保使用参数化查询。 -- **JavaScript 注入 (XSS):** 验证任何 WebViews 的 JavaScript 和插件支持是否已禁用(默认情况下禁用)。 [更多信息在这里](webview-attacks.md#javascript-enabled)。 -- **本地文件包含:** WebViews 应禁用对文件系统的访问(默认情况下启用) - `(webview.getSettings().setAllowFileAccess(false);)`。 [更多信息在这里](webview-attacks.md#javascript-enabled)。 -- **持久性 Cookie:** 在多个情况下,当 Android 应用结束会话时,Cookie 并未被撤销,甚至可能被保存到磁盘。 -- [**Cookie 中的安全标志**](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags) +- **SQL Injection:** 在处理动态查询或 Content-Providers 时,确保使用参数化查询。 +- **JavaScript Injection (XSS):** 请确认任何 WebViews 的 JavaScript 与 Plugin 支持已禁用(默认禁用)。 [More info here](webview-attacks.md#javascript-enabled). +- **Local File Inclusion:** WebViews 应禁用对文件系统的访问(默认启用) - `(webview.getSettings().setAllowFileAccess(false);)`. [More info here](webview-attacks.md#javascript-enabled). +- **Eternal cookies**: 在某些情况下,当 android application 结束会话时,cookie 未被撤销,甚至可能被保存到磁盘 +- [**Secure Flag** in cookies](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags) --- -## 自动分析 +## Automatic Analysis ### [MobSF](https://github.com/MobSF/Mobile-Security-Framework-MobSF) @@ -540,51 +597,51 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); ![](<../../images/image (866).png>) -**使用漂亮的基于 Web 的前端进行应用程序的漏洞评估。** 您还可以执行动态分析(但需要准备环境)。 +**对应用的漏洞评估** 使用漂亮的基于 Web 的前端。你也可以执行动态分析(但需要准备好环境)。 ```bash docker pull opensecurity/mobile-security-framework-mobsf docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest ``` -注意,MobSF 可以分析 **Android**(apk)**、IOS**(ipa) **和 Windows**(apx) 应用程序(_Windows 应用程序必须从安装在 Windows 主机上的 MobSF 进行分析_)。\ -此外,如果您创建一个包含 **Android** 或 **IOS** 应用程序源代码的 **ZIP** 文件(转到应用程序的根文件夹,选择所有内容并创建一个 ZIP 文件),它也能够分析它。 +Notice that MobSF can analyse **Android**(apk)**, IOS**(ipa) **and Windows**(apx) applications (_Windows applications must be analyzed from a MobSF installed in a Windows host_).\ +Also, if you create a **ZIP** file with the source code if an **Android** or an **IOS** app (go to the root folder of the application, select everything and create a ZIPfile), it will be able to analyse it also. -MobSF 还允许您进行 **diff/比较** 分析,并集成 **VirusTotal**(您需要在 _MobSF/settings.py_ 中设置您的 API 密钥并启用它:`VT_ENABLED = TRUE` `VT_API_KEY = ` `VT_UPLOAD = TRUE`)。您还可以将 `VT_UPLOAD` 设置为 `False`,这样 **hash** 将被 **上传** 而不是文件。 +MobSF 还允许你对分析结果进行 **diff/Compare** 并集成 **VirusTotal**(你需要在 _MobSF/settings.py_ 中设置你的 API key 并启用:`VT_ENABLED = TRUE` `VT_API_KEY = ` `VT_UPLOAD = TRUE`)。你也可以将 `VT_UPLOAD` 设置为 `False`,此时将上传 **hash** 而不是文件。 -### 使用 MobSF 进行辅助动态分析 +### Assisted Dynamic analysis with MobSF -**MobSF** 对于 **Android** 的 **动态分析** 也非常有帮助,但在这种情况下,您需要在主机上安装 MobSF 和 **genymotion**(虚拟机或 Docker 不会工作)。_注意:您需要 **先在 genymotion 中启动虚拟机**,然后 **再启动 MobSF。**_\ -**MobSF 动态分析器** 可以: +**MobSF** 在 **Android** 的 **dynamic analysis** 方面也非常有用,但在这种情况下你需要在宿主机上安装 MobSF 和 **genymotion**(VM 或 Docker 无法工作)。_Note: You need to **start first a VM in genymotion** and **then MobSF.**_\ +**MobSF dynamic analyser** 可以: -- **转储应用程序数据**(URLs、日志、剪贴板、您拍摄的屏幕截图、由 "**Exported Activity Tester**" 拍摄的屏幕截图、电子邮件、SQLite 数据库、XML 文件和其他创建的文件)。所有这些都是自动完成的,除了屏幕截图,您需要在想要截图时按下,或者您需要按 "**Exported Activity Tester**" 以获取所有导出活动的屏幕截图。 -- 捕获 **HTTPS 流量** -- 使用 **Frida** 获取 **运行时** **信息** +- **Dump application data** (URLs, logs, clipboard, screenshots made by you, screenshots made by "**Exported Activity Tester**", emails, SQLite databases, XML files, and other created files). 以上内容均会自动完成,除了 screenshots,截图需要你在想要截图时手动按下(按钮),或者按下 "**Exported Activity Tester**" 来获取所有导出 activity 的截图。 +- 捕获 **HTTPS traffic** +- 使用 **Frida** 获取 **runtime** **information** -从 Android **版本 > 5** 开始,它将 **自动启动 Frida** 并设置全局 **代理** 设置以 **捕获** 流量。它只会捕获被测试应用程序的流量。 +从 Android **versions > 5** 开始,它会 **automatically start Frida** 并设置全局 **proxy** 设置以 **capture** 流量。它只会捕获被测试应用的流量。 **Frida** -默认情况下,它还将使用一些 Frida 脚本来 **绕过 SSL 钉扎**、**根检测** 和 **调试器检测**,并 **监控有趣的 API**。\ -MobSF 还可以 **调用导出活动**,抓取它们的 **屏幕截图** 并 **保存** 到报告中。 +默认情况下,它还会使用一些 Frida Scripts 来 **bypass SSL pinning**、**root detection** 和 **debugger detection**,并 **monitor interesting APIs**。\ +MobSF 还可以 **invoke exported activities**,抓取它们的 **screenshots** 并 **save** 到报告中。 -要 **开始** 动态测试,请按绿色按钮:“**开始仪器化**”。按下“**Frida 实时日志**”以查看 Frida 脚本生成的日志,按下“**实时 API 监视器**”以查看所有调用的挂钩方法、传递的参数和返回值(这将在按下“开始仪器化”后出现)。\ -MobSF 还允许您加载自己的 **Frida 脚本**(要将您的 Frida 脚本的结果发送到 MobSF,请使用函数 `send()`)。它还具有 **多个预编写的脚本**,您可以加载(您可以在 `MobSF/DynamicAnalyzer/tools/frida_scripts/others/` 中添加更多),只需 **选择它们**,按“**加载**”并按“**开始仪器化**”(您将能够在“**Frida 实时日志**”中看到该脚本的日志)。 +要开始动态测试,按绿色按钮:“**Start Instrumentation**”。按 “**Frida Live Logs**” 可查看 Frida 脚本生成的日志,按 “**Live API Monitor**” 可查看所有对 hook 方法的调用、传入参数和返回值(这些将在按下 "Start Instrumentation" 后出现)。\ +MobSF 还允许你加载自定义的 **Frida scripts**(要将你的 Frida 脚本结果发送到 MobSF,请使用函数 `send()`)。它也有 **several pre-written scripts** 可供加载(你可以在 `MobSF/DynamicAnalyzer/tools/frida_scripts/others/` 中添加更多),只需选择它们,按 “**Load**”,然后按 “**Start Instrumentation**”(你将能在 “**Frida Live Logs**” 中看到这些脚本的日志)。 ![](<../../images/image (419).png>) -此外,您还有一些辅助 Frida 功能: +此外,你还有一些辅助的 Frida 功能: -- **枚举已加载的类**:它将打印所有已加载的类 -- **捕获字符串**:它将打印在使用应用程序时捕获的所有字符串(非常嘈杂) -- **捕获字符串比较**:可能非常有用。它将 **显示正在比较的两个字符串** 以及结果是 True 还是 False。 -- **枚举类方法**:输入类名(如 "java.io.File"),它将打印该类的所有方法。 -- **搜索类模式**:按模式搜索类 -- **跟踪类方法**:**跟踪** 一个 **整个类**(查看该类所有方法的输入和输出)。请记住,默认情况下 MobSF 跟踪几个有趣的 Android API 方法。 +- **Enumerate Loaded Classes**: 它会列出所有加载的 classes +- **Capture Strings**: 在使用应用时会打印捕获到的所有 strings(非常嘈杂) +- **Capture String Comparisons**: 非常有用。它会 **show the 2 strings being compared** 并显示比较结果为 True 还是 False。 +- **Enumerate Class Methods**: 输入类名(例如 "java.io.File"),它会打印该类的所有方法。 +- **Search Class Pattern**: 按模式搜索类 +- **Trace Class Methods**: **Trace** 整个类(查看该类所有方法的输入和输出)。请记住,默认情况下 MobSF 会跟踪若干有趣的 Android API 方法。 -一旦您选择了要使用的辅助模块,您需要按“**开始仪器化**”,您将看到所有输出在“**Frida 实时日志**”中。 +选择好要使用的辅助模块后,按下 "**Start Intrumentation**",你就会在 "**Frida Live Logs**" 中看到所有输出。 **Shell** -Mobsf 还为您提供了一个带有一些 **adb** 命令、**MobSF 命令** 和常见 **shell** **命令** 的 shell,位于动态分析页面的底部。一些有趣的命令: +MobSF 还在动态分析页面底部提供了一个 shell,其中包含一些 **adb** commands、**MobSF commands** 和常见的 **shell** **commands**。一些有趣的命令: ```bash help shell ls @@ -593,34 +650,35 @@ exported_activities services receivers ``` -**HTTP工具** +**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))。 +When http traffic is capture you can see an ugly view of the captured traffic on "**HTTP(S) Traffic**" bottom or a nicer view in "**Start HTTPTools**" green bottom. From the second option, you can **send** the **captured requests** to **proxies** like Burp or Owasp ZAP.\ +要做到这点,_power on Burp -->_ _turn off Intercept --> in MobSB HTTPTools select the request_ --> 按 "**Send to Fuzzer**" --> _select the proxy address_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080))。 -完成MobSF的动态分析后,您可以按“**Start Web API Fuzzer**”来**模糊http请求**并寻找漏洞。 +Once you finish the dynamic analysis with MobSF you can press on "**Start Web API Fuzzer**" to **fuzz http requests** an look for vulnerabilities. +完成使用 MobSF 的 dynamic analysis 后,你可以点击 "**Start Web API Fuzzer**" 来 **fuzz http requests** 并查找漏洞。 > [!TIP] -> 在使用MobSF进行动态分析后,代理设置可能会配置错误,您将无法从GUI中修复它们。您可以通过以下方式修复代理设置: +> After performing a dynamic analysis with MobSF the proxy settings me be misconfigured and you won't be able to fix them from the GUI. You can fix the proxy settings by doing: > > ``` > adb shell settings put global http_proxy :0 > ``` -### 使用Inspeckage进行辅助动态分析 +### 使用 Inspeckage 辅助 Dynamic Analysis -您可以从[**Inspeckage**](https://github.com/ac-pm/Inspeckage)获取该工具。\ -该工具将使用一些**Hooks**来让您了解**在执行动态分析时应用程序中发生了什么**。 +You can get the tool from [**Inspeckage**](https://github.com/ac-pm/Inspeckage).\ +该工具会使用一些 **Hooks**,在你进行 **dynamic analysis** 时帮助你了解**应用内部正在发生的事情**。 ### [Yaazhini](https://www.vegabird.com/yaazhini/) -这是一个**用于执行带GUI的静态分析的好工具** +这是一个**用于通过 GUI 执行 static analysis 的出色工具** ![](<../../images/image (741).png>) ### [Qark](https://github.com/linkedin/qark) -该工具旨在查找多个**与安全相关的Android应用程序漏洞**,无论是在**源代码**还是**打包的APK**中。该工具还**能够创建可部署的“概念验证”APK**和**ADB命令**,以利用一些发现的漏洞(暴露的活动、意图、点击劫持...)。与Drozer一样,无需对测试设备进行root。 +This tool is designed to look for several **security related Android application vulnerabilities**, either in **source code** or **packaged APKs**. 该工具还可以**生成可部署的 "Proof-of-Concept" APK**和**ADB commands**,用于利用发现的一些漏洞(Exposed activities、intents、tapjacking 等)。如同 Drozer,无需对测试设备进行 root。 ```bash pip3 install --user qark # --user is only needed if not using a virtualenv qark --apk path/to/my.apk @@ -629,10 +687,10 @@ qark --java path/to/specific/java/file.java ``` ### [**ReverseAPK**](https://github.com/1N3/ReverseAPK.git) -- 显示所有提取的文件以便于参考 -- 自动将APK文件反编译为Java和Smali格式 -- 分析AndroidManifest.xml以查找常见漏洞和行为 -- 对常见漏洞和行为进行静态源代码分析 +- 显示所有提取的文件以便参考 +- 自动将 APK 文件反编译为 Java 和 Smali 格式 +- 分析 AndroidManifest.xml 以查找常见漏洞和行为 +- 对源代码进行静态分析以识别常见漏洞和行为 - 设备信息 - 以及更多 ```bash @@ -640,11 +698,11 @@ 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_ 文件以寻找漏洞。它通过解压 APKs 并应用一系列规则来检测这些漏洞。 -所有规则都集中在一个 `rules.json` 文件中,每个公司或测试人员都可以创建自己的规则来分析他们需要的内容。 +所有规则集中在 `rules.json` 文件中,每个公司或测试人员都可以创建自己的规则来分析他们需要的内容。 -从 [download page](https://superanalyzer.rocks/download.html) 下载最新的二进制文件。 +从 [download page](https://superanalyzer.rocks/download.html) 下载最新的二进制文件 ``` super-analyzer {apk_file} ``` @@ -652,17 +710,17 @@ super-analyzer {apk_file} ![](<../../images/image (297).png>) -StaCoAn 是一个 **跨平台** 工具,帮助开发者、漏洞赏金猎人和道德黑客对移动应用程序进行 [静态代码分析](https://en.wikipedia.org/wiki/Static_program_analysis)。 +StaCoAn 是一个 **跨平台** 工具,帮助开发者、bugbounty hunters 和 ethical hackers 对移动应用执行 [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis)。 -其概念是将您的移动应用程序文件(.apk 或 .ipa 文件)拖放到 StaCoAn 应用程序上,它将为您生成一个可视化和便携的报告。您可以调整设置和词汇表,以获得定制的体验。 +其理念是你将移动应用文件(.apk 或 .ipa 文件)拖放到 StaCoAn 应用上,它会为你生成一个可视化且可携带的报告。你可以调整设置和词表以获得定制化体验。 -下载 [最新版本](https://github.com/vincentcox/StaCoAn/releases): +下载[ latest release](https://github.com/vincentcox/StaCoAn/releases): ``` ./stacoan ``` ### [AndroBugs](https://github.com/AndroBugs/AndroBugs_Framework) -AndroBugs Framework 是一个 Android 漏洞分析系统,帮助开发者或黑客发现 Android 应用中的潜在安全漏洞。\ +AndroBugs Framework 是一个 Android 漏洞分析系统,帮助开发者或 hackers 发现 Android 应用程序中的潜在安全漏洞。\ [Windows releases](https://github.com/AndroBugs/AndroBugs_Framework/releases) ``` python androbugs.py -f [APK file] @@ -670,11 +728,11 @@ androbugs.exe -f [APK file] ``` ### [Androwarn](https://github.com/maaaaz/androwarn) -**Androwarn** 是一个工具,其主要目的是检测并警告用户关于 Android 应用程序可能存在的恶意行为。 +**Androwarn** 是一个工具,其主要目的是检测并警告用户 Android 应用可能产生的潜在恶意行为。 -检测是通过对应用程序的 Dalvik 字节码进行 **静态分析** 来执行的,该字节码以 **Smali** 形式表示,使用 [`androguard`](https://github.com/androguard/androguard) 库。 +检测是通过对应用的 Dalvik bytecode(以 **Smali** 表示)进行 **static analysis**,并使用 [`androguard`](https://github.com/androguard/androguard) 库来实现。 -该工具寻找 **“坏” 应用程序的常见行为**,例如:电话标识符外泄、音频/视频流拦截、PIM 数据修改、任意代码执行... +该工具寻找类似以下的 **common behavior of "bad" applications**:Telephony identifiers exfiltration、Audio/video flow interception、PIM data modification、Arbitrary code execution... ``` python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3 ``` @@ -682,81 +740,84 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3 ![](<../../images/image (595).png>) -**MARA** 是一个 **M**obile **A**pplication **R**everse engineering 和 **A**nalysis Framework。它是一个将常用的移动应用程序逆向工程和分析工具整合在一起的工具,旨在帮助测试移动应用程序以应对 OWASP 移动安全威胁。其目标是使这一任务对移动应用程序开发者和安全专业人员更加简单和友好。 +**MARA** 是一个 Mobile Application Reverse engineering and Analysis Framework。它将常用的移动应用逆向工程和分析工具整合在一起,帮助针对 OWASP 移动安全威胁对移动应用进行测试。其目标是让这项工作对移动应用开发者和安全专业人员更简单、更友好。 它能够: - 使用不同工具提取 Java 和 Smali 代码 -- 使用以下工具分析 APK: [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD) -- 使用正则表达式从 APK 中提取私人信息。 +- Analyze APKs using: [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD) +- 使用正则表达式从 APK 中提取敏感信息。 - 分析 Manifest。 -- 使用以下工具分析发现的域: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) 和 [whatweb](https://github.com/urbanadventurer/WhatWeb) -- 通过 [apk-deguard.com](http://www.apk-deguard.com) 进行 APK 的去混淆。 +- Analyze found domains using: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) and [whatweb](https://github.com/urbanadventurer/WhatWeb) +- 通过 [apk-deguard.com](http://www.apk-deguard.com) 进行 APK 反混淆 ### Koodous -用于检测恶意软件: [https://koodous.com/](https://koodous.com) +用于检测恶意软件: [https://koodous.com/](https://koodous.com/) -## 混淆/去混淆代码 +## 代码混淆/反混淆 -请注意,具体取决于您用于混淆代码的服务和配置。秘密可能会被混淆,也可能不会。 +注意:根据用于混淆代码的服务和配置不同,敏感信息可能被混淆,也可能未被混淆。 ### [ProGuard]() -来自 [Wikipedia](): **ProGuard** 是一个开源命令行工具,用于缩小、优化和混淆 Java 代码。它能够优化字节码,并检测和删除未使用的指令。ProGuard 是自由软件,按照 GNU 通用公共许可证第 2 版分发。 +From [Wikipedia](): **ProGuard** 是一个开源命令行工具,用于缩小、优化并混淆 Java 代码。它能够优化字节码并检测和移除未使用的指令。ProGuard 是自由软件,依据 GNU General Public License 第2版分发。 -ProGuard 作为 Android SDK 的一部分分发,并在以发布模式构建应用程序时运行。 +ProGuard 随 Android SDK 一同分发,并在以 release 模式构建应用时运行。 ### [DexGuard](https://www.guardsquare.com/dexguard) -在 [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html) 找到去混淆 APK 的逐步指南。 +在 [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html) 可以找到一步步的 apk 反混淆指南。 -(来自该指南)我们最后检查时,Dexguard 的操作模式是: +(摘自该指南)我们上次检查时,Dexguard 的运行模式是: - 将资源加载为 InputStream; -- 将结果传递给继承自 FilterInputStream 的类以进行解密; -- 进行一些无用的混淆,以浪费反向工程师几分钟的时间; -- 将解密的结果传递给 ZipInputStream 以获取 DEX 文件; -- 最后使用 `loadDex` 方法将结果 DEX 加载为资源。 +- 将结果传入继承自 FilterInputStream 的类以对其解密; +- 做一些无用的混淆以浪费逆向者的时间; +- 将解密后的结果传入 ZipInputStream 以获得 DEX 文件; +- 最后使用 `loadDex` 方法将生成的 DEX 作为资源加载。 ### [DeGuard](http://apk-deguard.com) -**DeGuard 逆转 Android 混淆工具执行的混淆过程。这使得进行多种安全分析成为可能,包括代码检查和预测库。** +**DeGuard 可逆转 Android 混淆工具执行的混淆过程。这使得多种安全分析成为可能,包括代码检查和库识别。** -您可以将混淆的 APK 上传到他们的平台。 +你可以将混淆后的 APK 上传到他们的平台。 -### [Deobfuscate android App](https://github.com/In3tinct/deobfuscate-android-app) +### [Deobfuscate android App]https://github.com/In3tinct/deobfuscate-android-app -这是一个 LLM 工具,用于查找 Android 应用中的潜在安全漏洞并去混淆 Android 应用代码。使用 Google 的 Gemini 公共 API。 +这是一个用于发现 Android 应用潜在安全漏洞并对 Android 应用代码进行反混淆的 LLM 工具。使用 Google's Gemini public API。 ### [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 是如何构建的**。它能识别许多 **compilers**, **packers**, **obfuscators** 以及其他奇怪的东西。它是 Android 版的 [_PEiD_](https://www.aldeid.com/wiki/PEiD)。 -### 手动 +### Manual -[阅读本教程以学习一些关于 **如何逆向自定义混淆** 的技巧](manual-deobfuscation.md) +[Read this tutorial to learn some tricks on **how to reverse custom obfuscation**](manual-deobfuscation.md) -## 实验室 +## 实验 ### [Androl4b](https://github.com/sh4hin/Androl4b) -AndroL4b 是一个基于 ubuntu-mate 的 Android 安全虚拟机,包含来自不同安全极客和研究人员的最新框架、教程和实验室,用于逆向工程和恶意软件分析。 +AndroL4b 是一个基于 ubuntu-mate 的 Android 安全虚拟机,包含来自不同安全爱好者和研究者的最新框架、教程和用于逆向工程与恶意软件分析的实验。 -## 参考 +## 参考资料 - [https://owasp.org/www-project-mobile-app-security/](https://owasp.org/www-project-mobile-app-security/) -- [https://appsecwiki.com/#/](https://appsecwiki.com/#/) 这是一个很好的资源列表 +- [https://appsecwiki.com/#/](https://appsecwiki.com/#/) 这是一个很棒的资源列表 - [https://maddiestone.github.io/AndroidAppRE/](https://maddiestone.github.io/AndroidAppRE/) Android 快速课程 - [https://manifestsecurity.com/android-application-security/](https://manifestsecurity.com/android-application-security/) - [https://github.com/Ralireza/Android-Security-Teryaagh](https://github.com/Ralireza/Android-Security-Teryaagh) - [https://www.youtube.com/watch?v=PMKnPaGWxtg\&feature=youtu.be\&ab_channel=B3nacSec](https://www.youtube.com/watch?v=PMKnPaGWxtg&feature=youtu.be&ab_channel=B3nacSec) +- [SSLPinDetect: Advanced SSL Pinning Detection for Android Security Analysis](https://petruknisme.medium.com/sslpindetect-advanced-ssl-pinning-detection-for-android-security-analysis-1390e9eca097) +- [SSLPinDetect GitHub](https://github.com/aancw/SSLPinDetect) +- [smali-sslpin-patterns](https://github.com/aancw/smali-sslpin-patterns) -## 尚待尝试 +## 有待尝试 - [https://www.vegabird.com/yaazhini/](https://www.vegabird.com/yaazhini/) - [https://github.com/abhi-r3v0/Adhrit](https://github.com/abhi-r3v0/Adhrit)