
Spartacus Kit de Sequestro de DLL/COM
[!CAUTION] Este repositório não é mais mantido, visite https://github.com/sadreck/Spartacus para a versão mais recente.
Se viste o filme Spartacus de 1960, lembrar-te-ás da cena em que os romanos pedem que Spartacus se entregue. No momento em que o verdadeiro Spartacus se levantou, muitos outros também se levantaram e afirmaram ser ele, usando a frase "EU SOU SPARTACUS".
Quando um processo vulnerável a DLL Hijacking pede que uma DLL seja carregada, é como se perguntasse "QUEM É VERSION.DLL?" e diretórios aleatórios começam a afirmar "EU SOU VERSION.DLL" e "NÃO, EU SOU VERSION.DLL". E assim, Spartacus.
DllMain. Esta técnica foi inspirada e implementada a partir do tutorial descrito em https://www.redteam.cafe/red-team/dll-sideloading/dll-sideloading-not-by-dllmain, por Shantanu Khandelwal.[Defesa] Modo de monitorização que tenta identificar aplicações em execução a fazer proxy de chamadas, como em "DLL Hijacking em andamento". Isto serve apenas para detetar frutos mais fáceis e não deve ser considerado fiável.Encontra e descarrega a versão mais recente do Spartacus em Releases. Caso contrário, clona simplesmente este repositório e compila a partir do código fonte.
Abaixo está uma descrição de cada um dos modos que o Spartacus suporta.
Nota: Os argumentos da linha de comandos mudaram significativamente da v1 para a v2.
A funcionalidade original do Spartacus era exclusivamente encontrar vulnerabilidades de DLL hijacking. A forma como funciona é:
CreateFile..dll.procmon.exe nem procmon64.exe.ENTER.ENTER.NAME_NOT_FOUND e PATH_NOT_FOUND.Recolhe todos os eventos e guarda-os em C:\Data\logs.pml. Todas as DLLs vulneráveis serão guardadas como C:\Data\VulnerableDLLFiles.csv e todas as soluções de DLL proxy em 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
Analisa um ficheiro PML existente, guarda a saída em CSV e gera soluções Visual Studio de proxy.
--mode dll --existing --pml C:\MyData\SomeBackup.pml --csv C:\Data\VulnerableDLLFiles.csv --solution C:\Data\Solutions --verbose


Uma nova funcionalidade do Spartacus é identificar vulnerabilidades de hijacking COM local. A forma como funciona é:
RegOpenKey.procmon.exe nem procmon64.exe.ENTER.ENTER.InprocServer32 e cujo resultado é NAME_NOT_FOUND.HKEY_CURRENT_USER, procura o seu GUID em HKEY_CLASSES_ROOT e inclui os seus detalhes no CSV de exportação (se encontrado).proxy.Para COM hijacking, o Spartacus também suporta a análise do sistema local para entradas COM mal configuradas:
HKEY_CLASSES_ROOT, HKEY_CURRENT_USER e HKEY_LOCAL_MACHINE.InProcServer, InProcServer32, LocalServer ou LocalServer32.Recolhe todos os eventos e guarda-os em C:\Data\logs.pml. Toda a informação vulnerável sobre COM será guardada como C:\Data\VulnerableCOM.csv.
--mode com --procmon C:\SysInternals\Procmon.exe --pml C:\Data\logs.pml --csv C:\Data\VulnerableCOM.csv --verbose
Processa um ficheiro PML existente para identificar entradas COM vulneráveis.
--mode com --existing --pml C:\Data\logs.pml --csv C:\Data\VulnerableCOM.csv --verbose
Enumera o registo do sistema local para identificar bibliotecas e executáveis COM em falta/mal configurados.
--mode com --acl --csv C:\Data\VulnerableCOM.csv --verbose


