Bagaimana Trojan Android Gustuff menyaring krim (fiat dan crypto) dari akun Anda

Bagaimana Trojan Android Gustuff menyaring krim (fiat dan crypto) dari akun Anda

Beberapa hari yang lalu Grup-IB diberitahukan tentang aktivitas ponsel Android Trojan Gustuff. Ini beroperasi secara eksklusif di pasar internasional, menyerang klien dari 100 bank asing terbesar, pengguna 32 dompet kripto seluler, serta sumber daya e-commerce yang besar. Namun pengembang Gustuff adalah penjahat dunia maya berbahasa Rusia dengan nama panggilan Bestoffer. Baru-baru ini, dia memuji Trojan-nya sebagai "produk serius untuk orang-orang yang berpengetahuan dan berpengalaman."

Analis Kode Berbahaya Grup-IB Ivan Pisarev dalam penelitiannya ia berbicara secara detail tentang cara kerja Gustuff dan apa bahayanya.

Untuk siapa Gustuff berburu?

Gustuff termasuk dalam malware generasi baru dengan fitur yang sepenuhnya otomatis. Menurut pengembangnya, Trojan tersebut telah menjadi versi perbaikan baru dari malware AndyBot yang telah menyerang ponsel Android sejak November 2017 dan mencuri uang melalui formulir web phishing yang menyamar sebagai aplikasi seluler bank internasional dan sistem pembayaran terkenal. Bestoffer melaporkan bahwa Gustuff Bot dihargai $800 per bulan.

Analisis sampel Gustuff menunjukkan bahwa Trojan berpotensi menargetkan pelanggan yang menggunakan aplikasi seluler dari bank terbesar, seperti Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, serta Bitcoin Wallet. , dompet kripto BitPay., Cryptopay, Coinbase, dll.

Awalnya dibuat sebagai Trojan perbankan klasik, versi Gustuff saat ini telah memperluas daftar target potensial serangan secara signifikan. Selain aplikasi Android untuk bank, perusahaan fintech, dan layanan kripto, Gustuff menargetkan pengguna aplikasi pasar, toko online, sistem pembayaran, dan pesan instan. Khususnya PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut dan lain-lain.

Titik masuk: penghitungan infeksi massal

Gustuff dicirikan oleh vektor penetrasi “klasik” ke ponsel pintar Android melalui surat SMS dengan tautan ke APK. Ketika perangkat Android terinfeksi trojan atas perintah server, Gustuff dapat didistribusikan lebih lanjut melalui database kontak ponsel yang terinfeksi atau melalui database server. Fungsionalitas Gustuff dirancang untuk infeksi massal dan kapitalisasi maksimum bisnis operatornya - ia memiliki fungsi “isi otomatis” yang unik dalam aplikasi perbankan seluler dan dompet kripto yang sah, yang memungkinkan Anda mempercepat dan meningkatkan skala pencurian uang .

Sebuah studi terhadap Trojan menunjukkan bahwa fungsi pengisian otomatis diimplementasikan di dalamnya menggunakan Layanan Aksesibilitas, sebuah layanan untuk penyandang disabilitas. Gustuff bukanlah Trojan pertama yang berhasil melewati perlindungan terhadap interaksi dengan elemen jendela aplikasi lain yang menggunakan layanan Android ini. Namun penggunaan Layanan Aksesibilitas yang dikombinasikan dengan pengisian otomatis masih cukup jarang.

Setelah mengunduh ke ponsel korban, Gustuff, menggunakan Layanan Aksesibilitas, mendapat kesempatan untuk berinteraksi dengan elemen jendela aplikasi lain (perbankan, cryptocurrency, serta aplikasi untuk belanja online, perpesanan, dll.), melakukan tindakan yang diperlukan untuk penyerang . Misalnya, atas perintah server, Trojan dapat mengklik tombol dan mengubah nilai kolom teks dalam aplikasi perbankan. Penggunaan mekanisme Layanan Aksesibilitas memungkinkan Trojan untuk melewati mekanisme perlindungan yang digunakan oleh bank untuk melawan Trojan seluler generasi sebelumnya, serta perubahan kebijakan keamanan yang diterapkan oleh Google di versi baru OS Android. Jadi, Gustuff "tahu cara" menonaktifkan perlindungan Google Protect: menurut penulis, fungsi ini berfungsi di 70% kasus.

Bagaimana Trojan Android Gustuff menyaring krim (fiat dan crypto) dari akun Anda

Gustuff juga dapat menampilkan notifikasi PUSH palsu dengan ikon aplikasi seluler yang sah. Pengguna mengklik notifikasi PUSH dan melihat jendela phishing diunduh dari server, di mana ia memasukkan data yang diminta dari kartu bank atau dompet kripto. Dalam skenario lain, Gustuff membuka aplikasi yang menampilkan notifikasi PUSH. Dalam hal ini, malware, atas perintah server melalui Layanan Aksesibilitas, dapat mengisi kolom formulir aplikasi perbankan untuk transaksi penipuan.

