Compilazione Post-Consegna: Compile After Delivery (T1027.004)
La tecnica T1027.004 — Compile After Delivery appartiene alla tattica TA0005 (Defense Evasion) e descrive la consegna del payload sotto forma di codice sorgente non compilato, che viene poi trasformato in eseguibile direttamente sull'host della vittima. La logica è semplice ma efficace: un file .cs, .c o uno script AutoIt non ha la stessa firma di un PE malevolo, non scatena euristiche binarie e attraversa spesso indenne gateway di posta, sandbox e antivirus tarati sull'analisi di binari compilati.
Gli attaccanti sfruttano utility native già presenti nel sistema: csc.exe e ilasm.exe su Windows, GCC o Clang su Linux, clang o xcodebuild su macOS. In alternativa, il sorgente può essere cifrato, codificato o incapsulato in un documento di phishing, per poi essere estratto e compilato al momento dell'esecuzione. In alcuni casi viene consegnato anche il compilatore stesso, insieme al codice.
I dati MITRE ATT&CK associano la tecnica a 4 gruppi APT e 6 famiglie di malware, con un pattern che spazia dal cybercrime commodity (njRAT, DarkWatchman) allo state-sponsored (Gamaredon, MuddyWater, Sea Turtle). L'impatto operativo è duplice: da un lato la riduzione drastica del tasso di detection statica, dall'altro la complicazione dell'analisi forense, che deve ricostruire un artefatto che sull'endpoint non esisteva come binario fino al momento della compilazione.
In un ingaggio red team, la compilazione post-consegna è un vettore che consente di bypassare controlli AV/EDR che ispezionano solo gli allegati binari. La catena tipica su Windows prevede la consegna di un file .cs incapsulato in un vettore di phishing (documento con macro, LNK, HTA) e la successiva invocazione del compilatore C# nativo del framework .NET.
Il comando canonico è:
csc.exe /target:exe /out:%TEMP%\payload.exe %TEMP%\source.cs
csc.exe risiede tipicamente in *C:\Windows\Microsoft.NET\Framework64\v4.0.30319* ed è presente su qualunque installazione Windows moderna, il che lo rende un LOLBin ideale. Una variante più stealth sfrutta la classe Microsoft.CSharp.CSharpCodeProvider direttamente in memoria da PowerShell, evitando di scrivere il sorgente su disco — approccio documentato per Gamaredon. Un'alternativa è ilasm.exe, che compila IL (Intermediate Language) e passa spesso sotto i radar delle regole tarate su csc.
Per scenari macOS o Linux, il codice sorgente .c viene compilato con GCC:
gcc -o /tmp/.cache/agent /tmp/src.c && chmod +x /tmp/.cache/agent
Su macOS l'equivalente è clang, con xcodebuild come opzione quando è disponibile la toolchain Xcode. Per esercitazioni cross-platform, MinGW consente di cross-compilare payload Windows da un host Linux di staging.
Dal punto di vista tooling, il framework Sliver (open source) implementa nativamente il retrieval di sorgenti e la compilazione locale prima dell'esecuzione, utile per emulare scenari APT complessi. AutoIt (freemium, con compilatore gratuito) è invece il vettore storico di njRAT, che assembla script e payload in un singolo .exe. Per la fase di consegna, Nishang (open source) e PowerSploit (open source) offrono moduli PowerShell che invocano il CSharpCodeProvider in-memory.
Una checklist operativa per il red team:
- Verificare la presenza dei compilatori target sull'host (csc.exe, gcc, clang) prima di scegliere il vettore
- Offuscare il sorgente con string encoding e nomi di variabili randomizzati per resistere ad analisi statica del testo
- Compilare in directory scrivibili dall'utente (%TEMP%, ~/Downloads, /tmp) per evitare prompt UAC
- Rimuovere il sorgente dopo la compilazione per ridurre gli artefatti
- Testare in lab con EDR realistici: molti prodotti moderni intercettano
csc.execon figli anomali
La tecnica è particolarmente efficace in ambienti dove sviluppatori e utenti standard convivono, perché la baseline dei compilatori è già rumorosa e le regole di detection generano falsi positivi.
Vuoi diventare un Ethical Hacker ma non sai da dove iniziare?
Accedi alle lezioni gratuite e segui il percorso corretto fin dal primo passo