hacktricks/macos-hardening/macos-auto-start-locations.md
carlospolop 466ebcbb16 f
2023-06-05 20:30:03 +02:00

17 KiB

Ubicaciones de inicio automático de macOS

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Aquí se encuentran las ubicaciones en el sistema que podrían llevar a la ejecución de un binario sin interacción del usuario.

Launchd

launchd es el primer proceso ejecutado por el kernel de OX S al inicio y el último en finalizar al apagar. Siempre debe tener el PID 1. Este proceso leerá y ejecutará las configuraciones indicadas en los plists ASEP en:

  • /Library/LaunchAgents: agentes por usuario instalados por el administrador
  • /Library/LaunchDaemons: demonios de todo el sistema instalados por el administrador
  • /System/Library/LaunchAgents: agentes por usuario proporcionados por Apple.
  • /System/Library/LaunchDaemons: demonios de todo el 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 de los usuarios registrados.

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 inicio del 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 GUI mientras que los demonios deben ejecutarse en segundo plano.

<?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>/Users/username/malware</string>
    </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>

Hay casos en los que un agente debe ser ejecutado antes de que el usuario inicie sesión, estos se llaman PreLoginAgents. Por ejemplo, esto es útil para proporcionar tecnología de asistencia en el inicio de sesión. También se pueden encontrar en /Library/LaunchAgents (ver aquí un ejemplo).

{% hint style="info" %} Los nuevos archivos de configuración de Daemons o Agents se cargarán después del próximo reinicio o usando launchctl load <target.plist>. También es posible cargar archivos .plist sin esa extensión con launchctl -F <file> (sin embargo, esos archivos plist no se cargarán automáticamente después del reinicio).
También es posible descargar con launchctl unload <target.plist> (el proceso al que apunta se terminará).

Para asegurarse de que no hay 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 demonios cargados por el usuario actual:

launchctl list

Cron

Lista los trabajos cron del usuario actual con:

crontab -l

También se pueden ver todos los trabajos programados de los usuarios en /usr/lib/cron/tabs/ y /var/at/tabs/ (se necesita ser root).

En MacOS se pueden encontrar varias carpetas que ejecutan scripts con cierta frecuencia en:

ls -lR /usr/lib/cron/tabs/ /private/var/at/jobs /etc/periodic/

Aquí puedes encontrar los trabajos regulares de cron, los trabajos de at (poco utilizados) y los trabajos periódicos (principalmente utilizados para limpiar archivos temporales). Los trabajos periódicos diarios se pueden ejecutar, por ejemplo, con: periodic daily.

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 si un script se almacena en /etc/periodic/ como una forma de escalado de privilegios, se ejecutará como el propietario del archivo.

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

kext

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.

Puede listar los archivos kext cargados actualmente con:

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 de kernel, consulte esta sección.

Elementos de inicio de sesión

En Preferencias del Sistema -> Usuarios y grupos -> Elementos de inicio de sesión se pueden encontrar elementos que se ejecutan cuando el usuario inicia sesión.
Es posible listarlos, agregarlos y eliminarlos desde la línea de comandos:

#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 /Users/<username>/Library/Application Support/com.apple.backgroundtaskmanagementagent

At

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 posible amenaza.

Por defecto están deshabilitadas pero el usuario root puede habilitarlas con:

sudo launchctl load -F /System/Library/LaunchDaemons/com.apple.atrun.plist

Esto creará un archivo a las 13:37:

echo hello > /tmp/hello | at 1337

Si las tareas AT no están habilitadas, las tareas creadas no se ejecutarán.

Hooks de inicio/salida de sesión

Están obsoletos, pero se pueden usar para ejecutar comandos cuando un usuario inicia sesión.

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

Esta configuración se almacena en /Users/$USER/Library/Preferences/com.apple.loginwindow.plist

defaults read /Users/$USER/Library/Preferences/com.apple.loginwindow.plist
{
    LoginHook = "/Users/username/hook.sh";
    MiniBuddyLaunch = 0;
    TALLogoutReason = "Shut Down";
    TALLogoutSavesState = 0;
    oneTimeSSMigrationComplete = 1;
}

Para eliminarlo:

defaults delete com.apple.loginwindow LoginHook

En el ejemplo anterior hemos creado y eliminado un LoginHook, también es posible crear un LogoutHook.

El usuario root se almacena en /private/var/root/Library/Preferences/com.apple.loginwindow.plist

Emond

Apple introdujo un mecanismo de registro llamado emond. Parece que nunca se desarrolló por completo y el desarrollo puede haber sido abandonado por Apple 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 usarlo como un mecanismo de persistencia que la mayoría de los administradores de macOS probablemente no conocerían. Detectar el uso malintencionado de emond no debería ser difícil, ya que el System LaunchDaemon del servicio busca scripts para ejecutar en un solo lugar:

ls -l /private/var/db/emondClients

{% hint style="danger" %} Como esto no se usa mucho, cualquier cosa en esa carpeta debería ser sospechosa {% endhint %}

Elementos de inicio

{% hint style="danger" %} Esto está obsoleto, por lo que no se debe 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 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". {% endtab %} {% endtabs %}

<?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" %}

Ubicación de inicio automático de macOS

Introducción

En macOS, hay varias ubicaciones donde se pueden colocar archivos para que se inicien automáticamente al arrancar el sistema. Estos archivos pueden ser scripts, binarios o aplicaciones. En este documento, se describen las ubicaciones comunes donde se pueden encontrar estos archivos.

Ubicaciones comunes

/Library/LaunchAgents

Esta ubicación contiene archivos .plist que se ejecutan en el inicio del usuario actual. Estos archivos se ejecutan con los permisos del usuario actual y no requieren privilegios de administrador para instalarse.

/Library/LaunchDaemons

Esta ubicación contiene archivos .plist que se ejecutan en el inicio del sistema. Estos archivos se ejecutan con privilegios de administrador y, por lo tanto, requieren privilegios de administrador para instalarse.

/System/Library/LaunchAgents

Esta ubicación contiene archivos .plist que se ejecutan en el inicio del usuario actual. Estos archivos son proporcionados por Apple y se ejecutan con los permisos del usuario actual.

/System/Library/LaunchDaemons

Esta ubicación contiene archivos .plist que se ejecutan en el inicio del sistema. Estos archivos son proporcionados por Apple y se ejecutan con privilegios de administrador.

Conclusión

Es importante conocer las ubicaciones comunes donde se pueden encontrar archivos de inicio automático en macOS. Esto puede ayudar a identificar posibles puntos de entrada para un atacante o para solucionar problemas de inicio automático.

#!/bin/sh
. /etc/rc.common

StartService(){
    touch /tmp/superservicestarted
}

StopService(){
    rm /tmp/superservicestarted
}

RestartService(){
    echo "Restarting"
}

RunService "$1"

{% endtab %} {% endtabs %}

/etc/rc.common

{% hint style="danger" %} Esto no funciona en versiones modernas de MacOS {% endhint %}

También es posible colocar aquí comandos que se ejecutarán al inicio. Ejemplo de un script rc.common regular:

#
# 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
}

Perfiles

Los perfiles de configuración pueden obligar a un usuario a utilizar ciertas configuraciones de navegador, configuraciones de proxy DNS o configuraciones de VPN. Muchos otros payloads son posibles, lo que los hace propensos a ser abusados.

Puedes enumerarlos ejecutando:

ls -Rl /Library/Managed\ Preferences/

Otras técnicas y herramientas de persistencia

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