
Cobalt Strike BOF per esecuzione di assembly .NET in-process con bypass AMSI/ETW, AppDomain personalizzato e reindirizzamento dell'output tramite named pipe/mailslot.
InlineExecute-Assembly è un Beacon Object File (BOF) proof-of-concept che consente ai professionisti della sicurezza di eseguire assembly .NET in-process, in alternativa al tradizionale modulo execute-assembly di Cobalt Strike basato su fork-and-run. InlineExecute-Assembly esegue qualsiasi assembly che abbia come punto di ingresso Main(string[] args) o Main(). Questo dovrebbe permetterti di eseguire la maggior parte degli strumenti rilasciati senza alcuna modifica preventiva.
Il BOF determina automaticamente quale Common Language Runtime (CLR) deve essere caricato nel processo per il tuo assembly (v2.0.50727 o v4.0.30319) prima dell'esecuzione e, nella maggior parte dei casi, dovrebbe terminare in modo pulito se si verificano problemi. Il BOF supporta anche diverse flag che consentono all'operatore di dettare vari comportamenti prima dell'esecuzione di .NET, tra cui la disabilitazione di AMSI tramite patch in memoria, la disabilitazione e il ripristino di ETW tramite patch in memoria, la personalizzazione del nome del dominio dell'AppDomain CLR da creare, la possibilità di creare e reindirizzare l'output della console dell'assembly a un named pipe o a un mailslot, e permette all'operatore di passare dal punto di ingresso predefinito Main(string[] args) a Main(). Maggiori dettagli sull'uso, i casi d'uso e le possibili rilevazioni sono disponibili qui sotto e su https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/.
Infine, il vantaggio di eseguire i nostri assembly .NET nello stesso processo del nostro beacon implant è che evitiamo il comportamento predefinito del modulo execute-assembly di Cobalt Strike, che crea un nuovo processo per caricare/iniettare CLR/assembly .NET. Tuttavia, esistono ancora altre considerazioni opsec, ad esempio: il processo in cui stiamo esecutando carica normalmente il CLR? L'assembly .NET che stiamo eseguendo ha firme note? Di conseguenza, lo svantaggio è che se qualcosa viene rilevato e ucciso, ad esempio da AMSI, anche il tuo beacon viene ucciso.
Questo strumento non esisterebbe senza la possibilità di sfruttare alcune ottime ricerche, strumenti e codici già pubblicati da membri della comunità della sicurezza. Quindi grazie a tutti. Infine, se pensi che qualcuno sia stato omesso di seguito, fammelo sapere e provvederò ad aggiungerlo.
Esegui il comando qui sotto all'interno della directory src tramite il Prompt dei comandi degli strumenti nativi x64 per VS 2019
cl.exe /c inlineExecute-Assembly.c /GS- /FoinlineExecute-Assemblyx64.o
Esegui il comando qui sotto all'interno della directory src tramite il Prompt dei comandi degli strumenti nativi x86 per VS 2019
cl.exe /c inlineExecute-Assembly.c /GS- /FoinlineExecute-Assemblyx86.o
--dotnetassembly Directory path to your assembly **required**
--assemblyargs Assembly arguments to pass
--appdomain Change default name of AppDomain sent (default value is totesLegit and is set via the included aggressor script) *Domain always unloaded*
--amsi Attempts to disable AMSI via in memory patching (If successful AMSI will be disabled for the entire life of process)
--etw Attempts to disable ETW via in memory patching (If successful ETW will be disabled for the entire life of process unless reverted)
--revertetw Attempts to disable ETW via in memory patching and then repatches it back to original state
--pipe Change default name of named pipe (default value is totesLegit and is set via the included aggressor script)
--mailslot Switches to using mailslots to redirect console output. Changes default name of mailslot (If left blank, default value is totesLegit and is set via the included aggressor script)
--main Changes entry point to Main() (default value is Main(string[] args))
Esegui assembly .NET
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe
Esegui assembly .NET con argomenti
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker
Esegui assembly .NET con argomenti e disabilita AMSI
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --amsi
Esegui assembly .NET con argomenti e disabilita ETW
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --etw
Esegui assembly .NET con argomenti e reindirizza l'output tramite mailslot invece del named pipe predefinito
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --mailslot
Esegui assembly .NET con argomenti e cambia il nome del named pipe predefinito impostato nello script aggressor
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --pipe forRealLegit
Esegui assembly .NET e cambia il dominio dell'app predefinito impostato nello script aggressor
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --appdomain forRealLegit
Esegui assembly .NET con punto di ingresso Main() invece del predefinito Main(string[] args)
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/simpleMain.exe --main
Vai all-in
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --amsi --etw --appdomain forRealLegit --mailslot forRealLegit
Alcune strategie di rilevazione e mitigazione che potrebbero essere utilizzate: