macOS Auto Start
Dieser Abschnitt basiert stark auf der Blogreihe Beyond the good ol' LaunchAgents, das Ziel ist es, mehr Autostart-Standorte hinzuzufügen (wenn möglich), anzugeben, welche Techniken heutzutage mit der neuesten Version von macOS (13.4) noch funktionieren und die erforderlichen Berechtigungen zu spezifizieren.
Sandbox Bypass
Hier findest du Startorte, die nützlich für Sandbox-Bypasses sind, die es dir ermöglichen, einfach etwas auszuführen, indem du es in eine Datei schreibst und wartest auf eine sehr häufige Aktion, eine bestimmte Zeitspanne oder eine Aktion, die du normalerweise innerhalb einer Sandbox ohne Root-Berechtigungen ausführen kannst.
Launchd
Standorte
/Library/LaunchAgents
Auslöser: Neustart
Root erforderlich
/Library/LaunchDaemons
Auslöser: Neustart
Root erforderlich
/System/Library/LaunchAgents
Auslöser: Neustart
Root erforderlich
/System/Library/LaunchDaemons
Auslöser: Neustart
Root erforderlich
~/Library/LaunchAgents
Auslöser: Neu anmelden
~/Library/LaunchDemons
Auslöser: Neu anmelden
Als interessantes Faktum hat launchd
eine eingebettete Property-Liste im Mach-o-Bereich __Text.__config
, die andere bekannte Dienste enthält, die launchd starten muss. Darüber hinaus können diese Dienste die RequireSuccess
, RequireRun
und RebootOnSuccess
enthalten, was bedeutet, dass sie ausgeführt und erfolgreich abgeschlossen werden müssen.
Natürlich kann es aufgrund der Code-Signierung nicht geändert werden.
Beschreibung & Ausnutzung
launchd
ist der erste Prozess, der vom OX S-Kernel beim Start ausgeführt wird, und der letzte, der beim Herunterfahren endet. Es sollte immer die PID 1 haben. Dieser Prozess wird die Konfigurationen lesen und ausführen, die in den ASEP Plists in:
/Library/LaunchAgents
: Benutzeragenten, die vom Administrator installiert wurden/Library/LaunchDaemons
: Systemweite Daemons, die vom Administrator installiert wurden/System/Library/LaunchAgents
: Benutzeragenten, die von Apple bereitgestellt werden./System/Library/LaunchDaemons
: Systemweite Daemons, die von Apple bereitgestellt werden.
Wenn sich ein Benutzer anmeldet, werden die Plists, die sich in /Users/$USER/Library/LaunchAgents
und /Users/$USER/Library/LaunchDemons
befinden, mit den Berechtigungen des angemeldeten Benutzers gestartet.
Der Hauptunterschied zwischen Agenten und Daemons besteht darin, dass Agenten geladen werden, wenn sich der Benutzer anmeldet, und die Daemons beim Systemstart geladen werden (da es Dienste wie ssh gibt, die ausgeführt werden müssen, bevor ein Benutzer auf das System zugreift). Außerdem können Agenten eine GUI verwenden, während Daemons im Hintergrund laufen müssen.
Es gibt Fälle, in denen ein Agent vor der Benutzeranmeldung ausgeführt werden muss, diese werden PreLoginAgents genannt. Zum Beispiel ist dies nützlich, um unterstützende Technologien bei der Anmeldung bereitzustellen. Sie sind auch in /Library/LaunchAgents
zu finden (siehe hier ein Beispiel).
Neue Daemons oder Agenten-Konfigurationsdateien werden nach dem nächsten Neustart oder mit launchctl load <target.plist>
geladen. Es ist auch möglich, .plist-Dateien ohne diese Erweiterung mit launchctl -F <file>
zu laden (jedoch werden diese plist-Dateien nach dem Neustart nicht automatisch geladen).
Es ist auch möglich, mit launchctl unload <target.plist>
zu entladen (der Prozess, auf den verwiesen wird, wird beendet),
Um sicherzustellen, dass es nichts (wie eine Überschreibung) gibt, das einen Agenten oder Daemon daran hindert, auszuführen, führen Sie aus: sudo launchctl load -w /System/Library/LaunchDaemos/com.apple.smdb.plist
Liste aller Agenten und Daemons, die vom aktuellen Benutzer geladen sind:
Wenn eine plist einem Benutzer gehört, wird die Aufgabe als der Benutzer und nicht als root ausgeführt, selbst wenn sie sich in systemweiten Daemon-Ordnern befindet. Dies kann einige Privilegieneskalationsangriffe verhindern.
Weitere Informationen zu launchd
launchd
ist der erste Benutzerprozess, der vom Kernel gestartet wird. Der Prozessstart muss erfolgreich sein und er darf nicht beendet oder abstürzen. Er ist sogar gegen einige Kill-Signale geschützt.
Eine der ersten Aufgaben von launchd
ist es, alle Daemons wie folgt zu starten:
Timer-Daemons, die basierend auf der Zeit ausgeführt werden:
atd (
com.apple.atrun.plist
): Hat einStartInterval
von 30 Minutencrond (
com.apple.systemstats.daily.plist
): HatStartCalendarInterval
, um um 00:15 zu startenNetzwerk-Daemons wie:
org.cups.cups-lpd
: Lauscht in TCP (SockType: stream
) mitSockServiceName: printer
SockServiceName muss entweder ein Port oder ein Dienst aus
/etc/services
seincom.apple.xscertd.plist
: Lauscht in TCP auf Port 1640Path-Daemons, die ausgeführt werden, wenn sich ein bestimmter Pfad ändert:
com.apple.postfix.master
: Überprüft den Pfad/etc/postfix/aliases
IOKit-Benachrichtigungs-Daemons:
com.apple.xartstorageremoted
:"com.apple.iokit.matching" => { "com.apple.device-attach" => { "IOMatchLaunchStream" => 1 ...
Mach-Port:
com.apple.xscertd-helper.plist
: Gibt imMachServices
-Eintrag den Namencom.apple.xscertd.helper
anUserEventAgent:
Dies unterscheidet sich von dem vorherigen. Es lässt launchd Apps als Reaktion auf spezifische Ereignisse starten. In diesem Fall ist jedoch die Haupt-Binärdatei nicht
launchd
, sondern/usr/libexec/UserEventAgent
. Es lädt Plugins aus dem SIP-eingeschränkten Ordner /System/Library/UserEventPlugins/, wo jedes Plugin seinen Initialisierer im SchlüsselXPCEventModuleInitializer
angibt oder im Fall älterer Plugins imCFPluginFactories
-Dict unter dem SchlüsselFB86416D-6164-2070-726F-70735C216EC0
seinerInfo.plist
.
Shell-Startdateien
Writeup: https://theevilbit.github.io/beyond/beyond_0001/ Writeup (xterm): https://theevilbit.github.io/beyond/beyond_0018/
Nützlich, um die Sandbox zu umgehen: ✅
TCC-Umgehung: ✅
Aber Sie müssen eine App mit einer TCC-Umgehung finden, die eine Shell ausführt, die diese Dateien lädt
Standorte
~/.zshrc
,~/.zlogin
,~/.zshenv.zwc
,~/.zshenv
,~/.zprofile
Auslöser: Öffnen Sie ein Terminal mit zsh
/etc/zshenv
,/etc/zprofile
,/etc/zshrc
,/etc/zlogin
Auslöser: Öffnen Sie ein Terminal mit zsh
Root erforderlich
~/.zlogout
Auslöser: Beenden Sie ein Terminal mit zsh
/etc/zlogout
Auslöser: Beenden Sie ein Terminal mit zsh
Root erforderlich
Möglicherweise mehr in:
man zsh
~/.bashrc
Auslöser: Öffnen Sie ein Terminal mit bash
/etc/profile
(funktionierte nicht)~/.profile
(funktionierte nicht)~/.xinitrc
,~/.xserverrc
,/opt/X11/etc/X11/xinit/xinitrc.d/
Auslöser: Erwartet, dass es mit xterm ausgelöst wird, aber es ist nicht installiert und selbst nach der Installation wird dieser Fehler ausgegeben: xterm:
DISPLAY is not set
Beschreibung & Ausnutzung
Beim Initiieren einer Shell-Umgebung wie zsh
oder bash
werden bestimmte Startdateien ausgeführt. macOS verwendet derzeit /bin/zsh
als Standard-Shell. Diese Shell wird automatisch aufgerufen, wenn die Terminal-Anwendung gestartet wird oder wenn ein Gerät über SSH zugegriffen wird. Während bash
und sh
ebenfalls in macOS vorhanden sind, müssen sie explizit aufgerufen werden, um verwendet zu werden.
Die Man-Seite von zsh, die wir mit man zsh
lesen können, hat eine lange Beschreibung der Startdateien.
Wiedereröffnete Anwendungen
Die Konfiguration der angegebenen Ausnutzung und das Ab- und Anmelden oder sogar das Neustarten haben bei mir nicht funktioniert, um die App auszuführen. (Die App wurde nicht ausgeführt, vielleicht muss sie laufen, wenn diese Aktionen durchgeführt werden)
Writeup: https://theevilbit.github.io/beyond/beyond_0021/
Standort
~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
Auslöser: Neustart von wiedereröffnenden Anwendungen
Beschreibung & Ausnutzung
Alle Anwendungen, die wiedereröffnet werden sollen, befinden sich in der plist ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
Um die wiedereröffnenden Anwendungen dazu zu bringen, Ihre eigene zu starten, müssen Sie einfach Ihre App zur Liste hinzufügen.
Die UUID kann durch Auflisten dieses Verzeichnisses oder mit ioreg -rd1 -c IOPlatformExpertDevice | awk -F'"' '/IOPlatformUUID/{print $4}'
gefunden werden.
Um die Anwendungen zu überprüfen, die wiedereröffnet werden, können Sie Folgendes tun:
Um eine Anwendung zu dieser Liste hinzuzufügen, können Sie Folgendes verwenden:
Terminal-Einstellungen
Nützlich, um Sandbox zu umgehen: ✅
TCC-Umgehung: ✅
Terminal verwendet die FDA-Berechtigungen des Benutzers, der es verwendet
Standort
~/Library/Preferences/com.apple.Terminal.plist
Auslöser: Terminal öffnen
Beschreibung & Ausnutzung
In ~/Library/Preferences
werden die Einstellungen des Benutzers in den Anwendungen gespeichert. Einige dieser Einstellungen können eine Konfiguration enthalten, um andere Anwendungen/Skripte auszuführen.
Zum Beispiel kann das Terminal einen Befehl beim Start ausführen:
Diese Konfiguration wird in der Datei ~/Library/Preferences/com.apple.Terminal.plist
wie folgt reflektiert:
Also, wenn die plist der Einstellungen des Terminals im System überschrieben werden könnte, kann die open
-Funktionalität verwendet werden, um das Terminal zu öffnen und dieser Befehl wird ausgeführt.
Sie können dies über die CLI hinzufügen mit:
Terminal-Skripte / Andere Dateierweiterungen
Nützlich, um die Sandbox zu umgehen: ✅
TCC-Umgehung: ✅
Terminal wird verwendet, um FDA-Berechtigungen des Benutzers zu nutzen
Standort
Überall
Auslöser: Terminal öffnen
Beschreibung & Ausnutzung
Wenn Sie ein .terminal
-Skript erstellen und öffnen, wird die Terminal-Anwendung automatisch aufgerufen, um die dort angegebenen Befehle auszuführen. Wenn die Terminal-App über besondere Berechtigungen verfügt (wie TCC), wird Ihr Befehl mit diesen besonderen Berechtigungen ausgeführt.
Versuchen Sie es mit:
Sie können auch die Erweiterungen .command
, .tool
verwenden, mit regulärem Shell-Skriptinhalt, und sie werden ebenfalls von Terminal geöffnet.
Wenn das Terminal Vollzugriff auf das Laufwerk hat, kann es diese Aktion ausführen (beachten Sie, dass der ausgeführte Befehl in einem Terminalfenster sichtbar sein wird).
Audio-Plugins
Writeup: https://theevilbit.github.io/beyond/beyond_0013/ Writeup: https://posts.specterops.io/audio-unit-plug-ins-896d3434a882
Standort
/Library/Audio/Plug-Ins/HAL
Root erforderlich
Trigger: Coreaudiod oder den Computer neu starten
/Library/Audio/Plug-ins/Components
Root erforderlich
Trigger: Coreaudiod oder den Computer neu starten
~/Library/Audio/Plug-ins/Components
Trigger: Coreaudiod oder den Computer neu starten
/System/Library/Components
Root erforderlich
Trigger: Coreaudiod oder den Computer neu starten
Beschreibung
Laut den vorherigen Writeups ist es möglich, einige Audio-Plugins zu kompilieren und sie zu laden.
QuickLook-Plugins
Writeup: https://theevilbit.github.io/beyond/beyond_0028/
Standort
/System/Library/QuickLook
/Library/QuickLook
~/Library/QuickLook
/Applications/AppNameHere/Contents/Library/QuickLook/
~/Applications/AppNameHere/Contents/Library/QuickLook/
Beschreibung & Ausnutzung
QuickLook-Plugins können ausgeführt werden, wenn Sie die Vorschau einer Datei auslösen (drücken Sie die Leertaste, während die Datei im Finder ausgewählt ist) und ein Plugin, das diesen Dateityp unterstützt, installiert ist.
Es ist möglich, Ihr eigenes QuickLook-Plugin zu kompilieren, es an einem der vorherigen Standorte zu platzieren, um es zu laden, und dann zu einer unterstützten Datei zu gehen und die Leertaste zu drücken, um es auszulösen.
Login/Logout-Hooks
Das hat bei mir nicht funktioniert, weder mit dem Benutzer-LoginHook noch mit dem Root-LogoutHook
Writeup: https://theevilbit.github.io/beyond/beyond_0022/
Standort
Sie müssen in der Lage sein, etwas wie
defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh
auszuführenLo
cated in~/Library/Preferences/com.apple.loginwindow.plist
Sie sind veraltet, können aber verwendet werden, um Befehle auszuführen, wenn sich ein Benutzer anmeldet.
Diese Einstellung wird in /Users/$USER/Library/Preferences/com.apple.loginwindow.plist
gespeichert.
Um es zu löschen:
Der Root-Benutzer wird in /private/var/root/Library/Preferences/com.apple.loginwindow.plist
gespeichert.
Bedingte Sandbox-Umgehung
Hier finden Sie Startorte, die nützlich für Sandbox-Umgehungen sind, die es Ihnen ermöglichen, etwas einfach auszuführen, indem Sie es in eine Datei schreiben und nicht sehr häufige Bedingungen wie spezifische installierte Programme, "ungewöhnliche" Benutzeraktionen oder Umgebungen erwarten.
Cron
Writeup: https://theevilbit.github.io/beyond/beyond_0004/
Nützlich zur Umgehung der Sandbox: ✅
Sie müssen jedoch in der Lage sein, die
crontab
-Binärdatei auszuführenOder Root sein
TCC-Umgehung: 🔴
Standort
/usr/lib/cron/tabs/
,/private/var/at/tabs
,/private/var/at/jobs
,/etc/periodic/
Root erforderlich für direkten Schreibzugriff. Kein Root erforderlich, wenn Sie
crontab <file>
ausführen könnenTrigger: Hängt vom Cron-Job ab
Beschreibung & Ausnutzung
Listen Sie die Cron-Jobs des aktuellen Benutzers mit auf:
Sie können auch alle Cron-Jobs der Benutzer in /usr/lib/cron/tabs/
und /var/at/tabs/
(benötigt Root) einsehen.
In MacOS finden sich mehrere Ordner, die Skripte mit bestimmter Häufigkeit ausführen:
Dort finden Sie die regulären cron jobs, die at jobs (nicht sehr häufig verwendet) und die periodic jobs (hauptsächlich zum Reinigen temporärer Dateien verwendet). Die täglichen periodischen Jobs können beispielsweise mit: periodic daily
ausgeführt werden.
Um programmgesteuert einen Benutzer-Cronjob hinzuzufügen, ist es möglich, Folgendes zu verwenden:
iTerm2
Writeup: https://theevilbit.github.io/beyond/beyond_0002/
Standorte
~/Library/Application Support/iTerm2/Scripts/AutoLaunch
Trigger: iTerm öffnen
~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt
Trigger: iTerm öffnen
~/Library/Preferences/com.googlecode.iterm2.plist
Trigger: iTerm öffnen
Beschreibung & Ausnutzung
Skripte, die in ~/Library/Application Support/iTerm2/Scripts/AutoLaunch
gespeichert sind, werden ausgeführt. Zum Beispiel:
oder:
Das Skript ~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt
wird ebenfalls ausgeführt:
Die iTerm2-Einstellungen, die sich in ~/Library/Preferences/com.googlecode.iterm2.plist
befinden, können einen auszuführenden Befehl angeben, wenn das iTerm2-Terminal geöffnet wird.
Diese Einstellung kann in den iTerm2-Einstellungen konfiguriert werden:
Und der Befehl wird in den Einstellungen angezeigt:
Sie können den auszuführenden Befehl mit folgendem festlegen:
Hochwahrscheinlich gibt es andere Möglichkeiten, die iTerm2-Einstellungen zu missbrauchen, um beliebige Befehle auszuführen.
xbar
Writeup: https://theevilbit.github.io/beyond/beyond_0007/
Nützlich, um die Sandbox zu umgehen: ✅
Aber xbar muss installiert sein
TCC-Umgehung: ✅
Es werden Zugriffsberechtigungen angefordert
Standort
~/Library/Application\ Support/xbar/plugins/
Auslöser: Sobald xbar ausgeführt wird
Beschreibung
Wenn das beliebte Programm xbar installiert ist, ist es möglich, ein Shell-Skript in ~/Library/Application\ Support/xbar/plugins/
zu schreiben, das ausgeführt wird, wenn xbar gestartet wird:
Hammerspoon
Writeup: https://theevilbit.github.io/beyond/beyond_0008/
Nützlich, um die Sandbox zu umgehen: ✅
Aber Hammerspoon muss installiert sein
TCC-Umgehung: ✅
Es fordert Zugriffsberechtigungen an
Location
~/.hammerspoon/init.lua
Trigger: Sobald Hammerspoon ausgeführt wird
Description
Hammerspoon dient als Automatisierungsplattform für macOS und nutzt die LUA-Skriptsprache für seine Operationen. Bemerkenswert ist, dass es die Integration von vollständigem AppleScript-Code und die Ausführung von Shell-Skripten unterstützt, was seine Skripting-Fähigkeiten erheblich verbessert.
Die App sucht nach einer einzelnen Datei, ~/.hammerspoon/init.lua
, und beim Start wird das Skript ausgeführt.
BetterTouchTool
Nützlich, um die Sandbox zu umgehen: ✅
Aber BetterTouchTool muss installiert sein
TCC-Umgehung: ✅
Es fordert Berechtigungen für Automatisierungs-Shortcuts und Barrierefreiheit an
Standort
~/Library/Application Support/BetterTouchTool/*
Dieses Tool ermöglicht es, Anwendungen oder Skripte anzugeben, die ausgeführt werden sollen, wenn bestimmte Shortcuts gedrückt werden. Ein Angreifer könnte in der Lage sein, seinen eigenen Shortcut und die auszuführende Aktion in der Datenbank zu konfigurieren, um beliebigen Code auszuführen (ein Shortcut könnte einfach das Drücken einer Taste sein).
Alfred
Nützlich, um die Sandbox zu umgehen: ✅
Aber Alfred muss installiert sein
TCC-Umgehung: ✅
Es fordert Berechtigungen für Automatisierung, Barrierefreiheit und sogar Vollzugriff auf die Festplatte an
Standort
???
Es ermöglicht die Erstellung von Workflows, die Code ausführen können, wenn bestimmte Bedingungen erfüllt sind. Potenziell ist es möglich, dass ein Angreifer eine Workflow-Datei erstellt und Alfred dazu bringt, sie zu laden (es ist erforderlich, die Premium-Version zu bezahlen, um Workflows zu verwenden).
SSHRC
Writeup: https://theevilbit.github.io/beyond/beyond_0006/
Nützlich, um die Sandbox zu umgehen: ✅
Aber ssh muss aktiviert und verwendet werden
TCC-Umgehung: ✅
SSH benötigt FDA-Zugriff
Standort
~/.ssh/rc
Trigger: Anmeldung über ssh
/etc/ssh/sshrc
Root erforderlich
Trigger: Anmeldung über ssh
Um ssh zu aktivieren, ist Voller Festplattzugriff erforderlich:
Beschreibung & Ausnutzung
Standardmäßig, es sei denn, PermitUserRC no
in /etc/ssh/sshd_config
, werden beim Login via SSH die Skripte /etc/ssh/sshrc
und ~/.ssh/rc
ausgeführt.
Anmeldeobjekte
Schreibweise: https://theevilbit.github.io/beyond/beyond_0003/
Nützlich, um die Sandbox zu umgehen: ✅
Aber du musst
osascript
mit Argumenten ausführenTCC-Umgehung: 🔴
Standorte
~/Library/Application Support/com.apple.backgroundtaskmanagementagent
Auslöser: Login
Exploit-Payload gespeichert, die
osascript
aufruft/var/db/com.apple.xpc.launchd/loginitems.501.plist
Auslöser: Login
Root erforderlich
Beschreibung
In den Systemeinstellungen -> Benutzer & Gruppen -> Anmeldeobjekte kannst du Objekte finden, die ausgeführt werden, wenn der Benutzer sich anmeldet. Es ist möglich, sie aufzulisten, hinzuzufügen und über die Befehlszeile zu entfernen:
Diese Elemente werden in der Datei ~/Library/Application Support/com.apple.backgroundtaskmanagementagent
gespeichert.
Anmeldeelemente können auch über die API SMLoginItemSetEnabled angezeigt werden, die die Konfiguration in /var/db/com.apple.xpc.launchd/loginitems.501.plist
speichert.
ZIP als Anmeldeelement
(Siehe vorherigen Abschnitt über Anmeldeelemente, dies ist eine Erweiterung)
Wenn Sie eine ZIP-Datei als Anmeldeelement speichern, wird das Archivierungsprogramm
es öffnen, und wenn die ZIP beispielsweise in ~/Library
gespeichert wurde und den Ordner LaunchAgents/file.plist
mit einem Backdoor enthielt, wird dieser Ordner erstellt (er ist standardmäßig nicht vorhanden) und die plist wird hinzugefügt, sodass beim nächsten Anmelden des Benutzers die im plist angegebene Backdoor ausgeführt wird.
Eine weitere Möglichkeit wäre, die Dateien .bash_profile
und .zshenv
im Benutzer-Home zu erstellen, sodass diese Technik weiterhin funktioniert, wenn der Ordner LaunchAgents bereits existiert.
At
Schriftliche Ausarbeitung: https://theevilbit.github.io/beyond/beyond_0014/
Nützlich, um die Sandbox zu umgehen: ✅
Aber Sie müssen
at
ausführen und es muss aktiviert sein.TCC-Umgehung: 🔴
Standort
Muss
at
ausführen und es muss aktiviert sein.
Beschreibung
at
-Aufgaben sind dafür ausgelegt, einmalige Aufgaben zu bestimmten Zeiten auszuführen. Im Gegensatz zu Cron-Jobs werden at
-Aufgaben nach der Ausführung automatisch entfernt. Es ist wichtig zu beachten, dass diese Aufgaben bei Systemneustarts persistent sind, was sie unter bestimmten Bedingungen zu potenziellen Sicherheitsbedenken macht.
Standardmäßig sind sie deaktiviert, aber der Root-Benutzer kann sie mit aktivieren:
Dies wird in 1 Stunde eine Datei erstellen:
Überprüfen Sie die Job-Warteschlange mit atq:
Über uns sehen wir zwei geplante Jobs. Wir können die Details des Jobs mit at -c JOBNUMBER
ausdrucken.