
Spartacus DLL/COM Hijacking Toolkit
[!CAUTION] Dieses Repository wird nicht mehr gewartet. Besuchen Sie https://github.com/sadreck/Spartacus für die neueste Version.
Wenn Sie den Film Spartacus aus dem Jahr 1960 gesehen haben, erinnern Sie sich an die Szene, in der die Römer verlangen, dass Spartacus sich ergibt. In dem Moment, als der echte Spartacus aufstand, standen auch viele andere auf und behaupteten, er zu sein, mit dem Satz „ICH BIN SPARTACUS“.
Wenn ein Prozess, der anfällig für DLL-Hijacking ist, nach dem Laden einer DLL fragt, ist es, als würde er fragen: „WER IST VERSION.DLL?“ und zufällige Verzeichnisse beginnen zu behaupten: „ICH BIN VERSION.DLL“ und „NEIN, ICH BIN VERSION.DLL“. Und daher der Name Spartacus.
DllMain laufen zu lassen. Diese Technik wurde inspiriert und implementiert aus der Anleitung unter https://www.redteam.cafe/red-team/dll-sideloading/dll-sideloading-not-by-dllmain, von Shantanu Khandelwal.[Abwehr] Überwachungsmodus, der versucht, laufende Anwendungen zu identifizieren, die Aufrufe weiterleiten, also „DLL-Hijacking im Gange“. Dies dient nur dazu, einfache Funde zu machen, und sollte nicht als zuverlässig angesehen werden.Finden und laden Sie die neueste Version von Spartacus unter Releases herunter. Klonen Sie andernfalls einfach dieses Repository und bauen Sie aus dem Quellcode.
Nachfolgend wird jeder der Modi beschrieben, die Spartacus unterstützt.
Hinweis: Die Kommandozeilenargumente haben sich von v1 zu v2 erheblich geändert.
Die ursprüngliche Funktionalität von Spartacus war ausschließlich das Auffinden von DLL-Hijacking-Schwachstellen. Die Funktionsweise ist:
CreateFile..dll.procmon.exe oder procmon64.exe.Drop Filtered Events aktivieren, um eine minimale PML-Ausgabegröße zu gewährleisten.Auto Scroll deaktivieren.ENTER drückt.ENTER drückt.NAME_NOT_FOUND oder PATH_NOT_FOUND auftritt, erstellen.Sammeln Sie alle Ereignisse und speichern Sie sie in C:\Data\logs.pml. Alle anfälligen DLLs werden in C:\Data\VulnerableDLLFiles.csv gespeichert und alle Proxy-DLL-Projektmappen in 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
Ein vorhandenes PML-Ereignisprotokoll parsen, die Ausgabe in CSV speichern und Proxy-Visual-Studio-Projektmappen generieren.
--mode dll --existing --pml C:\MyData\SomeBackup.pml --csv C:\Data\VulnerableDLLFiles.csv --solution C:\Data\Solutions --verbose


Eine neue Funktionalität von Spartacus ist die Identifizierung lokaler COM-Hijacking-Schwachstellen. Die Funktionsweise ist:
RegOpenKey.procmon.exe oder procmon64.exe.Drop Filtered Events aktivieren, um eine minimale PML-Ausgabegröße zu gewährleisten.Auto Scroll deaktivieren.ENTER drückt.ENTER drückt.InprocServer32 enden und deren Ergebnis NAME_NOT_FOUND ist.HKEY_CURRENT_USER liegt, nach seiner GUID unter HKEY_CLASSES_ROOT suchen und deren Details (falls gefunden) in die CSV-Exportdatei aufnehmen.Für COM-Hijacking unterstützt Spartacus auch das Scannen des lokalen Systems nach falsch konfigurierten COM-Einträgen:
HKEY_CLASSES_ROOT, HKEY_CURRENT_USER und HKEY_LOCAL_MACHINE aufzählen.InProcServer, InProcServer32, LocalServer oder LocalServer32 suchen.Sammeln Sie alle Ereignisse und speichern Sie sie in C:\Data\logs.pml. Alle anfälligen COM-Informationen werden in C:\Data\VulnerableCOM.csv gespeichert.
--mode com --procmon C:\SysInternals\Procmon.exe --pml C:\Data\logs.pml --csv C:\Data\VulnerableCOM.csv --verbose
Eine vorhandene PML-Datei verarbeiten, um anfällige COM-Einträge zu identifizieren.
--mode com --existing --pml C:\Data\logs.pml --csv C:\Data\VulnerableCOM.csv --verbose
Die lokale Systemregistrierung durchsuchen, um fehlende/falsch konfigurierte COM-Bibliotheken und -Executables zu identifizieren.
--mode com --acl --csv C:\Data\VulnerableCOM.csv --verbose


