
Un condotto di comando e controllo semplificato basato su FTP per interconnettere sistemi remoti.
SharpFtpC2 è un piccolo progetto sperimentale volto a esplorare la possibilità di utilizzare FTP(S) per inoltrare comandi e risposte tra due computer remoti. Impiega il protocollo FTP come un tunnel improvvisato attraverso il quale i computer, entrambi agenti come client connessi a un server FTP, possono comunicare. Viene utilizzato un semplice schema di gestione delle sessioni per tenere traccia dello scambio di richieste e risposte.
SharpFtpC2 adotta un sistema di gestione delle sessioni di base. Sebbene piuttosto elementare, serve allo scopo di mantenere le comunicazioni sincronizzate e correlate, aspetto essenziale per il dialogo tra i sistemi remoti.
Vale la pena notare che questo progetto può essere agevolmente portato utilizzando sistemi di controllo versione come git, svn o protocolli simili.
Se sei interessato ai dettagli tecnici della comunicazione di rete, o semplicemente vuoi sperimentare con C# e .NET Core, SharpFtpC2 potrebbe essere un punto di partenza intrigante. Non aspettarti un gioiello rifinito, ma forse, chissà, potresti imparare qualcosa di interessante giocandoci.
SharpFtpC2 è un progetto sperimentale creato per l'esplorazione educativa dell'utilizzo di FTP(S) come canale di comunicazione tra due computer remoti. È fondamentale comprendere che il progetto è progettato come risorsa di apprendimento per persone interessate a comunicazione di rete, C#, Adversary Simulation, Red Team, Malware. Come creatore, esorto gli utenti a non richiedere funzionalità aggiuntive o utilizzare questo progetto per qualsiasi forma di armamento o intento malevolo. L'intenzione principale è educativa e ci si aspetta che gli utenti interagiscano con i contenuti in modo responsabile ed etico.
SharpFtpC2 è nato dal desiderio di contribuire al Unprotect Project, in particolare alla sua categoria Network Evasion.
Questa idea di utilizzare FTP come "tunnel" ha radici profonde. In effetti, riporta alla mente ricordi piacevoli del 2005, quando muovevo i primi passi nel mondo della programmazione. All'epoca, incontrai una persona francese straordinariamente creativa con il soprannome BlasterWar. Aveva ideato un progetto chiamato BlasterX, che, sebbene ormai perso nel tempo, era piuttosto avanguardistico per la sua epoca.
L'ingegno di BlasterWar nel suo progetto consisteva nel fornire un'alternativa alla connessione inversa convenzionale, in cui l'agente doveva stabilire una connessione verso il dispositivo di controllo o hacking.
Invece, BlasterWar scelse di utilizzare FTP (File Transfer Protocol) come mezzo alternativo e costruì attorno ad esso un completo Remote Access Tool. Lo strumento includeva funzionalità come Screen Capture, Keylogging e System Management, tutte trasmesse attraverso il tunnel FTP. All'epoca, FTP era molto popolare e una miriade di siti web offrivano server FTP gratuiti al pubblico. Questo lo rendeva un'ideale alternativa alle connessioni inverse o dirette, che richiedevano il port forwarding. Inoltre, forniva un ulteriore livello di offuscamento per il comando e controllo (C2) poiché l'indirizzo IP della macchina dell'hacker non era direttamente esposto.
Oggi, utilizzare FTP come tunnel non è un concetto nuovo, poiché alcuni framework di Command and Control (C2) hanno adottato questo protocollo. Tuttavia, impiegare FTP in questo modo è irto di rischi. In particolare, la trasmissione delle credenziali in chiaro su rete da parte di FTP, combinata con la necessità che entrambe le parti possiedano tali credenziali, lo rende suscettibile a una miriade di attacchi. Sebbene i server FTP abbiano fatto progressi nell'affrontare questi problemi di sicurezza adottando sempre più FTPS, che integra la crittografia SSL/TLS, questo adattamento non è stato una panacea per tutti i rischi intrinseci.
Con un po' di ingegno e prendendo spunto dai protocolli esistenti, è possibile affrontare un numero sostanziale dei rischi attuali.
Per compilare questo progetto, hai bisogno di due componenti: Visual Studio e una dipendenza per il controller chiamata CommandLineUtils.
Poiché questo progetto utilizza .NET Core, può essere compilato per varie piattaforme con facilità, senza bisogno di modifiche al codice. Tuttavia, potresti dover implementare funzionalità specifiche adatte alla piattaforma di destinazione.
Per iniziare rapidamente a testare questo progetto, ti consiglio di utilizzare Docker con l'immagine stilliard/pure-ftpd. Questa immagine supporta una serie di opzioni, consentendoti di configurare rapidamente il tuo server FTP con facilità.
docker pull stilliard/pure-ftpd
docker run -d --name ftpd_server -p 21:21 -p 30000-30009:30000-30009 -e "PUBLICHOST: 127.0.0.1" -e "ADDED_FLAGS=-E -A -X -x" -e FTP_USER_NAME=dark -e FTP_USER_PASS=toor -e FTP_USER_HOME=/home/dark stilliard/pure-ftpd
docker run -d --name ftpd_server -p 21:21 -p 30000-30009:30000-30009 -e "PUBLICHOST: 127.0.0.1" -e "ADDED_FLAGS=-E -A -X -x --tls=2" -e FTP_USER_NAME=dark -e FTP_USER_PASS=toor -e FTP_USER_HOME=/home/dark -e "TLS_CN=localhost" -e "TLS_ORG=maislaf" -e "TLS_C=FR" stilliard/pure-ftpd
Sentiti libero di personalizzare le impostazioni secondo le tue esigenze. Tuttavia, sconsiglio vivamente di esporre questo server FTP di test a reti locali o pubbliche. Sarebbe più prudente limitare l'esposizione di questo container alla sola macchina host.
L'opzione ADDED_FLAGS ti permette di ottimizzare il server pure-ftpd. Le spiegazioni di tutte le flag sono disponibili qui.
Alcune flag potrebbero richiedere modifiche al funzionamento del protocollo C2. Ad esempio, se utilizzi l'opzione -K per conservare tutti i file, la possibilità di eliminare file tramite FTP sarà disabilitata. Poiché l'attuale protocollo C2 utilizza questa funzionalità, potresti dover considerare approcci alternativi, come la ridenominazione o lo spostamento dei file.
Per garantire l'integrità e la riservatezza di tutte le comunicazioni tra gli agenti e il C2, la crittografia è stata integrata senza soluzione di continuità nel protocollo di comunicazione, utilizzando gli algoritmi RSA e AES-GCM a 256 bit. L'obiettivo principale di questa funzionalità è impedire la possibilità che un server FTP compromesso possa fornire comandi malevoli. Impiegando la crittografia, l'iniezione di comandi diventa impossibile senza accesso alla chiave pubblica dell'agente. Allo stesso modo, non è possibile iniettare risposte false da parte dell'agente senza possesso della chiave pubblica del C2.
Per semplificare il processo di generazione delle proprie coppie di chiavi (una coppia per l'agente e una per il C2), ho incluso uno strumento di terze parti chiamato RSAKeyHelper. Ogni volta che esegui l'applicazione, ti presenterà una coppia di chiavi pubblica e privata appena generate, che possono essere utilizzate all'interno del programma se scegli di impiegare la crittografia.

Per verificare che tutto funzioni come previsto, ho integrato anche una funzionalità nello stesso strumento che ti consente di testare la crittografia delle stringhe.

La release della versione "3.0 Finale" segna il culmine di questo progetto. Non aggiungerò ulteriori funzionalità; l'obiettivo di questo PoC era dimostrare la creazione di un C2 affidabile e sicuro utilizzando FTP(S). Sei incoraggiato a sviluppare la tua versione con funzionalità personalizzate. Come esercizio, potresti considerare l'implementazione di un tasking multi-thread per evitare che l'applicazione si blocchi durante attività di lunga durata.
Continuerò comunque a fornire supporto per il progetto in termini di correzione di eventuali bug o opportunità di ottimizzazione.
(Lista degli agenti)

(Esegui comando sull'agente attivo (contesto))

(Finestra di debug della console dell'agente con conferma utente per azioni pericolose)
