第三方插件渗透攻击之KingView

类别:堆溢出

描述:本次渗透利用了KingView6.5.3 SCADA中的ActiveX插件中存在漏洞的方法调用target.ValidateUser(arg1, arg2),通过缓冲区溢出覆盖了SEH,再利用堆喷射成功执行payload!

参考资料:《Metasploit魔鬼训练营》p261-p269

 

由于Metasploit没有相应的模块,所以可以参考exploit-db上的漏洞详情,自己编写代码:

  https://www.exploit-db.com/exploits/16936/

咱对ruby还不是太熟悉,就先偷下懒了。直接将下载的源代码kingview_SCADA_activeX_validateuser.rb放到exploits/windows/browser目录下去。

源码下载地址:https://community.rapid7.com/thread/1446#comments

看了一下作者的描述,大概是说按照栈溢出的方式没能成功攻击,所以这段代码实际上使用了堆溢出

 

KingView ActiveX渗透攻击过程:

由于用到ActiveX控件,所以要现在靶机ie7浏览器上取消activeX的一些禁用设置。具体在“工具”菜单----》Internet选项----》选择“安全”选项卡----》选择“自定义级别”进行设置。

然后exploit就能成功植入meterpreter啦!

 

KingView ActiveX漏洞机理分析:

使用漏洞发布者的POC(Proof of Concept)代码作为样本,保存为本地html,使用OllyDbg打开IE再打开这个网页。多次中断就一直按f9运行,最终中断在这条指令

(这里和书中的地址不一样,我就是不太明白为什么之前ms06_087那里的指令地址会一样)

  03C09238    880C02          mov     byte ptr [edx+eax], cl



也就是指令在向0x00130000写入数据时发生了异常。

 

按alt+m可以查看内存布局,可见上面指令的操作已经超出栈区了,因此引发异常。

 

咱们可以再观察一下出错处的完整代码:

实际上就是一个循环,不断把内容复制到栈区中,直到遇到NULL字符退出循环。

咱们在上图0x03c09238处下断点,重新运行ie加载漏洞html。

我们复制的目的地址从0x0012DB78开始,而ebp的值为0x0012DE58。可知缓冲区的大小为两者相减等于0x2E0。而我们渗透代码中构造超长参数的部分如下:

129                         junk1="A";
130                         junk2="A";
131                         while (junk1.length<624){ junk1+=junk1;}
132                         junk1=junk1.substring(0,624);
133                         junk2=junk1;
134                         while (junk2.length<8073){ junk2+=junk2;}
135                         arg2=junk1+nse+seh+nops+shell+junk2;
136                         arg1="Anything";
137                         vulnerable.ValidateUser(arg1 ,arg2);

可知参数的长度大于缓冲区大小,且其中不含NULL字符,必定会造成溢出。

而通过fs:[0]可以知道seh(struct exception handler)指针在栈区中的地址是0x0012DDE8。

 

按F9运行后可以看见开始以每次1字节的速度向内存中写入同样的数据"A"(0x41)。那我们给这个断点设置个条件,让它直接跳到覆盖seh指针的地方:

按f9运行,到达SEH处开始进行覆盖。从这里开始写入的数据就不再是无意义的“A”了,而是复制了8个字节的特意构造的数据(即上面代码135行中arg2参数的nse+seh),后面再继续用0x90(即arg2参数中的nops)填充,用作堆喷射。接着是shell这个载荷,最后再用junk2即"A"填充。

 

最后就像前面说的栈溢出引发了异常,程序将调用seh,也就是栈区中的se handler,地址为0x72D1204E:

0x72D1204E处下断点,按shift+f9跳过异常。

来到一段pop/pop/ret指令处:

观察栈可知第三条指令retn从栈中取出0x0012DDE8放入eip并转到该地址执行。而那里实际上就是刚刚的栈中SEH指针处:

也就是说程序会将数据(SEH地址)当成指令来运行!

而本来应该放置下一个SEH的地方被我们的溢出覆盖为909006EB。那么相应的指令就是:

EB 06使我们跳过了SEH指针的地址,来到了第一个90(即nop)的位置处。然后就是激动人心的heap spraying啦,一直滑行到咱们的shellcode处,大功告成!

 

总结:加深了对堆栈的理解,由于上次oracle漏洞分析没有做成功,所以通过这次实验才比较了解了覆盖SEH的渗透方法,其中较特别的一点是让程序将数据当做代码执行。除此之外,还学习使用了条件断点,以及用shift+f7/f8/f9来跳过异常的技巧。花了大概2天时间,还是慢了点。

而且感觉自己的大局观还不太好,很容易沉溺于细节当中,不过这也无可厚非,毕竟还是刚刚入门。下一次呢可以尝试为调试过程分好步骤,最后再综合起来总结思考。

 

posted @ 2016-03-27 18:13  燃烧少年的心  阅读(1072)  评论(0编辑  收藏  举报