Dies ist der erste Teil einer Reihe von Blogbeiträgen über meine aktuelle Arbeit mit dem Open-Source-Framework C2 Covenant.
Seit geraumer Zeit habe ich versucht, die neueste Version von Rubeus im Covenant zu integrieren. Obwohl wir bei der avantguard cyber security GmbH Covenant in letzter Zeit nicht mehr aktiv eingesetzt haben und auf andere, kommerzielle C2-Frameworks umgestiegen sind, ist Covenant immer noch mein Lieblings-C2. In Laboren und Forschungsprojekten verwende ich daher immer den Entwicklungszweig von Covenant und versuche, verschiedene Aspekte davon zu verbessern. Manchmal führt das zu viel mehr Arbeit, als ich zunächst erwarte.
Der wichtigste Grund für die Aktualisierung von Rubeus ist, dass in der Version, die im Entwicklungszweig von Covenant verwendet wird (v1.5.0), ein Fehler bei der Berechnung des Hashs eines Maschinenkontos vorliegt. Dies hat mich einige Zeit in einem Labor gekostet, da ich mir dieses Fehlers nicht bewusst war und es ein Dutzend weiterer Dinge gab, die bei diesem Schritt des Angriffs hätten falsch sein können. Aber auch ohne diesen speziellen Fehler hat Rubeus eine Menge interessanter Aktualisierungen erfahren, insbesondere für AD CS-bezogene Angriffe.
Ich erspare es mir, die Details zu den Fehlern, auf die ich gestoßen bin, aufzulisten und zeige stattdessen einfach meine Lösung. Wer die Fehler sehen möchte, ersetzt einfach den Rubeus-Quellordner in Covenant und führt einen Rubeus-Task auf einem Grunt aus.
Mit den folgenden Schritten konnte ich die neueste Rubeus-Version im "dev"-Branch von Covenant kompilieren:
- Der neueste Rubeus-Quellcode muss heruntergeladen und in den Ordner ReferenceSourceLibrary von Covenant (Covenant/Covenant/Data/ReferenceSourceLibraries/Rubeus) kopiert werden. Es muss darauf geachtet werden, dass die Ordnerstruktur gleich bleibt.
- In der Weboberfläche von Covenant muss auf den Menüpunkt Tasks (das Menü auf der linken Seite, nicht der Tab in einem aktiven Grunt) navigiert werden. Hier muss der Rubeus-Task gefunden und bearbeitet werden. Es ist wichtig zu wissen, dass Rubeus seit Version 1.6.4 nur noch mit .NET 4.0+ kompatibel ist. Das bedeutet, dass Net35 aus dem Dropdown-Menü CompatibleDotNetVersions entfernt werden muss. Außerdem muss UnsafeCompile aktiviert werden.
Zudem müssen fünf ReferenceAssemblies zum Task hinzugefügt werden:
- System.Data.dll (Net40)
- System.Security.dll (Net40)
- System.Data.DataSetExtensions.dll (Net40)
- System.DirectoryServices.Protocols.dll
- System.XML.dll
- Nachdem die Änderungen gespeichert wurden, muss zum Tab "Reference Source Libraries" des Tasksmenüs gewechselt werden. Hier muss wieder Rubeus bearbeitet werden. Bei mir führte dies zu einem Fehler, der meine Covenant-Weboberfläche zum Absturz brachte, aber vielleicht funktioniert es für andere Covenant-Instanzen. Net35 muss auch hier aus den CompatibleDotNetVersions entfernt werden. Falls das Speichern der Änderungen wie bei mir zu einem Absturz führt, erzielen folgende Schritte die gewünschte Änderung:
- Den Covenant-Server mit Ctrl+C stoppen
- Die Konfiguration direkt in der Datenbank von Covenant ausführen: sqlitebrowser Covenant/Covenant/Data/covenant.db
- In der Tabelle "ReferenceSourceLibraries" muss der Eintrag für Rubeus bearbeitet werden. CompatibleDotNetVersions muss von [0,1] nach [1] geändert werden.
- Die Änderungen können nun gespeichert und der SQLite-Browser geschlossen werden. Für den letzten Schritt muss die Optimierung für den Rubeus-Task deaktiviert werden. In der Optimierung scheint es einen Fehler zu geben, welcher dazu führt, dass Namespaces entfernt werden, welche eigentlich benötigt wären. Zeile 212 von Covenant/Covenant/Models/Grunts/GruntTask.cs muss wie folgt aussehen:
Optimize = !this.ReferenceSourceLibraries.Select(RSL => RSL.Name).Contains("Seatbelt") && !this.ReferenceSourceLibraries.Select(RSL => RSL.Name).Contains("Rubeus")
- Mittels dotnet clean und dotnet run muss Covenant neu gebaut und gestartet werden. Wenn alles funktioniert hat, kann nun in einem aktiven Grunt ein Rubeus-Befehl ausgeführt werden, welcher korrekt kompiliert wird und die aktualisierte Version anzeigt.
Ich habe noch nicht versucht, die anderen Quellbibliotheken zu aktualisieren. SharpSploit ist bereits die neueste Version, aber es könnte interessant sein, auch die anderen Bibliotheken zu aktualisieren. Ich hoffe, dass dieser Blog-Beitrag anderen helfen kann, die mit den gleichen Problemen zu kämpfen haben, wenn sie versuchen, Dinge im Covenant zu aktualisieren oder neue Tasks hinzuzufügen. Es kann helfen, die Optimierung zu deaktivieren und es soll immer daran gedacht werden, die erforderlichen ReferenceAssemblies zum Task hinzuzufügen.
Wer Covenant verwendet, kann sich gerne unser GitHub Repo anschauen, wo wir laufend Tasks und Ergänzungen veröffentlichen werden: Covenant-Additions
Vielen Dank fürs Lesen! Wie immer können Fragen oder Rückmeldungen gerne an research@avantguard.io gesendet werden, ansonsten bin ich auch im BloodHoundGang Slackchannel (Username @jannlemm0913) zu finden.