
Apple MacOS Screen Sharing: lectura/escritura arbitraria de archivos -> RCE
Por primera vez en mucho tiempo, tenemos un RCE en MacOS.
Descubierto originalmente por @osxreverser, y posteriormente ampliado por bynar.io. Ver https://blog.calif.io/p/no-country-for-old-passwords para más información.
Esto se deriva principalmente del trabajo de @panchocosil (bueno, de Claude...), que publicó un PoC de solo lectura. El repositorio de @HORKimhab parece ser un poco falso, especialmente porque get-svn.sh parece un intento de ataque a la cadena de suministro posterior.
De todos modos, logré que la escritura funcionara y, a partir de eso, RCE.
usage: exploit.py [-h] [-w LOCAL] [-m MODE] [-p PORT] [-u USER] [-r RETRIES] [-t TIMEOUT] [-o FILE] ip [path]
-o para escribir el archivo leído en un archivo local. Útil para binarios-w para escribir un archivo local en [path].Algo posible. En MacOS, ejecutar read sobre un directorio (en lugar de un archivo), vuelca el contenido crudo del directorio (todos los archivos que contiene). Así que no poder listar archivos no es un problema.
Así que primero un poco de reconocimiento. python3 exploit.py <ip_addr> /Library/Preferences/com.apple.loginwindow.plist te da el nombre de usuario de los usuarios con sesión iniciada. Luego, puedes leer /User/<username>/.ssh/ y esperar que quizás ssh también esté habilitado (normalmente cuando VNC lo está, SSH también).
Dado que la lectura se hace desde root e ignora TCC (por lo que tengo entendido), puedes directamente volcar los historiales del navegador y (¿quizás?) las cookies. Normalmente eso es suficiente.
En todos los casos, puedes escribir en /Library/LaunchDaemons/ y esperar a un reinicio. Entonces tendrás persistencia. Pero, por supuesto, somos impacientes, así que hay mejores formas.
A menudo habrá registros existentes que puedes sobrescribir. Por ejemplo, /Library/PrivilegedHelperTools/com.microsoft.autoupdate.helper, us.zoom.ZoomDaemon y com.microsoft.teams.TeamsUpdaterDaemon se ven comúnmente instalados.
<!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>
Mirando esto, podemos ver que el binario en /Library/Application Support/Microsoft/EdgeUpdater/Current/EdgeUpdater.app/Contents/MacOS/EdgeUpdater se ejecuta en un intervalo determinado.
Entonces podemos reemplazar ese binario y, incluso sin tener que lidiar con launchctl, ¡tenemos RCE!
Cosas divertidas.