
pyCobaltHound ist eine Aggressor-Skripterweiterung für Cobalt Strike, die eine tiefe Integration zwischen Cobalt Strike und Bloodhound bieten soll.
pyCobaltHound ist eine Aggressor-Skript-Erweiterung für Cobalt Strike, die eine tiefe Integration zwischen Cobalt Strike und Bloodhound ermöglicht.
pyCobaltHound unterstützt Red-Team-Operatoren, indem es:
BloodHound-Datenbank abfragt, um Eskalationspfade zu entdecken, die durch neu gesammelte Anmeldedaten eröffnet wurden.Um dies zu erreichen, verwendet pyCobaltHound einen Satz eingebauter Abfragen. Operatoren können auch eigene Abfragen hinzufügen/entfernen, um die Überwachungsfähigkeiten von pyCobaltHound anzupassen. Dies gibt ihnen die Flexibilität, während Einsätzen spontan an engagement-spezifische Ziele (Benutzer, Hosts usw.) anzupassen.
pyCobaltHoundUm pyCobaltHound zu installieren, klonen Sie dieses Repository. Vergessen Sie nicht, das enthaltene Submodul ebenfalls zu klonen!
Sie können den folgenden Befehl verwenden:
git clone https://github.com/NVISOsecurity/pyCobaltHound.git --recurse-submodulesStellen Sie sicher, dass die folgenden Abhängigkeiten korrekt installiert sind:
PyCobalt ist eine Python-API für Cobalt Strike. Sie stellt viele Aggressor-Funktionen zur Verfügung, die direkt aus Python verwendet werden können.
Stellen Sie sicher, dass Python3+ installiert ist. Obwohl PyCobalt möglicherweise auch unter macOS und Windows funktioniert, haben wir es nur unter Linux getestet.
Es gibt zwei Möglichkeiten, die PyCobalt Python-Bibliothek zu verwenden:
pyCobaltHound verfolgt diesen Ansatz, indem es den Suchpfad innerhalb des Python-Programms mit der Variablen sys.path setzt.PyCobalt Python-Bibliothek installieren. Führen Sie dazu python3 setup.py install aus. Sie müssen pycobalthound.py anpassen, um sicherzustellen, dass die installierte Bibliothek anstelle derjenigen im enthaltenen Repository verwendet wird.PyCobalt-Projekt in Zukunft gewartet wird. Tatsächlich war das letzte Update des Projekts die Integration der Änderungen aus Cobalt Strike 4.2. Da pyCobaltHound jedoch nur grundlegende Aggressor-Funktionen zur Schnittstelle mit Cobalt Strike und dessen Operator nutzt, ist dies für pyCobaltHound kein großes Problem.PyCobalt-Submodul ist ein von uns erstellter Fork. Wir kontrollieren das PyCobalt-Repository jedoch nicht.PyCobalt enthält einige Skript-Konsolen-Befehle zur Verwaltung der laufenden Python-Skripte. Wenn Sie Ihr Aggressor-Skript neu laden, sollten Sie die Python-Skripte zuerst explizit stoppen. Andernfalls laufen sie endlos weiter und tun nichts. Während der Entwicklung von pyCobaltHound haben wir festgestellt, dass dies auch zu undefiniertem Verhalten führen kann.
Das Neuladen von pyCobaltHound kann wie folgt erfolgen:
aggressor> python-stop-all`
[pycobalt] Asking script to stop: /root/pycobalthound/pycobalthound.py
[pycobalt] Script process exited: /root/pycobalthound/pycobalthound.py
aggressor> reload example.cna`
[pycobalt] Executing script /root/pycobalthound/pycobalthound.py
Damit PyCobalt richtig funktioniert, können Sie PyCobalt nur in einem Aggressor-Skript aufrufen. Beachten Sie dies, wenn Sie pyCobaltHound zusammen mit anderen Aggressor-Skripten verwenden möchten, die ebenfalls PyCobalt nutzen. Unser Ansatz besteht darin, ein Aggressor-Skript mit Aufrufen von python() und include() für jedes PyCobalt-basierte Tool zu haben.
notify2 ist – oder war – ein Paket zur Anzeige von Desktop-Benachrichtigungen unter Linux. Wie wir später sehen werden, unterstützt pyCobaltHound verschiedene Möglichkeiten, den Operator zu benachrichtigen. notify2 wird unter Linux verwendet, um Benachrichtigungen an den Benachrichtigungs-Daemon über D-Bus zu senden.
Um dies zu aktivieren, muss notify2 mit folgendem Befehl installiert werden:
pip install notify2
Die Verwendung von pyCobaltHound in Cobalt Strike ist so einfach wie das Importieren des pycobalthound.cna Aggressor-Skripts in Ihren Client. Sobald dies geschehen ist, sollte ein pyCobaltHound-Menü in Ihrer Cobalt Strike-Menüleiste erscheinen.

