Magic Quadrant™ für Privileged Access Management 2025: Netwrix zum vierten Jahr in Folge anerkannt. Laden Sie den Bericht herunter.

Plattform
Ressourcen­zentrumBlog
Covenant C2 Framework: Das komplette Tutorial

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:

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
      
Image

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:

Image

Nach Abschluss des Registrierungsprozesses werden wir zur Seite für die Benutzerverwaltung weitergeleitet:

Image

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:

Image

Klicken Sie dann auf die Schaltfläche „Create“, um die Seite zum Erstellen eines HTTP-Listeners zu öffnen:

Image

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.

Image

Die Konfigurationsseite wird geöffnet:

Image

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:
Image
  • Vorlage — Verwenden wir die Vorlage direkt aus der Box GruntHTTP:
Image
  • 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.

Image

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:

Image

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:

Image

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:

Image

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.

Image

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!

Image

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:

Image

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:

Image

Und hier ist ein Screenshot, der von unserer anderen Aufgabe aufgenommen wurde:

Image

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!

Image

Durch das Ausführen dieser Aufgabe wird eine Kopie der Datei abgerufen und sofort im Downloads-Tab verfügbar gemacht:

Image

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

Asset Not Found

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.