Dies ist der zweite Teil einer Reihe von Blogbeiträgen über meine kürzliche Arbeit am Open-Source-Framework C2 Covenant.
Nachdem ich mit anderen C2s gearbeitet und ihre Fähigkeiten gesehen habe, wollte ich Covenant einige neue Tasks hinzufügen. Im Fokus stehen dabei hauptsächlich die Enumeration von Prozessen und ihren Modulen oder Threads. Dies kann nützlich sein, wenn man Code in diese Prozesse injizieren oder mehr über EDRs und ihre Funktionen herausfinden will. Im Sinne der Transparenz: Die Tasks sind stark von den Befehlen des beeindruckenden Closed-Source-C2s Brute Ratel (BRc4, Befehlsdokumentation hier) inspiriert.
Die neuen Tasks können alle in unserem GitHub-Repo heruntergeladen werden: Covenant-Additions
Ich habe auch einige Tasks geändert, um sie besser an unsere Bedürfnisse anzupassen, aber sie sind derzeit noch nicht bereit, als Open Source zur Verfügung gestellt zu werden. Wenn ich die verschiedenen Bugs und Fehler behoben habe, werde ich sie ebenfalls in das Repo aufnehmen.
FindCLRProcess
Durchsucht alle laufenden Prozesse, um diejenigen zu finden, die eine CLR geladen haben. Wenn ich eine .NET-Assembly in einen anderen Prozess injiziere, ziehe ich es vor, einen Prozess zu verwenden, in dem bereits eine CLR geladen ist, da es unauffälliger ist. Andernfalls würde ein Prozess, der normalerweise keine CLR lädt, plötzlich eine CLR laden, was Warnungen oder Verdachtsmomente auslösen könnte.
Die Module aller Prozesse werden nach der Zeichenfolge "clr.dll" durchsucht. Da es sich nicht um eine exakte Übereinstimmung handeln muss, wird auch coreclr.dll gefunden. Der Modulname muss jeweils vom Operater geprüft werden, um zu sehen, ob er den Anforderungen entspricht.
FindProcessWithDll
Durchsucht alle laufenden Prozesse, um diejenigen zu finden, die die erforderliche DLL geladen haben. Dies ist auch hilfreich bei der Suche nach Prozessen, in die injiziert werden soll. FindCLRProcess ist genau die gleiche Funktionalität, nur mit "clr.dll" als festes Argument. Mit dieser Funktion ist es möglich, nach Prozessen zu suchen, die normalerweise über das Internet kommunizieren (winhttp.dll) oder über eine andere Funktionalität verfügen, die wir gerne nutzen möchten.
ListExports
Listet alle exportierten Funktionen einer DLL auf, die im aktuellen Prozess geladen ist. Nützlich zum Patchen oder um mehr über eine DLL zu erfahren, wie z.B. eine Userland EDR DLL und ihre exportierten Funktionen.
ListModules
Listet die geladenen Module eines angegebenen Prozesses auf. Wiederum ähnlich wie FindProcessWithDll und FindCLRProcess, aber dieser Task zeigt alle geladenen Module des Prozesses mit der angegebenen PID an. Die Basisadresse und der Dateiname des Moduls werden ebenfalls zurückgegeben.
ListThreads
Listet die Threads und ihre Zustände in einem bestimmten Prozess auf. Wenn sich der Thread in einem Wartezustand befindet, wird der Grund für das Warten an die Ausgabe angehängt. Dies kann hilfreich sein, um Threads zu finden, die sich in einem "alertable" Zustand befinden. Diese können verwendet werden, um Code in andere Prozesse einzuschleusen. Andere, nicht alarmierbare Threads könnten ebenfalls verwendet werden, müssten aber zuerst in einen alarmierbaren Zustand versetzt werden (z. B. suspendiert), was wiederum Verdacht erregen könnte.
Dies sind unsere neuen Tasks, die jetzt auf GitHub verfügbar sind. Ich habe einige zukünftige Arbeiten geplant, bei denen ich prüfen möchte, ob eine exportierte Methode einer DLL von einem EDR gehooked wird. Soweit ich weiß, ändern EDRs die IAT nicht mehr, sondern verändern die Zieladresse der exportierten Methoden von DLLs im Prozess so, dass sie auf einen anderen Speicherort zeigen. Dies kann entdeckt werden, tatsächlich bietet Brute Ratel diese Funktionalität (detect_hooks) bereits schon, mit noch mehr Tracing und Enumeration. Mal sehen, ob ich etwas ähnliches in C# hinkriege. Jeder Input dazu ist willkommen!
Danke fürs Lesen! Wie immer gilt: Falls es Fragen oder Rückmeldungen gibt, können diese gerne per Mail an research@avantguard.io oder im BloodHoundGang Slackchannel an mich (Username @jannlemm0913) direkt gestellt werden.