mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/mobile-pentesting/android-app-pentesting/avd-androi
This commit is contained in:
parent
7431a47208
commit
6833cda42a
@ -13,24 +13,24 @@ android-applications-basics.md
|
||||
|
||||
## ADB (Android Debug Bridge)
|
||||
|
||||
这是连接 Android 设备(模拟或物理)所需的主要工具。\
|
||||
**ADB** 允许从计算机通过 **USB** 或 **Network** 控制设备。该工具支持双向 **复制** 文件、**安装** 和 **卸载** 应用、**执行** shell 命令、**备份** 数据、**读取** 日志等功能。
|
||||
这是连接到 Android 设备(模拟或实体)所需的主要工具。\
|
||||
**ADB** 允许从计算机通过 **USB** 或 **Network** 控制设备。该工具可实现文件的双向**复制**、应用的**安装**与**卸载**、shell 命令的**执行**、数据的**备份**、日志的**读取**,以及其他功能。
|
||||
|
||||
查看以下 [**ADB Commands**](adb-commands.md) 列表以学习如何使用 adb。
|
||||
查看下面的 [**ADB Commands**](adb-commands.md) 列表,学习如何使用 adb。
|
||||
|
||||
## Smali
|
||||
|
||||
有时为了访问 **隐藏信息**(例如高度混淆的密码或 flags),修改应用代码会很有用。因此,可能需要反编译 apk、修改代码并重新编译。\
|
||||
[**在本教程中** 你可以 **学习如何反编译 APK、修改 Smali 代码并重新编译 APK** 以加入新功能](smali-changes.md)。这在进行动态分析时作为若干测试的**替代方法**非常有用。请始终**记住**这一可能性。
|
||||
有时修改**应用程序代码**以访问**隐藏信息**(例如高度混淆的密码或 flag)是很有意义的。然后,反编译 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). 这在进行动态分析期间作为若干测试的替代方法时可能非常有用。请始终记住这种可能性。
|
||||
|
||||
## Other interesting tricks
|
||||
## 其他有趣的技巧
|
||||
|
||||
- [在 Play Store 中伪装你的位置](spoofing-your-location-in-play-store.md)
|
||||
- [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)
|
||||
- [利用不安全的 In-App 更新机制](insecure-in-app-update-rce.md)
|
||||
- [滥用 Accessibility Services (Android RAT)](accessibility-services-abuse.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:
|
||||
- 从设备提取 APK:
|
||||
```bash
|
||||
adb shell pm list packages
|
||||
com.android.insecurebankv2
|
||||
@ -49,7 +49,7 @@ java -jar ../APKEditor.jar m -i splits/ -o merged.apk
|
||||
# after merging, you will need to align and sign the apk, personally, I like to use the uberapksigner
|
||||
java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
|
||||
```
|
||||
## Case Studies & Vulnerabilities
|
||||
## 案例研究与漏洞
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -61,41 +61,41 @@ 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
|
||||
## 静态分析
|
||||
|
||||
First of all, for analysing an APK you should **take a look to the to the Java code** using a decompiler.\
|
||||
Please, [**read here to find information about different available decompilers**](apk-decompilers.md).
|
||||
首先,要分析一个 APK,你应该使用反编译器**查看 Java 代码**。\
|
||||
请[**在此阅读以了解可用反编译器的相关信息**](apk-decompilers.md)。
|
||||
|
||||
### Looking for interesting Info
|
||||
### 查找有趣的信息
|
||||
|
||||
只需查看 APK 的 **strings** 就可以搜索 **passwords**、**URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep))、**api** keys、**encryption**、**bluetooth uuids**、**tokens** 以及其他有价值的信息……甚至查找代码执行的 **backdoors** 或身份验证 backdoors(应用的硬编码管理员凭据)。
|
||||
仅查看 APK 的 **strings** 就可以搜索 **passwords**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** keys, **encryption**, **bluetooth uuids**, **tokens** 和任何有趣的东西……甚至查找代码执行的 **backdoors** 或身份验证 backdoors(应用的硬编码 admin credentials)。
|
||||
|
||||
**Firebase**
|
||||
|
||||
特别注意 **firebase URLs** 并检查其是否配置不当。[More information about whats is FIrebase and how to exploit it here.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
|
||||
请特别注意 **Firebase URLs** 并检查其是否配置不当。[更多关于什么是 Firebase 以及如何利用它的信息见此处。](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
|
||||
|
||||
### Basic understanding of the application - Manifest.xml, strings.xml
|
||||
### 对应用的基本理解 - Manifest.xml, strings.xml
|
||||
|
||||
**对应用程序的 _Manifest.xml_ 和 **_strings.xml_** 文件的检查可以暴露潜在的安全漏洞**。这些文件可以通过反编译器访问,或将 APK 的文件扩展名重命名为 .zip 然后解压来获取。
|
||||
对应用的 **_Manifest.xml_ 和 **_strings.xml_** 文件的检查可以揭示潜在的安全漏洞**。这些文件可以通过反编译器获取,或将 APK 文件扩展名改为 .zip 然后解压来访问。
|
||||
|
||||
**从 _Manifest.xml_ 识别出的漏洞包括:**
|
||||
从 **Manifest.xml** 中可以识别的 **漏洞** 包括:
|
||||
|
||||
- **Debuggable Applications**: 在 _Manifest.xml_ 文件中将应用设置为 debuggable (`debuggable="true"`) 会带来风险,因为它允许连接从而可能被利用。有关如何发现并利用可调试应用的更多信息,请参考相关教程。
|
||||
- **Backup Settings**: 对于处理敏感信息的应用,应显式设置 `android:allowBackup="false"` 属性,以防止通过 adb 进行未经授权的数据备份,尤其是在启用 usb debugging 时。
|
||||
- **Network Security**: 在 _res/xml/_ 中的自定义网络安全配置(`android:networkSecurityConfig="@xml/network_security_config"`)可以指定证书 pin 和 HTTP 流量设置等安全细节。例如允许针对特定域的 HTTP 流量。
|
||||
- **Exported Activities and Services**: 在 manifest 中识别 exported 的 activities 和 services 可以突出可能被滥用的组件。在动态测试期间的进一步分析可以揭示如何利用这些组件。
|
||||
- **Content Providers and FileProviders**: 暴露的 content providers 可能允许未授权访问或修改数据。FileProviders 的配置也应仔细审查。
|
||||
- **Broadcast Receivers and URL Schemes**: 这些组件可能被用于利用,特别需要注意 URL schemes 如何管理以防止输入相关的漏洞。
|
||||
- **SDK Versions**: `minSdkVersion`、`targetSDKVersion` 和 `maxSdkVersion` 属性指示支持的 Android 版本,强调了不要支持过时且存在已知漏洞的 Android 版本以保证安全。
|
||||
- **Debuggable Applications**:在 _Manifest.xml_ 文件中被设置为 debuggable (`debuggable="true"`) 的应用存在风险,因为它们允许建立连接,可能导致被利用。关于如何在设备上查找和利用 debuggable 应用的更多信息,请参考相关教程。
|
||||
- **Backup Settings**:对于处理敏感信息的应用,应明确设置 `android:allowBackup="false"` 属性,以防止通过 adb 在 usb debugging 启用时进行未授权的数据备份。
|
||||
- **Network Security**:自定义网络安全配置(`android:networkSecurityConfig="@xml/network_security_config"`)位于 _res/xml/_ 中,可指定诸如证书 pinning 和 HTTP 流量设置等安全细节。例如可以为特定域名允许 HTTP 流量。
|
||||
- **Exported Activities and Services**:识别 manifest 中导出的 activities 和 services 可以突出可能被滥用的组件。动态测试阶段可以进一步分析如何利用这些组件。
|
||||
- **Content Providers and FileProviders**:暴露的 content providers 可能允许未授权的访问或修改数据。FileProviders 的配置也应仔细审查。
|
||||
- **Broadcast Receivers and URL Schemes**:这些组件可能被用来进行利用,特别注意 URL schemes 如何处理输入以防止注入或其他输入相关的漏洞。
|
||||
- **SDK Versions**:`minSdkVersion`、`targetSDKVersion` 和 `maxSdkVersion` 属性指示支持的 Android 版本,提示不要支持已过时且存在已知漏洞的 Android 版本以维护安全性。
|
||||
|
||||
从 **strings.xml** 文件中,可以发现敏感信息,如 API keys、自定义 schema 及其他开发者注释,凸显了对这些资源进行仔细审查的必要性。
|
||||
从 **strings.xml** 文件中,可以发现诸如 API keys、自定义 schema 以及其他开发者备注等敏感信息,这强调了对这些资源进行仔细审查的必要性。
|
||||
|
||||
### Tapjacking
|
||||
|
||||
**Tapjacking** 是一种攻击,攻击者启动一个 **malicious application** 并将其定位在受害应用之上。一旦其可见地遮挡住受害应用,其用户界面将被设计为欺骗用户与之交互,同时将交互传递给受害应用。\
|
||||
实际上,这会**使用户无法察觉他们实际上正在对受害应用执行操作**。
|
||||
**Tapjacking** 是一种攻击,攻击者会启动一个 **malicious** **application** 并将其**放置在受害应用之上**。一旦它可见地遮挡了受害应用,其用户界面会被设计成以欺骗用户与其交互,同时将交互传递给受害应用。\
|
||||
实际上,它是**让用户看不见他们实际上在对受害应用执行操作**。
|
||||
|
||||
Find more information in:
|
||||
更多信息请见:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -104,82 +104,82 @@ tapjacking.md
|
||||
|
||||
### Task Hijacking
|
||||
|
||||
如果一个 activity 的 **`launchMode`** 被设置为 **`singleTask`** 且没有定义任何 **`taskAffinity`**,则该 activity 易受 Task Hijacking。 这意味着,如果在真实应用之前安装并启动一个应用,它可能会**劫持真实应用的 task**(因此用户会以为自己在使用真实应用,实际上在与恶意应用交互)。
|
||||
如果一个 **activity** 的 **`launchMode`** 设置为 **`singleTask` 且未定义任何 `taskAffinity`**,则容易受到 Task Hijacking 的影响。这意味着,可以安装一个 **application**,并且如果在真实应用之前启动它,它可能**劫持真实应用的任务**(使用户在与**malicious application** 交互时误以为是在使用真实应用)。
|
||||
|
||||
More info in:
|
||||
更多信息见:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
android-task-hijacking.md
|
||||
{{#endref}}
|
||||
|
||||
### Insecure data storage
|
||||
### 不安全的数据存储
|
||||
|
||||
**Internal Storage**
|
||||
|
||||
在 Android 中,存储在 **internal** 存储的文件被设计为仅可被创建它们的 **app** 访问。这一安全措施由 Android 操作系统强制执行,通常足以满足大多数应用的安全需求。然而,开发者有时会使用诸如 `MODE_WORLD_READABLE` 和 `MODE_WORLD_WRITABLE` 的模式以**允许**文件在不同应用之间共享。但这些模式**不会限制**其他应用(包括潜在的恶意应用)对这些文件的访问。
|
||||
在 Android 中,存储在 **internal** 存储中的文件**设计上只能由创建它们的应用访问**。该安全措施由 Android 操作系统强制执行,通常能满足大多数应用的安全需求。然而,开发者有时会使用诸如 `MODE_WORLD_READABLE` 和 `MODE_WORLD_WRITABLE` 的模式来**允许**文件在不同应用之间**共享**。但这些模式**不会限制其他应用对这些文件的访问**,包括可能的恶意应用。
|
||||
|
||||
1. **Static Analysis:**
|
||||
- **Ensure** that the use of `MODE_WORLD_READABLE` and `MODE_WORLD_WRITABLE` is **carefully scrutinized**。这些模式**可能会暴露**文件给意外或未授权的访问。
|
||||
2. **Dynamic Analysis:**
|
||||
- **Verify** the **permissions** set on files created by the app。特别是,**检查**是否有任何文件被设置为全局可读或可写。这可能构成重大安全风险,因为它将允许设备上安装的**任何应用**(无论来源或意图)读取或修改这些文件。
|
||||
1. 静态分析:
|
||||
- **确保** 对 `MODE_WORLD_READABLE` 和 `MODE_WORLD_WRITABLE` 的使用进行**严格审查**。这些模式**可能会将文件暴露给非预期或未授权的访问**。
|
||||
2. 动态分析:
|
||||
- **验证** 应用创建的文件权限。特别是,**检查** 是否有任何文件被设置为全局可读或可写。这可能构成重大安全风险,因为它将允许**任何已安装的应用**(无论来源或意图)**读取或修改**这些文件。
|
||||
|
||||
**External Storage**
|
||||
|
||||
在处理位于外部存储(如 SD 卡)上的文件时,应采取如下预防措施:
|
||||
处理位于 **external storage**(如 SD 卡)上的文件时,应采取以下注意事项:
|
||||
|
||||
1. **Accessibility**:
|
||||
- 外部存储上的文件是**全局可读可写**的。这意味着任何应用或用户都可以访问这些文件。
|
||||
2. **Security Concerns**:
|
||||
- 鉴于易访问性,建议**不要在外部存储上保存敏感信息**。
|
||||
- 外部存储可以被移除或被任何应用访问,因此安全性较低。
|
||||
3. **Handling Data from External Storage**:
|
||||
- 始终对从外部存储检索的数据执行**输入验证**,这很重要,因为这些数据来自不受信任的来源。
|
||||
- 强烈不建议将可执行文件或 class 文件存放在外部存储上以便动态加载。
|
||||
- 如果你的应用必须从外部存储检索可执行文件,确保在动态加载之前对这些文件进行签名和加密学验证。这一步对于维护应用的安全完整性至关重要。
|
||||
1. 可访问性:
|
||||
- external storage 上的文件是**全局可读写**的。这意味着任何应用或用户都可以访问这些文件。
|
||||
2. 安全顾虑:
|
||||
- 鉴于访问容易,建议**不要在 external storage 上存储敏感信息**。
|
||||
- external storage 可以被移除或被任何应用访问,因此安全性较低。
|
||||
3. 处理来自 external storage 的数据:
|
||||
- 始终对从 external storage 检索的数据进行**输入验证**。这很重要,因为这些数据来自不受信任的来源。
|
||||
- 强烈不建议将可执行文件或 class 文件存放在 external storage 以供动态加载。
|
||||
- 如果你的应用必须从 external storage 检索可执行文件,请确保在动态加载之前对这些文件进行**签名和密码学验证**。此步骤对于维护应用的安全完整性至关重要。
|
||||
|
||||
External storage can be **accessed** in `/storage/emulated/0` , `/sdcard` , `/mnt/sdcard`
|
||||
External storage 可以在 /storage/emulated/0, /sdcard, /mnt/sdcard 访问
|
||||
|
||||
> [!TIP]
|
||||
> Starting with Android 4.4 (**API 17**), the SD card has a directory structure which **limits access from an app to the directory which is specifically for that app**. This prevents malicious application from gaining read or write access to another app's files.
|
||||
> 从 Android 4.4(**API 17**)开始,SD 卡具有一种目录结构,**将应用的访问限制在专门为该应用设置的目录内**。这可以防止恶意应用获得对其他应用文件的读写权限。
|
||||
|
||||
**Sensitive data stored in clear-text**
|
||||
**以明文存储的敏感数据**
|
||||
|
||||
- **Shared preferences**: Android 允许每个应用很容易地在路径 `/data/data/<packagename>/shared_prefs/` 中保存 xml 文件,有时可以在该文件夹中发现以明文存储的敏感信息。
|
||||
- **Databases**: Android 允许每个应用很容易地在路径 `/data/data/<packagename>/databases/` 中保存 sqlite 数据库,有时可以在该文件夹中发现以明文存储的敏感信息。
|
||||
- **Shared preferences**:Android 允许每个应用方便地在路径 `/data/data/<packagename>/shared_prefs/` 保存 xml 文件,有时可以在该文件夹中以明文找到敏感信息。
|
||||
- **Databases**:Android 允许每个应用方便地在路径 `/data/data/<packagename>/databases/` 保存 sqlite 数据库,有时可以在该文件夹中以明文找到敏感信息。
|
||||
|
||||
### Broken TLS
|
||||
|
||||
**Accept All Certificates**
|
||||
|
||||
出于某些原因,开发者有时会接受所有证书,即使例如 hostname 不匹配,也会使用类似以下的代码行:
|
||||
出于某些原因,开发者有时会接受所有证书,即使例如 hostname 不匹配,也会有如下类似的代码行:
|
||||
```java
|
||||
SSLSocketFactory sf = new cc(trustStore);
|
||||
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
|
||||
```
|
||||
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.
|
||||
|
||||
### 不安全的加密
|
||||
### Broken Cryptography
|
||||
|
||||
**Poor Key Management Processes**
|
||||
|
||||
有些开发者会将敏感数据保存在本地存储,并用硬编码/可预测的密钥在代码中进行加密。这样做不应该被允许,因为一些逆向工程可能让攻击者提取机密信息。
|
||||
一些开发者会将敏感数据保存在本地存储并用硬编码/可预测的密钥进行加密。这样做不可取,因为通过一些 reversing 工作,攻击者可能提取出机密信息。
|
||||
|
||||
**Use of Insecure and/or Deprecated Algorithms**
|
||||
|
||||
开发者不应使用**deprecated algorithms**来执行授权**checks**、**存储**或**发送**数据。这些算法包括:RC4、MD4、MD5、SHA1... 例如如果使用**hashes**来存储密码,应该使用抗**brute-force**的hash算法并加salt。
|
||||
开发者不应使用 **已弃用的算法** 来执行授权 **checks**、**存储** 或 **发送** 数据。部分此类算法包括:RC4、MD4、MD5、SHA1……例如,如果使用 **hashes** 来存储密码,应使用对 brute-force **resistant** 的哈希并配合 salt。
|
||||
|
||||
### 其他检查
|
||||
### Other checks
|
||||
|
||||
- 建议对 **APK** 进行**obfuscate**,以增加逆向工程难度。
|
||||
- 如果应用是敏感类(例如银行应用),它应该自行**检测设备是否已 root**并据此采取措施。
|
||||
- 如果应用是敏感类(例如银行应用),它应该检测是否在**emulator**上运行。
|
||||
- 如果应用是敏感类(例如银行应用),它应该**在执行前自检完整性**以确认是否被修改。
|
||||
- 使用 [**APKiD**](https://github.com/rednaga/APKiD) 检查用于构建 APK 的编译器/packer/obfuscator。
|
||||
- 建议对 **APK 进行混淆(obfuscate the APK)**,以增加逆向工程的难度。
|
||||
- 如果应用比较敏感(例如银行类应用),应该自行检查手机是否 **rooted** 并据此采取措施。
|
||||
- 如果应用比较敏感(例如银行类应用),应检查是否在 **emulator** 中运行。
|
||||
- 如果应用比较敏感(例如银行类应用),应在执行前 **检查自身完整性** 以确认是否被篡改。
|
||||
- 使用 [**APKiD**](https://github.com/rednaga/APKiD) 检查构建 APK 时使用了哪个 compiler/packer/obfuscator
|
||||
|
||||
### React Native Application
|
||||
|
||||
Read the following page to learn how to easily access javascript code of React applications:
|
||||
阅读以下页面,了解如何轻松访问 React 应用的 javascript 代码:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -188,7 +188,7 @@ react-native-application.md
|
||||
|
||||
### Xamarin Applications
|
||||
|
||||
Read the following page to learn how to easily access C# code of a xamarin applications:
|
||||
阅读以下页面,了解如何轻松访问 xamarin 应用的 C# 代码:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -197,17 +197,17 @@ Read the following page to learn how to easily access C# code of a xamarin appli
|
||||
|
||||
### Superpacked Applications
|
||||
|
||||
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.**
|
||||
根据这篇 [**blog post**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/),superpacked 是 Meta 的一种算法,它将应用的内容压缩到单个文件中。博文讨论了创建一个解压这类应用的应用的可能性……以及一种更快的方法,涉及 **执行应用并从文件系统收集解压后的文件。**
|
||||
|
||||
### Automated Static Code Analysis
|
||||
|
||||
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**](https://github.com/facebook/mariana-trench) 能通过 **扫描** 应用 **代码** 来发现 **vulnerabilities**。该工具包含一系列 **known sources**(指示工具哪些 **位置** 的 **输入** 由用户控制)、**sinks**(指示工具哪些 **危险** 的 **位置** 可能被恶意用户输入利用)和 **rules**。这些规则定义了指示存在漏洞的 **sources-sinks** 组合。
|
||||
|
||||
With this knowledge, **mariana-trench will review the code and find possible vulnerabilities on it**.
|
||||
基于这些信息,**mariana-trench 会审查代码并发现其中的潜在漏洞**。
|
||||
|
||||
### Secrets leaked
|
||||
|
||||
应用可能包含秘密(API keys、密码、隐藏的 urls、子域名等),你可能能够在应用中发现它们。你可以使用诸如 [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks) 的工具。
|
||||
应用中可能包含 secrets(API keys、密码、隐藏的 urls、子域名……)等,你可能能够发现这些信息。你可以使用诸如 [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks) 之类的工具。
|
||||
|
||||
### Bypass Biometric Authentication
|
||||
|
||||
@ -236,219 +236,227 @@ content-protocol.md
|
||||
|
||||
## Dynamic Analysis
|
||||
|
||||
> First of all, you need an environment where you can install the application and all the environment (Burp CA cert, Drozer and Frida mainly). Therefore, a rooted device (emulated or not) is extremely recommended.
|
||||
> 首先,你需要一个可以安装应用及其环境(主要是 Burp CA cert、Drozer 和 Frida)的环境。因此,强烈推荐使用已 root 的设备(模拟或真实设备均可)。
|
||||
|
||||
### Online Dynamic analysis
|
||||
|
||||
你可以在以下网站创建一个**免费账号**: [https://appetize.io/](https://appetize.io/)。该平台允许你**上传**并**执行**APK,便于查看 apk 的运行行为。
|
||||
你可以在此创建一个 **免费账号**: [https://appetize.io/](https://appetize.io)。该平台允许你 **上传** 并 **执行** APK,非常适合观察 APK 的运行行为。
|
||||
|
||||
你甚至可以在网页上**查看应用的日志**并通过 **adb** 连接。
|
||||
你甚至可以在网页中 **查看应用的日志** 并通过 **adb** 连接。
|
||||
|
||||
.png>)
|
||||
|
||||
借助 ADB 连接,你可以在模拟器中使用 **Drozer** 和 **Frida**。
|
||||
借助 ADB 连接,你可以在模拟器内使用 **Drozer** 和 **Frida**。
|
||||
|
||||
### Local Dynamic Analysis
|
||||
|
||||
#### Using an emulator
|
||||
|
||||
- [**Android Studio**](https://developer.android.com/studio)(你可以创建 **x86** 和 **arm** 设备,根据[**this**](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** 设备,根据 [**this**](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/) **(免费版本:Personal Edition,需要创建账户。建议下载带有**VirtualBox**的版本以避免潜在错误。)**
|
||||
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(免费版本:Personal Edition,需要创建账号。建议下载带有** _**VirtualBox**_** 的版本以避免潜在错误。)**
|
||||
- [**Nox**](https://es.bignox.com)(免费,但不支持 Frida 或 Drozer)。
|
||||
|
||||
> [!TIP]
|
||||
> 在任何平台上创建新的 emulator 时请记住,屏幕越大,模拟器运行越慢。因此尽量选择较小屏幕。
|
||||
> 在任何平台创建新的模拟器时请记住,屏幕越大,模拟器运行越慢。因此如无必要请选择小屏幕。
|
||||
|
||||
要在 Genymotion 中**安装 google services(如 Play Store)**,需要点击下图中标红的按钮:
|
||||
要在 Genymotion 中 **安装 google services(例如 Play Store)**,需要点击下图中标红的按钮:
|
||||
|
||||
.png>)
|
||||
|
||||
另外,请注意在 **Genymotion 的 Android VM 配置** 中可以选择 **Bridge Network mode**(如果你会从不同的 VM 连接到该 Android VM 并使用工具,这将很有用)。
|
||||
另外,请注意在 **Genymotion 的 Android VM 配置中** 可以选择 **Bridge Network mode**(如果你会从另一个 VM 连接到该 Android VM 并使用工具,这会很有用)。
|
||||
|
||||
#### Use a physical device
|
||||
|
||||
你需要激活 **debugging** 选项,如果能 **root** 设备会更好:
|
||||
你需要激活 **调试(debugging)** 选项,若能 **root** 设备会更好:
|
||||
|
||||
1. **Settings**。
|
||||
2. (从 Android 8.0 起)选择 **System**。
|
||||
3. 选择 **About phone**。
|
||||
4. 连续按 **Build number** 7 次。
|
||||
5. 返回,你会看到 **Developer options**。
|
||||
|
||||
> 一旦你安装了应用,首先应该运行并探索它,了解它的功能与工作方式并熟悉它。\
|
||||
> 我建议使用 MobSF dynamic analysis + pidcat 来执行这一步初始的动态分析,这样我们在学习应用如何工作时,MobSF 会捕获大量你可以随后审查的有价值数据。
|
||||
|
||||
Magisk/Zygisk quick notes (recommended on Pixel devices)
|
||||
- Patch boot.img with the Magisk app and flash via fastboot to get systemless root
|
||||
- Enable Zygisk + DenyList for root hiding; consider LSPosed/Shamiko when stronger hiding is required
|
||||
- Keep original boot.img to recover from OTA updates; re-patch after each OTA
|
||||
- For screen mirroring, use scrcpy on the host
|
||||
|
||||
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 dynamic analysis + pidcat 来执行这一步初始的动态分析,这样我们可以在 MobSF **捕获**大量以后可以查看的**有趣**数据的同时**学习应用的工作原理**。
|
||||
|
||||
### Unintended Data Leakage
|
||||
|
||||
**Logging**
|
||||
|
||||
开发者应谨慎避免公开暴露**调试信息**,因为这可能导致敏感数据泄露。建议使用工具 [**pidcat**](https://github.com/JakeWharton/pidcat) 和 `adb logcat` 来监控应用日志,以识别并保护敏感信息。**Pidcat** 因其易用性和可读性而受推荐。
|
||||
开发者应谨慎避免公开暴露 **debugging 信息**,因为这可能导致敏感数据 leak。推荐使用工具 [**pidcat**](https://github.com/JakeWharton/pidcat) 和 `adb logcat` 监控应用日志,以识别并保护敏感信息。**Pidcat** 因其易用性和可读性而更受欢迎。
|
||||
|
||||
> [!WARNING]
|
||||
> 注意,从 **Android 4.0 之后的较新版本** 起,**应用只能访问自己的日志**。因此应用无法访问其他应用的日志。\
|
||||
> 不管怎样,仍建议**不要记录敏感信息**。
|
||||
> 请注意,从 **Android 4.0 之后的版本** 起,**应用只能访问自身的日志**。因此应用无法访问其他应用的日志。\
|
||||
> 无论如何,仍然建议 **不要记录敏感信息**。
|
||||
|
||||
**Copy/Paste Buffer Caching**
|
||||
|
||||
Android 的**基于剪贴板**的框架支持复制粘贴功能,但存在风险:**其他应用**可以**访问**剪贴板,可能导致敏感数据泄露。对于敏感区域(如信用卡信息)务必**禁用复制/粘贴**功能以防止数据泄露。
|
||||
Android 的 **剪贴板(clipboard)框架** 支持应用间的复制粘贴功能,但存在风险:**其他应用** 可以访问剪贴板,可能泄露敏感数据。对应用中敏感部分(如信用卡信息)应禁用复制/粘贴功能以防止数据泄露。
|
||||
|
||||
**Crash Logs**
|
||||
|
||||
如果应用**崩溃**并**保存日志**,这些日志可能帮助攻击者,尤其是在应用无法被逆向时。为减轻风险,避免在崩溃时记录敏感信息;若必须将日志通过网络发送,确保通过 SSL 通道传输以保障安全。
|
||||
如果应用 **崩溃** 并保存了日志,这些日志会帮助攻击者,尤其是在应用无法被逆向时。为降低风险,应避免在崩溃时记录敏感信息;如果必须通过网络发送日志,确保通过 SSL 通道传输。
|
||||
|
||||
作为 pentester,**尝试查看这些日志**。
|
||||
|
||||
**Analytics Data Sent To 3rd Parties**
|
||||
|
||||
应用常集成第三方服务(如 Google Adsense),若实现不当可能会无意中**泄露敏感数据**。要识别潜在的数据泄露,建议**拦截应用流量**并检查是否将敏感信息发送给第三方服务。
|
||||
应用通常集成诸如 Google Adsense 之类的服务,开发者的不当实现可能无意中导致敏感数据 leak。建议通过拦截应用流量检查是否有敏感信息发送到第三方服务。
|
||||
|
||||
### SQLite DBs
|
||||
|
||||
大多数应用会使用**internal SQLite databases**来保存信息。在渗透测试时,查看创建的**数据库**、**表名**和**列名**以及保存的所有**数据**非常重要,因为你可能会发现**敏感信息**(这将是一种漏洞)。\
|
||||
大多数应用会使用 **内部 SQLite 数据库** 存储信息。在渗透测试期间,查看创建的 **数据库**、**表名** 与 **列名** 以及存储的所有 **数据** 十分重要,因为你可能会发现 **敏感信息**(这将构成漏洞)。\
|
||||
数据库通常位于 `/data/data/the.package.name/databases`,例如 `/data/data/com.mwr.example.sieve/databases`
|
||||
|
||||
如果数据库保存了机密信息并且**加密了**,但你可以在应用中**找到**该数据库的**密码**,那仍然是一个**漏洞**。
|
||||
如果数据库保存机密信息并且**加密了**,但你能在应用中**找到解密密码**,这仍然是一个 **漏洞**。
|
||||
|
||||
使用 `.tables` 枚举表,并使用 `.schema <table_name>` 枚举表的列。
|
||||
使用 `.tables` 枚举表,使用 `.schema <table_name>` 枚举表的列。
|
||||
|
||||
### Drozer (Exploit Activities, Content Providers and Services)
|
||||
|
||||
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.
|
||||
来自 [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf):**Drozer** 允许你 **以 Android 应用的身份行事** 并与其他应用交互。它可以执行 **已安装应用能做的任何事**,例如利用 Android 的进程间通信(IPC)机制并与底层操作系统交互。\
|
||||
Drozer 是一个有用的工具,可用于 **利用 exported activities、exported services 和 Content Providers**,你将在下面的章节中学习到这些内容。
|
||||
|
||||
### Exploiting exported Activities
|
||||
|
||||
[**Read this if you want to refresh what is an Android Activity.**](android-applications-basics.md#launcher-activity-and-other-activities)\
|
||||
Also remember that the code of an activity starts in the **`onCreate`** method.
|
||||
还要记住,activity 的代码在 **`onCreate`** 方法中开始执行。
|
||||
|
||||
**Authorisation bypass**
|
||||
|
||||
When an Activity is exported you can invoke its screen from an external app. Therefore, if an activity with **sensitive information** is **exported** you could **bypass** the **authentication** mechanisms **to access it.**
|
||||
当一个 Activity 被 exported 时,你可以从外部应用调用其界面。因此,如果一个包含 **敏感信息** 的 activity 被 **exported**,你可能会 **bypass** 认证机制并访问该界面。
|
||||
|
||||
[**Learn how to exploit exported activities with Drozer.**](drozer-tutorial/index.html#activities)
|
||||
|
||||
You can also start an exported activity from adb:
|
||||
你也可以通过 adb 启动一个 exported activity:
|
||||
|
||||
- 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 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).
|
||||
**注意**: MobSF 会检测将 _**singleTask/singleInstance**_ 作为活动的 `android:launchMode` 使用为恶意,但根据 [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750),显然这仅在较旧版本(API 版本 < 21)上危险。
|
||||
|
||||
> [!TIP]
|
||||
> 注意,authorisation bypass 并不总是一个漏洞,这取决于绕过的实现方式以及暴露了哪些信息。
|
||||
> 注意,an authorisation bypass 并不总是一个漏洞,是否构成漏洞取决于 bypass 的工作方式以及暴露了哪些信息。
|
||||
|
||||
**Sensitive information leakage**
|
||||
**敏感信息泄露**
|
||||
|
||||
**Activities can also return results**。如果你设法找到一个被导出且未受保护的 activity,调用 **`setResult`** 方法并 **返回敏感信息**,则会发生 sensitive information leakage。
|
||||
**Activities 也可以返回结果**。如果你能找到一个 exported 且未受保护的 activity 调用 **`setResult`** 方法并 **返回敏感信息**,则存在敏感信息泄露。
|
||||
|
||||
#### Tapjacking
|
||||
|
||||
If Tapjacking isn't prevented, you could abuse the exported activity to make the **user perform unexpected actions**。For more info about [**what is Tapjacking follow the link**](#tapjacking)。
|
||||
如果未防护 tapjacking,你可以滥用已导出的 activity 让 **用户执行意外操作**。更多关于 [**what is Tapjacking follow the link**](#tapjacking)。
|
||||
|
||||
### Exploiting Content Providers - 访问和操作敏感信息
|
||||
### Exploiting Content Providers - Accessing and manipulating sensitive information
|
||||
|
||||
[**如果你想回顾什么是 Content Provider,请阅读此处。**](android-applications-basics.md#content-provider)\
|
||||
Content providers 基本上用于 **share data**。如果一个 app 有可用的 content providers,你可能能够从中 **extract sensitive** 数据。也有必要测试可能的 **SQL injections** 和 **Path Traversals**,因为它们可能存在漏洞。
|
||||
[**Read this if you want to refresh what is a Content Provider.**](android-applications-basics.md#content-provider)\
|
||||
Content providers 基本上用于 **共享数据**。如果一个应用有可用的 content providers,你可能能够从中 **提取敏感** 数据。也有必要测试可能的 **SQL injections** 和 **Path Traversals**,因为它们可能存在漏洞。
|
||||
|
||||
[**Learn how to exploit Content Providers with Drozer.**](drozer-tutorial/index.html#content-providers)
|
||||
|
||||
### **Exploiting Services**
|
||||
|
||||
[**如果你想回顾什么是 Service,请阅读此处。**](android-applications-basics.md#services)\
|
||||
记住,Service 的动作从方法 `onStartCommand` 开始。
|
||||
[**Read this if you want to refresh what is a Service.**](android-applications-basics.md#services)\
|
||||
请记住,Service 的动作在方法 `onStartCommand` 中开始。
|
||||
|
||||
As service 基本上是可以 **接收数据**、**处理** 并(或不)**返回** 响应的东西。因此,如果一个应用导出了某些 services,你应该 **检查** 其 **code** 以了解其行为,并 **动态** 测试以提取机密信息、绕过认证措施等。\
|
||||
Service 基本上是能够 **接收数据**、**处理** 并 **(可能)返回** 响应的组件。因此,如果一个应用导出了某些 services,你应该 **检查** 其 **代码** 以了解其行为,并进行 **动态测试** 以提取机密信息、绕过认证措施等...\
|
||||
[**Learn how to exploit Services with Drozer.**](drozer-tutorial/index.html#services)
|
||||
|
||||
### **Exploiting Broadcast Receivers**
|
||||
|
||||
[**如果你想回顾什么是 Broadcast Receiver,请阅读此处。**](android-applications-basics.md#broadcast-receivers)\
|
||||
记住,Broadcast Receiver 的动作从方法 `onReceive` 开始。
|
||||
[**Read this if you want to refresh what is a Broadcast Receiver.**](android-applications-basics.md#broadcast-receivers)\
|
||||
请记住,Broadcast Receiver 的动作在方法 `onReceive` 中开始。
|
||||
|
||||
A broadcast receiver 会等待某种类型的消息。取决于 receiver 如何处理该消息,它可能存在漏洞。\
|
||||
Broadcast receiver 会等待某类消息。根据接收器处理消息的方式,它可能存在漏洞。\
|
||||
[**Learn how to exploit Broadcast Receivers with Drozer.**](#exploiting-broadcast-receivers)
|
||||
|
||||
### **Exploiting Schemes / Deep links**
|
||||
|
||||
You can look for deep links manually, using tools like MobSF or scripts like [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py).\
|
||||
You can **open** a declared **scheme** using **adb** or a **browser**:
|
||||
你可以手动查找 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
|
||||
<!-- Browser regular link -->
|
||||
<a href="scheme://hostname/path?param=value">Click me</a>
|
||||
<!-- fallback in your url you could try the intent url -->
|
||||
<a href="intent://hostname#Intent;scheme=scheme;package=your.package.name;S.browser_fallback_url=http%3A%2F%2Fwww.example.com;end">with alternative</a>
|
||||
```
|
||||
**执行的代码**
|
||||
**代码执行**
|
||||
|
||||
为了找到应用中**将被执行的代码**,转到由 deep link 调用的 activity 并搜索函数 **`onNewIntent`**。
|
||||
为了找到 **将在 App 中执行的代码**,前往由 deeplink 调用的 activity 并搜索函数 **`onNewIntent`**。
|
||||
|
||||
 (1) (1) (1).png>)
|
||||
|
||||
**敏感信息**
|
||||
|
||||
每次发现 deep link 时,请检查 **它没有通过 URL 参数接收敏感数据(比如密码)**,因为任何其他应用都可能 **冒充该 deep link 并窃取这些数据!**
|
||||
每次发现 deep link 时,请检查 **它是否未通过 URL 参数接收敏感数据(例如密码)**,因为任何其他应用都可能 **冒充该 deep link 并窃取这些数据!**
|
||||
|
||||
**路径中的参数**
|
||||
|
||||
你**必须检查 deep link 是否在 URL 的路径中使用参数**,例如:`https://api.example.com/v1/users/{username}`,在这种情况下,你可以通过访问类似 `example://app/users?username=../../unwanted-endpoint%3fparam=value` 来强制进行路径遍历。\
|
||||
注意,如果你在应用中找到了正确的端点,你可能能够导致 **Open Redirect**(如果路径的一部分被用作域名)、**account takeover**(如果你能在没有 CSRF token 的情况下修改用户详情并且 vuln 端点使用了正确的方法)以及其他任何 vuln。更多 [info about this here](http://dphoeniixx.com/2020/12/13-2/)。
|
||||
你 **还必须检查是否有任何 deep link 在 URL 路径中使用参数**,例如:`https://api.example.com/v1/users/{username}`,在这种情况下,你可以通过访问类似 `example://app/users?username=../../unwanted-endpoint%3fparam=value` 的路径来强制进行路径遍历。\
|
||||
请注意,如果你在应用内找到了正确的 endpoints,你可能能够导致 **Open Redirect**(如果路径的一部分被用作域名)、**account takeover**(如果你能在没有 CSRF token 的情况下修改用户详情且 vuln endpoint 使用了正确的方法)以及其他任何漏洞。更多 [info about this here](http://dphoeniixx.com/2020/12/13-2/)。
|
||||
|
||||
**More examples**
|
||||
|
||||
一个关于链接(_/.well-known/assetlinks.json_)的 [interesting bug bounty report](https://hackerone.com/reports/855618)。
|
||||
一个关于 links(_/.well-known/assetlinks.json_)的 [interesting bug bounty report](https://hackerone.com/reports/855618)。
|
||||
|
||||
### 传输层检查与验证失败
|
||||
### 传输层检查和验证失败
|
||||
|
||||
- **证书并不总是被正确检查**,在 Android 应用中很常见。这些应用常常忽略警告并接受自签名证书,或者在某些情况下退回使用 HTTP 连接。
|
||||
- **SSL/TLS 握手期间的协商有时较弱**,使用不安全的密码套件。此漏洞使连接容易受到中间人(MITM)攻击,允许攻击者解密数据。
|
||||
- **Leakage of private information** 是一个风险,当应用使用安全通道进行认证,但随后在其他事务中通过非安全通道通信时会出现这种情况。这种做法无法保护敏感数据,例如会话 cookie 或用户详情,免遭恶意实体拦截。
|
||||
- **Certificates are not always inspected properly** by Android applications。此类应用常常忽略警告并接受自签名证书,或在某些情况下回退到使用 HTTP 连接。
|
||||
- **Negotiations during the SSL/TLS handshake are sometimes weak**,使用不安全的 cipher suites。这一弱点使连接容易受到 man-in-the-middle (MITM) 攻击,允许攻击者解密数据。
|
||||
- **Leakage of private information** 是一种风险:当应用使用安全通道进行认证,但随后在其他事务中通过非安全通道通信时,这种做法无法保护会话 cookie 或用户详情等敏感数据,容易被恶意方拦截。
|
||||
|
||||
#### 证书验证
|
||||
#### Certificate Verification
|
||||
|
||||
我们将重点关注**certificate verification**。必须验证服务器证书的完整性以增强安全性。这一点至关重要,因为不安全的 TLS 配置以及在未加密通道上传输敏感数据可能带来重大风险。关于验证服务器证书和修复漏洞的详细步骤,请参阅 [**this resource**](https://manifestsecurity.com/android-application-security-part-10/)。
|
||||
我们将重点关注 **certificate verification**。必须验证服务器证书的完整性以增强安全性。これは关键,因为不安全的 TLS 配置以及通过未加密通道传输敏感数据会带来重大风险。有关验证服务器证书和修复漏洞的详细步骤,[**this resource**](https://manifestsecurity.com/android-application-security-part-10/) 提供了全面的指导。
|
||||
|
||||
#### SSL Pinning
|
||||
|
||||
SSL Pinning 是一种安全措施,应用将服务器证书与存储在应用内的已知副本进行校验。此方法对于防止 MITM 攻击至关重要。强烈建议在处理敏感信息的应用中实现 SSL Pinning。
|
||||
SSL Pinning 是一种安全措施,应用将服务器的证书与存储在应用内的已知副本进行核验。该方法对于防止 MITM 攻击至关重要。强烈建议对处理敏感信息的应用实施 SSL Pinning。
|
||||
|
||||
#### Traffic Inspection
|
||||
|
||||
要检查 HTTP 流量,必须**安装代理工具的证书**(例如 Burp)。如果不安装该证书,加密流量可能无法通过代理可见。关于安装自定义 CA 证书的指南,请 [**click here**](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 and above** 的应用需要修改 Network Security Config 以接受代理的 CA 证书。此步骤对检查加密流量至关重要。有关修改 Network Security Config 的说明,请参阅 [**refer to this tutorial**](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**,你需要遵循 [**this page**](flutter.md) 中的说明。这是因为仅将证书添加到存储中并不能奏效,Flutter 有自己的有效 CA 列表。
|
||||
如果使用 **Flutter**,需要遵循 [**this page**](flutter.md) 中的说明。因为仅将证书添加到系统存储并不能奏效,Flutter 有自己的有效 CA 列表。
|
||||
|
||||
#### 静态检测 SSL/TLS pinning
|
||||
|
||||
在尝试运行时绕过之前,先快速映射 APK 中强制 pinning 的位置。静态发现有助于你规划 hooks/patches 并关注正确的代码路径。
|
||||
在尝试运行时绕过之前,先快速映射 APK 中强制 pinning 的位置。静态发现可以帮助你规划 hooks/patches 并集中在正确的代码路径上。
|
||||
|
||||
Tool: SSLPinDetect
|
||||
- 开源静态分析工具,会将 APK 反编译为 Smali(通过 apktool)并扫描针对 SSL/TLS pinning 实现的精心挑选的正则模式。
|
||||
- 为每个匹配报告精确的文件路径、行号和代码片段。
|
||||
- 覆盖常见框架和自定义代码路径:OkHttp CertificatePinner、custom javax.net.ssl.X509TrustManager.checkServerTrusted、SSLContext.init(带 custom TrustManagers/KeyManagers)和 Network Security Config XML pins。
|
||||
- 开源静态分析工具,将 APK 反编译为 Smali(通过 apktool),并扫描针对 SSL/TLS pinning 实现的精选正则模式。
|
||||
- 报告每个匹配项的精确文件路径、行号和代码片段。
|
||||
- 覆盖常见框架和自定义代码路径:OkHttp CertificatePinner、自定义 javax.net.ssl.X509TrustManager.checkServerTrusted、使用自定义 TrustManagers/KeyManagers 的 SSLContext.init,以及 Network Security Config XML 中的 pins。
|
||||
|
||||
安装
|
||||
- 先决条件: Python >= 3.8, Java on PATH, apktool
|
||||
- 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
|
||||
@ -457,8 +465,7 @@ python sslpindetect.py -f app.apk -a apktool.jar
|
||||
python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v
|
||||
```
|
||||
示例模式规则 (JSON)
|
||||
|
||||
使用或扩展 signatures 来检测专有/自定义 pinning 样式。你可以加载自己的 JSON 并进行大规模 scan。
|
||||
使用或扩展签名以检测专有/自定义 pinning 样式。你可以加载自己的 JSON 并进行大规模扫描。
|
||||
```json
|
||||
{
|
||||
"OkHttp Certificate Pinning": [
|
||||
@ -472,37 +479,37 @@ python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v
|
||||
]
|
||||
}
|
||||
```
|
||||
笔记与提示
|
||||
- 通过多线程和 memory-mapped I/O 对大型应用进行快速扫描;预编译的 regex 可减少开销/误报。
|
||||
说明与提示
|
||||
- 在大型应用上使用多线程和 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
|
||||
- 声明式 pins 在 res/xml network security config 和 manifest 引用中
|
||||
- 使用匹配到的位置来规划 Frida hooks、静态 patch 或配置审查,然后再做动态测试。
|
||||
- Declarative pins in res/xml network security config and manifest references
|
||||
- 使用匹配到的位置来规划 Frida hooks、静态补丁或配置审查,然后再进行动态测试。
|
||||
|
||||
|
||||
|
||||
#### 绕过 SSL Pinning
|
||||
#### Bypassing SSL Pinning
|
||||
|
||||
当实现了 SSL Pinning 时,绕过它对检查 HTTPS 流量变得必要。有多种方法可以做到这一点:
|
||||
当实现了 SSL Pinning 时,绕过它以检查 HTTPS 流量就变得必要。为此有多种可用方法:
|
||||
|
||||
- 自动地 **modify** the **apk** 来 **bypass** SSLPinning,可以使用 [**apk-mitm**](https://github.com/shroudedcode/apk-mitm)。此选项最大的优点是你不需要 root 即可绕过 SSL Pinning,但你需要删除应用并重装新的,而且并不总是有效。
|
||||
- 你可以使用 **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 Pinning:`objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
|
||||
- 你也可以尝试使用 **MobSF dynamic analysis** 自动绕过 SSL Pinning(下文会解释)
|
||||
- 如果你仍然认为有些流量没有被捕获,可以尝试使用 iptables 将流量转发到 Burp。阅读这篇博客: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
|
||||
- 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 漏洞
|
||||
#### Looking for Common Web Vulnerabilities
|
||||
|
||||
同样重要的是在应用内搜索常见的 Web 漏洞。识别和缓解这些漏洞的详细信息超出本摘要范围,但在其他地方有详尽的覆盖。
|
||||
还应在应用内搜索常见的 web 漏洞。关于识别和缓解这些漏洞的详细信息超出了本摘要的范围,但在其他资料中有详尽覆盖。
|
||||
|
||||
### Frida
|
||||
|
||||
[Frida](https://www.frida.re) 是一个面向开发者、逆向工程师和安全研究人员的动态插桩工具包。\
|
||||
**你可以访问正在运行的应用并在运行时 hook 方法以改变行为、修改值、提取值或执行不同的代码……**\
|
||||
如果你要对 Android 应用做 pentest,你需要会使用 Frida。
|
||||
[Frida](https://www.frida.re) is a dynamic instrumentation toolkit for developers, reverse-engineers, and security researchers.\
|
||||
**You can access running application and hook methods on run time to change the behaviour, change values, extract values, run different code...**\
|
||||
如果你想 pentest Android applications 你需要知道如何使用 Frida。
|
||||
|
||||
- Learn how to use Frida: [**Frida tutorial**](frida-tutorial/index.html)
|
||||
- Some "GUI" for actions with Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
|
||||
@ -518,7 +525,7 @@ android-anti-instrumentation-and-ssl-pinning-bypass.md
|
||||
|
||||
### **Dump Memory - Fridump**
|
||||
|
||||
检查应用是否在内存中存储了不应该存放的敏感信息,比如密码或助记词。
|
||||
检查应用是否在内存中存储了不应存储的敏感信息,例如密码或助记词。
|
||||
|
||||
Using [**Fridump3**](https://github.com/rootbsd/fridump3) you can dump the memory of the app with:
|
||||
```bash
|
||||
@ -529,76 +536,78 @@ python3 fridump3.py -u <PID>
|
||||
frida-ps -Uai
|
||||
python3 fridump3.py -u "<Name>"
|
||||
```
|
||||
这会将内存转储到 ./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 中的敏感数据**
|
||||
|
||||
在 Android 中,Keystore 是存储敏感数据的最佳位置,然而在拥有足够权限的情况下仍然**可能被访问**。由于应用通常倾向于在此处以**明文**存储敏感数据,pentests 应当以 root user 身份检查它,否则有物理访问设备的人可能会窃取这些数据。
|
||||
在 Android 中,Keystore 是存放敏感数据的最佳位置,然而在获得足够权限的情况下,仍然**可能被访问**。
|
||||
|
||||
即使应用将数据存储在 Keystore 中,也应该对这些数据进行加密。
|
||||
由于应用往往在此处以**明文形式存储敏感数据**,因此在进行 pentests 时应以 root 用户或拥有设备物理访问权限的身份检查这一点,以防该数据被窃取。
|
||||
|
||||
要访问 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 中,这些数据也应被加密。
|
||||
|
||||
要访问 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 脚本,可能可以**bypass fingerprint authentication**,用于绕过 Android 应用为**保护某些敏感区域**而执行的身份验证:
|
||||
使用下面的 Frida 脚本,可能能够 **bypass fingerprint authentication**,Android 应用可能会执行该操作以 **保护某些敏感区域:**
|
||||
```bash
|
||||
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>
|
||||
```
|
||||
### **后台快照**
|
||||
### **后台图像**
|
||||
|
||||
当你将应用置于后台时,Android 会存储一个**应用快照**,这样当它恢复到前台时,会先加载该图像,然后才加载应用本身,从而看起来应用加载更快。
|
||||
当你将应用置于后台时,Android 会存储**应用的快照**,因此当它恢复到前台时,会先加载该图像,使得应用看起来启动更快。
|
||||
|
||||
然而,如果该快照包含**敏感信息**,有权限访问该快照的人可能会**窃取这些信息**(注意你需要 root 才能访问它)。
|
||||
然而,如果该快照包含 **敏感信息**,有权限访问该快照的人可能会 **窃取这些信息**(注意访问需要 root)。
|
||||
|
||||
快照通常存储在:**`/data/system_ce/0/snapshots`**
|
||||
这些快照通常存储在: **`/data/system_ce/0/snapshots`**
|
||||
|
||||
Android 提供了一种通过设置 **FLAG_SECURE** 布局参数来防止截图的方法。使用此标志后,窗口内容将被视为受保护,从而阻止其出现在截图中或在非安全的显示设备上被查看。
|
||||
Android 提供了一种方法,可以通过将布局参数设置为 **FLAG_SECURE 来防止截图**。使用该 flag 后,窗口内容将被视为受保护,从而防止出现在截图中或在非安全显示设备上被查看。
|
||||
```bash
|
||||
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
||||
```
|
||||
### **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
|
||||
|
||||
开发者经常创建代理组件(如 activities、services 和 broadcast receivers)来处理这些 Intents,并将它们传递给像 `startActivity(...)` 或 `sendBroadcast(...)` 这样的函数,这可能存在风险。
|
||||
开发者经常创建代理组件(例如 activities、services 和 broadcast receivers)来处理这些 Intents,并将它们传递给诸如 `startActivity(...)` 或 `sendBroadcast(...)` 之类的方法,这可能很危险。
|
||||
|
||||
危险在于允许攻击者通过误导这些 Intents 来触发未导出的应用组件或访问敏感的内容提供者。一个显著的例子是 `WebView` 组件通过 `Intent.parseUri(...)` 将 URL 转换为 `Intent` 对象并执行它们,这可能导致恶意 Intent 注入。
|
||||
危险在于攻击者可通过误导这些 Intents 来触发非 exported 的应用组件或访问敏感的 content providers。一个显著的例子是 `WebView` 组件通过 `Intent.parseUri(...)` 将 URL 转换为 `Intent` 对象并执行它们,可能导致恶意的 Intent 注入。
|
||||
|
||||
### Essential Takeaways
|
||||
### 重要要点
|
||||
|
||||
- **Intent Injection** 类似于 web 的 Open Redirect 问题。
|
||||
- 漏洞利用通常涉及将 `Intent` 对象作为 extras 传递,这些 Intent 可被重定向以执行不安全的操作。
|
||||
- 它可能使未导出的组件和内容提供者暴露给攻击者。
|
||||
- `WebView` 将 URL 转换为 `Intent` 的行为可能促成非预期的操作。
|
||||
- **Intent Injection** 类似于 web 中的 Open Redirect 问题。
|
||||
- 利用方式包括将 `Intent` 对象作为 extras 传递,这些 Intent 可能被重定向以执行不安全的操作。
|
||||
- 它可能会将非导出的组件和 content providers 暴露给攻击者。
|
||||
- `WebView` 将 URL 转换为 `Intent` 的行为可能促成意外的操作。
|
||||
|
||||
### Android Client Side Injections and others
|
||||
|
||||
你可能从 Web 上了解过这类漏洞。在 Android 应用中需要特别注意这些漏洞:
|
||||
这些漏洞你可能在 Web 上已经见过。在 Android 应用中需要特别注意这些漏洞:
|
||||
|
||||
- **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 应用结束会话时,cookie 未被撤销,甚至可能被保存到磁盘
|
||||
- **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 应用结束会话时,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)
|
||||
|
||||
**Static analysis**
|
||||
**静态分析**
|
||||
|
||||
.png>)
|
||||
|
||||
**Vulnerability assessment of the application** 使用一个漂亮的基于 web 的前端。你也可以执行动态分析(但需要准备环境)。
|
||||
**对应用的漏洞评估** 使用一个友好的基于 web 的前端。你也可以执行动态分析(但需要准备好环境)。
|
||||
```bash
|
||||
docker pull opensecurity/mobile-security-framework-mobsf
|
||||
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
|
||||
@ -608,41 +617,41 @@ Also, if you create a **ZIP** file with the source code if an **Android** or an
|
||||
|
||||
MobSF also allows you to **diff/Compare** analysis and to integrate **VirusTotal** (you will need to set your API key in _MobSF/settings.py_ and enable it: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). You can also set `VT_UPLOAD` to `False`, then the **hash** will be **upload** instead of the file.
|
||||
|
||||
### Assisted Dynamic analysis with MobSF
|
||||
### 使用 MobSF 的辅助动态分析
|
||||
|
||||
MobSF 在 Android 的动态分析上也非常有用,但在这种情况下你需要在宿主机上安装 MobSF 和 **genymotion**(VM 或 Docker 无法工作)。_Note: You need to **start first a VM in genymotion** and **then MobSF.**_\
|
||||
MobSF 的动态分析器可以:
|
||||
**MobSF** 在 **Android** 平台上对于 **动态分析** 也非常有帮助,但在这种情况下你需要在宿主机上安装 MobSF 和 **genymotion**(在 VM 或 Docker 中不起作用)。_注意:你需要先在 genymotion 中**启动一个 VM**,然后再启动 MobSF._\
|
||||
**MobSF dynamic analyser** 可以:
|
||||
|
||||
- **Dump application data**(URLs、logs、剪贴板、你手动截取的 screenshots、由 "**Exported Activity Tester**" 生成的 screenshots、emails、SQLite 数据库、XML 文件以及其他生成的文件)。除了 screenshots 以外,其它都会自动完成;screenshots 需要你在想要截图时按下相应按钮,或者按下 "**Exported Activity Tester**" 以获取所有 exported activities 的 screenshots。
|
||||
- **Dump application data**(URLs、日志、剪贴板、你拍的截图、通过 "**Exported Activity Tester**" 拍的截图、电子邮件、SQLite 数据库、XML 文件和其他创建的文件)。除了截图外,所有这些都是自动完成的;截图需要你在想要截图时手动按下,或者按下 "**Exported Activity Tester**" 来获取所有 exported activities 的截图。
|
||||
- 捕获 **HTTPS traffic**
|
||||
- 使用 **Frida** 获取 **runtime** **information**
|
||||
|
||||
从 Android **versions > 5**,它会**自动启动 Frida**并设置全局**proxy**以**capture**流量。它只会捕获受测应用的流量。
|
||||
从 android **versions > 5** 开始,它会**自动启动 Frida**并会设置全局 **proxy** 来**捕获**流量。它只会捕获来自被测试应用的流量。
|
||||
|
||||
**Frida**
|
||||
|
||||
默认情况下,它还会使用一些 Frida Scripts 来**bypass SSL pinning**、**root detection** 和 **debugger detection**,并**monitor interesting APIs**。\
|
||||
MobSF 还可以**invoke exported activities**,抓取它们的 **screenshots** 并将其**save** 到报告中。
|
||||
默认情况下,它还会使用一些 Frida Scripts 来**绕过 SSL pinning**、**root detection** 和 **debugger detection**,并**监控有趣的 API**。\
|
||||
MobSF 还可以**调用 exported activities**,抓取它们的**screenshots**并将其**保存**到报告中。
|
||||
|
||||
要**start** 动态测试,按绿色按钮:“Start Instrumentation”。按 “Frida Live Logs” 可以查看由 Frida scripts 生成的日志,按 “Live API Monitor” 可以查看对 hooked methods 的所有调用、传入参数和返回值(在按下 “Start Instrumentation” 后会出现)。\
|
||||
MobSF 还允许你加载自定义的 **Frida scripts**(要将你的 Frida scripts 的结果发送到 MobSF,请使用函数 `send()`)。它也有若干预写脚本可供加载(你可以在 `MobSF/DynamicAnalyzer/tools/frida_scripts/others/` 中添加更多),只需选择它们,按 “Load”,然后按 “Start Instrumentation”(你将能在 “Frida Live Logs” 中看到这些脚本的日志)。
|
||||
要**开始**动态测试,按绿色按钮:“**Start Instrumentation**”。按“**Frida Live Logs**” 查看 Frida 脚本生成的日志,按“**Live API Monitor**” 查看对被 hook 方法的所有调用、传入参数和返回值(在按下 "Start Instrumentation" 后会出现)。\
|
||||
MobSF 还允许你加载自己的 **Frida scripts**(要将你的 Frida 脚本结果发送到 MobSF,请使用函数 `send()`)。它也包含**若干预写脚本**可供加载(你可以在 `MobSF/DynamicAnalyzer/tools/frida_scripts/others/` 中添加更多),只需**选择**它们,按“**Load**”然后按“**Start Instrumentation**”(你将能在“**Frida Live Logs**”中看到这些脚本的日志)。
|
||||
|
||||
.png>)
|
||||
|
||||
此外,你还有一些辅助性的 Frida 功能:
|
||||
此外,你还有一些辅助的 Frida 功能:
|
||||
|
||||
- **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**: 按模式搜索 classes
|
||||
- **Trace Class Methods**: **Trace** 整个 class(查看该类所有方法的输入和输出)。请记住默认情况下 MobSF 会跟踪若干有趣的 Android Api 方法。
|
||||
- **Enumerate Loaded Classes**:打印所有已加载的类
|
||||
- **Capture Strings**:在使用应用时打印所有捕获到的字符串(噪声很大)
|
||||
- **Capture String Comparisons**:非常有用。它会**显示被比较的两条字符串**以及比较结果是 True 还是 False。
|
||||
- **Enumerate Class Methods**:输入类名(例如 "java.io.File"),它会打印该类的所有方法。
|
||||
- **Search Class Pattern**:按模式搜索类
|
||||
- **Trace Class Methods**:**Trace** 整个类(查看该类所有方法的输入和输出)。记住默认情况下 MobSF 会追踪若干有趣的 Android API 方法。
|
||||
|
||||
一旦你选择了要使用的辅助模块,按下 “Start Intrumentation”,你将在 “Frida Live Logs” 中看到所有输出。
|
||||
一旦你选择了要使用的辅助模块,你需要按“**Start Intrumentation**”,你会在“**Frida Live Logs**”中看到所有输出。
|
||||
|
||||
**Shell**
|
||||
|
||||
Mobsf 还在动态分析页面底部提供了一个 shell,包含一些 **adb** 命令、**MobSF commands** 和常见的 **shell commands**。一些有趣的命令:
|
||||
MobSF 在动态分析页面底部还提供了一个带有一些 **adb** 命令、**MobSF commands** 和常用 **shell** **commands** 的 shell。一些有趣的命令:
|
||||
```bash
|
||||
help
|
||||
shell ls
|
||||
@ -653,32 +662,32 @@ receivers
|
||||
```
|
||||
**HTTP tools**
|
||||
|
||||
当 HTTP 流量被 capture 时,你可以在“**HTTP(S) Traffic**”按钮看到捕获流量的粗糙视图,或在绿色的“**Start HTTPTools**”按钮看到更友好的视图。通过第二个选项,你可以将**captured requests** 发送到像 Burp 或 Owasp ZAP 这样的 proxies。\
|
||||
为此,_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))。
|
||||
当 HTTP 流量被捕获时,你可以在底部的 "**HTTP(S) Traffic**" 按钮看到原始的捕获流量视图,或在绿色按钮 "**Start HTTPTools**" 中看到更友好的视图。从第二个选项,你可以将**捕获的请求** **发送**到像 Burp 或 Owasp ZAP 这样的 **proxies**。\
|
||||
要做到这一点,_开启 Burp -->_ _关闭 Intercept --> 在 MobSB HTTPTools 中选择请求_ --> 点击 "**Send to Fuzzer**" --> _选择代理地址_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080))。
|
||||
|
||||
一旦用 MobSF 完成 dynamic analysis,你可以点击“**Start Web API Fuzzer**”来 **fuzz http requests** 并查找漏洞。
|
||||
完成 MobSF 的动态分析后,你可以点击 "**Start Web API Fuzzer**" 来对 http 请求进行 **fuzz** 并查找漏洞。
|
||||
|
||||
> [!TIP]
|
||||
> 在用 MobSF 执行 dynamic analysis 之后,proxy 设置可能会被错误配置,并且你可能无法通过 GUI 修复。你可以通过执行以下命令来修复 proxy 设置:
|
||||
> 在使用 MobSF 完成动态分析后,代理设置可能会被错误配置,且无法通过 GUI 修复。你可以通过运行以下命令修复代理设置:
|
||||
>
|
||||
> ```
|
||||
> adb shell settings put global http_proxy :0
|
||||
> ```
|
||||
|
||||
### Assisted Dynamic Analysis with Inspeckage
|
||||
### 使用 Inspeckage 的辅助动态分析
|
||||
|
||||
你可以从 [**Inspeckage**](https://github.com/ac-pm/Inspeckage) 获取此工具。\
|
||||
该工具会使用一些 **Hooks**,在你执行 **dynamic analysis** 时让你了解应用内发生的情况。
|
||||
该工具将使用一些 **Hooks**,在你进行**动态分析**时告知你**应用中正在发生的事情**。
|
||||
|
||||
### [Yaazhini](https://www.vegabird.com/yaazhini/)
|
||||
|
||||
这是一个用于通过 GUI 执行 **static analysis** 的优秀工具
|
||||
这是一个用于通过 GUI 执行静态分析的**优秀工具**
|
||||
|
||||
.png>)
|
||||
|
||||
### [Qark](https://github.com/linkedin/qark)
|
||||
|
||||
该工具旨在查找若干 **security related Android application vulnerabilities**,可针对 **source code** 或 **packaged APKs**。该工具还**能够创建可部署的 "Proof-of-Concept" APK** 和 **ADB commands**,以利用发现的一些漏洞(如 Exposed activities、intents、tapjacking...)。与 Drozer 相同,无需对测试设备进行 root。
|
||||
该工具旨在查找多种**与安全相关的 Android 应用漏洞**,无论是在**源代码**还是**打包的 APK**中。该工具还能够**创建可部署的 "Proof-of-Concept" APK**和 **ADB commands**,以利用某些发现的漏洞(如暴露的 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
|
||||
@ -690,21 +699,19 @@ qark --java path/to/specific/java/file.java
|
||||
- 显示所有提取的文件以便参考
|
||||
- 自动将 APK 文件反编译为 Java 和 Smali 格式
|
||||
- 分析 AndroidManifest.xml 以查找常见漏洞和行为
|
||||
- 对静态源代码进行分析以查找常见漏洞和行为
|
||||
- 对源代码进行静态分析以查找常见漏洞和行为
|
||||
- 设备信息
|
||||
- 以及更多
|
||||
- 以及更多功能
|
||||
```bash
|
||||
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` 文件中,每家公司或测试人员都可以创建自己的规则来分析所需内容。
|
||||
|
||||
从 [download page](https://superanalyzer.rocks/download.html) 下载最新的二进制文件
|
||||
从 [download page](https://superanalyzer.rocks/download.html) 下载最新的二进制文件。
|
||||
```
|
||||
super-analyzer {apk_file}
|
||||
```
|
||||
@ -712,17 +719,17 @@ super-analyzer {apk_file}
|
||||
|
||||
.png>)
|
||||
|
||||
StaCoAn 是一个 **跨平台** 工具,可帮助开发人员、bugbounty hunters 和 ethical hackers 在移动应用上执行 [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis)。
|
||||
StaCoAn 是一个 crossplatform 工具,帮助开发者、bugbounty hunters 和 ethical hackers 对移动应用执行 [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis)。
|
||||
|
||||
其概念是将你的移动应用文件(.apk 或 .ipa 文件)拖放到 StaCoAn 应用上,StaCoAn 会为你生成一份可视化且可携带的报告。你可以调整设置和 wordlists 以获得定制化的体验。
|
||||
其概念是将你的移动应用文件 (an .apk or .ipa file) 拖放到 StaCoAn 应用上,它会为你生成一个可视且便携的报告。你可以调整设置和 wordlists 来获得定制化体验。
|
||||
|
||||
Download[ latest release](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 漏洞分析系统,帮助 developers 或 hackers 在 Android 应用中发现潜在的安全漏洞。\
|
||||
[Windows releases](https://github.com/AndroBugs/AndroBugs_Framework/releases)
|
||||
```
|
||||
python androbugs.py -f [APK file]
|
||||
@ -730,11 +737,11 @@ androbugs.exe -f [APK file]
|
||||
```
|
||||
### [Androwarn](https://github.com/maaaaz/androwarn)
|
||||
|
||||
**Androwarn** 是一个工具,主要用于检测并提醒用户有关 Android 应用可能的潜在恶意行为。
|
||||
**Androwarn** 是一个工具,主要用于检测并提醒用户 Android 应用程序可能的恶意行为。
|
||||
|
||||
检测是通过对应用的 Dalvik bytecode(以 **Smali** 表示)进行 **static analysis**,并使用 [`androguard`](https://github.com/androguard/androguard) 库来完成的。
|
||||
|
||||
该工具查找 **“坏”应用的常见行为**,例如:Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code execution...
|
||||
该工具会查找 **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
|
||||
```
|
||||
@ -742,28 +749,28 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
||||
|
||||
.png>)
|
||||
|
||||
**MARA** 是一个 **M**obile **A**pplication **R**everse engineering and **A**nalysis Framework。它将常用的移动应用逆向与分析工具整合在一起,帮助针对 OWASP mobile security threats 测试移动应用。其目标是让这项工作对移动应用开发者和安全专业人员更简单、更友好。
|
||||
**MARA** 是一个 **M**obile **A**pplication **R**everse engineering and **A**nalysis Framework。它将常用的移动应用逆向工程和分析工具整合在一起,以协助针对 OWASP mobile security threats 对移动应用进行测试。其目标是让移动应用开发者和安全专业人员更容易、更友好地完成这项工作。
|
||||
|
||||
它可以:
|
||||
它能够:
|
||||
|
||||
- 使用不同的工具提取 Java 和 Smali 代码
|
||||
- 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)
|
||||
- 使用 regexp 从 APK 中提取私有信息。
|
||||
- 使用不同工具提取 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)
|
||||
- 使用 regexps 从 APK 中提取敏感信息。
|
||||
- 分析 Manifest。
|
||||
- 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) 进行 Deobfuscate APK
|
||||
- 使用以下工具分析找到的域名: [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
|
||||
|
||||
Useful to detect malware: [https://koodous.com/](https://koodous.com/)
|
||||
用于检测 malware: [https://koodous.com/](https://koodous.com/)
|
||||
|
||||
## Obfuscating/Deobfuscating code
|
||||
|
||||
注意,取决于你用来混淆代码的服务和配置,Secrets 可能会被混淆,也可能不会被混淆。
|
||||
请注意,取决于用于混淆代码的服务和配置,敏感信息可能会被混淆,也可能不会被混淆。
|
||||
|
||||
### [ProGuard](<https://en.wikipedia.org/wiki/ProGuard_(software)>)
|
||||
|
||||
From [Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard** 是一个开源命令行工具,用于压缩、优化和混淆 Java 代码。它能够优化字节码并检测和移除未使用的指令。ProGuard 是自由软件,按照 GNU General Public License 第2版发布。
|
||||
From [Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard** is an open source command-line tool that shrinks, optimizes and obfuscates Java code. It is able to optimize bytecode as well as detect and remove unused instructions. ProGuard is free software and is distributed under the GNU General Public License, version 2.
|
||||
|
||||
ProGuard 随 Android SDK 一起分发,并在以 release 模式构建应用时运行。
|
||||
|
||||
@ -771,19 +778,19 @@ ProGuard 随 Android SDK 一起分发,并在以 release 模式构建应用时
|
||||
|
||||
Find a step-by-step guide to deobfuscate the apk in [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)
|
||||
|
||||
(From that guide) 上一次我们检查时,Dexguard 的运行模式是:
|
||||
(From that guide) Last time we checked, the Dexguard mode of operation was:
|
||||
|
||||
- 将资源作为 InputStream 加载;
|
||||
- 将结果传递给继承自 FilterInputStream 的类以进行解密;
|
||||
- 做一些无用的混淆以浪费逆向人员几分钟的时间;
|
||||
- 将解密后的结果传递给 ZipInputStream 以获取 DEX 文件;
|
||||
- 最后使用 `loadDex` 方法将生成的 DEX 作为 Resource 加载。
|
||||
- load a resource as an InputStream;
|
||||
- feed the result to a class inheriting from FilterInputStream to decrypt it;
|
||||
- do some useless obfuscation to waste a few minutes of time from a reverser;
|
||||
- feed the decrypted result to a ZipInputStream to get a DEX file;
|
||||
- finally load the resulting DEX as a Resource using the `loadDex` method.
|
||||
|
||||
### [DeGuard](http://apk-deguard.com)
|
||||
|
||||
**DeGuard 逆转了由 Android 混淆工具执行的混淆过程。这样可以进行许多安全分析,包括代码检查和库预测。**
|
||||
**DeGuard reverses the process of obfuscation performed by Android obfuscation tools. This enables numerous security analyses, including code inspection and predicting libraries.**
|
||||
|
||||
你可以将混淆的 APK 上传到他们的平台。
|
||||
你可以将混淆后的 APK 上传到他们的平台。
|
||||
|
||||
### [Deobfuscate android App]https://github.com/In3tinct/deobfuscate-android-app
|
||||
|
||||
@ -791,11 +798,11 @@ This is a LLM tool to find any potential security vulnerabilities in android app
|
||||
|
||||
### [Simplify](https://github.com/CalebFenton/simplify)
|
||||
|
||||
它是一个 **通用的 android deobfuscator。** Simplify **几乎是执行应用** 来理解其行为,然后 **尝试优化代码**,使其行为保持一致但更易于人类理解。每种优化类型都很简单且通用,所以不管使用了哪种具体的混淆方式,都能起作用。
|
||||
It is a **generic android deobfuscator.** Simplify **virtually executes an app** to understand its behavior and then **tries to optimize the code** so it behaves identically but is easier for a human to understand. Each optimization type is simple and generic, so it doesn't matter what the specific type of obfuscation is used.
|
||||
|
||||
### [APKiD](https://github.com/rednaga/APKiD)
|
||||
|
||||
APKiD 会告诉你 **一个 APK 是如何构建的**。它能识别许多 **compilers**, **packers**, **obfuscators** 以及其他奇怪的东西。它是 Android 的 [_PEiD_]。
|
||||
APKiD gives you information about **how an APK was made**. It identifies many **compilers**, **packers**, **obfuscators**, and other weird stuff. It's [_PEiD_](https://www.aldeid.com/wiki/PEiD) for Android.
|
||||
|
||||
### Manual
|
||||
|
||||
@ -805,19 +812,20 @@ APKiD 会告诉你 **一个 APK 是如何构建的**。它能识别许多 **comp
|
||||
|
||||
### [Androl4b](https://github.com/sh4hin/Androl4b)
|
||||
|
||||
AndroL4b 是一个基于 ubuntu-mate 的 Android security 虚拟机,包含来自不同安全极客和研究人员的最新 framework、tutorials 和 labs,用于 reverse engineering 和 malware analysis。
|
||||
AndroL4b 是一个基于 ubuntu-mate 的 Android 安全虚拟机,包含来自不同安全极客和研究人员的最新框架、教程和用于逆向工程与 malware analysis 的实验。
|
||||
|
||||
## References
|
||||
|
||||
- [https://owasp.org/www-project-mobile-app-security/](https://owasp.org/www-project-mobile-app-security/)
|
||||
- [https://appsecwiki.com/#/](https://appsecwiki.com/#/) 它是一个很好的资源列表
|
||||
- [https://maddiestone.github.io/AndroidAppRE/](https://maddiestone.github.io/AndroidAppRE/) Android 快速课程
|
||||
- [https://appsecwiki.com/#/](https://appsecwiki.com/#/) It is a great list of resources
|
||||
- [https://maddiestone.github.io/AndroidAppRE/](https://maddiestone.github.io/AndroidAppRE/) Android quick course
|
||||
- [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)
|
||||
- [Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools)
|
||||
|
||||
## Yet to try
|
||||
|
||||
|
@ -1,31 +1,31 @@
|
||||
# Android 反仪器化与 SSL Pinning 绕过 (Frida/Objection)
|
||||
# Android 反注入与 SSL Pinning 绕过 (Frida/Objection)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
本页面提供了一个实用的工作流程,用于对检测/阻止 instrumentation 的 Android 应用或强制 TLS pinning 的应用恢复动态分析。重点是快速分类、常见检测点,以及可复制粘贴的 hooks/策略,以尽可能在不重新打包的情况下绕过它们。
|
||||
本页提供一个实用工作流程,用于恢复对检测到或阻止 instrumentation 或强制 TLS pinning 的 Android 应用的动态分析。侧重快速分诊、常见检测点,以及可复制粘贴的 hooks/tactics,在可能的情况下无需重新打包即可绕过。
|
||||
|
||||
## Detection Surface (what apps check)
|
||||
|
||||
- Root 检测:su binary、Magisk paths、getprop values、常见 root packages
|
||||
- Frida/debugger 检测(Java):Debug.isDebuggerConnected(), ActivityManager.getRunningAppProcesses(), getRunningServices(), scanning /proc, classpath, loaded libs
|
||||
- Native anti‑debug:ptrace(), syscalls, anti‑attach, breakpoints, inline hooks
|
||||
- 早期初始化检测:Application.onCreate() 或 process start hooks,如果检测到 instrumentation 则崩溃
|
||||
- TLS pinning:custom TrustManager/HostnameVerifier, OkHttp CertificatePinner, Conscrypt pinning, native pins
|
||||
- Root checks: su 二进制、Magisk 路径、getprop 值、常见 root 包
|
||||
- Frida/debugger checks (Java): Debug.isDebuggerConnected(), ActivityManager.getRunningAppProcesses(), getRunningServices(), 扫描 /proc、classpath、已加载的 libs
|
||||
- Native anti‑debug: ptrace(), syscalls, anti‑attach、断点、inline hooks
|
||||
- Early init checks: Application.onCreate() 或进程启动时的 hooks,如果检测到 instrumentation 则导致崩溃
|
||||
- TLS pinning: custom TrustManager/HostnameVerifier、OkHttp CertificatePinner、Conscrypt pinning、本地 native pins
|
||||
|
||||
## Step 1 — Quick win: hide root with Magisk DenyList
|
||||
|
||||
- 在 Magisk 中启用 Zygisk
|
||||
- 启用 DenyList,并添加目标包
|
||||
- 启用 DenyList,添加目标包
|
||||
- 重启并重新测试
|
||||
|
||||
许多应用仅查找明显的指示器(su/Magisk paths/getprop)。DenyList 常常能中和这些简单的检测。
|
||||
许多应用仅查找明显的指示器(su/Magisk 路径/getprop)。DenyList 通常可以中和这些简单的检测。
|
||||
|
||||
References:
|
||||
- Magisk (Zygisk & DenyList): https://github.com/topjohnwu/Magisk
|
||||
|
||||
## Step 2 — 30‑second Frida Codeshare tests
|
||||
|
||||
在深入之前先尝试常用的即插即用脚本:
|
||||
在深入之前尝试常见的 drop‑in 脚本:
|
||||
|
||||
- anti-root-bypass.js
|
||||
- anti-frida-detection.js
|
||||
@ -35,20 +35,37 @@ Example:
|
||||
```bash
|
||||
frida -U -f com.example.app -l anti-frida-detection.js
|
||||
```
|
||||
这些通常对 Java 的 root/debug 检查、process/service 扫描和本地 ptrace() 进行 stub。 在防护较弱的应用上很有用;针对加固的目标可能需要定制化的 hooks。
|
||||
这些通常会 stub Java 的 root/debug 检查、process/service 扫描和原生 ptrace()。适用于保护较轻的应用;加固目标可能需要定制化的 hooks。
|
||||
|
||||
- Codeshare: https://codeshare.frida.re/
|
||||
|
||||
## 第 3 步 — 通过延迟附加绕过初始化检测器
|
||||
## 使用 Medusa 自动化(Frida framework)
|
||||
|
||||
许多检测只在 process spawn/onCreate() 期间运行。Spawn‑time injection (-f) 或 gadgets 会被发现;在 UI 加载后再附加可以绕过检测。
|
||||
Medusa 提供 90+ 即用模块,用于 SSL unpinning、root/emulator detection bypass、HTTP comms logging、crypto key interception 等。
|
||||
```bash
|
||||
git clone https://github.com/Ch0pin/medusa
|
||||
cd medusa
|
||||
pip install -r requirements.txt
|
||||
python medusa.py
|
||||
|
||||
# Example interactive workflow
|
||||
show categories
|
||||
use http_communications/multiple_unpinner
|
||||
use root_detection/universal_root_detection_bypass
|
||||
run com.target.app
|
||||
```
|
||||
提示:Medusa 非常适合在编写自定义 hooks 之前快速获得成果。你也可以 cherry-pick modules,并将它们与自己的 scripts 结合使用。
|
||||
|
||||
## 第 3 步 — 通过延后 attaching 绕过 init-time 检测器
|
||||
|
||||
许多检测仅在 process spawn/onCreate() 阶段运行。Spawn‑time injection (-f) 或 gadgets 会被发现;在 UI 加载之后再进行 attaching 则可能绕过检测。
|
||||
```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
|
||||
```
|
||||
如果这有效,保持会话稳定并继续进行 map 和 stub 检查。
|
||||
如果这有效,保持会话稳定并继续进行映射和 stub 检查。
|
||||
|
||||
## 第4步 — 通过 Jadx 和字符串搜索映射检测逻辑
|
||||
|
||||
@ -61,16 +78,16 @@ public boolean isFridaDetected() {
|
||||
return getRunningServices().contains("frida");
|
||||
}
|
||||
```
|
||||
常见需要审查/hook 的 API:
|
||||
常见需要审查/hook的 API:
|
||||
- android.os.Debug.isDebuggerConnected
|
||||
- android.app.ActivityManager.getRunningAppProcesses / getRunningServices
|
||||
- java.lang.System.loadLibrary / System.load (native bridge)
|
||||
- java.lang.Runtime.exec / ProcessBuilder (probing commands)
|
||||
- android.os.SystemProperties.get (root/emulator heuristics)
|
||||
|
||||
## 第5步 — 使用 Frida (Java) 进行运行时存根
|
||||
## 第5步 — Runtime stubbing with Frida (Java)
|
||||
|
||||
覆盖自定义保护以返回安全值而无需重新打包:
|
||||
覆写自定义防护以返回安全值,无需重新打包:
|
||||
```js
|
||||
Java.perform(() => {
|
||||
const Checks = Java.use('com.example.security.Checks');
|
||||
@ -85,7 +102,7 @@ const AM = Java.use('android.app.ActivityManager');
|
||||
AM.getRunningAppProcesses.implementation = function () { return java.util.Collections.emptyList(); };
|
||||
});
|
||||
```
|
||||
要排查早期崩溃吗?在它崩溃前转储类,以识别可能用于检测的命名空间:
|
||||
在对早期崩溃进行分级吗?就在它崩溃之前转储类,以找出可能的检测命名空间:
|
||||
```js
|
||||
Java.perform(() => {
|
||||
Java.enumerateLoadedClasses({
|
||||
@ -94,7 +111,15 @@ onComplete: () => console.log('Done')
|
||||
});
|
||||
});
|
||||
```
|
||||
记录并禁用可疑方法以确认执行流程:
|
||||
// Quick root detection stub example (adapt to target package/class names)
|
||||
Java.perform(() => {
|
||||
try {
|
||||
const RootChecker = Java.use('com.target.security.RootCheck');
|
||||
RootChecker.isDeviceRooted.implementation = function () { return false; };
|
||||
} catch (e) {}
|
||||
});
|
||||
|
||||
记录并使可疑方法失效以确认执行流程:
|
||||
```js
|
||||
Java.perform(() => {
|
||||
const Det = Java.use('com.example.security.DetectionManager');
|
||||
@ -104,13 +129,53 @@ return false;
|
||||
};
|
||||
});
|
||||
```
|
||||
## Step 6 — 当 Java hooks 失效时,跟踪 JNI/native 路径
|
||||
## Bypass emulator/VM detection (Java stubs)
|
||||
|
||||
跟踪 JNI 入口点以定位 native loaders 和 detection init:
|
||||
常见启发式规则:Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE 包含 generic/goldfish/ranchu/sdk;存在 QEMU 伪像,如 /dev/qemu_pipe、/dev/socket/qemud;默认 MAC 02:00:00:00:00:00;10.0.2.x NAT;缺少 telephony/sensors。
|
||||
|
||||
快速伪装 Build 字段:
|
||||
```js
|
||||
Java.perform(function(){
|
||||
var Build = Java.use('android.os.Build');
|
||||
Build.MODEL.value = 'Pixel 7 Pro';
|
||||
Build.MANUFACTURER.value = 'Google';
|
||||
Build.BRAND.value = 'google';
|
||||
Build.FINGERPRINT.value = 'google/panther/panther:14/UP1A.231105.003/1234567:user/release-keys';
|
||||
});
|
||||
```
|
||||
补充用于文件存在性检查和标识符的桩(TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList),以返回真实的值。
|
||||
|
||||
## SSL pinning bypass quick hook (Java)
|
||||
|
||||
使自定义 TrustManagers 失效并强制使用宽松的 SSL contexts:
|
||||
```js
|
||||
Java.perform(function(){
|
||||
var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');
|
||||
var SSLContext = Java.use('javax.net.ssl.SSLContext');
|
||||
|
||||
// No-op validations
|
||||
X509TrustManager.checkClientTrusted.implementation = function(){ };
|
||||
X509TrustManager.checkServerTrusted.implementation = function(){ };
|
||||
|
||||
// Force permissive TrustManagers
|
||||
var TrustManagers = [ X509TrustManager.$new() ];
|
||||
var SSLContextInit = SSLContext.init.overload('[Ljavax.net.ssl.KeyManager;','[Ljavax.net.ssl.TrustManager;','java.security.SecureRandom');
|
||||
SSLContextInit.implementation = function(km, tm, sr){
|
||||
return SSLContextInit.call(this, km, TrustManagers, sr);
|
||||
};
|
||||
});
|
||||
```
|
||||
注意
|
||||
- 针对 OkHttp 扩展:按需 hook okhttp3.CertificatePinner 和 HostnameVerifier,或使用来自 CodeShare 的通用 unpinning 脚本。
|
||||
- 运行示例: `frida -U -f com.target.app -l ssl-bypass.js --no-pause`
|
||||
|
||||
## 第 6 步 — 在 Java hooks 失效时追踪 JNI/native 轨迹
|
||||
|
||||
追踪 JNI entry points 以定位 native loaders 和 detection init:
|
||||
```bash
|
||||
frida-trace -n com.example.app -i "JNI_OnLoad"
|
||||
```
|
||||
快速对捆绑的 .so 文件进行本机初筛:
|
||||
对捆绑的 .so 文件进行快速本地初步分析:
|
||||
```bash
|
||||
# List exported symbols & JNI
|
||||
nm -D libfoo.so | head
|
||||
@ -121,7 +186,7 @@ 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 中的简单 anti‑debug:
|
||||
示例:使 ptrace 失效以绕过 libc 中的简单 anti‑debug:
|
||||
```js
|
||||
const ptrace = Module.findExportByName(null, 'ptrace');
|
||||
if (ptrace) {
|
||||
@ -130,25 +195,27 @@ return -1; // pretend failure
|
||||
}, 'int', ['int', 'int', 'pointer', 'pointer']));
|
||||
}
|
||||
```
|
||||
另见:
|
||||
另见:
|
||||
{{#ref}}
|
||||
reversing-native-libraries.md
|
||||
{{#endref}}
|
||||
|
||||
## 步骤 7 — Objection patching (embed gadget / strip basics)
|
||||
## 第7步 — Objection patching (embed gadget / strip basics)
|
||||
|
||||
如果你更倾向于使用 repacking 而不是 runtime hooks,可尝试:
|
||||
当你更倾向于 repacking 而不是 runtime hooks 时,尝试:
|
||||
```bash
|
||||
objection patchapk --source app.apk
|
||||
```
|
||||
注意:
|
||||
- 需要 apktool;请按照官方指南确保使用当前版本以避免构建问题: https://apktool.org/docs/install
|
||||
- Gadget injection 允许在没有 root 的情况下进行 instrumentation,但仍可能被更严格的 init‑time checks 检测到。
|
||||
Notes:
|
||||
- Requires apktool; ensure a current version from the official guide to avoid build issues: https://apktool.org/docs/install
|
||||
- Gadget injection enables instrumentation without root but can still be caught by stronger init‑time checks.
|
||||
|
||||
Optionally, add LSPosed modules and Shamiko for stronger root hiding in Zygisk environments, and curate DenyList to cover child processes.
|
||||
|
||||
References:
|
||||
- Objection: https://github.com/sensepost/objection
|
||||
|
||||
## 第8步 — 后备:修补 TLS pinning 以实现网络可见性
|
||||
## Step 8 — 后备:修补 TLS pinning 以实现网络可见性
|
||||
|
||||
如果 instrumentation 被阻止,你仍然可以通过静态移除 pinning 来检查流量:
|
||||
```bash
|
||||
@ -156,7 +223,7 @@ apk-mitm app.apk
|
||||
# Then install the patched APK and proxy via Burp/mitmproxy
|
||||
```
|
||||
- 工具: https://github.com/shroudedcode/apk-mitm
|
||||
- 有关网络配置 CA‑trust 技巧(以及 Android 7+ 的 user CA trust),请参阅:
|
||||
- 有关网络配置 CA‑trust 技巧(以及 Android 7+ 用户 CA trust),请参见:
|
||||
|
||||
{{#ref}}
|
||||
make-apk-accept-ca-certificate.md
|
||||
@ -186,12 +253,12 @@ apk-mitm app.apk
|
||||
```
|
||||
## 提示与注意事项
|
||||
|
||||
- 当应用在启动时崩溃时,优先选择 attaching late 而不是 spawning
|
||||
- 一些检测会在关键流程(例如 payment、auth)中再次运行 — 在导航过程中保持 hooks active
|
||||
- 结合 static 和 dynamic:在 Jadx 中进行 string hunt 以 shortlist classes;然后 hook methods 在运行时验证
|
||||
- 加固的应用可能使用 packers 和 native TLS pinning — 预计需要 reverse native code
|
||||
- 当应用在启动时崩溃时,优先延后 attach 而不是 spawn
|
||||
- 某些检测会在关键流程(例如 payment、auth)中重新触发 — 在导航过程中保持 hooks 激活
|
||||
- 结合静态与动态:在 Jadx 中进行 string hunt 以筛选类;然后 hook 方法以在 runtime 验证
|
||||
- 被 Hardened 的应用可能使用 packers 和 native TLS pinning — 预计需要 reverse native code
|
||||
|
||||
## 参考资料
|
||||
## References
|
||||
|
||||
- [Reversing Android Apps: Bypassing Detection Like a Pro](https://www.kayssel.com/newsletter/issue-12/)
|
||||
- [Frida Codeshare](https://codeshare.frida.re/)
|
||||
@ -202,5 +269,7 @@ apk-mitm app.apk
|
||||
- [r2frida](https://github.com/nowsecure/r2frida)
|
||||
- [Apktool install guide](https://apktool.org/docs/install)
|
||||
- [Magisk](https://github.com/topjohnwu/Magisk)
|
||||
- [Medusa (Android Frida framework)](https://github.com/Ch0pin/medusa)
|
||||
- [Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -2,33 +2,33 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
非常感谢 [**@offsecjay**](https://twitter.com/offsecjay) 在创建此内容时的帮助。
|
||||
非常感谢 [**@offsecjay**](https://twitter.com/offsecjay) 在创建本内容时提供的帮助。
|
||||
|
||||
## 什么是
|
||||
|
||||
Android Studio 允许 **运行 Android 的虚拟机,以便您可以测试 APK**。要使用它们,您需要:
|
||||
Android Studio 允许你**运行 Android 的虚拟机以测试 APKs**。要使用它们,你需要:
|
||||
|
||||
- **Android SDK 工具** - [在这里下载](https://developer.android.com/studio/releases/sdk-tools)。
|
||||
- 或者 **Android Studio**(带有 Android SDK 工具) - [在这里下载](https://developer.android.com/studio)。
|
||||
- The **Android SDK tools** - [Download here](https://developer.android.com/studio/releases/sdk-tools).
|
||||
- Or **Android Studio** (with Android SDK tools) - [Download here](https://developer.android.com/studio).
|
||||
|
||||
在 Windows(以我的情况为例)**安装 Android Studio 后**,我在以下位置安装了 **SDK 工具**:`C:\Users\<UserName>\AppData\Local\Android\Sdk\tools`
|
||||
在 Windows(以我为例)**在安装 Android Studio 之后**,我的 **SDK Tools 安装在**:`C:\Users\<UserName>\AppData\Local\Android\Sdk\tools`
|
||||
|
||||
在 mac 上,您可以 **下载 SDK 工具** 并通过运行将其放入 PATH:
|
||||
在 mac 上你可以 **download the SDK tools** 并通过运行以下命令将它们加入 PATH:
|
||||
```bash
|
||||
brew tap homebrew/cask
|
||||
brew install --cask android-sdk
|
||||
```
|
||||
或从 **Android Studio GUI** 安装,如在 [https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a](https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a) 中所示,这将把它们安装在 `~/Library/Android/sdk/cmdline-tools/latest/bin/` 和 `~/Library/Android/sdk/platform-tools/` 和 `~/Library/Android/sdk/emulator/`
|
||||
或者从 **Android Studio GUI** 按照 [https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a](https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a) 所述安装,这会把它们安装到 `~/Library/Android/sdk/cmdline-tools/latest/bin/`、`~/Library/Android/sdk/platform-tools/` 和 `~/Library/Android/sdk/emulator/`
|
||||
|
||||
关于 Java 问题:
|
||||
对于 Java 问题:
|
||||
```java
|
||||
export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jbr/Contents/Home
|
||||
```
|
||||
## GUI
|
||||
## 图形界面 (GUI)
|
||||
|
||||
### 准备虚拟机
|
||||
|
||||
如果您安装了 Android Studio,您可以直接打开主项目视图并访问:_**工具**_ --> _**AVD 管理器。**_
|
||||
如果你安装了 Android Studio,你可以打开主项目视图并访问:_**Tools**_ --> _**AVD Manager.**_
|
||||
|
||||
<div align="center" data-full-width="false">
|
||||
|
||||
@ -36,38 +36,38 @@ export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jbr/Contents/Home
|
||||
|
||||
</div>
|
||||
|
||||
然后,点击 _**创建虚拟设备**_
|
||||
然后,点击 _**Create Virtual Device**_
|
||||
|
||||
<figure><img src="../../images/image (1143).png" alt="" width="188"><figcaption></figcaption></figure>
|
||||
|
||||
_**选择** 您想要使用的手机_ 并点击 _**下一步。**_
|
||||
_**选择** 要使用的手机_ 并点击 _**Next.**_
|
||||
|
||||
> [!WARNING]
|
||||
> 如果您需要安装了 Play 商店的手机,请选择带有 Play 商店图标的手机!
|
||||
> 如果你需要带有 Play Store 的手机,请选择带有 Play Store 图标的机型!
|
||||
>
|
||||
> <img src="../../images/image (1144).png" alt="" data-size="original">
|
||||
|
||||
在当前视图中,您将能够 **选择并下载 Android 镜像**,该手机将运行:
|
||||
在当前视图中,你可以**选择并下载手机将运行的 Android 镜像**:
|
||||
|
||||
<figure><img src="../../images/image (1145).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
所以,选择它,如果没有下载,请点击名称旁边的 _**下载**_ 符号(**现在等待镜像下载完成)。**\
|
||||
一旦镜像下载完成,只需选择 **`下一步`** 和 **`完成`**。
|
||||
所以,选择它;如果还没下载,请点击名称旁的 _**Download**_ 图标(**现在等待镜像下载完成**)。\
|
||||
镜像下载完成后,选择 **`Next`** 然后 **`Finish`**。
|
||||
|
||||
虚拟机将被创建。现在 **每次您访问 AVD 管理器时,它都会存在**。
|
||||
虚拟机将被创建。现在 **每次访问 AVD manager 时它都会出现**。
|
||||
|
||||
### 运行虚拟机
|
||||
|
||||
为了 **运行** 它,只需按下 _**启动按钮**_。
|
||||
要**运行**它,只需按下 _**Start button**_。
|
||||
|
||||
.png>)
|
||||
|
||||
## 命令行工具
|
||||
|
||||
> [!WARNING]
|
||||
> 对于 macOS,您可以在 `/Users/<username>/Library/Android/sdk/tools/bin/avdmanager` 找到 `avdmanager` 工具,在 `/Users/<username>/Library/Android/sdk/emulator/emulator` 找到 `emulator`,前提是您已安装它们。
|
||||
> 在 macOS 上,如果已安装,你可以在 `/Users/<username>/Library/Android/sdk/tools/bin/avdmanager` 找到 `avdmanager` 工具,在 `/Users/<username>/Library/Android/sdk/emulator/emulator` 找到 `emulator`。
|
||||
|
||||
首先,您需要 **决定要使用哪个手机**,为了查看可能的手机列表,请执行:
|
||||
首先你需要**决定你要使用哪个手机**,要查看可用手机列表,执行:
|
||||
```
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list device
|
||||
|
||||
@ -95,16 +95,16 @@ Name: Nexus 10
|
||||
OEM : Google
|
||||
[...]
|
||||
```
|
||||
一旦您决定了要使用的设备名称,您需要**决定要在该设备上运行哪个 Android 镜像。**\
|
||||
您可以使用 `sdkmanager` 列出所有选项:
|
||||
一旦你决定了要使用的设备名称,你需要 **决定要在该设备上运行哪个 Android 镜像。**\
|
||||
你可以使用 `sdkmanager` 列出所有选项:
|
||||
```bash
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat --list
|
||||
```
|
||||
并**下载**您想要使用的一个(或全部):
|
||||
然后用下面的命令**下载**你想使用的那个(或全部):
|
||||
```bash
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat "platforms;android-28" "system-images;android-28;google_apis;x86_64"
|
||||
```
|
||||
一旦您下载了想要使用的 Android 镜像,您可以使用以下命令**列出所有已下载的 Android 镜像**:
|
||||
一旦你下载了想要使用的 Android 镜像,你可以使用以下命令 **列出所有已下载的 Android 镜像**:
|
||||
```
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list target
|
||||
----------
|
||||
@ -120,12 +120,12 @@ Type: Platform
|
||||
API level: 29
|
||||
Revision: 4
|
||||
```
|
||||
此时您已决定要使用的设备,并且已下载了 Android 镜像,因此 **您可以使用以下命令创建虚拟机**:
|
||||
此时你已经确定了要使用的设备并下载了 Android 镜像,所以 **你可以使用以下方法创建虚拟机**:
|
||||
```bash
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat -v create avd -k "system-images;android-28;google_apis;x86_64" -n "AVD9" -d "Nexus 5X"
|
||||
```
|
||||
在最后一个命令中**我创建了一个名为** "_AVD9_" 的虚拟机,使用的**设备**是"_Nexus 5X_",**Android镜像**是"_system-images;android-28;google_apis;x86_64_"。\
|
||||
现在你可以使用以下命令**列出你创建的虚拟机**:
|
||||
在上一个命令中 **我创建了一个名为** "_AVD9_" 的 VM,使用 **设备** "_Nexus 5X_" 和 **Android 镜像** "_system-images;android-28;google_apis;x86_64_"。\
|
||||
现在你可以使用下面的命令 **列出你已创建的虚拟机**:
|
||||
```bash
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list avd
|
||||
|
||||
@ -143,72 +143,128 @@ Error: Google pixel_2 no longer exists as a device
|
||||
### 运行虚拟机
|
||||
|
||||
> [!WARNING]
|
||||
> 对于 macOS,您可以在 `/Users/<username>/Library/Android/sdk/tools/bin/avdmanager` 找到 `avdmanager` 工具,在 `/Users/<username>/Library/Android/sdk/emulator/emulator` 找到 `emulator`,前提是您已安装它们。
|
||||
> 对于 macOS,如果已安装,你可以在 `/Users/<username>/Library/Android/sdk/tools/bin/avdmanager` 找到 `avdmanager` 工具,在 `/Users/<username>/Library/Android/sdk/emulator/emulator` 找到 `emulator`。
|
||||
|
||||
我们已经看到您可以列出创建的虚拟机,但 **您也可以使用以下方式列出它们**:
|
||||
我们已经看到如何列出已创建的虚拟机,但**你也可以使用以下方式列出它们**:
|
||||
```bash
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -list-avds
|
||||
AVD9
|
||||
Pixel_2_API_27
|
||||
```
|
||||
您可以简单地**运行任何创建的虚拟机**,使用:
|
||||
您可以简单地使用以下命令 **运行任何已创建的虚拟机**:
|
||||
```bash
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "VirtualMachineName"
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9"
|
||||
```
|
||||
或使用更高级的选项,您可以运行虚拟机,例如:
|
||||
或者使用更高级的选项,你可以运行类似这样的虚拟机:
|
||||
```bash
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system
|
||||
```
|
||||
### 命令行选项
|
||||
|
||||
然而,有**许多不同的命令行有用选项**可以用来启动虚拟机。下面你可以找到一些有趣的选项,但可以[**在这里找到完整列表**](https://developer.android.com/studio/run/emulator-commandline)
|
||||
不过有 **许多不同的有用命令行选项** 可用于启动虚拟机。下面列出一些有意思的选项,但可以 [**find a complete list here**](https://developer.android.com/studio/run/emulator-commandline)
|
||||
|
||||
**启动**
|
||||
**Boot**
|
||||
|
||||
- `-snapshot name` : 启动 VM 快照
|
||||
- `-snapshot-list -snapstorage ~/.android/avd/Nexus_5X_API_23.avd/snapshots-test.img` : 列出所有记录的快照
|
||||
- `-snapshot name` : Start VM snapshot
|
||||
- `-snapshot-list -snapstorage ~/.android/avd/Nexus_5X_API_23.avd/snapshots-test.img` : 列出记录的所有快照
|
||||
|
||||
**网络**
|
||||
**Network**
|
||||
|
||||
- `-dns-server 192.0.2.0, 192.0.2.255` : 允许以逗号分隔的方式指示 DNS 服务器给 VM。
|
||||
- **`-http-proxy 192.168.1.12:8080`** : 允许指示要使用的 HTTP 代理(非常有用以使用 Burp 捕获流量)
|
||||
- 如果代理设置由于某种原因无法工作,请尝试在内部配置它们或使用像 "Super Proxy" 或 "ProxyDroid" 的应用程序。
|
||||
- `-netdelay 200` : 设置网络延迟仿真(以毫秒为单位)。
|
||||
- `-dns-server 192.0.2.0, 192.0.2.255` : 允许为 VM 指定以逗号分隔的 DNS 服务器。
|
||||
- **`-http-proxy 192.168.1.12:8080`** : 允许指定要使用的 HTTP 代理(在使用 Burp 捕获流量时非常有用)
|
||||
- If the proxy settings aren't working for some reason, try to configure them internally or using an pplication like "Super Proxy" or "ProxyDroid".
|
||||
- `-netdelay 200` : 以毫秒为单位设置网络延迟仿真。
|
||||
- `-port 5556` : 设置用于控制台和 adb 的 TCP 端口号。
|
||||
- `-ports 5556,5559` : 设置用于控制台和 adb 的 TCP 端口。
|
||||
- **`-tcpdump /path/dumpfile.cap`** : 将所有流量捕获到文件中
|
||||
|
||||
**系统**
|
||||
**System**
|
||||
|
||||
- `-selinux {disabled|permissive}` : 将安全增强 Linux 安全模块设置为禁用或宽容模式。
|
||||
- `-timezone Europe/Paris` : 设置虚拟设备的时区
|
||||
- `-screen {touch(default)|multi-touch|o-touch}` : 设置仿真触摸屏模式。
|
||||
- **`-writable-system`** : 使用此选项在仿真会话期间拥有可写的系统映像。你还需要运行 `adb root; adb remount`。这对于在系统中安装新证书非常有用。
|
||||
- `-selinux {disabled|permissive}` : 将 Security-Enhanced Linux 安全模块设置为 disabled 或 permissive 模式(在 Linux 操作系统上)。
|
||||
- `-timezone Europe/Paris` : 为虚拟设备设置时区
|
||||
- `-screen {touch(default)|multi-touch|o-touch}` : 设置模拟触摸屏模式。
|
||||
- **`-writable-system`** : 使用此选项可在仿真会话期间使系统镜像可写。你还需要运行 `adb root; adb remount`。这对于在系统中安装新的证书非常有用。
|
||||
|
||||
## Linux CLI setup (SDK/AVD quickstart)
|
||||
|
||||
官方 CLI 工具让在不使用 Android Studio 的情况下轻松创建快速且可调试的模拟器。
|
||||
```bash
|
||||
# Directory layout
|
||||
mkdir -p ~/Android/cmdline-tools/latest
|
||||
|
||||
# Download commandline tools (Linux)
|
||||
wget https://dl.google.com/android/repository/commandlinetools-linux-13114758_latest.zip -O /tmp/cmdline-tools.zip
|
||||
unzip /tmp/cmdline-tools.zip -d ~/Android/cmdline-tools/latest
|
||||
rm /tmp/cmdline-tools.zip
|
||||
|
||||
# Env vars (add to ~/.bashrc or ~/.zshrc)
|
||||
export ANDROID_HOME=$HOME/Android
|
||||
export PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator:$PATH
|
||||
|
||||
# Install core SDK components
|
||||
sdkmanager --install "platform-tools" "emulator"
|
||||
|
||||
# Install a debuggable x86_64 system image (Android 11 / API 30)
|
||||
sdkmanager --install "system-images;android-30;google_apis;x86_64"
|
||||
|
||||
# Create an AVD and run it with a writable /system & snapshot name
|
||||
avdmanager create avd -n PixelRootX86 -k "system-images;android-30;google_apis;x86_64" -d "pixel"
|
||||
emulator -avd PixelRootX86 -writable-system -snapshot PixelRootX86_snap
|
||||
|
||||
# Verify root (debuggable images allow `adb root`)
|
||||
adb root
|
||||
adb shell whoami # expect: root
|
||||
```
|
||||
备注
|
||||
- 系统镜像类型: google_apis (可调试,允许 adb root), google_apis_playstore (不可 root), aosp/default (轻量级).
|
||||
- 构建类型: userdebug 通常允许在支持调试的镜像上运行 `adb root`。Play Store images 属于生产构建,会阻止 root。
|
||||
- 在 x86_64 主机上,从 API 28+ 起不支持全系统 ARM64 模拟。对于 Android 11+,使用包含 per-app ARM-to-x86 translation 的 Google APIs/Play images 来快速运行许多仅限 ARM 的应用。
|
||||
|
||||
### 来自 CLI 的快照
|
||||
```bash
|
||||
# Save a clean snapshot from the running emulator
|
||||
adb -s emulator-5554 emu avd snapshot save my_clean_setup
|
||||
|
||||
# Boot from a named snapshot (if it exists)
|
||||
emulator -avd PixelRootX86 -writable-system -snapshot my_clean_setup
|
||||
```
|
||||
## ARM→x86 二进制翻译 (Android 11+)
|
||||
|
||||
在 Android 11+ 上,Google APIs 和 Play Store 镜像可以按进程翻译 ARM 应用的二进制文件,同时保持系统其余部分为原生 x86/x86_64。这通常足够快,可以在桌面上测试许多仅支持 ARM 的应用。
|
||||
|
||||
> Tip: 在 pentests 期间优先使用 Google APIs x86/x86_64 镜像。Play images 使用起来方便,但会阻止 `adb root`;只有在你确实需要 Play services 并接受无法获得 root 的情况下才使用它们。
|
||||
|
||||
## Rooting a Play Store device
|
||||
|
||||
如果你下载了带有 Play Store 的设备,你将无法直接获取 root,并且会收到此错误消息
|
||||
如果你下载了带有 Play Store 的设备,你将无法直接获得 root,并且会看到如下错误信息
|
||||
```
|
||||
$ adb root
|
||||
adbd cannot run as root in production builds
|
||||
```
|
||||
使用 [rootAVD](https://github.com/newbit1/rootAVD) 和 [Magisk](https://github.com/topjohnwu/Magisk) 我成功地对其进行了root(可以参考例如 [**这个视频**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) **或** [**这个视频**](https://www.youtube.com/watch?v=qQicUW0svB8))。
|
||||
Using [rootAVD](https://github.com/newbit1/rootAVD) with [Magisk](https://github.com/topjohnwu/Magisk) 我能够对其进行 root(例如参见 [**this video**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) **或** [**this one**](https://www.youtube.com/watch?v=qQicUW0svB8))。
|
||||
|
||||
## 安装 Burp 证书
|
||||
|
||||
查看以下页面以了解如何安装自定义 CA 证书:
|
||||
请查看以下页面以了解如何安装自定义 CA 证书:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
install-burp-certificate.md
|
||||
{{#endref}}
|
||||
|
||||
## 方便的 AVD 选项
|
||||
## 实用的 AVD 选项
|
||||
|
||||
### 拍摄快照
|
||||
### 创建快照
|
||||
|
||||
您可以 **使用 GUI** 随时拍摄虚拟机的快照:
|
||||
你可以**使用 GUI**随时对 VM 创建快照:
|
||||
|
||||
.png>)
|
||||
|
||||
## 参考资料
|
||||
|
||||
- [Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools)
|
||||
- [Android Emulator command line](https://developer.android.com/studio/run/emulator-commandline)
|
||||
- [Run ARM apps on the Android Emulator (x86 translation)](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -10,45 +10,98 @@
|
||||
pip install frida-tools
|
||||
pip install frida
|
||||
```
|
||||
**在安卓中下载并安装** **frida server** ([Download the latest release](https://github.com/frida/frida/releases)).\
|
||||
一行命令以根模式重启adb,连接到它,上传frida-server,给予执行权限并在后台运行:
|
||||
**下载并安装** 在 android 上 **frida server** ([Download the latest release](https://github.com/frida/frida/releases)).\
|
||||
用于重启 adb 到 root 模式、连接到设备、上传 frida-server、赋予 exec 权限并在后台运行的一行命令:
|
||||
```bash
|
||||
adb root; adb connect localhost:6000; sleep 1; adb push frida-server /data/local/tmp/; adb shell "chmod 755 /data/local/tmp/frida-server"; adb shell "/data/local/tmp/frida-server &"
|
||||
```
|
||||
**检查**它是否**正常工作**:
|
||||
**检查** 它是否 **正常工作**:
|
||||
```bash
|
||||
frida-ps -U #List packages and processes
|
||||
frida-ps -U | grep -i <part_of_the_package_name> #Get all the package name
|
||||
```
|
||||
## Frida server 与 Gadget (root vs. no-root)
|
||||
|
||||
使用 Frida 对 Android 应用进行插装的两种常见方法:
|
||||
|
||||
- Frida server (rooted devices): 将一个本地守护进程推送并运行,使你可以附加到任意进程。
|
||||
- Frida Gadget (no root): 将 Frida 作为共享库捆绑到 APK 内,并在目标进程中自动加载它。
|
||||
|
||||
Frida server (rooted)
|
||||
```bash
|
||||
# Download the matching frida-server binary for your device's arch
|
||||
# https://github.com/frida/frida/releases
|
||||
adb root
|
||||
adb push frida-server-<ver>-android-<arch> /data/local/tmp/frida-server
|
||||
adb shell chmod 755 /data/local/tmp/frida-server
|
||||
adb shell /data/local/tmp/frida-server & # run at boot via init/magisk if desired
|
||||
|
||||
# From host, list processes and attach
|
||||
frida-ps -Uai
|
||||
frida -U -n com.example.app
|
||||
```
|
||||
Frida Gadget (no-root)
|
||||
|
||||
1) 解包 APK,添加 gadget .so 和配置:
|
||||
- 将 libfrida-gadget.so 放入 lib/<abi>/(例如 lib/arm64-v8a/)
|
||||
- 创建 assets/frida-gadget.config,包含你用于加载脚本的设置
|
||||
|
||||
示例 frida-gadget.config
|
||||
```json
|
||||
{
|
||||
"interaction": { "type": "script", "path": "/sdcard/ssl-bypass.js" },
|
||||
"runtime": { "logFile": "/sdcard/frida-gadget.log" }
|
||||
}
|
||||
```
|
||||
2) 引用/加载 gadget 以便它尽早被初始化:
|
||||
- 最简单:在 Application.onCreate() 中添加一个小的 Java stub,调用 System.loadLibrary("frida-gadget"),或者使用已存在的 native lib loading。
|
||||
|
||||
3) 重新打包并签名 APK,然后安装:
|
||||
```bash
|
||||
apktool d app.apk -o app_m
|
||||
# ... add gadget .so and config ...
|
||||
apktool b app_m -o app_gadget.apk
|
||||
uber-apk-signer -a app_gadget.apk -o out_signed
|
||||
adb install -r out_signed/app_gadget-aligned-debugSigned.apk
|
||||
```
|
||||
4) 从主机附加到 gadget 进程:
|
||||
```bash
|
||||
frida-ps -Uai
|
||||
frida -U -n com.example.app
|
||||
```
|
||||
注意
|
||||
- Gadget 会被某些防护检测到;如有必要,请保持 名称/路径 隐蔽,并在加载时延后或按条件加载。
|
||||
- 对于加固的 apps,优先使用 rooted testing with server + late attach,或与 Magisk/Zygisk hiding 结合使用。
|
||||
|
||||
## 教程
|
||||
|
||||
### [Tutorial 1](frida-tutorial-1.md)
|
||||
|
||||
**来源**: [https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1](https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1)\
|
||||
**From**: [https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1](https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1)\
|
||||
**APK**: [https://github.com/t0thkr1s/frida-demo/releases](https://github.com/t0thkr1s/frida-demo/releases)\
|
||||
**源代码**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo)
|
||||
**Source Code**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo)
|
||||
|
||||
**请访问[链接阅读](frida-tutorial-1.md)。**
|
||||
**参见 [link to read it](frida-tutorial-1.md).**
|
||||
|
||||
### [Tutorial 2](frida-tutorial-2.md)
|
||||
|
||||
**来源**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (第2、3和4部分)\
|
||||
**APKs和源代码**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples)
|
||||
**From**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Parts 2, 3 & 4)\
|
||||
**APKs and Source code**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples)
|
||||
|
||||
**请访问[链接阅读。](frida-tutorial-2.md)**
|
||||
**参见[ link to read it.](frida-tutorial-2.md)**
|
||||
|
||||
### [Tutorial 3](owaspuncrackable-1.md)
|
||||
|
||||
**来源**: [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)\
|
||||
**From**: [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)\
|
||||
**APK**: [https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk](https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk)
|
||||
|
||||
**请访问[链接阅读](owaspuncrackable-1.md)。**
|
||||
**参见 [link to read it](owaspuncrackable-1.md).**
|
||||
|
||||
**您可以在这里找到更多精彩的Frida脚本:** [**https://codeshare.frida.re/**](https://codeshare.frida.re)
|
||||
**You can find more Awesome Frida scripts here:** [**https://codeshare.frida.re/**](https://codeshare.frida.re)
|
||||
|
||||
## 快速示例
|
||||
|
||||
### 从命令行调用Frida
|
||||
### Calling Frida from command line
|
||||
```bash
|
||||
frida-ps -U
|
||||
|
||||
@ -72,9 +125,9 @@ print('[ * ] Running Frida Demo application')
|
||||
script.load()
|
||||
sys.stdin.read()
|
||||
```
|
||||
### 无参数的函数钩子
|
||||
### Hooking 无参数函数
|
||||
|
||||
钩住类 `sg.vantagepoint.a.c` 的函数 `a()`
|
||||
Hook 类 `sg.vantagepoint.a.c` 的函数 `a()`
|
||||
```javascript
|
||||
Java.perform(function () {
|
||||
; rootcheck1.a.overload().implementation = function() {
|
||||
@ -84,14 +137,14 @@ return false;
|
||||
};
|
||||
});
|
||||
```
|
||||
钩住 java `exit()`
|
||||
拦截 java `exit()`
|
||||
```javascript
|
||||
var sysexit = Java.use("java.lang.System")
|
||||
sysexit.exit.overload("int").implementation = function (var_0) {
|
||||
send("java.lang.System.exit(I)V // We avoid exiting the application :)")
|
||||
}
|
||||
```
|
||||
钩住 MainActivity 的 `.onStart()` 和 `.onCreate()`
|
||||
Hook MainActivity `.onStart()` & `.onCreate()`
|
||||
```javascript
|
||||
var mainactivity = Java.use("sg.vantagepoint.uncrackable1.MainActivity")
|
||||
mainactivity.onStart.overload().implementation = function () {
|
||||
@ -105,7 +158,7 @@ send("MainActivity.onCreate() HIT!!!")
|
||||
var ret = this.onCreate.overload("android.os.Bundle").call(this, var_0)
|
||||
}
|
||||
```
|
||||
钩住 Android `.onCreate()`
|
||||
Hook android 的 `.onCreate()`
|
||||
```javascript
|
||||
var activity = Java.use("android.app.Activity")
|
||||
activity.onCreate.overload("android.os.Bundle").implementation = function (
|
||||
@ -115,9 +168,9 @@ send("Activity HIT!!!")
|
||||
var ret = this.onCreate.overload("android.os.Bundle").call(this, var_0)
|
||||
}
|
||||
```
|
||||
### 使用参数钩住函数并检索值
|
||||
### Hooking 带参数的函数并获取返回值
|
||||
|
||||
钩住一个解密函数。打印输入,调用原始函数解密输入,最后打印明文数据:
|
||||
Hooking a decryption function。打印输入,调用原始函数 decrypt 输入,并最后打印明文数据:
|
||||
```javascript
|
||||
function getString(data) {
|
||||
var ret = ""
|
||||
@ -142,9 +195,9 @@ send("Decrypted flag: " + flag)
|
||||
return ret //[B
|
||||
}
|
||||
```
|
||||
### Hooking functions and calling them with our input
|
||||
### Hooking 函数并使用我们的输入调用它们
|
||||
|
||||
钩住一个接收字符串的函数,并用另一个字符串调用它(来自 [here](https://11x256.github.io/Frida-hooking-android-part-2/))
|
||||
Hook 一个接收 string 的函数,并用另一个 string 调用它(来自 [here](https://11x256.github.io/Frida-hooking-android-part-2/))
|
||||
```javascript
|
||||
var string_class = Java.use("java.lang.String") // get a JS wrapper for java's String class
|
||||
|
||||
@ -157,11 +210,11 @@ console.log("Return value: " + ret)
|
||||
return ret
|
||||
}
|
||||
```
|
||||
### 获取已创建类的对象
|
||||
### 获取已创建的类对象
|
||||
|
||||
如果您想提取已创建对象的某个属性,可以使用这个。
|
||||
如果你想提取已创建对象的某个属性,可以使用下面的方法。
|
||||
|
||||
在这个例子中,您将看到如何获取类 my_activity 的对象,以及如何调用函数 .secret(),该函数将打印对象的私有属性:
|
||||
在这个示例中,你将看到如何获取类 my_activity 的对象以及如何调用函数 .secret() 来打印该对象的私有属性:
|
||||
```javascript
|
||||
Java.choose("com.example.a11x256.frida_test.my_activity", {
|
||||
onMatch: function (instance) {
|
||||
@ -175,7 +228,13 @@ onComplete: function () {},
|
||||
## 其他 Frida 教程
|
||||
|
||||
- [https://github.com/DERE-ad2001/Frida-Labs](https://github.com/DERE-ad2001/Frida-Labs)
|
||||
- [高级 Frida 使用博客系列的第 1 部分:IOS 加密库](https://8ksec.io/advanced-frida-usage-part-1-ios-encryption-libraries-8ksec-blogs/)
|
||||
- [高级 Frida 用法 博客系列 第1部分:IOS 加密库](https://8ksec.io/advanced-frida-usage-part-1-ios-encryption-libraries-8ksec-blogs/)
|
||||
|
||||
|
||||
## 参考资料
|
||||
|
||||
- [构建可复现的 Android Bug Bounty 实验室:Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools)
|
||||
- [Frida Gadget 文档](https://frida.re/docs/gadget/)
|
||||
- [Frida 发布(服务器二进制)](https://github.com/frida/frida/releases)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -2,18 +2,31 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## 通过 ADB 配置系统级代理
|
||||
|
||||
配置一个全局 HTTP 代理,使所有应用的流量通过你的拦截器 (Burp/mitmproxy) 路由:
|
||||
```bash
|
||||
# Set proxy (device/emulator must reach your host IP)
|
||||
adb shell settings put global http_proxy 192.168.1.2:8080
|
||||
|
||||
# Clear proxy
|
||||
adb shell settings put global http_proxy :0
|
||||
```
|
||||
Tip:在 Burp 中,将监听器绑定到 0.0.0.0,这样 LAN 中的设备就可以连接(Proxy -> Options -> Proxy Listeners)。
|
||||
|
||||
## 在虚拟机上
|
||||
|
||||
首先,您需要从 Burp 下载 Der 证书。您可以在 _**Proxy**_ --> _**Options**_ --> _**Import / Export CA certificate**_ 中完成此操作。
|
||||
首先你需要从 Burp 下载 Der 证书。你可以在 _**Proxy**_ --> _**Options**_ --> _**Import / Export CA certificate**_ 中完成此操作。
|
||||
|
||||
.png>)
|
||||
|
||||
**以 Der 格式导出证书**,然后让我们**转换**它为 **Android** 能够**理解**的格式。请注意,**为了在 AVD 的 Android 机器上配置 burp 证书**,您需要**使用** **`-writable-system`** 选项运行此机器。\
|
||||
例如,您可以这样运行:
|
||||
**以 Der 格式导出证书**,然后把它**转换**为 **Android** 能够**识别**的格式。注意,**要在 AVD 中的 Android 机器上配置 Burp 证书**,你需要**使用** **`-writable-system`** 选项**运行**该机器。\
|
||||
例如你可以运行它像:
|
||||
```bash
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system
|
||||
```
|
||||
然后,**配置 burp 的证书**:
|
||||
然后,要 **配置 burps certificate**:
|
||||
```bash
|
||||
openssl x509 -inform DER -in burp_cacert.der -out burp_cacert.pem
|
||||
CERTHASHNAME="`openssl x509 -inform PEM -subject_hash_old -in burp_cacert.pem | head -1`.0"
|
||||
@ -24,39 +37,43 @@ adb shell mv /sdcard/$CERTHASHNAME /system/etc/security/cacerts/ #Move to correc
|
||||
adb shell chmod 644 /system/etc/security/cacerts/$CERTHASHNAME #Assign privileges
|
||||
adb reboot #Now, reboot the machine
|
||||
```
|
||||
一旦**机器完成重启**,Burp 证书将被使用!
|
||||
一旦 **机器完成重启**,Burp 证书就会被其使用!
|
||||
|
||||
## 使用 Magisc
|
||||
|
||||
如果你**用 Magisc 获取了设备的 root 权限**(可能是模拟器),并且你**无法按照**之前的**步骤**安装 Burp 证书,因为**文件系统是只读**的,无法重新挂载为可写,还有另一种方法。
|
||||
If you **rooted your device with Magisc**(可能是模拟器),并且你 **无法按照** 之前的 **步骤** 安装 Burp 证书,因为 **文件系统为只读** 且无法重新挂载为可写,还有另一种方法。
|
||||
|
||||
在[**这个视频**](https://www.youtube.com/watch?v=qQicUW0svB8)中解释,你需要:
|
||||
在 [**这个视频**](https://www.youtube.com/watch?v=qQicUW0svB8) 中讲解,你需要:
|
||||
|
||||
1. **安装 CA 证书**:只需**拖放** DER Burp 证书,**更改扩展名**为 `.crt`,存储在手机的下载文件夹中,然后转到 `Install a certificate` -> `CA certificate`
|
||||
1. **Install a CA certificate**: 只需将 DER 格式的 Burp 证书拖放(将扩展名改为 `.crt`)到手机,使其存储在 Downloads 文件夹中,然后进入 `Install a certificate` -> `CA certificate`
|
||||
|
||||
<figure><img src="../../images/image (53).png" alt="" width="164"><figcaption></figcaption></figure>
|
||||
|
||||
- 检查证书是否正确存储,前往 `Trusted credentials` -> `USER`
|
||||
- 通过进入 `Trusted credentials` -> `USER` 检查证书是否已正确存储
|
||||
|
||||
<figure><img src="../../images/image (54).png" alt="" width="334"><figcaption></figcaption></figure>
|
||||
|
||||
2. **使其系统信任**:下载 Magisc 模块 [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts)(一个 .zip 文件),**拖放到**手机中,前往手机中的**Magics 应用**的**`Modules`**部分,点击**`Install from storage`**,选择 `.zip` 模块,安装完成后**重启**手机:
|
||||
2. **Make it System trusted**: 下载 Magisc 模块 [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts)(一个 .zip 文件),将其拖放到手机,打开手机上的 Magics app,进入 **`Modules`** 部分,点击 **`Install from storage`**,选择该 `.zip` 模块,安装完成后 **重启** 手机:
|
||||
|
||||
<figure><img src="../../images/image (55).png" alt="" width="345"><figcaption></figcaption></figure>
|
||||
|
||||
- 重启后,前往 `Trusted credentials` -> `SYSTEM`,检查 Postswigger 证书是否存在
|
||||
- 重启后,进入 `Trusted credentials` -> `SYSTEM` 并检查 Postswigger cert 是否存在
|
||||
|
||||
<figure><img src="../../images/image (56).png" alt="" width="314"><figcaption></figcaption></figure>
|
||||
|
||||
## Android 14 后
|
||||
### Learn how to create a Magisc module
|
||||
|
||||
在最新的 Android 14 版本中,系统信任的证书颁发机构(CA)证书的处理方式发生了重大变化。以前,这些证书存放在 **`/system/etc/security/cacerts/`**,可以被具有 root 权限的用户访问和修改,从而允许在系统中立即应用。然而,在 Android 14 中,存储位置已移至 **`/apex/com.android.conscrypt/cacerts`**,这是 **`/apex`** 路径中的一个目录,天生是不可变的。
|
||||
查看 [https://medium.com/@justmobilesec/magisk-for-mobile-pentesting-rooting-android-devices-and-building-custom-modules-part-ii-22badc498437](https://medium.com/@justmobilesec/magisk-for-mobile-pentesting-rooting-android-devices-and-building-custom-modules-part-ii-22badc498437)
|
||||
|
||||
尝试将 **APEX cacerts 路径**重新挂载为可写时会失败,因为系统不允许此类操作。即使尝试卸载或用临时文件系统(tmpfs)覆盖该目录也无法规避不可变性;应用程序继续访问原始证书数据,无论文件系统级别的更改如何。这种韧性是由于 **`/apex`** 挂载配置为 PRIVATE 传播,确保 **`/apex`** 目录中的任何修改不会影响其他进程。
|
||||
## Post Android 14
|
||||
|
||||
Android 的初始化涉及 `init` 进程,该进程在启动操作系统时还会启动 Zygote 进程。该进程负责以新的挂载命名空间启动应用程序进程,其中包括一个私有的 **`/apex`** 挂载,从而将对该目录的更改与其他进程隔离。
|
||||
在最新的 Android 14 版本中,对系统信任的证书颁发机构 (CA) 证书的处理方式发生了重大变化。之前,这些证书存放在 **`/system/etc/security/cacerts/`**,具有 root 权限的用户可以访问并修改它们,从而能够立即在整个系统中生效。然而,在 Android 14 中,存储位置已迁移到 **`/apex/com.android.conscrypt/cacerts`**,这是 **`/apex`** 路径内的目录,天生为不可变。
|
||||
|
||||
然而,对于需要修改 **`/apex`** 目录中系统信任的 CA 证书的人来说,存在一种解决方法。这涉及手动重新挂载 **`/apex`** 以移除 PRIVATE 传播,从而使其可写。该过程包括将 **`/apex/com.android.conscrypt`** 的内容复制到另一个位置,卸载 **`/apex/com.android.conscrypt`** 目录以消除只读约束,然后将内容恢复到 **`/apex`** 中的原始位置。此方法需要迅速行动以避免系统崩溃。为了确保这些更改在系统范围内生效,建议重启 `system_server`,这有效地重启所有应用程序并使系统恢复到一致状态。
|
||||
试图将 **APEX cacerts path** 重新挂载为可写会失败,系统不允许此类操作。即使尝试卸载或用临时文件系统 (tmpfs) 覆盖该目录,也无法绕过这种不可变性;应用程序仍会访问原始证书数据,而不受文件系统层面更改的影响。这种强韧性来自 **`/apex`** 挂载被配置为具有 PRIVATE propagation,确保 **`/apex`** 目录内的任何修改不会影响其他进程。
|
||||
|
||||
Android 的初始化涉及 `init` 进程,该进程在启动操作系统时还会启动 Zygote 进程。Zygote 负责以包含私有 **`/apex`** 挂载的新挂载命名空间启动应用进程,从而将对该目录的更改与其他进程隔离开来。
|
||||
|
||||
不过,对于需要修改 **`/apex`** 目录中系统信任 CA 证书的情况,存在一种变通方法。该方法涉及手动重新挂载 **`/apex`** 以移除 PRIVATE propagation,从而使其可写。具体流程包括将 **`/apex/com.android.conscrypt`** 的内容复制到其他位置,卸载 **`/apex/com.android.conscrypt`** 目录以消除只读限制,然后将内容恢复到 **`/apex`** 中的原始位置。该方法需要快速操作以避免系统崩溃。为确保这些更改在系统范围内生效,建议重启 `system_server`,这将有效重启所有应用并使系统恢复一致状态。
|
||||
```bash
|
||||
# Create a separate temp directory, to hold the current certificates
|
||||
# Otherwise, when we add the mount we can't read the current certs anymore.
|
||||
@ -114,28 +131,26 @@ wait # Launched in parallel - wait for completion here
|
||||
|
||||
echo "System certificate injected"
|
||||
```
|
||||
### 通过 NSEnter 绑定挂载
|
||||
### 通过 NSEnter 进行 Bind-mounting
|
||||
|
||||
1. **设置可写目录**:最初,通过在现有非 APEX 系统证书目录上挂载 `tmpfs` 来建立一个可写目录。可以使用以下命令实现:
|
||||
1. **设置可写目录**:最初,通过在现有的非-APEX 系统证书目录上方挂载 `tmpfs` 来建立一个可写目录。通过以下命令实现:
|
||||
```bash
|
||||
mount -t tmpfs tmpfs /system/etc/security/cacerts
|
||||
```
|
||||
2. **准备 CA 证书**:在设置可写目录后,应该将打算使用的 CA 证书复制到该目录中。这可能涉及从 `/apex/com.android.conscrypt/cacerts/` 复制默认证书。必须相应地调整这些证书的权限和 SELinux 标签。
|
||||
3. **为 Zygote 绑定挂载**:利用 `nsenter`,进入 Zygote 的挂载命名空间。Zygote 作为负责启动 Android 应用程序的进程,需要此步骤以确保所有随后启动的应用程序使用新配置的 CA 证书。使用的命令是:
|
||||
2. **Preparing CA Certificates**: 在设置可写目录之后,应将打算使用的 CA 证书复制到该目录。 这可能涉及从 `/apex/com.android.conscrypt/cacerts/` 复制默认证书。 必须相应地调整这些证书的权限和 SELinux 标签。
|
||||
3. **Bind Mounting for Zygote**: 使用 `nsenter` 进入 Zygote 的 mount namespace。Zygote 是负责启动 Android 应用的进程,需要这一步以确保此后启动的所有应用都会使用新配置的 CA 证书。 使用的命令为:
|
||||
```bash
|
||||
nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
|
||||
```
|
||||
这确保每个新启动的应用程序将遵循更新的 CA 证书设置。
|
||||
|
||||
4. **将更改应用于正在运行的应用程序**:要将更改应用于已经运行的应用程序,再次使用 `nsenter` 逐个进入每个应用程序的命名空间并执行类似的绑定挂载。必要的命令是:
|
||||
4. **将更改应用于正在运行的应用程序**: 要将更改应用到已运行的应用程序,使用 `nsenter` 再次单独进入每个应用的命名空间并执行类似的 bind mount。所需的命令是:
|
||||
```bash
|
||||
nsenter --mount=/proc/$APP_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
|
||||
```
|
||||
5. **替代方法 - 软重启**:一种替代方法涉及在 `init` 进程 (PID 1) 上执行绑定挂载,然后使用 `stop && start` 命令对操作系统进行软重启。这种方法将更改传播到所有命名空间,避免了单独处理每个正在运行的应用程序的需要。然而,由于重启的不便,这种方法通常不太受欢迎。
|
||||
5. **Alternative Approach - Soft Reboot**: 另一种方法是在 `init` 进程(PID 1)上执行 bind mount,然后通过 `stop && start` 命令对操作系统进行 soft reboot。该方法会将更改传播到所有 namespaces,避免逐个处理每个正在运行的 app。不过,由于需要重启,通常不太推荐。
|
||||
|
||||
## References
|
||||
|
||||
- [https://httptoolkit.com/blog/android-14-install-system-ca-certificate/](https://httptoolkit.com/blog/android-14-install-system-ca-certificate/)
|
||||
|
||||
- [Android 14: Install a system CA certificate on a rooted device](https://httptoolkit.com/blog/android-14-install-system-ca-certificate/)
|
||||
- [Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user