hacktricks/mobile-pentesting/ios-pentesting/ios-app-extensions.md

195 lines
12 KiB
Markdown
Raw Normal View History

2023-08-03 19:12:22 +00:00
# iOS应用扩展
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>从零到英雄学习AWS黑客攻击通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS红队专家)</strong></a><strong></strong></summary>
2022-04-28 16:01:33 +00:00
支持HackTricks的其他方式
2022-04-28 16:01:33 +00:00
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](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)或[**telegram群组**](https://t.me/peass)或在**Twitter**上**关注**我 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
2022-04-28 16:01:33 +00:00
</details>
**内容复制自** [**https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#app-extensions**](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#app-extensions)
应用扩展允许应用程序在用户与其他应用程序或系统交互时提供自定义功能和内容。一些值得注意的包括:
* **自定义键盘**用自定义键盘替换iOS系统键盘以便在所有应用中使用。
* **分享**:发布到分享网站或与他人分享内容。
* **今天**:也称为**小部件**,它们在通知中心的今天视图中提供内容或执行快速任务。
例如用户在_宿主应用_中选择文本点击“分享”按钮并从列表中选择一个“应用”或操作。这将触发_包含应用_的_应用扩展_。应用扩展在宿主应用的上下文中显示其视图并使用宿主应用提供的项目在这种情况下是选定的文本来执行特定任务例如在社交网络上发布。请看这张来自[苹果应用扩展编程指南](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionOverview.html#//apple_ref/doc/uid/TP40014214-CH2-SW13)的图片,它很好地总结了这一点:
![](https://gblobscdn.gitbook.com/assets%2F-LH00RC4WVf3-6Ou4e0l%2F-Lf1APQHyCHdAvoJSvc_%2F-Lf1AQx9khfTwUwYuMti%2Fapp_extensions_communication.png?alt=media)
### **安全考虑**
2023-08-03 19:12:22 +00:00
从安全角度来看,重要的是要注意:
* 一个**应用扩展永远不会直接与其包含的应用通信**(通常,当包含的应用扩展正在运行时,它甚至不会运行)。
* 一个**应用扩展**和**宿主应用**通过**进程间**通信。
* 一个**应用扩展**的包含应用和**宿主应用**根本不通信。
* 一个**今天**的**小部件**(和其他类型的应用扩展不同)可以通过调用`NSExtensionContext`类的`openURL:completionHandler:`方法要求系统打开其包含的应用。
* 任何**应用扩展**及其**包含的应用**都可以在私下定义的共享容器中**访问共享数据**。
2023-08-03 19:12:22 +00:00
* 应用扩展**无法访问某些API**例如HealthKit。
* 它们**无法使用AirDrop接收数据**,但可以发送数据。
* **不允许长时间运行的后台任务**,但可以启动上传或下载。
* 应用扩展**无法访问iOS设备上的相机或麦克风**iMessage应用扩展除外
2023-08-03 19:12:22 +00:00
### 静态分析
2023-08-03 19:12:22 +00:00
#### **验证应用是否包含应用扩展**
如果您有原始源代码您可以使用Xcodecmd+shift+f搜索`NSExtensionPointIdentifier`的所有出现,或查看“构建阶段/嵌入应用扩展”:
![](<../../.gitbook/assets/image (496).png>)
在那里,您可以找到所有嵌入的应用扩展的名称,后面跟着`.appex`,现在您可以在项目中导航到各个应用扩展。
2023-08-03 19:12:22 +00:00
如果没有原始源代码:
在应用包IPA或已安装的应用内的所有文件中搜索`NSExtensionPointIdentifier`
```bash
$ grep -nr NSExtensionPointIdentifier Payload/Telegram\ X.app/
Binary file Payload/Telegram X.app//PlugIns/SiriIntents.appex/Info.plist matches
Binary file Payload/Telegram X.app//PlugIns/Share.appex/Info.plist matches
Binary file Payload/Telegram X.app//PlugIns/NotificationContent.appex/Info.plist matches
Binary file Payload/Telegram X.app//PlugIns/Widget.appex/Info.plist matches
Binary file Payload/Telegram X.app//Watch/Watch.app/PlugIns/Watch Extension.appex/Info.plist matches
```
您也可以通过SSH访问找到应用程序包并列出所有内部PlugIns它们默认放置在那里或者使用objection来完成
```bash
ph.telegra.Telegraph on (iPhone: 11.1.2) [usb] # cd PlugIns
2023-08-03 19:12:22 +00:00
/var/containers/Bundle/Application/15E6A58F-1CA7-44A4-A9E0-6CA85B65FA35/
Telegram X.app/PlugIns
ph.telegra.Telegraph on (iPhone: 11.1.2) [usb] # ls
NSFileType Perms NSFileProtection Read Write Name
------------ ------- ------------------ ------ ------- -------------------------
Directory 493 None True False NotificationContent.appex
Directory 493 None True False Widget.appex
Directory 493 None True False Share.appex
Directory 493 None True False SiriIntents.appex
```
我们现在可以看到之前在Xcode中看到的相同的四个应用扩展。
2023-08-03 19:12:22 +00:00
#### **确定支持的数据类型**
这对于与宿主应用共享的数据很重要(例如通过分享或操作扩展)。当用户在宿主应用中选择某种数据类型,并且它与这里定义的数据类型匹配时,宿主应用将提供扩展。值得注意的是,这与通过`UIActivity`共享数据的区别在那里我们不得不定义文档类型也使用UTIs。一个应用不需要为此拥有一个扩展。可以仅使用`UIActivity`共享数据。
检查应用扩展的`Info.plist`文件,并搜索`NSExtensionActivationRule`。该键指定了被支持的数据以及例如支持的项目的最大数量。例如:
```markup
<key>NSExtensionAttributes</key>
2023-08-03 19:12:22 +00:00
<dict>
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>10</integer>
<key>NSExtensionActivationSupportsMovieWithMaxCount</key>
<integer>1</integer>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
</dict>
</dict>
```
仅支持此处存在的数据类型,并且 `MaxCount` 不为 `0`。然而,通过使用所谓的谓词字符串可以进行更复杂的过滤,该字符串将评估给定的 UTIs。请参阅 [Apple 应用扩展编程指南](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW8) 以获取更详细的信息。
**检查与包含应用的数据共享**
请记住,应用扩展和它们的包含应用不能直接访问彼此的容器。然而,可以启用数据共享。这是通过 ["App Groups"](https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/EntitlementKeyReference/Chapters/EnablingAppSandbox.html#//apple_ref/doc/uid/TP40011195-CH4-SW19) 和 [`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults) API 完成的。请参见 [Apple 应用扩展编程指南](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW11) 中的此图:
2022-05-01 13:25:53 +00:00
![](../../mobile-apps-pentesting/ios-pentesting/broken-reference)
如指南中所述,如果应用扩展使用 `NSURLSession` 类执行后台上传或下载,则应用必须设置共享容器,以便扩展及其包含应用都可以访问传输的数据。
**验证应用是否限制使用应用扩展**
可以使用以下方法拒绝特定类型的应用扩展:
* [`application:shouldAllowExtensionPointIdentifier:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623122-application?language=objc)
然而,目前仅对“自定义键盘”应用扩展(在测试处理敏感数据的应用时应进行验证,例如银行应用)可能。
2023-08-03 19:12:22 +00:00
### 动态分析
对于动态分析,我们可以做以下事情来获得知识,而不需要源代码:
2023-08-03 19:12:22 +00:00
* 检查正在共享的项目
* 识别涉及的应用扩展
2023-08-03 19:12:22 +00:00
**检查正在共享的项目**
为此,我们应该在数据起源应用中挂钩 `NSExtensionContext - inputItems`
继续前面的 Telegram 示例,我们现在将使用文本文件(从聊天中接收)上的“分享”按钮在 Notes 应用中创建一个笔记:
![](<../../.gitbook/assets/image (497).png>)
如果我们运行跟踪,我们会看到以下输出:
```bash
(0x1c06bb420) NSExtensionContext - inputItems
0x18284355c Foundation!-[NSExtension _itemProviderForPayload:extensionContext:]
0x1828447a4 Foundation!-[NSExtension _loadItemForPayload:contextIdentifier:completionHandler:]
0x182973224 Foundation!__NSXPCCONNECTION_IS_CALLING_OUT_TO_EXPORTED_OBJECT_S3__
0x182971968 Foundation!-[NSXPCConnection _decodeAndInvokeMessageWithEvent:flags:]
0x182748830 Foundation!message_handler
0x181ac27d0 libxpc.dylib!_xpc_connection_call_event_handler
0x181ac0168 libxpc.dylib!_xpc_connection_mach_event
...
RET: (
"<NSExtensionItem: 0x1c420a540> - userInfo:
{
2023-08-03 19:12:22 +00:00
NSExtensionItemAttachmentsKey = (
"<NSItemProvider: 0x1c46b30e0> {types = (\n \"public.plain-text\",\n \"public.file-url\"\n)}"
);
}"
)
```
2023-08-03 19:12:22 +00:00
在这里我们可以观察到:
* 这是通过 XPC 在后台进行的,具体是通过使用 `libxpc.dylib` 框架的 `NSXPCConnection` 实现的。
* 包含在 `NSItemProvider` 中的 UTIs 是 `public.plain-text``public.file-url`,后者被包含在 Telegram 的“分享扩展”的 [`Info.plist`](https://github.com/TelegramMessenger/Telegram-iOS/blob/master/Telegram/Share/Info.plist) 中的 `NSExtensionActivationRule`
2023-08-03 19:12:22 +00:00
**识别涉及的应用扩展**
您还可以通过挂钩 `NSExtension - _plugIn` 来找出哪个应用扩展正在处理您的请求和响应:
2023-08-03 19:12:22 +00:00
我们再次运行相同的示例:
```bash
(0x1c0370200) NSExtension - _plugIn
RET: <PKPlugin: 0x1163637f0 ph.telegra.Telegraph.Share(5.3) 5B6DE177-F09B-47DA-90CD-34D73121C785
1(2) /private/var/containers/Bundle/Application/15E6A58F-1CA7-44A4-A9E0-6CA85B65FA35
/Telegram X.app/PlugIns/Share.appex>
(0x1c0372300) -[NSExtension _plugIn]
RET: <PKPlugin: 0x10bff7910 com.apple.mobilenotes.SharingExtension(1.5) 73E4F137-5184-4459-A70A-83
F90A1414DC 1(2) /private/var/containers/Bundle/Application/5E267B56-F104-41D0-835B-F1DAB9AE076D
/MobileNotes.app/PlugIns/com.apple.mobilenotes.SharingExtension.appex>
```
如您所见,涉及两个应用扩展:
* `Share.appex` 正在发送文本文件(`public.plain-text` 和 `public.file-url`)。
* `com.apple.mobilenotes.SharingExtension.appex` 正在接收并将处理文本文件。
如果您想了解更多关于 XPC 底层发生的情况,我们建议查看 "libxpc.dylib" 的内部调用。例如,您可以使用 [`frida-trace`](https://www.frida.re/docs/frida-trace/),然后通过扩展自动生成的存根,深入研究您觉得更有趣的方法。
2022-05-01 13:25:53 +00:00
###
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong></strong></summary>
2022-04-28 16:01:33 +00:00
支持 HackTricks 的其他方式:
2022-04-28 16:01:33 +00:00
* 如果您想在 HackTricks 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFT 集合**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享您的黑客技巧**。
2022-04-28 16:01:33 +00:00
</details>