17 may 2011

Análisis de un troyano en JAVA

En estos días se ha comenzado a reproducir un troyano que llega al usuario a través de un correo electónico en portugués (muy común en sudamérica recibir noticias de este tipo desde Brazil). Este es el mail que puede que reciban:
Igual eu te falei aquele dia e voce nao quis acreditar. Amigo a gente conta no dedo!
Veja só o que seu amiguinho andou aprontando nessas fotos.
DSC02421.jpg (568,3 KB)
DSC02521.jpg (603,4 KB)
Obviamente esas "imágenes" con links a los ejecutables correspondientes… que son el mismo, aunque parezca que son de distinto tamaño, son para despistar. Los ejecutables apuntan a esta dirección: http://ads.sapo.[ELIMINADO]/event.ng/Type=click&FlightID=90951&AdID=169189&TargetID=6167&ASeg=&AMod=&Segments=8,69,154,526,527,688,1343,2130,2884,3325,3747,4552,4663,4778,4932,4963,4971,5065,5081,5088,5117,5152,5165,5169,5200,5295,5301,5508,5549,5557&Targets=246,5389,704,6167&Values=31,43,51,60,72,84,90,91,100,110,150,193,204,209,376,978,1036,1097,1100,1399,1436,1459,1478,1488,1489,1733,1754,1819,1863,1922,1941,2020,2174,2230,2863,2869,2956,2993,3322,3533,3576&RawValues=&Redirect=http://www.givinbeauty.com/UserFiles/File/photos.php?0.19325211365355321



Ese enlace conduce a un archivo ejecutable: http://www.givin[ELIMINADO].com/UserFiles/File/photos.php?0.19325211365355321.
Veremos más abajo que este sitio tiene una opción de login y si la hackearon, fué por ahí, subieron el ejecutable y lo reenvían por correo . Además, como veremos utilizaron otra web para redireccionar en este caso a http://ads.sapo.[ELIMINADO]/event.ng/.

Al descargar el troyano y observarlo con Peid se encontrará que está empaquetado con UPX . Si abrimos el EXE veremos un string como este:

.rdata:00414BA8 0000000B C WINRAR.SFX                                                     
.rdata:00414BCC 00000039 C d:\\Projects\\WinRAR\\SFX\\build\\sfxrar32\\Release\\sfxrar.pdb

Estas lineas significan que son ejecutables autoextraíbles de WinRAR. ¿Necesitamos descomprimirlos con Olly? No, con WinRAR podemos descomprimirlo en una carpeta y dejará un archivo llamado: loader.jar, una aplicación JAVA y ya hemos sacado algunas capas de la cebolla.

Podemos hacer uso de WinRAR una vez más para descomprimir el JAR de JAVA, ya que estos son comprimidos con ZIP. Así que hacemos botón derecho y extraer a una carpeta. Nos devolverá las carpetas que se ve en la imagen.

Ahora vamos a lo mejor, decompilar los .CLASS, los archivos de JAVA compilados (el famoso código objeto .OBJ). Estos archivos son interpretados por el classloader de JAVA y son ejecutados como una aplicación más. Existen muchos decompiladores de archivos CLASS de JAVA y uno de los más conocidos es el DJ JAVA Decompiler.

Veremos los Imports, algunos interesantes y otros no tanto.
import b.d;
import by.squareroot.injector.lib.MyKernel32;
import by.squareroot.injector.struct.Context;
import by.squareroot.injector.struct.MemoryBasicInformation;
import by.squareroot.injector.struct.ProcessInformation;
import by.squareroot.injector.struct.StartupInfoA;
import by.squareroot.injector.struct.TotalProcInfo;
import by.squareroot.injector.struct.WoW64Context;
import by.squareroot.injector.struct.pe.MZHeader;
import by.squareroot.injector.struct.pe.PEInfo;
import by.squareroot.injector.struct.pe.PE_ExtHeader;
import by.squareroot.injector.struct.pe.PE_Header;
import by.squareroot.injector.struct.pe.SectionHeader;
import com.sun.jna.Platform;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.Advapi32Util;
import com.sun.jna.platform.win32.WinReg;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.ByteBuffer;
import java.util.Properties;
Los primeros son los más interesantes obviamente, veremos que son clases hechas con ayuda de un amigo de nuestro creador denominado squareroot. Si buscamos un poco el nombre de la clase, el nick del creador y la palabra Class, nos encontramos con un sitio ruso que ofrecía bajar: build___00002469.jar que aparentemente contenía este mismo contenido.

