macOS Auto Start
本节内容主要基于博客系列超越传统的LaunchAgents,旨在添加更多自动启动位置(如果可能的话),指出哪些技术在最新版本的macOS(13.4)中仍然有效,并指定所需的权限。
沙盒绕过
在这里,您可以找到有用于绕过沙盒的启动位置,允许您通过将其写入文件并等待一个非常常见的 操作,一定的时间或通常可以在沙盒内执行的操作,而无需需要root权限。
Launchd
位置
/Library/LaunchAgents
触发器:重启
需要Root权限
/Library/LaunchDaemons
触发器:重启
需要Root权限
/System/Library/LaunchAgents
触发器:重启
需要Root权限
/System/Library/LaunchDaemons
触发器:重启
需要Root权限
~/Library/LaunchAgents
触发器:重新登录
~/Library/LaunchDemons
触发器:重新登录
有趣的是,**launchd
**在Mach-o部分__Text.__config
中嵌入了一个属性列表,其中包含其他众所周知的服务,launchd必须启动这些服务。此外,这些服务可以包含RequireSuccess
、RequireRun
和RebootOnSuccess
,这意味着它们必须运行并成功完成。
当然,由于代码签名,它无法被修改。
描述和利用
launchd
是由OX S内核在启动时执行的第一个 进程,也是在关机时完成的最后一个进程。它应该始终具有PID 1。此进程将读取和执行在以下ASEP plist中指示的配置:
/Library/LaunchAgents
:由管理员安装的每个用户代理/Library/LaunchDaemons
:由管理员安装的系统范围守护程序/System/Library/LaunchAgents
:由Apple提供的每个用户代理。/System/Library/LaunchDaemons
:由Apple提供的系统范围守护程序。
当用户登录时,位于/Users/$USER/Library/LaunchAgents
和/Users/$USER/Library/LaunchDemons
中的plist将以已登录用户的权限启动。
代理和守护程序之间的主要区别在于代理在用户登录时加载,而守护程序在系统启动时加载(因为有些服务如ssh需要在任何用户访问系统之前执行)。此外,代理可能使用GUI,而守护程序需要在后台运行。
有些情况下,需要在用户登录之前执行代理,这些被称为PreLoginAgents。例如,这对于在登录时提供辅助技术非常有用。它们也可以在/Library/LaunchAgents
中找到(查看这里一个示例)。
新的守护程序或代理配置文件将在下次重启后加载,或使用launchctl load <target.plist>
。也可以使用launchctl -F <file>
加载没有扩展名的.plist文件(但这些.plist文件在重启后不会自动加载)。
也可以使用launchctl unload <target.plist>
来卸载(指向它的进程将被终止)。
为了确保没有任何东西(如覆盖)阻止一个代理或守护程序 运行,运行:sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.smdb.plist
列出当前用户加载的所有代理和守护程序:
如果一个 plist 文件是由用户拥有的,即使它在守护程序系统范围的文件夹中,任务将作为用户执行而不是作为 root。这可以防止一些特权升级攻击。
关于 launchd 的更多信息
launchd
是从内核启动的第一个用户模式进程。进程启动必须是成功的,它不能退出或崩溃。甚至对一些终止信号也是受保护的。
launchd
要做的第一件事情之一是启动所有的守护程序,比如:
基于时间执行的定时守护程序:
atd (
com.apple.atrun.plist
):具有 30 分钟的StartInterval
crond (
com.apple.systemstats.daily.plist
):具有StartCalendarInterval
在 00:15 启动
像网络守护程序一样:
org.cups.cups-lpd
:在 TCP 上监听(SockType: stream
),使用SockServiceName: printer
SockServiceName 必须是端口或
/etc/services
中的服务com.apple.xscertd.plist
:在端口 1640 上监听 TCP
当指定路径发生更改时执行的路径守护程序:
com.apple.postfix.master
:检查路径/etc/postfix/aliases
IOKit 通知守护程序:
com.apple.xartstorageremoted
:"com.apple.iokit.matching" => { "com.apple.device-attach" => { "IOMatchLaunchStream" => 1 ...
Mach 端口:
com.apple.xscertd-helper.plist
:在MachServices
条目中指示名称com.apple.xscertd.helper
UserEventAgent:
这与前面的不同。它使 launchd 为特定事件的响应生成应用程序。但在这种情况下,涉及的主要二进制文件不是
launchd
而是/usr/libexec/UserEventAgent
。它从 SIP 受限制的文件夹/System/Library/UserEventPlugins/
中加载插件,其中每个插件在XPCEventModuleInitializer
键中指示其初始化器,或者在旧插件的情况下,在其Info.plist
的CFPluginFactories
字典下的键FB86416D-6164-2070-726F-70735C216EC0
中指示其初始化器。
shell 启动文件
Writeup: https://theevilbit.github.io/beyond/beyond_0001/ Writeup (xterm): https://theevilbit.github.io/beyond/beyond_0018/
位置
~/.zshrc
,~/.zlogin
,~/.zshenv.zwc
,~/.zshenv
,~/.zprofile
触发:使用 zsh 打开终端
/etc/zshenv
,/etc/zprofile
,/etc/zshrc
,/etc/zlogin
触发:使用 zsh 打开终端
需要 root 权限
~/.zlogout
触发:使用 zsh 退出终端
/etc/zlogout
触发:使用 zsh 退出终端
需要 root 权限
可能还有更多在:
man zsh
~/.bashrc
触发:使用 bash 打开终端
/etc/profile
(未起作用)~/.profile
(未起作用)~/.xinitrc
,~/.xserverrc
,/opt/X11/etc/X11/xinit/xinitrc.d/
触发:预期与 xterm 触发,但未安装,即使安装后也会出现此错误:xterm:
DISPLAY is not set
描述与利用
当初始化 shell 环境(如 zsh
或 bash
)时,会运行某些启动文件。macOS 当前使用 /bin/zsh
作为默认 shell。当启动终端应用程序或通过 SSH 访问设备时,将自动访问此 shell。虽然 macOS 中也存在 bash
和 sh
,但需要显式调用才能使用。
我们可以使用 man zsh
阅读 zsh 的 man 页面,其中有关启动文件的详细描述。
重新打开的应用程序
配置指定的利用方式,注销并重新登录,甚至重新启动都无法让我执行该应用程序。(应用程序没有被执行,也许需要在执行这些操作时保持运行)
Writeup: https://theevilbit.github.io/beyond/beyond_0021/
位置
~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
触发器: 重新打开应用程序
描述和利用
所有要重新打开的应用程序都在 plist 文件 ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
中。
因此,要让重新打开的应用程序启动您自己的应用程序,您只需要将您的应用程序添加到列表中。
UUID 可以在列出该目录或使用 ioreg -rd1 -c IOPlatformExpertDevice | awk -F'"' '/IOPlatformUUID/{print $4}'
找到。
要检查将要重新打开的应用程序,您可以执行以下操作:
要将应用程序添加到此列表,您可以使用:
终端偏好设置
位置
~/Library/Preferences/com.apple.Terminal.plist
触发器: 打开终端
描述与利用
在**~/Library/Preferences
中存储了用户在应用程序中的偏好设置。其中一些偏好设置可以包含配置来执行其他应用程序/脚本**。
例如,终端可以在启动时执行一个命令:
这个配置反映在文件**~/Library/Preferences/com.apple.Terminal.plist
**中,如下所示:
所以,如果系统中终端的偏好设置的 plist 文件被覆盖,那么可以使用 open
功能来打开终端并执行该命令。
您可以通过以下命令行添加此功能:
终端脚本 / 其他文件扩展名
位置
任何地方
触发器: 打开终端
描述 & 利用
如果您创建一个**.terminal
**脚本并打开它,终端应用程序将自动调用以执行其中指定的命令。如果终端应用程序具有一些特殊权限(如TCC),您的命令将以这些特殊权限运行。
尝试使用:
您还可以使用扩展名**.command
、.tool
**,带有常规shell脚本内容,它们也将被终端打开。
如果终端具有完全磁盘访问权限,它将能够完成该操作(请注意,执行的命令将在终端窗口中可见)。
音频插件
Writeup: https://theevilbit.github.io/beyond/beyond_0013/ Writeup: https://posts.specterops.io/audio-unit-plug-ins-896d3434a882
位置
/Library/Audio/Plug-Ins/HAL
需要Root权限
触发器:重新启动coreaudiod或计算机
/Library/Audio/Plug-ins/Components
需要Root权限
触发器:重新启动coreaudiod或计算机
~/Library/Audio/Plug-ins/Components
触发器:重新启动coreaudiod或计算机
/System/Library/Components
需要Root权限
触发器:重新启动coreaudiod或计算机
描述
根据先前的写作,可以编译一些音频插件并加载它们。
QuickLook插件
Writeup: https://theevilbit.github.io/beyond/beyond_0028/
位置
/System/Library/QuickLook
/Library/QuickLook
~/Library/QuickLook
/Applications/AppNameHere/Contents/Library/QuickLook/
~/Applications/AppNameHere/Contents/Library/QuickLook/
描述与利用
当您触发文件的预览(在Finder中选择文件后按空格键)并安装了支持该文件类型的插件时,QuickLook插件可以被执行。
您可以编译自己的QuickLook插件,将其放在上述位置之一以加载它,然后转到支持的文件并按空格键触发它。
登录/注销挂钩
对我来说这行不通,无论是用户LoginHook还是root LogoutHook
Writeup: https://theevilbit.github.io/beyond/beyond_0022/
位置
您需要能够执行类似
defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh
的命令位于
~/Library/Preferences/com.apple.loginwindow.plist
它们已被弃用,但可用于在用户登录时执行命令。
这个设置存储在 /Users/$USER/Library/Preferences/com.apple.loginwindow.plist
文件中。
要删除它:
根用户的启动位置存储在**/private/var/root/Library/Preferences/com.apple.loginwindow.plist
**
条件沙盒绕过
在这里,您可以找到对沙盒绕过有用的启动位置,允许您通过将内容写入文件并期望不是非常常见的条件(如特定已安装的程序、"不寻常"用户操作或环境)来简单执行某些操作。
Cron
Writeup: https://theevilbit.github.io/beyond/beyond_0004/
位置
/usr/lib/cron/tabs/
,/private/var/at/tabs
,/private/var/at/jobs
,/etc/periodic/
需要 root 权限才能直接写入。如果您可以执行
crontab <file>
,则无需 root 权限触发器:取决于 cron 作业
描述和利用
列出当前用户的 cron 作业:
您还可以查看**/usr/lib/cron/tabs/
和/var/at/tabs/
**中用户的所有cron作业(需要root权限)。
在MacOS中,可以找到几个以特定频率执行脚本的文件夹:
在这里,您可以找到常规的cron 作业,at 作业(不太常用),以及periodic 作业(主要用于清理临时文件)。 比如,可以使用periodic daily
来执行每日的周期性作业。
要通过编程方式添加用户cron作业,可以使用:
iTerm2
Writeup: https://theevilbit.github.io/beyond/beyond_0002/
位置
~/Library/Application Support/iTerm2/Scripts/AutoLaunch
触发器: 打开 iTerm
~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt
触发器: 打开 iTerm
~/Library/Preferences/com.googlecode.iterm2.plist
触发器: 打开 iTerm
描述与利用
存储在 ~/Library/Application Support/iTerm2/Scripts/AutoLaunch
中的脚本将被执行。例如:
macOS Auto Start Locations
Launch Agents
Launch Agents are used to run processes when a user logs in. They are located in ~/Library/LaunchAgents/
and /Library/LaunchAgents/
.
Launch Daemons
Launch Daemons are used to run processes at system boot or login. They are located in /Library/LaunchDaemons/
and /System/Library/LaunchDaemons/
.
Login Items
Login Items are applications that open when a user logs in. They can be managed in System Preferences > Users & Groups > Login Items
.
脚本 ~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt
也会被执行:
iTerm2偏好设置位于**~/Library/Preferences/com.googlecode.iterm2.plist
中,可以在打开iTerm2终端时指示要执行的命令**。
此设置可以在iTerm2设置中配置:
命令会反映在偏好设置中:
您可以设置要执行的命令为:
很可能有其他方法滥用 iTerm2 首选项来执行任意命令。
xbar
Writeup: https://theevilbit.github.io/beyond/beyond_0007/
位置
~/Library/Application\ Support/xbar/plugins/
触发器: 一旦 xbar 被执行
描述
如果安装了流行的程序 xbar,则可以在 ~/Library/Application\ Support/xbar/plugins/
中编写一个 shell 脚本,当 xbar 启动时将被执行:
Hammerspoon
Writeup: https://theevilbit.github.io/beyond/beyond_0008/
位置
~/.hammerspoon/init.lua
触发器: 一旦启动 Hammerspoon
描述
Hammerspoon 作为 macOS 的自动化平台,利用 LUA 脚本语言 进行操作。值得注意的是,它支持完整 AppleScript 代码的集成和 shell 脚本的执行,显著增强了其脚本编写能力。
该应用程序寻找一个单一文件,~/.hammerspoon/init.lua
,并在启动时执行该脚本。
BetterTouchTool
位置
~/Library/Application Support/BetterTouchTool/*
这个工具允许指定应用程序或脚本在按下某些快捷键时执行。攻击者可能能够配置自己的快捷键和操作以在数据库中执行任意代码(一个快捷键可能只是按下一个键)。
Alfred
位置
???
它允许创建工作流,当满足某些条件时可以执行代码。潜在地,攻击者可以创建一个工作流文件并让Alfred加载它(需要付费版本才能使用工作流)。
SSHRC
Writeup: https://theevilbit.github.io/beyond/beyond_0006/
位置
~/.ssh/rc
触发器:通过ssh登录
/etc/ssh/sshrc
需要Root权限
触发器:通过ssh登录
要打开ssh需要完全磁盘访问权限:
描述 & 利用
默认情况下,除非在 /etc/ssh/sshd_config
中设置了 PermitUserRC no
,当用户通过 SSH 登录时,将执行脚本 /etc/ssh/sshrc
和 ~/.ssh/rc
。
登录项
Writeup: https://theevilbit.github.io/beyond/beyond_0003/
位置
~/Library/Application Support/com.apple.backgroundtaskmanagementagent
触发: 登录
利用载荷存储调用
osascript
/var/db/com.apple.xpc.launchd/loginitems.501.plist
触发: 登录
需要 root 权限
描述
在“系统偏好设置” -> “用户与组” -> 登录项 中,您可以找到用户登录时要执行的 项目。 可以通过命令行列出、添加和删除它们:
这些项目存储在文件**~/Library/Application Support/com.apple.backgroundtaskmanagementagent
**
登录项也可以使用API SMLoginItemSetEnabled 进行指示,该API将在**/var/db/com.apple.xpc.launchd/loginitems.501.plist
**中存储配置。
将ZIP作为登录项
(查看有关登录项的先前部分,这是一个扩展)
如果将ZIP文件存储为登录项,Archive Utility
将打开它,例如,如果ZIP文件存储在~/Library
中,并包含带有后门的文件夹LaunchAgents/file.plist
,则该文件夹将被创建(默认情况下不会创建),并且plist将被添加,因此下次用户再次登录时,在plist中指定的后门将被执行。
另一个选项是在用户主目录中创建文件**.bash_profile
和.zshenv
**,因此如果LaunchAgents文件夹已经存在,则此技术仍将起作用。
At
Writeup: https://theevilbit.github.io/beyond/beyond_0014/
位置
需要执行
at
,并且它必须是启用的
描述
at
任务旨在安排一次性任务在特定时间执行。与cron作业不同,at
任务在执行后会自动删除。需要注意的是,这些任务在系统重新启动后仍然存在,这在某些情况下可能会被视为潜在的安全问题。
默认情况下它们是禁用的,但root用户可以使用以下命令启用它们:
这将在1小时内创建一个文件:
检查作业队列使用 atq:
以上我们可以看到两个已计划的任务。我们可以使用 at -c JOBNUMBER
命令打印任务的详细信息。
如果未启用 AT 任务,则创建的任务将不会被执行。
作业文件可以在 /private/var/at/jobs/
找到
文件名包含队列、作业编号和计划运行时间。例如,让我们看看 a0001a019bdcd2
。
a
- 这是队列0001a
- 十六进制的作业编号,0x1a = 26
019bdcd2
- 十六进制的时间。它表示自纪元以来经过的分钟数。0x019bdcd2
在十进制中是26991826
。如果我们将其乘以60,我们得到1619509560
,这是GMT: 2021年4月27日,星期二 7:46:00
。
如果我们打印作业文件,我们会发现它包含了我们使用 at -c
得到的相同信息。
文件夹操作
Writeup: https://theevilbit.github.io/beyond/beyond_0024/ Writeup: https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d
位置
/Library/Scripts/Folder Action Scripts
需要 root 权限
触发器:访问指定文件夹
~/Library/Scripts/Folder Action Scripts
触发器:访问指定文件夹
描述与利用
文件夹操作是由文件夹中的更改自动触发的脚本,例如添加、删除项目,或其他操作,如打开或调整文件夹窗口大小。这些操作可用于各种任务,并且可以通过不同方式触发,如使用 Finder UI 或终端命令。
设置文件夹操作时,您可以选择以下选项:
使用 Automator 制作文件夹操作工作流,并将其安装为服务。
通过文件夹上下文菜单中的文件夹操作设置手动附加脚本。
利用 OSAScript 向
System Events.app
发送苹果事件消息,以通过编程方式设置文件夹操作。
这种方法特别适用于将操作嵌入系统中,提供一定程度的持久性。
以下脚本是文件夹操作中可以执行的示例:
要使上述脚本可被文件夹操作使用,请使用以下命令进行编译:
在脚本编译完成后,通过执行以下脚本设置文件夹操作。此脚本将全局启用文件夹操作,并将先前编译的脚本专门附加到桌面文件夹。
使用以下命令运行设置脚本:
这是通过 GUI 实现持久性的方法:
这是将要执行的脚本:
使用以下命令编译:osacompile -l JavaScript -o folder.scpt source.js
移动到:
然后,打开Folder Actions Setup
应用程序,选择您想要监视的文件夹,然后在您的情况下选择**folder.scpt
**(在我的情况下,我将其命名为output2.scp):
现在,如果您使用Finder打开该文件夹,您的脚本将被执行。
此配置存储在以base64格式存储的plist中,位于**~/Library/Preferences/com.apple.FolderActionsDispatcher.plist
**。
现在,让我们尝试在没有GUI访问权限的情况下准备这个持久性:
复制
~/Library/Preferences/com.apple.FolderActionsDispatcher.plist
到/tmp
以备份它:
cp ~/Library/Preferences/com.apple.FolderActionsDispatcher.plist /tmp
删除您刚刚设置的文件夹操作:
现在我们有了一个空的环境
复制备份文件:
cp /tmp/com.apple.FolderActionsDispatcher.plist ~/Library/Preferences/
打开Folder Actions Setup.app以使用此配置:
open "/System/Library/CoreServices/Applications/Folder Actions Setup.app/"
对我来说这个方法不起作用,但这是来自报告的指令:(
Dock快捷方式
报告:https://theevilbit.github.io/beyond/beyond_0027/
位置
~/Library/Preferences/com.apple.dock.plist
触发器:当用户点击Dock内的应用程序时
描述和利用
Dock中显示的所有应用程序都在plist文件中指定:~/Library/Preferences/com.apple.dock.plist
只需使用以下命令即可添加一个应用程序:
通过一些社会工程,你可以在 dock 中冒充例如 Google Chrome,实际上执行你自己的脚本:
颜色选择器
Writeup: https://theevilbit.github.io/beyond/beyond_0017
位置
/Library/ColorPickers
需要root权限
触发条件:使用颜色选择器
~/Library/ColorPickers
触发条件:使用颜色选择器
描述与利用
编译一个颜色选择器捆绑包与你的代码(你可以使用这个作为例子),并添加一个构造函数(就像屏幕保护程序部分中一样),然后将捆绑包复制到~/Library/ColorPickers
。
然后,当颜色选择器被触发时,你的代码也应该被执行。
请注意,加载你的库的二进制文件有一个非常严格的沙盒:/System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/LegacyExternalColorPickerService-x86_64.xpc/Contents/MacOS/LegacyExternalColorPickerService-x86_64
Finder Sync插件
Writeup: https://theevilbit.github.io/beyond/beyond_0026/ Writeup: https://objective-see.org/blog/blog_0x11.html
有用于绕过沙盒: 否,因为您需要执行自己的应用程序
TCC绕过: ???
位置
一个特定的应用程序
描述 & 攻击
一个带有Finder Sync扩展的应用程序示例可以在这里找到。
应用程序可以拥有Finder Sync Extensions
。这个扩展将放在将要执行的应用程序中。此外,为了使扩展能够执行其代码,它必须使用一些有效的苹果开发者证书进行签名,它必顶必须被沙盒化(尽管可以添加宽松的例外),并且必须注册到类似于:
屏幕保护程序
Writeup: https://theevilbit.github.io/beyond/beyond_0016/ Writeup: https://posts.specterops.io/saving-your-access-d562bf5bf90b
位置
/System/Library/Screen Savers
需要root权限
触发器:选择屏幕保护程序
/Library/Screen Savers
需要root权限
触发器:选择屏幕保护程序
~/Library/Screen Savers
触发器:选择屏幕保护程序
描述与利用
在Xcode中创建一个新项目,并选择模板生成一个新的屏幕保护程序。然后,将代码添加到其中,例如以下代码以生成日志。
构建它,并将.saver
捆绑包复制到**~/Library/Screen Savers
**。然后,打开屏幕保护程序GUI,只需单击它,它应该会生成大量日志:
请注意,因为在加载此代码的二进制文件的授权中(/System/Library/Frameworks/ScreenSaver.framework/PlugIns/legacyScreenSaver.appex/Contents/MacOS/legacyScreenSaver
)您可以找到**com.apple.security.app-sandbox
,您将处于常见应用程序沙箱内**。
Saver 代码:
Spotlight插件
writeup: https://theevilbit.github.io/beyond/beyond_0011/
位置
~/Library/Spotlight/
触发条件:创建一个由Spotlight插件管理的扩展名的新文件。
/Library/Spotlight/
触发条件:创建一个由Spotlight插件管理的扩展名的新文件。
需要Root权限
/System/Library/Spotlight/
触发条件:创建一个由Spotlight插件管理的扩展名的新文件。
需要Root权限
Some.app/Contents/Library/Spotlight/
触发条件:创建一个由Spotlight插件管理的扩展名的新文件。
需要新的应用程序
描述和利用
Spotlight是macOS内置的搜索功能,旨在为用户提供快速和全面访问计算机上的数据。 为了促进这种快速搜索功能,Spotlight维护一个专有数据库,通过解析大多数文件创建索引,使得可以通过文件名和内容快速搜索。
Spotlight的基本机制涉及一个名为'mds'的中央进程,代表**'元数据服务器'。该进程协调整个Spotlight服务。除此之外,还有多个执行各种维护任务的'mdworker'守护程序,例如索引不同文件类型(ps -ef | grep mdworker
)。这些任务通过Spotlight导入器插件或".mdimporter bundles**"实现,这些插件使Spotlight能够理解和索引各种文件格式的内容。
这些插件或**.mdimporter
** bundles位于先前提到的位置,如果出现新的bundle,它会在一分钟内加载(无需重新启动任何服务)。这些bundles需要指示它们可以管理哪些文件类型和扩展名,这样,当创建具有指定扩展名的新文件时,Spotlight将使用它们。
可以通过运行以下命令找到所有加载的mdimporters
:
例如 /Library/Spotlight/iBooksAuthor.mdimporter 用于解析这些类型的文件(扩展名为 .iba
和 .book
等):
如果您检查其他mdimporter
的Plist文件,可能找不到条目**UTTypeConformsTo
**。这是因为这是一个内置的_统一类型标识符_(UTI),不需要指定扩展名。
此外,系统默认插件始终优先,因此攻击者只能访问那些苹果自己的mdimporters
未索引的文件。
要创建自己的导入器,您可以从这个项目开始:https://github.com/megrimm/pd-spotlight-importer,然后更改名称,CFBundleDocumentTypes
并添加UTImportedTypeDeclarations
,以便支持您想要支持的扩展名,并在**schema.xml
中反映它们。
然后更改函数GetMetadataForFile
**的代码,以便在创建具有已处理扩展名的文件时执行您的有效负载。
最后构建并复制您的新.mdimporter
到三个先前位置之一,您可以通过监视日志或检查**mdimport -L.
**来检查它何时加载。
首选项窗格
看起来这个不再起作用了。
撰写:https://theevilbit.github.io/beyond/beyond_0009/
位置
/System/Library/PreferencePanes
/Library/PreferencePanes
~/Library/PreferencePanes
描述
看起来这个不再起作用了。
Root沙箱绕过
在这里,您可以找到有用于绕过沙箱的起始位置,允许您通过将内容写入文件并且是root或需要其他奇怪条件来简单执行某些内容。
周期性
撰写:https://theevilbit.github.io/beyond/beyond_0019/
位置
/etc/periodic/daily
、/etc/periodic/weekly
、/etc/periodic/monthly
、/usr/local/etc/periodic
需要root权限
触发器:时间到达时
/etc/daily.local
、/etc/weekly.local
或/etc/monthly.local
需要root权限
触发器:时间到达时
描述与利用
周期性脚本(/etc/periodic
)会被执行,因为在/System/Library/LaunchDaemons/com.apple.periodic*
中配置了启动守护程序。请注意,存储在/etc/periodic/
中的脚本将作为文件的所有者执行,因此这对于潜在的特权升级不起作用。
还有其他定期脚本将在 /etc/defaults/periodic.conf
中执行:
如果您设法编写任何文件/etc/daily.local
、/etc/weekly.local
或/etc/monthly.local
,它将迟早被执行。
请注意,周期性脚本将作为脚本的所有者执行。因此,如果常规用户拥有脚本,它将作为该用户执行(这可能会防止特权升级攻击)。
PAM
Writeup: Linux Hacktricks PAM Writeup: https://theevilbit.github.io/beyond/beyond_0005/
位置
始终需要Root权限
描述和利用
由于PAM更专注于持久性和恶意软件,而不是在macOS内部轻松执行,因此本博客不会提供详细解释,请阅读这些文章以更好地理解这一技术。
使用以下命令检查PAM模块:
一种滥用PAM的持久性/权限提升技术很简单,只需修改模块/etc/pam.d/sudo,在开头添加以下行:
所以它会看起来像这样:
因此,任何尝试使用**sudo
的操作**都会生效。
请注意,此目录受TCC保护,因此用户很可能会收到要求访问权限的提示。
授权插件
Writeup: https://theevilbit.github.io/beyond/beyond_0028/ Writeup: https://posts.specterops.io/persistent-credential-theft-with-authorization-plugins-d17b34719d65
有用于绕过沙盒:🟠
但需要以root身份并进行额外配置
TCC绕过:???
位置
/Library/Security/SecurityAgentPlugins/
需要root权限
还需要配置授权数据库以使用插件
描述与利用
您可以创建一个授权插件,在用户登录时执行以保持持久性。有关如何创建这些插件的更多信息,请查看先前的写作(请注意,编写不当的插件可能会将您锁定,您将需要从恢复模式中清理您的Mac)。
将 bundle 移动到要加载的位置:
最后添加加载此插件的规则:
evaluate-mechanisms
会告诉授权框架需要调用外部机制进行授权。此外,privileged
会使其以 root 用户身份执行。
触发方式:
然后staff组应该具有sudo权限(阅读/etc/sudoers
以确认)。
Man.conf
Writeup: https://theevilbit.github.io/beyond/beyond_0030/
位置
/private/etc/man.conf
需要root权限
/private/etc/man.conf
:每当使用man时
描述和利用
配置文件**/private/etc/man.conf
**指示打开man文档文件时要使用的二进制文件/脚本。因此,可修改可执行文件的路径,以便每当用户使用man阅读文档时,将执行后门。
例如,在**/private/etc/man.conf
**中设置:
然后创建 /tmp/view
如下:
Apache2
Writeup: https://theevilbit.github.io/beyond/beyond_0023/
位置
/etc/apache2/httpd.conf
需要 root 权限
触发条件:当 Apache2 启动时
描述和利用
您可以在 /etc/apache2/httpd.conf
中指定加载一个模块,添加一行代码,例如:
这样,您编译的模块将由Apache加载。唯一的问题是,您需要使用有效的苹果证书进行签名,或者您需要在系统中添加一个新的受信任证书并用其进行签名。
然后,如果需要确保服务器将启动,您可以执行:
Dylb的代码示例:
BSM审计框架
Writeup: https://theevilbit.github.io/beyond/beyond_0031/
位置
/etc/security/audit_warn
需要root权限
触发条件: 当auditd检测到警告时
描述与利用
每当auditd检测到警告时,脚本 /etc/security/audit_warn
会被 执行。因此,您可以在其中添加您的有效负载。
启动项
此功能已被弃用,因此这些目录中不应该找到任何内容。
StartupItem 是一个目录,应该位于 /Library/StartupItems/
或 /System/Library/StartupItems/
中的一个。一旦建立了这个目录,它必须包含两个特定的文件:
一个 rc 脚本:在启动时执行的 shell 脚本。
一个 plist 文件,具体命名为
StartupParameters.plist
,其中包含各种配置设置。
确保将 rc 脚本和 StartupParameters.plist
文件都正确放置在 StartupItem 目录中,以便启动过程识别和利用它们。
emond
在我的 macOS 中找不到这个组件,欲了解更多信息,请查看 writeup
Writeup: https://theevilbit.github.io/beyond/beyond_0023/
由 Apple 引入的 emond 是一个日志记录机制,似乎开发不足或可能被放弃,但仍然可以访问。虽然对于 Mac 管理员来说并不特别有益,但这个鲜为人知的服务可能作为威胁行为者的微妙持久性方法,很可能不会被大多数 macOS 管理员注意到。
对于知道其存在的人来说,识别 emond 的任何恶意使用是直截了当的。该服务的 LaunchDaemon 寻找要在单个目录中执行的脚本。要检查这一点,可以使用以下命令:
XQuartz
Writeup: https://theevilbit.github.io/beyond/beyond_0018/
位置
/opt/X11/etc/X11/xinit/privileged_startx.d
需要 Root 权限
触发条件:使用 XQuartz
描述 & 攻击
XQuartz 不再安装在 macOS 中,如果您想获取更多信息,请查看 writeup。
kext
即使作为 root 安装 kext 也很复杂,我不认为这是逃离沙盒或实现持久性的好方法(除非您有漏洞利用)
位置
要将 KEXT 安装为启动项,需要将其安装在以下位置之一:
/System/Library/Extensions
内置于 OS X 操作系统中的 KEXT 文件。
/Library/Extensions
第三方软件安装的 KEXT 文件
您可以使用以下命令列出当前加载的 kext 文件:
有关内核扩展,请查看此部分。
amstoold
Writeup: https://theevilbit.github.io/beyond/beyond_0029/
位置
/usr/local/bin/amstoold
需要 root 权限
描述 & 利用
显然,/System/Library/LaunchAgents/com.apple.amstoold.plist
中的 plist
使用了这个二进制文件,同时暴露了一个 XPC 服务... 问题在于该二进制文件不存在,因此您可以在那里放置一些内容,当调用 XPC 服务时,您的二进制文件将被调用。
我在我的 macOS 中找不到这个了。
xsanctl
Writeup: https://theevilbit.github.io/beyond/beyond_0015/
位置
/Library/Preferences/Xsan/.xsanrc
需要 root 权限
触发条件:当服务运行时(很少)
描述 & 利用
显然,运行此脚本并不是很常见,我甚至在我的 macOS 中找不到它,所以如果您想了解更多信息,请查看 writeup。
/etc/rc.common
在现代 MacOS 版本中不起作用
还可以在这里放置将在启动时执行的命令。例如常规 rc.common 脚本示例:
持久化技术和工具
Last updated