国护准备之macos攻击

admin 2023年3月17日10:09:29评论116 views字数 11039阅读36分47秒阅读模式

这篇文章涵盖了基本的 macOS 安全概念,并作为红队 macOS 环境的介绍已经的成功得到了一些安全人员的认可。

涵盖的主题

  • macOS 安全概述
    - Gatekeeper 和 XProtect
    - 强化运行时
    - 系统完整性保护 (SIP)
    - 透明度、同意和控制 (TCC)
    - macOS 沙盒
    - 钥匙串

  • 初始访问负载和持久性
    - 应用程序包
    - 安装程序包
    - 磁盘映像 (DMG)

  • 特权升级和后期利用
    - 态势感知
    - 窃取 Cookie
    - 剪贴板监控
    - 代码注入
    - 内存中 Mach-O 加载

学分/学习资源

这篇文章中没有任何内容是“新”研究,而是将来自以下红队macos资源的有关主题的信息整合在一个地方,以便于阅读和介绍。

  • 博客
    - Patrick Wardle/Objective See
    - Adam Chester
    - Justin Bui
    - Csaba Fitzl
    - Wojciech Regula
    - Cedric Owens
    - Chris Ross
    - Leo Pitt

  • 视频
    - Cedric Owens 的 DEFCON 29:Red Teaming macOS
    - Cody Thomas 的 OBTS:Red Teaming macOS
    - Wojciech Reguła 的 x33fcon:Red Teaming macOS
    - Cody Thomas 的 OBTS:开锁 macOS 钥匙串

  • 书籍/课程
    - Patrick Wardle 的 Mac 恶意软件艺术
    - Offensive Security 的 OSMR

  • 多合一参考
    - Awesome-macOS-Red-Teaming
    - offensive_macos


macOS 安全概述

Gatekeeper 和 XProtect

Gatekeeper 是一种安全机制,旨在仅允许受信任的应用程序在系统上运行,类似于 Windows 上的 SmartScreen 和 MOTW。从 Internet 下载可执行文件时,它们会标有属性com.apple.quarantine,该属性会在文件运行时触发网守。

国护准备之macos攻击

如果可执行文件经过公证,Gatekeeper 会验证文件的代码签名并提示用户确认他们想要运行该文件。

国护准备之macos攻击

双击经过公证的应用程序


如果可执行文件未经过公证,Gatekeeper 将向用户显示提示,通知他们该文件无法运行,因为它未签名。要运行未签名的可执行文件,用户必须右键单击该文件,然后单击打开,而不是双击。

国护准备之macos攻击

双击未签名的文件


国护准备之macos攻击

右键单击打开未签名的文件

在验证代码签名后,macOS 的内置防病毒软件 XProtect 将扫描文件中的恶意软件。XProtect 使用 YARA 规则,这些规则可以通过找到locate

XProtect.yara并且在大多数情况下是无用的,除非您运行默认的 Metasploit 有效负载。此外,XProtect 仅在三种情况下扫描恶意软件
  • 该文件是第一次运行

  • 文件的哈希值已更改

  • XProtect 的 YARA 规则已更新


最后,如果您想要对应用程序进行公证,您可以注册Apple Developer Program以获得代码签名证书,费用为每年 99 美元。注册后,您可以签署您的应用程序并将其提交给 Apple,在那里它将进行安全扫描并检查其他要求,例如强化运行时(在下一节中介绍)是否已启用。如果您提交恶意软件,Apple 的安全扫描可能会忽略它并仍然公证您的应用程序,但是,您的证书可能很快就会被吊销。

加强运行时完整性

强化运行完整性是一项可以在应用程序上启用的功能,以防止通过 dylib 劫持、环境变量和任务端口注入进行代码注入。强化运行时如何防止注入的一个示例是要求加载到进程中的任何 dylib 都使用与应用程序本身相同的证书进行签名。当应用程序需要加载第 3 方动态库时,这当然会导致问题,因此,应用程序可以拥有某些权利来删除其中的一些限制。

