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

This commit is contained in:
Translator 2023-10-12 16:23:41 +00:00
parent aad22573ee
commit 3d9527ef45
23 changed files with 1060 additions and 171 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 KiB

View file

@ -149,6 +149,7 @@
* [macOS Defensive Apps](macos-hardening/macos-security-and-privilege-escalation/macos-defensive-apps.md)
* [macOS GCD - Grand Central Dispatch](macos-hardening/macos-security-and-privilege-escalation/macos-gcd-grand-central-dispatch.md)
* [macOS Kernel & System Extensions](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md)
* [macOS IOKit](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-iokit.md)
* [macOS Kernel Extensions](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md)
* [macOS System Extensions](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-system-extensions.md)
* [macOS Network Services & Protocols](macos-hardening/macos-security-and-privilege-escalation/macos-protocols.md)

View file

@ -4,8 +4,8 @@
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 你在一**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[NFT收藏品**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
@ -14,7 +14,7 @@
## XNU内核
**macOS的核心是XNU**,它代表着"X不是Unix"。这个内核基本上由**Mach微内核**稍后将讨论和来自Berkeley Software Distribution**BSD**的元素组成。XNU还通过一个名为I/O Kit的系统提供了一个用于**内核驱动程序**的平台。XNU内核是达尔文开源项目的一部分,这意味着**它的源代码是免费可访问的**。
**macOS的核心是XNU**,它代表着“X不是Unix”。这个内核基本上由**Mach微内核**稍后将讨论和来自Berkeley Software Distribution**BSD**的元素组成。XNU还通过一个名为I/O Kit的系统为**内核驱动程序提供平台**。XNU内核是Darwin开源项目的一部分,这意味着**它的源代码是免费可访问的**。
从安全研究人员或Unix开发人员的角度来看**macOS**可能会感觉非常**类似**于一个带有优雅GUI和许多自定义应用程序的**FreeBSD**系统。大多数为BSD开发的应用程序在macOS上编译和运行时不需要修改因为Unix用户熟悉的命令行工具在macOS上都存在。然而由于XNU内核包含了Mach传统的类Unix系统和macOS之间存在一些重要的差异这些差异可能会导致潜在的问题或提供独特的优势。
@ -24,11 +24,11 @@ XNU的开源版本[https://opensource.apple.com/source/xnu/](https://opensour
Mach是一个设计为**与UNIX兼容**的**微内核**。它的一个关键设计原则是**最小化**在**内核**空间中运行的**代码**量而是允许许多典型的内核功能如文件系统、网络和I/O作为用户级任务运行。
在XNU中Mach负责许多典型内核处理的关键低级操作,如处理器调度、多任务处理和虚拟内存管理。
在XNU中Mach负责许多典型内核操作,如处理器调度、多任务处理和虚拟内存管理。
### BSD
XNU内核还**整合了**大量来自**FreeBSD**项目的代码。这些代码与Mach一起在内核中运行,位于同一地址空间中。然而XNU中的FreeBSD代码可能与原始的FreeBSD代码有很大的不同因为需要对其进行修改以确保与Mach的兼容性。FreeBSD对许多内核操作做出了贡献包括
XNU内核还**整合了**大量来自**FreeBSD**项目的代码。这些代码与Mach一起在同一地址空间中作为内核的一部分运行。然而XNU中的FreeBSD代码可能与原始的FreeBSD代码有很大的不同因为需要对其进行修改以确保与Mach的兼容性。FreeBSD对许多内核操作做出了贡献包括
* 进程管理
* 信号处理
@ -43,50 +43,89 @@ XNU内核还**整合了**大量来自**FreeBSD**项目的代码。这些代码
### I/O Kit - 驱动程序
I/O Kit是XNU内核中的开源、面向对象的**设备驱动程序框架**,负责添加和管理**动态加载的设备驱动程序**。这些驱动程序允许将模块化代码动态添加到内核中,以便与不同的硬件一起使用。它们位于以下位置:
I/O Kit是XNU内核中的开源、面向对象的**设备驱动程序框架**,负责添加和管理**动态加载的设备驱动程序**。这些驱动程序允许将模块化代码动态添加到内核中,以便与不同的硬件一起使用,例如
* `/System/Library/Extensions`
* 内置于OS X操作系统的KEXT文件。
* `/Library/Extensions`
* 第三方软件安装的KEXT文件
```bash
#Use kextstat to print the loaded drivers
kextstat
Executing: /usr/bin/kmutil showloaded
No variant specified, falling back to release
Index Refs Address Size Wired Name (Version) UUID <Linked Against>
1 142 0 0 0 com.apple.kpi.bsd (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
2 11 0 0 0 com.apple.kpi.dsep (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
3 170 0 0 0 com.apple.kpi.iokit (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
4 0 0 0 0 com.apple.kpi.kasan (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
5 175 0 0 0 com.apple.kpi.libkern (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
6 154 0 0 0 com.apple.kpi.mach (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
7 88 0 0 0 com.apple.kpi.private (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
8 106 0 0 0 com.apple.kpi.unsupported (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
9 2 0xffffff8003317000 0xe000 0xe000 com.apple.kec.Libm (1) 6C1342CC-1D74-3D0F-BC43-97D5AD38200A <5>
10 12 0xffffff8003544000 0x92000 0x92000 com.apple.kec.corecrypto (11.1) F5F1255F-6552-3CF4-A9DB-D60EFDEB4A9A <8 7 6 5 3 1>
```
直到数字9列出的驱动程序**在地址0处加载**。这意味着它们不是真正的驱动程序,**它们是内核的一部分,无法卸载**。
{% content-ref url="macos-iokit.md" %}
[macos-iokit.md](macos-iokit.md)
{% endcontent-ref %}
要查找特定的扩展,您可以使用:
```bash
kextfind -bundle-id com.apple.iokit.IOReportFamily #Search by full bundle-id
kextfind -bundle-id -substring IOR #Search by substring in bundle-id
```
要加载和卸载内核扩展,请执行以下操作:
```bash
kextload com.apple.iokit.IOReportFamily
kextunload com.apple.iokit.IOReportFamily
```
### IPC - 进程间通信
{% content-ref url="macos-ipc-inter-process-communication/" %}
[macos-ipc-inter-process-communication](macos-ipc-inter-process-communication/)
{% endcontent-ref %}
### Kernelcache
**Kernelcache**是XNU内核的**预编译和预链接版本**,以及必要的设备**驱动程序**和**内核扩展**。它以**压缩**格式存储并在启动过程中解压缩到内存中。通过具有可运行版本的内核和关键驱动程序的kernelcache可以实现更快的启动时间减少在启动时动态加载和链接这些组件所需的时间和资源。
在iOS中它位于**`/System/Library/Caches/com.apple.kernelcaches/kernelcache`**在macOS中可以使用**`find / -name kernelcache 2>/dev/null`**找到它。
#### IMG4
IMG4文件格式是苹果在其iOS和macOS设备中用于安全地存储和验证固件组件如kernelcache的容器格式。IMG4格式包括一个头部和几个标签这些标签封装了不同的数据片段包括实际的载荷如内核或引导加载程序、签名和一组清单属性。该格式支持加密验证使设备能够在执行固件组件之前确认其真实性和完整性。
通常由以下组件组成:
- **载荷IM4P**
- 经常被压缩LZFSE4LZSS...
- 可选加密
- **清单IM4M**
- 包含签名
- 附加的键/值字典
- **恢复信息IM4R**
- 也称为APNonce
- 防止某些更新的重放攻击
- 可选:通常不会找到
解压Kernelcache
```bash
# pyimg4 (https://github.com/m1stadev/PyIMG4)
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
# img4tool (https://github.com/tihmstar/img4tool
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
```
#### Kernelcache符号
有时,苹果会发布带有符号的**kernelcache**。您可以通过在[https://theapplewiki.com](https://theapplewiki.com/)上的链接上下载一些带有符号的固件。
### IPSW
这些是您可以从[**https://ipsw.me/**](https://ipsw.me/)下载的苹果**固件**。除了其他文件之外,它还包含**kernelcache**。\
要**提取**文件,您只需将其解压缩即可。
提取固件后,您将获得一个类似于**`kernelcache.release.iphone14`**的文件。它以**IMG4**格式存储,您可以使用以下方法提取有趣的信息:
* [**pyimg4**](https://github.com/m1stadev/PyIMG4)
{% code overflow="wrap" %}
```bash
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
```
{% endcode %}
* [**img4tool**](https://github.com/tihmstar/img4tool)
```bash
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
```
您可以使用以下命令检查提取的内核缓存中的符号:**`nm -a kernelcache.release.iphone14.e | wc -l`**
通过这个命令,我们现在可以**提取所有的扩展**或者**您感兴趣的一个扩展:**
```bash
# List all extensions
kextex -l kernelcache.release.iphone14.e
## Extract com.apple.security.sandbox
kextex -e com.apple.security.sandbox kernelcache.release.iphone14.e
# Extract all
kextex_all kernelcache.release.iphone14.e
# Check the extension for symbols
nm -a binaries/com.apple.security.sandbox | wc -l
```
## macOS内核扩展
由于代码将以高权限运行macOS对于加载内核扩展.kext非常严格实际上默认情况下几乎不可能加载除非找到了绕过方法
由于代码将以高权限运行macOS对加载内核扩展.kext非常严格实际上默认情况下几乎不可能加载除非找到了绕过方法
{% content-ref url="macos-kernel-extensions.md" %}
[macos-kernel-extensions.md](macos-kernel-extensions.md)
@ -94,7 +133,7 @@ kextunload com.apple.iokit.IOReportFamily
### macOS系统扩展
macOS创建了系统扩展来替代内核扩展它提供了用户级别的API与内核进行交互。开发人员可以通过使用系统扩展来避免使用内核扩展。
macOS创建了系统扩展而不是使用内核扩展它提供了用户级API与内核进行交互。这样开发人员可以避免使用内核扩展。
{% content-ref url="macos-system-extensions.md" %}
[macos-system-extensions.md](macos-system-extensions.md)
@ -109,9 +148,9 @@ macOS创建了系统扩展来替代内核扩展它提供了用户级别的API
<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的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[NFT](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* 获[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**

View file

@ -0,0 +1,242 @@
# macOS IOKit
<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>
* Are you working in a **cybersecurity company**? Do you want to see your **company advertised in HackTricks**? Or do you want to have access to the **latest version of PEASS or download HackTricks in PDF**? Check the [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Discover [**The PEASS Family**](https://opensea.io/collection/the-peass-family), our exclusive collection of [**NFTs**](https://opensea.io/collection/the-peass-family)
* Get the [**official PEASS and HackTricks swag**](https://peass.creator-spring.com)
* **Join the** [**💬**](https://emojipedia.org/speech-balloon/) **Discord group** or the [**telegram group**](https://t.me/peass) or **follow me** on **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live).
* **Share your hacking tricks by sending PR to** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **and** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).
</details>
## 基本信息
I/O Kit是XNU内核中的开源、面向对象的**设备驱动程序框架**,负责添加和管理**动态加载的设备驱动程序**。这些驱动程序允许将模块化代码动态添加到内核中,以便与不同的硬件一起使用。
IOKit驱动程序基本上是从内核中**导出函数**。这些函数的参数**类型**是**预定义**的并且经过验证。此外与XPC类似IOKit只是在**Mach消息**之上的另一层。
**IOKit XNU内核代码**由Apple在[https://github.com/apple-oss-distributions/xnu/tree/main/iokit](https://github.com/apple-oss-distributions/xnu/tree/main/iokit)上开源。此外用户空间的IOKit组件也是开源的[https://github.com/opensource-apple/IOKitUser](https://github.com/opensource-apple/IOKitUser)。
然而,**没有IOKit驱动程序**是开源的。不过,偶尔会发布带有符号的驱动程序版本,这样更容易进行调试。查看如何[**从固件中获取驱动程序扩展**](./#ipsw)**。**
它是用**C++**编写的。您可以使用以下命令获取解析后的C++符号:
```bash
# Get demangled symbols
nm -C com.apple.driver.AppleJPEGDriver
# Demangled symbols from stdin
c++filt
__ZN16IOUserClient202222dispatchExternalMethodEjP31IOExternalMethodArgumentsOpaquePK28IOExternalMethodDispatch2022mP8OSObjectPv
IOUserClient2022::dispatchExternalMethod(unsigned int, IOExternalMethodArgumentsOpaque*, IOExternalMethodDispatch2022 const*, unsigned long, OSObject*, void*)
```
{% hint style="danger" %}
IOKit暴露的函数在客户端尝试调用函数时可以执行额外的安全检查但请注意应用程序通常受到沙箱的限制只能与IOKit函数进行交互。
{% endhint %}
## 驱动程序
在macOS中它们位于
* **`/System/Library/Extensions`**
* 内置于OS X操作系统中的KEXT文件。
* **`/Library/Extensions`**
* 第三方软件安装的KEXT文件。
在iOS中它们位于
* **`/System/Library/Extensions`**
```bash
#Use kextstat to print the loaded drivers
kextstat
Executing: /usr/bin/kmutil showloaded
No variant specified, falling back to release
Index Refs Address Size Wired Name (Version) UUID <Linked Against>
1 142 0 0 0 com.apple.kpi.bsd (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
2 11 0 0 0 com.apple.kpi.dsep (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
3 170 0 0 0 com.apple.kpi.iokit (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
4 0 0 0 0 com.apple.kpi.kasan (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
5 175 0 0 0 com.apple.kpi.libkern (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
6 154 0 0 0 com.apple.kpi.mach (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
7 88 0 0 0 com.apple.kpi.private (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
8 106 0 0 0 com.apple.kpi.unsupported (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
9 2 0xffffff8003317000 0xe000 0xe000 com.apple.kec.Libm (1) 6C1342CC-1D74-3D0F-BC43-97D5AD38200A <5>
10 12 0xffffff8003544000 0x92000 0x92000 com.apple.kec.corecrypto (11.1) F5F1255F-6552-3CF4-A9DB-D60EFDEB4A9A <8 7 6 5 3 1>
```
直到第9个列出的驱动程序**在地址0处加载**。这意味着它们不是真正的驱动程序,而是**内核的一部分,无法卸载**。
要查找特定的扩展,可以使用:
```bash
kextfind -bundle-id com.apple.iokit.IOReportFamily #Search by full bundle-id
kextfind -bundle-id -substring IOR #Search by substring in bundle-id
```
要加载和卸载内核扩展,请执行以下操作:
```bash
kextload com.apple.iokit.IOReportFamily
kextunload com.apple.iokit.IOReportFamily
```
## IORegistry
**IORegistry**是macOS和iOS中IOKit框架的关键部分它作为一个数据库用于表示系统的硬件配置和状态。它是一个**层次化的对象集合,表示系统上加载的所有硬件和驱动程序,以及它们之间的关系**。
您可以使用命令行工具**`ioreg`**从控制台检查IORegistry对iOS特别有用
```bash
ioreg -l #List all
ioreg -w 0 #Not cut lines
ioreg -p <plane> #Check other plane
```
你可以从[https://developer.apple.com/download/all/](https://developer.apple.com/download/all/)下载**Xcode附加工具**中的**IORegistryExplorer**,并通过**图形界面**检查**macOS IORegistry**。
<figure><img src="../../../.gitbook/assets/image (695).png" alt="" width="563"><figcaption></figcaption></figure>
在IORegistryExplorer中"planes"用于组织和显示IORegistry中不同对象之间的关系。每个plane表示一种特定类型的关系或系统硬件和驱动程序配置的特定视图。以下是您可能在IORegistryExplorer中遇到的一些常见plane
1. **IOService Plane**这是最常见的plane显示表示驱动程序和nub驱动程序之间的通信通道的服务对象。它显示这些对象之间的提供者-客户端关系。
2. **IODeviceTree Plane**该plane表示设备连接到系统时的物理连接。通常用于可视化通过USB或PCI等总线连接的设备的层次结构。
3. **IOPower Plane**:以电源管理方面的对象及其关系显示。它可以显示哪些对象影响其他对象的电源状态,对于调试与电源相关的问题非常有用。
4. **IOUSB Plane**专注于USB设备及其关系显示USB集线器和连接设备的层次结构。
5. **IOAudio Plane**该plane用于表示系统中的音频设备及其关系。
6. ...
## 驱动程序通信代码示例
以下代码连接到IOKit服务`"YourServiceNameHere"`并调用选择器0中的函数。为此
* 首先调用**`IOServiceMatching`**和**`IOServiceGetMatchingServices`**获取服务。
* 然后调用**`IOServiceOpen`**建立连接。
* 最后使用**`IOConnectCallScalarMethod`**调用函数指示选择器0选择器是您要调用的函数分配的编号
```objectivec
#import <Foundation/Foundation.h>
#import <IOKit/IOKitLib.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// Get a reference to the service using its name
CFMutableDictionaryRef matchingDict = IOServiceMatching("YourServiceNameHere");
if (matchingDict == NULL) {
NSLog(@"Failed to create matching dictionary");
return -1;
}
// Obtain an iterator over all matching services
io_iterator_t iter;
kern_return_t kr = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, &iter);
if (kr != KERN_SUCCESS) {
NSLog(@"Failed to get matching services");
return -1;
}
// Get a reference to the first service (assuming it exists)
io_service_t service = IOIteratorNext(iter);
if (!service) {
NSLog(@"No matching service found");
IOObjectRelease(iter);
return -1;
}
// Open a connection to the service
io_connect_t connect;
kr = IOServiceOpen(service, mach_task_self(), 0, &connect);
if (kr != KERN_SUCCESS) {
NSLog(@"Failed to open service");
IOObjectRelease(service);
IOObjectRelease(iter);
return -1;
}
// Call a method on the service
// Assume the method has a selector of 0, and takes no arguments
kr = IOConnectCallScalarMethod(connect, 0, NULL, 0, NULL, NULL);
if (kr != KERN_SUCCESS) {
NSLog(@"Failed to call method");
}
// Cleanup
IOServiceClose(connect);
IOObjectRelease(service);
IOObjectRelease(iter);
}
return 0;
}
```
有**其他**函数可以用来调用IOKit函数除了**`IOConnectCallScalarMethod`**,还有**`IOConnectCallMethod`****`IOConnectCallStructMethod`**...
## 反向驱动程序入口点
例如,您可以从[**固件映像ipsw**](./#ipsw)中获取这些函数。然后,将其加载到您喜欢的反编译器中。
您可以从**`externalMethod`**函数开始反编译,因为这是将接收调用并调用正确函数的驱动程序函数:
<figure><img src="../../../.gitbook/assets/image (696).png" alt="" width="315"><figcaption></figcaption></figure>
<figure><img src="../../../.gitbook/assets/image (697).png" alt=""><figcaption></figcaption></figure>
那个可怕的调用解码的意思是:
```cpp
IOUserClient2022::dispatchExternalMethod(unsigned int, IOExternalMethodArgumentsOpaque*, IOExternalMethodDispatch2022 const*, unsigned long, OSObject*, void*)
```
{% endcode %}
请注意,在上面的定义中,缺少了**`self`**参数,正确的定义应该是:
{% code overflow="wrap" %}
```cpp
IOUserClient2022::dispatchExternalMethod(self, unsigned int, IOExternalMethodArgumentsOpaque*, IOExternalMethodDispatch2022 const*, unsigned long, OSObject*, void*)
```
{% endcode %}
实际上,您可以在[https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/Kernel/IOUserClient.cpp#L6388](https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/Kernel/IOUserClient.cpp#L6388)找到真正的定义:
```cpp
IOUserClient2022::dispatchExternalMethod(uint32_t selector, IOExternalMethodArgumentsOpaque *arguments,
const IOExternalMethodDispatch2022 dispatchArray[], size_t dispatchArrayCount,
OSObject * target, void * reference)
```
使用这些信息您可以重写Ctrl+Right -> `Edit function signature`并设置已知类型:
<figure><img src="../../../.gitbook/assets/image (702).png" alt=""><figcaption></figcaption></figure>
新的反编译代码如下所示:
<figure><img src="../../../.gitbook/assets/image (703).png" alt=""><figcaption></figcaption></figure>
下一步,我们需要定义**`IOExternalMethodDispatch2022`**结构体。它在[https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/IOKit/IOUserClient.h#L168-L176](https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/IOKit/IOUserClient.h#L168-L176)中是开源的,您可以定义它:
<figure><img src="../../../.gitbook/assets/image (698).png" alt=""><figcaption></figcaption></figure>
现在,根据`(IOExternalMethodDispatch2022 *)&sIOExternalMethodArray`,您可以看到很多数据:
<figure><img src="../../../.gitbook/assets/image (704).png" alt="" width="563"><figcaption></figcaption></figure>
将数据类型更改为**`IOExternalMethodDispatch2022:`**
<figure><img src="../../../.gitbook/assets/image (705).png" alt="" width="375"><figcaption></figcaption></figure>
更改后:
<figure><img src="../../../.gitbook/assets/image (707).png" alt="" width="563"><figcaption></figcaption></figure>
现在我们知道这里有一个**由7个元素组成的数组**检查最终的反编译代码点击创建一个由7个元素组成的数组
<figure><img src="../../../.gitbook/assets/image (708).png" alt="" width="563"><figcaption></figcaption></figure>
创建数组后,您可以看到所有导出的函数:
<figure><img src="../../../.gitbook/assets/image (709).png" alt=""><figcaption></figcaption></figure>
{% hint style="success" %}
如果您记得,要从用户空间**调用**一个**导出的**函数,我们不需要调用函数的名称,而是**选择器编号**。在这里,您可以看到选择器**0**是函数**`initializeDecoder`**,选择器**1**是**`startDecoder`**,选择器**2**是**`initializeEncoder`**...
{% endhint %}
<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>
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live).
* **Comparte tus trucos de hacking enviando PR a** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **y** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).
</details>

View file

@ -4,10 +4,10 @@
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一个**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想要**获取PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* 你在一个**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass)**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
</details>
@ -16,45 +16,89 @@
Mach使用**任务task**作为共享资源的**最小单位**,每个任务可以包含**多个线程**。这些**任务和线程与POSIX进程和线程一一对应**。
任务之间的通信通过Mach进程间通信IPC进行利用单向通信通道。**消息通过端口进行传输**,端口类似于由内核管理的**消息队列**。
任务之间的通信通过Mach进程间通信IPC进行利用单向通信通道。**消息通过端口传递**,端口类似于由内核管理的**消息队列**。
每个进程都有一个**IPC表**,其中可以找到进程的**Mach端口**。Mach端口的名称实际上是一个数字指向内核对象的指针
进程还可以将带有某些权限的端口名称**发送给其他任务**,内核将在**其他任务的IPC表**中创建此条目。
端口权限定义了任务可以执行的操作,这对通信至关重要。可能的**端口权限**有:
* **接收权限**允许接收发送到端口的消息。Mach端口是MPSC多生产者单消费者队列这意味着整个系统中每个端口只能有**一个接收权限**(与管道不同,多个进程可以持有指向管道读端的文件描述符)。
* 拥有接收权限的**任务可以接收消息并创建发送权限**,从而可以发送消息。最初,只有**自己的任务对其端口拥有接收权限**。
* **接收权限**允许接收发送到端口的消息。Mach端口是MPSC多生产者单消费者队列这意味着整个系统中可能只有**一个接收权限与每个端口**相关联(与管道不同,多个进程可以同时持有对一个管道读端的文件描述符)。
* 具有**接收权限的任务**可以接收消息并**创建发送权限**,从而可以发送消息。最初,只有**自己的任务对其端口具有接收权限**。
* **发送权限**,允许向端口发送消息。
* 发送权限可以进行**克隆**,因此拥有发送权限的任务可以克隆该权限并将其授予第三任务。
* 发送权限可以**克隆**,因此拥有发送权限的任务可以克隆该权限并将其授予第三任务。
* **一次性发送权限**,允许向端口发送一条消息,然后消失。
* **端口集权限**,表示一个**端口集**而不是单个端口。从端口集中出队一条消息会从其中一个包含的端口中出队。端口集可用于同时监听多个端口类似于Unix中的`select`/`poll`/`epoll`/`kqueue`。
* **死名**,不是实际的端口权限,而只是一个占位符。当一个端口被销毁时,所有现有的端口权限都变成死名。
* **死**不是实际的端口权限,而只是一个占位符。当一个端口被销毁时,所有现有的端口权限都变成死名
**任务可以将发送权限传输给其他任务**,使其能够发送消息回来。**发送权限也可以进行克隆**,因此任务可以复制并将权限授予第三任务。这与一个称为**引导服务器**的中间进程结合使用,可以实现任务之间的有效通信。
**任务可以将发送权限传输给其他任务**,使其能够发送消息回来。**发送权限也可以克隆**,因此任务可以复制并将权限授予第三任务。这与一个称为**引导服务器**的中间进程结合使用,可以实现任务之间的有效通信。
#### 步骤:
正如前面提到的,为了建立通信通道,涉及到**引导服务器**mac中的**launchd**)。
1. 任务**A**初始化一个**新的端口**,在此过程中获得一个**接收权限**。
1. 任务**A**初始化一个**新的端口**,在程中获得一个**接收权限**。
2. 作为接收权限的持有者,任务**A**为端口**生成一个发送权限**。
3. 任务**A**通过引导注册过程与**引导服务器**建立**连接**,提供**端口的服务名称**和**发送权限**。
4. 任务**B**与**引导服务器**交互,执行服务名称的引导**查找**。如果成功,**服务器复制从任务A接收到的发送权限**并将其**传输给任务B**。
4. 任务**B**与**引导服务器**交互,执行服务名称的引导**查找**。如果成功,**服务器复制从任务A接收到的发送权限**并将其**传输给任务B**。
5. 获得发送权限后,任务**B**能够**构建**一条**消息**并将其**发送给任务A**。
引导服务器**无法对任务声称的服务名称进行身份验证**。这意味着一个任务可能**冒充任何系统任务**,例如虚假地**声称授权服务名称**,然后批准每个请求。
引导服务器**无法对任务声称的服务名称进行身份验证**。这意味着一个任务可能潜在地**冒充任何系统任务**,例如虚假地**声称授权服务名称**,然后批准每个请求。
然后Apple将**系统提供的服务名称**存储在位于**SIP保护**目录下的安全配置文件中:`/System/Library/LaunchDaemons`和`/System/Library/LaunchAgents`。引导服务器将为每个这些服务名称创建并持有一个**接收权限**。
然后Apple将**系统提供的服务名称**存储在位于**SIP保护**目录`/System/Library/LaunchDaemons`和`/System/Library/LaunchAgents`中的安全配置文件中。引导服务器将为每个这些服务名称创建并持有一个**接收权限**。
对于这些预定义服务,**查找过程有不同**。当查找服务名称时launchd会动态启动服务。新的工作流程如下
对于这些预定义服务,**查找过程有不同**。当查找服务名称时launchd会动态启动服务。新的工作流程如下
* 任务**B**启动服务名称的引导**查找**。
* 任务**B**为服务名称**发起引导查找**。
* **launchd**检查任务是否正在运行,如果没有,则**启动**它。
* 任务**A**(服务)执行引导**签入**。在这里,引导服务器创建一个发送权限,保留它,并将**接收权限传输给任务A**。
* 任务**A**(服务)执行**引导签入**。在这里,**引导**服务器创建一个发送权限,保留它,并将**接收权限传输给任务A**。
* launchd复制**发送权限并将其发送给任务B**。
然而,这个过程仅适用于预定义的系统任务。非系统任务仍然按照最初的描述进行操作,这可能导致冒充。
然而,此过程仅适用于预定义的系统任务。非系统任务仍然按照最初的描述进行操作,这可能潜在地允许冒充。
### 枚举端口
To enumerate ports on a macOS system, you can use various tools and techniques. Here are a few methods you can try:
#### 1. Using `nmap`
[nmap](https://nmap.org/) is a powerful network scanning tool that can be used to enumerate ports on a target system. You can install `nmap` on macOS using package managers like [Homebrew](https://brew.sh/). Once installed, you can run the following command to scan for open ports:
```bash
nmap -p- <target_ip>
```
This command will scan all ports on the target IP address and display the open ports.
#### 2. Using `netstat`
`netstat` is a command-line tool available on macOS that can display active network connections and listening ports. You can use the following command to list all listening ports:
```bash
netstat -an | grep LISTEN
```
This command will show all the ports that are currently in a listening state.
#### 3. Using `lsof`
`lsof` is another command-line tool that can be used to list open files, including network connections and listening ports. You can use the following command to list all open ports:
```bash
sudo lsof -i -P | grep LISTEN
```
This command will display all the open ports on your macOS system.
These are just a few methods to enumerate ports on a macOS system. Depending on your specific requirements, you may need to use additional tools or techniques.
```bash
lsmp -p <pid>
```
您可以从[http://newosxbook.com/tools/binpack64-256.tar.gz](http://newosxbook.com/tools/binpack64-256.tar.gz)下载并在iOS上安装此工具。
### 代码示例
请注意,**发送方**在分配一个端口后,为名称`org.darlinghq.example`创建了一个**发送权限**,并将其发送到**引导服务器**,而发送方则请求该名称的**发送权限**并使用它来**发送消息**。
请注意,**发送方**分配一个端口,为名称`org.darlinghq.example`创建了一个**发送权**,并将其发送到**引导服务器**,而发送方则请求该名称的**发送权**并使用它来**发送消息**。
{% tabs %}
{% tab title="receiver.c" %}
@ -279,7 +323,7 @@ performMathOperations(); // Silent action
return 0;
}
```
{% tab title="entitlements.plist" %}权限清单.plist{% endtab %}
{% tab title="entitlements.plist" %}权限清单.plist
```xml
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
@ -738,19 +782,20 @@ memset(&remoteThreadState64, '\0', sizeof(remoteThreadState64));
remoteStack64 += (STACK_SIZE / 2); // 这是真正的堆栈
//remoteStack64 -= 8; // 需要 16 字节对齐
const char* p = (const char*) remoteCode64;
const char *p = (const char *)remoteCode64;
remoteThreadState64.ash.flavor = ARM_THREAD_STATE64;
remoteThreadState64.ash.count = ARM_THREAD_STATE64_COUNT;
remoteThreadState64.ts_64.__pc = (u_int64_t) remoteCode64;
remoteThreadState64.ts_64.__sp = (u_int64_t) remoteStack64;
remoteThreadState64.ts_64.__pc = (u_int64_t)remoteCode64;
remoteThreadState64.ts_64.__sp = (u_int64_t)remoteStack64;
printf("远程堆栈 64 0x%llx远程代码为 %p\n", remoteStack64, p);
kr = thread_create_running(remoteTask, ARM_THREAD_STATE64, // ARM_THREAD_STATE64,
(thread_state_t) &remoteThreadState64.ts_64, ARM_THREAD_STATE64_COUNT, &remoteThread);
(thread_state_t)&remoteThreadState64.ts_64, ARM_THREAD_STATE64_COUNT, &remoteThread);
if (kr != KERN_SUCCESS) {
if (kr != KERN_SUCCESS)
{
fprintf(stderr, "无法创建远程线程:错误 %s", mach_error_string(kr));
return (-3);
}
@ -758,7 +803,7 @@ if (kr != KERN_SUCCESS) {
return (0);
}
int main(int argc, const char * argv[])
int main(int argc, const char *argv[])
{
if (argc < 3)
{
@ -772,12 +817,12 @@ const char *action = argv[2];
struct stat buf;
int rc = stat(action, &buf);
if (rc == 0) inject(pid, action);
if (rc == 0)
inject(pid, action);
else
{
fprintf(stderr, "找不到 dylib\n");
}
}
```
</details>
@ -807,7 +852,7 @@ XPC代表XNUmacOS使用的内核进程间通信是macOS和iOS上进程
## MIG - Mach接口生成器
MIG被创建用于简化Mach IPC代码的生成过程。它基本上为服务器和客户端生成所需的通信代码。即使生成的代码很丑陋,开发人员只需要导入它,他的代码比以前简单得多。
MIG被创建用于简化Mach IPC代码的生成过程。它基本上为服务器和客户端生成所需的代码,以便它们可以进行通信。即使生成的代码很丑陋,开发人员只需要导入它,他的代码也会比以前简单得多。
有关更多信息,请查看:
@ -825,10 +870,10 @@ MIG被创建用于简化Mach IPC代码的生成过程。它基本上为服务器
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一家网络安全公司工作吗想要在HackTricks中宣传你的公司吗或者想要获取PEASS的最新版本或下载PDF格式的HackTricks吗请查看[订阅计划](https://github.com/sponsors/carlospolop)
* 发现我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品[The PEASS Family](https://opensea.io/collection/the-peass-family)
* 获取[官方PEASS和HackTricks周边产品](https://peass.creator-spring.com)
* 加入[💬](https://emojipedia.org/speech-balloon/) [Discord群](https://discord.gg/hRep4RUj7f)或[电报群](https://t.me/peass)或在Twitter上关注我[🐦](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[@carlospolopm](https://twitter.com/hacktricks\_live)。
* 通过向[hacktricks repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧。
* 你在一家**网络安全公司**工作吗想要在HackTricks中**宣传你的公司**吗?或者想要**获取PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)****
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) ****[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
</details>

View file

@ -18,7 +18,7 @@ ARM64也被称为ARMv8-A是一种64位处理器架构用于各种设备
### **寄存器**
ARM64有**31个通用寄存器**,标记为`x0`到`x30`。每个寄存器可以存储一个**64位**8字节的值。对于只需要32位值的操作可以使用相同的寄存器以32位模式访问使用名称w0到w30
ARM64有**31个通用寄存器**,标记为`x0`到`x30`。每个寄存器可以存储一个**64位**8字节的值。对于只需要32位值的操作可以使用名为w0到w30的32位模式访问相同的寄存器
1. **`x0`**到**`x7`** - 通常用作临时寄存器和传递子程序参数。
* **`x0`**还携带函数的返回数据
@ -35,9 +35,9 @@ ARM64有**31个通用寄存器**,标记为`x0`到`x30`。每个寄存器可以
### **调用约定**
ARM64调用约定规定函数的**前八个参数**通过寄存器**`x0`到`x7`**传递。**额外的**参数通过**堆栈**传递。**返回**值通过寄存器**`x0`**传回,如果是**128位**则也可以通过**`x1`**传回。**`x19`**到**`x30`**和**`sp`**寄存器必须在函数调用之间**保留**。
ARM64调用约定规定函数的**前八个参数**通过寄存器**`x0`到`x7`**传递。**额外的**参数通过**堆栈**传递。**返回**值通过寄存器**`x0`**传回,如果是**128位**的话,也可以通过**`x1`**传回。函数调用时,**`x19`**到**`x30`**和**`sp`**寄存器必须被**保留**。
在汇编中阅读函数时,要查找**函数序言和尾声**。**序言**通常涉及**保存帧指针(`x29`****设置新的帧指针**和**分配堆栈空间**。**尾声**通常涉及**恢复保存的帧指针**和**从函数返回**。
在汇编中阅读函数时,要查找**函数序言和尾声**。**序言**通常涉及**保存帧指针(`x29`****设置新的帧指针**和**分配堆栈空间**。**尾声**通常涉及**恢复保存的帧指针**和**从函数返回**。
### Swift中的调用约定
@ -45,54 +45,54 @@ Swift有自己的**调用约定**,可以在[**https://github.com/apple/swift/b
### **常见指令**
ARM64指令通常具有**`opcode dst, src1, src2`**的格式,其中**`opcode`**是要执行的**操作**如`add`、`sub`、`mov`等),**`dst`**是结果存储的**目标**寄存器,**`src1`**和**`src2`**是**源**寄存器。也可以使用立即值代替源寄存器。
ARM64指令通常具有**`opcode dst, src1, src2`**的格式,其中**`opcode`**是要执行的**操作**(如`add`、`sub`、`mov`等),**`dst`**是结果将被存储的**目标**寄存器,**`src1`**和**`src2`**是**源**寄存器。也可以使用立即值代替源寄存器。
* **`mov`**:将一个值从一个**寄存器**移动到另一个寄存器。
* 示例:`mov x0, x1` - 这将将`x1`中的值移动到`x0`中。
* **`ldr`**:将**内存**中的值加载到**寄存器**中。
* **`ldr`**:将一个值从**内存**加载到**寄存器**中。
* 示例:`ldr x0, [x1]` - 这将从由`x1`指向的内存位置加载一个值到`x0`中。
* **`str`**:将**寄存器**中的值存储到**内存**中。
* **`str`**:将一个值从寄存器存储到内存中。
* 示例:`str x0, [x1]` - 这将将`x0`中的值存储到由`x1`指向的内存位置中。
* **`ldp`****加载一对寄存器**。该指令从**连续的内存**位置加载两个寄存器。内存地址通常是通过将偏移量添加到另一个寄存器中的值来形成的。
* 示例:`ldp x0, x1, [x2]` - 这将从`x2`和`x2 + 8`处的内存位置分别加载`x0`和`x1`。
* **`stp`****存储一对寄存器**。该指令将两个寄存器存储到**连续的内存**位置。内存地址通常是通过将偏移量添加到另一个寄存器中的值来形成的。
* 示例:`stp x0, x1, [x2]` - 这将`x0`和`x1`存储到`x2`和`x2 + 8`处的内存位置。
* **`add`**:将两个寄存器的值相加,并将结果存储在一个寄存器中。
* 示例:`add x0x1x2` — 这将`x1`和`x2`中的值相加,并将结果存储在`x0`中。
* **`sub`****减去**两个寄存器的值,并将结果存储在一个寄存器中。
* 示例:`sub x0x1x2` — 这将`x2`从`x1`中减去,并将结果存储在`x0`中。
* **`mul`****乘以**两个寄存器的值,并将结果存储在一个寄存器中。
* 示例:`mul x0x1x2` — 这将`x1`和`x2`中的值相乘,并将结果存储在`x0`中。
* 示例:`add x0, x1, x2` — 这将`x1`和`x2`中的值相加,并将结果存储在`x0`中。
* **`sub`**将两个寄存器的值相减,并将结果存储在一个寄存器中。
* 示例:`sub x0, x1, x2` — 这将`x1`中的值减去`x2`的值,并将结果存储在`x0`中。
* **`mul`**将两个寄存器的值相乘,并将结果存储在一个寄存器中。
* 示例:`mul x0, x1, x2` — 这将`x1`和`x2`中的值相乘,并将结果存储在`x0`中。
* **`div`**:将一个寄存器的值除以另一个寄存器的值,并将结果存储在一个寄存器中。
* 示例:`div x0x1x2` — 这将`x1`除以`x2`的值,并将结果存储在`x0`中。
* **`bl`****带链接分支**,用于**调用子程序**。将**返回地址存储在`x30`中**
* 示例:`div x0, x1, x2` — 这将`x1`中的值除以`x2`的值,并将结果存储在`x0`中。
* **`bl`**:带链接分支,用于调用子程序。将返回地址存储在`x30`中。
* 示例:`bl myFunction` — 这将调用函数`myFunction`并将返回地址存储在`x30`中。
* **`blr`****带链接寄存器分支**,用于**调用子程序**,其中目标在**寄存器**中**指定**。将**返回地址存储在`x30`中**
* **`blr`**带链接的寄存器分支,用于调用寄存器中指定的子程序。将返回地址存储在`x30`中
* 示例:`blr x1` — 这将调用地址包含在`x1`中的函数,并将返回地址存储在`x30`中。
* **`ret`****从子程序返回**,通常使用**`x30`中的地址**
* **`ret`**:从子程序返回,通常使用`x30`中的地址。
* 示例:`ret` — 这将使用`x30`中的返回地址从当前子程序返回。
* **`cmp`****比较**两个寄存器并设置条件标志。
* 示例:`cmp x0x1` — 这将比较`x0`和`x1`中的值,并相应地设置条件标志。
* **`b.eq`****如果相等则分支**,基于先前的`cmp`指令。
* 示例:`b.eq label` — 如果先前的`cmp`指令找到两个相等的值,则跳转到`label`。
* **`b.ne`****如果不相等则分支**。此指令检查条件标志(由先前的比较指令设置),如果比较的值不相等,则分支到标签或地址。
* 示例:在`cmp x0x1`指令之后,`b.ne label` — 如果`x0`和`x1`中的值不相等,则跳转到`label`。
* **`cbz`****比较并在零时分支**。此指令将一个寄存器与零进行比较,如果它们相等,则分支到标签或地址。
* 示例:`cbz x0label` — 如果`x0`中的值为零,则跳转到`label`。
* **`cbnz`****比较并在非零时分支**。此指令将一个寄存器与零进行比较,如果它们不相等,则分支到标签或地址。
* 示例:`cbnz x0label` — 如果`x0`中的值非零,则跳转到`label`。
* **`adrp`**:计算**符号的页地址**并将其存储在一个寄存器中。
* 示例:`adrp x0symbol` — 这将计算`symbol`的页地址并将其存储在`x0`中。
* **`ldrsw`**:从内存中**加载**一个带符号的**32位**值,并将其**符号扩展为64位**
* 示例:`ldrsw x0[x1]` — 这将从由`x1`指向的内存位置加载一个带符号的32位值将其符号扩展为64位并将其存储在`x0`中。
* **`stur`**:将寄存器值**存储到内存位置**,使用另一个寄存器的偏移量。
* 示例:`stur x0[x1#4]` — 这将将`x0`中的值存储到当前`x1`地址加4字节的内存地址中
* **`svc`**:进行**系统调用**。它代表"Supervisor Call"。当处理器执行此指令时,它将从用户模式切换到内核模式,并跳转到内存中内核系统调用处理代码的特定位置。
* **`cmp`**:比较两个寄存器的值并设置条件标志。
* 示例:`cmp x0, x1` — 这将比较`x0`和`x1`中的值,并相应地设置条件标志。
* **`b.eq`**:如果前的`cmp`指令发现两个相等的值,则跳转到标签
* 示例:`b.eq label` — 如果前面的`cmp`指令发现`x0`和`x1`中的值相等,则跳转到`label`。
* **`b.ne`**如果不相等,则根据条件标志(由先前的比较指令设置)跳转到标签或地址。
* 示例:在`cmp x0, x1`指令之后,`b.ne label` — 如果`x0`和`x1`中的值不相等,则跳转到`label`。
* **`cbz`**比较并在零时跳转。此指令将一个寄存器与零进行比较,如果相等,则跳转到标签或地址。
* 示例:`cbz x0, label` — 如果`x0`中的值为零,则跳转到`label`。
* **`cbnz`**比较并在非零时跳转。此指令将一个寄存器与零进行比较,如果不相等,则跳转到标签或地址。
* 示例:`cbnz x0, label` — 如果`x0`中的值非零,则跳转到`label`。
* **`adrp`**:计算符号的页地址并将其存储在一个寄存器中。
* 示例:`adrp x0, symbol` — 这将计算`symbol`的页地址并将其存储在`x0`中。
* **`ldrsw`**:从内存中加载一个有符号的32位值并将其符号扩展为64位
* 示例:`ldrsw x0, [x1]` — 这将从`x1`指向的内存位置加载一个有符号的32位值将其符号扩展为64位并将其存储在`x0`中。
* **`stur`**:将寄存器值存储到内存位置,使用另一个寄存器的偏移量。
* 示例:`stur x0, [x1, #4]` — 这将将`x0`中的值存储到当前`x1`地址加4字节的内存位置
* **`svc`**:进行系统调用。它代表"Supervisor Call"。当处理器执行此指令时,它将从用户模式切换到内核模式,并跳转到内存中内核系统调用处理代码的特定位置。
* 示例:
```armasm
mov x893 ; 将退出的系统调用号93加载到寄存器x8中。
mov x00 ; 将退出状态码0加载到寄存器x0中。
mov x8, 93 ; 将退出的系统调用号93加载到寄存器x8中。
mov x0, 0 ; 将退出状态码0加载到寄存器x0中。
svc 0 ; 进行系统调用。
```
@ -100,31 +100,45 @@ svc 0 ; 进行系统调用。
1. **将链接寄存器和帧指针保存到堆栈中**
{% code overflow="wrap" %}
```armasm
stp x29x30[sp#-16] ; 将x29和x30对存储到堆栈中,并减小堆栈指针
stp x29, x30, [sp, #-16]! ; 将x29和x30寄存器对存储到堆栈中,并减小堆栈指针
```
{% endcode %}
2. **设置新的帧指针**`mov x29sp`(为当前函数设置新的帧指针)
3. **为局部变量在堆栈上分配空间**(如果需要):`sub spsp<size>`(其中`<size>`是所需的字节数)
2. **设置新的帧指针**`mov x29, sp`(为当前函数设置新的帧指针)
3. **为局部变量在堆栈上分配空间**(如果需要):`sub sp, sp, <size>`(其中`<size>`是所需的字节数)
### **函数收尾**
1. **释放局部变量(如果有分配的变量)**`add spsp<size>`
1. **释放局部变量(如果有分配的变量)**`add sp, sp, <size>`
2. **恢复链接寄存器和帧指针**
{% code overflow="wrap" %}
```armasm
ldp x29x30[sp]#16 ; 从堆栈中加载x29和x30对,并增加堆栈指针
ldp x29, x30, [sp], #16 ; 从堆栈中加载x29和x30寄存器对,并增加堆栈指针
```
{% endcode %}
3. **返回**`ret`(使用链接寄存器中的地址将控制返回给调用者)
## macOS
### syscalls
### BSD系统调用
请查看[**syscalls.master**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master)。
查看[**syscalls.master**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master)。BSD系统调用将具有**x16 > 0**。
### Mach陷阱
查看[**syscall\_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall\_sw.c.auto.html)。Mach陷阱将具有**x16 < 0**因此您需要使用前面列表中的数字加上负号来调用**`_kernelrpc_mach_vm_allocate_trap`****`-10`**。
您还可以在反汇编器中检查**`libsystem_kernel.dylib`**以找到如何调用这些和BSD系统调用的方法
```bash
# macOS
dyldex -e libsystem_kernel.dylib /System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e
# iOS
dyldex -e libsystem_kernel.dylib /System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64
```
{% hint style="success" %}
有时候,检查来自`libsystem_kernel.dylib`的**反编译**代码比检查**源代码**更容易因为一些系统调用BSD和Mach的代码是通过脚本生成的请检查源代码中的注释而在dylib中你可以找到正在被调用的内容。
{% endhint %}
### Shellcodes

View file

@ -72,15 +72,15 @@ cat /Library/LaunchDaemons/com.jamf.management.daemon.plist
</dict>
</plist>
```
**`LaunchDameons`**中的进程由root用户运行。因此如果非特权进程可以与其中一个进程通信,它可能能够提升权限。
**`LaunchDameons`**中的进程由root用户运行。因此如果非特权进程能够与其中一个进程通信,就有可能提升权限。
## XPC事件消息
应用程序可以**订阅**不同的事件**消息**,使它们能够在发生此类事件时**按需启动**。这些服务的设置是在**与前的文件相同的目录中的launchd plist文件**中完成的,其中包含额外的**`LaunchEvent`**键。
应用程序可以**订阅**不同的事件**消息**,使能够在发生此类事件时**按需启动**。这些服务的设置是在**与前的文件相同的目录中****launchd plist文件**中完成的,其中包含额外的**`LaunchEvent`**键。
### XPC连接进程检查
当进程尝试通过XPC连接调用方法时**XPC服务应该检查该进程是否被允许连接**。以下是检查的常见方法和常见陷阱:
当进程尝试通过XPC连接调用方法时**XPC服务应该检查该进程是否被允许连接**。以下是常见的检查方法和常见陷阱:
{% content-ref url="macos-xpc-connecting-process-check.md" %}
[macos-xpc-connecting-process-check.md](macos-xpc-connecting-process-check.md)
@ -94,6 +94,19 @@ Apple还允许应用程序**配置某些权限以及如何获取这些权限**
[macos-xpc-authorization.md](macos-xpc-authorization.md)
{% endcontent-ref %}
## XPC嗅探器
要嗅探XPC消息可以使用[**xpcspy**](https://github.com/hot3eed/xpcspy),它使用**Frida**。
```bash
# Install
pip3 install xpcspy
pip3 install xpcspy --no-deps # To not make xpcspy install Frida 15 and downgrade your Frida installation
# Start sniffing
xpcspy -U -r -W <bundle-id>
## Using filters (i: for input, o: for output)
xpcspy -U <prog-name> -t 'i:com.apple.*' -t 'o:com.apple.*' -r
```
## C代码示例
{% tabs %}
@ -376,7 +389,7 @@ To analyze the `xyz.hacktricks.svcoc.plist` file, you can use a property list ed
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.
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 performing any security assessments or penetration testing.
{% endtab %}
```xml
@ -432,10 +445,10 @@ 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.
3. Set the appropriate interface for the connection.
4. Set the connection's delegate.
5. Establish the connection using the `resume()` method.
6. Call the remote methods using the connection's proxy object.
6. Send requests to the server using the connection's `remoteObjectProxy` property.
### 用法
@ -443,41 +456,42 @@ To use the Dylb client code, follow these steps:
1. 导入所需的框架和库。
2. 创建 `NSXPCConnection` 类的实例。
3. 为连接设置适当的 `NSXPCInterface`
4. 设置 `NSXPCConnection` 的代理。
3. 为连接设置适当的接口
4. 设置连接的代理。
5. 使用 `resume()` 方法建立连接。
6. 使用连接的代理对象调用远程方法
6. 使用连接的 `remoteObjectProxy` 属性向服务器发送请求
```swift
import Foundation
import XPC
// Step 1: Import necessary frameworks and libraries
// Step 2: Create an instance of NSXPCConnection
let connection = NSXPCConnection(serviceName: "com.example.MyService")
// Step 3: Set the appropriate NSXPCInterface for the connection
let interface = NSXPCInterface(with: MyServiceProtocol.self)
connection.remoteObjectInterface = interface
// Step 4: Set the NSXPCConnection delegate
connection.delegate = self
// Step 5: Establish the connection
connection.remoteObjectInterface = NSXPCInterface(with: MyServiceProtocol.self)
connection.resume()
// Step 6: Call remote methods using the connection's proxy object
let proxy = connection.remoteObjectProxy
proxy?.performAction()
proxy?.performAction(with: data) { response in
// Handle the response from the server
}
```
### Conclusion
### Security Considerations
The client code inside a Dylb is crucial for establishing communication with the server and sending requests in macOS. By following the steps mentioned above, you can effectively use the Dylb client code in your applications.
When using the Dylb client code, it is important to consider security measures to protect against potential vulnerabilities. Here are some recommendations:
### 结论
- Validate and sanitize user input to prevent injection attacks.
- Implement proper authentication and authorization mechanisms.
- Encrypt sensitive data before sending it over the network.
- Regularly update and patch the Dylb code to address any security vulnerabilities.
Dylb 中的客户端代码对于在 macOS 中与服务器建立通信并发送请求至关重要。通过按照上述步骤操作,您可以有效地在应用程序中使用 Dylb 客户端代码。
### 安全注意事项
在使用 Dylb 客户端代码时,重要的是要考虑安全措施,以防止潜在的漏洞。以下是一些建议:
- 验证和清理用户输入,以防止注入攻击。
- 实施适当的身份验证和授权机制。
- 在发送敏感数据之前对其进行加密。
- 定期更新和修补 Dylb 代码,以解决任何安全漏洞。
```objectivec
// gcc -dynamiclib -framework Foundation oc_xpc_client.m -o oc_xpc_client.dylib
// gcc injection example:
@ -518,7 +532,7 @@ return;
* 你在一家**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载HackTricks的PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或者**关注**我在**推特**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
</details>

View file

@ -7,7 +7,7 @@
* 你在一个**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
</details>
@ -61,7 +61,7 @@ MacOS沙盒**限制在沙盒内运行的应用程序**只能执行沙盒配置
## 信任缓存
苹果macOS信任缓存有时也称为AMFIApple Mobile File Integrity缓存是macOS中的一种安全机制旨在**防止未经授权或恶意软件运行**。实质上,它是操作系统用于**验证软件的完整性和真实性的加密哈希列表**。
苹果macOS信任缓存有时也称为AMFIApple Mobile File Integrity缓存是macOS中的一种安全机制旨在**防止未经授权或恶意软件运行**。实质上,它是操作系统用于**验证软件的完整性和真实性的加密哈希列表**。
当应用程序或可执行文件尝试在macOS上运行时操作系统会检查AMFI信任缓存。如果在信任缓存中找到文件的哈希值则系统会**允许**该程序运行,因为它被识别为可信任的。
@ -69,18 +69,20 @@ MacOS沙盒**限制在沙盒内运行的应用程序**只能执行沙盒配置
它控制**从何处以及什么**可以启动**Apple签名的二进制文件**
* 如果应该由launchd运行无法直接启动应用程序
* 无法在受信任的位置之外运行应用程序(如/System/
* 如果应该由launchd运行无法直接启动应用程序
* 无法在受信任的位置之外运行应用程序(如/System/
包含有关此限制信息的文件位于macOS中的**`/System/Volumes/Preboot/*/boot/*/usr/standalone/firmware/FUD/StaticTrustCache.img4`**在iOS中似乎位于**`/usr/standalone/firmware/FUD/StaticTrustCache.img4`**)。
包含有关此限制信息的文件位于macOS中的**`/System/Volumes/Preboot/*/boot/*/usr/standalone/firmware/FUD/StaticTrustCache.img4`**在iOS中,它似乎位于**`/usr/standalone/firmware/FUD/StaticTrustCache.img4`**)。
似乎可以使用工具[**img4tool**](https://github.com/tihmstar/img4tool) **提取缓存**
看起来可以使用工具[**img4tool**](https://github.com/tihmstar/img4tool) **提取缓存**
```bash
img4tool -e in.img4 -o out.bin
```
然后,您可以使用类似[**这个脚本**](https://gist.github.com/xpn/66dc3597acd48a4c31f5f77c3cc62f30)的脚本来提取数据
然后,您可以使用[**pyimg4**](https://github.com/m1stadev/PyIMG4)之类的脚本,但是以下脚本无法与该输出一起使用
从这些数据中,您可以检查具有**启动约束值为`0`**的应用程序,这些应用程序没有受到约束([**在此处查看**](https://gist.github.com/LinusHenze/4cd5d7ef057a144cda7234e2c247c056)每个值的含义)。
然后,您可以使用[**此脚本**](https://gist.github.com/xpn/66dc3597acd48a4c31f5f77c3cc62f30)之类的脚本来提取数据。
从该数据中,您可以检查具有**启动约束值为`0`**的应用程序,这些应用程序没有受到约束([**在此处查看**](https://gist.github.com/LinusHenze/4cd5d7ef057a144cda7234e2c247c056)每个值的含义)。
<details>

View file

@ -6,7 +6,7 @@
* 你在一家**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* 获[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
@ -14,9 +14,9 @@
## 基本信息
MacOS沙盒最初称为Seatbelt**限制在沙盒运行的应用程序**只能执行沙盒配置文件中指定的允许操作。这有助于确保**应用程序只能访问预期的资源**。
MacOS沙盒最初称为Seatbelt**限制在沙盒运行的应用程序**只能执行沙盒配置文件中指定的允许操作。这有助于确保**应用程序只能访问预期的资源**。
任何具有**`com.apple.security.app-sandbox`**权限的应用程序都将在沙盒内执行。**Apple二进制文件**通常在沙盒内执行,并且为了在**App Store**上发布,**此权限是强制性的**。因此,大多数应用程序将在沙盒内执行。
任何具有**`com.apple.security.app-sandbox`**权限的应用程序都将在沙盒中执行。**Apple二进制文件**通常在沙盒中执行,并且为了在**App Store**中发布,**此权限是强制性的**。因此,大多数应用程序将在沙盒中执行。
为了控制进程可以执行的操作,**沙盒在内核中的所有系统调用中都有钩子**。根据应用程序的**权限**,沙盒将**允许**特定的操作。
@ -27,7 +27,7 @@ MacOS沙盒最初称为Seatbelt**限制在沙盒内运行的应用程序**
* 在用户空间运行的**守护进程**`/usr/libexec/sandboxd`
* **容器**`~/Library/Containers`
在容器文件夹中,您可以找到**每个以沙盒方式执行的应用程序的文件夹**,文件夹的名称是捆绑标识符
在容器文件夹中,你可以找到**每个在沙盒中执行的应用程序的文件夹**文件夹的名称是bundle id
```bash
ls -l ~/Library/Containers
total 0
@ -189,13 +189,541 @@ log show --style syslog --predicate 'eventMessage contains[c] "sandbox"' --last
```
{% code title="touch2.sb" %}
这是一个示例的 macOS 沙盒配置文件,用于限制应用程序的权限和访问。沙盒是一种安全机制,用于隔离应用程序并限制其对系统资源的访问。通过使用沙盒,可以减少应用程序对系统的潜在威胁,并提高系统的安全性。
```plaintext
# Sandbox profile for the touch2 command
在这个示例中,我们定义了一个名为 "touch2" 的应用程序,并为其配置了一些权限和限制。首先,我们指定了应用程序的主目录,以及它可以访问的其他目录。然后,我们限制了应用程序对网络的访问,并禁止它执行任何系统命令。最后,我们还限制了应用程序对用户数据的访问,以确保用户的隐私和安全。
(version 1)
(deny default)
要使用这个沙盒配置文件,您需要将其保存为名为 "touch2.sb" 的文件,并将其与应用程序一起打包。然后,当用户运行该应用程序时,系统将根据沙盒配置文件来限制其权限和访问。
(allow file-write*
(literal "/tmp/touch2.txt")
)
请注意,沙盒只是系统安全的一部分,它并不能完全防止所有的攻击和威胁。因此,在开发和部署应用程序时,还需要采取其他安全措施来保护系统和用户的数据。
(allow file-read-data
(literal "/usr/share/misc/magic.mgc")
)
(allow file-read-metadata
(literal "/usr/share/misc/magic.mgc")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_COLLATE/")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_CTYPE/")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MONETARY/")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_NUMERIC/")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_TIME/")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/SYS_.*")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/POSIX")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/ISO_.*")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-8")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF8")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-16")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF16")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-32")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF32")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-7")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF7")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-32BE")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF32BE")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-32LE")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF32LE")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-16BE")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF16BE")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-16LE")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF16LE")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-8BE")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF8BE")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-8LE")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF8LE")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-7BE")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF7BE")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-7LE")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF7LE")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-16BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF16BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-16LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF16LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-8BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF8BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-8LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF8LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-7BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF7BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-7LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF7LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-32BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF32BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-32LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF32LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-16BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF16BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-16LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF16LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-8BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF8BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-8LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF8LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-7BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF7BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-7LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF7LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-32BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF32BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-32LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF32LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-16BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF16BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-16LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF16LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-8BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF8BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-8LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF8LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-7BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF7BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-7LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF7LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-32BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF32BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-32LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF32LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-16BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF16BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-16LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF16LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-8BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF8BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-8LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF8LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-7BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF7BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-7LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF7LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-32BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF32BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-32LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF32LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-16BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF16BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-16LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF16LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-8BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF8BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-8LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF8LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-7BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF7BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-7LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF7LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-32BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF32BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-32LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF32LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-16BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF16BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-16LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF16LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-8BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF8BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-8LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF8LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-7BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF7BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-7LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF7LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-32BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF32BE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF-32LE-BOM")
)
(allow file-read-metadata
(regex #"^/usr/share/locale/[^/]+/LC_MESSAGES/UTF32LE-BOM")
)
(allow
```scheme
(version 1)
(deny default)
@ -235,13 +763,17 @@ log show --style syslog --predicate 'eventMessage contains[c] "sandbox"' --last
macOS将系统沙箱配置文件存储在两个位置**/usr/share/sandbox/** 和 **/System/Library/Sandbox/Profiles**。
如果第三方应用程序具有 _**com.apple.security.app-sandbox**_ 权限,则系统将应用 **/System/Library/Sandbox/Profiles/application.sb** 配置文件到该进程。
如果第三方应用程序具有 _**com.apple.security.app-sandbox**_ 权限,系统将应用 **/System/Library/Sandbox/Profiles/application.sb** 配置文件到该进程。
### **iOS沙箱配置文件**
默认配置文件称为**container**我们没有SBPL文本表示。在内存中此沙箱被表示为每个权限的允许/拒绝二叉树。
### 调试和绕过沙箱
**在macOS上进程不会自动被沙箱限制与iOS不同**在iOS上沙箱是在程序的第一条指令执行之前由内核应用的而在macOS上**进程必须选择将自己置于沙箱中**。
**在macOS上进程不会自动被沙箱限制与iOS不同**在iOS上沙箱在程序的第一条指令执行之前由内核应用而在macOS上进程必须选择将自己置于沙箱中。
如果进程具有 `com.apple.security.app-sandbox` 权限,它们在启动时会自动从用户空间进入沙箱。有关此过程的详细说明,请参阅
如果进程具有`com.apple.security.app-sandbox`权限,它们在启动时会自动从用户空间进入沙箱。有关此过程的详细说明,请查看
{% content-ref url="macos-sandbox-debug-and-bypass/" %}
[macos-sandbox-debug-and-bypass](macos-sandbox-debug-and-bypass/)
@ -249,7 +781,7 @@ macOS将系统沙箱配置文件存储在两个位置**/usr/share/sandbox/**
### **检查PID权限**
[根据此视频](https://www.youtube.com/watch?v=mG715HcDgO8\&t=3011s)**`sandbox_check`**(它是一个`__mac_syscall`可以检查特定PID中沙箱是否允许执行某个操作。
[根据此](https://www.youtube.com/watch?v=mG715HcDgO8\&t=3011s)**`sandbox_check`**(它是一个`__mac_syscall`可以检查特定PID中沙箱是否允许执行某个操作。
[**工具sbtool**](http://newosxbook.com/src.jl?tree=listings\&file=sbtool.c)可以检查PID是否可以执行某个操作
```bash
@ -276,7 +808,7 @@ sbtool <pid> all
<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的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**