Context的智能和响应团队已经看到DLL搜索命令被滥用,作为在真实环境中进行网络入侵的一种手段。滥用DLL搜索顺序并利用这种机制来加载一个流氓DLL而不是合法的被称为DLL预加载,或者在MITRE ATT&CK框架中劫持。
在这篇文章中,你将了解更多关于DLL搜索顺序的基本原理,以及合法的二进制文件如何被武器化,并介绍一个通过DLL劫持自动发现适合有效载荷执行的二进制文件的工具。
关于动态链接库
动态链接库(DLL)是一个模块,它包含可以被另一个模块(应用程序或DLL)使用的函数和数据。这些函数从库文件中导出,以供依赖于它们的应用程序或DLL使用。为了使用这些函数,应用程序必须从库文件中导入它们。应用程序从模块导入函数有两种方式:隐式(加载时动态链接)和显式(运行时动态链接),奇热让我们各看看。
隐式链接(加载时动态库链接)
当一个应用程序被打开时,Windows加载器采取步骤在内存中映射应用程序的可执行映像,并最终启动一个托管并执行其代码的进程。在加载过程中,加载器解析可执行映像的导入表,以便将导入的模块(动态链接库)映射到该进程的地址空间中。
可执行映像可能嵌入了描述Windows并行程序集上依赖关系的清单。在加载导入的DLL之前,并行管理器(SxS Manager)检查这个可执行文件的清单文件中存在的任何依赖项是否得到满足。如果是,则从路径中加载所需的模块。
对于其余的导入模块,加载程序首先检查由KnownDLLs注册表项(HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ KnownDLLs)设置的列表上是否存在要导入的所有DLL。如果是,加载程序将使用此注册表项指向的DLL的副本。否则,它将通过应用DLL搜索顺序来搜索模块。有关DLL搜索顺序的更多信息,请参见本文其他章节。
显式链接(运行时动态库链接)
应用程序可能需要使用DLL中的函数,这些函数在应用程序运行时动态加载。以这种方式加载DLL称为运行时DLL动态链接,这种类型的加载发生在应用程序调用LoadLibrary或LoadLibraryEx函数时。
这两个函数接受要加载的模块的名称,名称可以是模块的文件名,也可以是模块的完整路径。如果应用程序没有指定模块的完整路径,Windows加载程序将查找应用动态库搜索顺序的DLL。
DLL搜索顺序劫持及其识别方法
滥用DLL搜索顺序并利用这种机制使应用程序加载流氓DLL(而不是合法的DLL)被称为DLL预加载。之所以称为预加载,是因为攻击者可以将其DLL放在搜索顺序的前面,从而使应用程序加载此DLL,而不是合法的DLL。该技术在MITER ATT&CK框架(T1038)中记录为DLL搜索顺序劫持。在本文的以下各节中,我们演示如何滥用合法应用程序通过搜索顺序劫持来加载和执行Cobalt Strike信标有效载荷。
DLL搜索顺序劫持主要提供两个优点,使其成为一种有效的技术。第一个优点是可以用来逃避检测。武器化的