我们可以通过codesign -d --entitlements :- <file>list_entitlements 中的命令列出应用程序权利,如果存在以下任何一项,我们就可以注入应用程序:

  • 该com.apple.security.cs.disable-library-validation权利允许将任何已签名或未签名的 dylib 加载到进程中。根据应用程序加载的 dylib 的位置,这可能会为 dylib 劫持打开大门。

  • 授权com.apple.security.cs.allow-dyld-environment-variables允许从环境变量加载动态库DYLD_INSERT_LIBRARIES。但是,仅此权利并不能消除前面提到的代码签名要求。如果此权利与 disable-library-validation 权利一起存在,您可以通过DYLD_INSERT_LIBRARIES=malicious.dylib ./app类似于LD_PRELOADLinux 的方式注入到应用程序中。

  • 授权com.apple.security.get-task-allow允许其他应用程序获取您应用程序的任务端口,这类似于在 Windows 上获取进程句柄。应该注意的是,为了访问任务端口,您的代码必须以 root 身份运行。使用任务端口,您可以通过编写 shellcode 和创建线程来执行经典的进程注入。



  • 国护准备之macos攻击

  • 列出黑名单的权利

  • 从红队的角度来看,能够将代码注入另一个应用程序特别有用,因为它可以让您继承权限(在 TCC 部分中有更多介绍),例如访问您以前没有的某些文件夹。


  • 系统完整性保护 (SIP)


  • SIP 又名“无根”保护系统文件不被修改。本质上,即使是 root 用户,我们也不能更改某些系统文件,例如/bin/. 受 SIP 保护的文件可以通过标志来识别restricted。


  • 国护准备之macos攻击


  • 可以通过 禁用 SIP csrutil disable,但是,它需要在恢复模式下重新启动设备,因此,从红队的角度来看,这通常是不可能的。


  • 透明度、同意和控制 (TCC)


  • TCC 是在 v10.14+ 中实现的 macOS 隐私功能,当应用程序尝试访问某些资源(例如相机)和某些文件夹(包括 Desktop,Downloads,Documents和驱动器/卷)时,它会提示用户明确授予权限。


  • 国护准备之macos攻击


  • TCC提示





  • 尝试在未经许可的情况下访问受 TCC 保护的资源可能会导致意外生成提示,提醒用户您的存在,并最终导致您的参与比预期提前结束。以下是一些不受 TCC 保护的有用文件:


  • 主目录中的隐藏文件和文件夹 —~/.aws/* , ~/.ssh/* , ~/.bash_history , ~/.zsh_history

  • 用户申请数据——~/Library/Application Support/*

  • Cookie 文件 — ~/Library/Application Support/Google/Chrome/Default/Cookies , ~/Library/Containers/com.tinyspeck.slackmacgap/Data/Library/Application Support/Slack/Cookies


  • 可以通过浏览“设置”然后“隐私和安全”来查看 TCC 权限。此外,每个应用程序拥有的权限都存储在 TCC 数据库中并进行跟踪。系统 TCC 数据库位于/Library/Application Support/com.apple.TCC/TCC.db并且每个用户都有一个 TCC 数据库位于~/Library/Application Support/com.apple.TCC/TCC.db


  • 国护准备之macos攻击


  • 用户的 TCC 数据库需要完全磁盘访问 (FDA) 才能与之交互,但是,如果我们可以与之交互,我们就可以修改它以授予我们对其他资源的访问权限。我们可以通过针对用户的 TCC 数据库运行来检查我们是否有 FDA 而无需提示用户file。


  • 国护准备之macos攻击FDA


  • 国护准备之macos攻击

  • 没有FDA

  • TCC 绕过并不是特别“罕见”,我建议查看Csaba Fitzl 的博客以了解新旧绕过的最新信息。


  • macOS 沙盒


  • macOS 沙盒是一项功能,开发人员可以选择在 App Store 之外发布的应用程序加入该功能,并且对于直接从 App Store 下载的所有应用程序都是强制性的。选择加入沙箱功能的应用程序将拥有权利com.apple.security.app-sandbox,顾名思义,将强制它们在沙箱内运行。在沙盒中运行的应用程序对系统的访问权限非常有限,例如读取文件或将文件写入磁盘的能力。因此,macOS 上的某些攻击路径(例如通过宏进行网络钓鱼)并不诱人。作为 Microsoft Office 应用程序选择加入沙箱,将阻止您坚持和掠夺。


  • 钥匙链


  • 钥匙串可以与 Windows 上的 LSASS 相提并论,并保存应用程序的密码和密钥等秘密。例如,应用程序可以加密它存储在磁盘上的文件,这些文件的解密密钥存储在钥匙串中。系统钥匙串可在 找到/Library/Keychains/System.keychain,用户钥匙串可在 找到~/Library/Keychains/login.keychain-db


  • 您可以下载用户的钥匙串,但其中的秘密将使用用户的密码进行加密。根据您是否拥有用户密码,您可以利用Chainbreaker( github.com/n0fate/chainbreaker )提取密码,或将钥匙串密码的哈希值转储--dump-keychain-password-hash为破解速度极慢的 hashcat 格式。


  • 最后,钥匙串中的每个条目都有关联的 ACL 和权限,可以在钥匙串访问应用程序中查看。受信任的应用程序是可以在不提示用户的情况下对钥匙串条目执行操作的应用程序。该列表可以在“访问控制”选项卡下找到,一个有趣的情况是列表为“NULL”,这意味着所有应用程序都是受信任的,不要与空列表混淆,空列表仅仅意味着没有应用程序是受信任的。


  • 国护准备之macos攻击


  • 如果您在受信任应用程序的上下文中运行或列表为 NULL,并且您拥有以下任何授权,则您可以在不提示用户的情况下提取秘密:


  • ACLAuthorizationDecrypt

  • ACLAuthorizationExportClear

  • ACLAuthorizationExportWrapped

  • ACLAuthorizationAny



  • 有关滥用配置错误的钥匙串 ACL 的更多信息,我建议观看Cody Thomas 的

  • OBTS 演讲。


  • 初始访问有效负载和持久性


  • 如果您有兴趣了解 macOS 的负载类型,而不是下面列出的那些,我建议您查看Mystikal项目和相关的博客文章。https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFBundles/BundleTypes/BundleTypes.html#//apple_ref/doc/uid/10000123i-CH101-SW1


  • 此外,需要注意的是,macOS 上的 EDR 产品并不成熟,本质上只是一个日志产品。因此,您通常可以使用除 Metasploit 之外的任何默认 C2 代理,而不必担心 EDR 捕获您的有效负载。


  • 应用程序包


  • 应用程序包 (.app) 是最常见的程序类型之一,几乎所有最终用户软件都是以这种格式发布的。/Applications/当您点击 Launchpad 时,应用程序包存储在其中并显示给您。参考 Apple 的文档,一个最小的应用程序包通常具有以下结构:

    AppName.app/    Contents/        Info.plist  # App config info        MacOS/      # Contains the app's executable file        Resources/  # Fonts, images, sounds, icons, etc.
  • 让我们从创建一个基本的应用程序包负载开始。对于此演示,我们将使用 Poseidon 创建一个假的 Zoom 应用程序,但是,您也可以使用任何支持 macOS 的Mythic 代理。


  • 1 - 创建应用程序包文件夹结构



    mkdir FakeZoom.appmkdir FakeZoom.app/Contentstouch FakeZoom.app/Contents/Info.plistmkdir FakeZoom.app/Contents/MacOSmkdir FakeZoom.app/Contents/Resources

  • 2 - 创建 Poseidon payload


  • 接下来,由于 Intel 和 Silicon mac 现在很常见,我们可以同时创建 AMD 和 ARM Poseidon payload,然后将它们组合成一个通用的 Mach-O,它可以在任一架构上运行,然后将其放入目录lipo -create <arm-payload> <amd-payload> -output <universal-payload>中MacOS。


  • 国护准备之macos攻击

  • 构建通用的 Poseidon 有效载荷

  • 3 - 创建Info.plist文件。


  • 参考 Apple 的开发者文档,我们需要指定几个键:


  • CFBundleExecutable — MacOS 目录 (PoseidonPayload) 中主要可执行文件的名称

  • CFBundleIconFile — 应用程序图像的名称 (ZoomImageForPayload)

  • CFBundleIdentifier — 在系统上唯一标识您的应用程序的字符串 (com.examplepayload.Zoom)

  • CFBundleName — 您的应用程序的名称 (FakeZoom)

  • CFBundleVersion — 您的应用程序的构建版本号 (1.0.0)


    <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict> <key>CFBundleExecutable</key> <string>PoseidonPayload</string> <key>CFBundleIconFile</key> <string>ZoomImageForPayload</string> <key>CFBundleIdentifier</key> <string>com.examplepayload.Zoom</string> <key>CFBundleName</key> <string>FakeZoom</string> <key>CFBundleVersion</key> <string>1.0.0</string></dict></plist>

  • 您可以在文件中为不同的效果指定许多其他键Info.plist,例如LSUIElement确定应用程序是否会出现在停靠栏中的键,但是,为了使该演示简单,我们将坚持使用上面的键。


  • 4 - 为您的应用选择一个图标


  • 由于我们正在创建一个假的 Zoom 应用程序,我们可以将 Zoom 的 icns 文件从目录/Applications/(如果已安装)复制到Resources/ZoomImageForPayload,然而,您也可以使用任何您想要的图标。


  • 国护准备之macos攻击

    应用文件夹结构


  • 国护准备之macos攻击


  • 安装软件包


  • 安装程序包 (.pkg) 是 xar 存档和另一种常见的程序类型,当软件需要以 root 权限安装时可以看到。虽然安装程序包可以包含在打开时运行的主要有效负载,但另一种方法是利用“预安装”和“安装后”脚本,顾名思义,它们将在安装前后运行脚本。


  • 对于这个例子,我们将创建一个安装程序包,它使用这些脚本来注册一个 LaunchDaemon,以便在打开时以根用户身份持久存在。


  • 1 - 创建安装程序包文件夹结构



    mkdir scriptsmkdir scripts/filestouch scripts/preinstalltouch scripts/postinstallchmod +x scripts/preinstallchmod +x scripts/postinstall

  • 确保在打包之前使您的安装前和安装后脚本可执行,否则您的有效负载将失败。


  • 2 - 创建一个 plist 文件以注册为 LaunchDaemon


  • 在这个 plist 文件中实际上只需要一个值,它ProgramArguments基本上指定了在触发 LaunchDaemon 时要运行的内容。请注意,它ProgramArguments也是一个数组,因此您可以根据需要传递其他字符串值,例如标志。



    <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict> <key>Label</key> <string>com.examplepayload.persistence</string> <key>ProgramArguments</key> <array>  <string>/Library/Application Support/PoseidonPayload</string> </array> <key>KeepAlive</key> <true/></dict></plist>

  • 我们将重用我们从应用程序包部分创建的通用 Poseidon 有效负载,我们可以将此 plist 文件与scripts/files/com.examplepayload.persistence.plist有效负载一起移动到scripts/files/PoseidonPayload.


  • 3 - 创建安装前和安装后脚本


  • 这些脚本只是常规的 bash 脚本,但是,它们必须#!/bin/bash以exit 0. 我们将使用预安装脚本将我们的 plist 和有效负载复制到磁盘上的正确位置,然后使用安装后脚本来注册 LaunchDaemon。



    #!/bin/bashcp files/PoseidonPayload "/Library/Application Support/PoseidonPayload"cp files/com.examplepayload.persistence.plist "/Library/LaunchDaemons/com.examplepayload.persistence.plist"exit 0
    #!/bin/bashlaunchctl load "/Library/LaunchDaemons/com.examplepayload.persistence.plist"exit 0

  • 国护准备之macos攻击


  • 4 - 创建安装程序包


  • 要从这些脚本创建安装程序包,我们可以简单地运行pkgbuild --identifier <identifier> --nopayload --scripts <path to scripts folder> <output>.pkg


  • 国护准备之macos攻击


  • 国护准备之macos攻击


  • 我们可以通过运行来卸载 launchctl unload com.examplepayload.persistence.plist,需要注意的是,将 payload 丢到这里/Library/Application Support/纯粹是偏好,它可以丢到其他地方。


  • LaunchDaemons 仅代表 macOS 上的一种持久性形式,如果您对其他形式感兴趣,我建议您查看SentinelOne 的博客。https://www.sentinelone.com/blog/how-malware-persists-on-macos/


  • 磁盘映像 (DMG)


  • DMG 是可以包含其他有效负载格式的压缩卷。在 DMG 文件中交付您的有效负载的好处是您可以添加图形元素以帮助通过社交工程让用户右键单击,然后打开您的有效负载以绕过 Gatekeeper,因为 DMG 本身不会调用 Gatekeeper。


  • 要构建外观逼真的 DMG,我们需要创建自定义背景图像,我更喜欢利用合法软件或公司墙纸以及draw.io,但您可以根据需要创建自己的背景图像。

  • 对于这个演示,我以这个图像为基础,创建了这个:


  • 国护准备之macos攻击


  • 首先,我们可以通过打开Disk Utility并选择“文件”然后选择“新映像”然后选择“空白映像...”来创建磁盘映像。


  • 国护准备之macos攻击


  • 我们可以选择卷的名称,然后将“格式”更改为“Mac OS 扩展(日志式)。


  • 国护准备之macos攻击


  • 打开 .dmg 文件,在我的例子中是“example-payload.dmg”,桌面上会出现一个卷,然后打开这个卷,在我的例子中是“example”。要在 macOS 上显示隐藏文件,您可以单击“[shift] + [command] + [period]”。


  • 国护准备之macos攻击


  • /Volumes/<volume-name>/将您的背景图像作为隐藏文件与您的负载一起移动到卷中。对于此示例,我们可以重用上一节中的应用程序包。


  • 国护准备之macos攻击


  • 接下来,我们可以单击卷并选择“查看”,然后选择“显示视图选项”。


  • 国护准备之macos攻击


  • 在“背景”下选择“图片”,然后双击“将图像拖到此处”框。将打开一个新的 Finder 窗口,您可以从该卷中选择背景图像。如果您不选择卷中包含的图像,则可能会导致错误。此外,我们可以通过“图标大小”调整图标大小。


  • 国护准备之macos攻击


  • 调整窗口大小以适合您的背景,并将应用程序包居中。


  • 国护准备之macos攻击


  • 一旦您对布局感到满意,并且 Finder 窗口仍然打开,右键单击桌面上的卷,然后单击“弹出”。


  • 国护准备之macos攻击


  • 重新打开Disk Utility并选择“图像”,然后选择“转换...”


  • 国护准备之macos攻击


  • 选择您的 DMG 文件,然后选择“加密:无”和“图像格式:压缩”


  • 国护准备之macos攻击

  • 国护准备之macos攻击


  • 当然,这个演示没有太多意义,因为它是 Chrome 背景,带有 Zoom 应用程序(笑),但是,希望你明白了。


  • 关于有效负载需要注意的最后一件事是,通过浏览器下载的文件将附加属性com.apple.metadata:kMDItemWhereFroms,该属性列出了文件的下载位置。如果您在打包之前直接从浏览器中的 Mythic 下载 Poseidon 有效载荷,这可能会导致意外泄露您的团队服务器的位置。您可以通过删除此属性xattr -d com.apple.metadata:kMDItemWhereFroms <file>。


  • 国护准备之macos攻击


  • 特权升级和后渗透利用


  • 本节并未详尽说明您在获得 shell 后可以执行的所有活动,并且旨在仅提供 macOS 上的 post-ex 的一般概念。


  • 对情境的意识


  • 您可以通过运行HealthInspector或SwiftBelt或手动浏览配置文件来开始对系统进行一些态势感知检查。其中许多文件都是二进制格式的 plist 文件,为了使它们可读,您可以使用plutil. 一些感兴趣的文件可能是:


  • 用户在 Dock 中有哪些应用程序?—plutil -p ~/Library/Preferences/com.apple.dock.plist

  • 用户最近与哪些文件交互?—plutil -p ~/Library/Preferences/com.apple.finder.plist

  • 您使用的是什么版本的 macOS?—plutil -p /System/Library/CoreServices/SystemVersion.plist


  • 偷Cookies


  • 接下来,您可以开始从磁盘下载一些不受 TCC 保护的文件,包括用户的 bash 或 zsh 历史记录、ssh 密钥、云密钥(AWS、GCP 等)、keychain 和 cookie。


  • 鉴于您使用的是 macOS,您参与的组织很可能是一家科技公司或初创公司,而 Slack 在这些环境中很常见。如果是这样,您可以下载以下文件:


  • ~/Library/Containers/com.tinyspeck.slackmacgap /Data/Library/Application Support/Slack/storage/root-state.json

  • ~/Library/Containers/com.tinyspeck.slackmacgap /Data/Library/Application Support/Slack/Cookies


  • 下载这两个文件后,您可以将它们复制到您的本地 mac,打开 Slack,您将作为用户进行身份验证。从这里您可以手动搜索 Slack 或使用SlackPirate。


  • 接下来,您可以定位浏览器 cookie,对于此示例,我们将使用 Google Chrome。如果您通过在用户的 bash 或 zsh 历史记录中找到用户密码或者运行密码提示器获得用户密码,则可以离线下载~/Library/Application Support/Google/Chrome/Default/Cookies和解密文件。或者,如果您没有用户密码,您可以使用WhiteChocolateMacademiaNut等工具在启用远程调试的情况下启动 Chrome,然后通过 websocket 转储 cookie。同样,由于 mac EDR 还不成熟,将乱码工具放到磁盘上应该不是什么大问题。


  • 通过访问浏览器 cookie,您可以通过 Poseidon 的内置命令或 drop chisel打开 SOCKS ,然后浏览内部站点。具体来说,您可能希望将内部文档站点作为目标,例如他们的 Confluence 和他们的内部代码存储库,以查找特权凭据。


  • 剪贴板监控


  • 在 macOS 上,每当剪贴板内容发生变化时,计数器都会递增,因此,我们可以在一段时间内监视计数器的值,并在剪贴板内容发生变化时获取它。Poseidon 有一个内置的命令clipboard_monitor,我们可以利用它。


  • 一些额外的注意事项:


  • 该clipboard_monitor命令过滤器仅检索纯文本,因此如果用户将大型二进制文件复制到他们的剪贴板,我们不必担心通过我们的 C2 发送大量流量。

  • root 用户无权访问剪贴板,因此任何剪贴板监视工具都必须在用户上下文中运行。


  • 代码注入


  • 正如之前在强化运行时部分中提到的,从红队的角度来看,能够将代码注入应用程序是很有用的,因为它可能会授予您额外的权利和对您以前没有的资源的访问权限。


  • 例如,您的初始负载可能无法访问下载文件夹,但是,如果您可以将代码注入可能具有权限的 Chrome com.apple.security.files.downloads.read-write,您就可以浏览下载文件夹。


  • 国护准备之macos攻击


  • 要找到代码注入的目标,您可以运行 Poseidon 的list_entitlements命令,该命令将搜索具有强化运行时部分中提到的权利的正在运行的进程。


  • 国护准备之macos攻击

    从这里您可以检查每个过程以找到潜在目标。


  • 国护准备之macos攻击


  • 之前未提及的另一种代码注入形式是“电子劫持”,Adam Chester 在本博客中对其进行了广泛介绍。本质上,您可以利用ELECTRON_RUN_AS_NODE环境变量来生成一个进程作为电子应用程序的子进程,并且由于子进程继承了其父进程的 TCC 权限,因此您有可能获得他们的权利。


  • 内存中的 Mach-O 加载


  • 虽然当前状态的 macOS EDR 绝对不需要,但可以在内存中运行 Mach-O。用于执行内存加载的 API 因操作系统版本而异,因此我不会介绍这一点,而是建议查看Justin Bui 的帖子和Adam Chester 的帖子。

  • https://slyd0g.medium.com/understanding-and-defending-against-reflective-code-loading-on-macos-e2e83211e48f

  • https://blog.xpnsec.com/building-a-mach-o-memory-loader-part-1/

原文始发于微信公众号(军机故阁):国护准备之macos攻击

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年3月17日10:09:29
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   国护准备之macos攻击http://cn-sec.com/archives/1609729.html

发表评论

匿名网友 填写信息