
Erstellen Sie ein grundlegendes Command & Control-Botnetz in C
Dieses Hackpack führt dich durch die Implementierung eines grundlegenden Frameworks, das ein Botnetz charakterisiert. Es könnte hilfreich sein, wenn du bereits Erfahrung mit C hast. Wenn dir dieses Tutorial gefällt, gib diesem Repository einen Stern!
Hinweis: Verwende nichts, was du hier lernst, für böswillige Zwecke. Dieses Hackpack dient ausschließlich als Fallstudie zu Botnetzen zu Bildungszwecken. Die in diesem Hackpack vermittelten Konzepte haben weitreichende Anwendungsmöglichkeiten (grundsätzlich alles, was mit Netzwerken zu tun hat). Am wichtigsten ist, dass dieses Hackpack dazu gedacht ist, lokal getestet und eingesetzt zu werden (teile daher bitte nichts, was du im Zusammenhang mit diesem Hackpack erstellst, mit anderen Hackern). Datenschutz ist wichtig, also respektiere ihn bitte.
Bevor du ein Botnetz baust, ist es wichtig zu verstehen, was ein Botnetz ist. Ein Botnetz ist ein Netzwerk von Computern, die in der Lage sind, Befehle remote zu empfangen und lokal auszuführen. Optional können sie Informationen an andere Knoten im Netzwerk weiterleiten. Sie wurden für alles Mögliche eingesetzt, von verteilten Denial-of-Service-Angriffen bis hin zur weit verbreiteten Verbreitung von Spyware. Du hast vielleicht schon von vielen Botnetzen in der Vergangenheit gehört. Die bekanntesten sind wohl Mirai und Gameover Zeus, die 3,8 Tausend bzw. 3,6 Millionen IoT-Geräte kontrollierten. Es gibt große Unterschiede in der Art und Weise, wie Botnetze bestimmte Aufgaben implementieren. Aber um unser Botnetz erfolgreich zu bauen, müssen wir die folgenden Funktionen in unserem funktionierenden Netzwerk sicherstellen.
Unser Botnetz sollte:
Diese Struktur ist charakteristisch für sogenannte Command & Control-Botnetze. Diese Botnetze haben einen Master-Server und viele Slave-Server. Allerdings ist dieser Stil von Botnetzen veraltet und kann leicht zerstört werden, indem der Zugriff auf die Master-Domain unterbrochen wird. Neuere und ausgefeiltere Botnetze folgen einer Peer-to-Peer-Architektur, bei der Administratorrechte entweder auf alle Knoten oder eine Teilmenge der Knoten im Netzwerk verteilt sind. Diese Botnetze bereiten Sicherheitsexperten große Kopfschmerzen, da es keinen zentralen Kontrollpunkt gibt und sie auf Millionen von Knoten anwachsen können. Das Zerstören solcher Botnetze ist für sich genommen eine interessante Lektüre. Für die Zwecke dieses Hackpacks halten wir die Dinge jedoch einfach. Wir werden einen einfachen Slave-Knoten für ein C&C-Botnetz implementieren.

Dieses Hackpack wird sich hauptsächlich mit der Implementierung der Client-Malware befassen. Für den Master-Server können wir einen Open-Source-TCP-Server namens Netcat verwenden. Netcat hat nichts mit Botnetzen zu tun. Es ist einfach ein praktisches, etabliertes Werkzeug, das wir umfunktionieren können, um Textpakete zu und von Clients zu senden (was im Grunde alles ist, was ein Master ist). Ich habe den Netcat-Server leicht angepasst und zu einer Binärdatei namens „master" kompiliert. Keine weitere Arbeit nötig! Unser Master ist einsatzbereit.
Kommen wir zum interessanteren Teil: dem Empfangen und Ausführen von Remote-Befehlen (um die Tarnung unserer Malware kümmern wir uns später). Das Ziel hier ist es, unseren Slave-Knoten so einfach wie möglich zu gestalten und die oben beschriebenen Anforderungen zu erfüllen. Beachte, dass viele Konstanten in lib/macros.h definiert sind, also kannst du diese gerne verwenden. Alle implementierten Funktionssignaturen finden sich entweder in lib/connect.h oder lib/utils.h.
Öffne die Datei bot.c. Wenn wir einen neuen Knoten in unserem Server starten, sollten wir ihn wahrscheinlich benennen, damit der Master weiß, an welche Clients er Befehle senden soll. Es gibt viele Namenskonventionen, die verwendet werden können. Die Verwendung einer IP-Adresse ist wahrscheinlich am besten, da es sich um eine eindeutige Kennung für jeden Client handelt. Um die Dinge jedoch für normale Menschen lesbarer zu machen, verwenden wir den Benutzernamen des Computers. Die C-Funktion getenv() mit dem Argument "USER" gibt zurück, was der Computer in der Umgebungsvariablen USER gespeichert hat. Hier wird der Benutzername des Benutzers gespeichert, also verwenden wir das. Außerdem: Da dein Slave jetzt läuft, suchen wir nach dem Master. Dazu müssen wir die IP-Adresse unseres Masters kennen. Jedes Netzwerkgerät hat eine IP-Adresse. Sie ist für die Identifizierung anderer Knoten und die Standortadressierung verantwortlich. Außerdem kann der Master viele Server auf verschiedenen Ports betreiben. Wir müssen uns also nicht nur mit dem Master verbinden, sondern auch den richtigen Port angeben. Dieser Port wird vom Master gewählt, kann aber geändert werden. In diesem Hackpack möchten wir lokal testen. Also verwenden wir deinen Computer als unser Netzwerk. Die lokale IP-Adresse jedes Computers (zu der auch „localhost" aufgelöst wird) ist "127.0.0.1". Ich habe im Master angegeben, dass er auf Port 9999 läuft. Mit diesen drei Dingen (Master-IP-Adresse, Master-Port und Slave-Name) können wir eine Kommunikationspipeline zwischen Server und Client starten, die als Socket bezeichnet wird. Übergib diese drei Argumente an die Funktion init_socket(), um einen Socket zu erstellen. init_function() ist kein eingebauter C-Befehl. Vielmehr müssen wir ihn implementieren. Dann müssen wir etwas Speicher auf dem Stack für eingehende Nachrichten reservieren. Seien wir großzügig und verwenden etwa 10 KB Stack-Speicher. Nenne diesen Stack-Zeiger msg. Schließlich gibt es eine printf-Anweisung, um anzuzeigen, dass alles gut läuft.
char* name = //Hole den Benutzernamen des Clients und speichere ihn in name
int channel = //Initialisiere einen Kanal mit SERVER, PORT und name;
//Reserviere Stack-Speicher der Größe CMD_LENGTH für Daten vom Typ char. Nenne den Stack-Zeiger msg
printf("%s tritt dem Botnetz bei\n", name);