Spartacus DLL劫持发现工具

作者:Sec-Labs | 发布时间:

项目地址

https://github.com/Accenture/Spartacus

Spartacus DLL 劫持

为什么叫“斯巴达克斯”?

如果你看过 1960 年的电影《斯巴达克斯》,你就会记得罗马人要求斯巴达克斯自首的场景。 真正的斯巴达克斯站起来的那一刻,其他很多人也站了起来,用“我是斯巴达克斯”这句话自称是他。

当易受 DLL 劫持攻击的进程要求加载 DLL 时,它有点像在问“谁是 VERSION.DLL?” 随机目录开始声明“我是 VERSION.DLL”和“不,我是 VERSION.DLL”。 因此,斯巴达克斯。

你真的做了另一个 DLL 劫持发现工具吗?

…但随着 Spartacus 使用 SysInternals Process Monitor 并解析原始 PML 日志文件而有所不同。 您可以让 ProcMon 运行数小时并发现第 2 级和第 3 级(即加载另一个 DLL 的应用程序,当您使用父应用程序的特定功能时加载另一个 DLL)DLL 劫持漏洞。 它还会自动生成代理 DLL,其中包含易受攻击的 DLL 的所有相关导出。

特征

  • 本地解析 ProcMon PML 文件。 配置 (PMC) 和日志 (PML) 解析器已通过将部分功能从 https://github.com/eronnen/procmon-parser/ 移植到 C# 来实现。 您可以在此处 找到格式规范 。
  • Spartacus 将为所有已识别的缺失 DLL 创建代理 DLL。 例如,如果应用程序容易受到 DLL 劫持 version.dll ,Spartacus 将为您创建一个 version.dll.cpp 文件,其中包含所有导出。 然后你可以插入你的有效载荷/执行技术并编译。
  • 能够处理大型 PML 文件并将所有感兴趣的 DLL 存储在输出 CSV 文件中。 本地基准测试在 45 秒内处理了一个包含 800 万个事件的 3GB 文件。
  • [Defence] 监控模式试图识别正在运行的应用程序代理调用,如“正在进行的 DLL 劫持”。 这只是为了获得任何容易实现的成果,不应依赖。

目录

截图

Spartacus执行

4ffcc3acda180838

 

CSV 输出

2beae8e89e180854

 

输出出口

680e3ae909180910

 

导出 DLL 函数

43b639362a180923

 

用法

执行流程

  1. 根据传递的参数动态生成 ProcMon (PMC) 配置文件。 将设置的过滤器是:
    • 操作是 CreateFile
    • 路径以 .dll .
    • 进程名称不是 procmon.exeprocmon64.exe
    • 启用 Drop Filtered Events 以确保最小 PML 输出大小。
    • 禁用 Auto Scroll
  2. 执行进程监视器。
  3. 停止执行,直到用户按下 ENTER
  4. 终止进程监视器。
  5. 解析输出事件日志 (PML) 文件。
    1. 创建包含所有 NAME_NOT_FOUND 和 PATH_NOT_FOUND DLL 的 CSV 文件。
    2. 比较上面的 DLL 并尝试识别实际加载的 DLL。
    3. 对于每个“找到的”DLL,它都会生成一个具有所有导出函数的代理 DLL。

命令行参数

争论 描述
--pml 存储 ProcMon 事件日志文件的位置(文件)。 如果文件存在,它将被覆盖。 与它一起使用时 --existing-log ,将指示要读取的事件日志文件,并且不会被覆盖。
--pmc 定义要使用的自定义 ProcMon (PMC) 文件。 该文件不会被修改,将按原样使用。
--csv 存储执行的 CSV 输出的位置(文件)。 此文件将仅包含标记为 NAME_NOT_FOUND、PATH_NOT_FOUND 且位于用户可写位置的 DLL(不包括 WindowsProgram Files 目录中的任何内容)
--exe 定义要跟踪的进程名称(逗号分隔),这在您只对特定进程感兴趣时很有用。
--exports 将保存所有代理 DLL 文件的位置(文件夹)。 仅当使用此参数时才会生成代理 DLL 文件。
--procmon SysInternals Process Monitor 的位置(文件) procmon.exeprocmon64.exe
--proxy-dll-template 定义用于生成代理 DLL 文件的 DLL 模板。 仅在 --exports 使用时相关。 所有 #pragma 导出都是通过替换 %_PRAGMA_COMMENTS_% 字符串插入的,因此请确保您的模板在相关位置包含该字符串。
--existing-log 切换以指示 Spartacus 应处理现有的 ProcMon 事件日志文件 (PML)。 指示事件日志文件使用 --pml ,当您运行 ProcMon 数小时或在引导日志记录中使用它时很有用。
--all 默认情况下,将跳过 Windows 或 Program Files 目录中的任何 DLL。 使用它在输出中包含这些目录。
--detect 尝试识别代理调用的 DLL(例如“正在进行的 DLL 劫持”)。 这不是一个值得依赖的功能,它是为了获得容易实现的成果。
--verbose 启用详细输出。
--debug 启用调试输出。

例子

收集所有事件并将它们保存到 C:\Data\logs.pml . C:\Data\VulnerableDLLFiles.csv 所有易受攻击的 DLL和所有代理 DLL 都将保存为 C:\Data\DLLExports .

--procmon C:\SysInternals\Procmon.exe --pml C:\Data\logs.pml --csv C:\Data\VulnerableDLLFiles.csv --exports C:\Data\DLLExports --verbose

Teams.exe 仅为和 收集事件 OneDrive.exe

--procmon C:\SysInternals\Procmon.exe --pml C:\Data\logs.pml --csv C:\Data\VulnerableDLLFiles.csv --exports C:\Data\DLLExports --verbose --exe "Teams.exe,OneDrive.exe"

Teams.exe 仅为和 收集事件 OneDrive.exe ,并在 上使用自定义代理 DLL 模板 C:\Data\myProxySkeleton.cpp

--procmon C:\SysInternals\Procmon.exe --pml C:\Data\logs.pml --csv C:\Data\VulnerableDLLFiles.csv --exports C:\Data\DLLExports --verbose --exe "Teams.exe,OneDrive.exe" --proxy-dll-template C:\Data\myProxySkeleton.cpp

Teams.exe 仅为和 收集事件 OneDrive.exe ,但不生成代理 DLL。

--procmon C:\SysInternals\Procmon.exe --pml C:\Data\logs.pml --csv C:\Data\VulnerableDLLFiles.csv --verbose --exe "Teams.exe,OneDrive.exe"

解析现有的 PML 事件日志输出,将输出保存为 CSV,并生成代理 DLL。

--existing-log --pml C:\MyData\SomeBackup.pml --csv C:\Data\VulnerableDLLFiles.csv --exports C:\Data\DLLExports

在监控模式下运行并尝试检测任何正在代理 DLL 调用的应用程序。

--detect

代理 DLL 模板

下面是生成代理 DLL 时使用的模板,生成的 #pragma 语句是通过替换 %_PRAGMA_COMMENTS_% 字符串插入的。

唯一需要注意的是, pragma DLL 将使用其位置的硬编码路径,而不是尝试动态加载它。

#pragma once

%_PRAGMA_COMMENTS_%

#include <windows.h>
#include <string>
#include <atlstr.h>

VOID Payload() {
    // Run your payload here.
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
    switch (fdwReason)
    {
    case DLL_PROCESS_ATTACH:
        Payload();
        break;
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

如果您想使用自己的模板,只需确保 %_PRAGMA_COMMENTS_% 位于正确的位置即可。

标签:工具分享, 主机安全