Iscriviti al webinar gratuito del 12 Maggio per diventare Forensic Analyst! Scopri di più
Corso Ethical Hacker: accedi alla promozione fino al 30 Aprile! Scopri di più
Gli RC scripts sono file di inizializzazione eseguiti durante la sequenza di avvio dei sistemi Unix-like. Storicamente legati al modello SysVinit, questi script permettono agli amministratori di definire servizi e comandi personalizzati da lanciare automaticamente a ogni riavvio, tipicamente con privilegi di root. Un avversario che riesca a iniettare una riga in /etc/rc.local, /etc/rc.common o in uno script equivalente ottiene simultaneamente due vantaggi: persistenza (TA0003) e privilege escalation (TA0004), dato che il contenuto viene eseguito nel contesto dell'utente root al boot.
La tecnica risulta particolarmente insidiosa sulle piattaforme dove l'utente root è quello predefinito — hypervisor ESXi, dispositivi IoT, sistemi embedded — e dove la superficie di persistenza è ridotta. Su ESXi, ad esempio, la maggior parte del filesystem risiede in memoria volatile: lo script /etc/rc.local.d/local.sh rappresenta uno dei pochissimi punti di aggancio che sopravvivono al riavvio.
Sebbene molte distribuzioni moderne abbiano adottato systemd e macOS abbia deprecato gli RC scripts in favore di launchd, la retrocompatibilità mantiene vivo il rischio: su Ubuntu, se il file rc.local esiste con i permessi corretti, il sistema lo eseguirà comunque. Tre gruppi APT documentati, quattro famiglie malware e una sola mitigazione formale rendono questa tecnica un classico caso di persistenza a basso costo e alta efficacia.
Il test di questa tecnica richiede un ambiente lab con accesso root su una macchina Linux, un hypervisor ESXi e, idealmente, una VM macOS legacy (Panther 10.3 o precedente, oppure una distribuzione che mantenga la retrocompatibilità con rc.local). L'obiettivo è verificare se gli script RC vengono effettivamente eseguiti al boot e se i controlli di detection in essere rilevano la modifica.
Scenario Linux — Iniezione in rc.local. Il primo passo è accertarsi che il file esista e sia eseguibile. Su distribuzioni basate su Debian/Ubuntu, /etc/rc.local potrebbe non essere presente di default ma il servizio rc-local di systemd lo onora se creato manualmente:
touch /etc/rc.local && chmod +x /etc/rc.local
A questo punto si inietta un payload di test — un semplice callback tramite netcat o un marker nel syslog per confermare l'esecuzione:
echo '#!/bin/bash' > /etc/rc.local && echo 'logger "RC_LOCAL_TEST_EXEC"' >> /etc/rc.local
Dopo il reboot, la stringa RC_LOCAL_TEST_EXEC apparirà in /var/log/syslog (o nel journal di systemd). In un engagement più realistico, si sostituisce il logger con una reverse shell o un binary dropper, simulando il comportamento di HiddenWasp che aggiunge sé stesso direttamente a /etc/rc.local.
Scenario ESXi — Persistenza su local.sh. Su un host ESXi in laboratorio, il file target è /etc/rc.local.d/local.sh. Lo script è già presente con un blocco exit 0 in fondo. L'iniezione va posizionata prima di quella riga:
sed -i '/^exit 0/i /tmp/implant.sh &' /etc/rc.local.d/local.sh
Questo replica il pattern adottato da UNC3886, che ha collocato script di installazione in /etc/rc.local.d/. Per verificare la persistenza è sufficiente riavviare l'host e controllare che il processo atteso sia in esecuzione.
Scenario init.d — Servizio custom. Il malware Green Lambert utilizza directory init.d e rc.d per creare un servizio fittizio. La simulazione prevede la creazione di uno script in /etc/init.d/ con header LSB, seguito dall'abilitazione tramite:
update-rc.d nome_servizio defaults
Su distribuzioni Red Hat-like si usa invece chkconfig nome_servizio on.
Scenario macOS legacy. Su sistemi compatibili, la modifica di /etc/rc.common con un comando aggiuntivo in coda replica il meccanismo di iKitten. Su macOS moderno questo vettore è deprecato: verificate piuttosto che il file non venga comunque letto per retrocompatibilità.
Per la validazione automatizzata, il framework Atomic Red Team (open source) include test atomici per T1037.004 che permettono di eseguire e ripulire ciascuno scenario in modo controllato.
Scarica la guida gratuita e segui il percorso corretto fin dal primo passo