No debemos rendirnos ahí (hay que aprender a buscar como nos enseño el gran Fravia, QEPD) buscaremos un poco más encontraremos una referencia en este stitio que parece ser de otro reverser analizando jaZEUS.

Si leemos un poco ese artículo para luego continuar con este podemos concluir dos cosas:
  1. El creador de este virus usó la misma técnica y recursos que el virus jaZEUS para infectar a sus víctimas.
  2. Es una variante de JAZeus o la versión original.
Opto por la primer opción ya que el dropper (ejecutable que descomprime y deja el virus en un lugar para ejecutarlo luego) es diferente a la versión jaZEUS que analizó nuestro amigo Donato Ferrante (ratsoul). La estructura de nuestra variante es muy similar a la de jaZEUS, podemos verlo en la imagen del artículo:

Veremos que la clase Launcher no se encuentra en nuestro paquete de Injector y tampoco el paquete crypt. Pero si encontraremos lo mismo en el paquete data.

En JAZeus aparentemente los dos .EXE están cifrados, en nuestra variante, solo app.exe está cifrado y dummy.exe no, lo podemos ver simplemente abriendo el EXE y viendo su cabecera. Si debuggeamos dummy.exe veremos que se trata de otro dropper hecho en C++ que buscara desencriptar app.exe, buscando el metodo de cifrado en el archivo method y luego usando ese parámetro para descifrarlo y ejecutarlo.

Aparentemente el método de desempaquetado de este virus es el mismo a como lo hace JAZeus, con la variante que no tiene el launcher. Por lo que veo el launcher esta unificado en a.class ya que ejecuta app.exe luego de desencriptarlo desde ahí dentro. El paquete injector se encarga del armado y la injección en memoria del ejecutable para la ejecución del virus real. En el método "a" de la clase "a", veremos que se pone al inicio para arrancar cuando arranca nuestro SO:
s = a(“data/app.exe“);
b.a a1 = a();
try
{
if((obj = a()) != null)
{
String s1;
if((s1 = ((Properties) (obj)).getProperty(“hklm“)) != null)
{
String s2 = a();
Advapi32Util.registrySetStringValue(WinReg.HKEY_LOCAL_MACHINE, “SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\“, s1, s2);
}
String s3;
if((s3 = ((Properties) (obj)).getProperty(“hklu“)) != null)
{
obj = a();
Advapi32Util.registrySetStringValue(WinReg.HKEY_CURRENT_USER, “Software\\Microsoft\\Windows\\CurrentVersion\\Run\\“, s3, ((String) (obj)));
}
}
}
Como podemos ver encontraremos otros trozos de código interesantes, para encontrar nuestro virus deberemos desencriptar app.exe. Al no tener el launcher se hace un poco dificultoso pero lo más importante es que encontramos como funciona de que se trata, para frenarlo al menos deberemos sacar esa llave de registro.

Si llegara a ser un JAZeus tendremos algunos problemas más de seguro, igualmente podremos encontrar el método de cifrado 3DES como string en los demás .CLASS, además de una posible clave, frase muy utilizada como demo de post en blogs, etc.

Spark de Disidents

Suscríbete a nuestro Boletín

0 Comments:

Publicar un comentario

Gracias por dejar un comentario en Segu-Info.

Gracias por comentar!