Iscriviti al webinar gratuito del 12 Maggio per diventare Forensic Analyst! Scopri di più
Corso Ethical Hacker: accedi alla promozione fino al 30 Arile! Scopri di più
InstallUtil è un'utilità a riga di comando inclusa nel .NET Framework di Windows, progettata per installare e disinstallare risorse eseguendo componenti installer contenuti in assembly .NET. Il binario risiede nelle directory del framework — sia nella versione a 32 bit sotto Framework sia in quella a 64 bit sotto Framework64 — ed è firmato digitalmente da Microsoft. Proprio questa firma lo rende un candidato ideale per il proxy execution: un attaccante può compilare un assembly .NET contenente codice malevolo decorato con l'attributo [System.ComponentModel.RunInstaller(true)] e farlo eseguire da InstallUtil, aggirando i controlli di application control che si fidano dei binari firmati Microsoft.
La tecnica si colloca nella tattica Defense Evasion (TA0005), la fase della kill chain in cui l'avversario lavora per evitare il rilevamento. Sfruttando un binario legittimo e firmato — un cosiddetto Living-off-the-Land Binary (LOLBin) — il codice malevolo eredita la reputazione del processo ospitante, rendendo più complesso il triage da parte degli analisti e dei sistemi di difesa automatizzati.
I numeri del dataset mostrano 2 gruppi APT che hanno adottato questa tecnica, 4 software malevoli o offensivi che la integrano nelle proprie catene d'attacco, e 2 mitigazioni specifiche raccomandate. Nessuna campagna è formalmente mappata, ma i profili dei gruppi e dei malware coinvolti indicano un impiego trasversale, dal cyber-spionaggio alle operazioni distruttive.
Il cuore di questa tecnica è semplice: scrivere una classe C# che implementi il metodo Uninstall() (o Install()) all'interno di un assembly decorato con l'attributo RunInstaller(true), poi invocare InstallUtil per eseguirlo. In un esercizio red team questa catena permette di testare se i controlli di application control e gli alert EDR intercettano l'esecuzione proxy.
Per cominciare, il payload va compilato con il compilatore C# integrato nel framework .NET, disponibile su qualsiasi sistema Windows senza installazioni aggiuntive:
csc.exe /target:library /out:C:\Temp\payload.dll C:\Temp\payload.cs
Il file payload.cs contiene una classe che eredita da System.Configuration.Install.Installer e sovrascrive il metodo Uninstall. A questo punto l'esecuzione avviene tramite la modalità di disinstallazione, che è la variante più comune in ambiente offensivo perché non richiede privilegi elevati:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=false /U C:\Temp\payload.dll
I flag /logfile= e /LogToConsole=false sopprimono ogni output, riducendo le tracce visibili. La scelta tra Framework e Framework64 dipende dall'architettura del processo target — un dettaglio rilevante quando si inietta in processi a 32 bit su sistemi a 64 bit.
Covenant (open source), il framework C2 scritto in .NET, automatizza questa catena generando launcher basati su file XML InstallUtil. Il launcher produce un Grunt — l'agente di Covenant — che si connette al teamserver senza che l'operatore debba compilare manualmente l'assembly. Per chi preferisce un approccio manuale, il progetto LOLBAS documenta le varianti note di abuso di InstallUtil con payload di esempio.
In laboratorio è buona pratica testare anche la variante con assembly posizionati in directory inusuali — %TEMP%, %APPDATA%, profili utente — perché sono proprio questi path anomali a dover scatenare gli alert. Dopo l'esecuzione, verifica con Sysmon (open source) che l'evento di creazione processo (EventID 1) contenga la command line completa e che l'hash dell'assembly compaia nei log.
Un test complementare consiste nel verificare se la policy AppLocker o WDAC dell'ambiente blocca effettivamente il binario: esegui InstallUtil con un assembly innocuo e controlla se il sistema genera un evento di blocco (EventID 8004 nel log AppLocker). Se l'esecuzione riesce, la mitigazione non è efficace.
Scarica la guida gratuita e segui il percorso corretto fin dal primo passo