You are currently viewing Cobalt Strike release Version 4.8: (System) Call Me Maybe

Cobalt Strike release Version 4.8: (System) Call Me Maybe

Cobalt Strike 4.8 ist jetzt verfügbar. Diese Version bietet Unterstützung für Systemaufrufe, Optionen zur Angabe von Payload Guardrails, einen neuen Token-Speicher und mehr.

Ursprünglich wollten Fortra diese Version Ende 2022 herausbringen, aber der Fortschritt wurde durch die Patches 4.7.1 und 4.7.2 gebremst, die Fortra herausbringen musste, um Sicherheitslücken zu schließen, die in der Version 4.7 gemeldet wurden. Sie haben ein paar Entwicklungszyklen damit verbracht, den Code einer Sicherheitsüberprüfung zu unterziehen und an einigen technischen Problemen zu arbeiten, und dann kam die Urlaubszeit. Jetzt ist sie aber da, und besser spät als nie!

Unterstützung für Systemaufrufe

Mit dieser Version wird die Unterstützung für direkte und indirekte Systemaufrufe hinzugefügt. Fortra hat die Unterstützung für eine Reihe von Systemaufrufen hinzugefügt, insbesondere:

CloseHandle
CreateFileMapping
CreateRemoteThread
CreateThread
GetThreadContext
MapViewOfFile
OpenProcess
OpenThread
ResumeThread
SetThreadContext
UnmapViewOfFile
VirtualAlloc
VirtualAllocEx
VirtuellFrei
VirtualProtect
VirtualProtectEx
VirtualQuery
Das Dialogfeld für die stufenlose Beacon-Nutzlastgenerierung wurde aktualisiert, damit Sie die zur Ausführungszeit zu verwendende Systemaufrufmethode angeben können. Die verfügbaren Optionen sind:

Keine: Verwendung der Standard-Windows-API-Funktion
Direkt: Verwendet die Nt-Version der Funktion Indirekt: Sprung zu der entsprechenden Anweisung innerhalb der Nt-Version der Funktion

Es ist wichtig zu beachten, dass es einige Befehle und Workflows gibt, die ein neues Beacon injizieren oder erzeugen, die es nicht erlauben, die anfängliche Systemaufrufmethode festzulegen. Diese Befehle/Arbeitsabläufe sind:

elevate
injizieren
springen
spawnen
spawnas
spawnu
teamserver antwortet auf eine stufenlose Nutzlastanforderung
teamserver als Antwort auf eine Anfrage für externe C2-Nutzlast
Die stage.syscall_method im MalleableC2-Profil steuert die Methode, die zur Ausführungszeit verwendet wird, und Sie können den Befehl syscall-method [method] verwenden, um die Methode zu ändern, die für nachfolgende Befehle verwendet wird. Außerdem wird mit syscall-method ohne Argumente die aktuelle Methode abgefragt und zurückgegeben.

Die Unterstützung von Systemaufrufen ist etwas, das Fortra in zukünftigen Versionen weiter aktualisieren und verbessern will. Ihr Feedback dazu ist willkommen.

Unterstützung für Payload-Guardrails

Es wurde Unterstützung für Payload-Guardrails hinzugefügt, die auf Listener-Ebene festgelegt und dann, falls erforderlich, bei der Generierung einer Payload überschrieben werden können.

Guardrails können auf der Grundlage der folgenden Kriterien festgelegt werden:

  • IP-Adresse: Dabei kann es sich um eine einzelne IP-Adresse oder um einen Bereich handeln, bei dem das ganz rechte Oktett durch einen Platzhalter ersetzt wird. Zum Beispiel sind 123.123.123.123, 123.123.123., 123.123..* und 123...* alles gültige Eingaben. 123..123. ist es nicht.
  • Benutzername: Dies kann ein bestimmter Benutzername sein, oder Sie können einen Platzhalter voranstellen/anhängen (z. B. user oder user). Bei der Eingabe des Benutzernamens wird die Groß- und Kleinschreibung nicht berücksichtigt.
  • Servername: Auch hier kann es sich um einen bestimmten Servernamen handeln, oder Sie können einen Platzhalter voranstellen/anhängen (z. B. server oder server). Bei der Eingabe des Servernamens wird nicht zwischen Groß- und Kleinschreibung unterschieden.
  • Domäne: Wie der Benutzername und der Servername kann auch das Feld Domäne entweder einen bestimmten Domänennamen enthalten oder Sie können einen Platzhalter voranstellen (z. B. Domäne oder Domäne). Das Feld für den Domänennamen unterscheidet auch nicht zwischen Groß- und Kleinschreibung.

