
Framework di ricerca per comando e controllo (C2) crittografato per l'educazione alla cybersecurity, laboratori red team ed esperimenti di comunicazione sicura client-server.
BlackBerryC2 è un framework di amministrazione remota e C2 crittografato progettato esclusivamente per uso educativo, ricerca sulla sicurezza e ambienti di laboratorio controllati.

Il progetto dimostra come costruire un server di comando e controllo personalizzato con crittografia a livello applicativo, gestione delle sessioni e comunicazione sicura con il client senza fare affidamento su stack TLS esterni.
Questo progetto NON è malware e NON è destinato ad accessi non autorizzati.
BlackBerryC2:
Utilizzare solo su sistemi e reti di tua proprietà o per cui hai esplicita autorizzazione al test.
Dipendenze Python:
pip install cryptography prompt_toolkit zstandard
zstandardè opzionale ma consigliato per trasferimenti superiori a 1 GB.
get -r, put -r)-b) — non bloccanti, annullabili.partial + .resume)generate-payload)BlackBerryHTTPs_TLSProxyGUI)log)BlackBerryC2 v2.0 stabilisce una comunicazione sicura come segue:
REQUEST_PUBKEY.secp256r1).HMAC_PRE_SHARED_SECRET).Ogni sessione mantiene:
Tutte le chiavi crittografiche sono generate in esecuzione e mai riutilizzate tra riavvii (a meno che non sia impostato --persistente).
python3 BlackBerryC2_server.py
Configurazione predefinita:
0.0.0.09949Esempi:
# Avvio base (richiede passphrase per log)
python3 BlackBerryC2_server.py
# Chiavi ECDHE persistenti + verbose
python3 BlackBerryC2_server.py -p -vv
# Porta personalizzata, nessun controllo HMAC
python3 BlackBerryC2_server.py -P 8080 --no-secure
# Port-knocking su porte personalizzate
python3 BlackBerryC2_server.py --spa --spa-mode knock --knock-seq 9001,9002,9003
# Modalità BerryTransfer con conferma automatica
python3 BlackBerryC2_server.py --berrytransfer --auto-confirm
# Visualizza/decifra log senza avviare server
python3 BlackBerryC2_server.py --logs
select <ID>)BerryTransfer è una modalità server dedicata solo trasferimento file ispirata a scp. Quando attiva, il server rifiuta qualsiasi accesso shell e accetta solo comandi di protocollo BT:*.
Avvio:
python3 BlackBerryC2_server.py --berrytransfer
python3 BlackBerryC2_server.py --berrytransfer --auto-confirm # nessun prompt operatore per GET
Comandi shell BerryTransfer:
Il log di trasferimento è scritto in logs/bt_transfer.jsonl (opzionalmente crittografato con AES-256-GCM).
Quando --spa è attivo, i client devono autenticarsi tramite UDP prima che la connessione TCP venga accettata.
Modalità SPA (predefinita): Il client invia un token HMAC-SHA256 di 32 byte a SPA_UDP_PORT.
token = HMAC-SHA256(HMAC_SECRET, "{ip}:{time_window_30s}")
Modalità Knock: Il client esegue il knock su una sequenza di porte UDP in ordine entro una finestra di timeout.
python3 BlackBerryC2_server.py --spa --spa-mode knock --knock-seq 7001,7002,7003 --knock-timeout 10
Gli IP autorizzati sono validi per --spa-ttl secondi (default 60).
Visualizza i log con il visualizzatore integrato:
BlackBerry> log
O in modo autonomo (nessun server):
python3 BlackBerryC2_server.py --logs
Questo progetto è destinato solo a:
L'uso non autorizzato contro sistemi senza permesso è severamente vietato.
Vedere il file LICENSE per i dettagli completi della licenza.
Questo software è fornito "così com'è", senza alcuna garanzia.
Gli autori non si assumono alcuna responsabilità per un uso improprio o danni causati da questo software.
logs/last_start.json| Flag | Descrizione |
|---|
-p / --persistente | Usa chiavi ECDHE persistenti da ecdhe-cert/ (richiede passphrase) |
-v | Log di debug |
-vv | Log verbose (rilassato) |
-H <host> | Host in ascolto (predefinito: 0.0.0.0) |
-P <port> | Porta in ascolto (predefinita: 9949) |
--no-secure | Accetta qualsiasi client ECDHE senza verifica HMAC |
--hmac <secret> | Segreto pre-condiviso HMAC personalizzato (hex o stringa) |
--log-passphrase <pass> | Crittografa il log del server con AES-256-GCM (PBKDF2 600k iter) |
--logs | Visualizzatore log interattivo — server non avviato |
--spa | Abilita pre-autenticazione SPA/port-knocking |
--spa-mode <spa|knock> | spa = token UDP singolo, knock = sequenza di porte |
--spa-port <port> | Porta UDP per listener SPA (predefinita: 7331) |
--knock-seq <ports> | Sequenza di porte per modalità knock (predefinita: 7001,7002,7003) |
--knock-timeout <sec> | Secondi per completare la sequenza knock (predefinito: 10) |
--spa-ttl <sec> | Secondi di validità di un IP autorizzato (predefinito: 60) |
--berrytransfer | Modalità BerryTransfer: solo trasferimento file, nessuna shell |
--transfer-root <dir> | Directory root per BerryTransfer (predefinita: ./berry_transfers) |
--auto-confirm | Approva automaticamente tutte le richieste GET in BerryTransfer (nessun prompt operatore) |
| Comando | Descrizione |
|---|
list | Elenca sessioni attive con statistiche e hostname |
select <ID> | Interagisci con una sessione client |
all <cmd> | Invia un comando a tutti i client connessi |
report | Report completo dello stato del server (uptime, sessioni, trasferimenti) |
set host <HOST> | Cambia host in ascolto (riavvia il server) |
set port <PORT> | Cambia porta in ascolto (riavvia il server) |
sVbanner "<text>" | Cambia banner di servizio |
generate-payload | Genera un payload client |
fingerprint | Mostra impronta chiave server ECDHE (SHA-256) |
ecdhe-keys | Stampa coppia di chiavi ECDHE corrente (PEM) |
kill <id|ip> | Termina una sessione per ID o IP |
block <IP> | Blocca permanentemente un IP |
unblock <IP> | Sblocca un IP (persistente + temporaneo) |
blocklist | Mostra IP bloccati (persistenti e temporanei) |
log | Visualizzatore log interattivo (supporta log crittografati) |
report | Riepilogo stato: uptime, sessioni, trasferimenti |
banner | Mostra nuovamente banner di avvio |
clean | Elimina file di log del server |
v | Attiva/disattiva log DEBUG |
vv | Attiva/disattiva log VERBOSE |
cd <dir> | Cambia directory di lavoro locale del server |
E <cmd> | Esegue comando tramite os.system localmente |
<any command> | Esegue localmente sul server |
exit | Arresta server ed esci |
| Comando | Descrizione |
|---|
proxy | Avvia demone proxy TLS/HTTP (modalità auto) |
proxy --mode <mode> | Modalità: auto, tls, http, https, both, all |
proxy --stats | Mostra statistiche proxy |
proxy gui | Avvia GUI proxy (processo separato) |
stop-proxy | Arresta demone proxy |
stop-proxy-gui | Arresta GUI proxy |
proxy-help | Aiuto completo proxy |
| Comando | Descrizione |
|---|
help | Mostra aiuto sessione |
exit | Torna alla shell principale |
!<cmd> | Esegue comando localmente sul server |
<cmd> | Esegue comando sul client remoto |
cmd1 && cmd2 | Catena: esegui cmd2 solo se cmd1 ha avuto successo |
cmd1 || cmd2 | Catena: esegui cmd2 solo se cmd1 è fallito |
cmd1 ; cmd2 | Catena: esegui sempre cmd2 |
| Comando | Descrizione |
|---|
get <file> | Scarica file dal client |
get <dir> -r | Scaricamento ricorsivo di directory |
get <file> -b | Scaricamento in background (non bloccante) |
get <dir> -r -b | Scaricamento ricorsivo in background |
put <file> | Carica file sul client |
put <file> -exc | Carica ed esegue in memoria (script) |
put <dir> -r | Caricamento ricorsivo di directory |
put <file> -b | Caricamento in background |
transfers | Elenca tutti i trasferimenti attivi e completati |
stop <ID> | Annulla un trasferimento in background (es. stop T1) |
resume <local_file> | Riprende un download interrotto |
screenshot | Cattura schermo client |
| Comando | Descrizione |
|---|
confirm <ID> | Approva una richiesta GET in sospeso |
deny <ID> | Rifiuta una richiesta GET in sospeso |
pending | Elenca richieste GET in attesa di approvazione |
auto [on|off] | Attiva/disattiva/imposta conferma automatica |
clients | Mostra sessioni BerryTransfer attive |
ls [dir] | Elenca file nella root di trasferimento |
tree [dir] | Albero file della root di trasferimento |
find <name> | Cerca file nella root di trasferimento |
rm <file> | Elimina file dalla root di trasferimento (con conferma) |
log [N] | Mostra ultime N voci del log trasferimenti (default 30) |
cd <dir> | Cambia directory di lavoro locale |
pwd | Mostra directory locale corrente |
!<cmd> | Esegue comando di sistema locale |
exit | Arresta server BerryTransfer |
| Funzionalità | Dettagli |
|---|
| Scambio chiavi | ECDHE secp256r1 effimero o persistente |
| Crittografia sessione | AES-256-GCM, nonce casuale di 12 byte per messaggio |
| Autenticazione client | HMAC-SHA256 su segreto condiviso durante l'handshake |
| Integrità messaggio | HMAC-SHA256 per pacchetto (copre seq + nonce + ciphertext) |
| Anti-replay | Tracker finestra numeri di sequenza per sessione |
| Protezione downgrade | Dimensione minima chiave AES imposta (256 bit) |
| Limitazione frequenza heartbeat | Minimo 3 secondi tra heartbeat; violazioni tracciate |
| Protezione flood comandi | Limitatore di velocità; disconnessione automatica dopo soglia |
| Rilevamento scan | Connect scan, banner grab, contatori fallimenti handshake |
| Gestione IP | Blocklist persistente + ban temporanei (auto + manuale) |
| Crittografia log | AES-256-GCM + PBKDF2-HMAC-SHA256 (600k iterazioni) |
| Jitter risposta | Jitter casuale 10-50ms per resistere ad attacchi temporali |
| Pre-autenticazione | Token SPA o port-knocking prima che TCP sia accettato |
| File di log | Contenuto |
|---|
logs/BlackBerryC2_Server.log | Log server rotante in chiaro (INFO+) |
logs/BlackBerryC2_enc.log | Log server crittografato (se --log-passphrase impostato) |
logs/sessions.jsonl | Eventi sessione: connessione, disconnessione, byte |
logs/bt_transfer.jsonl | Log trasferimento file BerryTransfer |
logs/last_start.json | Istantanea configurazione avvio (host, porta, token, pid) |