freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

浅谈目录权限导致的文件劫持
360安全应急响应中心 2024-12-09 21:58:44 102571
所属地 北京

0x00. 概述

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

在Windows系统中,存在一些典型的弱权限目录,如C:\Windows\TempC:\ProgramData等,这些目录通常用于存储临时文件。然而,许多应用程序和用户在使用时没有对这些目录设置足够的权限控制,攻击者可以通过在这些目录中放置恶意可执行文件来实现文件劫持攻击,进而执行代码或提升系统权限。

本文通过分享几个文件劫持案例来了解弱权限目录带来的安全问题。在具体案例之前,我们先从CreateProcess API谈起。

0x01. CreateProcess的不安全使用

CreateProcessAPI 是 Windows 中用来创建新进程的基础函数,它的工作机制对程序的启动和路径解析至关重要。这个 API 有多个参数,其中lpApplicationNamelpCommandLine是关键参数,它们共同影响进程创建的行为,尤其是如何解析和执行传入的可执行文件路径。

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:指定应用程序的路径(可选)。如果为NULL,则系统会从lpCommandLine的第一个空格分隔项中解析出应用程序路径。

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

lpApplicationNameNULL时的路径解析

lpApplicationNameNULL时,系统必须从lpCommandLine中解析出可执行文件的路径。这个过程会涉及到路径解析和处理,其中可能涉及到文件名包含空格的问题。

命令行中的路径解析顺序

CreateProcess文档

看一个微软官方文档的案例,假设lpCommandLine包含了类似于以下内容:

c:\program files\sub dir\program name

CreateProcess执行该路径时未加引号,同时lpApplicationNameNULL,系统会按以下方式依次解析该路径:

  1. c:\program.exe:系统首先会尝试将路径从字符串的开始部分截断,解析为c:\program.exe

  2. c:\program files\sub.exe:如果第一个解析失败,系统会尝试将路径解析为c:\program files\sub.exe

  3. c:\program files\sub dir\program.exe:接下来,系统尝试解析整个路径,认为program.exe是可执行文件名,并尝试执行它。

  4. c:\program files\sub dir\program name.exe:最后,系统会尝试将program name视为可执行文件名,并在其后附加.exe扩展名进行解析。

编写poc程序测试

测试程序:

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    // 定义并初始化命令行
    char *szCmdline = _strdup("c:\\program files\\sub dir\\program name");

    // 初始化 STARTUPINFO 和 PROCESS_INFORMATION 结构体
    STARTUPINFOA si = {0};           // 使用 ANSI 版结构体
    PROCESS_INFORMATION pi = {0};   // 进程信息
    si.cb = sizeof(si);

    // 调用 CreateProcessA(ANSI 版本)
    if (CreateProcessA(
            NULL,           // 应用程序名,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: %lu\n", GetLastError());
    }

    // 释放命令行缓冲区
    free(szCmdline);

    return 0;
}

该测试程序尝试通过CreateProcessA启动"c:\program files\sub dir\program name",编译并运行该程序,同时使用Process Monitor监控

,可以看到Process Monitor监控到了程序预期的行为。如果c盘根目录存在program.exe,则c:\program.exe将会被执行。
image

CreateProcess API 安全的用法应该是:

LPTSTR szCmdline[] = _tcsdup(TEXT("\"C:\\Program Files\\MyApp\" -L -S"));
    CreateProcess(NULL, szCmdline, /*...*/);

如果为 lpApplicationName设为NULL,lpCommandLine中可执行文件路径则需要加上引号。类似这种行为的API函数还有CreateProcessAsUser。

0x02. 目录权限与文件劫持

通过上面的CreateProcess测试程序,可以看出一些不规范的编码习惯可能会导致程序出现预期之外的行为,这些行为具有潜在的安全风险。这个案例如果相关目录被设置为弱权限,比如c:\program files\sub dir\ 目录权限设置不当,导致具有普通权限的攻击者可以在该目录下写入恶意文件,利用文件劫持来达到权限提升的目的。接下来让我们通过几个真实CVE案例来探讨弱权限目录导致的文件劫持可能造成的危害。