Der Listener-Dialog hat eine neue Option „Guardrails“ am unteren Rand des Bildschirms, mit der Sie Guardrails für diesen Listener festlegen und aktualisieren können.

Bei der Generierung einer Nutzlast wird der Guardrails-Wert aus dem zugehörigen Listener als Standardwert verwendet.

Sie können die Standardwerte verwenden oder sie außer Kraft setzen, um spezifische Werte für die zu erstellende Nutzlast festzulegen. Wenn Sie hier bestimmte Werte einstellen, werden die auf Hörerebene eingestellten Standardwerte nicht geändert.

Multi-Byte-Unterstützung für die Verschleierung der Importtabelle der Reflective DLL von Beacon

Fortra hat eine Änderung an der Obfuskationsroutine vorgenommen, die für die Option stage.obfuscate MalleableC2 verwendet wird und die sich darauf bezieht, wie die Importtabelle der Beacon Reflective DLL verschleiert wird.

Ein Teil dieses Prozesses bestand darin, von einem festen Ein-Byte-XOR-Schlüssel zu einem zufällig generierten Multi-Byte-XOR-Schlüssel zu wechseln. Die Ein-Byte-XOR-Maske war leicht zu signieren und wurde von Tools wie YARA erkannt. Die Umstellung auf einen zufällig generierten Multi-Byte-XOR-Schlüssel sollte diese Probleme beheben.

Sleep Mask Updates

An der Sleep Masks wurden eine Reihe von Aktualisierungen vorgenommen. Die wichtigste Änderung besteht darin, dass das Größenlimit für die Sleep-Mask von 8192 auf 16384 Byte erhöht wurde. Weitere Änderungen sind:

Unterstützung für die Verwendung von Systemaufrufen mit der MASK_TEXT_SECTION-Fähigkeit
Die Hinzufügung von define-Tags für die Windows-API-Funktionen, um die Notwendigkeit der LIBRARY$Function-Syntax zu beseitigen
Die Implementierung der Umgehung des Ruhezustands durch Stack-Spoofing (nur x64). Zu den damit verbundenen Änderungen gehören die Hinzufügung einer Umgehung für Control Flow Guard (CFG) sowie die Hinzufügung eines Hilfsprogramms (getFunctionOffset)

Token Store

Eine Änderung, die Fortra schon seit einiger Zeit im Hinterkopf hatten, war die Hinzufügung eines Tokenspeichers, um den Austausch von Zugriffstokens zu erleichtern. Windows-Tokens sind prozessspezifisch; daher hat jeder Beacon seinen eigenen Token-Speicher mit eigenen Token. Bitte beachten Sie, dass diese Token daher nur von diesem speziellen Beacon verwendet werden können.

Der Tokenspeicher basiert auf dem neuen Befehl token-store. Der Befehl unterstützt eine Reihe von Optionen, die bestimmte Funktionen ausführen (alle werden von der Tabulatorvervollständigung unterstützt). Die verfügbaren Funktionen sind wie folgt:

token-store steal [pid,…]
Dies stiehlt das/die Token von der/den angegebenen PID(s). Verwenden Sie Kommas, um jede PID zu trennen. Dieser Befehl stiehlt den Token und legt ihn im Tokenspeicher ab, gibt sich aber nicht sofort als solcher aus. Zu diesem Zweck sollte der Befehl steal-and-use verwendet werden (wobei zu beachten ist, dass steal-and-use nur eine einzige PID unterstützt). Dieser Befehl unterstützt die optionale OpenProcessToken-Zugriffsmaske wie der bestehende Befehl steal_token.

token-store use [id]
Hiermit wird Beacon beauftragt, den Token mit der angegebenen ID aus dem Token-Speicher zu verwenden.

token-store steal-and-use [pid]
Mit diesem Befehl können Sie das Token von der angegebenen PID stehlen, es dem Tokenspeicher hinzufügen und sofort verwenden. Dieser Befehl unterstützt die optionale OpenProcessToken-Zugriffsmaske wie der bestehende Befehl steal_token.

token-store show
Zeigt die Token im Tokenspeicher an.

token-store remove [id,…]
Hiermit können Sie das/die Token, die der/den spezifischen ID(s) entsprechen, aus dem Tokenspeicher entfernen. Verwenden Sie Kommas, um mehrere IDs anzugeben.

token-store remove-all
Hiermit werden alle Token aus dem Tokenspeicher entfernt.

Ein weiterer Punkt ist, dass Token auch über die Prozessliste in der GUI gestohlen werden können. Stehlen Sie ein Token auf die übliche Weise (d.h. Explore -> Process List, wählen Sie eine oder mehrere PIDs aus und klicken Sie auf Steal Token) und stellen Sie dann sicher, dass das Kontrollkästchen „store token in the token store“ aktiviert ist, bevor Sie das Token stehlen. Sie können auch mehrere Beacons auf einmal auswählen, bevor Sie die Prozessliste öffnen.

Schließlich haben wir auch entsprechende Aggressor-Funktionen zu den oben beschriebenen Optionen implementiert, d.h.:

btoken_store_remove
btoken_store_show
btoken_store_steal_and_use
btoken_store_steal
btoken_store_remove_all
btoken_store_use

ETW Blinding

Mit dieser Version wurde auch die Unterstützung für ETW Blinding durch Patches für die Befehle execute-assembly und powerpick hinzugefügt. Obwohl die Unterstützung in dieser Version begrenzt ist, ist dies etwas, das wir in zukünftigen Versionen weiter ausbauen werden.

Die Befehle execute-assembly und powerpick haben jetzt einen optionalen PATCHES-Parameter, der wie folgt angegeben wird:

execute-assembly „[PATCHES: [patch-rule] [patch-rule] [patch-rule] [patch-rule]]“ [/Pfad/zur/Datei.exe] [Argumente]

und

powerpick „[PATCHES: [patch-rule] [patch-rule] [patch-rule] [patch-rule]]“ [commandlet] [argumente]

Der optionale Parameter PATCHES kann Funktionen im Speicher für den Prozess ändern. Es können bis zu vier Patch-Regeln angegeben werden (durch Leerzeichen getrennt), wobei jede Patch-Regel aus einer Bibliothek, einer Funktion, einem Offset und einem Hex-Patch-Wert besteht, z. B.: [library],[function],[offset],[hex-patch-value], wobei:

Bibliothek kann 1 – 260 Zeichen lang sein
Funktion kann 1-256 Zeichen lang sein
offset ist der Offset vom Beginn der ausführbaren Funktion und kann 0 – 65535 sein
hex-patch-value kann 2 – 200 Hex-Zeichen (0 – 9, A – F) lang sein und die Länge muss eine gerade Zahl sein (Hex-Paare)
Weitere Informationen über die Syntax von patch-rule finden Sie in der Dokumentation.

Daten beim Start von Teamserver synchronisieren

In Cobalt Strike gab es lange Zeit ein Problem, bei dem Daten, die von einem Ziel abgerufen wurden (z. B. Screenshots, Keylog-Daten usw.), nach einem Neustart des Teamservers nicht mehr auf dem Client verfügbar waren. Dieses Problem wurde behoben, und die Daten, die zuvor für die Benutzeroberfläche „verloren“ waren, bleiben nun zwischen den Neustarts erhalten.

Wir haben auch ein neues Skript, clearteamserverdata, hinzugefügt, das zum Löschen aller Daten nach Abschluss eines Einsatzes verwendet werden kann.

Ändern der Verarbeitung des Ablaufdatums der Lizenz

Eine wichtige Aktualisierung im Zusammenhang mit der Produktsicherheit ist eine Änderung der Verarbeitung des Ablaufdatums der Lizenz. Bisher wurde das Ablaufdatum beim Starten des teamserver überprüft, und wenn es gültig war, konnte der teamserver gestartet werden. Es wurden keine weiteren Überprüfungen durchgeführt, und der Teamserver konnte so lange laufen, bis er vom Bediener abgeschaltet wurde.

Wir haben diese Verarbeitung verschärft, so dass das Ablaufdatum der Lizenz täglich geprüft wird. Der Grund für das frühere Verhalten war, dass es nicht immer bequem oder logistisch möglich war, mitten in einem Einsatz ein Update durchzuführen (um eine neue Autorisierungsdatei mit einem aktualisierten Ablaufdatum zu holen). Auch war es unter diesen Umständen nicht möglich, den Teamserver nach einer Aktualisierung neu zu starten. Wir haben in der neuen Verarbeitung Abhilfemaßnahmen für diese Szenarien getroffen, so dass die Aktualisierung Ihrer Autorisierungsdatei keine Auswirkungen auf den Betrieb hat. Wenn Sie Ihre Lizenz aktualisieren müssen, während ein Einsatz läuft, lesen Sie bitte in der Dokumentation nach, wie Sie dies tun können. Wir empfehlen Ihnen jedoch, das Ablaufdatum Ihrer Lizenz zu berücksichtigen, bevor Sie einen neuen Auftrag starten, um diese Situation möglichst zu vermeiden.

Um sicherzustellen, dass Sie nicht von einer ablaufenden Lizenz überrascht werden, haben wir einige neue Banner in die Client-Benutzeroberfläche eingefügt.

Ab 45 Tage vor Ablauf Ihrer Lizenz wird im Client ein Warnbanner angezeigt, das Sie darüber informiert, dass Ihre Lizenz abläuft und wann sie abläuft. Diese Warnmeldung kann ausgeblendet werden, erscheint aber jeden Tag erneut, wenn das Ablaufdatum überprüft wird. So haben Sie genügend Zeit, Ihren Lizenzschlüssel zu erneuern, falls Sie dies nicht bereits getan haben:

Wenn Sie es versäumen, Ihre Lizenz vor Ablauf zu erneuern, haben Sie eine 14-tägige Nachfrist, um dies zu tun. Während dieser Nachfrist wird ein Fehlerbanner angezeigt, das Sie nicht abstellen können:

Wenn Ihre Lizenz nach Ablauf der Nachfrist nicht erneuert und die Autorisierungsdatei nicht aktualisiert wurde, wird der Teamserver heruntergefahren und Sie können ihn erst wieder starten, wenn Sie Ihre Lizenz erneuert haben.

Änderungen der Arbeitsweise

Zusätzlich zu den bereits erwähnten Funktionen haben wir eine Reihe kleinerer Änderungen vorgenommen, die vor allem von unseren Nutzern gewünscht wurden, und zwar wie folgt

Mehr Flexibilität bei der Festlegung der Sleep-Time

Eine kleine Änderung, die von einem Benutzer gewünscht wurde, bestand darin, die Einstellung der Schlafzeit zu vereinfachen. Anstatt die Schlafzeit nur in Sekunden anzugeben, können Sie jetzt auch Tage, Stunden und Minuten angeben, indem Sie diesen Werten jeweils ein „d“, „h“ und „m“ anhängen.

Ein Anwendungsbeispiel ist sleep 2d 13h 45m 8s 30j, was soviel bedeutet wie „2 Tage, 13 Stunden, 45 Minuten, 8 Sekunden schlafen mit 30% Jitter“.

Wir haben auch eine neue Aggressor-Funktion hinzugefügt, bsleepu, die auf die gleiche Weise funktioniert.