Das ursprüngliche Ziel von pyCobaltHound war es, Cobalt Strikes Anmeldeinformations-Cache (Ansicht > Anmeldeinformationen) auf neue Einträge zu überwachen. Dies geschieht durch Reaktion auf das on_credentials-Ereignis, das Cobalt Strike auslöst, wenn Änderungen am Anmeldeinformationsspeicher vorgenommen werden.
Wenn dieses Ereignis ausgelöst wird, führt pyCobaltHound Folgendes aus:
Cobalt Strike empfangenen Daten.BloodHound-Datenbank existieren.BloodHound-Datenbank für jede neue Entität mit sowohl integrierten als auch benutzerdefinierten Abfragen.Da all dies asynchron zum Haupt-Cobalt Strike-Client stattfindet, sollte dieser Prozess Ihre Benutzeroberfläche nicht blockieren, sodass Sie weiterarbeiten können, während pyCobaltHound im Hintergrund ermittelt.
pyCobaltHound verwendet separate Caches pro Teamserver, um Probleme bei der Verwendung mehrerer Teamserver zu vermeiden.
Manchmal gibt es Situationen, in denen Sie bestimmte Benutzer (oder den gesamten Anmeldeinformationsspeicher) erneut untersuchen möchten. Dies kann der Fall sein, wenn Sie neue Daten in die BloodHound-Datenbank hochgeladen haben.
Da pyCobaltHound bereits alle Entitäten in Ihrem Anmeldeinformationsspeicher untersucht (und daher zwischengespeichert) haben sollte, wird es diese ohne Operator-Eingriff nicht gegen diese neuen Daten auswerten.
Den Betreibern stehen zwei Methoden zur Verfügung, um zu steuern, welche Entitäten zwischengespeichert werden.
In Fällen, in Sie eine bestimmte Entität (oder mehrere) aus dem Cache entfernen möchten, können Sie dies im Anmeldeinformations-Viewer tun (Ansicht > Anmeldeinformationen). Wählen Sie einfach Ihre Ziel(e) aus und klicken Sie auf die Option Aus Cache entfernen im pyCobaltHound-Menüeintrag.

In Fällen, in denen Sie alle Entitäten aus dem Cache entfernen möchten, können Sie dies im Hauptmenü von pyCobaltHound tun (Cobalt Strike > pyCobaltHound > Cache löschen). Dies ist besonders hilfreich, wenn Sie Ihren gesamten Anmeldeinformationsspeicher neu bewerten möchten.

Nachdem Sie Ihre Ziele aus dem Cache entfernt haben, können Sie pyCobaltHound manuell dazu auffordern, den Inhalt des Anmeldeinformationsspeichers erneut zu untersuchen. Dies folgt genau dem gleichen Prozess wie oben.
pyCobaltHound enthält Funktionen zur Interaktion mit bestehenden Beacon-Sitzungen. Diese finden Sie im Kontextmenü des Beacons. Beachten Sie, dass diese Befehle auf einem einzelnen Beacon oder einer Auswahl von Beacons ausgeführt werden können.

Diese Funktionalität ist besonders nützlich im Umgang mit Benutzern und Computern, deren Anmeldeinformationen (noch) nicht kompromittiert wurden, die aber effektiv unter unserer Kontrolle sind (z. B. weil wir einen Beacon unter ihrem Sitzungstoken laufen haben).
Die Funktion Als besessen markieren (pyCobaltHound > Als besessen markieren) kann verwendet werden, um einen Beacon (oder eine Sammlung von Beacons) in der BloodHound-Datenbank als besessen zu markieren.

Dieser Dialog fragt den Operator nach folgenden Informationen:
pyCobaltHound markiert Computer nur dann als besessen, wenn die Beacon-Sitzung als lokaler Administrator, SYSTEM oder mit hoher Integritätsebene als anderer Benutzer läuft.Die Funktion Untersuchen (pyCobaltHound > Als besessen markieren) kann verwendet werden, um die Benutzer und Hosts zu untersuchen, die einem Beacon (oder einer Sammlung von Beacons) zugeordnet sind.