O Spartacus suporta a geração de soluções Visual Studio, criando projetos esqueleto para usares, com base na DLL que pretendes explorar.
DllMain.DllMain.version.dll, podes executar o teu implante a partir de GetFileVersionInfoExW se essa função for chamada pela aplicação vulnerável.Gera uma solução que redireciona todas as exportações (sem proxy de funções).
--mode proxy --dll C:\Windows\System32\version.dll --solution "C:\data\tmp\refactor-version" --overwrite --verbose --external-resources
É possível inserir várias DLLs de uma só 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
Cria proxies para o maior número possível de funções (com base na saída do Ghidra).
--mode proxy --ghidra C:\ghidra\support\analyzeHeadless.bat --dll C:\Windows\System32\userenv.dll --solution C:\Projects\spartacus-userenv --overwrite --verbose
O mesmo que acima, mas usa ficheiros de ativos externos para gerar a solução (se precisares de os modificar).
--mode proxy --ghidra C:\ghidra\support\analyzeHeadless.bat --dll C:\Windows\System32\userenv.dll --solution C:\Projects\spartacus-userenv --overwrite --verbose --external-resources
Utiliza protótipos de funções pré-gerados para funções para as quais o Ghidra não conseguiu extrair definições de funções.
--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
Gera proxies apenas para as funções 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"
Gera uma base de dados de protótipos de funções a partir de ficheiros *.h existentes, ajudando na geração de funções proxy para aquelas cuja definição o Ghidra não conseguiu extrair.
--mode proxy --action prototypes --path "C:\Program Files (x86)\Windows Kits" --csv C:\data\prototypes.csv --verbose
Lista as exportações da DLL e verifica se cada função tem um protótipo pré-gerado.
--mode proxy --action exports --dll C:\Windows\System32\version.dll --dll C:\Windows\System32\amsi.dll --prototypes ./Assets/prototypes.csv
O Spartacus agora suporta a geração de certificados auto-assinados (copiando atributos de ficheiros existentes) e a assinatura de ficheiros DLL.
Cria um certificado de assinatura, usando propriedades de C:\Windows\System32\version.dll (tem de ser uma DLL assinada).
--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
Assina uma DLL usando um certificado existente/gerado.
--mode sign --action sign --pfx "C:\Output\certificate.pfx" --password "Welcome1" --path "C:\Input\MyFakeVersion.dll" --algorithm SHA256 --verbose
O Spartacus também tem um modo --detect, que tenta identificar proxy de DLL ativo. A lógica por detrás é:
Para usar esta funcionalidade, basta executar o Spartacus com --detect.
O Spartacus suporta o modo --sign que te permite tanto gerar certificados auto-assinados como também assinar DLLs compiladas com eles.
Gera um certificado auto-assinado, copiando o Emissor/Assunto de um ficheiro 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
E usa esse certificado para assinar o teu ficheiro compilado:
--mode sign --action sign --pfx "C:\Output\myCertificate.pfx" --password "Welcome1" --path "C:\Projects\Spartacus-AMSI\amsi.dll" --algorithm SHA256 --verbose
Para facilitar a tua vida, usa o ficheiro CommandLineGenerator.html.
Quer seja um erro de digitação, um bug ou uma nova funcionalidade, o Spartacus está muito aberto a contribuições desde que concordemos com o seguinte:
| Modo | Argumento | Descrição |
|---|
--mode | Define o modo a usar, um de: dll, proxy, com e detect. | |
all | --verbose | Ativa saída detalhada. |
all | --debug | Ativa saída de depuração. |
all | --external-resources | Por defeito, o Spartacus usa recursos embutidos para gerar ficheiros de solução VS, etc. Se precisares de modificar os modelos, usa este argumento para fazer o Spartacus carregar todos os ficheiros da pasta ./Assets. |
dll, com | --procmon | Localização (ficheiro) do SysInternals Process Monitor procmon.exe ou procmon64.exe |
dll, com | --pml | Localização (ficheiro) para armazenar o ficheiro de event log do ProcMon. Se o ficheiro existir, será sobrescrito. Quando usado com --existing, indica o ficheiro de event log a ler e não será sobrescrito. |
dll, com | --pmc | Define um ficheiro ProcMon (PMC) personalizado a usar. Este ficheiro não será modificado e será usado como está. |
dll, com | --csv | Localização (ficheiro) para armazenar a saída CSV da execução. |
dll, proxy | --solution | Caminho para o diretório onde serão armazenadas as soluções para as DLLs proxy. |
dll, com | --existing | Indicador para que o Spartacus processe um ficheiro de event log ProcMon existente (PML). Para indicar o ficheiro de event log, usa --pml, útil quando estiveste a executar o ProcMon durante horas ou o usaste no Boot Logging. |
dll | --all | Por defeito, qualquer DLL nos diretórios Windows ou Program Files será ignorada. Usa este argumento para incluir esses diretórios na saída. |
proxy | --ghidra | Caminho para o ficheiro 'analyzeHeadless.bat' do Ghidra. Usado quando queres fazer proxy de funções específicas em vez de apenas DllMain. |
proxy | --dll | Caminho para a DLL que queres fazer proxy, e pode incluir várias instâncias deste argumento. Além disso, pode conter curingas como C:\Windows\System32\*.dll - no entanto, todos os caminhos têm de terminar em *.dll. |
proxy, sign | --overwrite | Se o ficheiro --solution (proxy) ou --pfx (sign) já existir, usa esta flag para o sobrescrever. |
proxy | --only | Gera funções proxy apenas para as funções definidas nesta variável. Os valores são separados por vírgulas, como 'WTSFreeMemory,WTSFreeMemoryExA,WTSSetUserConfigA'. |
proxy | --action | A ação predefinida é gerar uma solução VS. --action prototypes recebe como entrada uma pasta do Windows SDK e analisa ficheiros *.h para gerar uma base de dados de protótipos de funções. --action exports exibe as funções de exportação de uma DLL e, quando combinado com --prototypes, mostra se a definição da função foi pré-gerada. |
sign | --action | Ao usar --action com o módulo sign, aceita uma de duas opções: generate para criar um PFX e sign para assinar um ficheiro. |
proxy | --path | Atualmente funciona apenas com --action prototypes e é a localização de um diretório do Windows SDK. |
proxy | --prototypes | Localização de prototypes.csv (atualmente na pasta ./Assets). |
com | --acl | Enumera o sistema local para bibliotecas e executáveis COM em falta/mal configurados. |
sign | --subject | Usado com --action generate para especificar o assunto do certificado. |
sign | --issuer | Usado com --action generate para especificar o emissor do certificado. |
sign | --copy-from | Usado com --action generate para especificar um ficheiro assinado existente do qual copiar o Emissor e o Assunto. |
sign | --not-before | Usado com --action generate para definir a data a partir da qual o novo certificado será válido, formato AAAA-MM-DD HH:MM:SS. |
sign | --not-after | Usado com --action generate para definir a data até à qual o novo certificado será válido, formato AAAA-MM-DD HH:MM:SS. |
sign | --pfx | Quando usado com --action generate, é onde o ficheiro pfx será guardado. Quando usado com --action sign, é de onde o ficheiro pfx será carregado. |
sign | --password | Quando usado com --action generate, define a password para o ficheiro --pfx. |
sign | --path | Quando usado com --action sign, define a localização do ficheiro executável/DLL a ser assinado. |
sign | --algorithm | Quando usado com --action sign, define o algoritmo de hash que será usado para assinar. Opções: MD5, SHA1, SHA256, SHA384, SHA512. |
sign | --timestamp | Quando usado com --action sign, define o Servidor de Timestamp, como http://timestamp.sectigo.com ou http://timestamp.digicert.com. |