mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 06:30:37 +00:00
8 KiB
8 KiB
<details>
<summary><strong>从零到英雄学习AWS黑客攻击</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
支持HackTricks的其他方式:
* 如果您想在**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来分享您的黑客技巧。**
</details>
[`UIPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard) 使得在应用内部以及应用之间共享数据成为可能。有两种类型的剪贴板:
* **系统级通用剪贴板**:用于与**任何应用**共享数据。默认情况下,设备重启和应用卸载后数据仍然持久存在(自iOS 10起)。
* **自定义/命名剪贴板**:用于与**另一个应用**(具有与分享应用相同的团队ID)或**应用本身**共享数据(它们仅在创建它们的进程中可用)。默认情况下是非持久的(自iOS 10起),即它们只存在于拥有(创建)应用退出之前。
一些安全考虑:
* 用户**无法授予或拒绝**应用读取**剪贴板**的权限。
* 自iOS 9起,应用[无法在后台访问剪贴板](https://forums.developer.apple.com/thread/13760),这减少了后台剪贴板监控的可能性。
* [苹果警告持久化命名剪贴板](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc)并**不推荐使用**。相反,应使用共享容器。
* 从iOS 10开始,有一个名为**通用剪贴板**的新Handoff功能,默认情况下是启用的。它允许**通用剪贴板内容在设备之间自动传输**。如果开发者选择,可以禁用此功能,并且还可以为复制的数据设置过期时间和日期。
因此,重要的是**检查敏感信息是否被保存在全局剪贴板中**。\
同样重要的是检查**应用是否使用全局剪贴板数据执行操作**,因为恶意应用可能篡改这些数据。
**应用也可以阻止用户将敏感数据复制到剪贴板**(这是推荐的做法)。
## 静态分析
可以通过使用[`generalPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard/1622106-generalpasteboard?language=objc)获取**系统级通用剪贴板**,搜索源代码或编译后的二进制文件中的这个方法。处理敏感数据时应避免使用系统级通用剪贴板。
**自定义剪贴板**可以通过[`pasteboardWithName:create:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622074-pasteboardwithname?language=objc)或[`pasteboardWithUniqueName`](https://developer.apple.com/documentation/uikit/uipasteboard/1622087-pasteboardwithuniquename?language=objc)创建。验证自定义剪贴板是否设置为持久化,因为这自iOS 10起已被弃用。应该使用共享容器代替。
## 动态分析
Hook或追踪以下内容:
* `generalPasteboard` 用于系统级通用剪贴板。
* `pasteboardWithName:create:` 和 `pasteboardWithUniqueName` 用于自定义剪贴板。
您还可以Hook或追踪已弃用的[`setPersistent:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622096-setpersistent?language=objc)方法并验证是否调用了它。
在**监控**剪贴板时,有几个**细节**可以动态**检索**:
* 通过Hook `pasteboardWithName:create:` 并检查其输入参数或 `pasteboardWithUniqueName` 并检查其返回值来获取**剪贴板名称**。
* 获取**第一个可用的剪贴板项**:例如,对于字符串使用`string`方法。或者使用其他方法来处理[标准数据类型](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc#1654275)。
* 使用`numberOfItems`获取**项目数量**。
* 使用[便捷方法](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc#2107142)检查**标准数据类型的存在**,例如`hasImages`、`hasStrings`、`hasURLs`(从iOS 10开始)。
* 使用[`containsPasteboardTypes:inItemSet:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622100-containspasteboardtypes?language=objc)检查**其他数据类型**(通常是UTIs)。您可以检查更具体的数据类型,例如public.png和public.tiff([UTIs](http://web.archive.org/web/20190616231857/https://developer.apple.com/documentation/mobilecoreservices/uttype))或自定义数据,如com.mycompany.myapp.mytype。请记住,在这种情况下,只有那些_声明了对该类型了解_的应用才能理解写入剪贴板的数据。使用[`itemSetWithPasteboardTypes:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622071-itemsetwithpasteboardtypes?language=objc)并设置相应的UTIs来检索它们。
* 通过Hook `setItems:options:` 并检查其选项中的 `UIPasteboardOptionLocalOnly` 或 `UIPasteboardOptionExpirationDate` 来检查排除或即将过期的项目。
如果只寻找字符串,您可能想使用**objection**的命令`ios pasteboard monitor`:
> Hook进iOS UIPasteboard类并每5秒轮询一次generalPasteboard中的数据。如果发现新数据,与上一次轮询的数据不同,那么这些数据将被显示在屏幕上。
您也可以构建自己的剪贴板监控器,监控上述特定信息。
例如,这个脚本(受到[objection的剪贴板监控器](https://github.com/sensepost/objection/blob/b39ee53b5ba2e9a271797d2f3931d79c46dccfdb/agent/src/ios/pasteboard.ts)脚本的启发)每5秒读取一次剪贴板项目,如果有新内容,它将打印出来:
const UIPasteboard = ObjC.classes.UIPasteboard;
const Pasteboard = UIPasteboard.generalPasteboard();
var items = "";
var count = Pasteboard.changeCount().toString();
setInterval(function () {
const currentCount = Pasteboard.changeCount().toString();
const currentItems = Pasteboard.items().toString();
if (currentCount === count) { return; }
items = currentItems;
count = currentCount;
console.log('[* Pasteboard changed] count: ' + count +
' hasStrings: ' + Pasteboard.hasStrings().toString() +
' hasURLs: ' + Pasteboard.hasURLs().toString() +
' hasImages: ' + Pasteboard.hasImages().toString());
console.log(items);
}, 1000 * 5);
参考资料
{% embed url="https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8" %}
通过 htARTE (HackTricks AWS Red Team Expert)从零开始学习AWS黑客攻击!
支持HackTricks的其他方式:
- 如果您想在HackTricks中看到您的公司广告或下载HackTricks的PDF,请查看订阅计划!
- 获取官方PEASS & HackTricks商品
- 发现PEASS家族,我们独家的NFTs系列
- 加入 💬 Discord群组 或 telegram群组 或在 Twitter 🐦 上关注我 @carlospolopm。
- 通过向 HackTricks 和 HackTricks Cloud github仓库提交PR来分享您的黑客技巧。