
Spartacus — Boîte à outils de détournement DLL/COM
[!CAUTION] Ce dépôt n'est plus maintenu, visitez https://github.com/sadreck/Spartacus pour la dernière version.
Si vous avez vu le film Spartacus de 1960, vous vous souviendrez de la scène où les Romains demandent à Spartacus de se rendre. Au moment où le vrai Spartacus s'est levé, beaucoup d'autres se sont levés aussi et ont prétendu être lui en utilisant la phrase « JE SUIS SPARTACUS ».
Lorsqu'un processus vulnérable au détournement de DLL demande le chargement d'une DLL, c'est un peu comme s'il demandait « QUI EST VERSION.DLL ? » et des répertoires aléatoires commencent à clamer « JE SUIS VERSION.DLL » et « NON, JE SUIS VERSION.DLL ». Et donc, Spartacus.
DllMain. Cette technique a été inspirée et implémentée à partir de l'explication sur https://www.redteam.cafe/red-team/dll-sideloading/dll-sideloading-not-by-dllmain, par Shantanu Khandelwal.[Défense] Mode de surveillance tentant d'identifier les applications en cours d'exécution qui mandatent des appels, comme dans « Détournement de DLL en cours ». Ce n'est que pour attraper les fruits tombés et ne doit pas être considéré comme fiable.Trouvez et téléchargez la dernière version de Spartacus sous Releases. Sinon, clonez simplement ce dépôt et compilez à partir des sources.
Voici une description de chacun des modes que Spartacus prend en charge.
Remarque : Les arguments de ligne de commande ont considérablement changé entre la v1 et la v2.
La fonctionnalité originale de Spartacus consistait uniquement à trouver des vulnérabilités de détournement de DLL. Son fonctionnement est le suivant :
CreateFile..dll.procmon.exe ou procmon64.exe.Drop Filtered Events pour garantir une taille minimale du fichier PML.Auto Scroll.ENTRÉE.ENTRÉE.NAME_NOT_FOUND et PATH_NOT_FOUND.Collectez tous les événements et enregistrez-les dans C:\Data\logs.pml. Toutes les DLL vulnérables seront sauvegardées sous C:\Data\VulnerableDLLFiles.csv et toutes les solutions de DLL mandataires dans C:\Data\Solutions.
--mode dll --procmon C:\SysInternals\Procmon.exe --pml C:\Data\logs.pml --csv C:\Data\VulnerableDLLFiles.csv --solution C:\Data\Solutions --verbose
Analyser un fichier journal PML existant, sauvegarder la sortie au format CSV et générer des solutions Visual Studio mandataires.
--mode dll --existing --pml C:\MyData\SomeBackup.pml --csv C:\Data\VulnerableDLLFiles.csv --solution C:\Data\Solutions --verbose


Une nouvelle fonctionnalité de Spartacus est d'identifier les vulnérabilités de détournement COM local. Son fonctionnement est le suivant :
RegOpenKey.procmon.exe ou procmon64.exe.Drop Filtered Events pour garantir une taille minimale du fichier PML.Auto Scroll.ENTRÉE.ENTRÉE.InprocServer32 et dont le résultat est NAME_NOT_FOUND.HKEY_CURRENT_USER, rechercher son GUID sous HKEY_CLASSES_ROOT et inclure ses détails dans le fichier CSV d'exportation (si trouvé).Pour le détournement COM, Spartacus prend également en charge l'analyse du système local pour les entrées COM mal configurées :
HKEY_CLASSES_ROOT, HKEY_CURRENT_USER et HKEY_LOCAL_MACHINE.InProcServer, InProcServer32, LocalServer ou LocalServer32.Collectez tous les événements et enregistrez-les dans C:\Data\logs.pml. Toutes les informations COM vulnérables seront sauvegardées sous C:\Data\VulnerableCOM.csv.
--mode com --procmon C:\SysInternals\Procmon.exe --pml C:\Data\logs.pml --csv C:\Data\VulnerableCOM.csv --verbose
Traiter un fichier PML existant pour identifier les entrées COM vulnérables.
--mode com --existing --pml C:\Data\logs.pml --csv C:\Data\VulnerableCOM.csv --verbose
Énumérer le registre du système local pour identifier les bibliothèques et exécutables COM manquants ou mal configurés.
--mode com --acl --csv C:\Data\VulnerableCOM.csv --verbose


