# Android 应用程序渗透测试
从零开始学习 AWS 黑客技术,成为专家 htARTE(HackTricks AWS 红队专家)!
支持 HackTricks 的其他方式:
* 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 PDF 版本的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live) 上**关注**我们。
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
加入 [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 服务器,与经验丰富的黑客和赏金猎人交流!
**黑客见解**\
参与深入探讨黑客的刺激和挑战的内容
**实时黑客新闻**\
通过实时新闻和见解及时了解快节奏的黑客世界
**最新公告**\
了解最新的赏金计划发布和重要平台更新
**加入我们的** [**Discord**](https://discord.com/invite/N3FrSbmwdy),立即与顶尖黑客合作!
## Android 应用程序基础知识
强烈建议阅读此页面,了解与 Android 安全相关的**最重要部分**以及 Android 应用程序中**最危险的组件**:
{% content-ref url="android-applications-basics.md" %}
[android-applications-basics.md](android-applications-basics.md)
{% endcontent-ref %}
## ADB(Android 调试桥)
这是连接到 Android 设备(模拟或实体)所需的主要工具。\
**ADB** 允许从计算机通过**USB**或**网络**控制设备。此实用程序使得可以**双向复制**文件,**安装**和**卸载**应用程序,**执行** shell 命令,**备份**数据,**读取**日志等功能。
查看以下[**ADB 命令**](adb-commands.md)列表,了解如何使用 adb。
## Smali
有时修改应用程序代码以访问**隐藏信息**(也许是经过良好混淆的密码或标志)是很有趣的。然后,可能需要对 apk 进行反编译,修改代码并重新编译它。\
[**在本教程中**,您可以**学习如何反编译 APK,修改 Smali 代码并重新编译 APK**以添加新功能](smali-changes.md)。这在**动态分析期间的多个测试**中可能非常有用。因此,**始终记住这种可能性**。
## 其他有趣的技巧
* [欺骗 Play 商店中的位置](spoofing-your-location-in-play-store.md)
* **下载 APK**:[https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/),[https://apkpure.com/es/](https://apkpure.com/es/),[https://www.apkmirror.com/](https://www.apkmirror.com),[https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/)
* 从设备中提取 APK:
```bash
adb shell pm list packages
com.android.insecurebankv2
adb shell pm path com.android.insecurebankv2
package:/data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk
adb pull /data/app/com.android.insecurebankv2- Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk
```
## 静态分析
首先,要分析一个APK,你应该使用反编译器查看Java代码。\
请[**在这里阅读有关不同可用反编译器的信息**](apk-decompilers.md)。
### 寻找有趣的信息
仅仅查看APK的**字符串**,你就可以搜索**密码**,**URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)),**API**密钥,**加密**,**蓝牙UUID**,**令牌**以及任何有趣的内容... 甚至查找代码执行**后门**或身份验证后门(应用中硬编码的管理员凭据)。
**Firebase**
特别注意**Firebase URL**,并检查其是否配置不当。[在这里了解有关Firebase是什么以及如何利用它的更多信息。](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
### 应用程序的基本理解 - Manifest.xml,strings.xml
对应用程序的**_Manifest.xml_**和**_strings.xml_**文件的检查可以揭示潜在的安全漏洞。可以使用反编译器访问这些文件,或者将APK文件扩展名重命名为.zip,然后解压缩它。
从**Manifest.xml**中识别的**漏洞**包括:
- **可调试应用程序**:在_Manifest.xml_文件中设置为可调试(`debuggable="true"`)的应用程序存在风险,因为它们允许可能导致利用的连接。要进一步了解如何利用可调试应用程序,请参考有关在设备上查找和利用可调试应用程序的教程。
- **备份设置**:对于处理敏感信息的应用程序,应明确设置`android:allowBackup="false"`属性,以防止通过adb进行未经授权的数据备份,特别是当启用了USB调试时。
- **网络安全**:在_res/xml/_中的自定义网络安全配置(`android:networkSecurityConfig="@xml/network_security_config"`)可以指定安全详细信息,如证书固定和HTTP流量设置。一个示例是允许特定域的HTTP流量。
- **导出的活动和服务**:在清单中识别导出的活动和服务可以突出显示可能被滥用的组件。在动态测试期间进行进一步分析可以揭示如何利用这些组件。
- **内容提供程序和FileProviders**:暴露的内容提供程序可能允许未经授权访问或修改数据。还应仔细审查FileProviders的配置。
- **广播接收器和URL方案**:这些组件可能被利用进行攻击,特别要注意URL方案的管理方式,以防止输入漏洞。
- **SDK版本**:`minSdkVersion`,`targetSDKVersion`和`maxSdkVersion`属性指示支持的Android版本,强调不支持过时、易受攻击的Android版本的重要性。
从**strings.xml**文件中,可以发现诸如API密钥、自定义模式和其他开发者注释等敏感信息,强调了对这些资源进行仔细审查的必要性。
### Tapjacking
**Tapjacking**是一种攻击,其中启动一个**恶意应用程序**,并**将其定位在受害者应用程序的顶部**。一旦它明显遮挡了受害者应用程序,其用户界面被设计成以一种方式欺骗用户与其交互,同时将交互传递给受害者应用程序。\
实际上,它**使用户无法知道他们实际上是在受害者应用程序上执行操作**。
在以下找到更多信息:
{% content-ref url="tapjacking.md" %}
[tapjacking.md](tapjacking.md)
{% endcontent-ref %}
### 任务劫持
将**`launchMode`**设置为**`singleTask`**且未定义任何`taskAffinity`的**活动**容易受到任务劫持的影响。这意味着,如果在真实应用程序之前安装并启动应用程序,则它可以**劫持真实应用程序的任务**(因此用户将与**恶意应用程序交互,以为自己在使用真实应用程序**)。
在以下找到更多信息:
{% content-ref url="android-task-hijacking.md" %}
[android-task-hijacking.md](android-task-hijacking.md)
{% endcontent-ref %}
### 不安全的数据存储
**内部存储**
在Android中,存储在**内部**存储中的文件**设计为仅由创建它们的应用程序访问**。这一安全措施由Android操作系统强制执行,通常足以满足大多数应用程序的安全需求。然而,开发人员有时会使用`MODE_WORLD_READABLE`和`MODE_WORLD_WRITABLE`等模式,以**允许**文件在不同应用程序之间**共享**。然而,这些模式**不限制**其他应用程序(包括潜在恶意应用程序)访问这些文件。
1. **静态分析:**
* **确保**仔细审查对`MODE_WORLD_READABLE`和`MODE_WORLD_WRITABLE`的使用。这些模式**可能会使**文件**面临意外或未经授权的访问**。
2. **动态分析:**
* **验证**应用程序创建的文件设置的权限。特别是,**检查**是否有任何文件被**设置为全球可读或可写**。这可能构成重大安全风险,因为它将允许设备上安装的**任何应用程序**读取或修改这些文件,而不考虑其来源或意图。
**外部存储**
处理外部存储(如SD卡)上的文件时,应采取一些预防措施:
1. **可访问性**:
* 外部存储上的文件是**全局可读和可写**的。这意味着任何应用程序或用户都可以访问这些文件。
2. **安全问题**:
* 鉴于访问的便利性,建议**不要在外部存储上存储敏感信息**。
* 外部存储可以被移除或任何应用程序访问,使其不太安全。
3. **处理来自外部存储的数据**:
* 始终对从外部存储检索的数据执行输入验证。这是至关重要的,因为数据来自不受信任的来源。
* 强烈建议不要在外部存储上存储可执行文件或类文件以进行动态加载。
* 如果您的应用程序必须从外部存储检索可执行文件,请确保在动态加载之前对这些文件进行**签名和加密验证**。这一步对于维护应用程序的安全完整性至关重要。
外部存储可以在`/storage/emulated/0`,`/sdcard`,`/mnt/sdcard`中**访问**。
{% hint style="info" %}
从Android 4.4(**API 17**)开始,SD卡具有目录结构,**限制应用程序对专门用于该应用程序的目录的访问**。这可以防止恶意应用程序读取或写入另一个应用程序的文件。
{% endhint %}
**明文存储的敏感数据**
* **共享首选项**:Android允许每个应用程序轻松保存xml文件在路径`/data/data//shared_prefs/`中,有时可能在该文件夹中找到明文存储的敏感信息。
* **数据库**:Android允许每个应用程序轻松保存sqlite数据库在路径`/data/data//databases/`中,有时可能在该文件夹中找到明文存储的敏感信息。
```java
SSLSocketFactory sf = new cc(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
```
### 破解密码
**密钥管理流程不当**
一些开发人员会将敏感数据保存在本地存储中,并使用在代码中硬编码/可预测的密钥对其进行加密。这样做是不应该的,因为一些逆向工程可能会使攻击者提取机密信息。
**使用不安全和/或已弃用的算法**
开发人员不应该使用**已弃用的算法**来执行授权**检查**,**存储**或**发送**数据。一些这些算法包括:RC4、MD4、MD5、SHA1...例如,如果要使用哈希来存储密码,应该使用具有盐的哈希抗暴力**攻击**。
### 其他检查
* 建议对APK进行**混淆**,以增加逆向工程的难度。
* 如果应用程序很敏感(如银行应用程序),应该执行**自己的检查以查看手机是否已获取root权限**,并相应地采取行动。
* 如果应用程序很敏感(如银行应用程序),应该检查是否正在使用**模拟器**。
* 如果应用程序很敏感(如银行应用程序),应该在执行之前**检查自身的完整性**,以查看是否已被修改。
* 使用[**APKiD**](https://github.com/rednaga/APKiD)来检查构建APK时使用了哪种编译器/打包程序/混淆器
### React Native 应用程序
阅读以下页面,了解如何轻松访问React应用程序的JavaScript代码:
{% content-ref url="react-native-application.md" %}
[react-native-application.md](react-native-application.md)
{% endcontent-ref %}
### Xamarin 应用程序
阅读以下页面,了解如何轻松访问Xamarin应用程序的C#代码:
{% content-ref url="../xamarin-apps.md" %}
[xamarin-apps.md](../xamarin-apps.md)
{% endcontent-ref %}
### 超级打包应用程序
根据这篇[**博客文章**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/),超级打包是一种将应用程序内容压缩到单个文件中的元算法。该博客讨论了创建一个可以解压这些应用程序的应用程序的可能性...以及一种更快的方法,即**执行应用程序并从文件系统中收集解压后的文件**。
### 自动静态代码分析
工具[**mariana-trench**](https://github.com/facebook/mariana-trench)能够通过**扫描**应用程序的**代码**来发现**漏洞**。该工具包含一系列**已知源**(指示工具**用户控制的输入位置**)、**漏洞**(指示工具**危险位置**,恶意用户输入可能造成损害)和**规则**。这些规则指示了**源-漏洞**的**组合**,指示了漏洞。
有了这些知识,**mariana-trench将审查代码并找出可能存在的漏洞**。
### 泄露的机密信息
应用程序可能包含内部的机密信息(API密钥、密码、隐藏的URL、子域...),您可以使用诸如[https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks)之类的工具来发现。
### 绕过生物识别身份验证
{% content-ref url="bypass-biometric-authentication-android.md" %}
[bypass-biometric-authentication-android.md](bypass-biometric-authentication-android.md)
{% endcontent-ref %}
### 其他有趣的功能
* **代码执行**:`Runtime.exec(), ProcessBuilder(), native code:system()`
* **发送短信**:`sendTextMessage, sendMultipartTestMessage`
* 声明为`native`的**本机函数**:`public native, System.loadLibrary, System.load`
* [阅读此内容以了解如何**反向工程本机函数**](reversing-native-libraries.md)
### **其他技巧**
{% content-ref url="content-protocol.md" %}
[content-protocol.md](content-protocol.md)
{% endcontent-ref %}
***
加入[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy)服务器,与经验丰富的黑客和赏金猎人交流!
**黑客见解**\
参与深入探讨黑客活动的刺激和挑战
**实时黑客新闻**\
通过实时新闻和见解及时了解快节奏的黑客世界
**最新公告**\
随时了解最新的赏金任务发布和重要平台更新
**加入我们的** [**Discord**](https://discord.com/invite/N3FrSbmwdy),立即与顶尖黑客合作!
***
## 动态分析
> 首先,您需要一个环境,可以在其中安装应用程序和所有环境(主要是Burp CA证书、Drozer和Frida)。因此,极力推荐使用已获取root权限的设备(模拟器或非模拟器)。
### 在线动态分析
您可以在[https://appetize.io/](https://appetize.io)创建一个**免费账户**。该平台允许您**上传**和**执行**APK文件,因此对于查看apk的行为非常有用。
您甚至可以在网络中**查看应用程序的日志**,并通过**adb**进行连接。
![](<../../.gitbook/assets/image (60).png>)
通过ADB连接,您可以在模拟器中使用**Drozer**和**Frida**。
### 本地动态分析
#### 使用模拟器
* [**Android Studio**](https://developer.android.com/studio)(您可以创建**x86**和**arm**设备,根据[**此**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)最新的x86版本**支持ARM库**,无需使用速度较慢的arm模拟器)。
* 了解如何在此页面中设置:
{% content-ref url="avd-android-virtual-device.md" %}
[avd-android-virtual-device.md](avd-android-virtual-device.md)
{% endcontent-ref %}
* [**Genymotion**](https://www.genymotion.com/fun-zone/) **(免费版本:**个人版,您需要创建一个帐户。_建议**下载**带有_**VirtualBox**_的版本,以避免潜在错误。_)
* [**Nox**](https://es.bignox.com)(免费,但不支持Frida或Drozer)。
{% hint style="info" %}
在任何平台上创建新模拟器时,请记住屏幕越大,模拟器运行速度越慢。因此,尽可能选择小屏幕。
{% endhint %}
要在Genymotion中**安装谷歌服务**(如应用商店),您需要单击以下图像中标记为红色的按钮:
![](<../../.gitbook/assets/image (200) (1).png>)
此外,请注意,在Genymotion中的**Android VM配置**中,您可以选择**桥接网络模式**(如果您将从具有工具的不同VM连接到Android VM,则这将非常有用)。
#### 使用物理设备
您需要激活**调试**选项,如果可以**root**它会更好:
1. 进入**设置**。
2. (从Android 8.0开始) 选择**系统**。
3. 选择**关于手机**。
4. 连续点击**版本号** 7次。
5. 返回,您将找到**开发者选项**。
> 安装应用程序后,首先要做的事情是尝试并调查其功能,了解其工作原理,并熟悉它。\
> 我建议使用MobSF动态分析 + pidcat进行**初始动态分析**,这样我们就能在MobSF捕获大量有趣的**数据**的同时**学习应用程序的工作方式**,稍后可以查看这些数据。
### 非预期数据泄漏
**日志记录**
开发人员应谨慎公开**调试信息**,因为这可能导致敏感数据泄漏。推荐使用工具[**pidcat**](https://github.com/JakeWharton/pidcat)和`adb logcat`来监视应用程序日志,以识别和保护敏感信息。**Pidcat**因其易用性和可读性而受到青睐。
{% hint style="warning" %}
请注意,从**Android 4.0之后的版本**开始,**应用程序只能访问自己的日志**。因此,应用程序无法访问其他应用程序的日志。\
无论如何,仍建议**不要记录敏感信息**。
{% endhint %}
**复制/粘贴缓存**
Android的基于**剪贴板**的框架使应用程序能够实现复制粘贴功能,但存在风险,因为**其他应用程序**可以**访问**剪贴板,可能会暴露敏感数据。对于应用程序中的敏感部分(如信用卡详细信息),**禁用复制/粘贴**功能至关重要,以防止数据泄漏。
**崩溃日志**
如果应用程序**崩溃并保存日志**,这些日志可以帮助攻击者,特别是当无法对应用程序进行逆向工程时。为降低此风险,请避免在崩溃时记录日志,如果必须通过网络传输日志,请确保通过SSL通道发送以确保安全性。
作为渗透测试人员,**尝试查看这些日志**。
**发送给第三方的分析数据**
应用程序通常集成诸如Google Adsense之类的服务,由于开发人员实施不当,可能会意外**泄漏敏感数据**。为了识别潜在的数据泄漏,建议**拦截应用程序的流量**,检查是否向第三方服务发送了任何敏感信息。
### SQLite数据库
大多数应用程序将使用**内部SQLite数据库**保存信息。在渗透测试期间,查看创建的**数据库**、**表**和**列**的名称以及所有保存的**数据**,因为您可能会发现**敏感信息**(这可能是一个漏洞)。\
数据库应位于`/data/data/the.package.name/databases`,如`/data/data/com.mwr.example.sieve/databases`
如果数据库保存了机密信息并且已**加密**,但您可以在应用程序内找到**密码**,这仍然是一个**漏洞**。
使用`.tables`列出表,使用`.schema `列出表的列。
### Drozer(利用活动、内容提供程序和服务)
来自[Drozer文档](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf):**Drozer**允许您**扮演Android应用程序的角色**并与其他应用程序交互。它可以执行已安装应用程序可以执行的任何操作,例如利用Android的进程间通信(IPC)机制并与底层操作系统交互。\
Drozer是一个有用的工具,可用于**利用导出的活动、导出的服务和内容提供程序**,您将在以下部分中了解更多信息。
### 利用导出的活动
[**阅读此内容以了解什么是Android活动。**](android-applications-basics.md#launcher-activity-and-other-activities)\
还要记住,活动的代码从**`onCreate`**方法开始。
**授权绕过**
当活动被导出时,您可以从外部应用程序调用其屏幕。因此,如果具有**敏感信息**的活动被**导出**,您可以**绕过****身份验证**机制**访问它**。
[**学习如何使用Drozer利用导出的活动。**](drozer-tutorial/#activities)
您还可以通过adb启动导出的活动:
* 包名为com.example.demo
* 导出的活动名为com.example.test.MainActivity
```bash
adb shell am start -n com.example.demo/com.example.test.MainActivity
```
**注意**:MobSF 将检测在活动中使用 `android:launchMode` 作为 **`singleTask/singleInstance`** 为恶意,但由于 [此处](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750),显然这只在旧版本(API 版本 < 21)上危险。
{% hint style="info" %}
请注意,授权绕过并不总是漏洞,这取决于绕过的方式以及暴露了哪些信息。
{% endhint %}
**敏感信息泄露**
**活动也可以返回结果**。如果您找到一个已导出且未受保护的活动调用 **`setResult`** 方法并**返回敏感信息**,那就存在敏感信息泄露。
#### 点击劫持
如果未防止点击劫持,您可以滥用已导出的活动来使用户执行意外操作。有关 [**点击劫持是什么,请查看链接**](./#tapjacking) 获取更多信息。
### 利用内容提供程序 - 访问和操纵敏感信息
[**如果您想了解内容提供程序是什么,请阅读此内容。**](android-applications-basics.md#content-provider)\
内容提供程序基本上用于**共享数据**。如果应用程序有可用的内容提供程序,您可能能够从中**提取敏感**数据。还有测试可能的**SQL 注入**和**路径遍历**也很有趣,因为它们可能存在漏洞。
[**学习如何使用 Drozer 利用内容提供程序。**](drozer-tutorial/#content-providers)
### **利用服务**
[**如果您想了解服务是什么,请阅读此内容。**](android-applications-basics.md#services)\
请记住,服务的操作始于 `onStartCommand` 方法。
服务基本上是可以**接收数据**,**处理**它并**返回**(或不返回)响应的东西。因此,如果应用程序正在导出某些服务,您应该**检查**代码以了解其功能,并**动态测试**以提取机密信息、绕过身份验证措施等...\
[**学习如何使用 Drozer 利用服务。**](drozer-tutorial/#services)
### **利用广播接收器**
[**如果您想了解广播接收器是什么,请阅读此内容。**](android-applications-basics.md#broadcast-receivers)\
请记住,广播接收器的操作始于 `onReceive` 方法。
广播接收器将等待某种类型的消息。根据接收器处理消息的方式,它可能存在漏洞。\
[**学习如何使用 Drozer 利用广播接收器。**](./#exploiting-broadcast-receivers)
### **利用方案 / 深层链接**
您可以手动查找深层链接,使用诸如 MobSF 这样的工具或类似 [此工具](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py) 的脚本。\
您可以使用 **adb** 或 **浏览器** 打开已声明的 **scheme**:
{% code overflow="wrap" %}
```bash
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
```
{% endcode %}
_请注意,您可以**省略包名称**,手机将自动调用应该打开该链接的应用程序。_
{% code overflow="wrap" %}
```markup
Click me
with alternative
```
{% endcode %}
**执行的代码**
要找到在应用中执行的**代码**,请转到由深度链接调用的活动,并搜索函数**`onNewIntent`**。
![](<../../.gitbook/assets/image (436) (1) (1) (1).png>)
**敏感信息**
每次找到一个深度链接,请检查它是否通过URL参数接收敏感数据(如密码),因为任何其他应用程序都可能**冒充深度链接并窃取这些数据!**
**路径中的参数**
您还必须检查任何深度链接是否在URL路径中使用参数,例如:`https://api.example.com/v1/users/{username}`,在这种情况下,您可以强制进行路径遍历,访问类似于:`example://app/users?username=../../unwanted-endpoint%3fparam=value`。\
请注意,如果您在应用程序中找到正确的端点,您可能会导致**开放式重定向**(如果路径的一部分用作域名)、**账户接管**(如果您可以修改用户详细信息而无需CSRF令牌,并且易受攻击的端点使用了正确的方法)和任何其他漏洞。有关此内容的更多[信息请点击这里](http://dphoeniixx.com/2020/12/13-2/)。
**更多示例**
一个关于链接的[有趣的漏洞赏金报告](https://hackerone.com/reports/855618)(_/.well-known/assetlinks.json_)。
### 传输层检查和验证失败
* Android 应用程序通常**未正确检查证书**,常见情况是这些应用程序忽略警告并接受自签名证书,或者在某些情况下回退到使用HTTP连接。
* SSL/TLS 握手期间的**协商有时很薄弱**,使用不安全的密码套件。这种漏洞使连接容易受到中间人(MITM)攻击的影响,允许攻击者解密数据。
* 当应用程序使用安全通道进行身份验证,然后通过非安全通道进行其他交易时,**私人信息泄霏**是一个风险。这种方法未能保护敏感数据,如会话 cookie 或用户详细信息,免受恶意实体的拦截。
#### 证书验证
我们将重点关注**证书验证**。必须验证服务器证书的完整性以增强安全性。这很关键,因为不安全的 TLS 配置和通过未加密通道传输敏感数据可能带来重大风险。有关验证服务器证书和解决漏洞的详细步骤,[**此资源**](https://manifestsecurity.com/android-application-security-part-10/)提供了全面的指导。
#### SSL Pinning
SSL Pinning 是一种安全措施,应用程序会将服务器证书与应用程序内部存储的已知副本进行验证。这种方法对于防止 MITM 攻击至关重要。强烈建议为处理敏感信息的应用程序实施 SSL Pinning。
#### 流量检查
要检查 HTTP 流量,必须**安装代理工具的证书**(例如 Burp)。如果不安装此证书,加密流量可能无法通过代理查看。有关安装自定义 CA 证书的指南,[**点击这里**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine)。
针对**API 级别 24 及以上**的应用程序需要修改网络安全配置以接受代理的 CA 证书。这一步对于检查加密流量至关重要。有关修改网络安全配置的说明,[**请参考此教程**](make-apk-accept-ca-certificate.md)。
#### 绕过 SSL Pinning
当实施 SSL Pinning 时,绕过它以检查 HTTPS 流量变得必要。有多种方法可用于此目的:
* 使用[**apk-mitm**](https://github.com/shroudedcode/apk-mitm)自动**修改** **apk** 以**绕过** SSLPinning。这种选择的最大优势是,您无需 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 动态分析**自动绕过 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)
#### 寻找常见 Web 漏洞
还重要的是在应用程序中寻找常见的 Web 漏洞。有关识别和缓解这些漏洞的详细信息超出了本摘要的范围,但在其他地方有广泛的覆盖。
### Frida
[Frida](https://www.frida.re) 是一个供开发人员、逆向工程师和安全研究人员使用的动态检测工具包。\
**您可以访问正在运行的应用程序并在运行时挂钩方法以更改行为、更改值、提取值、运行不同的代码...**\
如果您想对 Android 应用程序进行渗透测试,您需要了解如何使用 Frida。
* 学习如何使用 Frida:[**Frida 教程**](frida-tutorial/)
* 一些用于与 Frida 交互的“GUI”:[**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
* Ojection 是自动化使用 Frida 的好工具:[**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
* 您可以在这里找到一些很棒的 Frida 脚本:[**https://codeshare.frida.re/**](https://codeshare.frida.re)
### **Dump Memory - Fridump**
检查应用程序是否在内存中存储不应该存储的敏感信息,如密码或助记词。
使用[**Fridump3**](https://github.com/rootbsd/fridump3)可以倾倒应用程序的内存:
```bash
# With PID
python3 fridump3.py -u
# With name
frida-ps -Uai
python3 fridump3.py -u ""
```
这将在./dump文件夹中转储内存,然后您可以使用类似以下方式进行grep:
{% code overflow="wrap" %}
```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]+$"
```
{% endcode %}
### **Keystore中的敏感数据**
在Android中,Keystore是存储敏感数据的最佳位置,但是即使有足够的权限,仍然**可能访问它**。由于应用程序倾向于在此处以明文形式存储**敏感数据**,因此渗透测试应该以root用户或者有物理访问设备权限的人员身份检查它,因为这些人可能能够窃取这些数据。
即使应用程序将数据存储在keystore中,数据也应该是加密的。
要访问keystore中的数据,您可以使用此Frida脚本:[https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js)
```bash
frida -U -f com.example.app -l frida-scripts/tracer-cipher.js
```
### **指纹/生物识别绕过**
使用以下Frida脚本,可能可以绕过Android应用程序可能正在执行的**用于保护某些敏感区域的指纹认证:**
{% code overflow="wrap" %}
```bash
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f
```
### **背景图片**
当你将一个应用程序放入后台时,Android会存储该应用程序的**快照**,因此当应用程序恢复到前台时,它会在加载应用程序之前加载图像,使得应用程序看起来加载得更快。
然而,如果这个快照包含**敏感信息**,那么拥有快照访问权限的人可能会**窃取这些信息**(请注意,您需要 root 权限才能访问)。
这些快照通常存储在:**`/data/system_ce/0/snapshots`**
Android提供了一种方法来**通过设置FLAG_SECURE布局参数来防止截屏**。通过使用此标志,窗口内容被视为安全内容,防止其出现在截屏中或在非安全显示器上查看。
```bash
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
```
### **Android应用程序分析器**
这个工具可以帮助您在动态分析过程中管理不同的工具:[https://github.com/NotSoSecure/android\_application\_analyzer](https://github.com/NotSoSecure/android\_application\_analyzer)
### Intent注入
开发人员经常创建代理组件,如活动、服务和广播接收器,用于处理这些Intent并将它们传递给诸如`startActivity(...)`或`sendBroadcast(...)`等方法,这可能存在风险。
危险在于允许攻击者通过误导这些Intent来触发非导出的应用组件或访问敏感内容提供者。一个值得注意的例子是`WebView`组件通过`Intent.parseUri(...)`将URL转换为`Intent`对象,然后执行它们,可能导致恶意Intent注入。
### 主要要点
* **Intent注入**类似于Web的开放重定向问题。
* 利用涉及将`Intent`对象作为额外参数传递,可以重定向执行不安全的操作。
* 它可以使非导出组件和内容提供者暴露给攻击者。
* `WebView`的URL到`Intent`转换可以促成意外操作。
### Android客户端注入和其他漏洞
您可能已经从Web了解到这种类型的漏洞。在Android应用程序中,您必须特别注意以下漏洞:
* **SQL注入:**在处理动态查询或内容提供者时,请确保使用参数化查询。
* **JavaScript注入(XSS):**验证任何WebViews是否已禁用JavaScript和插件支持(默认情况下已禁用)。[更多信息请参见此处](webview-attacks.md#javascript-enabled)。
* **本地文件包含:**WebViews应禁用对文件系统的访问(默认情况下已启用)- `(webview.getSettings().setAllowFileAccess(false);)`。[更多信息请参见此处](webview-attacks.md#javascript-enabled)。
* **永久性cookie:**在一些情况下,当Android应用程序结束会话时,cookie没有被撤销,甚至可能被保存到磁盘上。
* [**Cookie中的Secure标志**](../../pentesting-web/hacking-with-cookies/#cookies-flags)
***
加入[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy)服务器,与经验丰富的黑客和赏金猎人交流!
**黑客见解**\
参与深入探讨黑客活动的刺激和挑战的内容
**实时黑客新闻**\
通过实时新闻和见解了解快节奏的黑客世界
**最新公告**\
通过最新的赏金任务发布和重要平台更新保持信息灵通
**加入我们的** [**Discord**](https://discord.com/invite/N3FrSbmwdy),立即与顶尖黑客合作!
## 自动分析
### [MobSF](https://github.com/MobSF/Mobile-Security-Framework-MobSF)
**静态分析**
![](<../../.gitbook/assets/image (61).png>)
使用一个漂亮的基于Web的前端对应用程序进行漏洞评估。您还可以执行动态分析(但需要准备好环境)。
```bash
docker pull opensecurity/mobile-security-framework-mobsf
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
```
注意,MobSF可以分析**Android**(apk)**、IOS**(ipa)**和Windows**(apx)应用程序(_Windows应用程序必须从安装了MobSF的Windows主机中进行分析_)。\
此外,如果您创建一个包含**Android**或**IOS**应用程序源代码的**ZIP**文件(转到应用程序的根文件夹,选择所有内容并创建一个ZIP文件),MobSF也可以分析它。
MobSF还允许您进行**差异/比较**分析,并集成**VirusTotal**(您需要在_MobSF/settings.py_中设置您的API密钥并启用它:`VT_ENABLED = TRUE` `VT_API_KEY = ` `VT_UPLOAD = TRUE`)。您还可以将`VT_UPLOAD`设置为`False`,然后将**哈希**而不是文件**上传**。
### 使用MobSF进行辅助动态分析
**MobSF**在**Android**中进行**动态分析**时也非常有帮助,但在这种情况下,您需要在主机上安装MobSF和**genymotion**(虚拟机或Docker将无法工作)。_注意:您需要**先启动genymotion中的虚拟机**,然后再启动MobSF。_\
**MobSF动态分析器**可以:
* **转储应用程序数据**(URL、日志、剪贴板、您制作的屏幕截图、由“**导出活动测试器**”制作的屏幕截图、电子邮件、SQLite数据库、XML文件和其他创建的文件)。所有这些都是自动完成的,除了屏幕截图,您需要在需要屏幕截图时按下,或者您需要按下“**导出活动测试器**”以获取所有导出活动的屏幕截图。
* 捕获**HTTPS流量**
* 使用**Frida**获取**运行时信息**
从Android **版本大于5**开始,它将**自动启动Frida**并将全局**代理**设置为**捕获**流量。它只会捕获来自被测试应用程序的流量。
**Frida**
默认情况下,它还将使用一些Frida脚本来**绕过SSL绑定**、**root检测**和**调试器检测**,以及**监视有趣的API**。\
MobSF还可以**调用导出的活动**,抓取它们的**屏幕截图**并为报告**保存**它们。
要**开始**动态测试,请按下绿色按钮:“**开始仪器化**”。按下“**Frida实时日志**”以查看Frida脚本生成的日志,“**实时API监视器**”以查看所有挂钩方法的调用、传递的参数和返回值(在按下“开始仪器化”后会出现)。\
MobSF还允许您加载自己的**Frida脚本**(要将您的Friday脚本的结果发送到MobSF,请使用函数`send()`)。它还有**几个预写脚本**可供加载(您可以在`MobSF/DynamicAnalyzer/tools/frida_scripts/others/`中添加更多),只需**选择它们**,按下“**加载**”,然后按下“**开始仪器化**”(您将能够在“**Frida实时日志**”中看到该脚本的日志)。
![](<../../.gitbook/assets/image (215).png>)
此外,您还有一些辅助的Frida功能:
* **枚举加载的类**:它将打印所有加载的类
* **捕获字符串**:在使用应用程序时打印所有捕获的字符串(非常嘈杂)
* **捕获字符串比较**:可能非常有用。它将**显示正在比较的两个字符串**以及结果是True还是False。
* **枚举类方法**:输入类名(如“java.io.File”),它将打印类的所有方法。
* **搜索类模式**:按模式搜索类
* **跟踪类方法**:**跟踪**整个类(查看该类的所有方法的输入和输出)。请记住,默认情况下,MobSF跟踪几个有趣的Android Api方法。
选择要使用的辅助模块后,您需要按下“**开始仪器化**”,然后您将在“**Frida实时日志**”中看到所有输出。
**Shell**
Mobsf还为您提供了一个带有一些**adb**命令、**MobSF命令**和常见**shell命令**的shell,位于动态分析页面底部。一些有趣的命令:
```bash
help
shell ls
activities
exported_activities
services
receivers
```
**HTTP工具**
当捕获到http流量时,您可以在“**HTTP(S) Traffic**”底部看到捕获流量的丑陋视图,或者在“**Start HTTPTools**”绿色按钮中看到更友好的视图。从第二个选项中,您可以将**捕获的请求**发送到诸如Burp或Owasp ZAP之类的**代理**。\
要这样做,_启动Burp -->_ _关闭拦截 --> 在MobSB HTTPTools中选择请求_ --> 按下“**Send to Fuzzer**” --> _选择代理地址_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080))。
完成与MobSF的动态分析后,您可以按“**Start Web API Fuzzer**”来对http请求进行**模糊测试**并寻找漏洞。
{% hint style="info" %}
在使用MobSF进行动态分析后,代理设置可能被错误配置,您将无法从GUI中修复它们。您可以通过以下方式修复代理设置:
```
adb shell settings put global http_proxy :0
```
{% endhint %}
### 使用 Inspeckage 进行辅助动态分析
您可以从 [**Inspeckage**](https://github.com/ac-pm/Inspeckage) 获取该工具。\
该工具将使用一些 **Hooks** 来让您了解在执行 **动态分析** 时应用程序中发生了什么。
### [Yaazhini](https://www.vegabird.com/yaazhini/)
这是一个使用 GUI 执行 **静态分析** 的**绝佳工具**
![](<../../.gitbook/assets/image (527).png>)
### [Qark](https://github.com/linkedin/qark)
该工具旨在查找几种 **与安全相关的 Android 应用程序漏洞**,无论是在 **源代码** 还是 **打包的 APK** 中。该工具还 **能够创建一个可部署的“概念验证”APK** 和 **ADB 命令**,以利用发现的一些漏洞(暴露的活动、意图、点击劫持等)。与 Drozer 一样,无需对测试设备进行 root。
```bash
pip3 install --user qark # --user is only needed if not using a virtualenv
qark --apk path/to/my.apk
qark --java path/to/parent/java/folder
qark --java path/to/specific/java/file.java
```
### [**ReverseAPK**](https://github.com/1N3/ReverseAPK.git)
* 显示所有提取的文件,便于参考
* 自动将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并应用一系列规则来检测这些漏洞。
所有规则都集中在`rules.json`文件中,每个公司或测试人员都可以创建自己的规则来分析他们需要的内容。
从[下载页面](https://superanalyzer.rocks/download.html)下载最新的二进制文件。
```
super-analyzer {apk_file}
```
### [StaCoAn](https://github.com/vincentcox/StaCoAn)
![](<../../.gitbook/assets/image (62).png>)
StaCoAn是一个**跨平台**工具,可帮助开发人员、漏洞赏金猎人和道德黑客对移动应用程序进行[静态代码分析](https://en.wikipedia.org/wiki/Static\_program\_analysis)。
其概念是您将移动应用程序文件(.apk或.ipa文件)拖放到StaCoAn应用程序上,它将为您生成一个可视化和便携式报告。您可以调整设置和单词列表以获得定制体验。
下载[最新版本](https://github.com/vincentcox/StaCoAn/releases):
```
./stacoan
```
### [AndroBugs](https://github.com/AndroBugs/AndroBugs\_Framework)
AndroBugs Framework 是一个 Android 漏洞分析系统,帮助开发人员或黑客发现 Android 应用中潜在的安全漏洞。\
[Windows releases](https://github.com/AndroBugs/AndroBugs\_Framework/releases)
```
python androbugs.py -f [APK file]
androbugs.exe -f [APK file]
```
### [Androwarn](https://github.com/maaaaz/androwarn)
**Androwarn** 是一个工具,其主要目的是检测并警告用户有关 Android 应用程序可能存在的恶意行为。
检测是通过对应用程序的 Dalvik 字节码进行**静态分析**来实现的,该字节码表示为 **Smali**,使用 [`androguard`](https://github.com/androguard/androguard) 库。
该工具寻找**"坏"应用程序的常见行为**,例如:泄露电话标识符、拦截音频/视频流、修改 PIM 数据、执行任意代码...
```
python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
```
### [MARA Framework](https://github.com/xtiankisutsa/MARA\_Framework)
![](<../../.gitbook/assets/image (81).png>)
**MARA** 是一个**移动应用程序**逆向工程和分析框架。它是一个工具,汇集了常用的移动应用程序逆向工程和分析工具,以帮助测试移动应用程序抵御OWASP移动安全威胁。其目标是使移动应用程序开发人员和安全专业人员更容易友好地执行此任务。
它能够:
* 使用不同工具提取Java和Smali代码
* 使用以下工具分析APK:[smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs\_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD)
* 使用正则表达式从APK中提取私人信息。
* 分析清单。
* 使用以下工具分析发现的域:[pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) 和 [whatweb](https://github.com/urbanadventurer/WhatWeb)
* 通过[apk-deguard.com](http://www.apk-deguard.com)对APK进行反混淆
### Koodous
用于检测恶意软件:[https://koodous.com/](https://koodous.com)
## 代码混淆/反混淆
请注意,根据您用于混淆代码的服务和配置,秘密可能会或可能不会被混淆。
### [ProGuard](https://en.wikipedia.org/wiki/ProGuard\_\(software\))
来自[Wikipedia](https://en.wikipedia.org/wiki/ProGuard\_\(software\)):**ProGuard** 是一个开源命令行工具,用于缩小、优化和混淆Java代码。它能够优化字节码,检测并删除未使用的指令。ProGuard是自由软件,根据GNU通用公共许可证第2版分发。
ProGuard作为Android SDK的一部分分发,并在发布模式下构建应用程序时运行。
### [DexGuard](https://www.guardsquare.com/dexguard)
在[https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)找到逐步指南以对APK进行反混淆
(来自该指南)上次我们检查时,Dexguard的操作模式是:
* 将资源作为InputStream加载;
* 将结果提供给继承自FilterInputStream的类以解密它;
* 进行一些无用的混淆以浪费逆向者的几分钟时间;
* 将解密的结果提供给ZipInputStream以获取DEX文件;
* 最后使用`loadDex`方法将生成的DEX作为资源加载。
### [DeGuard](http://apk-deguard.com)
**DeGuard 反转了Android混淆工具执行的混淆过程。这使得可以进行多种安全分析,包括代码检查和预测库。**
您可以将混淆的APK上传到他们的平台。
### [Simplify](https://github.com/CalebFenton/simplify)
它是一个**通用的Android反混淆工具。** Simplify **虚拟执行应用程序**以了解其行为,然后**尝试优化代码**,使其行为相同但更容易让人理解。每种优化类型都是简单且通用的,因此不管使用了什么具体类型的混淆,都不重要。
### [APKiD](https://github.com/rednaga/APKiD)
APKiD提供有关**APK是如何制作的**的信息。它识别许多**编译器**、**打包工具**、**混淆工具**和其他奇怪的东西。这是Android的[_PEiD_](https://www.aldeid.com/wiki/PEiD)。
### 手动
[阅读此教程以学习一些关于**如何反转自定义混淆**的技巧](manual-deobfuscation.md)
## 实验室
### [Androl4b](https://github.com/sh4hin/Androl4b)
AndroL4b是一个基于ubuntu-mate的Android安全虚拟机,包括来自不同安全极客和研究人员的最新框架、教程和实验室,用于逆向工程和恶意软件分析。
## 参考资料
* [https://owasp.org/www-project-mobile-app-security/](https://owasp.org/www-project-mobile-app-security/)
* [https://appsecwiki.com/#/](https://appsecwiki.com/#/) 这是一个资源丰富的列表
* [https://maddiestone.github.io/AndroidAppRE/](https://maddiestone.github.io/AndroidAppRE/) Android快速课程
* [https://manifestsecurity.com/android-application-security/](https://manifestsecurity.com/android-application-security/)
* [https://github.com/Ralireza/Android-Security-Teryaagh](https://github.com/Ralireza/Android-Security-Teryaagh)
* [https://www.youtube.com/watch?v=PMKnPaGWxtg\&feature=youtu.be\&ab\_channel=B3nacSec](https://www.youtube.com/watch?v=PMKnPaGWxtg\&feature=youtu.be\&ab\_channel=B3nacSec)
## 尚未尝试
* [https://www.vegabird.com/yaazhini/](https://www.vegabird.com/yaazhini/)
* [https://github.com/abhi-r3v0/Adhrit](https://github.com/abhi-r3v0/Adhrit)
加入[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy)服务器,与经验丰富的黑客和赏金猎人交流!
**黑客见解**\
参与深入探讨黑客的刺激和挑战的内容
**实时黑客新闻**\
通过实时新闻和见解了解快节奏的黑客世界
**最新公告**\
通过最新的赏金计划发布和重要平台更新保持信息更新
**加入我们的** [**Discord**](https://discord.com/invite/N3FrSbmwdy) 并开始与顶尖黑客合作!