zoukankan      html  css  js  c++  java
  • 第三方插件渗透攻击之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天时间,还是慢了点。

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

  • 相关阅读:
    bzoj-2748 2748: [HAOI2012]音量调节(dp)
    bzoj-2338 2338: [HNOI2011]数矩形(计算几何)
    bzoj-3444 3444: 最后的晚餐(组合数学)
    codeforces 709E E. Centroids(树形dp)
    codeforces 709D D. Recover the String(构造)
    codeforces 709C C. Letters Cyclic Shift(贪心)
    codeforces 709B B. Checkpoints(水题)
    codeforces 709A A. Juicer(水题)
    Repeat Number
    hdu 1003 Max Sum (动态规划)
  • 原文地址:https://www.cnblogs.com/justforfun12/p/5324408.html
Copyright © 2011-2022 走看看