第三方插件渗透攻击之KingView

类别:堆溢出html

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

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

 

因为Metasploit没有相应的模块,因此能够参考exploit-db上的漏洞详情,本身编写代码:api

  https://www.exploit-db.com/exploits/16936/浏览器

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

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

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

 

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天时间,仍是慢了点。

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

相关文章
相关标签/搜索