
Verschlüsseltes Command‑and‑Control (C2)‑Forschungsframework für Cybersicherheitsbildung, Red‑Team‑Labore und sichere Client‑Server‑Kommunikationsexperimente.
BlackBerryC2 ist ein verschlüsseltes Fernverwaltungs- und C2-Framework, das ausschließlich für Bildungszwecke, Sicherheitsforschung und kontrollierte Laborumgebungen entwickelt wurde.

Das Projekt zeigt, wie man einen benutzerdefinierten Command-and-Control-Server mit Anwendungsschicht-Kryptographie, Sitzungsverwaltung und sicherer Client-Kommunikation ohne Abhängigkeit von externen TLS-Stacks erstellt.
Dieses Projekt ist KEINE Malware und NICHT für unbefugten Zugriff gedacht.
BlackBerryC2:
Verwenden Sie es nur auf Systemen und Netzwerken, die Ihnen gehören oder für die Sie eine ausdrückliche Testgenehmigung haben.
Python-Abhängigkeiten:
pip install cryptography prompt_toolkit zstandard
zstandardist optional, aber für Übertragungen größer als 1 GB empfohlen.
get -r, put -r)-b Flag) — nicht blockierend, abbrechbar.partial + .resume-Dateien)generate-payload)BlackBerryHTTPs_TLSProxyGUI)log-Befehl)BlackBerryC2 v2.0 stellt eine sichere Kommunikation wie folgt her:
REQUEST_PUBKEY.secp256r1).HMAC_PRE_SHARED_SECRET).Jede Sitzung verwaltet:
Alle kryptographischen Schlüssel werden zur Laufzeit generiert und niemals über Neustarts hinweg wiederverwendet (es sei denn, --persistente ist gesetzt).
python3 BlackBerryC2_server.py
Standardkonfiguration:
0.0.0.09949Beispiele:
# Basic startup (prompts for log passphrase)
python3 BlackBerryC2_server.py
# Persistent ECDHE keys + verbose
python3 BlackBerryC2_server.py -p -vv
# Custom port, no HMAC check
python3 BlackBerryC2_server.py -P 8080 --no-secure
# Port-knocking on custom ports
python3 BlackBerryC2_server.py --spa --spa-mode knock --knock-seq 9001,9002,9003
# BerryTransfer mode with auto-confirm
python3 BlackBerryC2_server.py --berrytransfer --auto-confirm
# View/decrypt logs without starting server
python3 BlackBerryC2_server.py --logs
select <ID>)BerryTransfer ist ein dedizierter Nur-Dateiübertragungs-Servermodus, inspiriert von scp. Wenn aktiv, lehnt der Server jeglichen Shell-Zugriff ab und akzeptiert nur BT:* Protokollbefehle.
Starten:
python3 BlackBerryC2_server.py --berrytransfer
python3 BlackBerryC2_server.py --berrytransfer --auto-confirm # no operator prompt for GETs
BerryTransfer-Shell-Befehle:
Das Übertragungsprotokoll wird nach logs/bt_transfer.jsonl geschrieben (optional AES-256-GCM verschlüsselt).
Wenn --spa aktiv ist, müssen sich Clients über UDP authentifizieren, bevor die TCP-Verbindung akzeptiert wird.
SPA mode (Standard): Client sendet ein 32-Byte HMAC-SHA256-Token an SPA_UDP_PORT.
token = HMAC-SHA256(HMAC_SECRET, "{ip}:{time_window_30s}")
Knock mode: Client klopft eine Sequenz von UDP-Ports in der Reihenfolge innerhalb eines Zeitfensters an.
python3 BlackBerryC2_server.py --spa --spa-mode knock --knock-seq 7001,7002,7003 --knock-timeout 10
Autorisierte IPs sind für --spa-ttl Sekunden gültig (Standard 60).
Protokolle mit dem integrierten Viewer anzeigen:
BlackBerry> log
Oder eigenständig (ohne Server):
python3 BlackBerryC2_server.py --logs
Dieses Projekt ist ausschließlich bestimmt für:
Unbefugte Nutzung gegen Systeme ohne Erlaubnis ist strengstens untersagt.
Siehe LICENSE-Datei für vollständige Lizenzdetails.
Diese Software wird "wie besehen" zur Verfügung gestellt, ohne jegliche Gewährleistung.
Die Autoren übernehmen keine Verantwortung für Missbrauch oder Schäden, die durch diese Software verursacht werden.
logs/last_start.json| Flag | Beschreibung |
|---|
-p / --persistente | Persistente ECDHE-Schlüssel aus ecdhe-cert/ verwenden (nach Passphrase fragen) |
-v | Debug-Logging |
-vv | Ausführliches (entspanntes) Logging |
-H <host> | Lausch-Host (Standard: 0.0.0.0) |
-P <port> | Lausch-Port (Standard: 9949) |
--no-secure | Jeden ECDHE-Client ohne HMAC-Überprüfung akzeptieren |
--hmac <secret> | Benutzerdefiniertes HMAC vorher geteiltes Geheimnis (hex oder String) |
--log-passphrase <pass> | Serverprotokoll mit AES-256-GCM verschlüsseln (PBKDF2 600k Iter.) |
--logs | Interaktiver Log-Viewer — kein Server gestartet |
--spa | SPA/Port-Knocking Pre-Authentifizierung aktivieren |
--spa-mode <spa|knock> | spa = einzelnes UDP-Token, knock = Port-Sequenz |
--spa-port <port> | UDP-Port für SPA-Listener (Standard: 7331) |
--knock-seq <ports> | Port-Sequenz für Knock-Modus (Standard: 7001,7002,7003) |
--knock-timeout <sec> | Sekunden zum Abschließen der Knock-Sequenz (Standard: 10) |
--spa-ttl <sec> | Sekunden, die eine autorisierte IP gültig bleibt (Standard: 60) |
--berrytransfer | BerryTransfer-Modus: nur Dateiübertragung, keine Shell |
--transfer-root <dir> | Wurzelverzeichnis für BerryTransfer (Standard: ./berry_transfers) |
--auto-confirm | Alle GET-Anfragen in BerryTransfer automatisch genehmigen (keine Operator-Aufforderung) |
| Befehl | Beschreibung |
|---|
list | Aktive Sitzungen mit Statistiken und Hostname auflisten |
select <ID> | Mit einer Client-Sitzung interagieren |
all <cmd> | Einen Befehl an alle verbundenen Clients senden |
report | Vollständiger Serverstatusbericht (Betriebszeit, Sitzungen, Übertragungen) |
set host <HOST> | Lausch-Host ändern (bindet Server neu) |
set port <PORT> | Lausch-Port ändern (bindet Server neu) |
sVbanner "<text>" | Service-Banner ändern |
generate-payload | Ein Client-Payload generieren |
fingerprint | ECDHE-Server-Schlüsselfingerabdruck anzeigen (SHA-256) |
ecdhe-keys | Aktuelles ECDHE-Schlüsselpaar ausgeben (PEM) |
kill <id|ip> | Eine Sitzung nach ID oder IP beenden |
block <IP> | Eine IP dauerhaft sperren |
unblock <IP> | Eine IP entsperren (dauerhaft + temporär) |
blocklist | Gesperrte IPs anzeigen (dauerhaft und temporär) |
log | Interaktiver Log-Viewer (unterstützt verschlüsselte Logs) |
report | Statuszusammenfassung: Betriebszeit, Sitzungen, Übertragungen |
banner | Startbanner erneut anzeigen |
clean | Server-Logdateien löschen |
v | DEBUG-Logging umschalten |
vv | VERBOSE-Logging umschalten |
cd <dir> | Lokales Arbeitsverzeichnis des Servers ändern |
E <cmd> | Befehl über os.system lokal ausführen |
<any command> | Lokal auf dem Server ausführen |
exit | Server stoppen und beenden |
| Befehl | Beschreibung |
|---|
proxy | TLS/HTTP-Proxy-Daemon starten (Auto-Modus) |
proxy --mode <mode> | Modi: auto, tls, http, https, both, all |
proxy --stats | Proxy-Statistiken anzeigen |
proxy gui | Proxy-GUI starten (separater Prozess) |
stop-proxy | Proxy-Daemon stoppen |
stop-proxy-gui | Proxy-GUI stoppen |
proxy-help | Vollständige Proxy-Hilfe |
| Befehl | Beschreibung |
|---|
help | Sitzungshilfe anzeigen |
exit | Zurück zur Haupt-Shell |
!<cmd> | Befehl lokal auf dem Server ausführen |
<cmd> | Befehl auf dem entfernten Client ausführen |
cmd1 && cmd2 | Verkettung: cmd2 nur ausführen, wenn cmd1 erfolgreich war |
cmd1 || cmd2 | Verkettung: cmd2 nur ausführen, wenn cmd1 fehlschlug |
cmd1 ; cmd2 | Verkettung: cmd2 immer ausführen |
| Befehl | Beschreibung |
|---|
get <file> | Datei vom Client herunterladen |
get <dir> -r | Rekursives Verzeichnis herunterladen |
get <file> -b | Hintergrund-Download (nicht blockierend) |
get <dir> -r -b | Rekursiver Hintergrund-Download |
put <file> | Datei auf den Client hochladen |
put <file> -exc | Hochladen und im Speicher ausführen (Skripte) |
put <dir> -r | Rekursives Verzeichnis hochladen |
put <file> -b | Hintergrund-Upload |
transfers | Alle aktiven und abgeschlossenen Übertragungen auflisten |
stop <ID> | Eine Hintergrundübertragung abbrechen (z.B. stop T1) |
resume <local_file> | Eine unterbrochene Übertragung fortsetzen |
screenshot | Client-Bildschirm erfassen |
| Befehl | Beschreibung |
|---|
confirm <ID> | Eine ausstehende GET-Anfrage genehmigen |
deny <ID> | Eine ausstehende GET-Anfrage ablehnen |
pending | GET-Anfragen auflisten, die auf Genehmigung warten |
auto [on|off] | Auto-Confirm umschalten / setzen |
clients | Aktive BerryTransfer-Sitzungen anzeigen |
ls [dir] | Dateien im Übertragungs-Wurzelverzeichnis auflisten |
tree [dir] | Dateibaum des Übertragungs-Wurzelverzeichnisses |
find <name> | Datei im Übertragungs-Wurzelverzeichnis suchen |
rm <file> | Datei aus dem Übertragungs-Wurzelverzeichnis löschen (mit Bestätigung) |
log [N] | Die letzten N Übertragungsprotokolleinträge anzeigen (Standard 30) |
cd <dir> | Lokales Arbeitsverzeichnis ändern |
pwd | Aktuelles lokales Verzeichnis anzeigen |
!<cmd> | Lokalen Systembefehl ausführen |
exit | BerryTransfer-Server stoppen |
| Funktion | Details |
|---|
| Schlüsselaustausch | ECDHE secp256r1 ephemeral oder persistent |
| Sitzungsverschlüsselung | AES-256-GCM, zufällige 12-Byte Nonce pro Nachricht |
| Client-Authentifizierung | HMAC-SHA256 über gemeinsames Geheimnis während des Handshakes |
| Nachrichtenintegrität | HMAC-SHA256 pro Paket (deckt Seq + Nonce + Chiffretext ab) |
| Anti-Replay | Sequenznummern-Fenster-Tracker pro Sitzung |
| Downgrade-Schutz | Mindest-AES-Schlüsselgröße erzwungen (256-Bit) |
| Heartbeat-Ratenbegrenzung | Mindestens 3s zwischen Heartbeats; Verstöße werden verfolgt |
| Command-Flood-Schutz | Ratenbegrenzer; automatische Trennung nach Schwellenwert |
| Scan-Erkennung | Connect-Scan, Banner-Grab, Handshake-Fehler-Zähler |
| IP-Verwaltung | Dauerhafte Sperrliste + temporäre Sperren (automatisch + manuell) |
| Protokollverschlüsselung | AES-256-GCM + PBKDF2-HMAC-SHA256 (600k Iterationen) |
| Antwort-Jitter | 10–50ms zufälliger Jitter, um Timing-Angriffen zu widerstehen |
| Pre-Auth | SPA-Token oder Port-Knocking, bevor TCP akzeptiert wird |
| Protokolldatei | Inhalt |
|---|
logs/BlackBerryC2_Server.log | Klartext rotierendes Serverprotokoll (INFO+) |
logs/BlackBerryC2_enc.log | Verschlüsseltes Serverprotokoll (wenn --log-passphrase gesetzt) |
logs/sessions.jsonl | Sitzungsereignisse: Verbinden, Trennen, Bytes |
logs/bt_transfer.jsonl | BerryTransfer Dateiübertragungsprotokoll |
logs/last_start.json | Startkonfigurations-Snapshot (Host, Port, Token, PID) |