
Spartacus Toolkit per l'hijacking di DLL/COM
[!CAUTION] Questo repository non è più mantenuto, visita https://github.com/sadreck/Spartacus per l'ultima versione.
Se hai visto il film Spartacus del 1960, ricorderai la scena in cui i romani chiedono che Spartacus si arrenda. Nel momento in cui il vero Spartacus si alzò, molti altri si alzarono e rivendicarono di essere lui usando la frase "IO SONO SPARTACUS".
Quando un processo vulnerabile al DLL Hijacking richiede il caricamento di una DLL, è come chiedere "CHI È VERSION.DLL?" e directory casuali iniziano a dichiarare "IO SONO VERSION.DLL" e "NO, IO SONO VERSION.DLL". E così, Spartacus.
DllMain. Questa tecnica è stata ispirata e implementata dal walkthrough descritto su https://www.redteam.cafe/red-team/dll-sideloading/dll-sideloading-not-by-dllmain, di Shantanu Khandelwal.[Difesa] Modalità di monitoraggio per cercare di identificare applicazioni in esecuzione che fanno proxying delle chiamate, come in "DLL Hijacking in corso". Questo serve solo per individuare frutti a portata di mano e non dovrebbe essere considerato affidabile.Trova e scarica l'ultima versione di Spartacus in Releases. Altrimenti clona semplicemente questo repository e compila dal sorgente.
Di seguito una descrizione di ciascuna delle modalità supportate da Spartacus.
Nota: Gli argomenti da riga di comando sono cambiati notevolmente dalla v1 alla v2.
La funzionalità originale di Spartacus era esclusivamente la ricerca di vulnerabilità di DLL hijacking. Il funzionamento è il seguente:
CreateFile..dll.procmon.exe o procmon64.exe.Drop Filtered Events per garantire una dimensione minima dell'output PML.Auto Scroll.INVIO.INVIO.NAME_NOT_FOUND e PATH_NOT_FOUND.Raccogli tutti gli eventi e salvali in C:\Data\logs.pml. Tutte le DLL vulnerabili verranno salvate in C:\Data\VulnerableDLLFiles.csv e tutte le soluzioni proxy DLL 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
Analizza un file PML di log eventi esistente, salva l'output in CSV e genera soluzioni Visual Studio proxy.
--mode dll --existing --pml C:\MyData\SomeBackup.pml --csv C:\Data\VulnerableDLLFiles.csv --solution C:\Data\Solutions --verbose


Una nuova funzionalità di Spartacus è l'identificazione di vulnerabilità di COM hijacking locali. Il funzionamento è il seguente:
RegOpenKey.procmon.exe o procmon64.exe.Drop Filtered Events per garantire una dimensione minima dell'output PML.Auto Scroll.INVIO.INVIO.InprocServer32 e il cui risultato è NAME_NOT_FOUND.HKEY_CURRENT_USER, cerca il suo GUID sotto HKEY_CLASSES_ROOT e include i suoi dettagli nel CSV di esportazione (se trovato).Per il COM hijacking, Spartacus supporta anche la scansione del sistema locale per voci COM malconfigurate:
HKEY_CLASSES_ROOT, HKEY_CURRENT_USER e HKEY_LOCAL_MACHINE.InProcServer, InProcServer32, LocalServer o LocalServer32.Raccogli tutti gli eventi e salvali in C:\Data\logs.pml. Tutte le informazioni COM vulnerabili verranno salvate in C:\Data\VulnerableCOM.csv.
--mode com --procmon C:\SysInternals\Procmon.exe --pml C:\Data\logs.pml --csv C:\Data\VulnerableCOM.csv --verbose
Elabora un file PML esistente per identificare voci COM vulnerabili.
--mode com --existing --pml C:\Data\logs.pml --csv C:\Data\VulnerableCOM.csv --verbose
Enumera il registro di sistema locale per identificare librerie ed eseguibili COM mancanti/malconfigurati.
--mode com --acl --csv C:\Data\VulnerableCOM.csv --verbose