Spartacus unterstützt die Generierung von Visual Studio-Projektmappen, indem Skelettprojekte erstellt werden, die Sie basierend auf der DLL, die Sie ausnutzen möchten, verwenden können.
DllMain-Funktion ausführen müssen.DllMain ausführen können.version.dll ausnutzen möchten, könnten Sie Ihren Implantat von GetFileVersionInfoExW ausführen, falls diese Funktion von der anfälligen Anwendung aufgerufen wird.Generieren Sie eine Projektmappe, die alle Exporte weiterleitet (keine Funktionsproxys).
--mode proxy --dll C:\Windows\System32\version.dll --solution "C:\data\tmp\refactor-version" --overwrite --verbose --external-resources
Es ist möglich, mehrere DLLs gleichzeitig einzugeben.
--mode proxy --dll C:\Windows\System32\version.dll --dll C:\Windows\System32\userenv.dll --solution "C:\data\tmp\dll-collection" --overwrite --verbose --external-resources
Erstellen Sie Proxys für so viele Funktionen wie möglich (basierend auf der Ghidra-Ausgabe).
--mode proxy --ghidra C:\ghidra\support\analyzeHeadless.bat --dll C:\Windows\System32\userenv.dll --solution C:\Projects\spartacus-userenv --overwrite --verbose
Wie oben, aber verwenden Sie externe Asset-Dateien, um die Projektmappe zu generieren (falls Sie sie ändern müssen).
--mode proxy --ghidra C:\ghidra\support\analyzeHeadless.bat --dll C:\Windows\System32\userenv.dll --solution C:\Projects\spartacus-userenv --overwrite --verbose --external-resources
Nutzen Sie vorab generierte Funktionsprototypen für Funktionen, für die Ghidra keine Funktionsdefinitionen extrahieren konnte.
--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
Generieren Sie Proxys nur für die Funktionen GetFileVersionInfoExW und 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"
Generieren Sie eine Funktionsprototyp-Datenbank aus vorhandenen *.h-Dateien, um bei der Generierung von Proxy-Funktionen für solche zu helfen, für die Ghidra keine Funktionsdefinition extrahieren konnte.
--mode proxy --action prototypes --path "C:\Program Files (x86)\Windows Kits" --csv C:\data\prototypes.csv --verbose
Listet die Exporte einer DLL auf und prüft, ob für jede Funktion ein vorab generierter Prototyp vorhanden ist.
--mode proxy --action exports --dll C:\Windows\System32\version.dll --dll C:\Windows\System32\amsi.dll --prototypes ./Assets/prototypes.csv
Spartacus unterstützt nun die Generierung selbstsignierter Zertifikate (unter Kopieren von Attributen vorhandener Dateien) und das Signieren von DLL-Dateien.
Erstellen Sie ein Signaturzertifikat unter Verwendung von Eigenschaften aus C:\Windows\System32\version.dll (muss eine signierte DLL sein).
--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
Signieren Sie eine DLL mit einem vorhandenen/generierten Zertifikat.
--mode sign --action sign --pfx "C:\Output\certificate.pfx" --password "Welcome1" --path "C:\Input\MyFakeVersion.dll" --algorithm SHA256 --verbose
Spartacus hat auch einen --detect-Modus, der versucht, aktives DLL-Proxying zu identifizieren. Die Logik dahinter ist:
Um diese Funktion zu nutzen, führen Sie Spartacus einfach mit --detect aus.
Spartacus unterstützt den --sign-Modus, der es Ihnen ermöglicht, sowohl selbstsignierte Zertifikate zu generieren als auch kompilierte DLLs damit zu signieren.
Generieren Sie ein selbstsigniertes Zertifikat, indem Sie den Aussteller/Betreff aus einer vorhandenen Datei kopieren:
--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
Und verwenden Sie dieses Zertifikat, um Ihre kompilierte Datei zu signieren:
--mode sign --action sign --pfx "C:\Output\myCertificate.pfx" --password "Welcome1" --path "C:\Projects\Spartacus-AMSI\amsi.dll" --algorithm SHA256 --verbose
Um Ihnen das Leben zu erleichtern, verwenden Sie die Datei CommandLineGenerator.html.
Ob Tippfehler, Fehler oder neue Funktionen – Spartacus ist offen für Beiträge, solange wir uns auf Folgendes einigen:
proxy verwenden.| Modus | Argument | Beschreibung |
|---|
--mode | Definiert den zu verwendenden Modus, einer von: dll, proxy, com und detect. | |
alle | --verbose | Ausführliche Ausgabe aktivieren. |
alle | --debug | Debug-Ausgabe aktivieren. |
alle | --external-resources | Standardmäßig verwendet Spartacus eingebettete Ressourcen zum Generieren von VS-Projektmappendateien usw. Wenn Sie die Vorlagen ändern müssen, verwenden Sie dieses Argument, um Spartacus zu veranlassen, alle Dateien aus dem Ordner ./Assets zu laden. |
dll, com | --procmon | Speicherort (Datei) des SysInternals Process Monitor procmon.exe oder procmon64.exe |
dll, com | --pml | Speicherort (Datei) zum Speichern der ProcMon-Ereignisprotokolldatei. Wenn die Datei existiert, wird sie überschrieben. Bei Verwendung mit --existing wird die Ereignisprotokolldatei angegeben, aus der gelesen wird, und sie wird nicht überschrieben. |
dll, com | --pmc | Definiert eine benutzerdefinierte ProcMon-Datei (PMC). Diese Datei wird nicht modifiziert und unverändert verwendet. |
dll, com | --csv | Speicherort (Datei) zum Speichern der CSV-Ausgabe der Ausführung. |
dll, proxy | --solution | Pfad zum Verzeichnis, in dem die Projektmappen für die Proxy-DLLs gespeichert werden. |
dll, com | --existing | Schalter, um anzuzeigen, dass Spartacus eine vorhandene ProcMon-Ereignisprotokolldatei (PML) verarbeiten soll. Verwenden Sie --pml, um die Ereignisprotokolldatei anzugeben; nützlich, wenn Sie ProcMon stundenlang ausgeführt oder im Boot-Logging-Modus verwendet haben. |
dll | --all | Standardmäßig werden alle DLLs in den Verzeichnissen Windows oder Program Files übersprungen. Verwenden Sie dies, um diese Verzeichnisse in die Ausgabe aufzunehmen. |
proxy | --ghidra | Pfad zur Datei 'analyzeHeadless.bat' von Ghidra. Wird verwendet, wenn Sie bestimmte Funktionen proxen möchten anstatt nur DllMain. |
proxy | --dll | Pfad zu der DLL, die Sie proxen möchten; dieses Argument kann mehrfach vorkommen. Außerdem können Wildcards wie C:\Windows\System32\*.dll enthalten sein – jedoch müssen alle Pfade mit *.dll enden. |
proxy, sign | --overwrite | Wenn die --solution- (proxy) oder --pfx-Datei (sign) bereits existiert, verwenden Sie dieses Flag, um sie zu überschreiben. |
proxy | --only | Generieren Sie Proxy-Funktionen nur für die in dieser Variablen definierten Funktionen. Werte sind kommagetrennt, z. B. 'WTSFreeMemory,WTSFreeMemoryExA,WTSSetUserConfigA'. |
proxy | --action | Standardaktion ist das Generieren einer VS-Projektmappe. --action prototypes nimmt als Eingabe einen Windows SDK-Ordner und parst *.h-Dateien, um eine Datenbank mit Funktionsprototypen zu generieren. --action exports zeigt die Exportfunktionen einer DLL an, und wenn es mit --prototypes ergänzt wird, wird angezeigt, ob die Funktionsdefinition vorab generiert wurde. |
sign | --action | Bei Verwendung von --action mit dem sign-Modus akzeptiert es eine von zwei Optionen: generate zum Erstellen einer PFX-Datei und sign zum Signieren einer Datei. |
proxy | --path | Funktioniert derzeit nur mit --action prototypes und ist der Pfad zu einem Windows SDK-Verzeichnis. |
proxy | --prototypes | Speicherort von prototypes.csv (derzeit im Ordner ./Assets). |
com | --acl | Lokales System auf fehlende/falsch konfigurierte COM-Bibliotheken und -Executables durchsuchen. |
sign | --subject | Wird mit --action generate verwendet, um den Zertifikatsbetreff anzugeben. |
sign | --issuer | Wird mit --action generate verwendet, um den Aussteller des Zertifikats anzugeben. |
sign | --copy-from | Wird mit --action generate verwendet, um eine vorhandene signierte Datei anzugeben, von der Aussteller und Betreff kopiert werden. |
sign | --not-before | Wird mit --action generate verwendet, um das Datum zu definieren, ab dem das neue Zertifikat gültig ist; Format: YYYY-MM-DD HH:MM:SS. |
sign | --not-after | Wird mit --action generate verwendet, um das Datum zu definieren, bis zu dem das neue Zertifikat gültig ist; Format: YYYY-MM-DD HH:MM:SS. |
sign | --pfx | Bei Verwendung mit --action generate wird hier die PFX-Datei gespeichert. Bei Verwendung mit --action sign wird die PFX-Datei von hier geladen. |
sign | --password | Bei Verwendung mit --action generate definiert es das Passwort für die --pfx-Datei. |
sign | --path | Bei Verwendung mit --action sign definiert es den Speicherort der zu signierenden EXE/DLL-Datei. |
sign | --algorithm | Bei Verwendung mit --action sign definiert es den Hash-Algorithmus, der zum Signieren verwendet wird. Optionen: MD5, SHA1, SHA256, SHA384, SHA512. |
sign | --timestamp | Bei Verwendung mit --action sign definiert es den Zeitstempelserver, z. B. http://timestamp.sectigo.com oder http://timestamp.digicert.com. |