Dieser Dialog fragt den Operator nach folgenden Informationen:
pyCobaltHound untersucht Computer nur dann, wenn die Beacon-Sitzung als lokaler Administrator, SYSTEM oder mit hoher Integritätsebene als anderer Benutzer läuft.pyCobaltHound untersucht alle Entitäten ohne Überprüfung der Integritätsebenen.pyCobaltHound enthält Funktionen zur freien Untersuchung von Entitäten. Diese finden Sie im Hauptmenü (Cobalt Strike > pyCobaltHound > Untersuchen).
Diese Funktionalität ist besonders nützlich im Umgang mit Benutzern und Computern, deren Anmeldeinformationen nicht kompromittiert wurden und die nicht unter unserer Kontrolle stehen.

Dieser Dialog fragt den Operator nach folgenden Informationen:
Das Einstellungsmenü von pyCobaltHound finden Sie unter Cobalt Strike > pyCobaltHound > Einstellungen.

pyCobaltHound speichert Ihre Einstellungen auf der Festplatte. Jedes Mal, wenn pyCobaltHound neu geladen wird, überprüft es die Existenz einer Einstellungsdatei und lädt die gespeicherten Einstellungen, falls eine vorhanden ist.
pyCobaltHound speichert eine Einstellungsdatei pro Teamserver, sodass auf verschiedenen Teamservern unterschiedliche Einstellungen möglich sind.
Um sich bei der BloodHound-Datenbank zu authentifizieren, benötigt pyCobaltHound die folgenden Informationen:
Hinweis: Wenn Sie Ihre Einstellungen dauerhaft speichern (um sie über Client-/Host-Neustarts hinweg zu erhalten), wird pyCobaltHound diese Anmeldeinformationen serialisieren und auf der Festplatte speichern.
Wie bereits besprochen, verwendet pyCobaltHound Caching, um sicherzustellen, dass keine unnötige Arbeit geleistet wird. Dieses Caching kann in den Einstellungen deaktiviert werden. Dies ist besonders nützlich bei der Entwicklung neuer Abfragen, damit Sie nicht ständig den Cache verwalten/löschen müssen.
pyCobaltHound unterstützt verschiedene Methoden, um den Operator zu benachrichtigen, sobald eine interessante Entität identifiziert wurde. Es ist möglich, diese Benachrichtigungen zu deaktivieren.
Standardmäßig benachrichtigt pyCobaltHound den Operator mit der standardmäßigen Aggressor-Messagebox. Diese Option kann den Workflow des Operators beeinträchtigen. Sie ist jedoch die Standardmethode, da sie auf jeder Plattform unterstützt wird, auf der ein Cobalt Strike-Client ausgeführt werden kann.

pyCobaltHound unterstützt auch die Anzeige von Desktop-Benachrichtigungen unter Linux. Dies ist unsere bevorzugte Option, da sie den Workflow des Operators nicht unterbricht.

Während einiger seiner Arbeitsabläufe erstellt pyCobaltHound einen HTML-Bericht. Diese Designentscheidung wurde getroffen, um den Operator nicht mit großen Benachrichtigungen zu überfluten, falls viele Entitäten untersucht werden. Diese Berichte werden im Ordner reports erstellt. Es ist möglich, die Berichterstellung zu deaktivieren.

Standardmäßig synchronisiert pyCobaltHound Abfragen über Teamserver hinweg, indem es eine zentrale Datei für alle abfragebezogenen Einstellungen verwendet. Dies bedeutet, dass Abfragen, die auf einem Teamserver aktiviert, hinzugefügt oder gelöscht werden, auch auf den Abfragen anderer Teamserver aktiviert, hinzugefügt oder gelöscht werden. Dies ist hauptsächlich eine Komfortoption und kann deaktiviert werden. Dies ist nützlich in Fällen, in denen Sie engagement-spezifische Abfragen ausführen, die nicht für alle Teamserver gelten, mit denen Sie verbunden sind.
Wenn die Abfragesynchronisation deaktiviert ist, überprüft pyCobaltHound die Existenz eindeutiger Abfragedateien. Wenn diese existieren, werden sie geladen und während der Arbeitsabläufe verwendet. Wenn die Dateien nicht existieren, werden sie erstellt und geladen. Diese Einstellung bleibt auch nach einem Neuladen erhalten.
Wenn die Abfragesynchronisation aktiviert ist, überprüft pyCobaltHound die Existenz eindeutiger Abfragedateien. Wenn diese existieren, wird der Operator vor eine Auswahl gestellt.

