Translated ['macos-hardening/macos-security-and-privilege-escalation/mac
BIN
.gitbook/assets/image (695).png
Normal file
After Width: | Height: | Size: 270 KiB |
BIN
.gitbook/assets/image (696).png
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
.gitbook/assets/image (697).png
Normal file
After Width: | Height: | Size: 61 KiB |
BIN
.gitbook/assets/image (698).png
Normal file
After Width: | Height: | Size: 152 KiB |
BIN
.gitbook/assets/image (699).png
Normal file
After Width: | Height: | Size: 248 KiB |
BIN
.gitbook/assets/image (700).png
Normal file
After Width: | Height: | Size: 107 KiB |
BIN
.gitbook/assets/image (701).png
Normal file
After Width: | Height: | Size: 79 KiB |
BIN
.gitbook/assets/image (702).png
Normal file
After Width: | Height: | Size: 107 KiB |
BIN
.gitbook/assets/image (703).png
Normal file
After Width: | Height: | Size: 87 KiB |
BIN
.gitbook/assets/image (704).png
Normal file
After Width: | Height: | Size: 84 KiB |
BIN
.gitbook/assets/image (705).png
Normal file
After Width: | Height: | Size: 344 KiB |
BIN
.gitbook/assets/image (706).png
Normal file
After Width: | Height: | Size: 101 KiB |
BIN
.gitbook/assets/image (707).png
Normal file
After Width: | Height: | Size: 101 KiB |
BIN
.gitbook/assets/image (708).png
Normal file
After Width: | Height: | Size: 302 KiB |
BIN
.gitbook/assets/image (709).png
Normal file
After Width: | Height: | Size: 264 KiB |
|
@ -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)
|
||||
|
|
|
@ -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)**:
|
||||
- 经常被压缩(LZFSE4,LZSS,...)
|
||||
- 可选加密
|
||||
- **清单(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来分享你的黑客技巧。**
|
||||
|
||||
|
|
|
@ -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>
|
|
@ -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代表XNU(macOS使用的内核)进程间通信,是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>
|
||||
|
|
|
@ -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 x0,x1,x2` — 这将`x1`和`x2`中的值相加,并将结果存储在`x0`中。
|
||||
* **`sub`**:**减去**两个寄存器的值,并将结果存储在一个寄存器中。
|
||||
* 示例:`sub x0,x1,x2` — 这将`x2`从`x1`中减去,并将结果存储在`x0`中。
|
||||
* **`mul`**:**乘以**两个寄存器的值,并将结果存储在一个寄存器中。
|
||||
* 示例:`mul x0,x1,x2` — 这将`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 x0,x1,x2` — 这将`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 x0,x1` — 这将比较`x0`和`x1`中的值,并相应地设置条件标志。
|
||||
* **`b.eq`**:**如果相等则分支**,基于先前的`cmp`指令。
|
||||
* 示例:`b.eq label` — 如果先前的`cmp`指令找到两个相等的值,则跳转到`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"。当处理器执行此指令时,它将从用户模式切换到内核模式,并跳转到内存中内核系统调用处理代码的特定位置。
|
||||
* **`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 x8,93 ; 将退出的系统调用号(93)加载到寄存器x8中。
|
||||
mov x0,0 ; 将退出状态码(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 x29,x30,[sp,#-16]! ; 将x29和x30对存储到堆栈中,并减小堆栈指针
|
||||
stp x29, x30, [sp, #-16]! ; 将x29和x30寄存器对存储到堆栈中,并减小堆栈指针
|
||||
```
|
||||
{% endcode %}
|
||||
2. **设置新的帧指针**:`mov x29,sp`(为当前函数设置新的帧指针)
|
||||
3. **为局部变量在堆栈上分配空间**(如果需要):`sub sp,sp,<size>`(其中`<size>`是所需的字节数)
|
||||
|
||||
2. **设置新的帧指针**:`mov x29, sp`(为当前函数设置新的帧指针)
|
||||
3. **为局部变量在堆栈上分配空间**(如果需要):`sub sp, sp, <size>`(其中`<size>`是所需的字节数)
|
||||
|
||||
### **函数收尾**
|
||||
|
||||
1. **释放局部变量(如果有分配的变量)**:`add sp,sp,<size>`
|
||||
1. **释放局部变量(如果有分配的变量)**:`add sp, sp, <size>`
|
||||
2. **恢复链接寄存器和帧指针**:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```armasm
|
||||
ldp x29,x30,[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
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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信任缓存,有时也称为AMFI(Apple Mobile File Integrity)缓存,是macOS中的一种安全机制,旨在**防止未经授权或恶意软件运行**。实质上,它是操作系统用于**验证软件的完整性和真实性的加密哈希列表**。
|
||||
苹果macOS的信任缓存,有时也称为AMFI(Apple 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>
|
||||
|
||||
|
|
|
@ -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)**。**
|
||||
|
|