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



Beberapa hari yang lalu, Group-IB melaporkan aktivitas Trojan Android Gustuff. Ia bekerja secara eksklusif di pasar internasional, menyerang pelanggan dari 100 bank asing terbesar, pengguna 32 dompet kripto seluler, serta sumber daya e-commerce yang besar. Tetapi pengembang Gustuff adalah penjahat cyber berbahasa Rusia dengan julukan Bestoffer. Sampai baru-baru ini, ia memuji trojannya sebagai "produk serius bagi orang-orang dengan pengetahuan dan pengalaman."

Ivan Pisarev, seorang spesialis dalam menganalisis kode berbahaya Grup-IB, dalam penelitiannya menceritakan secara rinci tentang cara kerja Gustuff dan apa bahayanya.

Untuk siapa Gustuff berburu?


Gustuff adalah generasi baru malware dengan fitur yang sepenuhnya otomatis. Menurut pengembangnya, trojan telah menjadi versi baru yang diperbaiki dari malware AndyBot, yang sejak November 2017 telah menyerang ponsel Android dan mencuri uang melalui formulir web phising yang menyamar sebagai aplikasi mobile dari bank internasional terkenal dan sistem pembayaran. Bestoffer melaporkan bahwa harga sewa Gustuff Bot adalah $ 800 per bulan.

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

Awalnya diciptakan sebagai trojan perbankan klasik, versi Gustuff saat ini telah secara signifikan memperluas daftar target potensial untuk diserang. Selain aplikasi Android dari bank, perusahaan fintech, dan layanan crypto, Gustuff ditujukan untuk pengguna aplikasi pasar, toko online, sistem pembayaran, dan pesan instan. Secara khusus, PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut, dan lainnya.

Titik masuk: perhitungan untuk infeksi massa


Gustuff ditandai oleh vektor "klasik" penetrasi ke dalam smartphone Android melalui pengiriman SMS dengan tautan ke APK. Jika perangkat Android terinfeksi trojan atas perintah server, Gustuff dapat menyebar lebih jauh melalui basis data kontak telepon yang terinfeksi atau melalui basis data server. Fungsionalitas Gustuff dirancang untuk infeksi besar dan kapitalisasi maksimum dari bisnis operatornya - ini memiliki fungsi unik "pengisian otomatis" ke dalam aplikasi mobile banking yang sah dan dompet crypto, yang memungkinkan Anda untuk mempercepat dan skala pencurian uang.

Studi tentang Trojan menunjukkan bahwa fungsi pengisian otomatis diimplementasikan di dalamnya menggunakan Layanan Aksesibilitas - layanan untuk para penyandang cacat. Gustuff bukan trojan pertama yang berhasil melewati perlindungan terhadap interaksi dengan elemen jendela aplikasi lain yang menggunakan layanan Android ini. Namun, penggunaan Layanan Aksesibilitas bersamaan dengan pemuatan otomatis masih sangat jarang.

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



Gustuff juga dapat menampilkan pemberitahuan PUSH palsu dengan ikon aplikasi seluler yang sah. Pengguna mengklik pemberitahuan PUSH dan melihat jendela phishing yang diunduh dari server, di mana ia sendiri memasukkan data yang diminta dari kartu bank atau dompet crypto. Dalam skenario Gustuff lain, aplikasi terbuka atas nama yang pemberitahuan PUSH ditampilkan. Dalam hal ini, program jahat, atas perintah server melalui Layanan Aksesibilitas, dapat mengisi bidang formulir aplikasi perbankan untuk transaksi penipuan.

Fungsi Gustuff juga termasuk mengirim informasi tentang perangkat yang terinfeksi ke server, kemampuan membaca / mengirim pesan SMS, mengirim permintaan USSD, meluncurkan SOCKS5 Proxy, mengikuti tautan, mengirim file (termasuk pemindaian dokumen dokumen, screenshot, foto) ke server atur ulang perangkat ke pengaturan pabrik.

Analisis malware


Sebelum memasang aplikasi jahat, OS Android menampilkan jendela yang berisi daftar hak yang diminta oleh Gustuff kepada pengguna:

alt gambar

Pemasangan aplikasi hanya akan terjadi setelah mendapat persetujuan pengguna. Setelah meluncurkan aplikasi, trojan akan menampilkan jendela kepada pengguna:

alt gambar

Maka itu akan menghapus ikonnya.

Gustuff dikemas, menurut penulis, oleh pengemas FTT. Setelah memulai, aplikasi secara berkala mengakses server CnC untuk menerima perintah. Dalam beberapa file yang kami teliti, alamat IP 88.99.171 [.] 105 digunakan sebagai server kontrol (pada bagian berikut kami akan menyebutnya sebagai <% CnC%> ).

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

Sebagai jawaban, JSON diharapkan dalam format berikut:

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

Setiap kali aplikasi mengirim informasi tentang perangkat yang terinfeksi. Format pesan disajikan di bawah ini. Perlu dicatat bahwa bidang aplikasi dan izin lengkap , ekstra , adalah opsional dan hanya akan dikirim jika ada perintah permintaan 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 pekerjaan penting dalam file preferensi. Nama file, serta nama parameter di dalamnya, adalah hasil dari penghitungan jumlah MD5 dari baris 15413090667214.6.1 <% name%> , di mana <% name%> adalah nilai-nama asli. Interpretasi python dari fungsi pembuatan nama:

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

Dalam apa yang berikut, kami akan menyatakannya sebagai nameGenerator (input) .

Dengan demikian, nama file pertama adalah: nameGenerator ("API_SERVER_LIST") , itu berisi nilai-nilai dengan nama-nama berikut:

Nama variabelNilai
nameGenerator ("API_SERVER_LIST")Berisi daftar alamat CnC sebagai array.
nameGenerator ("API_SERVER_URL")Berisi alamat CnC.
nameGenerator ("SMS_UPLOAD")Bendera diatur secara default. Jika bendera diatur - mengirim pesan SMS ke CnC.
nameGenerator ("SMS_ROOT_NUMBER")Nomor telepon tujuan pengiriman pesan SMS oleh perangkat yang terinfeksi. Standarnya adalah nol.
nameGenerator ("SMS_ROOT_NUMBER_RESEND")Bendera dihapus secara default. Jika diinstal, ketika perangkat yang terinfeksi menerima SMS, itu akan dikirim ke nomor root.
nameGenerator ("DEFAULT_APP_SMS")Bendera dihapus secara default. Jika flag ini disetel, aplikasi akan memproses pesan SMS yang masuk.
nameGenerator ("DEFAULT_ADMIN")Bendera dihapus secara default. Jika flag diatur, aplikasi memiliki hak administrator.
nameGenerator ("DEFAULT_ACCESSIBILITY")Bendera dihapus secara default. Jika bendera diatur, layanan menggunakan Layanan Aksesibilitas dimulai.
nameGenerator ("APPS_CONFIG")Objek JSON berisi daftar tindakan yang harus dilakukan ketika acara Aksesibilitas yang terkait dengan aplikasi tertentu dipicu.
nameGenerator ("APPS_INSTALLED")Menyimpan daftar aplikasi yang diinstal pada perangkat.
nameGenerator ("IS_FIST_RUN")Bendera di-reset pada awal pertama.
nameGenerator ("UNIQUE_ID")Berisi pengidentifikasi unik. Ini dihasilkan pada peluncuran pertama bot.

Modul pemrosesan perintah server


Aplikasi menyimpan alamat server CnC sebagai array string yang disandikan Base85 . Daftar server CnC 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:
TimDeskripsi
forwardStartMulai mengirim pesan SMS yang diterima oleh perangkat yang terinfeksi ke server CnC.
forwardStopBerhenti mengirim pesan SMS yang diterima oleh perangkat yang terinfeksi ke server CnC.
ussdRunJalankan permintaan USSD. Nomor yang Anda inginkan untuk membuat permintaan USSD ada di kolom "nomor" JSON.
sendSmsKirim satu SMS-pesan (jika perlu, pesan "dibagi" menjadi beberapa bagian). Sebagai parameter, perintah mengambil objek JSON yang berisi bidang "ke" - nomor tujuan dan "tubuh" - badan pesan.
sendSmsAbKirim pesan SMS (jika perlu, pesan itu "dibagi" menjadi beberapa bagian) untuk semua orang dari daftar kontak perangkat yang terinfeksi. Interval antara pengiriman pesan adalah 10 detik. Isi pesan ada di kolom JSON "badan"
sendSmsMassKirim pesan SMS (jika perlu, pesan itu "dibagi" menjadi beberapa bagian) ke kontak yang ditentukan dalam parameter perintah. Interval antara pengiriman pesan adalah 10 detik. Sebagai parameter, perintah menerima array JSON (bidang "sms"), elemen yang berisi bidang "ke" - nomor tujuan dan "tubuh" - badan pesan.
ubahServerPerintah ini sebagai parameter dapat mengambil nilai dengan kunci "url" - maka bot akan mengubah nilai nameGenerator ("SERVER_URL"), atau "array" - maka bot akan menulis array ke nameGenerator ("API_SERVER_LIST") Jadi, aplikasi mengubah alamat server CnC.
adminNumberPerintah ini dirancang untuk bekerja dengan nomor root. Perintah menerima objek JSON dengan parameter berikut: "number" - ubah nameGenerator ("ROOT_NUMBER") menjadi nilai yang diterima, "kirim ulang" - ubah nameGenerator ("SMS_ROOT_NUMBER_RESEND"), "sendId" - kirim ke namaGenerator ("ROOT_NUMBER") unikID.
perbarui infoKirim informasi tentang perangkat yang terinfeksi ke server.
wipeDataPerintah ini dirancang untuk menghapus data pengguna. Bergantung pada nama aplikasi yang diluncurkan, salah satu data dihapus sepenuhnya dengan reboot perangkat (pengguna utama), atau hanya data pengguna yang dihapus (pengguna sekunder).
socksStartLuncurkan modul proxy. Pengoperasian modul dijelaskan dalam bagian terpisah.
berhenti kaus kakiHentikan modul proxy.
openLinkIkuti tautannya. Tautan ini terletak di parameter JSON dengan kunci "url". Untuk membuka tautan, gunakan "android.intent.action.VIEW".
unggah semuanyaKirim ke server semua pesan SMS yang diterima oleh perangkat.
unggahFotoKirim gambar dari perangkat yang terinfeksi ke URL. URL datang sebagai parameter.
unggahFileKirim file ke URL dari perangkat yang terinfeksi. URL datang sebagai parameter.
unggahNomor teleponKirim nomor telepon dari daftar kontak ke server. Jika objek JSON dengan tombol "ab" datang sebagai parameter, aplikasi menerima daftar kontak dari buku telepon. Jika objek JSON dengan kunci "sms" datang sebagai parameter, aplikasi membaca daftar kontak dari pengirim pesan SMS.
ubahArsipkanAplikasi mengunduh file dari alamat, yang datang sebagai parameter dengan kunci "url". File yang diunduh disimpan dengan nama "archive.zip". Setelah itu, aplikasi akan membuka ritsleting file, jika perlu, menggunakan kata sandi untuk arsip "b5jXh37gxgHBrZhQ4j3D". File yang tidak di-zip disimpan di direktori [penyimpanan eksternal] / hgps. Dalam direktori ini, aplikasi menyimpan palsu web (dijelaskan nanti).
tindakanPerintah ini dirancang untuk bekerja dengan Layanan Tindakan, yang dijelaskan di bagian terpisah.
tesTidak melakukan apa-apa.
unduhPerintah ini dirancang untuk mengunduh file dari server jauh dan menyimpannya ke direktori Unduhan. URL dan nama file datang sebagai parameter, bidang dalam parameter objek JSON, masing-masing: "url" dan "fileName".
hapusMenghapus file dari direktori Unduhan. Nama file datang dalam parameter JSON dengan kunci "nama file". Nama file default adalah "tmp.apk".
pemberitahuanTampilkan pemberitahuan dengan teks deskripsi dan judul yang ditentukan oleh server manajemen.

Format perintah notifikasi adalah:

 { "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 diselidiki terlihat identik dengan notifikasi yang dibuat oleh aplikasi yang ditentukan dalam bidang aplikasi . Jika nilai bidang openApp Benar, ketika pemberitahuan dibuka, aplikasi yang ditentukan dalam bidang aplikasi diluncurkan. Jika nilai bidang openApp salah, maka:

  • jendela phishing terbuka, yang isinya diunduh dari direktori <% penyimpanan eksternal%> / hgps / <% nama file%>
  • jendela phishing terbuka, yang isinya diunduh dari server <% url%>? id = <% Bot id%> & app = <% Nama aplikasi%>
  • Jendela phishing yang disamarkan saat Google Play Card terbuka, dengan kemampuan untuk memasukkan informasi kartu.

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

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

Layanan Tindakan

Daftar perintah yang proses aplikasi menyertakan tindakan . Setelah menerima perintah, modul pemrosesan perintah mengakses layanan ini untuk menjalankan perintah yang diperluas. Layanan menerima objek JSON sebagai parameter. Suatu layanan dapat menjalankan perintah berikut:

1. PARAMS_ACTION - setelah menerima perintah seperti itu, layanan pertama-tama menerima dari parameter JSON nilai dengan kunci Type, itu mungkin sebagai berikut:

  • serviceInfo - subcommand menerima dari parameter JSON nilai kunci includeNotImportant . Jika flag itu Benar, aplikasi menyetel flag FLAG_ISOLATED_PROCESS ke layanan yang menggunakan Layanan Aksesibilitas. Dengan demikian, layanan akan diluncurkan dalam proses terpisah.
  • root - dapatkan dan kirim ke informasi server tentang jendela, yang sekarang dalam fokus. Aplikasi mengambil informasi menggunakan kelas AccessibilityNodeInfo.
  • admin - meminta hak administrator.
  • delay - menunda ActionsService untuk jumlah milidetik yang ditentukan dalam parameter dengan kunci "data".
  • windows - kirim daftar windows yang terlihat oleh pengguna.
  • instal - instal aplikasi pada perangkat yang terinfeksi. Nama paket - arsip ada di kunci "nama file". Arsip itu sendiri terletak di direktori Unduhan.
  • global - subkomand dirancang untuk transisi dari jendela saat ini:
    • pada menu Pengaturan Cepat
    • kembali
    • rumah
    • pemberitahuan
    • ke jendela aplikasi yang baru dibuka

  • luncurkan - luncurkan aplikasi. Nama aplikasi datang sebagai parameter oleh kunci data .
  • suara - ubah mode suara menjadi hening.
  • membuka kunci - menyalakan lampu latar layar dan keyboard dengan kecerahan penuh. Aplikasi melakukan tindakan ini menggunakan WakeLock, string [Application lable]: INFO
  • permitOverlay - fungsi tidak diterapkan (respons terhadap eksekusi perintah adalah {"message": "Not support"} atau {"message": "low sdk"})
  • gesture - fungsi tidak diimplementasikan (respons terhadap eksekusi perintah adalah {"message": "Not support"} atau {"message": "Low API"})
  • izin - perintah ini diperlukan untuk meminta izin untuk aplikasi. Namun, fungsi kueri tidak diterapkan, jadi perintahnya tidak masuk akal. Daftar hak yang diminta datang sebagai array JSON dengan kunci "izin". Daftar standar:

    • android.permission.READ_PHONE_STATE
    • android.permission.READ_CONTACTS
    • android.permission.CALL_PHONE
    • android.permission.RECEIVE_SMS
    • android.permission.SEND_SMS
    • android.permission.READ_SMS
    • android.permission.READ_EXTERNAL_STORAGE
    • android.permission.WRITE_EXTERNAL_STORAGE

  • buka - tampilkan jendela phishing. Bergantung pada parameter yang berasal dari server, aplikasi dapat menampilkan jendela phishing berikut:

    • Tampilkan jendela phishing, yang isinya ditulis dalam file di direktori <% direktori eksternal%> / hgps / <% param_filename%> . Hasil interaksi pengguna dengan jendela akan dikirim ke <% CnC%> / records.php
    • Tampilkan jendela phishing yang isinya dimuat dari alamat <% url_param%>? Id = <% bot_id%> & app = <% nama paket%> . Hasil interaksi pengguna dengan jendela akan dikirim ke <% CnC%> / records.php
    • Tampilkan jendela phishing yang disamarkan sebagai Google Play Card.
  • interaktif - perintah ini dirancang untuk berinteraksi dengan elemen jendela aplikasi lain menggunakan AcessibilityService. Untuk interaksi, layanan khusus diterapkan dalam program. Aplikasi yang sedang dipelajari dapat berinteraksi dengan windows:
    • Aktif saat ini. Dalam hal ini, parameter berisi id atau teks (nama) dari objek yang diperlukan untuk berinteraksi.
    • Terlihat oleh pengguna pada saat perintah dieksekusi. Aplikasi memilih windows dengan id.

    Setelah menerima objek AccessibilityNodeInfo untuk elemen jendela yang menarik, aplikasi, tergantung pada parameter, dapat melakukan tindakan:
    • fokus - atur fokus ke objek.
    • klik - klik pada suatu objek.
    • actionId - melakukan tindakan dengan ID.
    • setText - mengubah teks objek. Anda dapat mengubah teks dalam dua cara: melakukan tindakan ACTION_SET_TEXT (jika versi Android perangkat yang terinfeksi lebih muda atau sama dengan LOLLIPOP ), atau dengan menempatkan garis di clipboard dan menempelkannya ke objek (untuk versi yang lebih lama). Perintah ini dapat digunakan untuk mengubah data dalam aplikasi perbankan.

2. PARAMS_ACTIONS - sama seperti PARAMS_ACTION , hanya array perintah JSON yang datang.

Tampaknya banyak yang akan tertarik dengan apa fungsi berinteraksi dengan elemen jendela aplikasi lain. Beginilah fungsi ini diimplementasikan 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; } 

Dengan demikian, jika server kontrol dikonfigurasi dengan benar, Gustuff dapat mengisi kolom teks dalam aplikasi perbankan dan mengklik tombol-tombol yang diperlukan untuk transaksi. Trojan bahkan tidak perlu diotorisasi dalam aplikasi - cukup kirim perintah untuk menunjukkan notifikasi PUSH, diikuti dengan membuka aplikasi perbankan yang sebelumnya diinstal. Pengguna akan melalui otorisasi, setelah itu Gustuff akan dapat mengisi otomatis.

Modul pemrosesan SMS


Aplikasi mengatur pengendali acara untuk menerima pesan SMS oleh perangkat yang terinfeksi. Aplikasi yang sedang dipelajari dapat menerima perintah dari operator yang ada di badan pesan SMS. Perintah datang dalam format:

7! 5 = <% Perintah disandikan Base64%>

Aplikasi mencari di semua pesan SMS yang masuk untuk string 7! 5 = , jika mendeteksi string, ia menerjemahkan string Base64 pada offset 4 dan menjalankan perintah. Perintah mirip dengan perintah dengan CnC. Hasil eksekusi dikirim ke nomor yang sama dari mana perintah itu berasal. Format jawaban:

7 * 5 = <% Base64 menyandikan "result_code command"%>

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

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

Selain itu, 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 flag nameGenerator ("DEFAULT_APP_SMS") diatur, aplikasi berhenti memproses pesan SMS dan menghapus daftar pesan yang masuk.

Modul proksi


Dalam aplikasi yang sedang dipelajari, ada modul Proxy Backconnect (selanjutnya disebut sebagai modul Proxy), yang memiliki kelas terpisah yang mencakup bidang statis dengan konfigurasi. Data konfigurasi disimpan dalam sampel dalam bentuk terbuka:

alt gambar


Semua tindakan yang dilakukan oleh Proxy-module dicatat ke file. Untuk melakukan ini, aplikasi di Penyimpanan Eksternal membuat direktori yang disebut "log" (bidang ProxyConfigClass.logsDir dalam kelas konfigurasi), di mana file log disimpan. Logging terjadi pada file dengan nama:

  1. main.txt - kelas ini mencatat operasi kelas dengan nama CommandServer. Di masa mendatang, pencatatan string str ke file ini akan dilambangkan sebagai mainLog (str).
  2. session - <% id%>. txt - data log yang terkait dengan sesi proksi tertentu disimpan ke file ini. Log lebih lanjut dari str str ke file ini akan disebut sebagai sessionLog (str).
  3. server.txt - data ini mencatat semua data yang ditulis ke file di atas.

Format Data Log:

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

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

 { "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 ia mengubahnya menjadi representasi string dan log.

Modul proksi diluncurkan setelah penerimaan tim yang sesuai. Ketika sebuah perintah tiba untuk memulai modul Proxy, aplikasi memulai layanan yang disebut MainService , yang bertanggung jawab untuk mengontrol operasi modul Proxy - mulai dan berhenti.

Tahapan memulai layanan:

1. Mulai penghitung waktu yang bekerja satu menit sekali dan periksa aktivitas modul proxy. Jika modul tidak aktif, ia memulainya.
Juga, ketika acara android.net.conn.CONNECTIVITY_CHANGE dipicu, modul Proxy dimulai.

2. Aplikasi membuat kunci bangun dengan parameter PARTIAL_WAKE_LOCK dan menangkapnya. Karena itu, itu tidak memungkinkan CPU perangkat untuk memasuki mode tidur.

3. Menjalankan kelas pemrosesan perintah modul proxy dengan masuk ke jalur mainLog ("start server") dan

Server :: start () host [<% proxy_cnc%>], commandPort [<% command_port%>], proxyPort [<% proxy_port%>]

di mana proxy_cnc, command_port dan proxy_port adalah parameter yang diperoleh dari konfigurasi server proxy.

Kelas pemrosesan perintah disebut CommandConnection . Segera setelah diluncurkan, ia melakukan tindakan berikut:

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

 { "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:

  • pengidentifikasi id, berusaha mendapatkan nilai dengan bidang "id" dari file Preferensi Bersama dengan nama "x". Jika nilai ini tidak dapat diperoleh, itu menghasilkan yang baru. , Proxy- Μ† , Μ† Bot ID.
  • imei β€” IMEI Μ†. β€” .
  • imsi β€” International Mobile Subscriber Identity Μ†. β€” .
  • model β€” The end-user-visible name for the end product.
  • manufacturer β€” The manufacturer of the product/hardware (Build.MANUFACTURER).
  • androidVersion β€” "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • country β€” Μ†.
  • partnerId – .
  • packageName – package name.
  • networkType β€” (: Β«WIFIΒ», Β«MOBILEΒ»). null.
  • hasGsmSupport – true – GSM, false.
  • simReady – SIM-.
  • simCountry β€” ISO- ( Μ† -).
  • networkOperator β€” . β€” .
  • simOperator β€” The Service Provider Name (SPN). β€” .
  • version β€” -, Μ† Β«1.6Β».

5. . :

  • 0 offset – command
  • 1 offset – sessionId
  • 2 offset – length
  • 4 offset β€” data

:

mainLog(Β«Header { sessionId<%id%>], type[<%command%>], length[<%length%>] }Β»)

:

NameCommandDataDescription
connectionId0Connection ID
SLEEP3WaktuProxy-
PING_PONG4-PONG-

PONG- 4 : 0x04000000 .

connectionId ( ) CommandConnection ProxyConnection .

  • : ProxyConnection end . ProxyConnection ProxyConfigClass.host : ProxyConfigClass.proxyPort JSON-:

  { "id":<%connectionId%> } 

SOCKS5-, , . Μ† end . :

alt gambar

Μ†


Μ† CnC- SSL. JSON-. :

  • http://<%CnC%>/api/v1/set_state.php β€” .
  • http://<%CnC%>/api/v1/get.php β€” .
  • http://<%CnC%>/api/v1/load_sms.php β€” SMS-Μ† Μ†.
  • http://<%CnC%>/api/v1/load_ab.php β€” Μ†.
  • http://<%CnC%>/api/v1/aevents.php – , preference-Μ†.
  • http://<%CnC%>/api/v1/set_card.php β€” , -, Google Play Market.
  • http://<%CnC%>/api/v1/logs.php – -.
  • http://<%CnC%>/api/v1/records.php – , .
  • http://<%CnC%>/api/v1/set_error.php – Μ† .


, , .

, . , , .

– - , , -, , , , , .

:


  • Android - , Google Play;
  • ;
  • Android;
  • ;
  • ;
  • , SMS-.

, Group-IB.

Source: https://habr.com/ru/post/id446948/


All Articles