
Ein Workshop über Malware-Entwicklung
Im Zeitalter von EDR können Red-Team-Operateure nicht mehr mit vorkompilierten Payloads auskommen. Daher wird Malware-Entwicklung zu einer unverzichtbaren Fähigkeit für jeden Operator. Der Einstieg in die Maldev mag abschreckend wirken, ist aber tatsächlich sehr einfach. Dieser Workshop zeigt Ihnen alles, was Sie für den Einstieg brauchen!
Dieses Repository enthält die Folien und begleitenden Übungen für den Workshop 'MalDev for Dummies', der auf der Hack in Paris 2022 und der X33fcon 2023 durchgeführt wurde bzw. wird. Obwohl die Folien für die 'persönliche' Präsentation konzipiert wurden, bleiben die Materialien und Übungen hier verfügbar, um in Ihrem eigenen Tempo bearbeitet zu werden – der Lernprozess sollte niemals überstürzt werden! Issues und Pull Requests zu diesem Repository mit Fragen und/oder Vorschlägen sind willkommen.
⚠ Haftungsausschluss: Malware-Entwicklung ist eine Fähigkeit, die – und sollte – für das Gute genutzt werden, um das Feld der (offensiven) Sicherheit voranzubringen und unsere Abwehr scharf zu halten. Wenn Sie diese Fähigkeiten jemals für Aktivitäten nutzen, für die Sie keine Autorisierung haben, sind Sie ein größerer Dummkopf, als dieser Workshop vorsieht, und Sie sollten sich schnell davonmachen.
Da Antiviren- (AV) und Enterprise Detection and Response (EDR)-Tools von Minute zu Minute ausgereifter werden, ist das Red Team gezwungen, der Kurve voraus zu sein. Vorbei sind die Zeiten von execute-assembly und dem Ablegen unmodifizierter Payloads auf der Festplatte – wenn Ihre Engagements länger als eine Woche dauern sollen, müssen Sie Ihr Payload-Erstellungs- und Malware-Entwicklungsspiel verbessern. Der Einstieg in dieses Feld kann jedoch einschüchternd wirken, und die richtigen Ressourcen zu finden ist nicht immer einfach.
Dieser Workshop richtet sich an Anfänger in diesem Bereich und führt Sie durch Ihre ersten Schritte als Malware-Entwickler. Er richtet sich hauptsächlich an offensive Praktiker, aber defensive Praktiker sind ebenfalls herzlich willkommen, ihre Fähigkeiten zu erweitern.
Während des Workshops gehen wir etwas Theorie durch, danach richten wir eine Laborumgebung für Sie ein. Es gibt verschiedene Übungen, die Sie je nach Ihrem aktuellen Kenntnisstand und Ihrem Komfortniveau mit dem Thema absolvieren können. Das Ziel des Workshops ist es jedoch zu lernen, und explizit nicht, alle Übungen abzuschließen. Sie können Ihre bevorzugte Programmiersprache für die Malware-Entwicklung frei wählen, aber die Unterstützung während des Workshops erfolgt hauptsächlich für die Programmiersprachen C# und Nim.
Während des Workshops besprechen wir die wichtigsten Themen, die für den Einstieg in die Erstellung eigener Malware erforderlich sind. Dazu gehören (aber nicht beschränkt auf):
Um mit der Malware-Entwicklung zu beginnen, benötigen Sie einen Entwicklungsrechner, damit Sie nicht von defensiven Tools gestört werden, die auf Ihrem Host-Rechner laufen könnten. Ich bevorzuge Windows für die Entwicklung, aber Linux oder MacOS tun es auch. Installieren Sie Ihren bevorzugten Editor/IDE (ich verwende VS Code für fast alles außer C#, wofür ich Visual Studio verwende) und installieren Sie dann die Toolchains, die für Ihre bevorzugte MalDev-Sprache erforderlich sind:
Vergessen Sie nicht, Windows Defender zu deaktivieren oder die entsprechenden Ausnahmen hinzuzufügen, damit Ihre harte Arbeit nicht unter Quarantäne gestellt wird! Später können wir auf einem separaten Rechner mit defensiven Kontrollen wie aktiviertem AV testen.
ℹ Hinweis: Oftmals können Paketmanager wie
aptoder Softwareverwaltungstools wie Chocolatey oder Winget (jetzt eingebaut!) verwendet werden, um die Installation und Verwaltung von Abhängigkeiten auf bequeme und wiederholbare Weise zu automatisieren. Seien Sie sich jedoch bewusst, dass Versionen in Paketmanagern ein paar Versionen hinter der echten Sache zurück sein können! Unten sehen Sie ein Beispielbefehl, um die genannten Tools auf einmal zu installieren.choco install -y nim choosenim go rust vscode visualstudio2019community dotnetfx
Die Sprachen, die wir in diesem Workshop besprechen werden, sind kompilierte Sprachen, was bedeutet, dass ein Compiler verwendet wird, um Ihren Quellcode in binäre ausführbare Dateien Ihres gewählten Formats zu übersetzen. Der Kompilierungsprozess unterscheidet sich pro Sprache.
C#-Code (.cs-Dateien) kann entweder direkt (mit dem Dienstprogramm csc) oder über Visual Studio selbst kompiliert werden. Der meiste Quellcode in diesem Repository (außer der Lösung zu Bonusübung 3) kann wie folgt kompiliert werden.
ℹ Hinweis: Stellen Sie sicher, dass Sie den folgenden Befehl in einer "Visual Studio Developer-Eingabeaufforderung" ausführen, damit das System weiß, wo
csczu finden ist. Es wird empfohlen, die "x64 Native Tools-Eingabeaufforderung" für Ihre Version von Visual Studio zu verwenden. Das/unsafe-Flag wird für die meisten Skripte benötigt, bei denen wir direkt auf Low-Level-Funktionalität zugreifen.
csc filename.exe
Sie können Kompilierungszeitoptimierungen mit dem Flag /optimize aktivieren. Sie können das Konsolenfenster auch mit /target:winexe ausblenden oder als DLL mit /target:library kompilieren (stellen Sie jedoch sicher, dass Ihre Codestruktur dafür geeignet ist).
Nim-Code (.nim-Dateien) wird mit dem Befehl nim c kompiliert. Der Quellcode in diesem Repository kann wie folgt kompiliert werden.
nim c filename.nim
Wenn Sie Ihren Build für Größe optimieren und Debug-Informationen entfernen möchten (viel besser für OpSec!), können Sie die folgenden Flags hinzufügen.
nim c -d:release -d:strip --opt:size filename.nim
Optional können Sie auch das Konsolenfenster mit --app:gui ausblenden.
Golang-Code (.go-Dateien) wird mit dem Befehl go build kompiliert. Der Quellcode in diesem Repository kann wie folgt kompiliert werden.
GOOS=windows go build
Wenn Sie Ihren Build für Größe optimieren und Debug-Informationen entfernen möchten (viel besser für OpSec!), können Sie die folgenden Flags hinzufügen.
GOOS=windows go build -ldflags "-s -w"
Rust-Code (.rs-Dateien) wird über den Befehl cargo kompiliert. Cargo kann verwendet werden, um Ihre Abhängigkeiten zu verwalten und Ihr Projekt zu bauen. Der Quellcode in diesem Repository kann kompiliert werden, indem Sie in den Projektordner navigieren und den folgenden Befehl ausführen.
cargo build
Wenn Sie Ihren Build für Größe optimieren und Debug-Informationen entfernen möchten, können Sie die folgenden Flags hinzufügen. Beachten Sie auch den Abschnitt [profile.release] in jeder Cargo.toml-Datei für einige OpSec-Optionen zur Kompilierungszeit.
cargo build --release
Die meisten Lösungen können ohne Abhängigkeiten kompiliert werden. Falls Abhängigkeiten erforderlich sind, wird ein Visual Studio-Projekt bereitgestellt, das auf die entsprechenden NuGet-Pakete verweist.
Die meisten Nim-Programme hängen von einer Bibliothek namens "Winim" ab, um mit der Windows-API zu kommunizieren. Sie können die Bibliothek mit dem Paketmanager Nimble wie folgt installieren (nach der Installation von Nim):
nimble install winim
Einige Abhängigkeiten werden im Quellcode dieses Repositorys verwendet. Sie können sie wie folgt installieren (nach der Installation von Go):
go mod tidy
Einige Beispiele hängen von der windows-sys-Kiste ab, um die Windows-API aufzurufen. Da wir Cargo verwenden, werden Pakete automatisch verwaltet, wenn Sie einen Test- oder Release-Build kompilieren.
Die Workshop-Folien verweisen auf einige Ressourcen, die Sie für den Einstieg nutzen können. Zusätzliche Ressourcen wie relevante Blogs oder Codeausschnitte sind in den README.md-Dateien jeder Übung aufgeführt!