Spartacus supporta la generazione di soluzioni Visual Studio creando progetti scheletro da utilizzare, basati sulla DLL che si desidera sfruttare.
DllMain.DllMain.version.dll, potresti eseguire il tuo implant da GetFileVersionInfoExW se tale funzione viene chiamata dall'applicazione vulnerabile.Genera una soluzione che reindirizza tutte le esportazioni (nessun proxying di funzioni).
--mode proxy --dll C:\Windows\System32\version.dll --solution "C:\data\tmp\refactor-version" --overwrite --verbose --external-resources
È possibile inserire più DLL contemporaneamente.
--mode proxy --dll C:\Windows\System32\version.dll --dll C:\Windows\System32\userenv.dll --solution "C:\data\tmp\dll-collection" --overwrite --verbose --external-resources
Crea proxy per quante più funzioni possibile (basandosi sull'output di Ghidra).
--mode proxy --ghidra C:\ghidra\support\analyzeHeadless.bat --dll C:\Windows\System32\userenv.dll --solution C:\Projects\spartacus-userenv --overwrite --verbose
Come sopra, ma utilizza file di risorse esterne per generare la soluzione (se è necessario modificarli).
--mode proxy --ghidra C:\ghidra\support\analyzeHeadless.bat --dll C:\Windows\System32\userenv.dll --solution C:\Projects\spartacus-userenv --overwrite --verbose --external-resources
Utilizza prototipi di funzioni pre-generati per funzioni per le quali Ghidra non è riuscito a estrarre le definizioni.
--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
Genera proxy solo per le funzioni GetFileVersionInfoExW e 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"
Genera un database di prototipi di funzioni da file *.h esistenti, aiutando a generare funzioni proxy per quelle per cui Ghidra non è stato in grado di estrarre la definizione della funzione.
--mode proxy --action prototypes --path "C:\Program Files (x86)\Windows Kits" --csv C:\data\prototypes.csv --verbose
Elenca le esportazioni di una DLL e controlla se ogni funzione ha un prototipo pre-generato.
--mode proxy --action exports --dll C:\Windows\System32\version.dll --dll C:\Windows\System32\amsi.dll --prototypes ./Assets/prototypes.csv
Spartacus ora supporta la generazione di certificati autofirmati (copiando attributi da file esistenti) e la firma di file DLL.
Crea un certificato di firma, utilizzando le proprietà da C:\Windows\System32\version.dll (deve essere una DLL firmata).
--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
Firma una DLL utilizzando un certificato esistente/generato.
--mode sign --action sign --pfx "C:\Output\certificate.pfx" --password "Welcome1" --path "C:\Input\MyFakeVersion.dll" --algorithm SHA256 --verbose
Spartacus ha anche una modalità --detect, che cerca di identificare proxying attivo di DLL. La logica è la seguente:
Per utilizzare questa funzionalità, basta eseguire Spartacus con --detect.
Spartacus supporta la modalità --sign che ti consente sia di generare certificati autofirmati, sia di firmare con essi le DLL compilate.
Genera un certificato autofirmato, copiando l'emittente/soggetto da un file esistente:
--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
E usa quel certificato per firmare il tuo file compilato:
--mode sign --action sign --pfx "C:\Output\myCertificate.pfx" --password "Welcome1" --path "C:\Projects\Spartacus-AMSI\amsi.dll" --algorithm SHA256 --verbose
Per semplificarti la vita, usa il file CommandLineGenerator.html.
Che si tratti di un errore di battitura, un bug o una nuova funzionalità, Spartacus è molto aperto ai contributi purché concordiamo sulle seguenti condizioni:
proxy.| Modalità | Argomento | Descrizione |
|---|
--mode | Definisce la modalità da utilizzare, una tra: dll, proxy, com e detect. | |
all | --verbose | Abilita output verbose. |
all | --debug | Abilita output di debug. |
all | --external-resources | Per impostazione predefinita Spartacus utilizza risorse incorporate per generare file di soluzione VS, ecc. Se devi modificare i template, usa questo argomento per far caricare a Spartacus tutti i file dalla cartella ./Assets. |
dll, com | --procmon | Percorso (file) del SysInternals Process Monitor procmon.exe o procmon64.exe |
dll, com | --pml | Percorso (file) per salvare il file di log eventi di ProcMon. Se il file esiste, verrà sovrascritto. Se usato con --existing, indica il file di log eventi da leggere e non verrà sovrascritto. |
dll, com | --pmc | Definisce un file ProcMon (PMC) personalizzato da utilizzare. Questo file non verrà modificato e sarà utilizzato così com'è. |
dll, com | --csv | Percorso (file) per salvare l'output CSV dell'esecuzione. |
dll, proxy | --solution | Percorso della directory in cui verranno salvate le soluzioni per le DLL proxy. |
dll, com | --existing | Interruttore per indicare che Spartacus deve elaborare un file di log eventi di ProcMon esistente (PML). Per indicare il file di log eventi usa --pml, utile se hai eseguito ProcMon per ore o lo hai usato in Boot Logging. |
dll | --all | Per impostazione predefinita, qualsiasi DLL nelle directory di Windows o Program Files verrà saltata. Usa questa opzione per includere tali directory nell'output. |
proxy | --ghidra | Percorso del file 'analyzeHeadless.bat' di Ghidra. Utilizzato quando vuoi fare il proxy di funzioni specifiche anziché solo DllMain. |
proxy | --dll | Percorso della DLL che vuoi fare proxy e puoi includere più istanze di questo argomento. Inoltre, può contenere caratteri jolly come C:\Windows\System32\*.dll – tuttavia tutti i percorsi devono terminare con *.dll. |
proxy, sign | --overwrite | Se il file --solution (proxy) o --pfx (sign) esiste già, usa questo flag per sovrascriverlo. |
proxy | --only | Genera funzioni proxy solo per le funzioni definite in questa variabile. I valori sono separati da virgole come 'WTSFreeMemory,WTSFreeMemoryExA,WTSSetUserConfigA'. |
proxy | --action | L'azione predefinita è generare una soluzione VS. --action prototypes prende come input una cartella Windows SDK e analizza i file *.h per generare un database di prototipi di funzioni. --action exports mostra le funzioni di esportazione di una DLL e quando abbinato a --prototypes mostra se la definizione della funzione è stata pre-generata. |
sign | --action | Quando si usa --action con il modulo sign, accetta una di due opzioni: generate per creare un PFX e sign per firmare un file. |
proxy | --path | Attualmente funziona solo con --action prototypes ed è la posizione di una directory Windows SDK. |
proxy | --prototypes | Percorso di prototypes.csv (attualmente nella cartella ./Assets). |
com | --acl | Enumera il sistema locale per librerie ed eseguibili COM mancanti/malconfigurati. |
sign | --subject | Usato con --action generate per specificare il soggetto del certificato. |
sign | --issuer | Usato con --action generate per specificare l'emittente del certificato. |
sign | --copy-from | Usato con --action generate per specificare un file firmato esistente da cui copiare l'emittente e il soggetto. |
sign | --not-before | Usato con --action generate per definire la data a partire dalla quale il nuovo certificato sarà valido, formato AAAA-MM-GG HH:MM:SS. |
sign | --not-after | Usato con --action generate per definire la data fino alla quale il nuovo certificato sarà valido, formato AAAA-MM-GG HH:MM:SS. |
sign | --pfx | Quando usato con --action generate indica dove verrà salvato il file PFX. Quando usato con --action sign indica da dove verrà caricato il file PFX. |
sign | --password | Quando usato con --action generate definisce la password per il file --pfx. |
sign | --path | Quando usato con --action sign definisce il percorso del file eseguibile/DLL da firmare. |
sign | --algorithm | Quando usato con --action sign definisce l'algoritmo di hashing che verrà utilizzato per la firma. Opzioni: MD5, SHA1, SHA256, SHA384, SHA512. |
sign | --timestamp | Quando usato con --action sign definisce il server timestamp, come http://timestamp.sectigo.com o http://timestamp.digicert.com. |