Spartacus prend en charge la génération de solutions Visual Studio en créant des projets squelette que vous pouvez utiliser, basés sur la DLL que vous souhaitez exploiter.
DllMain.DllMain.version.dll, vous pourriez exécuter votre implant depuis GetFileVersionInfoExW si cette fonction est appelée par l'application vulnérable.Générer une solution qui redirige toutes les exportations (sans mandataire de fonction).
--mode proxy --dll C:\Windows\System32\version.dll --solution "C:\data\tmp\refactor-version" --overwrite --verbose --external-resources
Il est possible d'entrer plusieurs DLL en une seule fois.
--mode proxy --dll C:\Windows\System32\version.dll --dll C:\Windows\System32\userenv.dll --solution "C:\data\tmp\dll-collection" --overwrite --verbose --external-resources
Créer des mandataires pour autant de fonctions que possible (basé sur la sortie de Ghidra).
--mode proxy --ghidra C:\ghidra\support\analyzeHeadless.bat --dll C:\Windows\System32\userenv.dll --solution C:\Projects\spartacus-userenv --overwrite --verbose
Identique au précédent, mais utiliser des fichiers de ressources externes pour générer la solution (si vous devez les modifier).
--mode proxy --ghidra C:\ghidra\support\analyzeHeadless.bat --dll C:\Windows\System32\userenv.dll --solution C:\Projects\spartacus-userenv --overwrite --verbose --external-resources
Utiliser des prototypes de fonctions pré-générés pour les fonctions pour lesquelles Ghidra n'a pas pu extraire les définitions de fonctions.
--mode proxy --ghidra C:\ghidra\support\analyzeHeadless.bat --dll C:\Windows\System32\userenv.dll --solution C:\Projects\spartacus-userenv --overwrite --verbose --external-resources --prototypes C:\data\prototypes.csv
Générer des mandataires uniquement pour les fonctions GetFileVersionInfoExW et GetFileVersionInfoExA.
--mode proxy --ghidra C:\ghidra\support\analyzeHeadless.bat --dll C:\Windows\System32\version.dll --solution C:\Projects\spartacus-version --verbose --overwrite --external-resources --only "GetFileVersionInfoExW, GetFileVersionInfoExA"
Générer une base de données de prototypes de fonctions à partir de fichiers *.h existants, en aidant à générer des fonctions mandataires pour celles dont Ghidra n'a pas pu extraire la définition de fonction.
--mode proxy --action prototypes --path "C:\Program Files (x86)\Windows Kits" --csv C:\data\prototypes.csv --verbose
Lister les exportations d'une DLL et vérifier si chaque fonction possède un prototype pré-généré.
--mode proxy --action exports --dll C:\Windows\System32\version.dll --dll C:\Windows\System32\amsi.dll --prototypes ./Assets/prototypes.csv
Spartacus prend désormais en charge la génération de certificats auto-signés (tout en copiant les attributs des fichiers existants) et la signature de fichiers DLL.
Créer un certificat de signature, en utilisant les propriétés de C:\Windows\System32\version.dll (doit être une DLL signée).
--mode sign --action generate --pfx "C:\Output\certificate.pfx" --password "Welcome1" --not-before "2022-12-31 00:00:55" --not-after "2026-01-01 00:00:01" --copy-from C:\Windows\System32\version.dll --verbose
Signer une DLL en utilisant un certificat existant/généré.
--mode sign --action sign --pfx "C:\Output\certificate.pfx" --password "Welcome1" --path "C:\Input\MyFakeVersion.dll" --algorithm SHA256 --verbose
Spartacus a également un mode --detect, qui essaie d'identifier un mandat actif de DLL. La logique derrière cela est :
Pour utiliser cette fonctionnalité, exécutez simplement Spartacus avec --detect.
Spartacus prend en charge le mode --sign qui vous permet à la fois de générer des certificats auto-signés, mais aussi de signer les DLL compilées avec ceux-ci.
Générer un certificat auto-signé, en copiant l'Émetteur/Sujet d'un fichier existant :
--mode sign --action generate --pfx "C:\Output\myCertificate.pfx" --password "Welcome1" --not-before "2023-01-01 00:00:04" --not-after "2025-01-01 00:00:42" --copy-from C:\Windows\System32\version.dll --verbose
Et utilisez ce certificat pour signer votre fichier compilé :
--mode sign --action sign --pfx "C:\Output\myCertificate.pfx" --password "Welcome1" --path "C:\Projects\Spartacus-AMSI\amsi.dll" --algorithm SHA256 --verbose
Pour vous faciliter la vie, utilisez le fichier CommandLineGenerator.html.
Que ce soit une faute de frappe, un bug ou une nouvelle fonctionnalité, Spartacus est très ouvert aux contributions tant que nous sommes d'accord sur les points suivants :
proxy.| Mode | Argument | Description |
|---|
--mode | Définit le mode à utiliser, un parmi : dll, proxy, com et detect. | |
tous | --verbose | Activer la sortie détaillée. |
tous | --debug | Activer la sortie de débogage. |
tous | --external-resources | Par défaut, Spartacus utilise des ressources intégrées pour générer les fichiers de solution VS, etc. Si vous devez modifier les modèles, utilisez cet argument pour que Spartacus charge tous les fichiers depuis le dossier ./Assets. |
dll, com | --procmon | Emplacement (fichier) de Process Monitor SysInternals procmon.exe ou procmon64.exe |
dll, com | --pml | Emplacement (fichier) pour stocker le fichier journal d'événements ProcMon. Si le fichier existe, il sera écrasé. Lorsqu'il est utilisé avec --existing, il indique le fichier journal à lire et ne sera pas écrasé. |
dll, com | --pmc | Définir un fichier ProcMon (PMC) personnalisé à utiliser. Ce fichier ne sera pas modifié et sera utilisé tel quel. |
dll, com | --csv | Emplacement (fichier) pour stocker la sortie CSV de l'exécution. |
dll, proxy | --solution | Chemin du répertoire où les solutions pour les DLL mandataires seront stockées. |
dll, com | --existing | Commutateur pour indiquer que Spartacus doit traiter un fichier journal d'événements ProcMon existant (PML). Pour indiquer le fichier journal, utilisez --pml, utile lorsque vous avez fait tourner ProcMon pendant des heures ou que vous l'avez utilisé en mode Boot Logging. |
dll | --all | Par défaut, toute DLL dans les répertoires Windows ou Program Files sera ignorée. Utilisez ceci pour inclure ces répertoires dans la sortie. |
proxy | --ghidra | Chemin vers le fichier 'analyzeHeadless.bat' de Ghidra. Utilisé lorsque vous souhaitez mandater des fonctions spécifiques plutôt que seulement DllMain. |
proxy | --dll | Chemin vers la DLL que vous souhaitez mandater, et peut inclure plusieurs instances de cet argument. De plus, peut contenir des wildcards comme C:\Windows\System32\*.dll - cependant tous les chemins doivent se terminer par *.dll. |
proxy, sign | --overwrite | Si le fichier --solution (proxy) ou --pfx (sign) existe déjà, utilisez cet indicateur pour l'écraser. |
proxy | --only | Générer des fonctions mandataires uniquement pour les fonctions définies dans cette variable. Les valeurs sont séparées par des virgules comme 'WTSFreeMemory,WTSFreeMemoryExA,WTSSetUserConfigA'. |
proxy | --action | L'action par défaut est de générer une solution VS. --action prototypes prend en entrée un dossier du SDK Windows et analyse les fichiers *.h afin de générer une base de données de prototypes de fonctions. --action exports affiche les fonctions d'exportation d'une DLL et, lorsqu'il est complété par --prototypes, affiche si la définition de la fonction a été pré-générée. |
sign | --action | Lors de l'utilisation de --action avec le module sign, il prend l'une des deux options : generate pour créer un PFX et sign pour signer un fichier. |
proxy | --path | Fonctionne actuellement uniquement avec --action prototypes et correspond à l'emplacement d'un répertoire du SDK Windows. |
proxy | --prototypes | Emplacement de prototypes.csv (actuellement dans le dossier ./Assets). |
com | --acl | Énumérer le système local pour les bibliothèques et exécutables COM manquants ou mal configurés. |
sign | --subject | Utilisé avec --action generate pour spécifier le sujet du certificat. |
sign | --issuer | Utilisé avec --action generate pour spécifier l'émetteur du certificat. |
sign | --copy-from | Utilisé avec --action generate pour spécifier un fichier signé existant dont copier l'Émetteur et le Sujet. |
sign | --not-before | Utilisé avec --action generate pour définir la date à partir de laquelle le nouveau certificat sera valide, format AAAA-MM-JJ HH:MM:SS. |
sign | --not-after | Utilisé avec --action generate pour définir la date jusqu'à laquelle le nouveau certificat sera valide, format AAAA-MM-JJ HH:MM:SS. |
sign | --pfx | Lorsqu'il est utilisé avec --action generate, c'est l'emplacement où le fichier pfx sera enregistré. Lorsqu'il est utilisé avec --action sign, c'est l'emplacement à partir duquel le fichier pfx sera chargé. |
sign | --password | Lorsqu'il est utilisé avec --action generate, il définit le mot de passe pour le fichier --pfx. |
sign | --path | Lorsqu'il est utilisé avec --action sign, il définit l'emplacement du fichier exécutable/DLL à signer. |
sign | --algorithm | Lorsqu'il est utilisé avec --action sign, il définit l'algorithme de hachage qui sera utilisé pour la signature. Options : MD5, SHA1, SHA256, SHA384, SHA512. |
sign | --timestamp | Lorsqu'il est utilisé avec --action sign, il définit le serveur d'horodatage, comme http://timestamp.sectigo.com ou http://timestamp.digicert.com. |