
Apple MacOS Bildschirmfreigabe: Beliebiges Lesen/Schreiben von Dateien -> RCE
Zum ersten Mal seit einer Weile haben wir wieder eine RCE auf MacOS.
Ursprünglich entdeckt von @osxreverser und später von bynar.io erweitert. Weitere Informationen findest du unter https://blog.calif.io/p/no-country-for-old-passwords.
Dies stammt größtenteils aus der Arbeit von @panchocosil (na ja, Claude...), der einen Read-only-PoC veröffentlicht hat. Das Repo von @HORKimhab scheint etwas Bullshit zu sein, vor allem weil get-svn.sh wie ein Versuch eines späteren Supply-Chain-Angriffs aussieht.
Wie auch immer, ich habe das Schreiben zum Laufen gebracht und daraus RCE.
usage: exploit.py [-h] [-w LOCAL] [-m MODE] [-p PORT] [-u USER] [-r RETRIES] [-t TIMEOUT] [-o FILE] ip [path]
-o kann die gelesene Datei in eine lokale Datei geschrieben werden. Nützlich für Binärdateien.-w zum Schreiben einer lokalen Datei nach [path].Teilweise möglich. Unter MacOS gibt das Lesen eines Verzeichnisses (statt einer Datei) die rohen Inhalte des Verzeichnisses aus (jede Datei darin). Dass man keine Dateien auflisten kann, ist also kein Problem.
Also zuerst ein wenig Aufklärung. Mit python3 exploit.py <ip_addr> /Library/Preferences/com.apple.loginwindow.plist erhältst du den Benutzernamen der angemeldeten Benutzer. Dann kannst du /User/<username>/.ssh/ lesen und hoffen, dass SSH ebenfalls aktiviert ist (Normalerweise ist SSH aktiviert, wenn VNC aktiviert ist).
Da das Lesen als root erfolgt und TCC ignoriert (soweit ich das verstehe), kann man einfach Browserverläufe und (vielleicht?) Cookies direkt auslesen. Normalerweise reicht das aus.
In jedem Fall kannst du nach /Library/LaunchDaemons/ schreiben und auf einen Neustart warten. Dann hast du Persistenz. Aber natürlich sind wir ungeduldig, also gibt es bessere Wege.
Oft gibt es vorhandene Einträge, die du überschreiben kannst. Zum Beispiel sind /Library/PrivilegedHelperTools/com.microsoft.autoupdate.helper, us.zoom.ZoomDaemon und com.microsoft.teams.TeamsUpdaterDaemon häufig installiert.
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AbandonProcessGroup</key>
<true/>
<key>Label</key>
<string>com.microsoft.EdgeUpdater.wake.system</string>
<key>LimitLoadToSessionType</key>
<string>System</string>
<key>ProgramArguments</key>
<array>
<string>/Library/Application Support/Microsoft/EdgeUpdater/Current/EdgeUpdater.app/Contents/MacOS/EdgeUpdater</string>
<string>--wake-all</string>
<string>--enable-logging</string>
<string>--vmodule=*/components/update_client/*=2,*/chrome/updater/*=2</string>
<string>--system</string>
</array>
<key>StartInterval</key>
<integer>3600</integer>
</dict>
</plist>
Wenn wir uns das ansehen, sehen wir, dass die Binärdatei unter /Library/Application Support/Microsoft/EdgeUpdater/Current/EdgeUpdater.app/Contents/MacOS/EdgeUpdater in einem festgelegten Intervall ausgeführt wird.
Wir können diese Binärdatei dann ersetzen und haben sogar ohne uns mit launchctl herumschlagen zu müssen RCE!
Lustige Sache.