0x03. 案例分析

CVE-2020-13884 :弱权限目录导致的exe劫持

CVE-2020-13884中,Citrix程序卸载过程中会调用CreateProcess API来执行文件TrolleyExpress.exe(C:\ProgramData\Citrix\Citrix Workspace 1911\TrolleyExpress.exe),由于未加引号的路径,导致程序会尝试加载C:\ProgramData\Citrix\Citrix.exe,而路径C:\ProgramData\Citrix\具有弱权限,攻击者可以在该路径写入恶意Citrix.exe,等待管理员卸载 Citrix Workspace 应用程序时,将执行恶意Citrix.exe提升权限。
image
image

CVE-2022-24767 :弱权限系统目录导致的本地提权

CVE-2022-24767简述:在 SYSTEM 用户帐户下运行时,Windows 版 Git 的卸载程序容易受到 DLL 劫持

system用户卸载 Git for Windows 程序,监控程序行为,会发现Git卸载程序会尝试从C:\Windows\Temp加载dll
image
由于普通用户也具有C:\Windows\Temp目录的写权限,所以低权限的攻击者可以将恶意dll写入C:\Windows\Temp目录,当system用户卸载Git程序时,恶意dll将会运行,攻击者可达到权限提升的目的。
image
这里尝试通过劫持netapi32.dll来执行恶意代码

恶意netapi32.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\"");  //创建一个名为 hacker 的用户账户,并将其添加到管理员组,从而提升权限
        ExitProcess(0);
    }
    return TRUE;
}

image
编译完成后把netapi32.dll放到C:\Windows\Temp目录下,system用户卸载 Git for Windows 程序,会发现恶意dll被执行,成功向管理员组添加一个用户hacker

CVE-2022-39845 :弱权限目录导致的任意目录删除

该漏洞是关于Samsung Kies(三星官方提供的可将手机与电脑连接的一款PC套件工具),程序卸载时存在验证不当的情况,导致本地攻击者能够利用目录链接删除任意目录。使用Process Monitor监控该文件卸载过程,发现该程序会尝试删除C:\ProgramData\Samsung\deviceprofile\cache 目录内容,而该目录不存在。
image

C:\ProgramData目录是弱权限,查看C:\ProgramData\Samsung\ 目录权限,可以看到普通用户可以读写。
image
一个低权限的攻击者可以创建C:\ProgramData\Samsung\deviceprofile\cache目录,并将其链接到其他高权限目录,那么当管理员用户卸载该程序时,可以达到删除任意目录的攻击效果。

比如这里普通用户尝试删除C:\Windows\hacktest\目录下内容,会发现没有权限。
image
但普通用户可以创建一个目录软链接,将C:\ProgramData\Samsung\deviceprofile\cache链接到C:\Windows\hacktest
image
这样管理员在卸载Samsung Kies程序是就会导致C:\Windows\hacktest\目录内容被删除。

0x04. 总结

程序目录权限导致的文件劫持是一个容易被忽视的安全问题,通常涉及到权限控制不当、路径配置错误、或文件系统管理不严格等因素。通过加强文件权限管理、路径安全、以及文件完整性保护,可以有效防止此类攻击的发生。

0x05. 参考链接:

https://learn.microsoft.com/zh-cn/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa?redirectedfrom=MSDN

https://security.samsungmobile.com/serviceWeb.smsb?year=2022&month=09

https://www.freebuf.com/vuls/400438.html

# 权限 # 文件劫持
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 360安全应急响应中心 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
360安全应急响应中心 LV.5
360安全应急响应中心(简称360SRC)是360公司致力于保障产品及业务安全,促进白帽专家合作与交流的平台。诚邀白帽专家向我们反馈360产品安全漏洞、威胁情报,共筑数字安全基石,保障数亿用户业务和产品的安全。
  • 34 文章数
  • 23 关注者
基于 RAG 提升大模型安全运营效率
2025-04-03
实战分享:构建高效平台型C2的经验总结
2024-12-12
混淆还原的几种方式实践
2024-12-06
文章目录