Foro de elhacker.net

Seguridad Informática => Análisis y Diseño de Malware => Mensaje iniciado por: rub'n en 16 Enero 2018, 15:30 pm



Título: Analisis de stub.dll con Java
Publicado por: rub'n en 16 Enero 2018, 15:30 pm
Buenas que tal? alguna sugerencia de como podria decompilar este stub.dll ? no esta ofuscado se carga desde

Código
  1. final JarInputStream input = new JarInputStream(App.class.getClassLoader().getResourceAsStream("stub.dll"));

para luego cifrar las clases que contiene con DES y crear un server, quiero saber su funcionamiento

bueno si alguien me da una sugerencia pues bien, otra cosa no posee runPE, No pareciera estar con JNA O JNI. La imagen de abajo no me muestra nada ojo uso este soft solo para motivos de exploración.

(http://i68.tinypic.com/23t4mzs.jpg)

https://drive.google.com/open?id=1JpTcaZ9NDUG3I1lnQSY4CxMzKLhfuP0v


Título: Re: Analisis de stub
Publicado por: fary en 16 Enero 2018, 15:37 pm
¿De donde sacaste este Stub? ¿Es de algún cripter? ¿En que lenguaje esta creado?


Título: Re: Analisis de stub
Publicado por: rub'n en 16 Enero 2018, 15:46 pm
¿De donde sacaste este Stub? ¿Es de algún cripter? ¿En que lenguaje esta creado?

Como esta jefe gracias por la pronta respuesta,
  
  • lenguaje java

pues casi me infectan con Unrecom RAT ese stub esta en su source, que se usa para crear el server en runtime se cifran esas clases que contiene con RSA y AES, el caso de arriba el cifrado DES lo usa una version anterior a este Unrecom segun el source se parece bastante.

Esta ofuscado el cliente con allatori demo 4.7 pero el stub es otra cosa se cifra desde el propio cliente aparte

(http://i68.tinypic.com/qyifib.jpg)


Título: Re: Analisis de stub
Publicado por: fary en 16 Enero 2018, 16:23 pm
Pero... si mal no recuero JAVA no compila sus archivos  :xD quizás baste con renombrar el Stub.dll a la extensión que tenga java y abrirlo con el editor de JAVA....


Título: Re: Analisis de stub
Publicado por: rub'n en 16 Enero 2018, 16:31 pm
Pero... si mal no recuero JAVA no compila sus archivos  :xD quizás baste con renombrar el Stub.dll a la extensión que tenga java y abrirlo con el editor de JAVA....

Aun nada ni con extensión .java ni .class  wtf

el .class al querer decompilar
  
   javap -c stub.class arroja error
  
y el .java igual, bueno ese stub.dll salen codificados de manera extraña, pero viendo bien en una de esas palabras al final del archivo salen nombres de algunas clases, clases que como mencione arriba, son usadas para generar el server, y que analizando el server o sea, descomprimiendo el .jar, aparacen dichas clases cifradas


Título: Re: Analisis de stub
Publicado por: fary en 16 Enero 2018, 16:45 pm
Entonces sigue depurando a partir de la línea donde se carga:
Código
  1. inal JarInputStream input = new JarInputStream(App.class.getClassLoader().getResourceAsStream("stub.dll"));

Y mira que hace con el archivo, quizás te de mas información acerca de su extensión o de  como esta cifrado.

saludos.


Título: Re: Analisis de stub
Publicado por: rub'n en 3 Febrero 2019, 21:24 pm
Entonces sigue depurando a partir de la línea donde se carga:
Código
  1. final JarInputStream input = new JarInputStream(App.class.getClassLoader().getResourceAsStream("stub.dll"));

Y mira que hace con el archivo, quizás te de mas información acerca de su extensión o de  como esta cifrado.

saludos.

Hola Fary que estés bien dog, sabes que en unos de esos días logre solucionar, pues resulta que el stub.dll en realidad es un .jar(pero no funciona con solo renombrarlo a .jar y ya), algún método se uso para comprimir los bytecode dentro de una .dll,  lo desconozco pero si se que hay la forma, el codigo para extraer el stub.dll es el siguiente, lo que hace es leerlo completamente y guardarlo en un .jar

Código
  1. public class CrearJar implements ShowData {
  2.  
  3.    private static final Path STUB_PATH =  Paths.get("src/main/resources/stub.dll");
  4.    private static final Path DESTINO_STUB = Paths.get("src/main/resources/clasesStub.jar");
  5.  
  6.    public CrearJar() {
  7.        init();
  8.    }
  9.  
  10.    /**
  11.      * lee el path donde esta el stub.dll y volca el contenido en un .jar
  12.      */
  13.    private void init() {
  14.  
  15.        try(final JarInputStream jarInputStream = new JarInputStream(Files.newInputStream(STUB_PATH ));
  16.            final BufferedOutputStream bos = new BufferedOutputStream(Files.newOutputStream(DESTINO_STUB ));
  17.            final JarOutputStream jarOutputStream = new JarOutputStream(bos, jarInputStream.getManifest())) {
  18.  
  19.            JarEntry jarEntry;
  20.  
  21.            while((jarEntry = jarInputStream.getNextJarEntry()) != null) {
  22.                if(predicate(jarEntry)) {
  23.                    getLogger().info(jarEntry.getName());
  24.                    jarOutputStream.putNextEntry(jarEntry);
  25.                    jarOutputStream.write(readAllBytes(jarInputStream));
  26.                    jarOutputStream.flush();
  27.                }
  28.            }
  29.        }catch (IOException ex) {
  30.            getLogger().severe(ex.getMessage(),ex);
  31.        }
  32.    }
  33.  
  34.    /**
  35.      * Validar el jarEntry
  36.      * @param jarEntry que se le hara el test
  37.      * @return boolean true si son solo clases, y que no sean directorios, ni tengan $
  38.      */
  39.    private boolean predicate(final JarEntry jarEntry) {
  40.        final Predicate<JarEntry> predicate = p -> !jarEntry.isDirectory()
  41.                                                   && jarEntry.getName().endsWith(".class")
  42.                                                   && !jarEntry.getName().contains("$"),
  43.                                                   || jarEntry.getName().contains("_");
  44.        return predicate.test(jarEntry);
  45.    }
  46.    /**
  47.      *
  48.      * @return all bytes from stub
  49.      */
  50.    private byte[] readAllBytes(final InputStream input) {
  51.        try(ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
  52.            final byte[] bytesread = new byte[1024];
  53.            int dataRead;
  54.            while((dataRead = input.read(bytesread)) != -1) {
  55.                baos.write(bytesread,0,dataRead);
  56.            }
  57.            return baos.toByteArray();
  58.        }catch (IOException ex) {
  59.            getLogger().severe(null,ex);
  60.        }
  61.        return new byte[0];
  62.    }
  63.  
  64.  


Salida linea 23 del método init()

Código
  1. 19:08:06.783 [main] INFO CrearJar - Desinstala.class
  2. 19:08:06.783 [main] INFO CrearJar - Principal.class
  3. 19:08:06.783 [main] INFO CrearJar - extra/ClassLoaderMod.class
  4. 19:08:06.783 [main] INFO CrearJar - extra/Constante.class
  5. 19:08:06.783 [main] INFO CrearJar - extra/Constantes.class
  6. 19:08:06.783 [main] INFO CrearJar - extra/RegistryUtils.class
  7. 19:08:06.799 [main] INFO CrearJar - opciones/Archivo.class
  8. 19:08:06.799 [main] INFO CrearJar - opciones/DesUAC.class
  9. 19:08:06.799 [main] INFO CrearJar - opciones/EnviarFile.class
  10. 19:08:06.799 [main] INFO CrearJar - opciones/Informacion.class
  11. 19:08:06.799 [main] INFO CrearJar - opciones/Instalador.class
  12. 19:08:06.799 [main] INFO CrearJar - opciones/Interface_.class
  13. 19:08:06.799 [main] INFO CrearJar - opciones/Kille.class
  14. 19:08:06.799 [main] INFO CrearJar - opciones/Opcion1.class
  15. 19:08:06.799 [main] INFO CrearJar - opciones/Opcion10.class
  16. 19:08:06.799 [main] INFO CrearJar - opciones/Opcion12.class
  17. 19:08:06.799 [main] INFO CrearJar - opciones/Opcion13.class
  18. 19:08:06.799 [main] INFO CrearJar - opciones/Opcion14.class
  19. 19:08:06.799 [main] INFO CrearJar - opciones/Opcion2.class
  20. 19:08:06.799 [main] INFO CrearJar - opciones/Opcion5.class
  21. 19:08:06.799 [main] INFO CrearJar - opciones/Opcion6.class
  22. 19:08:06.799 [main] INFO CrearJar - opciones/Opcion7.class
  23. 19:08:06.799 [main] INFO CrearJar - opciones/Opcion7b.class
  24. 19:08:06.799 [main] INFO CrearJar - opciones/Opcion8.class
  25. 19:08:06.799 [main] INFO CrearJar - opciones/Opcion9.class
  26. 19:08:06.799 [main] INFO CrearJar - opciones/Opcion9b.class
  27. 19:08:06.799 [main] INFO CrearJar - opciones/OrdenCaptura.class
  28. 19:08:06.799 [main] INFO CrearJar - opciones/PassAll.class
  29. 19:08:06.799 [main] INFO CrearJar - opciones/Pina.class
  30. 19:08:06.799 [main] INFO CrearJar - opciones/WebBot.class
  31. 19:08:06.799 [main] INFO CrearJar - opciones/a.class
  32. 19:08:06.799 [main] INFO CrearJar - opciones/interfaceInfo.class
  33. 19:08:06.799 [main] INFO CrearJar - opciones/passFilezilla.class
  34. 19:08:06.799 [main] INFO CrearJar - opciones/passIDM.class
  35. 19:08:06.799 [main] INFO CrearJar - opciones/passNoip.class


Aquí esta la main class, el servidor lee el password contenido en un .xml, para descifrar los bytecodes en runtime y cargarlos en memoria por medio del custom classloader, se ven otras versiones de arabes donde esa contraseña esta alojada en un json

(http://2.bp.blogspot.com/-SvuOMg-oBpQ/XFdPi3vNEfI/AAAAAAAADgM/uqCYW_BtvJop5kDlcs5VdmVnpeCptO_mwCK4BGAYYCw/s980/ClasePrincipal.png)

Clase que descifra contenida solo en el servidor, la linea 19, en el método init() se le setea un dos es decir Cipher.DECRYPT_MODE

Código
  1. package extra;
  2. import java.io.ByteArrayOutputStream;
  3. import javax.crypto.Cipher;
  4. import javax.crypto.SecretKey;
  5. import javax.crypto.SecretKeyFactory;
  6. import javax.crypto.spec.DESKeySpec;
  7.  
  8. public class Constante {
  9.    public Constante() {
  10.    }
  11.  
  12.    public static byte[] Constantino(String contrasena, byte[] input) {
  13.        try {
  14.            ByteArrayOutputStream out = new ByteArrayOutputStream();
  15.            SecretKeyFactory skf = SecretKeyFactory.getInstance(new String(new char[]{'D', 'E', 'S'}));
  16.            DESKeySpec kspec = new DESKeySpec(contrasena.getBytes());
  17.            SecretKey ks = skf.generateSecret(kspec);
  18.            Cipher c = Cipher.getInstance(new String(new char[]{'D', 'E', 'S'}));
  19.            c.init(2, ks);
  20.            byte[] tmp = c.update(input, 0, input.length);
  21.            out.write(tmp);
  22.            tmp = c.doFinal();
  23.            out.write(tmp);
  24.            out.close();
  25.            return out.toByteArray();
  26.        } catch (Exception var8) {
  27.            return null;
  28.        }
  29.    }
  30. }

Update Try/catch con BufferedOutputStream


Título: Re: Analisis de stub
Publicado por: fary en 3 Febrero 2019, 22:30 pm
Enhorabuena rub'n!!! Me alegro de que pudieses resolverlo  :)

saludos!!


Título: Re: Analisis de stub.dll con Java
Publicado por: colcrt en 8 Febrero 2019, 01:14 am

rub'n muy interesante, una pregunta como hace para detectar ese tipo de malware??


Título: Re: Analisis de stub.dll con Java
Publicado por: rub'n en 8 Febrero 2019, 23:21 pm
rub'n muy interesante, una pregunta como hace para detectar ese tipo de malware??

Pues obviamente por el código, siempre y cuando no este ofuscado, cifrado etc, incluso ofuscado algunas veces puedes llegar a interpretar, pero no es lo ideal,

A parte debes conocer el lenguaje de dicho malware, te ayudara mas rápido a su entendimiento.
 


Título: Re: Analisis de stub.dll con Java
Publicado por: colcrt en 12 Febrero 2019, 00:08 am
pero como lo detecta en tiempo de ejecución? o como hace para darse cuenta que es un malware?


Título: Re: Analisis de stub.dll con Java
Publicado por: MCKSys Argentina en 12 Febrero 2019, 00:31 am
pero como lo detecta en tiempo de ejecución? o como hace para darse cuenta que es un malware?

Revisa ésto (https://www.google.com/search?q=heuristic+malware+detection).

Saludos!


Título: Re: Analisis de stub.dll con Java
Publicado por: rub'n en 15 Febrero 2019, 22:54 pm
Lee la info que da el jefe sobre, heuristica

pero como lo detecta en tiempo de ejecución? o como hace para darse cuenta que es un malware?

dog, es un tipo de malware, malware es el concepto digamos abstracto, y el tipo es troyano, en este caso toco hacer un análisis estático(para no infectarnos), es decir sin ejecutar ese .dll o .jar en tal caso.

Teniendo conocimiento puedes, por ejemplo descifrar esos .class contenidos en ese stub.dll con python y cualquier otro lenguaje siempre que sepas lo que haces.

El tema aquí es ese stub.dll, el contiene los códigos fuentes aka (.class/bytecode) que se descomprimirán en memoria, método que en su tiempo permitía bypasear los Av o sea, era FUD(Fully undetectable).

Versiones de este troyano, son anti virtual machine, anti vmware, y mas , aquí muestro algunos .exe que este malware bloquea, que en realidad el codigo que ejecuta dichas acciones esta cifrado y es lo que el servidor descomprime aka (bytecode) para ejecutar dependiendo su configuración.


(http://1.bp.blogspot.com/-GCW5SG38HA4/XGc3XCnrOLI/AAAAAAAADiA/BibMhzZ3hpIzJXXilH8XxK4IjAazOM-kgCK4BGAYYCw/s1600/adwin1.png)


Al tu ver, que ese software hace modificaciones en el registro de Guindow$, realiza conexión vía SSL/TLS, bloquea antiviruz, y mas aun como por ejemplo

(http://3.bp.blogspot.com/-ry5Pzut_rx8/XGc3W1L6-KI/AAAAAAAADh8/OfiW0fWIVtQFSDbAkmH_SYXDOE-xNwPHQCK4BGAYYCw/s1600/adwin2.png)

con eso recontra basta para no dudar de que sea un malware