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

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

  • 相关阅读:
    #include<unistd.h>存在linux中,含有系统服务的函数
    Value Categories
    Main function
    Phases of translation
    Memory model
    Unqualified name lookup
    Qualified name lookup
    Name lookup
    Definitions
    Object lifetime
  • 原文地址:https://www.cnblogs.com/justforfun12/p/5324408.html
Copyright © 2011-2022 走看看