Dll Hijacking
最后更新于
最后更新于
漏洞赏金提示:注册Intigriti,这是一家由黑客创建的高级漏洞赏金平台!立即加入我们,开始赚取高达**$100,000**的赏金:https://go.intigriti.com/hacktricks。
DLL劫持涉及操纵受信任的应用程序以加载恶意DLL。这个术语包括几种策略,如DLL欺骗、注入和侧向加载。主要用于代码执行、实现持久性,较少用于权限提升。尽管这里关注的是提升权限,但劫持的方法在不同目标间保持一致。
有几种方法可用于DLL劫持,每种方法的有效性取决于应用程序的DLL加载策略:
DLL替换:用恶意DLL替换真实DLL,可选择使用DLL代理以保留原始DLL的功能。
DLL搜索顺序劫持:将恶意DLL放在合法DLL之前的搜索路径中,利用应用程序的搜索模式。
虚拟DLL劫持:为应用程序创建一个恶意DLL以加载,认为它是一个不存在的必需DLL。
DLL重定向:修改搜索参数如%PATH%
或.exe.manifest
/ .exe.local
文件,将应用程序指向恶意DLL。
WinSxS DLL替换:在WinSxS目录中用恶意对应物替换合法DLL,这种方法通常与DLL侧向加载相关联。
相对路径DLL劫持:将恶意DLL放在用户可控制的目录中,与复制的应用程序一起,类似于二进制代理执行技术。
查找系统中缺失的DLL最常见的方法是从sysinternals运行procmon,设置以下2个过滤器:
然后只显示文件系统活动:
如果您正在一般查找缺失的DLL,可以让其运行一段时间。 如果您正在查找特定可执行文件中的缺失DLL,应设置另一个过滤器,如“进程名称”“包含”“<exec名称>”,执行它,然后停止捕获事件。
为了提升权限,我们最好的机会是能够编写一个特权进程将尝试加载的DLL,在某个将被搜索的地方。因此,我们将能够在一个比原始DLL的文件夹更早被搜索的文件夹中编写一个DLL(奇怪的情况),或者我们将能够在某个将被搜索的文件夹中编写一个DLL,而原始DLL在任何文件夹中都不存在。
在Microsoft文档 中,您可以找到DLL的加载方式。
Windows应用程序通过遵循一组预定义的搜索路径来查找DLL,遵循特定的顺序。当有害DLL被策略性地放置在这些目录之一中时,DLL劫持的问题就会出现,确保它在真实DLL之前加载。防止这种情况发生的解决方案是确保应用程序在引用所需DLL时使用绝对路径。
您可以在下面看到32位系统上的DLL搜索顺序:
应用程序加载的目录。
系统目录。使用GetSystemDirectory函数获取此目录的路径。(C:\Windows\System32)
16位系统目录。没有函数获取此目录的路径,但会被搜索。(C:\Windows\System)
Windows目录。使用GetWindowsDirectory函数获取此目录的路径。(C:\Windows)
当前目录。
列在PATH环境变量中的目录。请注意,这不包括由App Paths注册表键指定的每个应用程序路径。App Paths键在计算DLL搜索路径时不使用。
这是启用SafeDllSearchMode的默认搜索顺序。当禁用此功能时,当前目录会升至第二位。要禁用此功能,请创建HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode注册表值,并将其设置为0(默认为启用)。
如果使用LoadLibraryEx函数调用LOAD_WITH_ALTERED_SEARCH_PATH,搜索将从LoadLibraryEx正在加载的可执行模块的目录开始。
最后,请注意DLL可以加载指示绝对路径而不仅仅是名称。在这种情况下,该DLL只会在该路径中搜索(如果DLL有任何依赖项,它们将按名称搜索)。
还有其他改变搜索顺序的方法,但我不会在这里解释。
Windows文档中指出了标准DLL搜索顺序的某些异常情况:
当遇到一个与内存中已加载的DLL同名的DLL时,系统会绕过通常的搜索顺序。相反,它会在默认使用内存中的DLL之前,执行重定向和清单检查。在这种情况下,系统不会搜索该DLL。
如果DLL被识别为当前Windows版本的已知DLL,则系统将使用其版本的已知DLL及其任何依赖的DLL,跳过搜索过程。注册表键HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs保存了这些已知DLL的列表。
如果DLL有依赖项,系统将搜索这些依赖DLL,就好像它们只被其模块名称指示一样,而不管最初的DLL是通过完整路径识别的。
要求:
确定一个将在不同权限下运行或将要运行的进程(水平或横向移动),该进程缺少一个DLL。
确保具有写入访问权限,以便在搜索DLL的任何目录中使用。这个位置可能是可执行文件的目录或系统路径中的一个目录。
是的,这些要求很难找到,因为默认情况下很难找到一个缺少DLL的特权可执行文件,而且更难以在系统路径文件夹中具有写入权限(默认情况下无法)。但是,在配置错误的环境中,这是可能的。 如果你很幸运,发现自己符合要求,你可以查看UACME项目。即使该项目的主要目标是绕过UAC,你可能会在那里找到一个用于你所使用的Windows版本的DLL劫持的PoC(可能只需更改具有写入权限的文件夹的路径)。
请注意,你可以通过以下方式检查文件夹中的权限:
并检查路径内所有文件夹的权限:
您还可以使用以下命令检查可执行文件的导入项和 DLL 的导出项:
要了解如何滥用Dll劫持以提升权限并具有在系统路径文件夹中写入权限的完整指南,请查看:
Writable Sys Path +Dll Hijacking PrivescWinpeas将检查您是否具有对系统路径中任何文件夹的写入权限。 其他有趣的自动化工具来发现此漏洞是PowerSploit函数:Find-ProcessDLLHijack、Find-PathDLLHijack_和_Write-HijackDll。
如果发现可利用的情况,成功利用的一个最重要的事情是创建一个至少导出可执行文件将从中导入的所有函数的dll。无论如何,请注意,Dll劫持很方便,可以从中间完整性级别升级到高级**(绕过UAC)或从高完整性升级到SYSTEM**。您可以在此dll劫持研究中找到一个如何创建有效dll的示例,重点是用于执行的dll劫持:https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows。 此外,在下一部分中,您可以找到一些基本dll代码,这些代码可能对模板或创建具有不需要导出的函数的dll有用。
基本上,Dll代理是一个能够在加载时执行您的恶意代码,同时也能够公开并按照预期工作的Dll,通过将所有调用中继到真实库。
使用工具DLLirant或Spartacus,您实际上可以指定一个可执行文件并选择要代理的库,然后生成一个代理dll,或者指定Dll并生成一个代理dll。
获取反向shell(x64):
获取一个 Meterpreter(x86):
创建一个用户(x86 我没有看到 x64 版本):
请注意,在几种情况下,您编译的 DLL 必须导出多个函数,这些函数将由受害进程加载,如果这些函数不存在,二进制文件将无法加载它们,利用将失败。
漏洞悬赏提示: 注册 Intigriti,一个由黑客创建的高级漏洞悬赏平台!立即加入我们,访问 https://go.intigriti.com/hacktricks,开始赚取高达**$100,000**的悬赏金!