Windows目录权限与文件劫持安全教学文档
0x00 概述
Windows系统中,某些目录或文件的权限设置不当会导致攻击者能够在这些目录下植入恶意文件或执行文件。由于这些目录缺乏有效的访问控制和安全审查,攻击者可以利用漏洞修改、替换或注入文件,甚至劫持系统中的合法进程或服务。
典型的弱权限目录包括:
C:\Windows\TempC:\ProgramData
这些目录通常用于存储临时文件,但许多应用程序和用户在使用时没有设置足够的权限控制,攻击者可以通过在这些目录中放置恶意可执行文件来实现文件劫持攻击,进而执行代码或提升系统权限。
0x01 CreateProcess API的不安全使用
CreateProcess API是Windows中用来创建新进程的基础函数,其工作机制对程序的启动和路径解析至关重要。
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:
- 指定应用程序的路径(可选)
- 如果为NULL,系统会从lpCommandLine的第一个空格分隔项中解析出应用程序路径
-
lpCommandLine:
- 传递给新进程的命令行参数
- 如果lpApplicationName为NULL,这个参数必须包括应用程序的完整路径或命令名称
路径解析机制
当lpApplicationName为NULL时,系统从lpCommandLine中解析可执行文件路径的过程:
对于路径:c:\program files\sub dir\program name
系统会按以下顺序尝试解析:
c:\program.exec:\program files\sub.exec:\program files\sub dir\program.exec:\program files\sub dir\program name.exe
安全编码实践
安全的使用方式应该是:
LPTSTR szCmdline[] = _tcsdup(TEXT("\"C:\\Program Files\\MyApp\" -L -S"));
CreateProcess(NULL, szCmdline, ...);
关键点:
- 如果
lpApplicationName设为NULL,lpCommandLine中可执行文件路径需要加上引号 - 类似行为的API函数还有
CreateProcessAsUser
0x02 目录权限与文件劫持
不规范的编码习惯可能导致程序出现预期之外的行为,这些行为具有潜在的安全风险。如果相关目录被设置为弱权限,普通权限的攻击者可以在该目录下写入恶意文件,利用文件劫持来达到权限提升的目的。
0x03 案例分析
CVE-2020-13884: Citrix程序卸载过程中的EXE劫持
漏洞描述:
Citrix程序卸载过程中会调用CreateProcess执行TrolleyExpress.exe:
C:\ProgramData\Citrix\Citrix Workspace 1911\TrolleyExpress.exe
由于未加引号的路径,程序会尝试加载:
C:\ProgramData\Citrix\Citrix.exe
利用方式:
C:\ProgramData\Citrix\目录具有弱权限- 攻击者可在该路径写入恶意
Citrix.exe - 当管理员卸载Citrix Workspace应用程序时,将执行恶意
Citrix.exe提升权限
CVE-2022-24767: Git卸载程序中的DLL劫持
漏洞描述:
在SYSTEM用户帐户下运行时,Windows版Git的卸载程序容易受到DLL劫持。
利用过程:
- 监控发现卸载程序会尝试从
C:\Windows\Temp加载DLL - 普通用户具有
C:\Windows\Temp目录的写权限 - 攻击者可将恶意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 && net localgroup administrators\"");
ExitProcess(0);
}
return TRUE;
}
利用效果:
- 创建一个名为hacker的用户账户
- 将其添加到管理员组
- 实现权限提升
CVE-2022-39845: Samsung Kies卸载程序中的任意目录删除
漏洞描述:
Samsung Kies程序卸载时存在验证不当的情况,导致本地攻击者能够利用目录链接删除任意目录。
利用过程:
- 程序卸载时会尝试删除
C:\ProgramData\Samsung\deviceprofile\cache目录内容 C:\ProgramData\Samsung\目录权限允许普通用户读写- 攻击者可创建目录软链接:
- 将
C:\ProgramData\Samsung\deviceprofile\cache链接到C:\Windows\hacktest
- 将
- 管理员卸载程序时会导致
C:\Windows\hacktest目录内容被删除
0x04 防御措施
-
严格的目录权限控制:
- 限制关键目录的写入权限
- 特别是系统目录和程序目录
-
安全的API使用:
- 使用
CreateProcess时确保路径被正确引用 - 尽可能指定
lpApplicationName参数
- 使用
-
文件完整性检查:
- 对关键可执行文件进行完整性验证
- 使用数字签名验证
-
最小权限原则:
- 应用程序和服务应以最小必要权限运行
- 避免使用高权限账户执行常规操作
-
安全开发实践:
- 避免使用未加引号的路径
- 对用户输入进行严格验证