浅谈目录权限导致的文件劫持
字数 2203 2025-08-20 18:17:31

Windows目录权限与文件劫持安全教学文档

0x00 概述

Windows系统中,某些目录或文件的权限设置不当会导致攻击者能够在这些目录下植入恶意文件或执行文件。由于这些目录缺乏有效的访问控制和安全审查,攻击者可以利用漏洞修改、替换或注入文件,甚至劫持系统中的合法进程或服务。

典型的弱权限目录包括:

  • C:\Windows\Temp
  • C:\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 // 进程信息
);

关键参数解析

  1. lpApplicationName

    • 指定应用程序的路径(可选)
    • 如果为NULL,系统会从lpCommandLine的第一个空格分隔项中解析出应用程序路径
  2. lpCommandLine

    • 传递给新进程的命令行参数
    • 如果lpApplicationName为NULL,这个参数必须包括应用程序的完整路径或命令名称

路径解析机制

lpApplicationName为NULL时,系统从lpCommandLine中解析可执行文件路径的过程:

对于路径:c:\program files\sub dir\program name

系统会按以下顺序尝试解析:

  1. c:\program.exe
  2. c:\program files\sub.exe
  3. c:\program files\sub dir\program.exe
  4. c:\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

利用方式

  1. C:\ProgramData\Citrix\目录具有弱权限
  2. 攻击者可在该路径写入恶意Citrix.exe
  3. 当管理员卸载Citrix Workspace应用程序时,将执行恶意Citrix.exe提升权限

CVE-2022-24767: Git卸载程序中的DLL劫持

漏洞描述
在SYSTEM用户帐户下运行时,Windows版Git的卸载程序容易受到DLL劫持。

利用过程

  1. 监控发现卸载程序会尝试从C:\Windows\Temp加载DLL
  2. 普通用户具有C:\Windows\Temp目录的写权限
  3. 攻击者可将恶意DLL写入该目录
  4. 当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程序卸载时存在验证不当的情况,导致本地攻击者能够利用目录链接删除任意目录。

利用过程

  1. 程序卸载时会尝试删除C:\ProgramData\Samsung\deviceprofile\cache目录内容
  2. C:\ProgramData\Samsung\目录权限允许普通用户读写
  3. 攻击者可创建目录软链接:
    • C:\ProgramData\Samsung\deviceprofile\cache链接到C:\Windows\hacktest
  4. 管理员卸载程序时会导致C:\Windows\hacktest目录内容被删除

0x04 防御措施

  1. 严格的目录权限控制

    • 限制关键目录的写入权限
    • 特别是系统目录和程序目录
  2. 安全的API使用

    • 使用CreateProcess时确保路径被正确引用
    • 尽可能指定lpApplicationName参数
  3. 文件完整性检查

    • 对关键可执行文件进行完整性验证
    • 使用数字签名验证
  4. 最小权限原则

    • 应用程序和服务应以最小必要权限运行
    • 避免使用高权限账户执行常规操作
  5. 安全开发实践

    • 避免使用未加引号的路径
    • 对用户输入进行严格验证

0x05 参考链接

  1. Microsoft CreateProcess文档
  2. Samsung安全公告
  3. FreeBuf相关文章
Windows目录权限与文件劫持安全教学文档 0x00 概述 Windows系统中,某些目录或文件的权限设置不当会导致攻击者能够在这些目录下植入恶意文件或执行文件。由于这些目录缺乏有效的访问控制和安全审查,攻击者可以利用漏洞修改、替换或注入文件,甚至劫持系统中的合法进程或服务。 典型的弱权限目录包括: C:\Windows\Temp C:\ProgramData 这些目录通常用于存储临时文件,但许多应用程序和用户在使用时没有设置足够的权限控制,攻击者可以通过在这些目录中放置恶意可执行文件来实现文件劫持攻击,进而执行代码或提升系统权限。 0x01 CreateProcess API的不安全使用 CreateProcess API是Windows中用来创建新进程的基础函数,其工作机制对程序的启动和路径解析至关重要。 CreateProcess基本用法 关键参数解析 lpApplicationName : 指定应用程序的路径(可选) 如果为NULL,系统会从lpCommandLine的第一个空格分隔项中解析出应用程序路径 lpCommandLine : 传递给新进程的命令行参数 如果lpApplicationName为NULL,这个参数必须包括应用程序的完整路径或命令名称 路径解析机制 当 lpApplicationName 为NULL时,系统从 lpCommandLine 中解析可执行文件路径的过程: 对于路径: c:\program files\sub dir\program name 系统会按以下顺序尝试解析: c:\program.exe c:\program files\sub.exe c:\program files\sub dir\program.exe c:\program files\sub dir\program name.exe 安全编码实践 安全的使用方式应该是: 关键点 : 如果 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示例代码 : 利用效果 : 创建一个名为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 参数 文件完整性检查 : 对关键可执行文件进行完整性验证 使用数字签名验证 最小权限原则 : 应用程序和服务应以最小必要权限运行 避免使用高权限账户执行常规操作 安全开发实践 : 避免使用未加引号的路径 对用户输入进行严格验证 0x05 参考链接 Microsoft CreateProcess文档 Samsung安全公告 FreeBuf相关文章