2025年DEFCON议题解读|Dll劫持新思路——修改环境变量

DEFCON议题解读|Dll劫持新思路——修改环境变量简介 在 2022 年的 Defcon 大会上 安全研究人员 Wietze Beukema 通过对进程级环境变量的研究 提出了一种 Dll 劫持新思路 下面就其中涉及的技术点展开介绍 01 环境变量 每一个进程都有一个环境块 其中包含一组环境变量及其值 有两种类型的环境变量 用户环境变量和系统环境变量 用户环境变量

大家好,我是讯享网,很高兴认识大家。

简介

01 环境变量

每一个进程都有一个环境块,其中包含一组环境变量及其值。有两种类型的环境变量,用户环境变量和系统环境变量。

用户环境变量 :仅对当前用户有效,位于:HKEY_CURRENT_USER\Environment

1662625790_6319a7fec0bf7a2ef0d51.png!small?1662625791600
讯享网

系统环境变量
:对所有用户均有效,位于:HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session
Manager\Environment

1662625797_6319a80587c059c04f8c9.png!small?1662625798165

默认情况下,子进程继承其父进程的环境变量。命令处理器启动的程序继承命令处理器的环境变量。

02 劫持原因

程序可能会依赖Windows定义好的环境变量来确定某些文件的位置,尤其对于Windows内置程序来说大量依赖环境变量来寻找系统盘文件。如下展示的是Windows系统盘ws2_32.dll中的代码片段:

1662625834_6319a82a574b57e0b0741.png!small?1662625834920

正常来说"%SystemRoot%/System32/mswsock.dll"会被解析为"C:/Windows/System32/mswsock.dll",但是这里面有一个不确定的因素就是"%SystemRoot%“,假设我们修改了环境变量”%SystemRoot%"的值为其他文件夹路径且在该路径下存放恶意Dll,那么程序就会加载我们设定的Dll,继而完成Dll劫持。

如果直接更改"%SystemRoot%“的值,会对整个操作系统上运行的程序产生影响,但是我们可以只修改指定进程的环境变量,如创建以下vbs脚本,利用子进程默认继承其父进程环境变量的特性,修改Windows内置进程hostname.exe的环境变量"SystemRoot"为"C:\Evil”。

Set shell = WScript.CreateObject("WScript.Shell") shell.Environment("Process")("SystemRoot") = "C:\Evil" shell.Exec("C:\windows\system32\hostname.exe") 

讯享网

操作流程如下:

1662625847_6319a8378e4d9fb532a36.png!small?1662625847911

然后用Procmon监控hostname.exe,可以看到确实会加载"C:\Evil"路径下的Dll。

1662625857_6319a841632caa56059f7.png!small?1662625857868

03 持久化

从上面流程可以看到,能够完成Dll劫持的关键在于修改环境变量的值,那么完成持久化的关键就在于维持目标进程环境变量值的修改。下面提供2种持久化方案:

利用注册表修改Windows自启服务的环境变量

这里先引用下Wietze Beukema文章中提到的修改Windows打印机服务的环境变量,看是否会成功加载指定目录下的Dll文件。

1. 首先将恶意Dll"mswsock.dll"放到指定目录"C:\Evil\System32"

2. 在注册表spoolsv服务下创建"Environment"键值修改环境变量

1662625877_6319a855e9278c3bb2691.png!small?1662625878526

3. 重启spoolsv服务,用Procmon进行监控

1662625897_6319a86930dfd5581a228.png!small?1662625897634

可以看到使用上述方式修改Windows服务的环境变量确实能够加载我们指定目录下的Dll文件。但是需要注意的是,有时候为了保证被修改的服务能够正常运行,我们需要将受环境变量影响的Dll全部移动到我们指定的路径下。

实际上能够被利用的Windows服务远不止上面一个,通常来说服务对应一个PE文件,这里我们去看看Windows自带服务的PE文件路径是如何写的就明白了。

1662625926_6319a886761e07e86d49d.png!small?16626259269521662625931_6319a88b961c8b35426ac.png!small?1662625932124

可以看到很多服务都依赖环境变量来寻找所对应的PE文件,这里我推荐修改的Windows自启服务是Windows推送通知系统服务(WpnService),修改环境变量后只需移动一个受影响的Dll文件即可,不用管该服务是否能够正常运行。

常规持久化配合创建子进程

我们也可以使用常规持久化方案如创建计划任务或者写注册表来实现自启,然后程序自启后自修改自身环境变量值,最后创建受环境变量影响的Windows可信进程,利用Dll劫持来完成一次隐匿攻击行为。

接下来使用Win32 API来展示下如何修改子进程的环境变量。

1. 子进程Child.exe代码如下:

讯享网#include <windows.h> int main(int argc, char* argv[], char* envp[]) { char szBuf[MAX_PATH] = {}; GetEnvironmentVariable("SystemRoot", szBuf, sizeof(szBuf)); MessageBox(NULL, szBuf, "Child", MB_OK); return 0; } 
  1. 父进程Parent.exe代码如下:

    #include <stdio.h>
    #include <windows.h>
    int main(int argc, char* argv[], char* envp[]) {
    SetEnvironmentVariable(“SystemRoot”, “C:\Evil”);
    UINT nRet = WinExec(“C:/Users/Super/Desktop/Child.exe”, SW_HIDE);
    if (nRet > 31)
    {
    printf(“创建子进程成功\n”);
    }
    else
    {
    printf(“创建子进程失败\n”);
    }
    return 0;
    }

3. 运行Parent.exe进程,查看结果

1662625959_6319a8a71aadde817a704.png!small?1662625959622

以上需要注意一点的就是,当Child.exe进程需要的权限比Parent.exe进程高时,Parent.exe创建Child.exe进程时会失败,当然也就无法谈起修改其环境变量值了,如下:

1662625972_6319a8b46540c874720cf.png!small?1662625973041

04 预防和影响范围

1662626005_6319a8d5ee22a2f82e892.png!small?1662626006776

我们自己写的程序或者模块可能会引用Windows系统Dll文件,但是Windows内部Dll文件大量引用环境变量,这会让我们的程序可能会受到此类Dll劫持手法的攻击。为了尽可能的减少风险,在编码时我们可以遵循以下规则:

2. 对系统Dll进行路径检测

3. 对程序加载的Dll进行签名校验

05 总结

2. "海量"的Windows服务和内置进程均受环境变量的影响,这值得引起我们安全研究人员对环境变量的重视,以应对后面可能出现的此类攻击手法。

参考

https://www.wietzebeukema.nl/blog/save-the-environment-variables

w.wietzebeukema.nl/blog/save-the-environment-variables

学习计划安排


我一共划分了六个阶段,但并不是说你得学完全部才能上手工作,对于一些初级岗位,学到第三四个阶段就足矣~

这里我整合并且整理成了一份【282G】的网络安全从零基础入门到进阶资料包,需要的小伙伴可以扫描下方CSDN官方合作二维码免费领取哦,无偿分享!!!

如果你对网络安全入门感兴趣,那么你需要的话可以

点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

①网络安全学习路线
②上百份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥HW护网行动经验总结
⑦100个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年CTF夺旗赛题解析

小讯
上一篇 2025-04-01 23:19
下一篇 2025-01-27 12:35

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/127061.html