* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
Esta sección se basa en gran medida en la serie de blogs [**Beyond the good ol' LaunchAgents**](https://theevilbit.github.io/beyond/), el objetivo es agregar **más ubicaciones de autoinicio** (si es posible), indicar **qué técnicas siguen funcionando** en la actualidad con la última versión de macOS (13.4) y especificar los **permisos** necesarios.
## Bypass de Sandbox
{% hint style="success" %}
Aquí puedes encontrar ubicaciones de inicio útiles para **bypass de sandbox** que te permiten simplemente ejecutar algo **escribiéndolo en un archivo** y **esperando** una **acción** muy **común**, una determinada **cantidad de tiempo** o una **acción que normalmente puedes realizar** desde dentro de una sandbox sin necesidad de permisos de root.
**`launchd`** es el **primer****proceso** ejecutado por el kernel de OX S al iniciar y el último en finalizar al apagar. Siempre debe tener el **PID 1**. Este proceso **lee y ejecuta** las configuraciones indicadas en los **plists** de **ASEP** en:
Cuando un usuario inicia sesión, los plists ubicados en `/Users/$USER/Library/LaunchAgents` y `/Users/$USER/Library/LaunchDemons` se inician con los **permisos de los usuarios conectados**.
La **principal diferencia entre agentes y demonios es que los agentes se cargan cuando el usuario inicia sesión y los demonios se cargan al iniciar el sistema** (ya que hay servicios como ssh que deben ejecutarse antes de que cualquier usuario acceda al sistema). Además, los agentes pueden usar la interfaz gráfica mientras que los demonios deben ejecutarse en segundo plano.
Hay casos en los que es necesario ejecutar un **agente antes de que el usuario inicie sesión**, estos se llaman **PreLoginAgents**. Por ejemplo, esto es útil para proporcionar tecnología de asistencia al iniciar sesión. También se pueden encontrar en `/Library/LaunchAgents` (ver [**aquí**](https://github.com/HelmutJ/CocoaSampleCode/tree/master/PreLoginAgents) un ejemplo).
Los archivos de configuración de los nuevos demonios o agentes se cargarán después del próximo reinicio o utilizando `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).\
Para **asegurarse** de que no haya **nada** (como una anulación) **impidiendo** que un **Agente** o **Demonio** se **ejecute**, ejecute: `sudo launchctl load -w /System/Library/LaunchDaemos/com.apple.smdb.plist`
* **Disparador**: Se espera que se active con xterm, pero **no está instalado** y incluso después de instalarlo se produce este error: xterm: `DISPLAY no está configurado`
Los archivos de inicio de la shell se ejecutan cuando nuestro entorno de shell como `zsh` o `bash` se está **iniciando**. En macOS, el valor predeterminado es `/bin/zsh`, y cada vez que abrimos `Terminal` o nos conectamos por SSH al dispositivo, este es el entorno de shell en el que nos encontramos. `bash` y `sh` todavía están disponibles, pero deben iniciarse específicamente.
La página de manual de zsh, que podemos leer con **`man zsh`**, tiene una descripción detallada de los archivos de inicio.
Configurar la explotación indicada y cerrar sesión e iniciar sesión o incluso reiniciar no funcionó para ejecutar la aplicación. (La aplicación no se estaba ejecutando, tal vez necesita estar en ejecución cuando se realizan estas acciones)
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**.
Entonces, si se puede sobrescribir el plist de las preferencias del terminal en el sistema, la funcionalidad **`open`** se puede utilizar para **abrir el terminal y ejecutar ese comando**.
Puedes agregar esto desde la línea de comandos con:
Los plugins de QuickLook se pueden ejecutar cuando **se activa la vista previa de un archivo** (presionando la barra espaciadora con el archivo seleccionado en Finder) y se instala un **plugin que admita ese tipo de archivo**.
Es posible compilar tu propio plugin de QuickLook, colocarlo en una de las ubicaciones anteriores para cargarlo y luego ir a un archivo compatible y presionar espacio para activarlo.
El usuario root se encuentra almacenado en **`/private/var/root/Library/Preferences/com.apple.loginwindow.plist`**
## Bypass de Sandbox Condicional
{% hint style="success" %}
Aquí puedes encontrar ubicaciones de inicio útiles para el **bypass de sandbox** que te permite simplemente ejecutar algo **escribiéndolo en un archivo** y **esperando condiciones no muy comunes** como programas específicos instalados, acciones o entornos de usuario "poco comunes".
Aquí puedes encontrar las tareas regulares de **cron**, las tareas de **at** (poco utilizadas) y las tareas **periódicas** (principalmente utilizadas para limpiar archivos temporales). Las tareas periódicas diarias se pueden ejecutar, por ejemplo, con: `periodic daily`.
Para agregar una tarea de **cronjob de usuario programáticamente**, es posible utilizar:
El script **`~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt`** también se ejecutará:
```bash
do shell script "touch /tmp/iterm2-autolaunchscpt"
```
Las preferencias de iTerm2 se encuentran en **`~/Library/Preferences/com.googlecode.iterm2.plist`** y pueden **indicar un comando a ejecutar** cuando se abre la terminal de iTerm2.
[**Hammerspoon**](https://github.com/Hammerspoon/hammerspoon) es una herramienta de automatización que permite la **programación de macOS a través del lenguaje de programación LUA**. Incluso podemos incrustar código completo de AppleScript y ejecutar scripts de shell.
Por defecto, a menos que `PermitUserRC no` esté configurado 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.
Si el programa popular [**xbar**](https://github.com/matryer/xbar) está instalado, es posible escribir un script de shell en **`~/Library/Application\ Support/xbar/plugins/`** que se ejecutará cuando se inicie xbar:
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, agregarlos y eliminarlos desde la línea de comandos:
Los **elementos de inicio de sesión** también se pueden indicar utilizando la API [SMLoginItemSetEnabled](https://developer.apple.com/documentation/servicemanagement/1501557-smloginitemsetenabled?language=objc), que almacenará la configuración en **`/var/db/com.apple.xpc.launchd/loginitems.501.plist`**
Si almacena un archivo **ZIP** como un **elemento de inicio de sesión**, el **`Archive Utility`** lo abrirá y si el zip se almacenó, por ejemplo, en **`~/Library`** y contenía la carpeta **`LaunchAgents/file.plist`** con una puerta trasera, esa carpeta se creará (no lo está de forma predeterminada) y se agregará el plist para que la próxima vez que el usuario vuelva a iniciar sesión, se ejecute la **puerta trasera indicada en el plist**.
Otra opción sería crear los archivos **`.bash_profile`** y **`.zshenv`** dentro del directorio HOME del usuario, por lo que si la carpeta LaunchAgents ya existe, esta técnica seguiría funcionando.
Las "tareas at" se utilizan para **programar tareas en momentos específicos**.\
Estas tareas son diferentes de las tareas cron en el sentido de que **son tareas únicas** que se eliminan después de ejecutarse. Sin embargo, **sobreviven a un reinicio del sistema**, por lo que no se pueden descartar como una posible amenaza.
*`0001a` - número de trabajo en hexadecimal, `0x1a = 26`
*`019bdcd2` - hora en hexadecimal. Representa los minutos transcurridos desde la época. `0x019bdcd2` es `26991826` en decimal. Si lo multiplicamos por 60, obtenemos `1619509560`, que es `GMT: 27 de abril de 2021, martes 7:46:00`.
Un script de Acción de Carpeta se ejecuta cuando se agregan o eliminan elementos en la carpeta a la que está adjunto, o cuando su ventana se abre, cierra, mueve o cambia de tamaño:
* Abrir la carpeta a través de la interfaz de usuario del Finder
* Navegar fuera de la carpeta a través de la interfaz de usuario
Hay un par de formas de implementar esto:
1. Usar el programa [Automator](https://support.apple.com/guide/automator/welcome/mac) para crear un archivo de flujo de trabajo de Acción de Carpeta (.workflow) e instalarlo como un servicio.
2. Hacer clic derecho en una carpeta, seleccionar `Configuración de Acciones de Carpeta...`, `Ejecutar servicio` y adjuntar manualmente un script.
3. Usar OSAScript para enviar mensajes de Evento Apple a la aplicación `System Events.app` para consultar y registrar programáticamente una nueva `Acción de Carpeta`.
Luego ejecuta el siguiente script para habilitar las Acciones de Carpeta y adjuntar el script compilado previamente a la carpeta **`/users/username/Desktop`**:
```javascript
var se = Application("System Events");
se.folderActionsEnabled = true;
var myScript = se.Script({name: "source.js", posixPath: "/tmp/source.js"});
var fa = se.FolderAction({name: "Desktop", path: "/Users/username/Desktop"});
se.folderActions.push(fa);
fa.scripts.push(myScript);
```
Ejecuta el script con: `osascript -l JavaScript /Users/carlospolop/attach.scpt`
* Esta es la forma de implementar esta persistencia a través de la GUI:
Luego, abre la aplicación `Folder Actions Setup`, selecciona la **carpeta que deseas vigilar** y selecciona en tu caso **`folder.scpt`** (en mi caso lo llamé output2.scp):
4. Abre la aplicación Folder Actions Setup para consumir esta configuración: `open "/System/Library/CoreServices/Applications/Folder Actions Setup.app/"`
**Compila un paquete** de selector de color con tu código (puedes usar [**este, por ejemplo**](https://github.com/viktorstrate/color-picker-plus)) y agrega un constructor (como en la sección de Salvapantallas) y copia el paquete a `~/Library/ColorPickers`.
Ten en cuenta que la carga binaria de tu biblioteca tiene un sandbox **muy restrictivo**: `/System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/LegacyExternalColorPickerService-x86_64.xpc/Contents/MacOS/LegacyExternalColorPickerService-x86_64`
Las aplicaciones pueden tener `Extensiones de sincronización del Finder`. Esta extensión se colocará dentro de una aplicación que se ejecutará. Además, para que la extensión pueda ejecutar su código, **debe estar firmada** con un certificado de desarrollador de Apple válido, debe estar **sometida a sandbox** (aunque se pueden agregar excepciones relajadas) y debe estar registrada con algo como:
Crea un nuevo proyecto en Xcode y selecciona la plantilla para generar un nuevo **protector de pantalla**. Luego, agrega tu código a él, por ejemplo, el siguiente código para generar registros.
**Compílalo** y copia el paquete `.saver` a **`~/Library/Screen Savers`**. Luego, abre la interfaz gráfica del protector de pantalla y si haces clic en él, debería generar muchos registros:
Ten en cuenta que debido a que dentro de los permisos del binario que carga este código (`/System/Library/Frameworks/ScreenSaver.framework/PlugIns/legacyScreenSaver.appex/Contents/MacOS/legacyScreenSaver`) puedes encontrar **`com.apple.security.app-sandbox`** estarás **dentro del sandbox de la aplicación común**.
Aquí puedes encontrar ubicaciones de inicio útiles para **evadir el sandbox** que te permiten simplemente ejecutar algo al **escribirlo en un archivo** siendo **root** y/o requiriendo otras **condiciones extrañas**.
*`/etc/daily.local`, `/etc/weekly.local` o `/etc/monthly.local`
* Requiere ser root
* **Disparador**: Cuando llegue el momento
#### Descripción y explotación
Los scripts periódicos (**`/etc/periodic`**) se ejecutan debido a los **launch daemons** configurados en `/System/Library/LaunchDaemons/com.apple.periodic*`. Ten en cuenta que los scripts almacenados en `/etc/periodic/` se **ejecutan** como el **propietario del archivo**, por lo que esto no funcionará para una posible escalada de privilegios.
Como PAM se centra más en la persistencia y el malware que en la ejecución fácil dentro de macOS, este blog no dará una explicación detallada, **lee las descripciones para entender mejor esta técnica**.
Puedes crear un plugin de autorización que se ejecutará cuando un usuario inicie sesión para mantener la persistencia. Para obtener más información sobre cómo crear uno de estos plugins, consulta las descripciones anteriores (y ten cuidado, uno mal escrito puede bloquearte y necesitarás limpiar tu Mac desde el modo de recuperación).
El archivo de configuración **`/private/etc/man.conf`** indica el binario/script a utilizar al abrir archivos de documentación de man. Por lo tanto, se puede modificar la ruta del ejecutable para que cada vez que el usuario use man para leer algunos documentos, se ejecute una puerta trasera.
De esta manera, tus módulos compilados serán cargados por Apache. Lo único es que necesitas **firmarlo con un certificado válido de Apple**, o necesitas **agregar un nuevo certificado confiable** en el sistema y **firmarlo** con él.
Cada vez que auditd detecta una advertencia, se **ejecuta** el script **`/etc/security/audit_warn`**. Por lo tanto, podrías agregar tu carga útil en él.
Después de colocar un nuevo directorio en una de estas dos ubicaciones, se deben colocar **dos elementos más** dentro de ese directorio. Estos dos elementos son un **script rc** y un **plist** que contiene algunas configuraciones. Este plist debe llamarse "**StartupParameters.plist**".
Apple introdujo un mecanismo de registro llamado **emond**. Parece que nunca fue completamente desarrollado y Apple puede haber **abandonado** su desarrollo en favor de otros mecanismos, pero sigue **disponible**.
Este servicio poco conocido puede **no ser de mucha utilidad para un administrador de Mac**, pero para un actor de amenazas, una muy buena razón sería utilizarlo como un mecanismo de **persistencia que probablemente la mayoría de los administradores de macOS no conocerían**. Detectar el uso malicioso de emond no debería ser difícil, ya que el System LaunchDaemon del servicio busca scripts para ejecutar solo en un lugar:
XQuartz ya **no está instalado en macOS**, así que si quieres más información, consulta el writeup.
### ~~kext~~
{% hint style="danger" %}
Es tan complicado instalar kext incluso como root que no lo consideraré para escapar de las sandboxes o incluso para persistencia (a menos que tengas un exploit)
{% endhint %}
#### Ubicación
Para instalar un KEXT como elemento de inicio, debe estar **instalado en una de las siguientes ubicaciones**:
*`/System/Library/Extensions`
* Archivos KEXT integrados en el sistema operativo OS X.
*`/Library/Extensions`
* Archivos KEXT instalados por software de terceros
Puedes listar los archivos kext actualmente cargados con:
```bash
kextstat #List loaded kext
kextload /path/to/kext.kext #Load a new one based on path
kextload -b com.apple.driver.ExampleBundle #Load a new one based on path
kextunload /path/to/kext.kext
kextunload -b com.apple.driver.ExampleBundle
```
Para obtener más información sobre las [**extensiones del kernel, consulta esta sección**](macos-security-and-privilege-escalation/mac-os-architecture#i-o-kit-drivers).
Aparentemente, el archivo `plist` de `/System/Library/LaunchAgents/com.apple.amstoold.plist` estaba utilizando este binario mientras exponía un servicio XPC... el problema es que el binario no existía, por lo que podías colocar algo allí y cuando se llamara al servicio XPC, se llamaría a tu binario.
* **Desencadenante**: Cuando se ejecuta el servicio (raramente)
#### Descripción y explotación
Aparentemente, no es muy común ejecutar este script e incluso no pude encontrarlo en mi macOS, así que si quieres más información, consulta el artículo.
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**merchandising oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).