
Dieses Projekt ist eine „Brücke“ zwischen der Sleep- und der Python-Sprache. Es ermöglicht die Steuerung eines Cobalt-Strike-Teamservers über Python, ohne dass der standardmäßige GUI-Client benötigt wird. HINWEIS: Dieses Projekt befindet sich noch sehr stark in der BETA-Phase. Das Ziel ist es, eine Spielwiese zum Testen bereitzustellen, und es handelt sich keineswegs um ein offiziell unterstütztes Feature. Vielleicht könnte dies in Zukunft zum Kernprodukt hinzugefügt werden.
Dieses Projekt ist eine 'Brücke' zwischen der Sleep- und der Python-Sprache. Es ermöglicht die Steuerung eines Cobalt-Strike-Teamservers über Python, ohne dass der standardmäßige GUI-Client benötigt wird.
HINWEIS: Dieses Projekt befindet sich noch sehr in der BETA-Phase. Das Ziel ist es, eine Spielwiese zum Testen bereitzustellen, und es ist in keiner Weise ein offiziell unterstütztes Feature. Vielleicht könnte dies in Zukunft zum Kernprodukt hinzugefügt werden.
Das Projekt wurde durch die Arbeit von @BinaryFaultline und @Mcgigglez16 im Projekt https://github.com/emcghee/PayloadAutomation inspiriert. Ich möchte euch beiden einen besonderen Dank aussprechen!!
Das Herzstück dieser Brücke ist eine Python-Implementierung eines Headless-Cobalt-Strike-Clients. Dies wird erreicht, indem die von agscript bereitgestellte Aggressor Script Console als Engine verwendet wird. Agscript ermöglicht die Headless-Interaktion mit Cobalt Strike (https://www.cobaltstrike.com/aggressor-script/index.html). Die 'Brücke' funktioniert, indem Python-Hilfsfunktionen in sleepy.py verwendet werden, um die benötigten Sleep-Befehle zu erzeugen, die von der agscript-Konsole erwartet werden. Anstatt die Sleep-Funktionen zu schreiben, bietet striker.py Hilfsfunktionen, die Sleep abstrahieren und die Verwendung von Python ermöglichen.
Da das PayloadAutomation-Projekt dies inspiriert hat, begann es mit vielen der gleichen Codezeilen, aber ich wollte es auf die Komponenten reduzieren, die benötigt werden, um als agscript-Wrapper zu fungieren.
| Item | Description |
|---|---|
| sleep_python_bridge | Die Bibliothek, die es Python ermöglicht, mit Cobalt Strike zu interagieren |
| output/html | Pfad für HTML-Datenbetrachter |
| output/html/data | Pfad für JSON-Daten, die vom Datenbetrachter verwendet werden |
| output/payloads | Pfad für gespeicherte Payloads (vom Payload-Generator verwendet) |
| payload_scripts | Pfad für externe Skripte, die von payloadgenerator.py geladen werden |
| beaconlogtracker.py | Implementierung eines Beacon-Log-Trackers, der ein HTML-Datengitter zur Anzeige von Beacon-Logs verwendet |
| payloadgenerator.py | Implementierung eines Beacon-Payload-Generators, der für jeden Listener Payloads erstellt |
| beacongrapher.py | Implementierung eines Beacon-Graph-Trackers, der einen gerichteten HTML-Javascript-Graphen für Beacons verwendet |
Die Beispiele in diesem Projekt sind vielleicht der einfachste Weg, es zu verstehen, aber es ist das Skript example.py.
#!/usr/local/bin/python3
## Import the bridge
from sleep_python_bridge.striker import CSConnector
from argparse import ArgumentParser
from pprint import pp, pprint
###################
## Argparse
def parseArguments():
parser = ArgumentParser()
parser.add_argument('host', help='The teamserver host.')
parser.add_argument('port', help='The teamserver port.')
parser.add_argument('username', help='The desired username.')
parser.add_argument('password', help='The teamserver password.')
parser.add_argument('path', help="Directory to CobaltStrike")
args = parser.parse_args()
return args
## Let's go
def main(args):
cs_host = args.host
cs_port = args.port
cs_user = args.username
cs_pass = args.password
cs_directory = args.path
## Connect to server
print(f"[*] Connecting to teamserver: {cs_host}")
with CSConnector(
cs_host=cs_host,
cs_port=cs_port,
cs_user=cs_user,
cs_pass=cs_pass,
cs_directory=cs_directory) as cs:
# Perform some actions
#
# Get beacon metadata - i.e., x beacons() from the script console
beacons = cs.get_beacons()
print("BEACONS")
pprint(beacons)
# Get list of listners - i.e., x listeners_stageless() from the script console
listeners = cs.get_listeners_stageless()
print("LISTENERS")
pprint(listeners)
if __name__ == "__main__":
args = parseArguments()
main(args)
Rufe das Skript auf
python3 example.py 127.0.0.1 50050 example password /path/to/cobaltstrike

Beacon-Logs sind zur Laufzeit auf einem Teamserver oder über die auf dem Teamserver gespeicherten Beacon-Logdateien verfügbar. Die Daten sind immer vorhanden, aber möglicherweise nicht in der gewünschten Form aufbereitet. Dies ist ein Beispiel für einen Log-Tracker, der ein HTML-Datengitter verwendet, um Beacon-Logs schnell anzuzeigen.
beaconlogtracker.py ist ein Skript, das sich mit einem Teamserver verbindet, alle 30 Sekunden die laufenden Beacon-Logs extrahiert, in <code>beaconlogs.json` speichert und sie in einem durchsuchbaren und sortierbaren HTML-Datengitter anzeigt.
Beacon-Logs werden immer im Logs-Verzeichnis gespeichert, aber dies ist eine alternative Möglichkeit, die In-Memory-Logs mit einem alternativen Betrachter zu verfolgen. Wenn der Teamserver neu gestartet wird, gehen die In-Memory-Logs verloren, und du musst auf die im Logs-Verzeichnis auf dem Teamserver gespeicherten Logs zurückgreifen. Dieses Skript hält die In-Memory-Logs mit der Datei beaconlogs.json synchron. So hast du eine schnelle und einfache Möglichkeit, alle Daten zu visualisieren, ohne im Logs-Verzeichnis zu graben, selbst wenn Cobalt Strike neu gestartet wird.
Starte das Skript, indem du es sich alle 30 Sekunden mit deinem Teamserver verbinden lässt, um Logs zu synchronisieren.
Verwendung:
python3 beaconlogtracker.py 127.0.0.1 50050 logtracker password /path/to/cobaltstrike
Dadurch bleibt beaconlogs.json mit den gespeicherten und laufenden Beacon-Logs synchronisiert. Die Synchronisierung erfolgt alle 30 Sekunden.
Starte einen Webserver aus dem Verzeichnis output/html
python3 -m http.server 8000
Öffne http://localhost:8000/beaconlogs.html
