『嘶吼RoarTalk』滥用 DLL 错误配置:从威胁情报收录到武器化开发( 二 )


PotPlayerMini加载的DLL的静态分析:

『嘶吼RoarTalk』滥用 DLL 错误配置:从威胁情报收录到武器化开发
本文插图

在无法进行静态分析 , 或者不适合进行静态分析的地方 , 可以使用挂钩的框架(例如:APIMonitor或Frida)来分析应用程序的LoadLibrary/GetProcAddress行为 。
在下图中 , 我们使用APIMonitor查看了相同的DLL加载行为 。 如我们所见 , PotPlayerMini在其所在目录中查找PotPlayer.dll文件 。 至此 , 我们已经验证PotPlayerMini容易受到DLL搜索顺序劫持的影响 。
PotPlayerMini加载的DLL的动态分析:

『嘶吼RoarTalk』滥用 DLL 错误配置:从威胁情报收录到武器化开发
本文插图

2.3满足导出要求
在确定潜在易受攻击的库模块之后 , 我们需要使用类似的方法来确定需要从模块PE导出哪些内容 。 下图展现了PotPlayerMini的反编译视图 , 其中突出展现了利用静态分析的方法 , 在GetProcAddress函数中寻找导出文件 。 下图展示了在PotPlayerMini应用程序中对导出进行相同的分析 , 但在这里使用了动态分析的方法 。
PotPlayerMiniDLL中导出的静态分析:

『嘶吼RoarTalk』滥用 DLL 错误配置:从威胁情报收录到武器化开发
本文插图

PotPlayerMiniDLL中导出的动态分析:

『嘶吼RoarTalk』滥用 DLL 错误配置:从威胁情报收录到武器化开发
本文插图

在我们的示例中 , Payload是使用UnmanagedExports的.NETDLL , 因此我们必须满足二进制文件中的所有导出要求 , 如下图所示 。 原因在于 , .NETUnmanagedExports库不支持DllMain , 因为这是一个入口点 , 并且不会被导出 。 我们需要满足所有导出要求 , 以确保DLL具有导出的所有函数 , 程序可以通过GetProcAddress或导入地址表(IAT)访问这些函数 。 这些导出方法将与静态分析或动态分析中观察到的方法匹配 。 在此过程中 , 可能需要一些尝试 , 并且可能会出现一些错误 , 具体取决于二进制文件中的验证 。
在.NETDLL中添加导出要求:

『嘶吼RoarTalk』滥用 DLL 错误配置:从威胁情报收录到武器化开发
本文插图

执行完二进制文件之后 , 我们可以看到它成功执行了我们的函数 , 如下图所示 。
执行存在DLL滥用漏洞的二进制文件:
2.4未满足所有导出要求的DLL劫持
在C/C++中编写PayloadDLL时 , 可以劫持DllMain中的控制流 。 如果选择这种方式 , 就没有必要枚举并满足所有需要的导出 。 在某些情况下 , DLL没有任何导出 , 只能通过DllMain入口点进行劫持 。
可以使用WindowsMediaPlayer文件夹共享可执行文件wmpshare.exe来展示这个示例 。 我们可以将可执行文件复制到原始位置(C:ProgramFiles(x86)WindowsMediaPlayer)之外的目录中 , 并使用APIMonitor执行动态分析 。 在下图中 , 我们可以看到wmpshare.exe程序使用LoadLibraryW方法来加载wmp.dll文件 , 但未指定DLL的显式路径 。 发生这种功能情况时 , LoadLibraryW方法将首先搜索在其中创建进程的目录(当前工作目录) 。 可以在LoadLibraryW文档和CreateProcess文档中找到有关使用搜索顺序的详细信息 。
在wmpshare.exe中查看LoadLibrary调用:

『嘶吼RoarTalk』滥用 DLL 错误配置:从威胁情报收录到武器化开发
本文插图

由于它没有指定显式路径 , 因此可以通过创建一个名为"wmp.dll"的空白文件 , 并将其复制到与wmpshare.exe文件相同的目录中 , 来测试它是否容易受到DLL劫持的影响 。 现在 , 在APIMonitor中运行wmpshare可执行文件时 , 我们可以看到它首先在其所在目录中检查了wmp.dll文件 , 如下图所示 。 因此 , 可以使用这个二进制文件进行DLL劫持 。


推荐阅读