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ù
La variabile d'ambiente COR_PROFILER è una funzionalità legittima del .NET Framework pensata per consentire agli sviluppatori di agganciare una DLL di profiling non gestita a ogni processo che carica il Common Language Runtime (CLR). Gli avversari abusano di questo meccanismo per dirottare il flusso di esecuzione dei programmi .NET, ottenendo tre vantaggi tattici simultanei: persistenza (TA0003), perché la DLL malevola viene caricata automaticamente ogni volta che un processo .NET si avvia; privilege escalation (TA0004), se il processo vittima gira con privilegi elevati — ad esempio bypassando lo User Account Control; e defense evasion (TA0005), perché il codice si inietta nel contesto di processi trusted, potendo disabilitare o alterare difese basate su .NET.
Il meccanismo può essere configurato a tre livelli di scope — sistema, utente o singolo processo — tramite chiavi di Registry o direttamente in memoria. A partire da .NET Framework 4, la DLL di profiling non richiede neppure registrazione COM: è sufficiente specificarne il percorso tramite COR_PROFILER_PATH. Questa flessibilità rende la tecnica particolarmente insidiosa, perché riduce le tracce nel Registry e abbassa la soglia di complessità per l'attaccante. I dati MITRE documentano 1 gruppo APT, 1 software e 3 mitigazioni associate, confermando un utilizzo mirato ma efficace in contesti reali.
Il cuore di questa tecnica sta nell'impostare tre variabili d'ambiente — COR_ENABLE_PROFILING, COR_PROFILER e COR_PROFILER_PATH — in modo che ogni processo .NET che si avvia carichi una DLL controllata dall'attaccante. La simulazione in laboratorio è relativamente semplice e non richiede tool complessi.
Il primo passo è preparare una DLL di test. Un approccio classico consiste nel compilare una DLL con un payload benigno (un semplice pop-up o un log su file) che implementi l'interfaccia ICorProfilerCallback. Per un test rapido si può usare una DLL generata con msfvenom (open source, parte di Metasploit Framework):
msfvenom -p windows/x64/messagebox TEXT="COR_PROFILER test" -f dll -o profiler_test.dll
Per impostare la persistenza a livello utente via Registry, si utilizzano comandi Windows nativi:
reg add "HKCU\Environment" /v COR_ENABLE_PROFILING /t REG_SZ /d 1 /f
reg add "HKCU\Environment" /v COR_PROFILER /t REG_SZ /d {CLSID-GUID-personalizzato} /f
reg add "HKCU\Environment" /v COR_PROFILER_PATH /t REG_SZ /d C:\Test\profiler_test.dll /f
Dopo un logoff/logon, qualsiasi processo .NET dell'utente caricherà la DLL specificata. Per testare immediatamente senza riavvio, è possibile impostare le variabili a livello di processo e lanciare un binario .NET:
set COR_ENABLE_PROFILING=1 set COR_PROFILER={CLSID-GUID-personalizzato} set COR_PROFILER_PATH=C:\Test\profiler_test.dll powershell.exe -Command "Write-Host test"
PowerShell, essendo un processo .NET, caricherà la DLL di profiling. A livello sistema — scenario più aggressivo — la scrittura va fatta sotto HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment, operazione che richiede privilegi amministrativi e impatta tutti gli utenti.
Per lo scenario di privilege escalation, il test consiste nell'impostare le variabili d'ambiente e attendere che un processo .NET con privilegi elevati (ad esempio un servizio Windows basato su .NET) carichi la DLL. Il tool Process Monitor (gratuito, parte di Sysinternals) è ideale per verificare in tempo reale quale processo carica la DLL e con quali privilegi.
Il cleanup è fondamentale: rimuovere le tre chiavi Registry e la DLL dal disco al termine del test. Per la reportistica, documentare il CLSID utilizzato, i processi .NET che hanno caricato la DLL e il livello di privilegio ottenuto.
Scarica la guida gratuita e segui il percorso corretto fin dal primo passo