> For the complete documentation index, see [llms.txt](https://hacktricks.xsx.tw/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacktricks.xsx.tw/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries.md).

# macOS Files, Folders, Binaries & Memory

<details>

<summary><strong>从零开始学习AWS黑客技术，成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE（HackTricks AWS红队专家）</strong></a><strong>！</strong></summary>

支持HackTricks的其他方式：

* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**，请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family)，我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。

</details>

## 文件层次结构

* **/Applications**：已安装的应用程序应位于此处。所有用户都可以访问它们。
* **/bin**：命令行二进制文件
* **/cores**：如果存在，用于存储核心转储
* **/dev**：一切都被视为文件，因此您可能会在此处看到存储的硬件设备。
* **/etc**：配置文件
* **/Library**：可以在此处找到许多与首选项、缓存和日志相关的子目录和文件。根目录和每个用户目录中都存在一个Library文件夹。
* **/private**：未记录，但许多提到的文件夹是符号链接到私有目录。
* **/sbin**：基本系统二进制文件（与管理相关）
* **/System**：使OS X运行的文件。您应该在这里主要找到Apple特定的文件（而不是第三方文件）。
* **/tmp**：文件将在3天后被删除（这是指向/private/tmp的软链接）
* **/Users**：用户的主目录。
* **/usr**：配置和系统二进制文件
* **/var**：日志文件
* **/Volumes**：挂载的驱动器将出现在这里。
* **/.vol**：运行`stat a.txt`，您将获得类似`16777223 7545753 -rw-r--r-- 1 username wheel ...`的内容，其中第一个数字是文件所在卷的ID号，第二个数字是索引节点号。您可以通过/.vol/访问该文件的内容，使用该信息运行`cat /.vol/16777223/7545753`

### 应用程序文件夹

* **系统应用程序**位于`/System/Applications`
* **已安装的**应用程序通常安装在`/Applications`或`~/Applications`
* **应用程序数据**可以在`/Library/Application Support`中找到，用于以root身份运行的应用程序，以及在`~/Library/Application Support`中找到，用于以用户身份运行的应用程序。
* **需要以root身份运行**的第三方应用程序**守护程序**通常位于`/Library/PrivilegedHelperTools/`
* **沙箱**应用程序映射到`~/Library/Containers`文件夹。每个应用程序都有一个根据应用程序的捆绑ID（`com.apple.Safari`）命名的文件夹。
* **内核**位于`/System/Library/Kernels/kernel`
* **Apple的内核扩展**位于`/System/Library/Extensions`
* **第三方内核扩展**存储在`/Library/Extensions`

### 包含敏感信息的文件

MacOS在几个位置存储诸如密码之类的信息：

{% content-ref url="/pages/ghTE17kUkLLCAZ8lTvNj" %}
[macOS Sensitive Locations & Interesting Daemons](/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-sensitive-locations.md)
{% endcontent-ref %}

### 有漏洞的pkg安装程序

{% content-ref url="/pages/bqbwTZXE50gVWg2OzO9n" %}
[macOS Installers Abuse](/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-installers-abuse.md)
{% endcontent-ref %}

## OS X特定扩展

* **`.dmg`**：苹果磁盘映像文件在安装程序中非常常见。
* **`.kext`**：它必须遵循特定结构，是驱动程序的OS X版本（它是一个捆绑包）。
* **`.plist`**：也称为属性列表，以XML或二进制格式存储信息。
* 可以是XML或二进制。可以使用以下命令读取二进制文件：
* `defaults read config.plist`
* `/usr/libexec/PlistBuddy -c print config.plsit`
* `plutil -p ~/Library/Preferences/com.apple.screensaver.plist`
* `plutil -convert xml1 ~/Library/Preferences/com.apple.screensaver.plist -o -`
* `plutil -convert json ~/Library/Preferences/com.apple.screensaver.plist -o -`
* **`.app`**：遵循目录结构的苹果应用程序（它是一个捆绑包）。
* **`.dylib`**：动态库（类似于Windows的DLL文件）
* **`.pkg`**：与xar（可扩展存档格式）相同。可以使用安装程序命令安装这些文件的内容。
* **`.DS_Store`**：每个目录中都有此文件，它保存目录的属性和自定义。
* **`.Spotlight-V100`**：此文件夹出现在系统上每个卷的根目录中。
* **`.metadata_never_index`**：如果此文件位于卷的根目录中，Spotlight将不会索引该卷。
* **`.noindex`**：具有此扩展名的文件和文件夹不会被Spotlight索引。
* **`.sdef`**：捆绑包中的文件指定如何从AppleScript与应用程序进行交互。

### macOS捆绑包

捆绑包是一个**看起来像Finder中的对象的目录**（`*.app`文件是捆绑包的一个示例）。

{% content-ref url="/pages/8YGFLK4rhE1B3TqpfvCf" %}
[macOS Bundles](/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-bundles.md)
{% endcontent-ref %}

## Dyld共享库缓存（SLC）

在macOS（和iOS）中，所有系统共享库，如框架和dylibs，都**合并到一个文件**中，称为**dyld共享缓存**。这提高了性能，因为代码可以更快地加载。

在macOS中，它位于`/System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/`，在旧版本中，您可能会在\*\*`/System/Library/dyld/`**中找到**共享缓存\*\*。\
在iOS中，您可以在\*\*`/System/Library/Caches/com.apple.dyld/`\*\*中找到它们。

与dyld共享缓存类似，内核和内核扩展也编译到内核缓存中，在启动时加载。

为了从单个文件dylib共享缓存中提取库，可以使用二进制文件[dyld\_shared\_cache\_util](https://www.mbsplugins.de/files/dyld_shared_cache_util-dyld-733.8.zip)，这可能在现在无法工作，但您也可以使用[**dyldextractor**](https://github.com/arandomdev/dyldextractor)：

```bash
# dyld_shared_cache_util
dyld_shared_cache_util -extract ~/shared_cache/ /System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e

# dyldextractor
dyldex -l [dyld_shared_cache_path] # List libraries
dyldex_all [dyld_shared_cache_path] # Extract all
# More options inside the readme
```

{% hint style="success" %}
请注意，即使 `dyld_shared_cache_util` 工具无法工作，您也可以将**共享的 dyld 二进制文件传递给 Hopper**，Hopper 将能够识别所有库并让您**选择要调查的库**：
{% endhint %}

<figure><img src="/files/2ei7qMYUduXpZ3mr4SFk" alt="" width="563"><figcaption></figcaption></figure>

一些提取器可能无法工作，因为 dylibs 预链接到硬编码地址，因此它们可能会跳转到未知地址

{% hint style="success" %}
还可以通过在 Xcode 中使用模拟器来下载 macOS 中其他 \*OS 设备的共享库缓存。它们将被下载到：ls `$HOME/Library/Developer/Xcode/<*>OS\ DeviceSupport/<version>/Symbols/System/Library/Caches/com.apple.dyld/`，例如：`$HOME/Library/Developer/Xcode/iOS\ DeviceSupport/14.1\ (18A8395)/Symbols/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64`
{% endhint %}

### 映射 SLC

**`dyld`** 使用系统调用 **`shared_region_check_np`** 来检查 SLC 是否已映射（返回地址），并使用 **`shared_region_map_and_slide_np`** 来映射 SLC。

请注意，即使 SLC 在第一次使用时被滑动，所有**进程**都使用**相同的副本**，如果攻击者能够在系统中运行进程，则**消除了 ASLR** 保护。 这实际上在过去被利用过，并通过共享区域分页器进行了修复。

分支池是创建图像映射之间的小空间的小 Mach-O dylibs，使得不可能插入函数。

### 覆盖 SLCs

使用环境变量：

* **`DYLD_DHARED_REGION=private DYLD_SHARED_CACHE_DIR=</path/dir> DYLD_SHARED_CACHE_DONT_VALIDATE=1`** -> 这将允许加载新的共享库缓存
* **`DYLD_SHARED_CACHE_DIR=avoid`** 并手动用符号链接替换共享缓存中的库与真实库（您需要提取它们）

## 特殊文件权限

### 文件夹权限

在**文件夹**中，**读取**允许**列出**它，**写入**允许**删除**和**写入**文件，**执行**允许**遍历**目录。因此，例如，用户对**没有执行权限**的目录中的文件具有**读取权限**，则**无法读取**该文件。

### 标志修饰符

有一些标志可以设置在文件中，使文件的行为不同。您可以使用 `ls -lO /path/directory` 检查目录中文件的标志

* **`uchg`**：称为**uchange**标志，将**阻止任何更改或删除**文件的操作。要设置它，请执行：`chflags uchg file.txt`
* root 用户可以**移除该标志**并修改文件
* **`restricted`**：此标志使文件受到 SIP 的保护（无法将此标志添加到文件）。
* **`粘性位`**：如果一个目录具有粘性位，**只有**目录的**所有者或 root 可以重命名或删除**文件。通常在 /tmp 目录上设置此标志，以防止普通用户删除或移动其他用户的文件。

所有标志都可以在文件 `sys/stat.h` 中找到（使用 `mdfind stat.h | grep stat.h` 查找），它们是：

* `UF_SETTABLE` 0x0000ffff：所有者可更改标志的掩码。
* `UF_NODUMP` 0x00000001：不转储文件。
* `UF_IMMUTABLE` 0x00000002：文件不可更改。
* `UF_APPEND` 0x00000004：只能追加写入文件。
* `UF_OPAQUE` 0x00000008：目录对于联合是不透明的。
* `UF_COMPRESSED` 0x00000020：文件已压缩（某些文件系统）。
* `UF_TRACKED` 0x00000040：设置此标志的文件不会收到删除/重命名的通知。
* `UF_DATAVAULT` 0x00000080：需要读取和写入的授权。
* `UF_HIDDEN` 0x00008000：提示不应在 GUI 中显示此项。
* `SF_SUPPORTED` 0x009f0000：超级用户支持的标志掩码。
* `SF_SETTABLE` 0x3fff0000：超级用户可更改的标志掩码。
* `SF_SYNTHETIC` 0xc0000000：系统只读合成标志的掩码。
* `SF_ARCHIVED` 0x00010000：文件已存档。
* `SF_IMMUTABLE` 0x00020000：文件不可更改。
* `SF_APPEND` 0x00040000：只能追加写入文件。
* `SF_RESTRICTED` 0x00080000：需要写入的授权。
* `SF_NOUNLINK` 0x00100000：项目不可被移除、重命名或挂载。
* `SF_FIRMLINK` 0x00800000：文件是一个 firmlink。
* `SF_DATALESS` 0x40000000：文件是无数据对象。

### **文件 ACLs**

文件**ACLs** 包含**ACE**（访问控制条目），可以为不同用户分配更**精细的权限**。

可以授予**目录**这些权限：`list`、`search`、`add_file`、`add_subdirectory`、`delete_child`、`delete_child`。\
对于**文件**：`read`、`write`、`append`、`execute`。

当文件包含 ACLs 时，您将在列出权限时**找到一个 "+"**，如下所示：

```bash
ls -ld Movies
drwx------+   7 username  staff     224 15 Apr 19:42 Movies
```

您可以使用以下命令**读取文件的 ACL**：

```bash
ls -lde Movies
drwx------+ 7 username  staff  224 15 Apr 19:42 Movies
0: group:everyone deny delete
```

您可以使用以下命令查找**所有具有ACL的文件**（这非常慢）：

```bash
ls -RAle / 2>/dev/null | grep -E -B1 "\d: "
```

### 扩展属性

扩展属性具有名称和任何所需值，可以使用 `ls -@` 查看，并使用 `xattr` 命令进行操作。一些常见的扩展属性包括：

* `com.apple.resourceFork`: 资源叉兼容性。也可在 `filename/..namedfork/rsrc` 中看到
* `com.apple.quarantine`: MacOS: Gatekeeper 隔离机制 (III/6)
* `metadata:*`: MacOS: 各种元数据，如 `_backup_excludeItem` 或 `kMD*`
* `com.apple.lastuseddate` (#PS): 最后使用日期
* `com.apple.FinderInfo`: MacOS: Finder 信息（例如，颜色标签）
* `com.apple.TextEncoding`: 指定 ASCII 文本文件的文本编码
* `com.apple.logd.metadata`: 由位于 `/var/db/diagnostics` 中的 logd 使用的文件
* `com.apple.genstore.*`: 生成存储 (`/.DocumentRevisions-V100` 在文件系统根目录中)
* `com.apple.rootless`: MacOS: 由系统完整性保护用于标记文件 (III/10)
* `com.apple.uuidb.boot-uuid`: 具有唯一 UUID 的引导时期的 logd 标记
* `com.apple.decmpfs`: MacOS: 透明文件压缩 (II/7)
* `com.apple.cprotect`: \*OS: 每个文件的加密数据 (III/11)
* `com.apple.installd.*`: \*OS: installd 使用的元数据，例如 `installType`、`uniqueInstallID`

### 资源叉 | macOS ADS

这是在 MacOS 机器中获取**备用数据流**的一种方法。您可以通过将内容保存在名为 **com.apple.ResourceFork** 的扩展属性中的文件中，将其保存在 **file/..namedfork/rsrc** 中。

```bash
echo "Hello" > a.txt
echo "Hello Mac ADS" > a.txt/..namedfork/rsrc

xattr -l a.txt #Read extended attributes
com.apple.ResourceFork: Hello Mac ADS

ls -l a.txt #The file length is still q
-rw-r--r--@ 1 username  wheel  6 17 Jul 01:15 a.txt
```

您可以使用以下命令找到所有包含此扩展属性的文件：

{% code overflow="wrap" %}

```
```

{% endcode %}

```bash
find / -type f -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; printf "\n"}' | xargs -I {} xattr -lv {} | grep "com.apple.ResourceFork"
```

## decmpfs

扩展属性`com.apple.decmpfs`表示文件已加密存储，`ls -l`将报告**大小为0**，压缩数据位于此属性内。每当访问文件时，它将在内存中解密。

可以使用`ls -lO`查看此属性，因为压缩文件也会标记为标志`UF_COMPRESSED`。如果删除压缩文件，则使用`chflags nocompressed </path/to/file>`清除此标志，系统将不知道文件已压缩，因此无法解压缩和访问数据（系统会认为文件实际上是空的）。

工具afscexpand可用于强制解压缩文件。

## **通用二进制文件和** Mach-o 格式

Mac OS 二进制文件通常编译为**通用二进制文件**。**通用二进制文件**可以在同一文件中**支持多个架构**。

{% content-ref url="/pages/OGANwWv4F9Ru9i75GntB" %}
[macOS Universal binaries & Mach-O Format](/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md)
{% endcontent-ref %}

## macOS 内存转储

{% content-ref url="/pages/r8fQkVHeSjDFrUITs9Cg" %}
[macOS Memory Dumping](/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-memory-dumping.md)
{% endcontent-ref %}

## Mac OS 风险类别文件

目录`/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System`存储有关不同文件扩展名的**风险级别信息**。此目录将文件分类为不同的风险级别，影响 Safari 在下载后如何处理这些文件。各类别如下：

* **LSRiskCategorySafe**：此类别中的文件被认为是**完全安全**的。Safari 将在下载后自动打开这些文件。
* **LSRiskCategoryNeutral**：这些文件没有警告，并且**Safari 不会自动打开**它们。
* **LSRiskCategoryUnsafeExecutable**：此类别下的文件会**触发警告**，指示该文件是一个应用程序。这是一项安全措施，用于提醒用户。
* **LSRiskCategoryMayContainUnsafeExecutable**：此类别适用于可能包含可执行文件的文件，例如存档文件。除非 Safari 可以验证所有内容是安全或中立的，否则将**触发警告**。

## 日志文件

* **`$HOME/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**：包含有关下载文件的信息，如下载文件的 URL。
* **`/var/log/system.log`**：OSX 系统的主要日志。com.apple.syslogd.plist 负责执行系统日志记录（您可以通过在`launchctl list`中查找"com.apple.syslogd"来检查是否已禁用）。
* **`/private/var/log/asl/*.asl`**：这些是可能包含有趣信息的 Apple 系统日志。
* **`$HOME/Library/Preferences/com.apple.recentitems.plist`**：存储通过“Finder”最近访问的文件和应用程序。
* **`$HOME/Library/Preferences/com.apple.loginitems.plsit`**：存储系统启动时要启动的项目。
* **`$HOME/Library/Logs/DiskUtility.log`**：DiskUtility 应用程序的日志文件（包含有关驱动器的信息，包括 USB 设备）。
* **`/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist`**：关于无线访问点的数据。
* **`/private/var/db/launchd.db/com.apple.launchd/overrides.plist`**：已停用的守护进程列表。
