简介
在2022年的Defcon大会上,安全研究人员Wietze
Beukema通过对进程级环境变量的研究,提出了一种Dll劫持新思路,下面就其中涉及的技术点展开介绍。
**01 **环境变量
每一个进程都有一个环境块,其中包含一组环境变量及其值。有两种类型的环境变量,用户环境变量和系统环境变量。
用户环境变量 :仅对当前用户有效,位于:HKEY_CURRENT_USER\Environment
系统环境变量
:对所有用户均有效,位于:HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session
Manager\Environment
默认情况下,子进程继承其父进程的环境变量。命令处理器启动的程序继承命令处理器的环境变量。
**02 **劫持原因
程序可能会依赖Windows定义好的环境变量来确定某些文件的位置,尤其对于Windows内置程序来说大量依赖环境变量来寻找系统盘文件。如下展示的是Windows系统盘ws2_32.dll中的代码片段:
正常来说"%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(&