Aktuelles Token in der UI anzeigen

Ein weiterer Benutzerwunsch war die Anzeige des aktuellen Tokens in der Client-Benutzeroberfläche. Dies passte gut zum neuen Token-Speicher und Sie können nun das aktuelle Token in der Tabellenansicht und der Statusleiste in Klammern neben dem Benutzernamen sehen.

Im Zusammenhang mit dieser Änderung wurde auch das Problem behoben, dass make_token aufgrund einer Einschränkung der Windows-API den falschen Benutzernamen meldete (d. h. den Benutzernamen des aktuellen Beacon-Prozesses). Dieses Problem wurde behoben und der korrekte Benutzername erscheint in Klammern.

Kopieren/Einfügen aus dem Beacon-Ausgabefenster

Wir haben Unterstützung für das Kopieren und Einfügen von Befehlen aus dem Beacon-Ausgabebereich hinzugefügt.

STRG+C kopiert und STRG+X schneidet den ausgewählten Text entweder aus dem Ausgabebereich oder der Befehlszeile aus. Text kann nur im Ausgabebereich oder in der Befehlszeile ausgewählt werden, nicht in beiden. CTRL+V fügt Text aus der Zwischenablage in die Befehlszeile ein. Dies funktioniert in jedem Konsolenfenster (z. B. Beacon-Konsole, SSH-Konsole, Skriptkonsole, Ereignisprotokoll und Webprotokoll).

Verkettung mehrerer Befehle in einem einzigen Mimikatz-Aufruf

Der Befehl mimikatz wurde aktualisiert, um die Verkettung mehrerer Befehle in einer einzigen Operation zu unterstützen. Dies gilt auch für die Aggressor-Funktionen bmimikatz und bmimikazt_small (obwohl bmimikatz_small auf lsadump::dcsync, sekurlsa::logonpasswords und sekurlsa::pth beschränkt ist).

Befehle können verkettet werden, indem man z.B. ein Semikolon als Trennzeichen zwischen den Befehlen einfügt:
mimikatz standard::coffee;standard::coffee

Beachten Sie, dass das Semikolon immer noch durchbrochen werden kann, wenn es in einem Befehl erforderlich ist (z. B. „\;“). Außerdem ist die Befehlslänge auf 511 Zeichen begrenzt, um sicherzustellen, dass das letzte Zeichen in der Zeichenkette EOS (\0) ist.

Beendigungsfunktion im stufenlosen Windows-Dialog für ausführbare Dateien festlegen

In der Version 4.7 wurde eine Änderung vorgenommen, die es Ihnen ermöglicht, die Beendigungsoption (entweder „Thread“ oder „Prozess“) im Dialogfeld „Stageless Payload Generator“ anzugeben. Eine ähnliche Änderung wurde jetzt im Dialogfeld „Stageless Windows Executable“ vorgenommen, in dem Sie ebenfalls die Exit-Option („Thread“ oder „Prozess“) angeben können.

Arsenal Kit Prüfsumme

Eine letzte Änderung, die ebenfalls von einem Benutzer gewünscht wurde, ist die Hinzufügung einer Prüfsumme für das Arsenal Kit. Dies ist nun geschehen und kann unter https://verify.cobaltstrike.com/arsenal-kit gefunden werden.

Eine vollständige Liste der Neuerungen in Cobalt Strike 4.8 finden Sie in den Versionshinweisen. Während lizenzierte Benutzer das Update-Programm ausführen können, um die neueste Version zu erhalten, empfehlen wir, dass Sie Version 4.8 von Grund auf von der Website herunterladen, um die neue Update-Anwendung zu erhalten. Der Grund dafür ist, dass die TLS-Zertifikate auf download.cobaltstrike.com und verify.cobaltstrike.com bald aktualisiert werden und der vorhandene Updater Fehler meldet, wenn er nicht aktualisiert wird. Wenn Sie Cobalt Strike kaufen oder mehr erfahren möchten, kontaktieren Sie uns bitte.