Translated ['macos-hardening/macos-security-and-privilege-escalation/mac

This commit is contained in:
Translator 2024-09-24 15:17:24 +00:00
parent eb90b4b148
commit 60bf379a6c
2 changed files with 220 additions and 67 deletions

View file

@ -1,8 +1,8 @@
# macOS Sandbox
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
Learn & practice AWS Hacking:<img src="../../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="../../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
@ -19,9 +19,9 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
MacOS Sandbox最初称为 Seatbelt**限制应用程序**在沙箱内运行时的**允许操作,这些操作在应用程序运行的沙箱配置文件中指定**。这有助于确保**应用程序仅访问预期的资源**。
任何具有**权限** **`com.apple.security.app-sandbox`**的应用程序都将在沙箱内执行。**Apple 二进制文件**通常在沙箱内执行,并且为了在**App Store**中发布,**此权限是强制性的**。因此,大多数应用程序将在沙箱内执行。
任何具有**权限** **`com.apple.security.app-sandbox`**的应用程序都将在沙箱内执行。**Apple 二进制文件**通常在沙箱内执行,所有来自**App Store**的应用程序都有该权限。因此,多个应用程序将在沙箱内执行。
为了控制进程可以或不能做什么,**沙箱在内核的所有**syscalls**中都有钩子**。**根据**应用程序的**权限**,沙箱将**允许**某些操作
为了控制进程可以或不能做什么,**沙箱在几乎所有进程可能尝试的操作中都有钩子**(包括大多数系统调用),使用**MACF**。然而,**根据**应用程序的**权限**,沙箱可能对进程更加宽松
沙箱的一些重要组件包括:
@ -30,7 +30,9 @@ MacOS Sandbox最初称为 Seatbelt**限制应用程序**在沙箱内运行
* 在用户空间运行的**守护进程** `/usr/libexec/sandboxd`
* **容器** `~/Library/Containers`
在容器文件夹中,您可以找到**每个以沙箱方式执行的应用程序的文件夹**,其名称为包 ID
### Containers
每个沙箱应用程序将在 `~/Library/Containers/{CFBundleIdentifier}` 中拥有自己的容器:
```bash
ls -l ~/Library/Containers
total 0
@ -41,7 +43,7 @@ drwx------@ 4 username staff 128 Mar 25 14:14 com.apple.Accessibility-Settings
drwx------@ 4 username staff 128 Mar 25 14:10 com.apple.ActionKit.BundledIntentHandler
[...]
```
在每个 bundle id 文件夹内,您可以找到应用的 **plist****数据目录**
在每个 bundle id 文件夹内,您可以找到应用的 **plist****数据目录**,其结构模仿主目录
```bash
cd /Users/username/Library/Containers/com.apple.Safari
ls -la
@ -65,10 +67,13 @@ drwx------ 2 username staff 64 Mar 24 18:02 SystemData
drwx------ 2 username staff 64 Mar 24 18:02 tmp
```
{% hint style="danger" %}
请注意,即使符号链接存在以“逃离”沙箱并访问其他文件夹,应用程序仍然需要**拥有权限**才能访问它们。这些权限在**`.plist`**中
请注意,即使符号链接存在以“逃离”沙箱并访问其他文件夹,应用程序仍然需要**拥有权限**才能访问它们。这些权限在`RedirectablePaths`中的**`.plist`**内
{% endhint %}
**`SandboxProfileData`**是编译后的沙箱配置文件CFData已转义为B64。
```bash
# Get permissions
# Get container config
## You need FDA to access the file, not even just root can read it
plutil -convert xml1 .com.apple.containermanagerd.metadata.plist -o -
# Binary sandbox profile
@ -118,9 +123,9 @@ AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf...
由沙盒应用程序创建/修改的所有内容将获得**隔离属性**。这将通过触发Gatekeeper来防止沙盒空间如果沙盒应用程序尝试使用**`open`**执行某些操作。
{% endhint %}
### 沙盒配置文件
## 沙盒配置文件
沙盒配置文件是指示在该**沙盒**中将被**允许/禁止**的配置文件。它使用**沙盒配置文件语言SBPL**,该语言使用[**Scheme**](https://en.wikipedia.org/wiki/Scheme\_\(programming\_language\))编程语言。
沙盒配置文件是指示在该**沙盒**中将被**允许/禁止**的内容的配置文件。它使用**沙盒配置文件语言SBPL**,该语言使用[**Scheme**](https://en.wikipedia.org/wiki/Scheme\_\(programming\_language\))编程语言。
在这里您可以找到一个示例:
```scheme
@ -142,12 +147,14 @@ AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf...
```
{% hint style="success" %}
查看这个 [**研究**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/) **以检查更多可以被允许或拒绝的操作。**
请注意在配置文件的编译版本中操作的名称被其在一个数组中的条目所替代该数组为dylib和kext所知使得编译版本更短且更难以阅读。
{% endhint %}
重要的 **系统服务** 也在它们自己的自定义 **沙箱**运行,例如 `mdnsresponder` 服务。您可以在以下位置查看这些自定义 **沙箱配置文件**
重要的 **系统服务** 也在其自定义 **沙箱**运行,例如 `mdnsresponder` 服务。您可以在以下位置查看这些自定义 **沙箱配置文件**
* **`/usr/share/sandbox`**
* **`/System/Library/Sandbox/Profiles`**&#x20;
* **`/System/Library/Sandbox/Profiles`**
* 其他沙箱配置文件可以在 [https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles](https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles) 中查看。
**App Store** 应用使用 **配置文件** **`/System/Library/Sandbox/Profiles/application.sb`**。您可以在此配置文件中检查诸如 **`com.apple.security.network.server`** 的权限如何允许进程使用网络。
@ -211,50 +218,57 @@ log show --style syslog --predicate 'eventMessage contains[c] "sandbox"' --last
{% endtabs %}
{% hint style="info" %}
请注意,**苹果编写的** **软件****Windows****没有额外的安全措施**,例如应用程序沙箱。
请注意,**Apple 编写的** **软件****Windows****没有额外的安全措施**,例如应用程序沙箱。
{% endhint %}
绕过示例:
* [https://lapcatsoftware.com/articles/sandbox-escape.html](https://lapcatsoftware.com/articles/sandbox-escape.html)
* [https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c](https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c)(他们能够写入以 `~$` 开头的沙箱外文件)
* [https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c](https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c) (他们能够写入以 `~$` 开头的沙箱外文件)
### MacOS 沙箱配置文件
### 沙箱跟踪
macOS 将系统沙箱配置文件存储在两个位置:**/usr/share/sandbox/** 和 **/System/Library/Sandbox/Profiles**。
#### 通过配置文件
如果第三方应用程序携带 _**com.apple.security.app-sandbox**_ 权限,系统会将 **/System/Library/Sandbox/Profiles/application.sb** 配置文件应用于该进程。
可以跟踪每次检查操作时沙箱执行的所有检查。为此,只需创建以下配置文件:
### **iOS 沙箱配置文件**
默认配置文件称为 **container**,我们没有 SBPL 文本表示。在内存中,这个沙箱被表示为每个权限的允许/拒绝二叉树。
### 调试与绕过沙箱
在 macOS 上,与 iOS 不同iOS 的进程从一开始就由内核进行沙箱化,**进程必须自行选择进入沙箱**。这意味着在 macOS 上,进程在主动决定进入沙箱之前不会受到沙箱的限制。
如果进程具有权限 `com.apple.security.app-sandbox`,则它们在启动时会自动从用户空间沙箱化。有关此过程的详细说明,请查看:
{% content-ref url="macos-sandbox-debug-and-bypass/" %}
[macos-sandbox-debug-and-bypass](macos-sandbox-debug-and-bypass/)
{% endcontent-ref %}
### **检查 PID 权限**
[**根据这个**](https://www.youtube.com/watch?v=mG715HcDgO8\&t=3011s)**`sandbox_check`**(它是一个 `__mac_syscall`)可以检查 **某个 PID 是否允许某个操作**
[**工具 sbtool**](http://newosxbook.com/src.jl?tree=listings\&file=sbtool.c) 可以检查某个 PID 是否可以执行某个操作:
```bash
sbtool <pid> mach #Check mac-ports (got from launchd with an api)
sbtool <pid> file /tmp #Check file access
sbtool <pid> inspect #Gives you an explaination of the sandbox profile
sbtool <pid> all
{% code title="trace.sb" %}
```scheme
(version 1)
(trace /tmp/trace.out)
```
{% endcode %}
然后只需使用该配置文件执行某些操作:
```bash
sandbox-exec -f /tmp/trace.sb /bin/ls
```
`/tmp/trace.out` 中,您将能够看到每次调用时执行的每个沙箱检查(因此,有很多重复项)。
还可以使用 **`-t`** 参数跟踪沙箱:`sandbox-exec -t /path/trace.out -p "(version 1)" /bin/ls`
#### 通过 API
`libsystem_sandbox.dylib` 导出的函数 `sandbox_set_trace_path` 允许指定一个跟踪文件名,沙箱检查将写入该文件。\
还可以通过调用 `sandbox_vtrace_enable()` 来执行类似操作,然后通过调用 `sandbox_vtrace_report()` 从缓冲区获取日志错误。
### 沙箱检查
`libsandbox.dylib` 导出一个名为 sandbox\_inspect\_pid 的函数,该函数提供进程的沙箱状态列表(包括扩展)。但是,只有平台二进制文件可以使用此函数。
### MacOS 和 iOS 沙箱配置文件
MacOS 将系统沙箱配置文件存储在两个位置:**/usr/share/sandbox/** 和 **/System/Library/Sandbox/Profiles**。
如果第三方应用程序携带 _**com.apple.security.app-sandbox**_ 权限,则系统将该配置文件 **/System/Library/Sandbox/Profiles/application.sb** 应用到该进程。
在 iOS 中,默认配置文件称为 **container**,我们没有 SBPL 文本表示。在内存中,这个沙箱表示为每个权限的允许/拒绝二叉树。
### App Store 应用中的自定义 SBPL
公司可能会使他们的应用程序 **使用自定义沙盒配置文件**(而不是默认配置文件)。他们需要使用权限 **`com.apple.security.temporary-exception.sbpl`**,该权限需要得到 Apple 的授权。
公司可能会使其应用程序 **使用自定义沙箱配置文件**(而不是默认配置文件)。他们需要使用权限 **`com.apple.security.temporary-exception.sbpl`**,该权限需要得到苹果的授权。
可以在 **`/System/Library/Sandbox/Profiles/application.sb:`** 中检查此权限的定义。
可以在 **`/System/Library/Sandbox/Profiles/application.sb:`** 中检查权限的定义。
```scheme
(sandbox-array-entitlement
"com.apple.security.temporary-exception.sbpl"
@ -262,19 +276,142 @@ sbtool <pid> all
(let* ((port (open-input-string string)) (sbpl (read port)))
(with-transparent-redirection (eval sbpl)))))
```
这将**在此权限后评估字符串**作为沙盒配置文件。
这将**在此权限后评估字符串**作为沙箱配置文件。
### 编译和反编译沙箱配置文件
**`sandbox-exec`** 工具使用 `libsandbox.dylib` 中的 `sandbox_compile_*` 函数。导出的主要函数有:`sandbox_compile_file`(期望文件路径,参数 `-f``sandbox_compile_string`(期望字符串,参数 `-p``sandbox_compile_name`(期望容器名称,参数 `-n``sandbox_compile_entitlements`(期望权限 plist
这个反向和[**开源版本的工具 sandbox-exec**](https://newosxbook.com/src.jl?tree=listings\&file=/sandbox\_exec.c) 允许 **`sandbox-exec`** 将编译的沙箱配置文件写入文件。
此外,为了将进程限制在容器内,它可能会调用 `sandbox_spawnattrs_set[container/profilename]` 并传递一个容器或预先存在的配置文件。
## 调试和绕过沙箱
在 macOS 上,与 iOS 不同iOS 中的进程从一开始就由内核进行沙箱化,**进程必须自行选择进入沙箱**。这意味着在 macOS 上,进程在主动决定进入沙箱之前不会受到沙箱的限制,尽管 App Store 应用始终处于沙箱中。
如果进程具有权限 `com.apple.security.app-sandbox`,则它们在启动时会自动从用户空间进行沙箱化。有关此过程的详细说明,请查看:
{% content-ref url="macos-sandbox-debug-and-bypass/" %}
[macos-sandbox-debug-and-bypass](macos-sandbox-debug-and-bypass/)
{% endcontent-ref %}
## **沙箱扩展**
扩展允许为对象提供进一步的权限,并通过调用以下函数之一来实现:
* `sandbox_issue_extension`
* `sandbox_extension_issue_file[_with_new_type]`
* `sandbox_extension_issue_mach`
* `sandbox_extension_issue_iokit_user_client_class`
* `sandbox_extension_issue_iokit_registry_rentry_class`
* `sandbox_extension_issue_generic`
* `sandbox_extension_issue_posix_ipc`
扩展存储在可从进程凭据访问的第二个 MACF 标签槽中。以下 **`sbtool`** 可以访问此信息。
请注意,扩展通常由允许的进程授予,例如,当进程尝试访问照片并在 XPC 消息中被允许时,`tccd` 将授予 `com.apple.tcc.kTCCServicePhotos` 的扩展令牌。然后,进程需要消耗扩展令牌,以便将其添加到其中。\
请注意,扩展令牌是长十六进制数,编码了授予的权限。然而,它们没有硬编码的允许 PID这意味着任何可以访问令牌的进程可能会被**多个进程消耗**。
请注意,扩展与权限密切相关,因此拥有某些权限可能会自动授予某些扩展。
### **检查 PID 权限**
[**根据这个**](https://www.youtube.com/watch?v=mG715HcDgO8\&t=3011s)**`sandbox_check`** 函数(它是一个 `__mac_syscall`)可以检查**某个 PID、审计令牌或唯一 ID 是否允许某个操作**。
[**工具 sbtool**](http://newosxbook.com/src.jl?tree=listings\&file=sbtool.c)(可以在[这里找到编译版本](https://newosxbook.com/articles/hitsb.html))可以检查某个 PID 是否可以执行某些操作:
```bash
sbtool <pid> mach #Check mac-ports (got from launchd with an api)
sbtool <pid> file /tmp #Check file access
sbtool <pid> inspect #Gives you an explanation of the sandbox profile and extensions
sbtool <pid> all
```
### \[un]suspend
也可以使用 `libsystem_sandbox.dylib` 中的 `sandbox_suspend``sandbox_unsuspend` 函数来挂起和恢复沙箱。
请注意,调用挂起函数时会检查一些权限,以授权调用者调用它,例如:
* com.apple.private.security.sandbox-manager
* com.apple.security.print
* com.apple.security.temporary-exception.audio-unit-host
## mac\_syscall
此系统调用 (#381) 期望第一个参数为一个字符串,指示要运行的模块,然后第二个参数为一个代码,指示要运行的函数。第三个参数将取决于执行的函数。
函数 `___sandbox_ms` 调用封装了 `mac_syscall`,在第一个参数中指示 `"Sandbox"`,就像 `___sandbox_msp``mac_set_proc` (#387) 的封装一样。然后,`___sandbox_ms` 支持的一些代码可以在此表中找到:
* **set\_profile (#0)**: 将编译或命名的配置文件应用于进程。
* **platform\_policy (#1)**: 强制执行特定于平台的策略检查(在 macOS 和 iOS 之间有所不同)。
* **check\_sandbox (#2)**: 执行特定沙箱操作的手动检查。
* **note (#3)**: 向沙箱添加注释。
* **container (#4)**: 向沙箱附加注释,通常用于调试或识别。
* **extension\_issue (#5)**: 为进程生成新扩展。
* **extension\_consume (#6)**: 消耗给定的扩展。
* **extension\_release (#7)**: 释放与已消耗扩展相关的内存。
* **extension\_update\_file (#8)**: 修改沙箱内现有文件扩展的参数。
* **extension\_twiddle (#9)**: 调整或修改现有文件扩展例如TextEdit、rtf、rtfd
* **suspend (#10)**: 暂时挂起所有沙箱检查(需要适当的权限)。
* **unsuspend (#11)**: 恢复所有先前挂起的沙箱检查。
* **passthrough\_access (#12)**: 允许直接通过访问资源,绕过沙箱检查。
* **set\_container\_path (#13)**: (仅限 iOS为应用组或签名 ID 设置容器路径。
* **container\_map (#14)**: (仅限 iOS`containermanagerd` 检索容器路径。
* **sandbox\_user\_state\_item\_buffer\_send (#15)**: iOS 10+)在沙箱中设置用户模式元数据。
* **inspect (#16)**: 提供有关沙箱进程的调试信息。
* **dump (#18)**: macOS 11转储沙箱的当前配置文件以供分析。
* **vtrace (#19)**: 跟踪沙箱操作以进行监控或调试。
* **builtin\_profile\_deactivate (#20)**: macOS < 11停用命名配置文件例如`pe_i_can_has_debugger`)。
* **check\_bulk (#21)**: 在一次调用中执行多个 `sandbox_check` 操作。
* **reference\_retain\_by\_audit\_token (#28)**: 创建审计令牌的引用,以便在沙箱检查中使用。
* **reference\_release (#29)**: 释放先前保留的审计令牌引用。
* **rootless\_allows\_task\_for\_pid (#30)**: 验证是否允许 `task_for_pid`(类似于 `csr` 检查)。
* **rootless\_whitelist\_push (#31)**: macOS应用系统完整性保护SIP清单文件。
* **rootless\_whitelist\_check (preflight) (#32)**: 在执行之前检查 SIP 清单文件。
* **rootless\_protected\_volume (#33)**: macOS将 SIP 保护应用于磁盘或分区。
* **rootless\_mkdir\_protected (#34)**: 将 SIP/DataVault 保护应用于目录创建过程。
## Sandbox.kext
请注意,在 iOS 中,内核扩展包含 **硬编码的所有配置文件**,以避免被修改。以下是内核扩展中的一些有趣函数:
* **`hook_policy_init`**: 它挂钩 `mpo_policy_init`,并在 `mac_policy_register` 之后调用。它执行沙箱的大部分初始化。它还初始化 SIP。
* **`hook_policy_initbsd`**: 它设置 sysctl 接口,注册 `security.mac.sandbox.sentinel`、`security.mac.sandbox.audio_active` 和 `security.mac.sandbox.debug_mode`(如果与 `PE_i_can_has_debugger` 一起引导)。
* **`hook_policy_syscall`**: 它由 `mac_syscall` 调用,第一个参数为 "Sandbox",第二个参数为指示操作的代码。使用 switch 来根据请求的代码查找要运行的代码。
### MACF Hooks
**`Sandbox.kext`** 通过 MACF 使用了超过一百个钩子。大多数钩子将仅检查一些琐碎的情况,如果允许执行该操作,则会调用 **`cred_sb_evalutate`**,并传入来自 MACF 的 **凭据** 和一个对应于要执行的 **操作** 的数字,以及一个用于输出的 **缓冲区**
一个很好的例子是函数 **`_mpo_file_check_mmap`**,它挂钩了 **`mmap`**,并将开始检查新内存是否可写(如果不可写则允许执行),然后检查它是否用于 dyld 共享缓存,如果是,则允许执行,最后调用 **`cred_sb_evalutate`** 进行进一步的允许检查。
此外,在沙箱使用的数百个钩子中,有 3 个特别有趣:
* `mpo_proc_check_for`: 如果需要并且之前未应用,则应用配置文件。
* `mpo_vnode_check_exec`: 当进程加载相关二进制文件时调用,然后执行配置文件检查,并检查禁止 SUID/SGID 执行。
* `mpo_cred_label_update_execve`: 当标签被分配时调用。这是最长的,因为它在二进制文件完全加载但尚未执行时调用。它将执行诸如创建沙箱对象、将沙箱结构附加到 kauth 凭据、移除对 mach 端口的访问等操作。
请注意,**`cred_sb_evalutate`** 是 **`sb_evaluate`** 的封装,该函数获取传入的凭据,然后使用 **`eval`** 函数执行评估,该函数通常评估默认应用于所有进程的 **平台配置文件**,然后是 **特定进程配置文件**。请注意,平台配置文件是 **SIP** 在 macOS 中的主要组成部分之一。
## Sandboxd
沙箱还有一个用户守护进程,暴露了 XPC Mach 服务 `com.apple.sandboxd` 并绑定了内核扩展用于与之通信的特殊端口 14 (`HOST_SEATBELT_PORT`)。它使用 MIG 暴露了一些函数。
## References
* [**\*OS Internals Volume III**](https://newosxbook.com/home.html)
{% hint style="success" %}
学习与实践 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
学习与实践 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
学习实践 AWS 黑客技术:<img src="../../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../.gitbook/assets/arte.png" alt="" data-size="line">\
学习实践 GCP 黑客技术:<img src="../../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>支持 HackTricks</summary>
* 查看 [**订阅计划**](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 来分享黑客技巧。
* **加入** 💬 [**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 来分享黑客技巧。
</details>
{% endhint %}

View file

@ -1,8 +1,8 @@
# macOS SIP
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
@ -15,7 +15,6 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
</details>
{% endhint %}
## **基本信息**
**系统完整性保护 (SIP)** 在 macOS 中是一种机制旨在防止即使是最特权的用户也无法对关键系统文件夹进行未经授权的更改。此功能在维护系统完整性方面发挥着至关重要的作用通过限制在受保护区域内添加、修改或删除文件等操作。SIP 保护的主要文件夹包括:
@ -25,7 +24,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
* **/sbin**
* **/usr**
管理 SIP 行为的规则定义在位于 **`/System/Library/Sandbox/rootless.conf`** 的配置文件中。在此文件中,以星号 (\*) 开头的路径被视为对其他严格 SIP 限制的例外。
管理 SIP 行为的规则定义在位于 **`/System/Library/Sandbox/rootless.conf`** 的配置文件中。在此文件中,以星号\*)为前缀的路径被视为对其他严格 SIP 限制的例外。
考虑以下示例:
```javascript
@ -50,7 +49,11 @@ drwxr-xr-x 338 root wheel restricted 10816 May 13 00:29 /usr/libexec
```
这里,**`restricted`** 标志表示 `/usr/libexec` 目录受到 SIP 保护。在 SIP 保护的目录中,文件不能被创建、修改或删除。
此外,如果一个文件包含 **`com.apple.rootless`** 扩展 **属性**,该文件也将 **受到 SIP 保护**
此外,如果一个文件包含属性 **`com.apple.rootless`** 扩展 **属性**,该文件也将 **受到 SIP 保护**
{% hint style="success" %}
请注意,**Sandbox** 钩子 **`hook_vnode_check_setextattr`** 阻止任何尝试修改扩展属性 **`com.apple.rootless`** 的行为。
{% endhint %}
**SIP 还限制其他根操作**,例如:
@ -85,14 +88,28 @@ csrutil enable --without debug
[**在此演讲中了解更多关于 SIP 的信息**](https://www.slideshare.net/i0n1c/syscan360-stefan-esser-os-x-el-capitan-sinking-the-ship)**.**
### **与 SIP 相关的权限**
* `com.apple.rootless.xpc.bootstrap`: 控制 launchd
* `com.apple.rootless.install[.heritable]`: 访问文件系统
* `com.apple.rootless.kext-management`: `kext_request`
* `com.apple.rootless.datavault.controller`: 管理 UF\_DATAVAULT
* `com.apple.rootless.xpc.bootstrap`: XPC 设置能力
* `com.apple.rootless.xpc.effective-root`: 通过 launchd XPC 获取 root 权限
* `com.apple.rootless.restricted-block-devices`: 访问原始块设备
* `com.apple.rootless.internal.installer-equivalent`: 不受限制的文件系统访问
* `com.apple.rootless.restricted-nvram-variables[.heritable]`: 完全访问 NVRAM
* `com.apple.rootless.storage.label`: 修改由 com.apple.rootless xattr 限制的文件,使用相应的标签
* `com.apple.rootless.volume.VM.label`: 在卷上维护 VM 交换
## SIP 绕过
绕过 SIP 使攻击者能够:
* **访问用户数据**:读取所有用户帐户的敏感用户数据,如邮件、消息和 Safari 历史记录。
* **TCC 绕过**:直接操纵 TCC透明性、同意和控制数据库以授予对网络摄像头、麦克风和其他资源的未经授权访问。
* **建立持久性**:将恶意软件放置在 SIP 保护的位置使其即使在根权限下也能抵抗删除。这还包括篡改恶意软件删除工具MRT的潜力。
* **加载内核扩展**:尽管有额外的保护措施,绕过 SIP 简化了加载未签名内核扩展的过程。
* **建立持久性**在 SIP 保护的位置放置恶意软件,使其即使在 root 权限下也难以删除。这还包括篡改恶意软件删除工具MRT的潜在能力。
* **加载内核扩展**:尽管有额外的保护,绕过 SIP 简化了加载未签名内核扩展的过程。
### 安装包
@ -122,17 +139,17 @@ csrutil enable --without debug
**`system_installd`** 守护进程将安装由 **Apple** 签名的包。
研究人员发现,在安装 Apple 签名的包(.pkg 文件)**`system_installd`** **运行** 包中包含的任何 **后安装** 脚本。这些脚本由默认 shell **`zsh`** 执行,如果存在,它会自动 **运行** 来自 **`/etc/zshenv`** 文件的命令,即使在非交互模式下。攻击者可以利用这种行为:通过创建恶意的 `/etc/zshenv` 文件并等待 **`system_installd` 调用 `zsh`**,他们可以在设备上执行任意操作。
研究人员发现,在安装 Apple 签名的包(.pkg 文件)期间**`system_installd`** **运行** 包中包含的任何 **后安装** 脚本。这些脚本由默认 shell **`zsh`** 执行,如果存在,它会自动 **运行** 来自 **`/etc/zshenv`** 文件的命令,即使在非交互模式下。攻击者可以利用这种行为:通过创建恶意的 `/etc/zshenv` 文件并等待 **`system_installd` 调用 `zsh`**,他们可以在设备上执行任意操作。
此外,发现 **`/etc/zshenv` 可以作为一种通用攻击技术**,不仅仅用于 SIP 绕过。每个用户配置文件都有一个 `~/.zshenv` 文件,其行为与 `/etc/zshenv` 相同,但不需要权限。该文件可以用作持久性机制,每次 `zsh` 启动时触发,或作为提升权限机制。如果管理员用户使用 `sudo -s``sudo <command>` 提升到根,`~/.zshenv` 文件将被触发,有效地提升到根
此外,发现 **`/etc/zshenv` 可以作为一种通用攻击技术**,不仅仅用于 SIP 绕过。每个用户配置文件都有一个 `~/.zshenv` 文件,其行为与 `/etc/zshenv` 相同,但不需要 root 权限。该文件可以用作持久性机制,每次 `zsh` 启动时触发,或作为特权提升机制。如果管理员用户使用 `sudo -s``sudo <command>` 提升到 root`~/.zshenv` 文件将被触发,有效地提升到 root
#### [**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/)
在 [**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/) 中发现同样的 **`system_installd`** 进程仍然可以被滥用,因为它将 **后安装脚本放在 SIP 保护的 `/tmp` 中的随机命名文件夹内**。问题是 **`/tmp` 本身不受 SIP 保护**,因此可以 **挂载** 一个 **虚拟映像**,然后 **安装程序** 会将 **后安装脚本** 放入其中,**卸载** 虚拟映像,**重新创建** 所有 **文件夹****添加** 带有 **有效载** 的 **后安装** 脚本以执行。
在 [**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/) 中发现同样的 **`system_installd`** 进程仍然可以被滥用,因为它将 **后安装脚本放在一个随机命名的文件夹中,该文件夹在 `/tmp` 中受 SIP 保护**。问题是 **`/tmp` 本身不受 SIP 保护**,因此可以 **挂载** 一个 **虚拟映像**,然后 **安装程序** 会将 **后安装脚本** 放入其中,**卸载** 虚拟映像,**重新创建** 所有 **文件夹****添加** 带有 **有效** 的 **后安装** 脚本以执行。
#### [fsck\_cs 工具](https://www.theregister.com/2016/03/30/apple\_os\_x\_rootless/)
发现了一个漏洞,其中 **`fsck_cs`** 被误导以坏一个关键文件,因为它能够跟随 **符号链接**。具体来说,攻击者从 _`/dev/diskX`_ 创建了一个指向文件 `/System/Library/Extensions/AppleKextExcludeList.kext/Contents/Info.plist` 的链接。在 _`/dev/diskX`_ 上执行 **`fsck_cs`** 导致 `Info.plist` 的损坏。该文件的完整性对操作系统的 SIP系统完整性保护至关重要SIP 控制内核扩展的加载。一旦损坏SIP 管理内核排除的能力就会受到影响。
发现了一个漏洞,其中 **`fsck_cs`** 被误导以坏一个关键文件,因为它能够跟随 **符号链接**。具体来说,攻击者从 _`/dev/diskX`_ 创建了一个指向文件 `/System/Library/Extensions/AppleKextExcludeList.kext/Contents/Info.plist` 的链接。在 _`/dev/diskX`_ 上执行 **`fsck_cs`** 导致 `Info.plist` 的损坏。该文件的完整性对操作系统的 SIP系统完整性保护至关重要SIP 控制内核扩展的加载。一旦损坏SIP 管理内核排除的能力就会受到影响。
利用此漏洞的命令是:
```bash
@ -170,7 +187,7 @@ hdiutil attach -mountpoint /System/Library/Snadbox/ evil.dmg
#### CVE-2023-42860 <a href="#cve-a-detailed-look" id="cve-a-detailed-look"></a>
正如[**在这篇博客文章中详细说明的**](https://blog.kandji.io/apple-mitigates-vulnerabilities-installer-scripts)`InstallAssistant.pkg`包的`postinstall`脚本允许执行:
正如[**在这篇博客文章中详细说明的**](https://blog.kandji.io/apple-mitigates-vulnerabilities-installer-scripts)来自`InstallAssistant.pkg`包的`postinstall`脚本允许执行:
```bash
/usr/bin/chflags -h norestricted "${SHARED_SUPPORT_PATH}/SharedSupport.dmg"
```
@ -192,7 +209,7 @@ and it was possible to crate a symlink in `${SHARED_SUPPORT_PATH}/SharedSupport.
以下是更详细的介绍:
1. **不可变系统**:密封系统快照使 macOS 系统卷“不可变”,意味着它无法被修改。这防止了任何未经授权或意外的更改,从而可能危及安全性或系统稳定性。
1. **不可变系统**:密封系统快照使 macOS 系统卷“不可变”,意味着它无法被修改。这防止了任何未经授权或意外的更改,从而可能危及安全性或系统稳定性。
2. **系统软件更新**:当您安装 macOS 更新或升级时macOS 会创建一个新的系统快照。macOS 启动卷随后使用 **APFS (Apple 文件系统)** 切换到这个新快照。应用更新的整个过程变得更安全、更可靠,因为系统始终可以在更新过程中出现问题时恢复到先前的快照。
3. **数据分离**:结合在 macOS Catalina 中引入的数据和系统卷分离的概念,密封系统快照功能确保您的所有数据和设置存储在一个单独的“**数据**”卷上。这种分离使您的数据独立于系统,从而简化了系统更新的过程并增强了系统安全性。
@ -200,7 +217,7 @@ and it was possible to crate a symlink in `${SHARED_SUPPORT_PATH}/SharedSupport.
### 检查快照
命令 **`diskutil apfs list`** 列出 **APFS 卷的详细信息** 及其布局:
命令 **`diskutil apfs list`** 列出 **APFS 卷的详细信息**及其布局:
<pre><code>+-- Container disk3 966B902E-EDBA-4775-B743-CF97A0556A13
| ====================================================
@ -254,17 +271,16 @@ mount
/dev/disk3s1s1 on / (apfs, sealed, local, read-only, journaled)
```
{% hint style="success" %}
学习与实践 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
学习与实践 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
学习与实践 AWS 黑客技术:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
学习与实践 GCP 黑客技术:<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>支持 HackTricks</summary>
* 查看 [**订阅计划**](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 来分享黑客技巧。
* **加入** 💬 [**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 来分享黑客技巧。
</details>
{% endhint %}
</details>