
Spartacus DLL/COM Hijacking Toolkit
[!CAUTION] 此仓库已不再维护,请访问 https://github.com/sadreck/Spartacus 获取最新版本。
如果你看过1960年的电影《斯巴达克斯》,你会记得罗马人要求斯巴达克斯自首的场景。当真正的斯巴达克斯站起来时,其他人也纷纷站起来,用“我是斯巴达克斯”这句话声称自己就是他。
当一个容易受到DLL劫持攻击的进程要求加载一个DLL时,它就像在问“谁是 version.dll?”然后随机目录开始声称“我是 version.dll”和“不,我是 version.dll”。这就是 Spartacus。
DllMain 运行所有内容。该技术受 https://www.redteam.cafe/red-team/dll-sideloading/dll-sideloading-not-by-dllmain 上的演练启发并由 Shantanu Khandelwal 实现。[防御] 监控模式,试图识别正在代理调用的运行中应用程序,即“正在进行 DLL 劫持”。这仅用于捕获低 hanging fruit,不应依赖于此。在 Releases 下找到并下载最新版本的 Spartacus。或者直接克隆此仓库并从源代码构建。
以下是 Spartacus 支持的每种模式的描述。
注意:与 v1 相比,v2 的命令行参数发生了显著变化。
Spartacus 的原始功能仅仅是查找 DLL 劫持漏洞。其工作方式如下:
CreateFile。.dll 结尾。procmon.exe 或 procmon64.exe。ENTER。ENTER 后终止 Process Monitor。收集所有事件并保存到 C:\Data\logs.pml。所有易受攻击的 DLL 将保存为 C:\Data\VulnerableDLLFiles.csv,所有代理 DLL 解决方案保存在 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
解析现有的 PML 事件日志输出,将输出保存到 CSV,并生成代理 Visual Studio 解决方案。
--mode dll --existing --pml C:\MyData\SomeBackup.pml --csv C:\Data\VulnerableDLLFiles.csv --solution C:\Data\Solutions --verbose


Spartacus 的新功能之一是识别本地 COM 劫持漏洞。其工作方式如下:
RegOpenKey。procmon.exe 或 procmon64.exe。ENTER。ENTER 后终止 Process Monitor。InprocServer32 结尾且结果为 NAME_NOT_FOUND 的缺失注册表项。HKEY_CURRENT_USER 下,则在 HKEY_CLASSES_ROOT 下搜索其 GUID,并将详细信息包含在导出的 CSV 中(如果找到)。proxy 模式。对于 COM 劫持,Spartacus 还支持扫描本地系统中配置错误的 COM 条目:
HKEY_CLASSES_ROOT、HKEY_CURRENT_USER 和 HKEY_LOCAL_MACHINE。InProcServer、InProcServer32、LocalServer 或 LocalServer32 的注册表项。收集所有事件并保存到 C:\Data\logs.pml。所有易受攻击的 COM 信息将保存为 C:\Data\VulnerableCOM.csv。
--mode com --procmon C:\SysInternals\Procmon.exe --pml C:\Data\logs.pml --csv C:\Data\VulnerableCOM.csv --verbose
处理现有的 PML 文件以识别易受攻击的 COM 条目。
--mode com --existing --pml C:\Data\logs.pml --csv C:\Data\VulnerableCOM.csv --verbose
枚举本地系统注册表以识别缺失/配置错误的 COM 库和可执行文件。
--mode com --acl --csv C:\Data\VulnerableCOM.csv --verbose


