
Spartacus: kit de herramientas de secuestro DLL/COM
[!CAUTION] Este repositorio no tiene mantenimiento, visita https://github.com/sadreck/Spartacus para la versión más reciente.
Si has visto la película Spartacus de 1960, recordarás la escena donde los romanos piden que Spartacus se entregue. En el momento en que el verdadero Spartacus se levantó, muchos otros también se levantaron y afirmaron ser él usando la frase "¡YO SOY SPARTACUS!".
Cuando un proceso vulnerable al Secuestro de DLL solicita la carga de una DLL, es como si preguntara "¿QUIÉN ES VERSION.DLL?" y directorios aleatorios comienzan a decir "YO SOY VERSION.DLL" y "NO, YO SOY VERSION.DLL". Y así, Spartacus.
DllMain. Esta técnica fue inspirada e implementada a partir del tutorial descrito en https://www.redteam.cafe/red-team/dll-sideloading/dll-sideloading-not-by-dllmain, por Shantanu Khandelwal.[Defensa] Modo de monitoreo que intenta identificar aplicaciones en ejecución que están haciendo proxy de llamadas, como en "Secuestro de DLL en progreso". Esto es solo para obtener cualquier fruta fácil y no debe considerarse confiable.Encuentra y descarga la última versión de Spartacus en Releases. De lo contrario, simplemente clona este repositorio y compila desde el código fuente.
A continuación se describe cada uno de los modos que soporta Spartacus.
Nota: Los argumentos de línea de comandos han cambiado significativamente de v1 a v2.
La funcionalidad original de Spartacus era únicamente encontrar vulnerabilidades de secuestro de DLL. Funciona de la siguiente manera:
CreateFile..dll.procmon.exe ni procmon64.exe.Drop Filtered Events para asegurar un tamaño mínimo de salida PML.Auto Scroll.ENTER.ENTER.NAME_NOT_FOUND y PATH_NOT_FOUND.Recolecta todos los eventos y guárdalos en C:\Data\logs.pml. Todas las DLLs vulnerables se guardarán como C:\Data\VulnerableDLLFiles.csv y todas las soluciones de proxy DLL en 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
Analiza un archivo de registro PML existente, guarda la salida en CSV y genera soluciones de Visual Studio proxy.
--mode dll --existing --pml C:\MyData\SomeBackup.pml --csv C:\Data\VulnerableDLLFiles.csv --solution C:\Data\Solutions --verbose


Una nueva funcionalidad de Spartacus es identificar vulnerabilidades de secuestro de COM locales. Funciona de la siguiente manera:
RegOpenKey.procmon.exe ni procmon64.exe.Drop Filtered Events para asegurar un tamaño mínimo de salida PML.Auto Scroll.ENTER.ENTER.InprocServer32 y cuyo resultado es NAME_NOT_FOUND.HKEY_CURRENT_USER, busca su GUID en HKEY_CLASSES_ROOT e incluye sus detalles en el CSV de exportación (si se encuentra).Para el secuestro de COM, Spartacus también soporta el escaneo del sistema local en busca de entradas COM mal configuradas:
HKEY_CLASSES_ROOT, HKEY_CURRENT_USER y HKEY_LOCAL_MACHINE.InProcServer, InProcServer32, LocalServer o LocalServer32.Recolecta todos los eventos y guárdalos en C:\Data\logs.pml. Toda la información vulnerable de COM se guardará como C:\Data\VulnerableCOM.csv.
--mode com --procmon C:\SysInternals\Procmon.exe --pml C:\Data\logs.pml --csv C:\Data\VulnerableCOM.csv --verbose
Procesa un archivo PML existente para identificar entradas COM vulnerables.
--mode com --existing --pml C:\Data\logs.pml --csv C:\Data\VulnerableCOM.csv --verbose
Enumera el registro del sistema local para identificar bibliotecas y ejecutables COM faltantes o mal configurados.
--mode com --acl --csv C:\Data\VulnerableCOM.csv --verbose


