Covenant C2 Framework: Das komplette Tutorial
Dec 16, 2022
Covenant ist eines der neuesten und besten Command-and-Control (C2) Post-Exploitation-Frameworks. Dieser Beitrag führt Sie durch den Prozess der Konfiguration von Covenant und dessen Verwendung zur Ausführung von Payloads auf kompromittierten Hosts.
Hinweis: Dieser Beitrag demonstriert die Fähigkeiten von Covenant Stand Mitte September 2019.
1. Covenant installieren
Zuerst müssen wir Covenant auf einem Host-Computer installieren, der sowohl als Covenant-Datenbank als auch als Managementanwendung fungiert, die die Anwendungsagenten, bekannt als grunts, steuert.
Voraussetzungen
Für diesen Blogbeitrag habe ich Covenant auf einer Windows 10-Workstation installiert, aber jedes aktuelle Windows Server-Betriebssystem oder jede Linux-Distribution, die .NET Core unterstützt, sollte ebenfalls problemlos funktionieren.
Folgende Anwendungen müssen auf dem Rechner, der Covenant hostet, installiert sein:
Ausgewählte verwandte Inhalte:
Installationsprozess
Angesichts der modernen, plattformübergreifenden Architektur von Covenant gibt es keine altmodische Installationsdatei. Stattdessen müssen wir das Projekt-Git-Repository klonen und dann die Anwendung mit den folgenden Befehlen bauen und ausführen:
git clone --recurse-submodules https://github.com/cobbr/Covenant
cd Covenant/Covenant
dotnet build
dotnet run
Alternativ könnten wir Covenant in einem Docker-Container ausführen.
2. Erstellen Sie ein Konto.
Mit dem laufenden Covenant-Dienst können wir über den Standard-Webport 7443 auf die Covenant-Anwendungsoberfläche zugreifen. Es wird uns aufgefordert, ein Benutzerkonto einzurichten:
Nach Abschluss des Registrierungsprozesses werden wir zur Seite für die Benutzerverwaltung weitergeleitet:
Das Menü auf der linken Seite ermöglicht es uns, zu den verschiedenen Funktionen von Covenant zu navigieren.
3. Konfigurieren Sie einen Listener.
Listener ermöglichen es Grunts, mit der Covenant-Anwendung zu kommunizieren. Standardmäßig sind keine Listener konfiguriert, daher müssen wir einen einrichten. Klicken Sie im linken Menü auf Listeners um die Listener-Seite zu öffnen:
Klicken Sie dann auf die Schaltfläche „Create“, um die Seite zum Erstellen eines HTTP-Listeners zu öffnen:
Wir müssen einige der bereitgestellten Werte aktualisieren:
- Name — Standardmäßig verwendet Covenant einen einfachen „GUID“-Typnamen. Fühlen Sie sich frei, ihn in etwas Lesbareres zu ändern.
- BindAddress und ConnectAddress — Stellen Sie sicher, dass beide eine Adresse angeben, die von den Grunts erreicht werden kann.
- UseSSL — Wenn Sie SSL verwenden möchten, müssen Sie eine SSL-Zertifikatsdatei und ein Passwort angeben.
Sobald die Konfiguration abgeschlossen ist, klicken Sie auf die Schaltfläche Create um den Listener zu erstellen und zu aktivieren.
4. Erstellen Sie einen Launcher.
Als Nächstes müssen wir einen Launcher erstellen. Launcher werden verwendet, um entfernte Hosts in Grunts zu verwandeln und sie mit der Covenant-Anwendung zu verbinden. Sie kommen typischerweise in Form eines Payload-Pakets, das auf einem entfernten Host ausgeführt wird. Jeder Launcher ist mit einem Listener gekoppelt.
Klicken Sie im linken Menü der Seite Benutzerverwaltung auf Launchers. Sie werden eine Liste von Arten von Launchern sehen. Der Binary Launcher, der zur Erstellung benutzerdefinierter Binärdateien verwendet wird, ist einer der einfachsten Launcher in der Anwendung, also wählen wir für unseren ersten Launcher Binary.
Die Konfigurationsseite wird geöffnet:
Geben Sie die folgenden Konfigurationsoptionen an:
- Listener — Geben Sie den Listener an, den der neue Launcher verwenden wird. Verwenden wir den HTTP-Listener, den wir zuvor erstellt haben:
- Vorlage — Verwenden wir die Vorlage direkt aus der Box GruntHTTP:
- Verzögerung und Jitter — Diese Einstellungen steuern, wie oft ein Grunt mit Covenant kommuniziert. Wir können die Standardwerte beibehalten.
- ConnectAttempts und KillDate — Diese Einstellungen steuern, wann ein Grunt aufhören wird, mit Covenant zu kommunizieren. Auch hier können wir die Standardwerte beibehalten.
Sobald die Konfiguration abgeschlossen ist, klicken Sie auf die Schaltfläche Generate um den neuen Launcher zu erstellen und zur Konfigurationsseite zurückzukehren.
5. Erstellen Sie einen Grunzer, indem Sie den Launcher ausführen.
Als Nächstes müssen wir den Launcher-Payload speichern: Klicken Sie auf Download und dann auf Datei speichern.
Kopieren Sie als Nächstes die gespeicherte Datei auf den gewünschten Host und führen Sie sie aus.
Der neu registrierte Grunt wird in unserem Dashboard in Covenant erscheinen:
6. Weisen Sie Aufgaben dem Grunzen zu.
Im linken Menü der Benutzerverwaltungsseite klicken Sie auf Grunts und öffnen dann den Grunt, den wir gerade registriert haben. Der Info-Tab bietet Details über seinen Verbindungsstatus und Funktionalität:
Um unserem Grunzer eine Aufgabe zuzuweisen, müssen wir auf den Tab „Task“ klicken.
Beispiel 1: Machen Sie einen Screenshot.
Zuerst nehmen wir an, wir möchten, dass der Grunt einen Screenshot vom Desktop des aktiven Benutzers macht. Wir wählen Screenshot aus dem Aufgaben-Dropdown-Menü und klicken dann auf die Schaltfläche Task unten, um diese Aktion sofort auf dem Grunt auszuführen:
Aktualisieren Sie die Seite, um den aktualisierten Status der Aufgabe zu sehen. Es wird angezeigt, dass die Aufgabe abgeschlossen ist und ihr Ergebnis bereitstellt, das in diesem Fall einfach ein Screenshot ist. Beachten Sie, dass das Ergebnis einer Aufgabe vom Typ der Aufgabe abhängt.
Beispiel 2: Führen Sie Mimikatz aus.
Lassen wir den Grunt eine weitere Aufgabe ausführen: Starten Sie Mimikatz.
Wir müssen zurück zum Aufgaben-Tab auf der Detailseite unseres Grunts navigieren. Dann wählen wir Mimikatz aus dem Aufgaben-Dropdown aus.
Viele Aufgaben verfügen über einen Satz anpassbarer Eingabeparameter. Mimikatz-Aufgaben haben einen „Command“-Eingabeparameter, der es uns ermöglicht festzulegen, welchen Mimikatz-Befehl wir ausführen möchten. Praktischerweise ist er bereits mit dem Befehl „sekurlsa::logonPasswords“ vorbelegt, der in Speicher gespeicherte Passwörter entdeckt. Lassen Sie uns diese Aufgabe unserem Grunt zuweisen und sehen, was passiert.
Es kommt gerade so vor, dass ein Domain Admin-Konto auf diesem Grunt-Host angemeldet war – daher können wir im Task-Output das Passwort des Domain Admins im Klartext sehen!
Die Verwendung von Mimikatz mit Covenant hilft Gegnern, Entdeckung zu vermeiden, da Covenant Aufgaben nicht direkt auf dem Grunt-Host speichert. Stattdessen wird die Aufgabenlast dynamisch über die Clientverbindung kompiliert und zum Zeitpunkt der Aufgabenstellung bereitgestellt. Darüber hinaus wird jedes Mal, wenn ein neuer Grunt erstellt oder einem Grunt eine neue Aufgabe zugewiesen wird, der relevante Code neu kompiliert und mit ConfuserEx verschleiert, was statische Lasten vermeidet, die leichter zu erkennen wären. Tatsächlich wurden die hier beschriebenen Schritte auf meinem Rechner durchgeführt, während Windows Defender aktiviert und auf dem neuesten Stand war, und dennoch wurden die Mimikatz-Aufgaben des Grunts ohne Probleme ausgeführt.
Überprüfung der Aufgabenhistorie und der Ergebnisse.
Covenant bietet eine klare Historie der ausgeführten Aufgaben. Klicken Sie im linken Menü der Seite Benutzerverwaltung auf Taskings:
Sie können sowohl die Screenshot-Aufgabe als auch die Mimikatz-Aufgabe sehen, die wir zuvor ausgeführt haben. Klicken Sie auf eine beliebige Zeile, um die Parameter der Aufgabe und die vollständige Ausgabe anzuzeigen.
Beachten Sie, dass viele Aufgaben auch Elemente ihrer Ausgabe auf der Data-Seite speichern. Klicken Sie auf die verschiedenen Registerkarten, um Anmeldeinformationen, Indikatoren, heruntergeladene Artefakte und Bildschirmfotos anzusehen. Zum Beispiel hier sind die von unserer Mimikatz-Aufgabe entdeckten Anmeldeinformationen:
Und hier ist ein Screenshot, der von unserer anderen Aufgabe aufgenommen wurde:
Beispiel 3: Laden Sie eine Datei herunter.
Jetzt führen wir noch eine Aufgabe auf unserem Grunt aus, um eine Datei herunterzuladen, damit wir sie auf dem Tab Downloads ansehen können.
Angenommen, wir haben entdeckt, dass es eine Datei auf unserem Grunt-Host namens MySecretDocument.txt gibt. Verwenden wir die Download-Aufgabe, um eine Kopie dieser Datei für uns selbst zu erhalten!
Durch das Ausführen dieser Aufgabe wird eine Kopie der Datei abgerufen und sofort im Downloads-Tab verfügbar gemacht:
Diese Aufgabe ist an sich einfach, hat aber einige faszinierende Anwendungsfälle, wenn man bedenkt, dass wir diese Aufgabe mit den Rechten des Benutzers ausführen können, der den Grunt-Launcher ausgeführt hat, oder mit Anmeldeinformationen, die wir über andere Aufgaben erhalten haben.
Fazit
Covenant bietet bereits eine breite Palette an Aufgaben, und die Liste wächst täglich dank der Beteiligung der Open-Source-Community. Dieses Projekt wird sehr wahrscheinlich eine spannende Zukunft haben und ist definitiv einen Blick wert!
Teilen auf
Erfahren Sie mehr
Über den Autor
Joe Dibley
Sicherheitsforscher
Security Researcher bei Netwrix und Mitglied des Netwrix Security Research Teams. Joe ist ein Experte für Active Directory, Windows und eine Vielzahl von Unternehmenssoftwareplattformen und -technologien. Joe erforscht neue Sicherheitsrisiken, komplexe Angriffstechniken sowie zugehörige Milderungs- und Erkennungsmaßnahmen.
Erfahren Sie mehr zu diesem Thema
Beispiel für Risikoanalyse: Wie man Risiken bewertet
Das CIA-Dreieck und seine Anwendung in der realen Welt
Erstellen Sie AD-Benutzer in Massen und senden Sie deren Anmeldeinformationen per E-Mail mit PowerShell
So fügen Sie AD-Gruppen hinzu und entfernen Objekte in Gruppen mit PowerShell
Active Directory-Attribute: Letzte Anmeldung