Translated ['macos-hardening/macos-auto-start-locations.md', 'macos-hard

This commit is contained in:
Translator 2024-09-21 18:26:25 +00:00
parent 2b10a19590
commit 4487d79d61
5 changed files with 780 additions and 473 deletions

View file

@ -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 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 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 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 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 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 Red Teaming](macos-hardening/macos-red-teaming/README.md)
* [macOS MDM](macos-hardening/macos-red-teaming/macos-mdm/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) * [Enrolling Devices in Other Organisations](macos-hardening/macos-red-teaming/macos-mdm/enrolling-devices-in-other-organisations.md)

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,8 @@
# macOS 敏感位置与有趣的守护进程 # macOS 敏感位置与有趣的守护进程
{% hint style="success" %} {% 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">\ 学习与实践 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) 学习与实践 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> <details>
@ -17,9 +17,9 @@
## 密码 ## 密码
### Shadow 密码 ### 隐藏密码
Shadow 密码与用户的配置一起存储在 **`/var/db/dslocal/nodes/Default/users/`** 的 plist 文件中。\ 隐藏密码与用户的配置一起存储在位于 **`/var/db/dslocal/nodes/Default/users/`** 的 plist 文件中。\
以下单行命令可用于转储 **所有用户的信息**(包括哈希信息): 以下单行命令可用于转储 **所有用户的信息**(包括哈希信息):
{% code overflow="wrap" %} {% 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** **格式** [**像这样的脚本**](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" %} {% code overflow="wrap" %}
```bash ```bash
@ -38,9 +38,15 @@ sudo bash -c 'for i in $(find /var/db/dslocal/nodes/Default/users -type f -regex
``` ```
{% endcode %} {% endcode %}
获取用户的 `ShadowHashData` 的另一种方法是使用 `dscl`: ``sudo dscl . -read /Users/`whoami` ShadowHashData``
### /etc/master.passwd
此文件**仅在**系统以**单用户模式**运行时使用(因此不太频繁)。
### 钥匙串转储 ### 钥匙串转储
请注意,当使用 security 二进制文件 **转储解密的密码** 时,会有几个提示要求用户允许此操作。 请注意,当使用安全二进制文件**转储解密的密码**时,会有几个提示要求用户允许此操作。
```bash ```bash
#security #security
security dump-trust-settings [-s] [-d] #List certificates 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 ```bash
sudo vmmap <securityd PID> | grep MALLOC_TINY sudo vmmap <securityd PID> | grep MALLOC_TINY
``` ```
在识别潜在的主密钥后,**keychaindump** 在堆中搜索特定模式(`0x0000000000000018`),这表明是主密钥的候选者。要利用此密钥,还需要进一步的步骤,包括去混淆,这在 **keychaindump** 的源代码中有说明。专注于该领域的分析师应注意,解密钥的关键数据存储在 **securityd** 进程的内存中。运行 **keychaindump** 的示例命令是: 在识别潜在的主密钥后,**keychaindump** 在堆中搜索特定模式(`0x0000000000000018`),这表明是主密钥的候选者。要利用此密钥,还需要进一步的步骤,包括去混淆,这在 **keychaindump** 的源代码中有说明。专注于该领域的分析师应注意,解密钥匙串的关键数据存储在 **securityd** 进程的内存中。运行 **keychaindump** 的示例命令是:
```bash ```bash
sudo ./keychaindump sudo ./keychaindump
``` ```
@ -119,14 +125,14 @@ python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d1
``` ```
#### **使用用户密码转储钥匙串密钥(带密码)** #### **使用用户密码转储钥匙串密钥(带密码)**
如果您知道用户的密码,您可以使用它来**转储和解密属于用户的钥匙串**。 如果您知道用户的密码,您可以使用它来**转储和解密属于用户的钥匙串**。
```bash ```bash
#Prompt to ask for the password #Prompt to ask for the password
python2.7 chainbreaker.py --dump-all --password-prompt /Users/<username>/Library/Keychains/login.keychain-db python2.7 chainbreaker.py --dump-all --password-prompt /Users/<username>/Library/Keychains/login.keychain-db
``` ```
### kcpassword ### kcpassword
**kcpassword** 文件是一个保存 **用户登录密码** 的文件,但仅在系统所有者 **启用自动登录** 的情况下。因此,用户将自动登录,而无需输入密码(这并不是很安全)。 **kcpassword** 文件是一个保存 **用户登录密码** 的文件,但仅在系统所有者 **启用自动登录** 的情况下。因此,用户将自动登录,而无需输入密码(这并不是很安全)。
密码存储在文件 **`/etc/kcpassword`** 中,使用密钥 **`0x7D 0x89 0x52 0x23 0xD2 0xBC 0xDD 0xEA 0xA3 0xB9 0x1F`** 进行异或加密。如果用户的密码长度超过密钥,密钥将被重复使用。\ 密码存储在文件 **`/etc/kcpassword`** 中,使用密钥 **`0x7D 0x89 0x52 0x23 0xD2 0xBC 0xDD 0xEA 0xA3 0xB9 0x1F`** 进行异或加密。如果用户的密码长度超过密钥,密钥将被重复使用。\
这使得密码相对容易恢复,例如使用像 [**这个**](https://gist.github.com/opshope/32f65875d45215c3677d) 的脚本。 这使得密码相对容易恢复,例如使用像 [**这个**](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/<UUID>/Library/Preferences`&#x20; 在 macOS 应用中,偏好设置位于 **`$HOME/Library/Preferences`**,而在 iOS 中则位于 `/var/mobile/Containers/Data/Application/<UUID>/Library/Preferences`
在 macOS 中,可以使用命令行工具 **`defaults`** 来 **修改偏好设置文件** 在 macOS 中,可以使用命令行工具 **`defaults`** 来 **修改偏好设置文件**
**`/usr/sbin/cfprefsd`** 声称 XPC 服务 `com.apple.cfprefsd.daemon``com.apple.cfprefsd.agent`,并可以被调用以执行诸如修改偏好设置等操作。 **`/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
[...]
<key>dsRecTypeStandard:Computers</key>
<dict>
<key>dsAttrTypeNative:ShadowHashData</key>
<array>
<dict>
<!-- allow wheel even though it's implicit -->
<key>uuid</key>
<string>ABCDEFAB-CDEF-ABCD-EFAB-CDEF00000000</string>
<key>permissions</key>
<array>
<string>readattr</string>
<string>writeattr</string>
</array>
</dict>
</array>
<key>dsAttrTypeNative:KerberosKeys</key>
<array>
<dict>
<!-- allow wheel even though it's implicit -->
<key>uuid</key>
<string>ABCDEFAB-CDEF-ABCD-EFAB-CDEF00000000</string>
<key>permissions</key>
<array>
<string>readattr</string>
<string>writeattr</string>
</array>
</dict>
</array>
[...]
```
## 系统通知 ## 系统通知
### Darwin 通知 ### Darwin 通知
通知的主要守护进程是 **`/usr/sbin/notifyd`**。为了接收通知,客户端必须通过 `com.apple.system.notification_center` Mach 端口注册(使用 `sudo lsmp -p <pid notifyd>` 检查它们)。该守护进程可以通过文件 `/etc/notify.conf` 进行配置。 主要的通知守护进程是 **`/usr/sbin/notifyd`**。为了接收通知,客户端必须通过 `com.apple.system.notification_center` Mach 端口注册(使用 `sudo lsmp -p <pid notifyd>` 检查它们)。该守护进程可以通过文件 `/etc/notify.conf` 进行配置。
用于通知的名称是唯一的反向 DNS 表示法,当通知发送到其中一个名称时,已指示可以处理它的客户端将接收到该通知。 用于通知的名称是唯一的反向 DNS 表示法,当发送通知到其中一个名称时,已指示可以处理它的客户端将接收到该通知。
可以通过向 notifyd 进程发送 SIGUSR2 信号来转储当前状态(并查看所有名称),并读取生成的文件:`/var/run/notifyd_<pid>.status` 可以通过向 notifyd 进程发送 SIGUSR2 信号来转储当前状态(并查看所有名称),并读取生成的文件:`/var/run/notifyd_<pid>.status`
```bash ```bash
@ -227,16 +269,16 @@ sudo sqlite3 /Library/Application\ Support/ApplePushService/aps.db
* **`NSUserNotificationCenter`**:这是 MacOS 中的 iOS 公告板。通知的数据库位于 `/var/folders/<user temp>/0/com.apple.notificationcenter/db2/db` * **`NSUserNotificationCenter`**:这是 MacOS 中的 iOS 公告板。通知的数据库位于 `/var/folders/<user temp>/0/com.apple.notificationcenter/db2/db`
{% hint style="success" %} {% 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">\ 学习和实践 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">\
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) 学习和实践 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> <details>
<summary>支持 HackTricks</summary> <summary>支持 HackTricks</summary>
* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! * 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注** 我们的 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **加入** 💬 [**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 来分享黑客技巧。 * **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 仓库提交 PR 来分享黑客技巧。
</details> </details>
{% endhint %} {% endhint %}

View file

@ -0,0 +1,268 @@
# macOS MACF
{% 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)
<details>
<summary>Support HackTricks</summary>
* 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.
</details>
{% 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_<object>_<opType>_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) 中找到一个示例:
<pre class="language-c"><code class="lang-c">int
mmap(proc_t p, struct mmap_args *uap, user_addr_t *retval)
{
[...]
#if CONFIG_MACF
<strong> error = mac_file_check_mmap(vfs_context_ucred(ctx),
</strong> fp->fp_glob, prot, flags, file_pos + pageoff,
&#x26;maxprot);
if (error) {
(void)vnode_put(vp);
goto bad;
}
#endif /* MAC */
[...]
</code></pre>
然后,可以在 [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 黑客技术:<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 来分享黑客技巧。
</details>
{% endhint %}

View file

@ -1,8 +1,8 @@
# macOS 用户 # macOS 用户与外部账户
{% hint style="success" %} {% 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">\ 学习与实践 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) 学习与实践 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> <details>
@ -15,8 +15,7 @@
</details> </details>
{% endhint %} {% endhint %}
## 常见用户
### 常见用户
* **守护进程**:保留给系统守护进程的用户。默认的守护进程账户名称通常以“\_”开头 * **守护进程**:保留给系统守护进程的用户。默认的守护进程账户名称通常以“\_”开头
@ -33,23 +32,28 @@ for i in "${state[@]}"; do sysadminctl -"${i}" status; done;
* **无**: 当需要最小权限时,进程以此用户身份执行 * **无**: 当需要最小权限时,进程以此用户身份执行
* **根用户** * **根用户**
### 用户权限 ## 用户权限
* **标准用户**: 最基本的用户。此用户在尝试安装软件或执行其他高级任务时需要管理员用户授予的权限。他们无法独立完成这些操作。 * **标准用户**: 最基本的用户。此用户在尝试安装软件或执行其他高级任务时需要管理员用户授予的权限。他们无法独立完成这些操作。
* **管理员用户**: 大多数时候作为标准用户操作,但也被允许执行根用户操作,如安装软件和其他管理任务。所有属于管理员组的用户**通过sudoers文件获得根用户访问权限**。 * **管理员用户**: 大多数时候作为标准用户操作,但也被允许执行根用户操作,如安装软件和其他管理任务。所有属于管理员组的用户**通过sudoers文件获得根权限**。
* **根用户**: 根用户被允许执行几乎所有操作(受系统完整性保护等限制)。 * **根用户**: 根用户被允许执行几乎所有操作(受系统完整性保护等限制)。
* 例如,根用户无法将文件放置在`/System`内。 * 例如,根用户无法将文件放置在`/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" %} {% 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">\ 学习与实践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) 学习与实践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> <details>
<summary>支持HackTricks</summary> <summary>支持HackTricks</summary>
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)! * 查看[**订阅计划**](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分享黑客技巧。 * **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub库提交PR分享黑客技巧。
</details> </details>