Spartacus soporta la generación de soluciones de Visual Studio creando proyectos esqueleto para que los uses, basados en la DLL que deseas explotar.
DllMain.DllMain.version.dll, podrías ejecutar tu implante desde GetFileVersionInfoExW si esa función es llamada por la aplicación vulnerable.Genera una solución que redirige todas las exportaciones (sin proxy de funciones).
--mode proxy --dll C:\Windows\System32\version.dll --solution "C:\data\tmp\refactor-version" --overwrite --verbose --external-resources
Es posible ingresar múltiples DLLs a la vez.
--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 proxies para tantas funciones como sea posible (basado en la salida de Ghidra).
--mode proxy --ghidra C:\ghidra\support\analyzeHeadless.bat --dll C:\Windows\System32\userenv.dll --solution C:\Projects\spartacus-userenv --overwrite --verbose
Igual que arriba, pero usa archivos de recursos externos para generar la solución (si necesitas modificarlos).
--mode proxy --ghidra C:\ghidra\support\analyzeHeadless.bat --dll C:\Windows\System32\userenv.dll --solution C:\Projects\spartacus-userenv --overwrite --verbose --external-resources
Utiliza prototipos de función pregenerados para funciones de las cuales Ghidra no pudo extraer definiciones.
--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 proxies solo para las funciones GetFileVersionInfoExW y 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 una base de datos de prototipos de funciones a partir de archivos *.h existentes, ayudando a generar funciones proxy para aquellas de las que Ghidra no pudo extraer su definición de función.
--mode proxy --action prototypes --path "C:\Program Files (x86)\Windows Kits" --csv C:\data\prototypes.csv --verbose
Lista las exportaciones de la DLL y verifica si cada función tiene un prototipo pregenerado.
--mode proxy --action exports --dll C:\Windows\System32\version.dll --dll C:\Windows\System32\amsi.dll --prototypes ./Assets/prototypes.csv
Spartacus ahora soporta la generación de certificados autofirmados (copiando atributos de archivos existentes) y la firma de archivos DLL.
Crea un certificado de firma usando propiedades de C:\Windows\System32\version.dll (debe ser una DLL firmada).
--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 usando un certificado existente/generado.
--mode sign --action sign --pfx "C:\Output\certificate.pfx" --password "Welcome1" --path "C:\Input\MyFakeVersion.dll" --algorithm SHA256 --verbose
Spartacus también tiene un modo --detect que intenta identificar proxys de DLL activos. La lógica es:
Para usar esta característica, simplemente ejecuta Spartacus con --detect.
Spartacus soporta el modo --sign que te permite tanto generar certificados autofirmados como firmar DLLs compiladas con ellos.
Genera un certificado autofirmado, copiando el Emisor/Asunto de un archivo existente:
--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
Y usa ese certificado para firmar tu archivo compilado:
--mode sign --action sign --pfx "C:\Output\myCertificate.pfx" --password "Welcome1" --path "C:\Projects\Spartacus-AMSI\amsi.dll" --algorithm SHA256 --verbose
Para facilitarte la vida, usa el archivo CommandLineGenerator.html.
Ya sea un error tipográfico, un bug o una nueva funcionalidad, Spartacus está muy abierto a contribuciones siempre que estemos de acuerdo en lo siguiente:
proxy.| Modo | Argumento | Descripción |
|---|
--mode | Define el modo a usar, uno de: dll, proxy, com y detect. | |
todos | --verbose | Habilita la salida detallada. |
todos | --debug | Habilita la salida de depuración. |
todos | --external-resources | Por defecto, Spartacus usará recursos incrustados para generar archivos de solución de VS, etc. Si necesitas modificar las plantillas, usa este argumento para que Spartacus cargue todos los archivos de la carpeta ./Assets. |
dll, com | --procmon | Ubicación (archivo) de Process Monitor de SysInternals procmon.exe o procmon64.exe |
dll, com | --pml | Ubicación (archivo) para almacenar el archivo de registro de eventos de ProcMon. Si el archivo existe, se sobrescribirá. Cuando se usa con --existing, indica el archivo de registro de eventos a leer y no se sobrescribirá. |
dll, com | --pmc | Define un archivo ProcMon (PMC) personalizado a usar. Este archivo no se modificará y se usará tal cual. |
dll, com | --csv | Ubicación (archivo) para almacenar la salida CSV de la ejecución. |
dll, proxy | --solution | Ruta al directorio donde se almacenarán las soluciones para las DLLs proxy. |
dll, com | --existing | Indicador para que Spartacus procese un archivo de registro de eventos de ProcMon existente (PML). Para indicar el archivo de registro, usa --pml. Útil cuando has estado ejecutando ProcMon durante horas o lo usaste en el registro de arranque. |
dll | --all | Por defecto, se omitirán las DLLs en los directorios de Windows o Program Files. Usa esto para incluir esos directorios en la salida. |
proxy | --ghidra | Ruta al archivo 'analyzeHeadless.bat' de Ghidra. Se usa cuando deseas hacer proxy de funciones específicas en lugar de solo DllMain. |
proxy | --dll | Ruta a la DLL que deseas hacer proxy, y puede incluir múltiples instancias de este argumento. Además, puede contener comodines como C:\Windows\System32\*.dll – sin embargo, todas las rutas deben terminar en *.dll. |
proxy, sign | --overwrite | Si el archivo de --solution (proxy) o --pfx (sign) ya existe, usa esta bandera para sobrescribirlo. |
proxy | --only | Genera funciones proxy solo para las funciones definidas en esta variable. Los valores están separados por comas, como 'WTSFreeMemory,WTSFreeMemoryExA,WTSSetUserConfigA'. |
proxy | --action | La acción por defecto es generar una solución de VS. --action prototypes toma como entrada una carpeta del SDK de Windows y analiza archivos *.h para generar una base de datos de prototipos de funciones. --action exports muestra las funciones de exportación de una DLL y, cuando se complementa con --prototypes, mostrará si la definición de la función ha sido pregenerada. |
sign | --action | Al usar --action con el módulo sign, toma una de dos opciones: generate para crear un PFX y sign para firmar un archivo. |
proxy | --path | Actualmente solo funciona con --action prototypes y es la ubicación de un directorio del SDK de Windows. |
proxy | --prototypes | Ubicación de prototypes.csv (actualmente dentro de la carpeta ./Assets). |
com | --acl | Enumera el sistema local en busca de bibliotecas y ejecutables COM faltantes o mal configurados. |
sign | --subject | Se usa con --action generate para especificar el asunto del certificado. |
sign | --issuer | Se usa con --action generate para especificar el emisor del certificado. |
sign | --copy-from | Se usa con --action generate para especificar un archivo firmado existente del cual copiar el Emisor y el Asunto. |
sign | --not-before | Se usa con --action generate para definir la fecha a partir de la cual el nuevo certificado será válido, formato YYYY-MM-DD HH:MM:SS. |
sign | --not-after | Se usa con --action generate para definir la fecha hasta la cual el nuevo certificado será válido, formato YYYY-MM-DD HH:MM:SS. |
sign | --pfx | Cuando se usa con --action generate, es donde se guardará el archivo pfx. Cuando se usa con --action sign, es de donde se cargará el archivo pfx. |
sign | --password | Cuando se usa con --action generate, define la contraseña para el archivo --pfx. |
sign | --path | Cuando se usa con --action sign, define la ubicación del archivo ejecutable/DLL a firmar. |
sign | --algorithm | Cuando se usa con --action sign, define el algoritmo hash que se usará para la firma. Opciones: MD5, SHA1, SHA256, SHA384, SHA512. |
sign | --timestamp | Cuando se usa con --action sign, define el Servidor de Marca de Tiempo, como http://timestamp.sectigo.com o http://timestamp.digicert.com. |