
Cadre de recherche de commande et contrôle (C2) chiffré pour l'éducation en cybersécurité, les laboratoires d'équipe rouge et les expériences de communication client-serveur sécurisées.
BlackBerryC2 est un framework d’administration à distance et de C2 chiffré conçu exclusivement pour un usage éducatif, la recherche en sécurité et les environnements de laboratoire contrôlés.

Le projet montre comment construire un serveur de commande et de contrôle personnalisé avec cryptographie au niveau applicatif, gestion de session et communication client sécurisée sans dépendre de piles TLS externes.
Ce projet n’est PAS un logiciel malveillant et n’est PAS destiné à un accès non autorisé.
BlackBerryC2 :
Utilisez-le uniquement sur des systèmes et réseaux que vous possédez ou pour lesquels vous avez une autorisation explicite de test.
Dépendances Python :
pip install cryptography prompt_toolkit zstandard
zstandardest optionnel mais recommandé pour les transferts de plus de 1 Go.
get -r, put -r)-b) — non bloquants, annulables.partial + .resume)generate-payload)BlackBerryHTTPs_TLSProxyGUI)log)BlackBerryC2 v2.0 établit une communication sécurisée comme suit :
REQUEST_PUBKEY.secp256r1).HMAC_PRE_SHARED_SECRET).Chaque session maintient :
Toutes les clés cryptographiques sont générées à l’exécution et jamais réutilisées entre les redémarrages (sauf si --persistente est défini).
python3 BlackBerryC2_server.py
Configuration par défaut :
0.0.0.09949Exemples :
# Démarrage de base (demande une phrase de passe pour le journal)
python3 BlackBerryC2_server.py
# Clés ECDHE persistantes + verbose
python3 BlackBerryC2_server.py -p -vv
# Port personnalisé, sans vérification HMAC
python3 BlackBerryC2_server.py -P 8080 --no-secure
# Port-knocking sur des ports personnalisés
python3 BlackBerryC2_server.py --spa --spa-mode knock --knock-seq 9001,9002,9003
# Mode BerryTransfer avec confirmation automatique
python3 BlackBerryC2_server.py --berrytransfer --auto-confirm
# Afficher/déchiffrer les journaux sans démarrer le serveur
python3 BlackBerryC2_server.py --logs
select <ID>)BerryTransfer est un mode serveur dédié au transfert de fichiers uniquement, inspiré de scp. Lorsqu’il est actif, le serveur rejette tout accès shell et n’accepte que les commandes de protocole BT:*.
Démarrage :
python3 BlackBerryC2_server.py --berrytransfer
python3 BlackBerryC2_server.py --berrytransfer --auto-confirm # pas d’invite opérateur pour les GET
Commandes du shell BerryTransfer :
Le journal de transfert est écrit dans logs/bt_transfer.jsonl (optionnellement chiffré AES-256-GCM).
Lorsque --spa est actif, les clients doivent s’authentifier via UDP avant que la connexion TCP ne soit acceptée.
Mode SPA (par défaut) : le client envoie un jeton HMAC-SHA256 de 32 octets sur SPA_UDP_PORT.
token = HMAC-SHA256(HMAC_SECRET, "{ip}:{time_window_30s}")
Mode Knock : le client frappe une séquence de ports UDP dans l’ordre, dans une fenêtre de temps donnée.
python3 BlackBerryC2_server.py --spa --spa-mode knock --knock-seq 7001,7002,7003 --knock-timeout 10
Les IP autorisées sont valables pendant --spa-ttl secondes (défaut 60).
Visualisez les journaux avec le visualiseur intégré :
BlackBerry> log
Ou en autonome (sans serveur) :
python3 BlackBerryC2_server.py --logs
Ce projet est destiné uniquement à :
Toute utilisation non autorisée contre des systèmes sans permission est strictement interdite.
Voir le fichier LICENSE pour les détails complets de la licence.
Ce logiciel est fourni "en l’état", sans garantie d’aucune sorte.
Les auteurs déclinent toute responsabilité en cas d’utilisation abusive ou de dommages causés par ce logiciel.
logs/last_start.json| Flag | Description |
|---|
-p / --persistente | Utiliser des clés ECDHE persistantes depuis ecdhe-cert/ (demande une phrase de passe) |
-v | Journalisation de débogage |
-vv | Journalisation verbose (détendue) |
-H <host> | Hôte d’écoute (défaut : 0.0.0.0) |
-P <port> | Port d’écoute (défaut : 9949) |
--no-secure | Accepter tout client ECDHE sans vérification HMAC |
--hmac <secret> | Secret partagé HMAC personnalisé (hex ou chaîne) |
--log-passphrase <pass> | Chiffrer le journal serveur avec AES-256-GCM (PBKDF2 600k itérations) |
--logs | Visualiseur de journal interactif — sans démarrer le serveur |
--spa | Activer la pré-authentification SPA/port-knocking |
--spa-mode <spa|knock> | spa = jeton UDP unique, knock = séquence de ports |
--spa-port <port> | Port UDP pour l’écoute SPA (défaut : 7331) |
--knock-seq <ports> | Séquence de ports pour le mode knock (défaut : 7001,7002,7003) |
--knock-timeout <sec> | Secondes pour terminer la séquence knock (défaut : 10) |
--spa-ttl <sec> | Secondes pendant lesquelles une IP autorisée reste valide (défaut : 60) |
--berrytransfer | Mode BerryTransfer : transfert de fichiers uniquement, pas de shell |
--transfer-root <dir> | Répertoire racine pour BerryTransfer (défaut : ./berry_transfers) |
--auto-confirm | Approuver automatiquement toutes les demandes GET en BerryTransfer (sans invite opérateur) |
| Commande | Description |
|---|
list | Lister les sessions actives avec statistiques et nom d’hôte |
select <ID> | Interagir avec une session client |
all <cmd> | Envoyer une commande à tous les clients connectés |
report | Rapport complet d’état du serveur (uptime, sessions, transferts) |
set host <HOST> | Modifier l’hôte d’écoute (relie le serveur) |
set port <PORT> | Modifier le port d’écoute (relie le serveur) |
sVbanner "<text>" | Modifier la bannière de service |
generate-payload | Générer un payload client |
fingerprint | Afficher l’empreinte de la clé serveur ECDHE (SHA-256) |
ecdhe-keys | Afficher la paire de clés ECDHE actuelle (PEM) |
kill <id|ip> | Terminer une session par ID ou IP |
block <IP> | Bloquer définitivement une IP |
unblock <IP> | Débloquer une IP (persistante + temporaire) |
blocklist | Afficher les IP bloquées (persistantes et temporaires) |
log | Visualiseur de journal interactif (prend en charge les journaux chiffrés) |
report | Résumé d’état : uptime, sessions, transferts |
banner | Réafficher la bannière de démarrage |
clean | Supprimer les fichiers de journal du serveur |
v | Activer/désactiver le journal DEBUG |
vv | Activer/désactiver le journal VERBOSE |
cd <dir> | Changer le répertoire de travail local du serveur |
E <cmd> | Exécuter une commande via os.system localement |
<any command> | Exécuter localement sur le serveur |
exit | Arrêter le serveur et quitter |
| Commande | Description |
|---|
proxy | Démarrer le démon proxy TLS/HTTP (mode auto) |
proxy --mode <mode> | Modes : auto, tls, http, https, both, all |
proxy --stats | Afficher les statistiques du proxy |
proxy gui | Lancer l’interface graphique du proxy (processus séparé) |
stop-proxy | Arrêter le démon proxy |
stop-proxy-gui | Arrêter l’interface graphique du proxy |
proxy-help | Aide complète du proxy |
| Commande | Description |
|---|
help | Afficher l’aide de la session |
exit | Revenir au shell principal |
!<cmd> | Exécuter la commande localement sur le serveur |
<cmd> | Exécuter la commande sur le client distant |
cmd1 && cmd2 | Chaîne : exécuter cmd2 seulement si cmd1 a réussi |
cmd1 || cmd2 | Chaîne : exécuter cmd2 seulement si cmd1 a échoué |
cmd1 ; cmd2 | Chaîne : toujours exécuter cmd2 |
| Commande | Description |
|---|
get <file> | Télécharger un fichier depuis le client |
get <dir> -r | Téléchargement récursif d’un répertoire |
get <file> -b | Téléchargement en arrière-plan (non bloquant) |
get <dir> -r -b | Téléchargement récursif en arrière-plan |
put <file> | Téléverser un fichier vers le client |
put <file> -exc | Téléverser et exécuter en mémoire (scripts) |
put <dir> -r | Téléversement récursif d’un répertoire |
put <file> -b | Téléversement en arrière-plan |
transfers | Lister tous les transferts actifs et terminés |
stop <ID> | Annuler un transfert en arrière-plan (ex. stop T1) |
resume <local_file> | Reprendre un téléchargement interrompu |
screenshot | Capturer l’écran du client |
| Commande | Description |
|---|
confirm <ID> | Approuver une demande GET en attente |
deny <ID> | Rejeter une demande GET en attente |
pending | Lister les demandes GET en attente d’approbation |
auto [on|off] | Activer/désactiver la confirmation automatique |
clients | Afficher les sessions BerryTransfer actives |
ls [dir] | Lister les fichiers dans la racine de transfert |
tree [dir] | Arborescence des fichiers de la racine de transfert |
find <name> | Rechercher un fichier dans la racine de transfert |
rm <file> | Supprimer un fichier de la racine de transfert (avec confirmation) |
log [N] | Afficher les N dernières entrées du journal de transfert (défaut 30) |
cd <dir> | Changer le répertoire de travail local |
pwd | Afficher le répertoire local actuel |
!<cmd> | Exécuter une commande système locale |
exit | Arrêter le serveur BerryTransfer |
| Fonctionnalité | Détails |
|---|
| Échange de clés | ECDHE secp256r1 éphémère ou persistant |
| Chiffrement de session | AES-256-GCM, nonce aléatoire de 12 octets par message |
| Authentification client | HMAC-SHA256 sur un secret partagé lors du handshake |
| Intégrité des messages | HMAC-SHA256 par paquet (couvre seq + nonce + ciphertext) |
| Anti-rejeu | Traqueur de fenêtre de numéro de séquence par session |
| Protection contre le downgrade | Taille minimale de clé AES imposée (256 bits) |
| Limitation de débit Heartbeat | Minimum 3s entre heartbeats ; violations suivies |
| Protection contre le flood de commandes | Limiteur de débit ; déconnexion automatique après seuil |
| Détection de scan | Scan de connexion, récupération de bannière, compteurs d’échecs de handshake |
| Gestion IP | Liste de blocage persistante + bannissements temporaires (auto + manuel) |
| Chiffrement des journaux | AES-256-GCM + PBKDF2-HMAC-SHA256 (600 000 itérations) |
| Gigue de réponse | Gigue aléatoire de 10–50 ms pour résister aux attaques temporelles |
| Pré-authentification | Jeton SPA ou port-knocking avant que TCP ne soit accepté |
| Fichier de journal | Contenu |
|---|
logs/BlackBerryC2_Server.log | Journal serveur tournant en texte clair (INFO+) |
logs/BlackBerryC2_enc.log | Journal serveur chiffré (si --log-passphrase défini) |
logs/sessions.jsonl | Événements de session : connexion, déconnexion, octets |
logs/bt_transfer.jsonl | Journal de transfert BerryTransfer |
logs/last_start.json | Instantané de la configuration de démarrage (hôte, port, jeton, pid) |