Abuso di Launchctl: System Services Launchctl (T1569.001)
La tecnica T1569.001 descrive l'abuso di launchctl, l'interfaccia a riga di comando che dialoga con launchd, il framework di gestione dei servizi di macOS. Attraverso questo binario nativo un attaccante può caricare, avviare e scaricare Launch Agents e Launch Daemons, ottenendo esecuzione di codice sotto l'ombrello di un componente firmato Apple e integrato nel sistema operativo.
La tecnica ricade nella tattica TA0002 (Execution) e si colloca tipicamente nella fase post-exploitation della kill chain, quando l'attaccante ha già ottenuto un foothold sulla macchina e cerca di eseguire payload in modo affidabile. Nella pratica l'abuso di launchctl si intreccia quasi sempre con la persistenza (T1543.001/004), perché caricare un plist significa contestualmente ottenere sia esecuzione sia riavvio automatico del processo.
I dati MITRE ATT&CK associano a questa tecnica sei famiglie malware documentate — tra cui AppleJeus, XCSSET, LoudMiner, Calisto, macOS.OSAMiner e Cuckoo Stealer — con un uso trasversale che va dal cryptomining al furto di credenziali, fino agli impianti di gruppi state-sponsored. L'attrattiva per gli attaccanti è chiara: launchctl è LOLBin nativo, ha uso legittimo intensivo su ogni Mac e permette elevazione a contesto root quando si opera sui LaunchDaemons di sistema.
In un ingaggio red team su ambiente macOS, l'abuso di launchctl si struttura in tre passi: preparare un file plist, posizionarlo nella directory corretta e caricarlo. La scelta della directory determina il contesto di esecuzione: /Library/LaunchDaemons/ richiede privilegi root ed esegue come system, /Library/LaunchAgents/ esegue per ogni utente al login, mentre ~/Library/LaunchAgents/ opera solo nel contesto dell'utente corrente senza necessità di privilegi elevati.
Un plist minimale contiene le chiavi Label, ProgramArguments e RunAtLoad. Dopo averlo salvato, il caricamento avviene con il comando standard:
launchctl load -w ~/Library/LaunchAgents/com.apple.updater.plist
Su macOS moderni (12+) il sottocomando load è deprecato in favore di bootstrap, che richiede un target esplicito:
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.apple.updater.plist
Per avviare manualmente un job già caricato si usa launchctl kickstart -k gui/$(id -u)/com.apple.updater, mentre lo scarico avviene con bootout. Il flag -w è particolarmente interessante in ottica offensive perché sovrascrive la chiave Disabled nel plist, garantendo che il job resti attivo attraverso i riavvii.
Per la simulazione controllata in laboratorio, Atomic Red Team (open source) fornisce i test T1569.001 già scriptati e riproducibili, utili per validare la copertura di detection prima di un engagement reale. PoshC2 (open source) e Mythic (open source) con il payload Apfell/Poseidon offrono moduli nativi per il deploy di LaunchAgents da C2. Sul fronte manuale, plistbuddy (nativo macOS, path /usr/libexec/PlistBuddy) è lo strumento ufficiale per costruire e modificare plist evitando errori di formato XML che tradirebbero la creazione manuale.
Una catena realistica osservata in campagne come quelle di XCSSET prevede: dropping del payload in una directory poco monitorata (es. ~/Library/Application Support/), creazione del plist che punta al payload, invocazione di launchctl load -w, e infine chiamate di rete verso il C2 dopo pochi secondi. Per aumentare la stealth conviene scegliere Label che imitano bundle Apple (com.apple.), evitare ProgramArguments con path in /tmp e schedulare l'esecuzione con StartInterval invece di RunAtLoad per dilazionare l'attivazione oltre la finestra di correlazione dei SIEM.
Vuoi diventare un Ethical Hacker ma non sai da dove iniziare?
Accedi alle lezioni gratuite e segui il percorso corretto fin dal primo passo