Der Operator hat die folgenden Optionen:
pyCobaltHound einfach die eindeutigen Abfragedateien. Alle benutzerdefinierten Abfragen gehen verloren.pyCobaltHound, die eindeutigen Abfragedateien in die allgemeinen Abfragedateien zusammenzuführen. Vor dem Zusammenführen einer Abfrage wird geprüft, ob in der allgemeinen Datei keine Abfrage mit demselben Namen oder derselben Cypher-Anweisung vorhanden ist. Falls Zusammenführungskonflikte auftreten, wird der Operator gefragt, ob er die nicht zusammengeführten Abfragen behalten möchte. Sie werden in einer separaten Datei gespeichert. Die eindeutigen Abfragedateien werden dann entfernt.pyCobaltHound die eindeutigen Abfragedateien einfach. Alle benutzerdefinierten Abfragen bleiben erhalten und die Dateien werden erneut geladen, wenn die Abfragesynchronisation wieder deaktiviert wird.pyCobaltHound unterstützt derzeit die folgenden integrierten Abfragen:
Die Verwaltung der verschiedenen Abfragen, die von pyCobaltHound verwendet werden, kann über das Hauptmenü erfolgen (Cobalt Strike > pyCobaltHound > Abfragen).

Der Dialog Abfragen aktualisieren ermöglicht es Operatoren, bestimmte Abfragen zu aktivieren/deaktivieren. Bei Verwendung dieses Dialogs wird der Operator zuerst gefragt, welche Art von Abfragen er aktualisieren möchte. Dies geschieht, um während dieses Arbeitsablaufs die richtigen Abfragen dynamisch zu rendern/laden.

Nach Beantwortung des ersten Dialogs wird dem Operator eine Liste aller verfügbaren Abfragen dieses Typs angezeigt. Hier kann er auswählen, welche Abfragen er aktivieren/deaktivieren möchte.

Die Option „Abfragetyp“ ist ein unschöner Workaround, um den Abfragetyp an die nächste Funktion im Arbeitsablauf weiterzugeben, und für den Operator nicht von Belang.
Die Funktion Abfrage hinzufügen ermöglicht es Operatoren, eigene Abfragen hinzuzufügen/zu entfernen, um die Untersuchungsfähigkeiten von pyCobaltHound anzupassen. Dies gibt ihnen die Flexibilität, pyCobaltHound während Einsätzen spontan an engagement-spezifische Ziele (Benutzer, Hosts usw.) anzupassen.

Dieser Dialog fragt den Operator nach folgenden Informationen:
pyCobaltHound verwendet.pyCobaltHound ausführen muss. Operatoren sind recht frei, ihre Abfragen zu definieren. Die einzigen Anforderungen sind die folgenden:
pyCobaltHound generiert dynamisch die folgende Cypher-Zeichenfolge basierend auf den zu untersuchenden Entitätsnamen:
WITH [Kontonamen hier] AS samAccountNames UNWIND samAccountNames AS names.MATCH (x) WHERE x.name STARTS WITH names(x:User)).pyCobaltHound erwartet, dass die Abfrage eine eindeutige Menge von Benutzernamen zurückgibt.
RETURN DISTINCT (x.name).pyCobaltHound für die benutzerdefinierte Abfrage verwendet. Diese wird in Benachrichtigungen und Berichten während der Arbeitsabläufe von pyCobaltHound verwendet.
pyCobaltHound durch die Anzahl der Ergebnisse für diese Abfrage ersetzt.Der Dialog Abfrage löschen ermöglicht es Operatoren, bestimmte benutzerdefinierte Abfragen aus pyCobaltHound zu entfernen. Bei Verwendung dieses Dialogs wird der Operator zuerst gefragt, welche Art von Abfrage er entfernen möchte. Dies geschieht, um während dieses Arbeitsablaufs die richtigen Abfragen dynamisch zu rendern/laden.

Nach Beantwortung des ersten Dialogs wird dem Operator eine Liste aller verfügbaren Abfragen dieses Typs angezeigt. Hier kann er auswählen, welche Abfragen er entfernen möchte.

Die Option „Abfragetyp“ ist ein unschöner Workaround, um den Abfragetyp an die nächste Funktion im Arbeitsablauf weiterzugeben, und für den Operator nicht von Belang.
pyCobaltHound verwendet/lässt sich inspirieren von: