diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 432bf44fc..e7e49e187 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -326,6 +326,7 @@ - [Android APK Checklist](mobile-pentesting/android-checklist.md) - [Android Applications Pentesting](mobile-pentesting/android-app-pentesting/README.md) - [Accessibility Services Abuse](mobile-pentesting/android-app-pentesting/accessibility-services-abuse.md) + - [Android Anti Instrumentation And Ssl Pinning Bypass](mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md) - [Android Applications Basics](mobile-pentesting/android-app-pentesting/android-applications-basics.md) - [Android Task Hijacking](mobile-pentesting/android-app-pentesting/android-task-hijacking.md) - [ADB Commands](mobile-pentesting/android-app-pentesting/adb-commands.md) diff --git a/src/mobile-pentesting/android-app-pentesting/README.md b/src/mobile-pentesting/android-app-pentesting/README.md index d1b1e4409..fd8f4e526 100644 --- a/src/mobile-pentesting/android-app-pentesting/README.md +++ b/src/mobile-pentesting/android-app-pentesting/README.md @@ -4,7 +4,7 @@ ## Android 应用程序基础 -强烈建议您开始阅读此页面,以了解与 Android 安全性相关的 **最重要部分和 Android 应用程序中最危险的组件**: +强烈建议您开始阅读此页面,以了解与 Android 安全性和 Android 应用程序中最危险组件相关的 **最重要部分**: {{#ref}} android-applications-basics.md @@ -20,7 +20,7 @@ android-applications-basics.md ## Smali 有时修改 **应用程序代码** 以访问 **隐藏信息**(可能是经过良好混淆的密码或标志)是很有趣的。然后,反编译 apk、修改代码并重新编译可能会很有趣。\ -[**在本教程中**,您可以 **学习如何反编译 APK、修改 Smali 代码并使用新功能重新编译 APK**](smali-changes.md)。这在 **动态分析期间的几项测试中可能非常有用**。因此,**始终记住这个可能性**。 +[**在本教程中**,您可以 **学习如何反编译 APK、修改 Smali 代码并使用新功能重新编译 APK**](smali-changes.md)。这在 **动态分析** 中作为 **多项测试的替代方案** 将非常有用。然后,**始终记住这个可能性**。 ## 其他有趣的技巧 @@ -65,21 +65,21 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed ### 寻找有趣的信息 -仅查看 APK 的**字符串**,您可以搜索**密码**、**URL** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep))、**api** 密钥、**加密**、**蓝牙 UUID**、**令牌**以及任何有趣的内容……甚至寻找代码执行的**后门**或身份验证后门(硬编码的管理员凭据)。 +仅查看 APK 的**字符串**,您可以搜索**密码**、**URL** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep))、**api** 密钥、**加密**、**蓝牙 UUID**、**令牌**以及任何有趣的内容……甚至查找代码执行的**后门**或身份验证后门(硬编码的管理员凭据)。 **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** 中识别的漏洞包括:** +**从 _Manifest.xml_ 中识别的漏洞包括:** -- **可调试应用程序**:在 _Manifest.xml_ 文件中设置为可调试 (`debuggable="true"`) 的应用程序存在风险,因为它们允许连接,可能导致被利用。有关如何利用可调试应用程序的进一步理解,请参考有关在设备上查找和利用可调试应用程序的教程。 -- **备份设置**:处理敏感信息的应用程序应明确设置 `android:allowBackup="false"` 属性,以防止通过 adb 进行未经授权的数据备份,尤其是在启用 USB 调试时。 -- **网络安全**:_res/xml/_ 中的自定义网络安全配置 (`android:networkSecurityConfig="@xml/network_security_config"`) 可以指定安全细节,如证书钉扎和 HTTP 流量设置。一个例子是允许特定域的 HTTP 流量。 +- **可调试应用程序**:在 _Manifest.xml_ 文件中设置为可调试(`debuggable="true"`)的应用程序存在风险,因为它们允许连接,可能导致被利用。有关如何利用可调试应用程序的进一步理解,请参考有关在设备上查找和利用可调试应用程序的教程。 +- **备份设置**:处理敏感信息的应用程序应明确设置 `android:allowBackup="false"` 属性,以防止通过 adb 未经授权的数据备份,尤其是在启用 USB 调试时。 +- **网络安全**:_res/xml/_ 中的自定义网络安全配置(`android:networkSecurityConfig="@xml/network_security_config"`)可以指定安全细节,如证书钉扎和 HTTP 流量设置。一个例子是允许特定域的 HTTP 流量。 - **导出活动和服务**:在清单中识别导出活动和服务可以突出可能被滥用的组件。在动态测试期间的进一步分析可以揭示如何利用这些组件。 - **内容提供者和文件提供者**:暴露的内容提供者可能允许未经授权访问或修改数据。文件提供者的配置也应仔细审查。 - **广播接收器和 URL 方案**:这些组件可能被利用进行攻击,特别注意如何管理 URL 方案以防止输入漏洞。 @@ -89,10 +89,10 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed ### Tapjacking -**Tapjacking** 是一种攻击,其中**恶意** **应用程序**被启动并**定位在受害者应用程序的顶部**。一旦它可见地遮挡了受害者应用程序,其用户界面被设计成欺骗用户与之交互,同时将交互传递给受害者应用程序。\ -实际上,它是**让用户不知道他们实际上是在对受害者应用程序执行操作**。 +**Tapjacking** 是一种攻击,其中**恶意** **应用程序**被启动并**定位在受害者应用程序的顶部**。一旦它可见地遮挡受害者应用程序,其用户界面设计成欺骗用户与之交互,同时将交互传递给受害者应用程序。\ +实际上,它是**让用户无法知道他们实际上是在对受害者应用程序执行操作**。 -获取更多信息: +在这里找到更多信息: {{#ref}} tapjacking.md @@ -100,9 +100,9 @@ tapjacking.md ### 任务劫持 -一个**活动**的**`launchMode`** 设置为**`singleTask`**,且未定义任何 `taskAffinity`,则容易受到任务劫持。这意味着,如果在真实应用程序之前安装并启动一个**应用程序**,它可能会**劫持真实应用程序的任务**(因此用户将与**恶意应用程序**交互,以为自己在使用真实应用程序)。 +一个**活动**的**`launchMode`** 设置为**`singleTask`**,且未定义任何 `taskAffinity`,则容易受到任务劫持。这意味着,如果在真实应用程序之前安装并启动了一个**应用程序**,它可能会**劫持真实应用程序的任务**(因此用户将与**恶意应用程序**交互,以为自己在使用真实应用程序)。 -更多信息: +更多信息在: {{#ref}} android-task-hijacking.md @@ -117,7 +117,7 @@ android-task-hijacking.md 1. **静态分析:** - **确保**仔细审查 `MODE_WORLD_READABLE` 和 `MODE_WORLD_WRITABLE` 的使用。这些模式**可能会暴露**文件给**意外或未经授权的访问**。 2. **动态分析:** -- **验证**应用程序创建的文件上的**权限**。具体来说,**检查**是否有任何文件被**设置为全球可读或可写**。这可能会带来重大安全风险,因为这将允许**任何应用程序**在设备上安装,无论其来源或意图如何,**读取或修改**这些文件。 +- **验证**应用程序创建的文件上的**权限**。具体来说,**检查**是否有任何文件被**设置为全球可读或可写**。这可能构成重大安全风险,因为这将允许**任何安装在设备上的应用程序**,无论其来源或意图如何,**读取或修改**这些文件。 **外部存储** @@ -136,7 +136,7 @@ android-task-hijacking.md 外部存储可以在 `/storage/emulated/0`、`/sdcard`、`/mnt/sdcard` 中访问。 > [!TIP] -> 从 Android 4.4(**API 17**)开始,SD 卡具有目录结构,**限制应用程序访问特定于该应用程序的目录**。这防止恶意应用程序获得对其他应用程序文件的读写访问。 +> 从 Android 4.4(**API 17**)开始,SD 卡具有一个目录结构,**限制应用程序访问特定于该应用程序的目录**。这防止恶意应用程序获得对其他应用程序文件的读写访问。 **以明文存储的敏感数据** @@ -152,7 +152,7 @@ android-task-hijacking.md SSLSocketFactory sf = new cc(trustStore); sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); ``` -测试此项的一个好方法是尝试使用像 Burp 这样的代理捕获流量,而不在设备中授权 Burp CA。此外,您还可以使用 Burp 为不同的主机名生成证书并使用它。 +测试这个的一个好方法是尝试使用像 Burp 这样的代理捕获流量,而不在设备中授权 Burp CA。此外,您还可以使用 Burp 为不同的主机名生成证书并使用它。 ### 破损的加密 @@ -162,7 +162,7 @@ sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); **使用不安全和/或过时的算法** -开发人员不应使用 **过时的算法** 来执行授权 **检查**、**存储** 或 **发送** 数据。这些算法包括:RC4、MD4、MD5、SHA1……如果 **哈希** 用于存储密码,例如,应该使用带盐的抗暴力破解 **哈希**。 +开发人员不应该使用 **过时的算法** 来执行授权 **检查**、**存储** 或 **发送** 数据。这些算法包括:RC4、MD4、MD5、SHA1……如果 **哈希** 用于存储密码,例如,应该使用带盐的抗暴力破解的哈希。 ### 其他检查 @@ -190,17 +190,17 @@ 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 算法。该博客讨论了创建一个可以解压这些类型应用程序的应用的可能性……以及一种更快的方法,即 **执行应用程序并从文件系统中收集解压的文件。** ### 自动化静态代码分析 -工具 [**mariana-trench**](https://github.com/facebook/mariana-trench) 能够通过 **扫描** 应用程序的 **代码** 来发现 **漏洞**。该工具包含一系列 **已知源**(指示工具 **用户控制输入的地方**)、**汇**(指示工具 **危险的地方**,恶意用户输入可能造成损害)和 **规则**。这些规则指示 **源-汇** 的 **组合**,表明存在漏洞。 +工具 [**mariana-trench**](https://github.com/facebook/mariana-trench) 能够通过 **扫描** 应用程序的 **代码** 来发现 **漏洞**。该工具包含一系列 **已知源**(指示工具 **用户控制的输入** 的 **位置**)、**汇**(指示工具 **危险** **位置**,恶意用户输入可能造成损害)和 **规则**。这些规则指示 **源-汇** 的 **组合**,表明存在漏洞。 通过这些知识,**mariana-trench 将审查代码并找到可能的漏洞**。 ### 泄露的秘密 -应用程序可能包含秘密(API 密钥、密码、隐藏的 URL、子域名……),您可能能够发现。您可以使用像 [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks) 这样的工具。 +应用程序可能包含秘密(API 密钥、密码、隐藏的 URL、子域名……)在其中,您可能能够发现。您可以使用像 [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks) 这样的工具。 ### 绕过生物识别认证 @@ -243,7 +243,7 @@ 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}} @@ -272,14 +272,14 @@ avd-android-virtual-device.md 4. 按 **构建号** 7 次。 5. 返回,您将找到 **开发者选项**。 -> 一旦您安装了应用程序,您首先应该尝试它并调查它的功能、工作原理,并对此感到熟悉。\ -> 我建议使用 MobSF 动态分析 + pidcat 进行此初步动态分析,这样我们就可以在 MobSF **捕获** 大量 **有趣的** **数据** 供您稍后查看的同时 **了解应用程序的工作原理**。 +> 一旦您安装了应用程序,您首先应该尝试它并调查它的功能、工作原理,并与之熟悉。\ +> 我建议使用 MobSF 动态分析 + pidcat 进行此初步动态分析,这样我们就可以在 MobSF **捕获** 许多 **有趣的** **数据** 供您稍后查看的同时 **了解应用程序的工作原理**。 ### 意外数据泄露 **日志记录** -开发人员应谨慎公开 **调试信息**,因为这可能导致敏感数据泄露。建议使用工具 [**pidcat**](https://github.com/JakeWharton/pidcat) 和 `adb logcat` 监控应用程序日志,以识别和保护敏感信息。**Pidcat** 因其易用性和可读性而受到青睐。 +开发人员应谨慎公开 **调试信息**,因为这可能导致敏感数据泄露。推荐使用工具 [**pidcat**](https://github.com/JakeWharton/pidcat) 和 `adb logcat` 来监控应用程序日志,以识别和保护敏感信息。**Pidcat** 因其易用性和可读性而受到青睐。 > [!WARNING] > 请注意,从 **Android 4.0 及更高版本** 开始,**应用程序只能访问自己的日志**。因此,应用程序无法访问其他应用的日志。\ @@ -291,22 +291,22 @@ Android 的 **基于剪贴板** 的框架使应用程序能够实现复制粘贴 **崩溃日志** -如果应用程序 **崩溃** 并 **保存日志**,这些日志可能会帮助攻击者,特别是当应用程序无法被反向工程时。为了降低此风险,避免在崩溃时记录日志,如果必须通过网络传输日志,请确保通过 SSL 通道发送以确保安全。 +如果应用程序 **崩溃** 并 **保存日志**,这些日志可能会帮助攻击者,特别是当应用程序无法被反向工程时。为了降低这种风险,避免在崩溃时记录日志,如果必须通过网络传输日志,请确保通过 SSL 通道发送以确保安全。 -作为渗透测试人员,**请查看这些日志**。 +作为渗透测试者,**请查看这些日志**。 **发送给第三方的分析数据** -应用程序通常集成像 Google Adsense 这样的服务,由于开发人员的不当实现,可能会 **泄露敏感数据**。为了识别潜在的数据泄露,建议 **拦截应用程序的流量** 并检查是否有任何敏感信息被发送到第三方服务。 +应用程序通常集成像 Google Adsense 这样的服务,由于开发人员的不当实施,可能会 **泄露敏感数据**。为了识别潜在的数据泄露,建议 **拦截应用程序的流量** 并检查是否有任何敏感信息被发送到第三方服务。 ### SQLite 数据库 -大多数应用程序将使用 **内部 SQLite 数据库** 来保存信息。在渗透测试期间,请 **查看** 创建的 **数据库**、**表** 和 **列** 的名称以及所有保存的 **数据**,因为您可能会发现 **敏感信息**(这将是一个漏洞)。\ +大多数应用程序将使用 **内部 SQLite 数据库** 来保存信息。在渗透测试期间,请 **查看** 创建的 **数据库**、**表** 和 **列** 的名称以及所有 **保存的数据**,因为您可能会发现 **敏感信息**(这将是一个漏洞)。\ 数据库应位于 `/data/data/the.package.name/databases`,如 `/data/data/com.mwr.example.sieve/databases` 如果数据库保存机密信息并且 **加密** 但您可以在应用程序中 **找到** **密码**,这仍然是一个 **漏洞**。 -使用 `.tables` 枚举表,并使用 `.schema ` 枚举表的列。 +使用 `.tables` 枚举表,使用 `.schema ` 枚举表的列。 ### Drozer(利用活动、内容提供者和服务) @@ -331,46 +331,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注入**和**路径遍历**也很有趣,因为它们可能存在漏洞。 +[**如果你想刷新内容提供者是什么,请阅读此内容。**](android-applications-basics.md#content-provider)\ +内容提供者基本上用于 **共享数据**。如果一个应用程序有可用的内容提供者,你可能能够 **提取敏感** 数据。测试可能的 **SQL 注入** 和 **路径遍历** 也很有趣,因为它们可能存在漏洞。 -[**了解如何使用Drozer利用内容提供者。**](drozer-tutorial/index.html#content-providers) +[**学习如何使用 Drozer 利用内容提供者。**](drozer-tutorial/index.html#content-providers) ### **利用服务** -[**如果您想刷新服务是什么,请阅读此内容。**](android-applications-basics.md#services)\ -请记住,服务的操作始于方法`onStartCommand`。 +[**如果你想刷新服务是什么,请阅读此内容。**](android-applications-basics.md#services)\ +请记住,服务的操作始于 `onStartCommand` 方法。 -服务基本上是可以**接收数据**、**处理**它并**返回**(或不返回)响应的东西。因此,如果一个应用程序导出了一些服务,您应该**检查**代码以了解它在做什么,并**动态**测试以提取机密信息、绕过身份验证措施...\ -[**了解如何使用Drozer利用服务。**](drozer-tutorial/index.html#services) +服务基本上是可以 **接收数据**、**处理** 数据并 **返回**(或不返回)响应的东西。因此,如果一个应用程序导出了一些服务,你应该 **检查** 其 **代码** 以了解它在做什么,并 **动态测试** 以提取机密信息、绕过身份验证措施...\ +[**学习如何使用 Drozer 利用服务。**](drozer-tutorial/index.html#services) ### **利用广播接收器** -[**如果您想刷新广播接收器是什么,请阅读此内容。**](android-applications-basics.md#broadcast-receivers)\ -请记住,广播接收器的操作始于方法`onReceive`。 +[**如果你想刷新广播接收器是什么,请阅读此内容。**](android-applications-basics.md#broadcast-receivers)\ +请记住,广播接收器的操作始于 `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] ``` @@ -402,7 +402,7 @@ _请注意,您可以**省略包名**,手机将自动调用应该打开该链 ### 传输层检查和验证失败 -- **证书并不总是被 Android 应用程序正确检查**。这些应用程序常常忽视警告,接受自签名证书,或者在某些情况下,恢复使用 HTTP 连接。 +- **Android 应用程序并不总是正确检查证书**。这些应用程序常常忽视警告,接受自签名证书,或者在某些情况下,恢复使用 HTTP 连接。 - **SSL/TLS 握手期间的协商有时较弱**,使用不安全的密码套件。此漏洞使连接容易受到中间人(MITM)攻击,允许攻击者解密数据。 - **私密信息泄露**是一个风险,当应用程序通过安全通道进行身份验证,但随后在其他交易中通过非安全通道进行通信。这种方法未能保护敏感数据,例如会话 cookie 或用户详细信息,免受恶意实体的拦截。 @@ -416,7 +416,7 @@ SSL 钉扎是一种安全措施,应用程序将服务器的证书与存储在 #### 流量检查 -要检查 HTTP 流量,必须**安装代理工具的证书**(例如,Burp)。如果不安装此证书,加密流量可能无法通过代理可见。有关安装自定义 CA 证书的指南,[**请点击这里**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine)。 +要检查 HTTP 流量,必须**安装代理工具的证书**(例如,Burp)。如果不安装此证书,经过代理的加密流量可能不可见。有关安装自定义 CA 证书的指南,[**请点击这里**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine)。 针对**API Level 24 及以上**的应用程序需要修改网络安全配置以接受代理的 CA 证书。这一步对于检查加密流量至关重要。有关修改网络安全配置的说明,[**请参考此教程**](make-apk-accept-ca-certificate.md)。 @@ -426,7 +426,7 @@ SSL 钉扎是一种安全措施,应用程序将服务器的证书与存储在 当实施 SSL 钉扎时,绕过它成为检查 HTTPS 流量的必要条件。为此有多种方法可用: -- 自动**修改** **apk**以**绕过** SSL 钉扎,使用[**apk-mitm**](https://github.com/shroudedcode/apk-mitm)。此选项的最大优点是,您无需 root 权限即可绕过 SSL 钉扎,但您需要删除应用程序并重新安装新版本,这并不总是有效。 +- 自动**修改** **apk**以**绕过** SSL 钉扎,使用[**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 钉扎** @@ -438,21 +438,27 @@ SSL 钉扎是一种安全措施,应用程序将服务器的证书与存储在 ### Frida -[Frida](https://www.frida.re)是一个动态插桩工具包,供开发人员、逆向工程师和安全研究人员使用。\ -**您可以访问正在运行的应用程序并在运行时挂钩方法以更改行为、更改值、提取值、运行不同的代码...**\ +[Frida](https://www.frida.re) 是一个动态插桩工具包,供开发人员、逆向工程师和安全研究人员使用。\ +**您可以访问正在运行的应用程序并在运行时挂钩方法以更改行为、修改值、提取值、运行不同的代码...**\ 如果您想对 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) +- 一些与 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)) +#### 反插桩和 SSL 钉扎绕过工作流程 + +{{#ref}} +android-anti-instrumentation-and-ssl-pinning-bypass.md +{{#endref}} + ### **内存转储 - Fridump** 检查应用程序是否在内存中存储不应存储的敏感信息,如密码或助记符。 -使用[**Fridump3**](https://github.com/rootbsd/fridump3),您可以转储应用程序的内存: +使用[**Fridump3**](https://github.com/rootbsd/fridump3),您可以通过以下命令转储应用程序的内存: ```bash # With PID python3 fridump3.py -u @@ -467,17 +473,17 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a ``` ### **Keystore中的敏感数据** -在Android中,Keystore是存储敏感数据的最佳位置,然而,拥有足够权限的情况下仍然**可以访问它**。由于应用程序倾向于在此处存储**明文敏感数据**,因此渗透测试应以root用户身份进行检查,或者某些具有物理访问权限的人可能能够窃取这些数据。 +在Android中,Keystore是存储敏感数据的最佳位置,然而,拥有足够权限的情况下仍然**可以访问它**。由于应用程序往往在这里**以明文存储敏感数据**,因此渗透测试应以root用户身份进行检查,或者某些具有物理访问权限的人可能能够窃取这些数据。 即使应用程序将数据存储在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 ``` ### **指纹/生物识别绕过** -使用以下 Frida 脚本,可能可以 **绕过指纹认证** Android 应用程序可能正在执行的,以 **保护某些敏感区域:** +使用以下 Frida 脚本,可以 **绕过指纹认证**,Android 应用可能会执行此操作以 **保护某些敏感区域:** ```bash frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f ``` @@ -508,7 +514,7 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); - **意图注入** 类似于网络的开放重定向问题。 - 利用涉及将 `Intent` 对象作为额外参数传递,这可能被重定向以执行不安全的操作。 - 它可以将未导出的组件和内容提供者暴露给攻击者。 -- `WebView` 的 URL 到 `Intent` 转换可以促进意外操作。 +- `WebView` 的 URL 到 `Intent` 的转换可能促进意外操作。 ### Android 客户端侧注入及其他 @@ -554,23 +560,23 @@ MobSF 还允许您进行 **diff/比较** 分析,并集成 **VirusTotal**(您 **Frida** 默认情况下,它还将使用一些 Frida 脚本来 **绕过 SSL 钉扎**、**根检测** 和 **调试器检测**,并 **监控有趣的 API**。\ -MobSF 还可以 **调用导出活动**,抓取它们的 **屏幕截图** 并 **保存** 到报告中。 +MobSF 还可以 **调用导出活动**,抓取它们的 **屏幕截图** 并 **保存** 以供报告使用。 -要 **开始** 动态测试,请按绿色按钮:“**开始仪器化**”。按下“**Frida 实时日志**”以查看 Frida 脚本生成的日志,按下“**实时 API 监视器**”以查看所有调用的挂钩方法、传递的参数和返回值(在按下“开始仪器化”后会出现)。\ -MobSF 还允许您加载自己的 **Frida 脚本**(要将您的 Frida 脚本的结果发送到 MobSF,请使用 `send()` 函数)。它还具有 **多个预编写的脚本**,您可以加载(您可以在 `MobSF/DynamicAnalyzer/tools/frida_scripts/others/` 中添加更多),只需 **选择它们**,按“**加载**”并按“**开始仪器化**”(您将能够在“**Frida 实时日志**”中看到该脚本的日志)。 +要 **开始** 动态测试,请按绿色按钮:“**开始仪器化**”。按下“**Frida 实时日志**”以查看 Frida 脚本生成的日志,按下“**实时 API 监视器**”以查看所有调用的挂钩方法、传递的参数和返回值(这将在按下“开始仪器化”后出现)。\ +MobSF 还允许您加载自己的 **Frida 脚本**(要将您的 Frida 脚本的结果发送到 MobSF,请使用函数 `send()`)。它还具有 **多个预编写的脚本**,您可以加载(您可以在 `MobSF/DynamicAnalyzer/tools/frida_scripts/others/` 中添加更多),只需 **选择它们**,按“**加载**”并按“**开始仪器化**”(您将能够在“**Frida 实时日志**”中看到该脚本的日志)。 ![](<../../images/image (419).png>) 此外,您还有一些辅助 Frida 功能: -- **枚举加载的类**:它将打印所有加载的类 +- **枚举已加载的类**:它将打印所有已加载的类 - **捕获字符串**:它将打印在使用应用程序时捕获的所有字符串(非常嘈杂) - **捕获字符串比较**:可能非常有用。它将 **显示正在比较的两个字符串** 以及结果是 True 还是 False。 - **枚举类方法**:输入类名(如 "java.io.File"),它将打印该类的所有方法。 - **搜索类模式**:按模式搜索类 - **跟踪类方法**:**跟踪** 一个 **整个类**(查看该类所有方法的输入和输出)。请记住,默认情况下 MobSF 跟踪几个有趣的 Android API 方法。 -一旦您选择了要使用的辅助模块,您需要按“**开始仪器化**”,您将看到所有输出在“**Frida 实时日志**”中。 +一旦您选择了要使用的辅助模块,您需要按“**开始仪器化**”,您将在“**Frida 实时日志**”中看到所有输出。 **Shell** @@ -585,8 +591,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请求**并寻找漏洞。 @@ -721,7 +727,7 @@ ProGuard 作为 Android SDK 的一部分分发,并在以发布模式构建应 ### [Simplify](https://github.com/CalebFenton/simplify) -它是一个 **通用的 Android 去混淆器。** Simplify **虚拟执行应用程序** 以理解其行为,然后 **尝试优化代码** 使其行为相同,但更易于人类理解。每种优化类型都是简单和通用的,因此无论使用何种特定类型的混淆都无关紧要。 +它是一个 **通用的 Android 去混淆器。** Simplify **虚拟执行应用程序** 以理解其行为,然后 **尝试优化代码** 使其表现相同,但更易于人类理解。每种优化类型都是简单和通用的,因此无论使用何种特定类型的混淆都无关紧要。 ### [APKiD](https://github.com/rednaga/APKiD) diff --git a/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md b/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md new file mode 100644 index 000000000..d62ee2f98 --- /dev/null +++ b/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md @@ -0,0 +1,203 @@ +# Android Anti-Instrumentation & SSL Pinning Bypass (Frida/Objection) + +{{#include ../../banners/hacktricks-training.md}} + +本页面提供了一种实用的工作流程,以恢复对检测/根阻止工具或强制执行TLS固定的Android应用程序的动态分析。它专注于快速分类、常见检测以及可复制的钩子/战术,以在可能的情况下绕过它们而无需重新打包。 + +## 检测表面(应用程序检查内容) + +- 根检查:su二进制文件、Magisk路径、getprop值、常见根包 +- Frida/调试器检查(Java):Debug.isDebuggerConnected()、ActivityManager.getRunningAppProcesses()、getRunningServices()、扫描/proc、类路径、加载的库 +- 本地反调试:ptrace()、系统调用、反附加、断点、内联钩子 +- 早期初始化检查:Application.onCreate()或进程启动钩子,如果存在工具则崩溃 +- TLS固定:自定义TrustManager/HostnameVerifier、OkHttp CertificatePinner、Conscrypt固定、本地固定 + +## 第一步 — 快速胜利:使用Magisk DenyList隐藏根 + +- 在Magisk中启用Zygisk +- 启用DenyList,添加目标包 +- 重启并重新测试 + +许多应用程序只查找明显的指标(su/Magisk路径/getprop)。DenyList通常可以中和幼稚的检查。 + +参考: +- Magisk (Zygisk & DenyList): https://github.com/topjohnwu/Magisk + +## 第二步 — 30秒Frida代码共享测试 + +在深入之前尝试常见的即插即用脚本: + +- anti-root-bypass.js +- anti-frida-detection.js +- hide_frida_gum.js + +示例: +```bash +frida -U -f com.example.app -l anti-frida-detection.js +``` +这些通常会阻止 Java 根/调试检查、进程/服务扫描和本地 ptrace()。在保护较轻的应用程序上很有用;加固的目标可能需要量身定制的钩子。 + +- Codeshare: https://codeshare.frida.re/ + +## 第 3 步 — 通过延迟附加绕过初始化时检测器 + +许多检测仅在进程生成/onCreate() 时运行。生成时注入 (-f) 或小工具会被捕获;在 UI 加载后附加可以避开检测。 +```bash +# Launch the app normally (launcher/adb), wait for UI, then attach +frida -U -n com.example.app +# Or with Objection to attach to running process +aobjection --gadget com.example.app explore # if using gadget +``` +如果这有效,保持会话稳定并继续进行映射和存根检查。 + +## 第4步 — 通过Jadx和字符串搜索映射检测逻辑 + +Jadx中的静态分类关键字: +- "frida", "gum", "root", "magisk", "ptrace", "su", "getprop", "debugger" + +典型的Java模式: +```java +public boolean isFridaDetected() { +return getRunningServices().contains("frida"); +} +``` +常见的API审查/钩子: +- android.os.Debug.isDebuggerConnected +- android.app.ActivityManager.getRunningAppProcesses / getRunningServices +- java.lang.System.loadLibrary / System.load (native bridge) +- java.lang.Runtime.exec / ProcessBuilder (探测命令) +- android.os.SystemProperties.get (root/emulator启发式) + +## 第5步 — 使用Frida进行运行时存根(Java) + +覆盖自定义保护以返回安全值而无需重新打包: +```js +Java.perform(() => { +const Checks = Java.use('com.example.security.Checks'); +Checks.isFridaDetected.implementation = function () { return false; }; + +// Neutralize debugger checks +const Debug = Java.use('android.os.Debug'); +Debug.isDebuggerConnected.implementation = function () { return false; }; + +// Example: kill ActivityManager scans +const AM = Java.use('android.app.ActivityManager'); +AM.getRunningAppProcesses.implementation = function () { return java.util.Collections.emptyList(); }; +}); +``` +在崩溃早期进行分类?在应用程序崩溃之前转储类,以便发现可能的检测命名空间: +```js +Java.perform(() => { +Java.enumerateLoadedClasses({ +onMatch: n => console.log(n), +onComplete: () => console.log('Done') +}); +}); +``` +记录并中和可疑方法以确认执行流程: +```js +Java.perform(() => { +const Det = Java.use('com.example.security.DetectionManager'); +Det.checkFrida.implementation = function () { +console.log('checkFrida() called'); +return false; +}; +}); +``` +## Step 6 — 当 Java hooks 失败时,跟踪 JNI/native 路径 + +跟踪 JNI 入口点以定位本地加载器和检测初始化: +```bash +frida-trace -n com.example.app -i "JNI_OnLoad" +``` +快速本地分类捆绑的 .so 文件: +```bash +# List exported symbols & JNI +nm -D libfoo.so | head +objdump -T libfoo.so | grep Java_ +strings -n 6 libfoo.so | egrep -i 'frida|ptrace|gum|magisk|su|root' +``` +交互式/本地反向工程: +- Ghidra: https://ghidra-sre.org/ +- r2frida: https://github.com/nowsecure/r2frida + +示例:中和 ptrace 以击败 libc 中的简单反调试: +```js +const ptrace = Module.findExportByName(null, 'ptrace'); +if (ptrace) { +Interceptor.replace(ptrace, new NativeCallback(function () { +return -1; // pretend failure +}, 'int', ['int', 'int', 'pointer', 'pointer'])); +} +``` +另请参见:{{#ref}} +reversing-native-libraries.md +{{#endref}} + +## 第7步 — Objection打补丁(嵌入小工具/剥离基础) + +当您更喜欢重新打包而不是运行时钩子时,请尝试: +```bash +objection patchapk --source app.apk +``` +注意: +- 需要 apktool;确保从官方指南获取当前版本以避免构建问题: https://apktool.org/docs/install +- Gadget 注入可以在不获取 root 权限的情况下启用仪器,但仍然可能被更强的初始化检查捕获。 + +参考: +- Objection: https://github.com/sensepost/objection + +## 第 8 步 — 回退:修补 TLS 钉扎以获取网络可见性 + +如果仪器被阻止,您仍然可以通过静态移除钉扎来检查流量: +```bash +apk-mitm app.apk +# Then install the patched APK and proxy via Burp/mitmproxy +``` +- 工具: https://github.com/shroudedcode/apk-mitm +- 有关网络配置 CA‑trust 技巧(以及 Android 7+ 用户 CA 信任),请参见: +{{#ref}} +make-apk-accept-ca-certificate.md +{{#endref}} +{{#ref}} +install-burp-certificate.md +{{#endref}} + +## 实用命令备忘单 +```bash +# List processes and attach +frida-ps -Uai +frida -U -n com.example.app + +# Spawn with a script (may trigger detectors) +frida -U -f com.example.app -l anti-frida-detection.js + +# Trace native init +frida-trace -n com.example.app -i "JNI_OnLoad" + +# Objection runtime +objection --gadget com.example.app explore + +# Static TLS pinning removal +apk-mitm app.apk +``` +## 提示与注意事项 + +- 在应用程序启动时崩溃时,优先选择后期附加而不是生成 +- 一些检测在关键流程中重新运行(例如,支付、认证)——在导航期间保持钩子活跃 +- 混合静态和动态:在Jadx中查找字符串以缩短类列表;然后钩住方法以在运行时验证 +- 加固的应用程序可能使用打包器和本地TLS固定——预计需要逆向本地代码 + +## 参考文献 + +- [Reversing Android Apps: Bypassing Detection Like a Pro](https://www.kayssel.com/newsletter/issue-12/) +- [Frida Codeshare](https://codeshare.frida.re/) +- [Objection](https://github.com/sensepost/objection) +- [apk-mitm](https://github.com/shroudedcode/apk-mitm) +- [Jadx](https://github.com/skylot/jadx) +- [Ghidra](https://ghidra-sre.org/) +- [r2frida](https://github.com/nowsecure/r2frida) +- [Apktool install guide](https://apktool.org/docs/install) +- [Magisk](https://github.com/topjohnwu/Magisk) + +{{#include ../../banners/hacktricks-training.md}}