Fungsi Gustuff juga mencakup pengiriman informasi tentang perangkat yang terinfeksi ke server, kemampuan membaca/mengirim pesan SMS, mengirim permintaan USSD, meluncurkan SOCKS5 Proxy, mengikuti tautan, mengirim file (termasuk pindaian foto dokumen, tangkapan layar, foto) ke server, setel ulang perangkat ke pengaturan pabrik.

Analisis malware

Sebelum menginstal aplikasi berbahaya, OS Android menampilkan kepada pengguna sebuah jendela yang berisi daftar hak yang diminta oleh Gustuff:

Bagaimana Trojan Android Gustuff menyaring krim (fiat dan crypto) dari akun Anda
Instalasi aplikasi akan dilakukan hanya setelah mendapat persetujuan dari pengguna. Setelah meluncurkan aplikasi, Trojan akan menampilkan jendela kepada pengguna:

Bagaimana Trojan Android Gustuff menyaring krim (fiat dan crypto) dari akun Anda
Kemudian ia akan menghapus ikonnya.

Gustuff dikemas, menurut penulis, oleh pengemas FTT. Setelah diluncurkan, aplikasi secara berkala mengakses server CnC untuk menerima perintah. Di beberapa file yang kami periksa, alamat IP digunakan sebagai server kontrol 88.99.171[.]105 (selanjutnya disebut <%K&K%>).

Setelah memulai program mulai mengirim pesan ke server http://<%CnC%>/api/v1/get.php.

Format JSON berikut diharapkan sebagai respons:

{
    "results" : "OK",
    "command":{
        "id": "<%id%>",
        "command":"<%command%>",
        "timestamp":"<%Server Timestamp%>",
        "params":{
		<%Command parameters as JSON%>
        },
    },
}

Dengan setiap permintaan, aplikasi mengirimkan informasi tentang perangkat yang terinfeksi. Format pesan ditunjukkan di bawah ini. Perlu diperhatikan bahwa bidang penuh, tambahan, aplikasi и izin – opsional dan akan dikirim hanya jika ada permintaan perintah dari CnC.

{
    "info":
    {
        "info":
        {
            "cell":<%Sim operator name%>,
            "country":<%Country ISO%>,
            "imei":<%IMEI%>,
            "number":<%Phone number%>,
            "line1Number":<%Phone number%>,
            "advertisementId":<%ID%>
        },
        "state":
        {
            "admin":<%Has admin rights%>,
            "source":<%String%>,
            "needPermissions":<%Application needs permissions%>,
            "accesByName":<%Boolean%>,
            "accesByService":<%Boolean%>,
            "safetyNet":<%String%>,
            "defaultSmsApp":<%Default Sms Application%>,
            "isDefaultSmsApp":<%Current application is Default Sms Application%>,
            "dateTime":<%Current date time%>,
            "batteryLevel":<%Battery level%>
        },
        "socks":
        {
            "id":<%Proxy module ID%>,
            "enabled":<%Is enabled%>,
            "active":<%Is active%>
        },
        "version":
        {
            "versionName":<%Package Version Name%>,
            "versionCode":<%Package Version Code%>,
            "lastUpdateTime":<%Package Last Update Time%>,
            "tag":<%Tag, default value: "TAG"%>,
            "targetSdkVersion":<%Target Sdk Version%>,
            "buildConfigTimestamp":1541309066721
        },
    },
    "full":
    {
        "model":<%Device Model%>,
        "localeCountry":<%Country%>,
        "localeLang":<%Locale language%>,
        "accounts":<%JSON array, contains from "name" and "type" of accounts%>,
        "lockType":<%Type of lockscreen password%>
    },
    "extra":
    {
        "serial":<%Build serial number%>,
        "board":<%Build Board%>,
        "brand":<%Build Brand%>,
        "user":<%Build User%>,
        "device":<%Build Device%>,
        "display":<%Build Display%>,
        "id":<%Build ID%>,
        "manufacturer":<%Build manufacturer%>,
        "model":<%Build model%>,
        "product":<%Build product%>,
        "tags":<%Build tags%>,
        "type":<%Build type%>,
        "imei":<%imei%>,
        "imsi":<%imsi%>,
        "line1number":<%phonenumber%>,
        "iccid":<%Sim serial number%>,
        "mcc":<%Mobile country code of operator%>,
        "mnc":<%Mobile network codeof operator%>,
        "cellid":<%GSM-data%>,
        "lac":<%GSM-data%>,
        "androidid":<%Android Id%>,
        "ssid":<%Wi-Fi SSID%>
    },
    "apps":{<%List of installed applications%>},
    "permission":<%List of granted permissions%>
} 

Penyimpanan data konfigurasi

Gustuff menyimpan informasi penting dalam file preferensi. Nama file serta nama parameter di dalamnya merupakan hasil penghitungan jumlah MD5 dari string 15413090667214.6.1<%nama%>Dimana <%nama%> adalah nilai nama asli. Interpretasi Python dari fungsi pembuatan nama:

 nameGenerator(input):
    output = md5("15413090667214.6.1" + input) 

Berikut ini akan kami nyatakan sebagai namaGenerator(masukan).
Jadi nama file pertama adalah: namaGenerator("API_SERVER_LIST"), itu berisi nilai dengan nama berikut:

Nama variabel Nilai
namaGenerator("API_SERVER_LIST") Berisi daftar alamat CnC sebagai array.
namaGenerator("API_SERVER_URL") Berisi alamat CnC.
namaGenerator("SMS_UPLOAD") Bendera disetel secara default. Jika bendera disetel, ia akan mengirimkan pesan SMS ke CnC.
nameGenerator("SMS_ROOT_NUMBER") Nomor telepon tujuan pengiriman pesan SMS yang diterima oleh perangkat yang terinfeksi. Standarnya adalah nol.
nameGenerator("SMS_ROOT_NUMBER_RESEND") Bendera ini dihapus secara default. Jika diatur, ketika perangkat yang terinfeksi menerima SMS, maka akan dikirim ke nomor root.
nameGenerator("DEFAULT_APP_SMS") Bendera ini dihapus secara default. Jika tanda ini disetel, aplikasi akan memproses pesan SMS yang masuk.
namaGenerator("DEFAULT_ADMIN") Bendera ini dihapus secara default. Jika bendera disetel, aplikasi mempunyai hak administrator.
nameGenerator("DEFAULT_ACCESSIBILITY") Bendera ini dihapus secara default. Jika tanda disetel, layanan yang menggunakan Layanan Aksesibilitas sedang berjalan.
nameGenerator("APPS_CONFIG") Objek JSON, berisi daftar tindakan yang harus dilakukan ketika peristiwa Aksesibilitas diaktifkan terkait dengan aplikasi tertentu.
nameGenerator("APPS_INSTALLED") Menyimpan daftar aplikasi yang diinstal pada perangkat.
namaGenerator("IS_FIST_RUN") Bendera dibersihkan pada start pertama.
nameGenerator("UNIQUE_ID") Berisi pengidentifikasi unik. Dihasilkan saat bot pertama kali diluncurkan.

Modul pemrosesan perintah server

Aplikasi menyimpan alamat server CnC sebagai array kode Base85 garis. Daftar server CnC dapat diubah setelah menerima perintah yang sesuai, dalam hal ini alamatnya akan disimpan dalam file preferensi.

Menanggapi permintaan tersebut, server mengirimkan perintah ke aplikasi. Perlu dicatat bahwa perintah dan parameter disajikan dalam format JSON. Aplikasi dapat memproses perintah berikut:

Tim Описание
majuMulai Mulai mengirim pesan SMS yang diterima oleh perangkat yang terinfeksi ke server CnC.
majuBerhenti Hentikan pengiriman pesan SMS yang diterima oleh perangkat yang terinfeksi ke server CnC.
ussdRun Buat permintaan USSD. Nomor yang Anda perlukan untuk membuat permintaan USSD ada di kolom JSON "angka".
Kirim SMS Kirim satu pesan SMS (jika perlu, pesan tersebut “dibagi” menjadi beberapa bagian). Sebagai parameter, perintah mengambil objek JSON yang berisi bidang "ke" - nomor tujuan dan "isi" - isi pesan.
kirimSmsAb Kirim pesan SMS (jika perlu, pesan tersebut "dibagi" menjadi beberapa bagian) ke semua orang dari daftar kontak perangkat yang terinfeksi. Interval antara pengiriman pesan adalah 10 detik. Isi pesan ada di kolom JSON "body"
kirimSmsMass Kirim pesan SMS (jika perlu, pesan tersebut “dibagi” menjadi beberapa bagian) ke kontak yang ditentukan dalam parameter perintah. Interval antara pengiriman pesan adalah 10 detik. Sebagai parameter, perintah mengambil array JSON (bidang "sms"), yang elemennya berisi bidang "ke" - nomor tujuan dan "isi" - isi pesan.
ubahServer Perintah ini dapat mengambil nilai dengan kunci “url” sebagai parameter - kemudian bot akan mengubah nilai nameGenerator(“SERVER_URL”), atau “array” - kemudian bot akan menulis array menjadi nameGenerator (“API_SERVER_LIST”) Dengan demikian, aplikasi mengubah alamat server CnC.
nomor admin Perintah ini dirancang untuk bekerja dengan nomor root. Perintah menerima objek JSON dengan parameter berikut: "number" - ubah nameGenerator("ROOT_NUMBER") ke nilai yang diterima, "kirim ulang" - ubah nameGenerator("SMS_ROOT_NUMBER_RESEND"), "sendId" - kirim ID unik ke nameGenerator("ROOT_NUMBER ").
informasi terbaru Kirim informasi tentang perangkat yang terinfeksi ke server.
wipeData Perintah tersebut dimaksudkan untuk menghapus data pengguna. Bergantung pada nama aplikasi yang diluncurkan, terjadi penghapusan data sepenuhnya dengan reboot perangkat (pengguna utama) atau penghapusan hanya data pengguna (pengguna sekunder).
kaus kakiMulai Luncurkan modul proksi. Pengoperasian modul dijelaskan di bagian terpisah.
kaus kakiBerhenti Hentikan modul proxy.
Buka tautan Ikuti tautannya. Tautannya ada dalam parameter JSON dengan kunci "url". "android.intent.action.VIEW" digunakan untuk membuka tautan.
unggahSemuaSms Kirim semua pesan SMS yang diterima perangkat ke server.
unggahSemua Foto Kirim gambar dari perangkat yang terinfeksi ke URL. URL hadir sebagai parameter.
unggah data Kirim file dari perangkat yang terinfeksi ke URL. URL hadir sebagai parameter.
unggahNomor Telepon Kirim nomor telepon dari daftar kontak ke server. Jika objek JSON dengan kunci "ab" muncul sebagai parameter, aplikasi menerima daftar kontak dari buku telepon. Jika objek JSON dengan kunci "sms" diterima sebagai parameter, aplikasi membaca daftar kontak dari pengirim pesan SMS.
ubah Arsip Aplikasi mengunduh file dari alamat yang disertakan sebagai parameter menggunakan kunci "url". File yang diunduh disimpan dengan nama "archive.zip". Aplikasi kemudian akan mengekstrak file, opsional menggunakan kata sandi arsip "b5jXh37gxgHBrZhQ4j3D". File yang telah dibuka zipnya disimpan ke direktori [penyimpanan eksternal]/hgps. Di direktori ini, aplikasi menyimpan web palsu (dijelaskan di bawah).
tindakan Perintah ini dirancang untuk bekerja dengan Action Service, yang dijelaskan di bagian terpisah.
uji Tidak melakukan apapun.
Download Perintah ini dirancang untuk mengunduh file dari server jauh dan menyimpannya ke direktori Unduhan. URL dan nama file datang sebagai parameter, bidang dalam objek JSON adalah parameternya masing-masing: "url" dan "nama file".
menghapus Menghapus file dari direktori Unduhan. Nama file hadir dalam parameter JSON dengan kunci "fileName". Nama file defaultnya adalah "tmp.apk".
pemberitahuan Tampilkan pemberitahuan dengan deskripsi dan teks judul yang ditentukan oleh server manajemen.

Format perintah pemberitahuan:

{
    "results" : "OK",
    "command":{
    "id": <%id%>,
    "command":"notification",
    "timestamp":<%Server Timestamp%>,
    "params":{
        "openApp":<%Open original app or not%>,
        "array":[
                      {"title":<%Title text%>,
                      "desc":<%Description text%>,
                      "app":<%Application name%>}
                   ]
                   },
        },
}

Notifikasi yang dihasilkan oleh file yang sedang diselidiki terlihat identik dengan notifikasi yang dihasilkan oleh aplikasi yang ditentukan di kolom aplikasi. Jika nilai bidang buka Aplikasi — Benar, saat notifikasi dibuka, aplikasi yang ditentukan di kolom diluncurkan aplikasi. Jika nilai bidang buka Aplikasi - Salah, maka:

  • jendela phishing terbuka, yang isinya diambil dari direktori <%penyimpanan eksternal%>/hgps/<%namafile%>
  • jendela phishing terbuka, yang isinya diunduh dari server <%url%>?id=<%Bot id%>&app=<%Nama aplikasi%>
  • jendela phishing yang menyamar sebagai Google Play Card terbuka, dengan opsi untuk memasukkan detail kartu.

Aplikasi mengirimkan hasil eksekusi perintah apa pun ke <%CnC%>set_state.php sebagai objek JSON dalam format berikut:

{
    "command":
    {
        "command":<%command%>,
        "id":<%command_id%>,
        "state":<%command_state%>
    }
    "id":<%bot_id%>
}

Layanan Tindakan
Daftar perintah yang disertakan dalam proses aplikasi tindakan. Ketika sebuah perintah diterima, modul pemrosesan perintah memanggil layanan ini untuk menjalankan perintah yang diperluas. Layanan ini mengambil objek JSON sebagai parameter. Layanan ini dapat menjalankan perintah berikut:

1. PARAMS_ACTION - ketika menerima perintah seperti itu, layanan pertama-tama menerima nilai dari parameter JSON dengan tombol Type, bisa sebagai berikut:

  • info layanan – subperintah mendapatkan nilai dari parameter JSON berdasarkan kunci termasukTidak Penting. Jika tandanya Benar, aplikasi akan menyetel tandanya FLAG_ISOLATED_PROCESS ke layanan yang menggunakan Layanan Aksesibilitas. Dengan demikian, layanan akan diluncurkan dalam proses terpisah.
  • akar - menerima dan mengirim ke server informasi tentang jendela yang sedang fokus. Aplikasi memperoleh informasi menggunakan kelas AccessibilityNodeInfo.
  • admin - meminta hak administrator.
  • menunda - menangguhkan ActionsService selama jumlah milidetik yang ditentukan dalam parameter dengan kunci "data".
  • Windows — mengirim daftar jendela yang terlihat oleh pengguna.
  • install — instal aplikasi pada perangkat yang terinfeksi. Nama paket - arsip ada di kunci "nama file". Arsipnya sendiri terletak di direktori Downloads.
  • global – subperintah dimaksudkan untuk beralih dari jendela saat ini:
    • pada menu Pengaturan Cepat
    • terbelakang
    • rumah
    • ke notifikasi
    • ke jendela aplikasi yang baru dibuka

  • jalankan - luncurkan aplikasi. Nama aplikasi hadir sebagai parameter kunci data.
  • suara — mengubah mode suara menjadi senyap.
  • membuka kunci - menyalakan lampu latar layar dan keyboard hingga kecerahan penuh. Aplikasi melakukan tindakan ini menggunakan WakeLock, menentukan string [Label aplikasi]:INFO sebagai tag
  • izinHamparan — fungsi tidak diterapkan (respons terhadap eksekusi perintah — {"message":"Tidak mendukung"} atau {"message":"low SDK"})
  • sikap — fungsi tidak diterapkan (respons terhadap eksekusi perintah — {"message":"Tidak mendukung"}atau {"message":"API Rendah"})
  • Izin - Perintah ini diperlukan untuk meminta izin aplikasi. Namun, fungsi permintaan tidak diterapkan, sehingga perintah tersebut tidak ada artinya. Daftar izin yang diminta hadir dalam bentuk array JSON dengan kunci "izin". Daftar standar:
    • android.izin.READ_PHONE_STATE
    • android.izin.READ_CONTACTS
    • android.izin.CALL_PHONE
    • android.izin.RECEIVE_SMS
    • android.izin.SEND_SMS
    • android.izin.READ_SMS
    • android.permission.READ_EXTERNAL_STORAGE
    • android.permission.WRITE_EXTERNAL_STORAGE

  • Buka — menampilkan jendela phishing. Tergantung pada parameter yang berasal dari server, aplikasi dapat menampilkan jendela phishing berikut:
    • Menampilkan jendela phishing yang isinya ditulis dalam file di direktori <%direktori eksternal%>/hgps/<%param_filename%>. Hasil interaksi pengguna dengan jendela akan dikirim ke alamat <%CnC%>/records.php
    • Menampilkan jendela phishing yang kontennya dimuat dari suatu alamat <%url_param%>?id=<%bot_id%>&app=<%namapaket%>. Hasil interaksi pengguna dengan jendela akan dikirim ke alamat <%CnC%>/records.php
    • Menampilkan jendela phishing yang menyamar sebagai Google Play Card.

  • interaktif — perintah ini dirancang untuk berinteraksi dengan elemen jendela aplikasi lain menggunakan AcessibilityService. Layanan khusus diimplementasikan dalam program interaksi. Aplikasi yang diselidiki dapat berinteraksi dengan windows:
    • Aktif saat ini. Dalam hal ini, parameter berisi id atau teks (nama) objek yang ingin Anda interaksi.
    • Terlihat oleh pengguna pada saat perintah dijalankan. Aplikasi memilih windows berdasarkan id.

    Setelah menerima benda tersebut AksesibilitasNodeInfo untuk elemen jendela yang diinginkan, aplikasi, bergantung pada parameternya, dapat melakukan tindakan berikut:

    • fokus - mengatur fokus ke suatu objek.
    • klik - klik pada suatu objek.
    • actionId - melakukan tindakan berdasarkan ID.
    • setText - mengubah teks objek. Mengubah teks dapat dilakukan dengan dua cara: melakukan suatu tindakan ACTION_SET_TEXT (jika versi Android perangkat yang terinfeksi lebih muda atau sama dengan LOLLIPOP), atau dengan menempatkan string pada clipboard dan menempelkannya ke objek (untuk versi yang lebih lama). Perintah ini dapat digunakan untuk mengubah data pada aplikasi perbankan.

2. PARAMS_ACTIONS - sama seperti PARAMS_ACTION, hanya serangkaian perintah JSON yang diterima.

Tampaknya banyak yang akan tertarik dengan seperti apa fungsi interaksi dengan elemen jendela aplikasi lain. Beginilah cara fungsi ini diterapkan di Gustuff:

boolean interactiveAction(List aiList, JSONObject action, JsonObject res) {
    int count = action.optInt("repeat", 1);
    Iterator aiListIterator = ((Iterable)aiList).iterator();
    int count = 0;
    while(aiListIterator.hasNext()) {
        Object ani = aiListIterator.next();
        if(1 <= count) {
            int index;
            for(index = 1; true; ++index) {
                if(action.has("focus")) {
                    if(((AccessibilityNodeInfo)ani).performAction(1)) {
                        ++count;
                    }
                }
                else if(action.has("click")) {
                    if(((AccessibilityNodeInfo)ani).performAction(16)) {
                        ++count;
                    }
                }
                else if(action.has("actionId")) {
                    if(((AccessibilityNodeInfo)ani).performAction(action.optInt("actionId"))) {
                        ++count;
                    }
                }
                else if(action.has("setText")) {
                    customHeader ch = CustomAccessibilityService.a;
                    Context context = this.getApplicationContext();
                    String text = action.optString("setText");
                    if(performSetTextAction(ch, context, ((AccessibilityNodeInfo)ani), text)) {
                        ++count;
                    }
                }
                if(index == count) {
                    break;
                }
            }
        }
        ((AccessibilityNodeInfo)ani).recycle();
    }
    res.addPropertyNumber("res", Integer.valueOf(count));
}

Fungsi penggantian teks:

boolean performSetTextAction(Context context, AccessibilityNodeInfo ani, String text) {
    boolean result;
    if(Build$VERSION.SDK_INT >= 21) {
        Bundle b = new Bundle();
        b.putCharSequence("ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE", ((CharSequence)text));
        result = ani.performAction(0x200000, b);  // ACTION_SET_TEXT
    }
    else {
        Object clipboard = context.getSystemService("clipboard");
        if(clipboard != null) {
        ((ClipboardManager)clipboard).setPrimaryClip(ClipData.newPlainText("autofill_pm", ((CharSequence)text)));
        result = ani.performAction(0x8000);  // ACTION_PASTE
        }
        else {
            result = false;
        }
    }
    return result;
}

Jadi, dengan konfigurasi server kontrol yang benar, Gustuff dapat mengisi kolom teks di aplikasi perbankan dan mengklik tombol yang diperlukan untuk menyelesaikan transaksi. Trojan bahkan tidak perlu melalui otorisasi dalam aplikasi - cukup mengirimkan perintah untuk menampilkan notifikasi PUSH, diikuti dengan membuka aplikasi perbankan yang diinstal sebelumnya. Pengguna sendiri akan diberi otorisasi, setelah itu Gustuff akan dapat melakukan pengisian otomatis.

Modul pemrosesan SMS

Aplikasi ini mengatur event handler untuk menerima pesan SMS oleh perangkat yang terinfeksi. Aplikasi yang diteliti dapat menerima perintah dari operator yang masuk dalam isi pesan SMS. Perintah datang dalam format:

7!5=<%Perintah yang dikodekan Base64%>

Aplikasi mencari semua pesan SMS yang masuk untuk string tersebut 7!5=, ketika sebuah string ditemukan, ia menerjemahkan string dari Base64 pada offset 4 dan menjalankan perintah. Perintahnya mirip dengan perintah dengan CnC. Hasil eksekusi dikirim ke nomor yang sama dengan nomor yang menerima perintah. Format tanggapan:

7*5=<%Pengkodean Base64 dari "perintah kode_hasil"%>

Secara opsional, aplikasi dapat mengirim semua pesan yang diterima ke nomor Root. Untuk melakukan ini, nomor Root harus ditentukan dalam file preferensi dan tanda pengalihan pesan harus disetel. Pesan SMS dikirim ke nomor penyerang dalam format berikut:

<%Dari nomor%> - <%Waktu, format: dd/MM/yyyy HH:mm:ss%> <%SMS body%>

Selain itu, secara opsional, aplikasi dapat mengirim pesan ke CnC. Pesan SMS dikirim ke server dalam format JSON:

{
    "id":<%BotID%>,
    "sms":
    {
        "text":<%SMS body%>,
        "number":<%From number%>,
        "date":<%Timestamp%>
    }
}

Jika bendera sudah disetel nameGenerator("DEFAULT_APP_SMS") – aplikasi berhenti memproses pesan SMS dan menghapus daftar pesan masuk.

Modul proksi

Pada aplikasi yang diteliti terdapat modul Backconnect Proxy (selanjutnya disebut modul Proxy), yang memiliki kelas tersendiri yang memuat field statis dengan konfigurasi. Data konfigurasi disimpan dalam sampel dalam teks yang jelas:

Bagaimana Trojan Android Gustuff menyaring krim (fiat dan crypto) dari akun Anda

Semua tindakan yang dilakukan oleh modul Proxy dicatat ke file. Untuk melakukan hal ini, aplikasi membuat direktori bernama "logs" di Penyimpanan Eksternal (bidang ProxyConfigClass.logsDir di kelas konfigurasi), tempat file log disimpan. Pencatatan dilakukan pada file dengan nama:

  1. utama.txt – file ini digunakan untuk mencatat pekerjaan kelas bernama CommandServer. Berikut ini, pencatatan string str ke file ini akan dilambangkan sebagai mainLog(str).
  2. sesi-<%id%>.txt — data log yang terkait dengan sesi proxy tertentu disimpan ke file ini. Berikut ini, pencatatan string str ke file ini akan dilambangkan sebagai sessionLog (str).
  3. server.txt – file ini adalah tempat semua data yang ditulis ke file di atas dicatat.

Format data log:

<%Tanggal%> [Utas[<%id utas%>], id[]]: string-log

Pengecualian yang terjadi selama pengoperasian modul Proxy juga dicatat dalam file. Untuk melakukan ini, aplikasi menghasilkan objek JSON dengan format:

{
    "uncaughtException":<%short description of throwable%>
    "thread":<%thread%>
    "message":<%detail message of throwable%>
    "trace":        //Stack trace info
        [
            {
                "ClassName":
                "FileName":
                "LineNumber":
                "MethodName":
            },
            {
                "ClassName":
                "FileName":
                "LineNumber":
                "MethodName":
            }
        ]
}

Kemudian mengubahnya menjadi representasi string dan mencatat.

Modul proxy diluncurkan setelah perintah terkait tiba. Ketika perintah diterima untuk memulai modul proxy, aplikasi memulai layanan dengan nama tersebut Layanan Utama, yang bertanggung jawab untuk mengelola pengoperasian modul Proxy - memulai dan menghentikannya.

Langkah-langkah peluncuran layanan:

1. Memulai pengatur waktu yang menyala satu menit sekali dan memeriksa aktivitas modul proxy. Jika modul tidak aktif, modul akan memulainya.
Juga ketika acara tersebut terjadi android.net.conn.CONNECTIVITY_CHANGE modul proxy diluncurkan.

2. Aplikasi membuat penguncian layar saat aktif dengan parameter PARTIAL_WAKE_LOCK dan menangkapnya. Dengan demikian, ini tidak memungkinkan CPU perangkat masuk ke mode tidur.

3. Menjalankan kelas pemrosesan perintah dari modul proksi, mencatat baris terlebih dahulu mainLog("server mulai") и

Server::mulai() tuan rumah[<%proxy_cnc%>], commandPort[<%command_port%>], proxyPort[<%proxy_port%>]

dimana proxy_cnc, command_port dan proxy_port – parameter yang diterima dari konfigurasi server proxy.

Kelas pemrosesan perintah diberi nama Koneksi Perintah. Segera setelah diluncurkan, ia melakukan tindakan berikut:

4. Terhubung ke ProxyConfigClass.host: ProxyConfigClass.commandPort dan mengirimkan data tentang perangkat yang terinfeksi ke sana dalam format JSON:

{
    "id":<%id%>,
    "imei":<%imei%>,
    "imsi":<%imsi%>,
    "model":<%model%>,
    "manufacturer":<%manufacturer%>,
    "androidVersion":<%androidVersion%>,
    "country":<%country%>,
    "partnerId":<%partnerId%>,
    "packageName":<%packageName%>,
    "networkType":<%networkType%>,
    "hasGsmSupport":<%hasGsmSupport%>,
    "simReady":<%simReady%>,
    "simCountry":<%simCountry%>,
    "networkOperator":<%networkOperator%>,
    "simOperator":<%simOperator%>,
    "version":<%version%>
}

Dimana:

  • id - pengidentifikasi, mencoba mendapatkan nilai dari file Preferensi Bersama dengan nama "x" dengan bidang "id". Jika nilai ini tidak dapat diperoleh, maka akan dihasilkan nilai baru. Dengan demikian, modul proxy memiliki pengidentifikasinya sendiri, yang dihasilkan mirip dengan ID Bot.
  • imei - IMEI perangkat. Jika terjadi kesalahan saat mengambil nilai, pesan teks kesalahan akan ditulis sebagai ganti kolom ini.
  • imsi - Identitas Pelanggan Seluler Internasional perangkat. Jika terjadi kesalahan saat mengambil nilai, pesan teks kesalahan akan ditulis sebagai ganti kolom ini.
  • model - Nama produk akhir yang terlihat oleh pengguna akhir.
  • pabrikan - Produsen produk/perangkat keras (Build.MANUFACTURER).
  • androidVersion adalah string dalam format "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • negara adalah lokasi perangkat saat ini.
  • partnerId adalah string kosong.
  • nama paket - nama paket.
  • networkType - jenis koneksi jaringan saat ini (contoh: "WIFI", "MOBILE"). Mengembalikan nol jika terjadi kesalahan.
  • hasGsmSupport - benar - jika ponsel mendukung GSM, jika tidak, salah.
  • simReady - status kartu SIM.
  • simCountry - Kode ISO negara (berdasarkan penyedia kartu SIM).
  • networkOperator - nama operator. Jika terjadi kesalahan saat mengambil nilai, pesan teks kesalahan akan ditulis sebagai ganti kolom ini.
  • simOperator - Nama Penyedia Layanan (SPN). Jika terjadi kesalahan saat mengambil nilai, pesan teks kesalahan akan ditulis sebagai ganti kolom ini.
  • versi - bidang ini disimpan di kelas konfigurasi, untuk versi bot yang dipelajari sama dengan "1.6".

5. Beralih ke mode menunggu perintah dari server. Perintah dari server datang dalam format:

  • 0 perintah offset
  • 1 offset-sessionId
  • 2 panjang offset
  • 4 data offset

Ketika perintah diterima, aplikasi mencatat:
mainLog("Header { sessionId<%id%>], ketik[<%command%>], panjang[<%length%>] }")

Perintah berikut dapat dilakukan dari server:

Nama perintah Data Deskripsi Produk
koneksiId 0 ID koneksi Buat koneksi baru
TIDUR 3 Waktu Tangguhkan modul proxy
PINGPONG 4 - Kirim pesan PONG

Pesan PONG terdiri dari 4 byte dan terlihat seperti ini: 0x04000000.

Ketika perintah connectionId diterima (untuk membuat koneksi baru) Koneksi Perintah menciptakan sebuah instance dari kelas Koneksi Proxy.

  • Dua kelas mengambil bagian dalam proksi: Koneksi Proxy и akhir. Saat membuat kelas Koneksi Proxy koneksi dibuat ke alamat tersebut ProxyConfigClass.host: ProxyConfigClass.proxyPort dan meneruskan objek JSON:

 {
    "id":<%connectionId%>
}

Sebagai tanggapan, server mengirimkan pesan SOCKS5 yang berisi alamat server jarak jauh yang sambungannya harus dibuat. Interaksi dengan server ini terjadi melalui kelas akhir. Secara skematis, pengaturan koneksi dapat direpresentasikan sebagai berikut:

Bagaimana Trojan Android Gustuff menyaring krim (fiat dan crypto) dari akun Anda

Interaksi jaringan

Untuk mencegah sniffer jaringan menganalisis lalu lintas, interaksi antara server CnC dan aplikasi dapat diamankan menggunakan protokol SSL. Semua data yang dikirimkan baik dari server maupun ke server dalam format JSON. Aplikasi melakukan permintaan berikut selama operasi:

  • http://<%CnC%>/api/v1/set_state.php adalah hasil eksekusi perintah.
  • http://<%CnC%>/api/v1/get.php - menerima perintah.
  • http://<%CnC%>/api/v1/load_sms.php — mengunduh pesan SMS dari perangkat yang terinfeksi.
  • http://<%CnC%>/api/v1/load_ab.php — mengunggah daftar kontak dari perangkat yang terinfeksi.
  • http://<%CnC%>/api/v1/aevents.php – permintaan dibuat saat memperbarui parameter di file preferensi.
  • http://<%CnC%>/api/v1/set_card.php - mengunggah data yang diperoleh menggunakan jendela phishing yang menyamar sebagai Google Play Market.
  • http://<%CnC%>/api/v1/logs.php – membongkar data log.
  • http://<%CnC%>/api/v1/records.php – mengunggah data yang diperoleh menggunakan jendela phishing.
  • http://<%CnC%>/api/v1/set_error.php – pemberitahuan kesalahan.

Rekomendasi

Untuk melindungi pelanggan mereka dari ancaman Trojan seluler, perusahaan harus menggunakan solusi komprehensif yang memungkinkan, tanpa menginstal perangkat lunak tambahan pada perangkat pengguna, untuk memantau dan mencegah aktivitas berbahaya.

Untuk melakukan hal ini, metode berbasis tanda tangan untuk mendeteksi Trojan seluler perlu ditingkatkan dengan teknologi untuk menganalisis perilaku klien dan aplikasi itu sendiri. Selain itu, perlindungan harus mencakup fungsi mengidentifikasi perangkat menggunakan teknologi sidik jari digital, yang memungkinkan untuk memahami kapan suatu akun digunakan dari perangkat yang tidak biasa dan telah jatuh ke tangan penipu.

Poin penting yang mendasar adalah kemungkinan analisis lintas saluran, yang memungkinkan perusahaan untuk mengendalikan risiko yang timbul tidak hanya di sisi Internet, tetapi juga saluran seluler, misalnya, dalam aplikasi mobile banking, untuk transaksi dengan kripto. -mata uang dan lainnya di mana transaksi keuangan dapat dilakukan.

Aturan keamanan untuk pengguna:

  • jangan menginstal aplikasi untuk perangkat seluler dengan OS Android dari sumber mana pun selain Google Play, berikan perhatian khusus pada hak yang diminta oleh aplikasi tersebut;
  • menginstal pembaruan OS Android secara teratur;
  • perhatikan ekstensi file yang diunggah;
  • jangan mengunjungi sumber daya yang mencurigakan;
  • Jangan klik tautan yang diterima dalam pesan SMS.

Dibintangi Semyon Rogachev, Peneliti Kode Berbahaya Asosiasi, Lab Forensik Komputer Grup-IB.

Sumber: www.habr.com

Tambah komentar