macOS Auto Start
Esta sección se basa en gran medida en la serie de blogs Beyond the good ol' LaunchAgents, el objetivo es agregar más ubicaciones de autoinicio (si es posible), indicar qué técnicas aún funcionan hoy en día con la última versión de macOS (13.4) y especificar los permisos necesarios.
Sandbox Bypass
Aquí puedes encontrar ubicaciones de inicio útiles para sandbox bypass que te permiten simplemente ejecutar algo escribiéndolo en un archivo y esperando una acción muy común, una cantidad determinada de tiempo o una acción que normalmente puedes realizar desde dentro de un sandbox sin necesidad de permisos de root.
Launchd
Ubicaciones
/Library/LaunchAgents
Disparador: Reinicio
Se requiere root
/Library/LaunchDaemons
Disparador: Reinicio
Se requiere root
/System/Library/LaunchAgents
Disparador: Reinicio
Se requiere root
/System/Library/LaunchDaemons
Disparador: Reinicio
Se requiere root
~/Library/LaunchAgents
Disparador: Reingreso
~/Library/LaunchDemons
Disparador: Reingreso
Como dato interesante, launchd
tiene una lista de propiedades incrustada en la sección Mach-o __Text.__config
que contiene otros servicios bien conocidos que launchd debe iniciar. Además, estos servicios pueden contener RequireSuccess
, RequireRun
y RebootOnSuccess
, lo que significa que deben ejecutarse y completarse con éxito.
Por supuesto, no se puede modificar debido a la firma de código.
Descripción y Explotación
launchd
es el primer proceso ejecutado por el kernel de OX S al inicio y el último en finalizar al apagarse. Siempre debe tener el PID 1. Este proceso leerá y ejecutará las configuraciones indicadas en los plists de ASEP en:
/Library/LaunchAgents
: Agentes por usuario instalados por el administrador/Library/LaunchDaemons
: Daemons a nivel de sistema instalados por el administrador/System/Library/LaunchAgents
: Agentes por usuario proporcionados por Apple./System/Library/LaunchDaemons
: Daemons a nivel de sistema proporcionados por Apple.
Cuando un usuario inicia sesión, los plists ubicados en /Users/$USER/Library/LaunchAgents
y /Users/$USER/Library/LaunchDemons
se inician con los permisos del usuario conectado.
La principal diferencia entre agentes y daemons es que los agentes se cargan cuando el usuario inicia sesión y los daemons se cargan al inicio del sistema (ya que hay servicios como ssh que necesitan ejecutarse antes de que cualquier usuario acceda al sistema). Además, los agentes pueden usar GUI mientras que los daemons necesitan ejecutarse en segundo plano.
Hay casos en los que un agente necesita ser ejecutado antes de que el usuario inicie sesión, estos se llaman PreLoginAgents. Por ejemplo, esto es útil para proporcionar tecnología asistencial al iniciar sesión. También se pueden encontrar en /Library/LaunchAgents
(ver aquí un ejemplo).
Los nuevos archivos de configuración de Daemons o Agents serán cargados después del próximo reinicio o usando launchctl load <target.plist>
También es posible cargar archivos .plist sin esa extensión con launchctl -F <file>
(sin embargo, esos archivos plist no se cargarán automáticamente después del reinicio).
También es posible descargar con launchctl unload <target.plist>
(el proceso señalado por él será terminado),
Para asegurar que no haya nada (como una anulación) impidiendo que un Agente o Daemon se ejecute, ejecuta: sudo launchctl load -w /System/Library/LaunchDaemos/com.apple.smdb.plist
Lista todos los agentes y daemons cargados por el usuario actual:
Si un plist es propiedad de un usuario, incluso si está en carpetas de sistema de demonios, la tarea se ejecutará como el usuario y no como root. Esto puede prevenir algunos ataques de escalada de privilegios.
Más información sobre launchd
launchd
es el primer proceso en modo usuario que se inicia desde el núcleo. El inicio del proceso debe ser exitoso y no puede salir ni fallar. Está incluso protegido contra algunas señales de terminación.
Una de las primeras cosas que haría launchd
es iniciar todos los demonios como:
Demonios de temporizador basados en el tiempo para ser ejecutados:
atd (
com.apple.atrun.plist
): Tiene unStartInterval
de 30mincrond (
com.apple.systemstats.daily.plist
): TieneStartCalendarInterval
para iniciar a las 00:15Demonios de red como:
org.cups.cups-lpd
: Escucha en TCP (SockType: stream
) conSockServiceName: printer
SockServiceName debe ser un puerto o un servicio de
/etc/services
com.apple.xscertd.plist
: Escucha en TCP en el puerto 1640Demonios de ruta que se ejecutan cuando cambia una ruta especificada:
com.apple.postfix.master
: Verificando la ruta/etc/postfix/aliases
Demonios de notificaciones de IOKit:
com.apple.xartstorageremoted
:"com.apple.iokit.matching" => { "com.apple.device-attach" => { "IOMatchLaunchStream" => 1 ...
Puerto Mach:
com.apple.xscertd-helper.plist
: Indica en la entradaMachServices
el nombrecom.apple.xscertd.helper
UserEventAgent:
Esto es diferente del anterior. Hace que launchd inicie aplicaciones en respuesta a eventos específicos. Sin embargo, en este caso, el binario principal involucrado no es
launchd
sino/usr/libexec/UserEventAgent
. Carga plugins de la carpeta restringida por SIP /System/Library/UserEventPlugins/ donde cada plugin indica su inicializador en la claveXPCEventModuleInitializer
o, en el caso de plugins más antiguos, en el diccionarioCFPluginFactories
bajo la claveFB86416D-6164-2070-726F-70735C216EC0
de suInfo.plist
.
archivos de inicio de shell
Escritura: https://theevilbit.github.io/beyond/beyond_0001/ Escritura (xterm): https://theevilbit.github.io/beyond/beyond_0018/
Útil para eludir sandbox: ✅
Bypass de TCC: ✅
Pero necesitas encontrar una aplicación con un bypass de TCC que ejecute un shell que cargue estos archivos
Ubicaciones
~/.zshrc
,~/.zlogin
,~/.zshenv.zwc
,~/.zshenv
,~/.zprofile
Disparador: Abrir un terminal con zsh
/etc/zshenv
,/etc/zprofile
,/etc/zshrc
,/etc/zlogin
Disparador: Abrir un terminal con zsh
Se requiere root
~/.zlogout
Disparador: Salir de un terminal con zsh
/etc/zlogout
Disparador: Salir de un terminal con zsh
Se requiere root
Potencialmente más en:
man zsh
~/.bashrc
Disparador: Abrir un terminal con bash
/etc/profile
(no funcionó)~/.profile
(no funcionó)~/.xinitrc
,~/.xserverrc
,/opt/X11/etc/X11/xinit/xinitrc.d/
Disparador: Se espera que se active con xterm, pero no está instalado y incluso después de instalarlo se lanza este error: xterm:
DISPLAY is not set
Descripción y explotación
Al iniciar un entorno de shell como zsh
o bash
, se ejecutan ciertos archivos de inicio. macOS actualmente utiliza /bin/zsh
como el shell predeterminado. Este shell se accede automáticamente cuando se lanza la aplicación Terminal o cuando se accede a un dispositivo a través de SSH. Aunque bash
y sh
también están presentes en macOS, deben ser invocados explícitamente para ser utilizados.
La página del manual de zsh, que podemos leer con man zsh
, tiene una larga descripción de los archivos de inicio.
Aplicaciones Reabiertas
Configurar la explotación indicada y cerrar sesión e iniciar sesión o incluso reiniciar no funcionó para mí para ejecutar la aplicación. (La aplicación no se estaba ejecutando, tal vez necesita estar en funcionamiento cuando se realizan estas acciones)
Escritura: https://theevilbit.github.io/beyond/beyond_0021/
Ubicación
~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
Disparador: Reiniciar reabriendo aplicaciones
Descripción y Explotación
Todas las aplicaciones para reabrir están dentro del plist ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
Así que, para hacer que las aplicaciones reabiertas lancen la tuya, solo necesitas agregar tu aplicación a la lista.
El UUID se puede encontrar listando ese directorio o con ioreg -rd1 -c IOPlatformExpertDevice | awk -F'"' '/IOPlatformUUID/{print $4}'
Para verificar las aplicaciones que se volverán a abrir puedes hacer:
Para agregar una aplicación a esta lista puedes usar:
Preferencias del Terminal
Útil para eludir sandbox: ✅
Eludir TCC: ✅
El uso del Terminal tiene permisos de FDA del usuario que lo utiliza
Ubicación
~/Library/Preferences/com.apple.Terminal.plist
Disparador: Abrir Terminal
Descripción y Explotación
En ~/Library/Preferences
se almacenan las preferencias del usuario en las Aplicaciones. Algunas de estas preferencias pueden contener una configuración para ejecutar otras aplicaciones/scripts.
Por ejemplo, el Terminal puede ejecutar un comando en el Inicio:
Esta configuración se refleja en el archivo ~/Library/Preferences/com.apple.Terminal.plist
de la siguiente manera:
Así que, si el plist de las preferencias del terminal en el sistema pudiera ser sobrescrito, entonces la funcionalidad open
puede ser utilizada para abrir el terminal y ese comando será ejecutado.
Puedes agregar esto desde la línea de comandos con:
Scripts de Terminal / Otras extensiones de archivo
Útil para eludir el sandbox: ✅
Eludir TCC: ✅
Uso de Terminal para tener permisos de FDA del usuario que lo utiliza
Ubicación
Cualquier lugar
Disparador: Abrir Terminal
Descripción y Explotación
Si creas un .terminal
script y lo abres, la aplicación Terminal se invocará automáticamente para ejecutar los comandos indicados allí. Si la aplicación Terminal tiene algunos privilegios especiales (como TCC), tu comando se ejecutará con esos privilegios especiales.
Inténtalo con:
Podrías también usar las extensiones .command
, `.tool, con contenido de scripts de shell regulares y también se abrirán en Terminal.
Si Terminal tiene Acceso Completo al Disco, podrá completar esa acción (ten en cuenta que el comando ejecutado será visible en una ventana de terminal).
Plugins de Audio
Escritura: https://theevilbit.github.io/beyond/beyond_0013/ Escritura: https://posts.specterops.io/audio-unit-plug-ins-896d3434a882
Ubicación
/Library/Audio/Plug-Ins/HAL
Se requiere root
Disparador: Reiniciar coreaudiod o el ordenador
/Library/Audio/Plug-ins/Components
Se requiere root
Disparador: Reiniciar coreaudiod o el ordenador
~/Library/Audio/Plug-ins/Components
Disparador: Reiniciar coreaudiod o el ordenador
/System/Library/Components
Se requiere root
Disparador: Reiniciar coreaudiod o el ordenador
Descripción
Según las escrituras anteriores, es posible compilar algunos plugins de audio y hacer que se carguen.
Plugins de QuickLook
Escritura: https://theevilbit.github.io/beyond/beyond_0028/
Ubicación
/System/Library/QuickLook
/Library/QuickLook
~/Library/QuickLook
/Applications/AppNameHere/Contents/Library/QuickLook/
~/Applications/AppNameHere/Contents/Library/QuickLook/
Descripción y Explotación
Los plugins de QuickLook pueden ejecutarse cuando activas la vista previa de un archivo (presiona la barra espaciadora con el archivo seleccionado en Finder) y un plugin que soporte ese tipo de archivo está instalado.
Es posible compilar tu propio plugin de QuickLook, colocarlo en una de las ubicaciones anteriores para cargarlo y luego ir a un archivo soportado y presionar espacio para activarlo.
Hooks de Inicio/Cierre de Sesión
Esto no funcionó para mí, ni con el LoginHook del usuario ni con el LogoutHook de root
Escritura: https://theevilbit.github.io/beyond/beyond_0022/
Ubicación
Necesitas poder ejecutar algo como
defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh
Ub
icado en~/Library/Preferences/com.apple.loginwindow.plist
Están obsoletos, pero se pueden usar para ejecutar comandos cuando un usuario inicia sesión.
Esta configuración se almacena en /Users/$USER/Library/Preferences/com.apple.loginwindow.plist
Para eliminarlo:
El usuario root se almacena en /private/var/root/Library/Preferences/com.apple.loginwindow.plist
Bypass de Sandbox Condicional
Aquí puedes encontrar ubicaciones de inicio útiles para bypass de sandbox que te permiten simplemente ejecutar algo escribiéndolo en un archivo y esperando condiciones no muy comunes como programas específicos instalados, acciones de usuario "poco comunes" o entornos.
Cron
Escritura: https://theevilbit.github.io/beyond/beyond_0004/
Útil para el bypass de sandbox: ✅
Sin embargo, necesitas poder ejecutar el binario
crontab
O ser root
Bypass de TCC: 🔴
Ubicación
/usr/lib/cron/tabs/
,/private/var/at/tabs
,/private/var/at/jobs
,/etc/periodic/
Se requiere root para acceso de escritura directo. No se requiere root si puedes ejecutar
crontab <file>
Disparador: Depende del trabajo cron
Descripción y Explotación
Lista los trabajos cron del usuario actual con:
Puedes ver también todos los trabajos cron de los usuarios en /usr/lib/cron/tabs/
y /var/at/tabs/
(necesita root).
En MacOS se pueden encontrar varias carpetas que ejecutan scripts con cierta frecuencia en:
Ahí puedes encontrar los cron jobs regulares, los at jobs (no muy utilizados) y los periodic jobs (principalmente utilizados para limpiar archivos temporales). Los trabajos periódicos diarios se pueden ejecutar, por ejemplo, con: periodic daily
.
Para agregar un user cronjob programatically es posible usar:
iTerm2
Writeup: https://theevilbit.github.io/beyond/beyond_0002/
Locations
~/Library/Application Support/iTerm2/Scripts/AutoLaunch
Trigger: Abrir iTerm
~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt
Trigger: Abrir iTerm
~/Library/Preferences/com.googlecode.iterm2.plist
Trigger: Abrir iTerm
Description & Exploitation
Los scripts almacenados en ~/Library/Application Support/iTerm2/Scripts/AutoLaunch
se ejecutarán. Por ejemplo:
o:
El script ~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt
también se ejecutará:
Las preferencias de iTerm2 ubicadas en ~/Library/Preferences/com.googlecode.iterm2.plist
pueden indicar un comando a ejecutar cuando se abre el terminal iTerm2.
Esta configuración se puede configurar en la configuración de iTerm2:
Y el comando se refleja en las preferencias:
Puedes establecer el comando a ejecutar con:
Altamente probable que haya otras formas de abusar de las preferencias de iTerm2 para ejecutar comandos arbitrarios.
xbar
Escritura: https://theevilbit.github.io/beyond/beyond_0007/
Útil para eludir el sandbox: ✅
Pero xbar debe estar instalado
Bypass de TCC: ✅
Solicita permisos de Accesibilidad
Ubicación
~/Library/Application\ Support/xbar/plugins/
Disparador: Una vez que se ejecute xbar
Descripción
Si el popular programa xbar está instalado, es posible escribir un script de shell en ~/Library/Application\ Support/xbar/plugins/
que se ejecutará cuando se inicie xbar:
Hammerspoon
Escritura: https://theevilbit.github.io/beyond/beyond_0008/
Útil para eludir el sandbox: ✅
Pero Hammerspoon debe estar instalado
Bypass de TCC: ✅
Solicita permisos de Accesibilidad
Ubicación
~/.hammerspoon/init.lua
Disparador: Una vez que se ejecuta hammerspoon
Descripción
Hammerspoon sirve como una plataforma de automatización para macOS, aprovechando el lenguaje de scripting LUA para sus operaciones. Notablemente, soporta la integración de código completo de AppleScript y la ejecución de scripts de shell, mejorando significativamente sus capacidades de scripting.
La aplicación busca un solo archivo, ~/.hammerspoon/init.lua
, y cuando se inicia, el script se ejecutará.
BetterTouchTool
Útil para eludir el sandbox: ✅
Pero BetterTouchTool debe estar instalado
Bypass de TCC: ✅
Solicita permisos de Automatización-Cortos y Accesibilidad
Ubicación
~/Library/Application Support/BetterTouchTool/*
Esta herramienta permite indicar aplicaciones o scripts a ejecutar cuando se presionan algunos atajos. Un atacante podría configurar su propio atajo y acción a ejecutar en la base de datos para hacer que ejecute código arbitrario (un atajo podría ser simplemente presionar una tecla).
Alfred
Útil para eludir el sandbox: ✅
Pero Alfred debe estar instalado
Bypass de TCC: ✅
Solicita permisos de Automatización, Accesibilidad e incluso acceso a Disco Completo
Ubicación
???
Permite crear flujos de trabajo que pueden ejecutar código cuando se cumplen ciertas condiciones. Potencialmente, es posible que un atacante cree un archivo de flujo de trabajo y haga que Alfred lo cargue (se necesita pagar la versión premium para usar flujos de trabajo).
SSHRC
Escritura: https://theevilbit.github.io/beyond/beyond_0006/
Útil para eludir el sandbox: ✅
Pero ssh necesita estar habilitado y en uso
Bypass de TCC: ✅
El uso de SSH requiere acceso FDA
Ubicación
~/.ssh/rc
Disparador: Inicio de sesión a través de ssh
/etc/ssh/sshrc
Se requiere root
Disparador: Inicio de sesión a través de ssh
Para activar ssh se requiere acceso a Disco Completo:
Descripción y Explotación
Por defecto, a menos que PermitUserRC no
en /etc/ssh/sshd_config
, cuando un usuario inicia sesión a través de SSH los scripts /etc/ssh/sshrc
y ~/.ssh/rc
se ejecutarán.
Elementos de Inicio de Sesión
Escritura: https://theevilbit.github.io/beyond/beyond_0003/
Ubicaciones
~/Library/Application Support/com.apple.backgroundtaskmanagementagent
Disparador: Inicio de sesión
Carga útil de explotación almacenada llamando a
osascript
/var/db/com.apple.xpc.launchd/loginitems.501.plist
Disparador: Inicio de sesión
Se requiere root
Descripción
En Preferencias del Sistema -> Usuarios y Grupos -> Elementos de Inicio de Sesión puedes encontrar elementos que se ejecutarán cuando el usuario inicie sesión. Es posible listarlos, agregar y eliminar desde la línea de comandos:
Estos elementos se almacenan en el archivo ~/Library/Application Support/com.apple.backgroundtaskmanagementagent
Los elementos de inicio de sesión también pueden indicarse utilizando la API SMLoginItemSetEnabled que almacenará la configuración en /var/db/com.apple.xpc.launchd/loginitems.501.plist
ZIP como Elemento de Inicio de Sesión
(Revisa la sección anterior sobre Elementos de Inicio de Sesión, esto es una extensión)
Si almacenas un archivo ZIP como un Elemento de Inicio de Sesión, la Utilidad de Archivos
lo abrirá y si el zip fue, por ejemplo, almacenado en ~/Library
y contenía la carpeta LaunchAgents/file.plist
con un backdoor, esa carpeta será creada (no lo está por defecto) y el plist será agregado para que la próxima vez que el usuario inicie sesión, el backdoor indicado en el plist será ejecutado.
Otra opción sería crear los archivos .bash_profile
y .zshenv
dentro del HOME del usuario, así que si la carpeta LaunchAgents ya existe, esta técnica seguiría funcionando.
At
Escritura: https://theevilbit.github.io/beyond/beyond_0014/
Ubicación
Necesitas ejecutar
at
y debe estar habilitado
Descripción
Las tareas at
están diseñadas para programar tareas únicas que se ejecuten en ciertos momentos. A diferencia de los trabajos cron, las tareas at
se eliminan automáticamente después de la ejecución. Es crucial notar que estas tareas son persistentes a través de reinicios del sistema, marcándolas como posibles preocupaciones de seguridad bajo ciertas condiciones.
Por defecto están deshabilitadas pero el usuario root puede habilitarlas con:
Esto creará un archivo en 1 hora:
Revisa la cola de trabajos usando atq:
Above we can see two jobs scheduled. We can print the details of the job using at -c JOBNUMBER