-
-
[原创]一个规避安装包在当前目录下被DLL劫持的想法
-
发表于:
2022-7-16 17:43
18023
-
[原创]一个规避安装包在当前目录下被DLL劫持的想法
本文描述了一个避免安装包目录下被DLL劫持的思路。
问题描述:
之前碰到了一个被DLL劫持的情况,通过打包工具做好的安装包在启动会去加载某个系统DLL,设想一种情况,我们下载文件时经常是经常是放在了默认目录下,假如安装包和恶意DLL放在同一目录下,以管理员权限运行安装包时会优先加载本地的恶意DLL,前提是这个dll不在注册表的KnownDlls项中。即:对于不在KnownDlls项下的系统dll,很有可能会被当前进程目录下的DLL劫持。
注册表下的KnownDlls项保存了多项内容,当进程加载时如果需要加载的dll中在KnownDlls中存在,那么系统会优先在系统路径下加载此DLL。
为了解决这个问题,想了两个思路,这两个思路都需要对安装包进行一个封装,有一个释放程序将安装包嵌入到自己的资源文件中,但是实际操作过程中第一个还无法实现,如下:
1.有一个释放程序以管理员权限运行,操作KnownDlls,将即将被劫持的DLL假如到KnownDlls注册表项中,然后再释放安装包到当前目录或者其他目录下都可以,接着运行安装包程序,但是在实际操作过程中发现,很难获取到修改KnownDlls项的权限,目前还没有在代码层面想到办法,所以第一个思路失败。
2.有一个释放程序以管理员权限运行,在系统的临时目录(或者其他文件夹)下创建一个文件夹,创建时设置文件夹的访问权限,只能以管理员权限或者更高的权限才可以访问,接着将安装包释放到此目录下,此目录下只有安装包程序,没有恶意攻击者存放的恶意DLL,这样就避免了安装包运行时被恶意DLL在当前进程目录下劫持,这种方式只适用于NTFS文件系统,现在大部分的Windows硬盘都使用此文件系统,NTFS可以存储许多额外的信息。
第一个思路需要具体到某个dll的名字写入到注册表,第二个方法应该实现更加简单。
第二个思路的重点在于创建一个新的文件夹,这个文件夹只有管理员权限及以上权限才可以读写,而恶意攻击者一般情况下都运行于普通用户权限或者受限管理员权限下,有两种方式:
1.使用现成的已经限制号权限的文件夹,如将文件夹存放在C:\ProgramData(通过环境变量%ALLUSERSPROFILE%可以获得),这个文件夹下的内容默认情况下只有不受限管理员及以上权限才可以读写,可以将安装包释放到这个文件夹及子文件夹下,创建目录时文件描述符传入空即可。
2.可以在临时目录C:\Users\用户名\AppData\Local\Temp(通过%TEMP%来获取)下来创建文件夹,这个文件夹是everyone用户都可以读写的,所以释放程序以管理员权限运行时需要创建控制访问权限的目录,只能让不受限管理员和更高权限来读写此文件夹,然后将程序释放到此目录下,以不受限管理员权限运行安装包,此时刚创建目录下只有安装包,也不用担心被恶意攻击者在当前进程所在目录下劫持DLL了,反过来如果恶意攻击者可以在此目录下存放恶意DLL,那就意味着恶意攻击者已经拥有了不受限的管理员,本身就拥有很高权限了,正常情况下也不需要通过DLL劫持来提权了。
有的高权限程序会去修改C:\ProgramData文件夹的权限,所以自己创建一个新的文件夹更可靠一些。
下面代码演示了如何在临时文件夹下创建带有访问权限控制的文件夹:
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2022-7-17 12:25
被0346954编辑
,原因: