
Costruisci una botnet di comando e controllo di base in C
Questo hackpack ti guiderà nell'implementazione di un framework di base che caratterizza fondamentalmente un botnet. Potrebbe esserti utile se hai già lavorato con il C. Se ti è piaciuto questo tutorial, assicurati di mettere una stella su questa repo!
Nota: non usare nulla di ciò che impari qui per scopi malevoli. Questo hackpack è esclusivamente un caso di studio sui botnet a scopo educativo. I concetti appresi in questo hackpack hanno casi d'uso di ampia portata (praticamente tutto ciò che riguarda le reti). La cosa più importante è che questo hackpack è pensato per essere testato e distribuito localmente (quindi per favore non condividere nulla di ciò che costruisci legato a questo hackpack con altri hacker). La privacy è importante, quindi per favore rispettala.
Prima di costruire un botnet, è importante capire cosa sia un botnet. Un botnet è una rete di computer in grado di ricevere comandi da remoto e di eseguirli localmente. Facoltativamente, possono scegliere di inoltrare le informazioni ad altri nodi della rete. Sono stati usati per qualsiasi cosa, dagli attacchi Distributed Denial of Service alla diffusione su larga scala di spyware. Potresti aver sentito parlare di molti botnet in passato. I più noti sono forse Mirai e Gameover Zeus, che controllavano rispettivamente 3.8 mila e 3.6 milioni di dispositivi IoT. C'è molta variabilità nel modo in cui i botnet implementano determinati compiti. Ma per costruire il nostro botnet con successo, dobbiamo garantire le seguenti caratteristiche nella nostra rete funzionante.
Il nostro botnet dovrebbe:
Questa struttura è caratteristica di ciò che è noto come botnet Command & Control. Questi botnet hanno un server master e molti server slave. Tuttavia, questo stile di botnet è antiquato e può essere facilmente abbattuto interrompendo l'accesso al dominio master. I botnet più recenti e sofisticati seguono un'architettura peer-to-peer, in cui i diritti di amministrazione sono distribuiti su tutti i nodi o su un sottoinsieme di nodi della rete. Questi botnet rappresentano un grande mal di testa per gli esperti di sicurezza perché non esiste un punto di controllo centrale e possono crescere fino a milioni di nodi. Abbattere questi botnet è di per sé una lettura interessante. Tuttavia, ai fini di questo hackpack, manteniamo le cose semplici. Implementeremo un semplice nodo slave per un botnet C&C.

Questo hackpack si occuperà principalmente dell'implementazione del malware client. Per il server master, possiamo usare un server TCP open-source chiamato Netcat. Netcat non ha nulla a che fare con i botnet. È solo uno strumento comodo e affermato che possiamo riutilizzare per inviare e ricevere pacchetti di testo dai client (che è tutto ciò che un master realmente è). Ho leggermente modificato il server netcat e l'ho compilato in un binario chiamato "master". Non serve altro lavoro qui! Il nostro master è pronto per l'uso.
Passiamo alla parte più interessante: ricevere ed eseguire comandi remoti (ci preoccuperemo di mascherare il nostro malware più avanti). L'obiettivo qui è rendere il nostro nodo slave il più semplice possibile e soddisfare i requisiti dettagliati sopra. Nota che molte costanti sono state definite in lib/macros.h, quindi sentiti libero di usarle. Tutte le firme delle funzioni implementate si trovano in lib/connect.h o lib/utils.h.
Apri il file bot.c. Quando si avvia un nuovo nodo nel nostro server, probabilmente dovremmo dargli un nome in modo che il master sappia a quali client inviare i comandi. Esistono molte convenzioni di denominazione che possono essere utilizzate. Usare un indirizzo IP è probabilmente la scelta migliore perché è un identificatore univoco per ogni client. Tuttavia, per rendere le cose più leggibili per gli esseri umani, usiamo il nome utente del computer. Usando la funzione C getenv() con l'argomento "USER" si ottiene ciò che il computer ha memorizzato nella variabile d'ambiente USER. Questo è uno dei punti in cui è memorizzato il nome utente, quindi usiamolo. Inoltre, ora che il tuo slave è in esecuzione, troviamo il master. Per fare questo, dobbiamo conoscere l'indirizzo IP del nostro master. Ogni dispositivo di rete ha un indirizzo IP. È responsabile dell'identificazione degli altri nodi e dell'indirizzamento della posizione. Inoltre, il master può avere molti server in esecuzione su porte diverse. Quindi, non solo dobbiamo connetterci al master, ma dovremmo anche specificare la porta corretta. Questa porta è scelta dal master ma può essere modificata. In questo hackpack, vogliamo testare in locale. Quindi, useremo il tuo computer come nostra rete. L'indirizzo IP locale di ogni computer (a cui "localhost" risolve anch'esso) è "127.0.0.1". Nel master, ho specificato che deve girare sulla porta 9999. Con queste tre cose (indirizzo IP del master, porta del master e nome dello slave), possiamo avviare una pipeline di comunicazione tra server e client chiamata socket. Passa questi tre argomenti alla funzione init_socket() per creare una socket. init_function() non è un comando C integrato. Piuttosto, dobbiamo implementarlo noi. Poi, dobbiamo allocare un po' di spazio sullo stack per contenere i messaggi in arrivo. Siamo abbastanza generosi e usiamo circa 10KB di spazio nello stack. Chiama questo puntatore allo stack msg. Infine, c'è un'istruzione printf per indicare che tutto sta andando bene.
char* name = //Get the client's username and store it in name
int channel = //initiate a channel given SERVER, PORT, and name;
//Allocate stack space of size CMD_LENGTH to hold data of type char. Call the stack pointer msg
printf("%s joining the botnet\n", name);