
Un atelier sur le développement de malwares
À l'ère des EDR, les opérateurs red team ne peuvent plus se contenter d'utiliser des charges utiles pré-compilées. Par conséquent, le développement de malwares devient une compétence vitale pour tout opérateur. Se lancer dans le maldev peut sembler intimidant, mais c'est en réalité très facile. Cet atelier vous montrera tout ce dont vous avez besoin pour commencer !
Ce dépôt contient les diapositives et les exercices d'accompagnement pour l'atelier « MalDev for Dummies » qui a été / sera animé à Hack in Paris 2022 et X33fcon 2023. Bien que les diapositives aient été conçues pour être présentées « en personne », le matériel et les exercices resteront disponibles ici pour être réalisés à votre rythme – le processus d'apprentissage ne doit jamais être précipité ! Les issues et pull requests sur ce dépôt avec des questions et/ou suggestions sont les bienvenus.
⚠ Avertissement : Le développement de malwares est une compétence qui peut – et devrait – être utilisée pour le bien, afin de faire progresser le domaine de la sécurité (offensive) et de maintenir nos défenses en alerte. Si vous utilisez jamais ces compétences pour mener des activités sans autorisation, vous êtes un plus grand idiot que celui visé par cet atelier et vous devriez déguerpir d'ici.
Avec les antivirus (AV) et les outils de détection et réponse d'entreprise (EDR) devenant de plus en plus matures chaque minute, la red team est contrainte de rester en avance sur la courbe. Fini le temps de execute-assembly et du dépôt de charges utiles non modifiées sur le disque – si vous voulez que vos engagements durent plus d'une semaine, vous devrez améliorer votre jeu de création de charges utiles et de développement de malwares. Se lancer dans ce domaine peut sembler intimidant, et trouver les bonnes ressources n'est pas toujours facile.
Cet atelier s'adresse aux débutants dans le domaine et vous guidera à travers vos premiers pas en tant que développeur de malwares. Il est principalement destiné aux praticiens offensifs, mais les praticiens défensifs sont également les bienvenus pour y assister et élargir leurs compétences.
Pendant l'atelier, nous aborderons de la théorie, après quoi nous vous installerons un environnement de laboratoire. Il y aura divers exercices que vous pourrez compléter en fonction de vos compétences actuelles et de votre niveau d'aise avec le sujet. Cependant, le but de l'atelier est d'apprendre, et explicitement pas de terminer tous les exercices. Vous êtes libre de choisir votre langage de programmation préféré pour le développement de malwares, mais le soutien pendant l'atelier est fourni principalement pour les langages C# et Nim.
Pendant l'atelier, nous discuterons des sujets clés nécessaires pour commencer à construire votre propre malware. Cela inclut (sans s'y limiter) :
Pour commencer avec le développement de malwares, vous aurez besoin d'une machine de développement afin de ne pas être dérangé par les outils défensifs qui pourraient tourner sur votre machine hôte. Je préfère Windows pour le développement, mais Linux ou MacOS feront tout aussi bien. Installez votre éditeur/IDE de choix (j'utilise VS Code pour presque tout sauf C#, pour lequel j'utilise Visual Studio), puis installez les chaînes d'outils nécessaires pour le langage de MalDev de votre choix :
N'oubliez pas de désactiver Windows Defender ou d'ajouter les exclusions appropriées, pour que votre dur labeur ne soit pas mis en quarantaine ! Plus tard, nous pourrons tester sur une machine séparée avec des contrôles défensifs comme l'AV activé.
ℹ Note : Souvent, les gestionnaires de paquets tels que
aptou les outils de gestion de logiciels tels que Chocolatey ou Winget (désormais intégré !) peuvent être utilisés pour automatiser l'installation et la gestion des dépendances de manière pratique et reproductible. Soyez cependant conscient que les versions dans les gestionnaires de paquets peuvent être en retard de quelques versions par rapport à la réalité ! Voici un exemple de commande pour installer tous les outils mentionnés en une seule fois.choco install -y nim choosenim go rust vscode visualstudio2019community dotnetfx
Les langages que nous aborderons pendant cet atelier sont des langages compilés, ce qui signifie qu'un compilateur est utilisé pour traduire votre code source en exécutables binaires du format choisi. Le processus de compilation diffère selon le langage.
Le code C# (fichiers .cs) peut être compilé directement (avec l'utilitaire csc) ou via Visual Studio lui-même. La plupart du code source de ce dépôt (sauf la solution de l'exercice bonus 3) peut être compilé comme suit.
ℹ Note : Assurez-vous d'exécuter la commande ci-dessous dans une « Invite de commandes développeur Visual Studio » afin qu'elle sache où trouver
csc; il est recommandé d'utiliser l'« Invite de commandes d'outils natifs x64 » pour votre version de Visual Studio. Le flag/unsafesera nécessaire pour la plupart des scripts où nous accédons directement à des fonctionnalités de bas niveau.
csc filename.exe
Vous pouvez activer les optimisations à la compilation avec le flag /optimize. Vous pouvez également masquer la fenêtre de console en ajoutant /target:winexe, ou compiler en DLL avec /target:library (mais assurez-vous que la structure de votre code est adaptée).
Le code Nim (fichiers .nim) est compilé avec la commande nim c. Le code source de ce dépôt peut être compilé comme suit.
nim c filename.nim
Si vous souhaitez optimiser votre build pour la taille et supprimer les informations de débogage (bien meilleur pour l'opsec !), vous pouvez ajouter les flags suivants.
nim c -d:release -d:strip --opt:size filename.nim
Optionnellement, vous pouvez également masquer la fenêtre de console en ajoutant --app:gui.
Le code Golang (fichiers .go) est compilé avec la commande go build. Le code source de ce dépôt peut être compilé comme suit.
GOOS=windows go build
Si vous souhaitez optimiser votre build pour la taille et supprimer les informations de débogage (bien meilleur pour l'opsec !), vous pouvez ajouter les flags suivants.
GOOS=windows go build -ldflags "-s -w"
Le code Rust (fichiers .rs) est compilé via la commande cargo. Cargo peut être utilisé pour gérer vos dépendances et construire votre projet. Le code source de ce dépôt peut être compilé en naviguant dans le dossier du projet et en exécutant la commande suivante.
cargo build
Si vous souhaitez optimiser votre build pour la taille et supprimer les informations de débogage, vous pouvez ajouter les flags suivants. Référez-vous également à la section [profile.release] de chaque fichier Cargo.toml pour quelques options d'opsec à la compilation.
cargo build --release
La plupart des solutions peuvent être compilées sans dépendances. Si des dépendances sont nécessaires, un projet Visual Studio est fourni qui pointe vers les packages NuGet appropriés.
La plupart des programmes Nim dépendent d'une bibliothèque appelée « Winim » pour interagir avec l'API Windows. Vous pouvez installer la bibliothèque avec le gestionnaire de paquets Nimble comme suit (après avoir installé Nim) :
nimble install winim
Certaines dépendances sont utilisées dans le code source de ce dépôt. Vous pouvez les installer comme suit (après avoir installé Go) :
go mod tidy
Quelques exemples dépendent de la crate windows-sys pour appeler l'API Windows. Puisque nous utilisons Cargo, les packages seront automatiquement gérés lorsque vous compilez une build de test ou de release.
Les diapositives de l'atelier font référence à certaines ressources que vous pouvez utiliser pour commencer. Des ressources supplémentaires, comme des blogs pertinents ou des extraits de code, sont listées dans les fichiers README.md de chaque exercice !