macOS Auto Start
Last updated
Last updated
学习和实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习和实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)
本节内容主要基于博客系列 超越传统的 LaunchAgents,目标是添加 更多自动启动位置(如果可能),指明 哪些技术在最新版本的 macOS(13.4)中仍然有效,并指定所需的 权限。
在这里,您可以找到对 沙盒绕过 有用的启动位置,这允许您通过 将其写入文件 并 等待 一个非常 常见 的 操作、特定的 时间 或您通常可以在沙盒内执行的 操作 来简单地执行某些内容,而无需根权限。
/Library/LaunchAgents
触发:重启
需要根权限
/Library/LaunchDaemons
触发:重启
需要根权限
/System/Library/LaunchAgents
触发:重启
需要根权限
/System/Library/LaunchDaemons
触发:重启
需要根权限
~/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/LaunchDaemos/com.apple.smdb.plist
列出当前用户加载的所有代理和守护进程:
如果一个 plist 文件属于一个用户,即使它在守护进程的系统范围文件夹中,任务将以用户身份执行而不是以 root 身份执行。这可以防止某些特权升级攻击。
launchd
是从 内核 启动的 第一个 用户模式进程。进程启动必须是 成功的,并且 不能退出或崩溃。它甚至对某些 杀死信号 进行了 保护。
launchd
首先要做的事情之一是 启动 所有的 守护进程,例如:
基于时间执行的 定时守护进程:
atd (com.apple.atrun.plist
): 有一个 StartInterval
为 30 分钟
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
: 在 TCP 端口 1640 上监听
路径守护进程,在指定路径更改时执行:
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
的 FB86416D-6164-2070-726F-70735C216EC0
键下的 CFPluginFactories
字典中。
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。虽然 bash
和 sh
也存在于 macOS 中,但需要显式调用才能使用。
zsh 的手册页,我们可以通过 man zsh
阅读,详细描述了启动文件。
配置所示的利用和注销再登录或甚至重启对我执行应用程序没有效果。(应用程序没有被执行,也许在执行这些操作时需要它正在运行)
写作: 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
Trigger: 打开终端
在 ~/Library/Preferences
中存储用户在应用程序中的偏好设置。这些偏好设置中的一些可以包含 执行其他应用程序/脚本 的配置。
例如,终端可以在启动时执行一个命令:
此配置在文件 ~/Library/Preferences/com.apple.Terminal.plist
中反映如下:
所以,如果系统中终端的偏好设置的plist可以被覆盖,那么**open
功能可以用来打开终端并执行该命令**。
您可以通过cli添加此内容:
任何地方
触发: 打开终端
如果你创建一个 .terminal
脚本 并打开,终端应用程序将自动调用以执行其中指示的命令。如果终端应用程序具有某些特殊权限(例如 TCC),你的命令将以这些特殊权限运行。
尝试使用:
您还可以使用扩展名 .command
、.tool
,并包含常规 shell 脚本内容,它们也将由终端打开。
如果终端具有 完全磁盘访问权限,它将能够完成该操作(请注意,执行的命令将在终端窗口中可见)。
写作: https://theevilbit.github.io/beyond/beyond_0013/ 写作: 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 或计算机
根据之前的写作,可以 编译一些音频插件 并使其加载。
写作: 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
写作: 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
要删除它:
The root user one is stored in /private/var/root/Library/Preferences/com.apple.loginwindow.plist
在这里您可以找到对沙箱绕过有用的启动位置,这允许您通过将其写入文件并期望不太常见的条件(如特定的已安装程序、"不常见"用户操作或环境)来简单地执行某些操作。
写作: 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 daily
。
要以编程方式添加 用户 cronjob,可以使用:
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
中的脚本将被执行。例如:
或:
该脚本 ~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt
也将被执行:
iTerm2 的偏好设置位于 ~/Library/Preferences/com.googlecode.iterm2.plist
,可以 指示在打开 iTerm2 终端时执行的命令。
此设置可以在 iTerm2 设置中配置:
该命令在偏好设置中反映:
您可以设置要执行的命令:
高度可能还有其他方法滥用iTerm2首选项以执行任意命令。
写作: https://theevilbit.github.io/beyond/beyond_0007/
~/Library/Application\ Support/xbar/plugins/
触发: 一旦执行xbar
如果安装了流行程序xbar,可以在**~/Library/Application\ Support/xbar/plugins/
**中编写一个shell脚本,该脚本将在启动xbar时执行:
Writeup: https://theevilbit.github.io/beyond/beyond_0008/
~/.hammerspoon/init.lua
Trigger: 一旦执行 hammerspoon
Hammerspoon 作为 macOS 的自动化平台,利用 LUA 脚本语言 进行操作。值得注意的是,它支持完整的 AppleScript 代码集成和 shell 脚本的执行,显著增强了其脚本能力。
该应用程序查找一个文件 ~/.hammerspoon/init.lua
,并在启动时执行该脚本。
~/Library/Application Support/BetterTouchTool/*
该工具允许指示在按下某些快捷键时执行的应用程序或脚本。攻击者可能能够在数据库中配置自己的快捷键和要执行的操作以执行任意代码(快捷键可以只是按下一个键)。
???
它允许创建在满足特定条件时可以执行代码的工作流。攻击者可能能够创建一个工作流文件并使 Alfred 加载它(需要支付高级版本才能使用工作流)。
写作: 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
将被执行。
写作: 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 指示,该配置将存储在 /var/db/com.apple.xpc.launchd/loginitems.501.plist
(查看关于登录项的前一部分,这是一个扩展)
如果您将 ZIP 文件存储为 登录项,则 Archive Utility
将打开它,如果该 zip 例如存储在 ~/Library
中并包含文件夹 LaunchAgents/file.plist
及后门,则该文件夹将被创建(默认情况下并不存在),plist 将被添加,因此下次用户再次登录时,plist 中指示的后门将被执行。
另一个选项是在用户 HOME 中创建文件 .bash_profile
和 `.zshenv,这样如果文件夹 LaunchAgents 已经存在,这种技术仍然有效。
写作: 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. April 27., Tuesday 7:46:00
。
如果我们打印作业文件,我们会发现它包含与我们使用 at -c
获得的相同信息。
写作: https://theevilbit.github.io/beyond/beyond_0024/ 写作: https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d
/Library/Scripts/Folder Action Scripts
需要 root 权限
触发器: 访问指定文件夹
~/Library/Scripts/Folder Action Scripts
触发器: 访问指定文件夹
文件夹操作是由文件夹中的变化自动触发的脚本,例如添加、删除项目或其他操作,如打开或调整文件夹窗口的大小。这些操作可以用于各种任务,并可以通过不同的方式触发,例如使用 Finder 界面或终端命令。
要设置文件夹操作,你可以选择:
使用 Automator 创建文件夹操作工作流并将其安装为服务。
通过文件夹的上下文菜单中的文件夹操作设置手动附加脚本。
利用 OSAScript 向 System Events.app
发送 Apple Event 消息,以编程方式设置文件夹操作。
这种方法特别适合将操作嵌入系统,提供一定程度的持久性。
以下脚本是文件夹操作可以执行的示例:
要使上述脚本可用于文件夹操作,请使用以下命令编译它:
在脚本编译后,通过执行以下脚本来设置文件夹操作。此脚本将全局启用文件夹操作,并将之前编译的脚本特定地附加到桌面文件夹。
运行设置脚本:
这是通过GUI实现这种持久性的方式:
这是将要执行的脚本:
编译它: osacompile -l JavaScript -o folder.scpt source.js
移动到:
然后,打开 Folder Actions Setup
应用,选择 您想要监视的文件夹,并在您的情况下选择 folder.scpt
(在我的情况下我称它为 output2.scp):
现在,如果您使用 Finder 打开该文件夹,您的脚本将被执行。
此配置存储在 plist 中,位于 ~/Library/Preferences/com.apple.FolderActionsDispatcher.plist
的 base64 格式中。
现在,让我们尝试在没有 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/"
这对我没有用,但这些是写作中的说明:(
写作: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
写作: https://theevilbit.github.io/beyond/beyond_0026/ 写作: https://objective-see.org/blog/blog_0x11.html
绕过沙盒的有用性: 不,因为你需要执行自己的应用程序
TCC 绕过: ???
一个特定的应用程序
一个带有 Finder Sync 扩展的应用程序示例 可以在这里找到。
应用程序可以拥有 Finder Sync Extensions
。这个扩展将嵌入到将要执行的应用程序中。此外,为了使扩展能够执行其代码,它 必须被签名,并且必须拥有有效的 Apple 开发者证书,它必须是 沙盒化的(尽管可以添加放宽的例外),并且必须注册为类似于:
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 code:
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' 的中央进程,代表 'metadata server'。该进程协调整个 Spotlight 服务。与此相辅相成的是多个 'mdworker' 守护进程,它们执行各种维护任务,例如索引不同类型的文件 (ps -ef | grep mdworker
)。这些任务通过 Spotlight 导入插件或 ".mdimporter bundles" 实现,使 Spotlight 能够理解和索引各种文件格式的内容。
插件或 .mdimporter
包位于前面提到的位置,如果出现新的包,它会在一分钟内加载(无需重启任何服务)。这些包需要指明它们可以管理的 文件类型和扩展名,这样,Spotlight 在创建具有指定扩展名的新文件时将使用它们。
可以通过运行 find all the 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 身份简单执行某些操作和/或需要其他 奇怪条件。
写作: 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
,它将会 迟早被执行。
请注意,周期性脚本将以 脚本所有者的身份执行。因此,如果常规用户拥有该脚本,它将以该用户的身份执行(这可能会防止特权升级攻击)。
写作: Linux Hacktricks PAM 写作: https://theevilbit.github.io/beyond/beyond_0005/
始终需要 root
由于 PAM 更专注于 持久性 和恶意软件,而不是在 macOS 中的简单执行,因此本博客不会给出详细的解释,请阅读写作以更好地理解此技术。
使用以下命令检查 PAM 模块:
一种利用PAM的持久性/特权提升技术,修改模块/etc/pam.d/sudo,在开头添加以下行是非常简单的:
所以它看起来像这样:
因此,任何尝试使用 sudo
都会有效。
请注意,此目录受到 TCC 保护,因此用户很可能会收到请求访问的提示。
另一个不错的例子是 su,您可以看到也可以向 PAM 模块提供参数(您也可以对该文件进行后门处理):
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)。
将捆绑包移动到要加载的位置:
最后添加规则以加载此插件:
evaluate-mechanisms
将告诉授权框架它需要 调用外部机制进行授权。此外,privileged
将使其由 root 执行。
通过以下方式触发它:
然后staff组应该拥有sudo访问权限(阅读/etc/sudoers
以确认)。
写作: 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
为:
写作: https://theevilbit.github.io/beyond/beyond_0023/
/etc/apache2/httpd.conf
需要root权限
触发: 当Apache2启动时
你可以在/etc/apache2/httpd.conf
中指示加载一个模块,添加一行如下:
这样,您的编译模块将由 Apache 加载。唯一需要注意的是,您需要 使用有效的 Apple 证书进行签名,或者您需要 在系统中添加一个新的受信任证书 并 使用它进行签名。
然后,如果需要,确保服务器将启动,您可以执行:
代码示例用于 Dylb:
Writeup: https://theevilbit.github.io/beyond/beyond_0031/
/etc/security/audit_warn
需要 root 权限
触发: 当 auditd 检测到警告时
每当 auditd 检测到警告时,脚本 /etc/security/audit_warn
会被 执行。所以你可以在其中添加你的有效载荷。
您可以使用 sudo audit -n
强制发出警告。
这已被弃用,因此这些目录中不应找到任何内容。
StartupItem 是一个目录,应该位于 /Library/StartupItems/
或 /System/Library/StartupItems/
中。一旦建立此目录,它必须包含两个特定文件:
一个 rc 脚本:在启动时执行的 shell 脚本。
一个 plist 文件,特定命名为 StartupParameters.plist
,其中包含各种配置设置。
确保 rc 脚本和 StartupParameters.plist
文件正确放置在 StartupItem 目录中,以便启动过程能够识别和使用它们。
我在我的 macOS 中找不到这个组件,因此有关更多信息,请查看写作
写作:https://theevilbit.github.io/beyond/beyond_0023/
由苹果公司引入,emond 是一种日志记录机制,似乎未得到充分开发或可能已被放弃,但仍然可以访问。虽然对 Mac 管理员来说并不特别有益,但这个模糊的服务可能作为威胁行为者的微妙持久性方法,可能不会被大多数 macOS 管理员注意到。
对于那些知道其存在的人,识别 emond 的任何恶意使用是简单的。该服务的系统 LaunchDaemon 在一个目录中寻找要执行的脚本。要检查这一点,可以使用以下命令:
Writeup: https://theevilbit.github.io/beyond/beyond_0018/
/opt/X11/etc/X11/xinit/privileged_startx.d
需要root权限
触发: 使用XQuartz
XQuartz 不再安装在macOS中,所以如果你想要更多信息,请查看写作。
即使作为root安装kext也非常复杂,因此我不会考虑这作为逃避沙箱或持久性的方法(除非你有一个漏洞)
为了将KEXT作为启动项安装,它需要安装在以下位置之一:
/System/Library/Extensions
内置于OS X操作系统的KEXT文件。
/Library/Extensions
由第三方软件安装的KEXT文件
你可以使用以下命令列出当前加载的kext文件:
对于有关内核扩展,请查看本节。
写作: https://theevilbit.github.io/beyond/beyond_0029/
/usr/local/bin/amstoold
需要root权限
显然,来自/System/Library/LaunchAgents/com.apple.amstoold.plist
的plist
在暴露XPC服务时使用了这个二进制文件……问题是这个二进制文件并不存在,因此你可以在这里放置一些东西,当XPC服务被调用时,你的二进制文件将被调用。
我在我的macOS中再也找不到这个。
写作: https://theevilbit.github.io/beyond/beyond_0015/
/Library/Preferences/Xsan/.xsanrc
需要root权限
触发: 当服务运行时(很少)
显然,运行这个脚本并不常见,我甚至在我的macOS中找不到它,因此如果你想要更多信息,请查看写作。
这在现代MacOS版本中不起作用
在这里也可以放置在启动时执行的命令。 示例是常规的rc.common脚本:
学习和实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习和实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)