Spartacus 支持通过为你想要利用的 DLL 创建骨架项目来生成 Visual Studio 解决方案。
DllMain 函数执行你的载荷。DllMain 之外的函数执行你的载荷。version.dll,如果易受攻击的应用程序调用了 GetFileVersionInfoExW,你可以从此函数运行你的植入程序。生成一个重定向所有导出(无函数代理)的解决方案。
--mode proxy --dll C:\Windows\System32\version.dll --solution "C:\data\tmp\refactor-version" --overwrite --verbose --external-resources
可以一次输入多个 DLL。
--mode proxy --dll C:\Windows\System32\version.dll --dll C:\Windows\System32\userenv.dll --solution "C:\data\tmp\dll-collection" --overwrite --verbose --external-resources
为尽可能多的函数创建代理(基于 Ghidra 的输出)。
--mode proxy --ghidra C:\ghidra\support\analyzeHeadless.bat --dll C:\Windows\System32\userenv.dll --solution C:\Projects\spartacus-userenv --overwrite --verbose
与上面相同,但使用外部资源文件生成解决方案(如果你需要修改它们)。
--mode proxy --ghidra C:\ghidra\support\analyzeHeadless.bat --dll C:\Windows\System32\userenv.dll --solution C:\Projects\spartacus-userenv --overwrite --verbose --external-resources
利用预生成的函数原型文件,针对 Ghidra 无法提取函数定义的函数。
--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
仅生成函数 GetFileVersionInfoExW 和 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"
从现有的 *.h 文件生成函数原型数据库,帮助为 Ghidra 无法提取函数定义的函数生成代理函数。
--mode proxy --action prototypes --path "C:\Program Files (x86)\Windows Kits" --csv C:\data\prototypes.csv --verbose
列出 DLL 的导出函数,并检查每个函数是否有预生成的原型。
--mode proxy --action exports --dll C:\Windows\System32\version.dll --dll C:\Windows\System32\amsi.dll --prototypes ./Assets/prototypes.csv
Spartacus 现在支持生成自签名证书(同时从现有文件复制属性),并对 DLL 文件进行签名。
创建一个签名证书,使用来自 C:\Windows\System32\version.dll 的属性(必须是已签名的 DLL)。
--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
使用现有/生成的证书对 DLL 进行签名。
--mode sign --action sign --pfx "C:\Output\certificate.pfx" --password "Welcome1" --path "C:\Input\MyFakeVersion.dll" --algorithm SHA256 --verbose
Spartacus 还有一个 --detect 模式,试图识别活跃的 DLL 代理。其逻辑如下:
要使用此功能,只需运行带有 --detect 参数的 Spartacus。
Spartacus 支持 --sign 模式,允许你生成自签名证书,同时也用它们对编译的 DLL 进行签名。
生成一个自签名证书,从现有文件复制颁发者/使用者:
--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
并使用该证书对你的编译文件进行签名:
--mode sign --action sign --pfx "C:\Output\myCertificate.pfx" --password "Welcome1" --path "C:\Projects\Spartacus-AMSI\amsi.dll" --algorithm SHA256 --verbose
为了方便使用,请使用 CommandLineGenerator.html 文件。
无论是拼写错误、错误还是新功能,Spartacus 非常欢迎贡献,只要我们同意以下内容:
| 模式 | 参数 | 描述 |
|---|
--mode | 定义要使用的模式,可选值:dll、proxy、com 和 detect。 | |
所有 | --verbose | 启用详细输出。 |
所有 | --debug | 启用调试输出。 |
所有 | --external-resources | 默认情况下,Spartacus 将使用嵌入资源生成 VS 解决方案文件等。如果你需要修改模板,请使用此参数使 Spartacus 从 ./Assets 文件夹加载所有文件。 |
dll、com | --procmon | SysInternals Process Monitor 的 procmon.exe 或 procmon64.exe 的位置(文件)。 |
dll、com | --pml | 存储 ProcMon 事件日志文件的位置(文件)。如果文件存在,将被覆盖。当与 --existing 一起使用时,表示要读取的事件日志文件,不会被覆盖。 |
dll、com | --pmc | 定义要使用的自定义 ProcMon(PMC)文件。此文件不会被修改,将按原样使用。 |
dll、com | --csv | 存储执行结果的 CSV 输出的位置(文件)。 |
dll、proxy | --solution | 存储代理 DLL 解决方案的目录路径。 |
dll、com | --existing | 指示 Spartacus 应处理现有的 ProcMon 事件日志文件(PML)的开关。要指示事件日志文件请使用 --pml,当你运行 ProcMon 数小时或在启动日志中使用它时非常有用。 |
dll | --all | 默认情况下,Windows 或 Program Files 目录中的任何 DLL 将被跳过。使用此选项可将这些目录包含在输出中。 |
proxy | --ghidra | Ghidra 的 analyzeHeadless.bat 文件的路径。当你想代理特定函数而不是仅仅通过 DllMain 时使用。 |
proxy | --dll | 你想要代理的 DLL 的路径,可以包含此参数的多个实例。此外,还可以包含通配符,如 C:\Windows\System32\*.dll,但所有路径必须以 *.dll 结尾。 |
proxy、sign | --overwrite | 如果 --solution(代理)或 --pfx(签名)文件已存在,使用此标志覆盖它。 |
proxy | --only | 仅为在此变量中定义的函数生成代理函数。值为逗号分隔,例如 'WTSFreeMemory,WTSFreeMemoryExA,WTSSetUserConfigA'。 |
proxy | --action | 默认操作是生成 VS 解决方案。--action prototypes 接受 Windows SDK 文件夹作为输入,并解析 *.h 文件以生成函数原型数据库。--action exports 显示 DLL 的导出函数,当与 --prototypes 配合使用时,将显示函数定义是否已预生成。 |
sign | --action | 当与 sign 模块一起使用 --action 时,它接受两个选项之一:generate 用于创建 PFX,sign 用于对文件进行签名。 |
proxy | --path | 目前仅与 --action prototypes 一起使用,是 Windows SDK 目录的位置。 |
proxy | --prototypes | prototypes.csv 的位置(当前在 ./Assets 文件夹中)。 |
com | --acl | 枚举本地系统中缺失/配置错误的 COM 库和可执行文件。 |
sign | --subject | 与 --action generate 一起使用,指定证书主题。 |
sign | --issuer | 与 --action generate 一起使用,指定证书的颁发者。 |
sign | --copy-from | 与 --action generate 一起使用,指定一个现有的已签名文件,从中复制颁发者和主题。 |
sign | --not-before | 与 --action generate 一起使用,定义新证书何时开始生效,格式为 YYYY-MM-DD HH:MM:SS。 |
sign | --not-after | 与 --action generate 一起使用,定义新证书何时失效,格式为 YYYY-MM-DD HH:MM:SS。 |
sign | --pfx | 当与 --action generate 一起使用时,pfx 文件将保存到此处。当与 --action sign 一起使用时,将从此处加载 pfx 文件。 |
sign | --password | 当与 --action generate 一起使用时,定义 --pfx 文件的密码。 |
sign | --path | 当与 --action sign 一起使用时,定义要签名的可执行文件/DLL 文件的位置。 |
sign | --algorithm | 当与 --action sign 一起使用时,定义用于签名的哈希算法。选项包括:MD5、SHA1、SHA256、SHA384、SHA512。 |
sign | --timestamp | 当与 --action sign 一起使用时,定义时间戳服务器,例如 http://timestamp.sectigo.com 或 http://timestamp.digicert.com。 |