Analisis de stub.dll con Java

Iniciado por rub'n, 16 Enero 2018, 15:30 PM

0 Miembros y 1 Visitante están viendo este tema.

rub'n

Buenas que tal? alguna sugerencia de como podria decompilar este stub.dll ? no esta ofuscado se carga desde

Código (java) [Seleccionar]
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.


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


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

fary

¿De donde sacaste este Stub? ¿Es de algún cripter? ¿En que lenguaje esta creado?
Un byte a la izquierda.

rub'n

#2
Cita de: fary en 16 Enero 2018, 15:37 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



rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

fary

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....
Un byte a la izquierda.

rub'n

#4
Cita de: 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....

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


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

fary

Entonces sigue depurando a partir de la línea donde se carga:
Código (java) [Seleccionar]
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.
Un byte a la izquierda.

rub'n

#6
Cita de: fary en 16 Enero 2018, 16:45 PM
Entonces sigue depurando a partir de la línea donde se carga:
Código (java) [Seleccionar]
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 (java) [Seleccionar]

public class CrearJar implements ShowData {

   private static final Path STUB_PATH =  Paths.get("src/main/resources/stub.dll");
   private static final Path DESTINO_STUB = Paths.get("src/main/resources/clasesStub.jar");

   public CrearJar() {
       init();
   }

   /**
    * lee el path donde esta el stub.dll y volca el contenido en un .jar
    */
   private void init() {

       try(final JarInputStream jarInputStream = new JarInputStream(Files.newInputStream(STUB_PATH ));
           final BufferedOutputStream bos = new BufferedOutputStream(Files.newOutputStream(DESTINO_STUB ));
           final JarOutputStream jarOutputStream = new JarOutputStream(bos, jarInputStream.getManifest())) {

           JarEntry jarEntry;

           while((jarEntry = jarInputStream.getNextJarEntry()) != null) {
               if(predicate(jarEntry)) {
                   getLogger().info(jarEntry.getName());
                   jarOutputStream.putNextEntry(jarEntry);
                   jarOutputStream.write(readAllBytes(jarInputStream));
                   jarOutputStream.flush();
               }
           }
       }catch (IOException ex) {
           getLogger().severe(ex.getMessage(),ex);
       }
   }

   /**
    * Validar el jarEntry
    * @param jarEntry que se le hara el test
    * @return boolean true si son solo clases, y que no sean directorios, ni tengan $
    */
   private boolean predicate(final JarEntry jarEntry) {
       final Predicate<JarEntry> predicate = p -> !jarEntry.isDirectory()
                                                  && jarEntry.getName().endsWith(".class")
                                                  && !jarEntry.getName().contains("$"),
                                                  || jarEntry.getName().contains("_");
       return predicate.test(jarEntry);
   }
   /**
    *
    * @return all bytes from stub
    */
   private byte[] readAllBytes(final InputStream input) {
       try(ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
           final byte[] bytesread = new byte[1024];
           int dataRead;
           while((dataRead = input.read(bytesread)) != -1) {
               baos.write(bytesread,0,dataRead);
           }
           return baos.toByteArray();
       }catch (IOException ex) {
           getLogger().severe(null,ex);
       }
       return new byte[0];
   }




Salida linea 23 del método init()

Código (bash) [Seleccionar]

19:08:06.783 [main] INFO CrearJar - Desinstala.class
19:08:06.783 [main] INFO CrearJar - Principal.class
19:08:06.783 [main] INFO CrearJar - extra/ClassLoaderMod.class
19:08:06.783 [main] INFO CrearJar - extra/Constante.class
19:08:06.783 [main] INFO CrearJar - extra/Constantes.class
19:08:06.783 [main] INFO CrearJar - extra/RegistryUtils.class
19:08:06.799 [main] INFO CrearJar - opciones/Archivo.class
19:08:06.799 [main] INFO CrearJar - opciones/DesUAC.class
19:08:06.799 [main] INFO CrearJar - opciones/EnviarFile.class
19:08:06.799 [main] INFO CrearJar - opciones/Informacion.class
19:08:06.799 [main] INFO CrearJar - opciones/Instalador.class
19:08:06.799 [main] INFO CrearJar - opciones/Interface_.class
19:08:06.799 [main] INFO CrearJar - opciones/Kille.class
19:08:06.799 [main] INFO CrearJar - opciones/Opcion1.class
19:08:06.799 [main] INFO CrearJar - opciones/Opcion10.class
19:08:06.799 [main] INFO CrearJar - opciones/Opcion12.class
19:08:06.799 [main] INFO CrearJar - opciones/Opcion13.class
19:08:06.799 [main] INFO CrearJar - opciones/Opcion14.class
19:08:06.799 [main] INFO CrearJar - opciones/Opcion2.class
19:08:06.799 [main] INFO CrearJar - opciones/Opcion5.class
19:08:06.799 [main] INFO CrearJar - opciones/Opcion6.class
19:08:06.799 [main] INFO CrearJar - opciones/Opcion7.class
19:08:06.799 [main] INFO CrearJar - opciones/Opcion7b.class
19:08:06.799 [main] INFO CrearJar - opciones/Opcion8.class
19:08:06.799 [main] INFO CrearJar - opciones/Opcion9.class
19:08:06.799 [main] INFO CrearJar - opciones/Opcion9b.class
19:08:06.799 [main] INFO CrearJar - opciones/OrdenCaptura.class
19:08:06.799 [main] INFO CrearJar - opciones/PassAll.class
19:08:06.799 [main] INFO CrearJar - opciones/Pina.class
19:08:06.799 [main] INFO CrearJar - opciones/WebBot.class
19:08:06.799 [main] INFO CrearJar - opciones/a.class
19:08:06.799 [main] INFO CrearJar - opciones/interfaceInfo.class
19:08:06.799 [main] INFO CrearJar - opciones/passFilezilla.class
19:08:06.799 [main] INFO CrearJar - opciones/passIDM.class
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


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 (java) [Seleccionar]
package extra;
import java.io.ByteArrayOutputStream;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

public class Constante {
   public Constante() {
   }

   public static byte[] Constantino(String contrasena, byte[] input) {
       try {
           ByteArrayOutputStream out = new ByteArrayOutputStream();
           SecretKeyFactory skf = SecretKeyFactory.getInstance(new String(new char[]{'D', 'E', 'S'}));
           DESKeySpec kspec = new DESKeySpec(contrasena.getBytes());
           SecretKey ks = skf.generateSecret(kspec);
           Cipher c = Cipher.getInstance(new String(new char[]{'D', 'E', 'S'}));
           c.init(2, ks);
           byte[] tmp = c.update(input, 0, input.length);
           out.write(tmp);
           tmp = c.doFinal();
           out.write(tmp);
           out.close();
           return out.toByteArray();
       } catch (Exception var8) {
           return null;
       }
   }
}


Update Try/catch con BufferedOutputStream


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

fary

Enhorabuena rub'n!!! Me alegro de que pudieses resolverlo  :)

saludos!!
Un byte a la izquierda.

colcrt


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

rub'n

Cita de: colcrt en  8 Febrero 2019, 01:14 AM
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.


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen