第三方插件渗透攻击之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天时间,还是慢了点。
而且感觉自己的大局观还不太好,很容易沉溺于细节当中,不过这也无可厚非,毕竟还是刚刚入门。下一次呢可以尝试为调试过程分好步骤,最后再综合起来总结思考。