Carane Trojan Gustuff Android skims krim (fiat lan crypto) saka akun

Carane Trojan Gustuff Android skims krim (fiat lan crypto) saka akun

Mung dina liyane Group-IB informed bab kegiatan saka mobile Android Trojan Gustuff. Kerjane sacara eksklusif ing pasar internasional, nyerang klien saka 100 bank asing paling gedhe, pangguna dompet crypto 32 seluler, uga sumber daya e-commerce sing gedhe. Nanging pangembang Gustuff minangka cybercriminal sing nganggo basa Rusia kanthi jeneng Bestoffer. Nganti saiki, dheweke muji Trojan minangka "produk serius kanggo wong sing duwe kawruh lan pengalaman."

Spesialis analisis kode jahat ing Group-IB Ivan Pisarev ing riset, kang wuwus ing rinci bab carane Gustuff dianggo lan apa beboyo.

Gustuff mburu sapa?

Gustuff kalebu generasi anyar malware kanthi fungsi otomatis. Miturut pangembang, Trojan wis dadi versi anyar lan luwih apik saka malware AndyBot, sing wiwit November 2017 wis nyerang telpon Android lan nyolong dhuwit liwat formulir web phishing sing masquerading minangka aplikasi seluler saka bank-bank internasional lan sistem pembayaran sing kondhang. Bestoffer nglaporake manawa rega sewa Gustuff Bot yaiku $800 saben wulan.

Analisis sampel Gustuff nuduhake yen Trojan duweni potensi nargetake pelanggan nggunakake aplikasi seluler saka bank-bank paling gedhe, kayata Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, uga dompet crypto. Dompet Bitcoin, BitPay, Cryptopay, Coinbase, lsp.

Originally digawe minangka Trojan banking klasik, ing versi saiki Gustuff wis Ngartekno ditambahi dhaftar target potensial kanggo serangan. Saliyane aplikasi Android kanggo bank, perusahaan fintech lan layanan crypto, Gustuff ngarahake pangguna aplikasi pasar, toko online, sistem pembayaran lan utusan cepet. Utamane, PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut lan liya-liyane.

Titik mlebu: pitungan kanggo infeksi massa

Gustuff ditondoi kanthi vektor "klasik" penetrasi menyang smartphone Android liwat surat SMS kanthi pranala menyang APK. Nalika piranti Android kena infeksi Trojan kanthi prentah saka server, Gustuff bisa uga nyebar liwat database kontak telpon sing kena infeksi utawa liwat database server. Fungsi Gustuff dirancang kanggo infeksi massal lan kapitalisasi maksimal bisnis para operator - nduweni fungsi "isi otomatis" sing unik menyang aplikasi perbankan seluler lan dompet crypto sing sah, sing ngidini sampeyan nyepetake lan ngukur nyolong dhuwit.

Panaliten babagan Trojan nuduhake manawa fungsi isi otomatis ditindakake kanthi nggunakake Layanan Aksesibilitas, layanan kanggo wong sing ora duwe kabisan. Gustuff dudu Trojan pisanan sing kasil ngliwati proteksi marang interaksi karo unsur jendhela aplikasi liyane nggunakake layanan Android iki. Nanging, panggunaan Layanan Aksesibilitas ing kombinasi karo ngisi mobil isih langka.

Sawise ndownload menyang telpon korban, Gustuff, nggunakake Layanan Aksesibilitas, bisa sesambungan karo unsur jendela aplikasi liyane (perbankan, cryptocurrency, uga aplikasi kanggo blanja online, olahpesen, lan sapiturute), nindakake tumindak sing dibutuhake kanggo para panyerang. . Contone, kanthi prentah saka server, Trojan bisa menet tombol lan ngganti nilai kolom teks ing aplikasi perbankan. Nggunakake mekanisme Layanan Aksesibilitas ngidini Trojan ngliwati mekanisme keamanan sing digunakake dening bank-bank kanggo nglawan Trojan seluler generasi sadurunge, uga owah-owahan ing kabijakan keamanan sing ditindakake Google ing versi anyar saka OS Android. Mangkono, Gustuff "ngerti" kanggo mateni proteksi Google Protect: miturut penulis, fungsi iki bisa digunakake ing 70% kasus.

Carane Trojan Gustuff Android skims krim (fiat lan crypto) saka akun

Gustuff uga bisa nampilake kabar PUSH palsu kanthi lambang aplikasi seluler sing sah. Pangguna ngeklik kabar PUSH lan ndeleng jendhela phishing sing diundhuh saka server, ing ngendi dheweke ngetik kertu bank sing dijaluk utawa data dompet crypto. Ing skenario Gustuff liyane, aplikasi sing nuduhake kabar PUSH dibukak. Ing kasus iki, malware, kanthi prentah saka server liwat Layanan Aksesibilitas, bisa ngisi kolom formulir aplikasi perbankan kanggo transaksi penipuan.

Fungsi Gustuff uga kalebu ngirim informasi babagan piranti sing kena infeksi menyang server, kemampuan kanggo maca / ngirim pesen SMS, ngirim panjalukan USSD, ngluncurake SOCKS5 Proxy, ngetutake link, ngirim file (kalebu scan foto dokumen, gambar, foto) menyang server , ngreset piranti menyang setelan pabrik.

Analisis malware

Sadurunge nginstal aplikasi ala, OS Android nuduhake pangguna jendhela sing ngemot dhaptar hak sing dijaluk Gustuff:

Carane Trojan Gustuff Android skims krim (fiat lan crypto) saka akun
Aplikasi bakal diinstal mung sawise nampa idin pangguna. Sawise mbukak aplikasi, Trojan bakal nuduhake pangguna jendhela:

Carane Trojan Gustuff Android skims krim (fiat lan crypto) saka akun
Sawise iku bakal mbusak lambang sawijining.

Gustuff dikemas, miturut penulis, dening packer saka FTT. Sawise wiwitan, aplikasi kanthi periodik ngontak server CnC kanggo nampa printah. Sawetara file sing ditliti nggunakake alamat IP minangka server kontrol 88.99.171[.]105 (Sabanjure kita bakal nemtokake minangka <%CnC%>).

Sawise diluncurake, program kasebut wiwit ngirim pesen menyang server http://<%CnC%>/api/v1/get.php.

Tanggepan samesthine dadi JSON ing format ing ngisor iki:

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

Saben aplikasi diakses, bakal ngirim informasi babagan piranti sing kena infeksi. Format pesen ditampilake ing ngisor iki. Wigati dicathet yen sawah lengkap, ekstra, apps и ijin – opsional lan bakal dikirim mung ing cilik saka printah request saka 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%>
} 

Nyimpen data konfigurasi

Gustuff nyimpen informasi operasional penting ing file pilihan. Jeneng berkas, uga jeneng paramèter kasebut, minangka asil ngitung jumlah MD5 saka senar. 15413090667214.6.1<%jeneng%>ngendi <%jeneng%> - jeneng-nilai wiwitan. Interpretasi Python saka fungsi generasi jeneng:

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

Ing ngisor iki kita bakal nuduhake minangka nameGenerator(input).
Dadi jeneng berkas pisanan yaiku: nameGenerator("API_SERVER_LIST"), ngemot nilai kanthi jeneng ing ngisor iki:

Jeneng variabel Nilai
nameGenerator("API_SERVER_LIST") Ngandhut dhaptar alamat CnC ing wangun array.
nameGenerator("API_SERVER_URL") Ngandhut alamat CnC.
nameGenerator("SMS_UPLOAD") Gendéra disetel kanthi gawan. Yen gendera disetel, ngirim pesen SMS menyang CnC.
nameGenerator("SMS_ROOT_NUMBER") Nomer telpon sing pesen SMS sing ditampa dening piranti sing kena infeksi bakal dikirim. Default iku null.
nameGenerator("SMS_ROOT_NUMBER_RESEND") Gendéra dibusak kanthi gawan. Yen diinstal, nalika piranti sing kena infeksi nampa SMS, bakal dikirim menyang nomer root.
nameGenerator("DEFAULT_APP_SMS") Gendéra dibusak kanthi gawan. Yen gendera iki disetel, aplikasi bakal ngolah pesen SMS sing mlebu.
nameGenerator("DEFAULT_ADMIN") Gendéra dibusak kanthi gawan. Yen gendera disetel, aplikasi kasebut nduweni hak administrator.
nameGenerator("DEFAULT_ACCESSIBILITY") Gendéra dibusak kanthi gawan. Yen gendera disetel, layanan sing nggunakake Layanan Aksesibilitas mlaku.
nameGenerator("APPS_CONFIG") Objek JSON sing ngemot dhaptar tumindak sing kudu ditindakake nalika acara Aksesibilitas sing digandhengake karo aplikasi tartamtu dipicu.
nameGenerator("APPS_INSTALLED") Nyimpen dhaptar aplikasi sing diinstal ing piranti.
nameGenerator("IS_FIST_RUN") Gendéra direset ing wiwitan pisanan.
nameGenerator("ID_UNIK") Ngandhut pengenal unik. Digawe nalika bot diluncurake sepisanan.

Modul kanggo ngolah printah saka server

Aplikasi nyimpen alamat server CnC ing wangun array dienkode dening Base85 baris. Dhaptar server CnC bisa diganti sawise nampa printah sing cocog, ing kasus iki alamat bakal disimpen ing file pilihan.

Nanggepi panjalukan kasebut, server ngirim printah menyang aplikasi kasebut. Wigati dicathet yen printah lan paramèter ditampilake ing format JSON. Aplikasi bisa ngolah printah ing ngisor iki:

tim Description
majuMulai Mulai ngirim pesen SMS sing ditampa dening piranti sing kena infeksi menyang server CnC.
majuStop Mungkasi ngirim pesen SMS sing ditampa dening piranti sing kena infeksi menyang server CnC.
ussdRun Nglakokaké panjalukan USSD. Nomer sing sampeyan kudu nggawe panjalukan USSD dumunung ing "nomer" kolom JSON.
ngirimSms Kirimi pesen SMS siji (yen perlu, pesen kasebut "dibagi" dadi bagean). Minangka parameter, perintah kasebut njupuk obyek JSON sing ngemot kolom "kanggo" - nomer tujuan lan "awak" - awak pesen.
ngirimSmsAb Kirim pesen SMS (yen perlu, pesen kasebut "dibagi" dadi bagean) kanggo kabeh wong ing dhaptar kontak piranti sing kena infeksi. Interval antarane ngirim pesen yaiku 10 detik. Isi pesen kasebut ana ing kolom JSON "awak"
ngirimSmsMass Kirim pesen SMS (yen perlu, pesen kasebut "dibagi" dadi bagean) menyang kontak sing ditemtokake ing paramèter printah. Interval antarane ngirim pesen yaiku 10 detik. Minangka parameter, perintah kasebut njupuk array JSON (kolom "sms"), unsur sing ngemot kolom "kanggo" - nomer tujuan lan "awak" - awak pesen.
nggantiServer Printah iki bisa njupuk nilai kanthi tombol "url" minangka parameter - banjur bot bakal ngganti nilai nameGenerator("SERVER_URL"), utawa "array" - banjur bot bakal nulis array menyang nameGenerator ("API_SERVER_LIST") Mangkono, aplikasi ngganti alamat server CnC.
adminNomer Printah kasebut dirancang kanggo nggarap nomer root. Printah kasebut nampa obyek JSON kanthi parameter ing ngisor iki: "nomer" - ganti nameGenerator ("ROOT_NUMBER") dadi nilai sing ditampa, "kirim ulang" - ganti jenengGenerator ("SMS_ROOT_NUMBER_RESEND"), "sendId" - kirim menyang nameGenerator ("ROOT_NUMBER" ) unikID.
nganyariInfo Kirimi informasi babagan piranti sing kena infeksi menyang server.
ngilangke data Printah kasebut dimaksudake kanggo mbusak data pangguna. Gumantung apa jeneng aplikasi sing diluncurake, data kasebut bakal dibusak kanthi piranti urip maneh (pangguna utama), utawa mung data pangguna sing dibusak (pangguna sekunder).
kaos kakiMulai Bukak modul Proxy. Operasi modul kasebut diterangake ing bagean sing kapisah.
kaos kakiStop Mungkasi modul Proxy.
openLink Tindakake link. Link kasebut ana ing parameter JSON ing sangisore tombol "url". "android.intent.action.VIEW" digunakake kanggo mbukak link.
uploadAllSms Kirimi kabeh pesen SMS sing ditampa dening piranti menyang server.
uploadAllPhotos Kirim gambar saka piranti sing kena infeksi menyang URL. URL kasebut minangka parameter.
uploadFile Kirim file menyang URL saka piranti sing kena infeksi. URL kasebut minangka parameter.
uploadPhoneNumbers Kirimi nomer telpon saka dhaptar kontak menyang server. Yen nilai obyek JSON kanthi tombol "ab" ditampa minangka parameter, aplikasi bakal nampa dhaptar kontak saka buku telpon. Yen obyek JSON kanthi tombol "sms" ditampa minangka parameter, aplikasi kasebut maca dhaptar kontak saka pangirim pesen SMS.
nggantiArsip Aplikasi ngundhuh file saka alamat sing teka minangka parameter nggunakake tombol "url". File sing diundhuh disimpen kanthi jeneng "archive.zip". Aplikasi kasebut banjur bakal mbukak zip file kasebut, kanthi opsional nggunakake sandhi arsip "b5jXh37gxgHBrZhQ4j3D". File sing wis dibukak disimpen ing direktori [panyimpenan eksternal]/hgps. Ing direktori iki, aplikasi nyimpen palsu web (diterangake ing ngisor iki).
Simpenan Printah kasebut dirancang kanggo nggarap Action Service, sing diterangake ing bagean sing kapisah.
test Ora nindakake apa-apa.
download Printah kasebut dimaksudake kanggo ndownload file saka server remot lan simpen menyang direktori "Unduh". URL lan jeneng berkas teka minangka parameter, kolom ing obyek parameter JSON, mungguh: "url" lan "fileName".
mbusak Mbusak file saka direktori "Downloads". Jeneng berkas kasebut ana ing parameter JSON kanthi tombol "Nama berkas". Jeneng berkas standar yaiku "tmp.apk".
kabar Tampilake kabar kanthi deskripsi lan teks judhul sing ditetepake dening server manajemen.

Format printah kabar:

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

Kabar sing digawe dening file sing diselidiki katon padha karo kabar sing digawe dening aplikasi sing ditemtokake ing lapangan app. Yen nilai lapangan openApp - Bener, nalika kabar dibukak, aplikasi sing ditemtokake ing lapangan diluncurake app. Yen nilai lapangan openApp - Salah, banjur:

  • Jendhela phishing mbukak, isi sing diundhuh saka direktori <%panyimpenan njaba%>/hgps/<%filename%>
  • Jendhela phishing mbukak, isi sing diundhuh saka server <%url%>?id=<%Bot id%>&app=<%Jeneng aplikasi%>
  • Jendhela phishing mbukak, nyamar dadi Google Play Card, kanthi kesempatan kanggo ngetik rincian kertu.

Aplikasi ngirim asil printah sembarang kanggo <%CnC%>set_state.php minangka obyek JSON ing format ing ngisor iki:

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

ActionsService
Dhaptar printah sing kalebu pangolahan aplikasi tumindak. Nalika printah ditampa, modul pangolahan printah ngakses layanan iki kanggo nglakokaké printah lengkap. Layanan nampa obyek JSON minangka parameter. Layanan bisa nindakake printah ing ngisor iki:

1. PARAMS_ACTION - nalika nampa prentah kasebut, layanan kasebut pisanan nampa nilai tombol Tipe saka parameter JSON, sing bisa kaya ing ngisor iki:

  • info layanan - subcommand entuk nilai kanthi kunci saka parameter JSON kalebu Ora Penting. Yen gendera Bener, aplikasi nyetel gendera FLAG_ISOLATED_PROCESS menyang layanan nggunakake Layanan Aksesibilitas. Kanthi cara iki layanan bakal diluncurake ing proses sing kapisah.
  • ROOT — nampa lan ngirim menyang informasi server bab jendhela sing lagi fokus. Aplikasi entuk informasi nggunakake kelas AccessibilityNodeInfo.
  • admin - njaluk hak administrator.
  • tundha - nundha ActionsService kanggo jumlah milliseconds sing ditemtokake ing parameter kanggo tombol "data".
  • windows - ngirim dhaptar jendhela sing katon kanggo pangguna.
  • masang - nginstal aplikasi ing piranti sing kena infeksi. Jeneng paket arsip ana ing tombol "FileName". Arsip kasebut dhewe dumunung ing direktori Downloads.
  • global – subcommand dimaksudaké kanggo navigasi saka jendhela saiki:
    • ing menu Setelan Cepet
    • bali
    • ngarep
    • kanggo kabar
    • menyang jendhela aplikasi sing bubar dibukak

  • miwiti - miwiti aplikasi. Jeneng aplikasi kasebut minangka parameter kanthi tombol data.
  • swara - ngganti mode swara dadi meneng.
  • mbukak kunci - nguripake lampu latar layar lan keyboard kanggo padhange lengkap. Aplikasi nindakake tumindak iki nggunakake WakeLock, nemtokake string [Label aplikasi]:INFO minangka tag
  • permissionOverlay — fungsi ora dileksanakake (tanggepan kanggo eksekusi perintah yaiku {"pesen":"Ora ndhukung"} utawa {"pesen":"sdk kurang"})
  • polah — fungsi ora dileksanakake (tanggepan kanggo eksekusi perintah yaiku {"pesen":"Ora ndhukung"}utawa {"pesen":"API Kurang"})
  • ijin — printah iki perlu kanggo njaluk ijin kanggo aplikasi. Nanging, fungsi query ora dileksanakake, mula perintah kasebut ora ana gunane. Dhaptar hak sing dijaluk teka minangka array JSON kanthi tombol "ijin". 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

  • mbukak - nampilake jendhela phishing. Gumantung ing parameter sing teka saka server, aplikasi bisa nampilake jendhela phishing ing ngisor iki:
    • Nuduhake jendhela phishing sing isine ditulis ing file ing direktori <%direktori eksternal%>/hgps/<%param_filename%>. Asil interaksi pangguna karo jendhela bakal dikirim menyang <%CnC%>/records.php
    • Tampilake jendhela phishing sing isine wis dimuat saka alamat kasebut <%url_param%>?id=<%bot_id%>&app=<%packagename%>. Asil interaksi pangguna karo jendhela bakal dikirim menyang <%CnC%>/records.php
    • Tampilake jendhela phishing sing nyamar dadi Google Play Card.

  • interaktif — printah dirancang kanggo sesambungan karo unsur jendhela saka aplikasi liyane nggunakake AcessibilityService. Layanan khusus wis dileksanakake ing program kanggo interaksi. Aplikasi sing diselidiki bisa sesambungan karo windows:
    • Saiki aktif. Ing kasus iki, parameter ngemot id utawa teks (jeneng) obyek sing sampeyan kudu sesambungan.
    • Katon kanggo pangguna nalika printah dieksekusi. Aplikasi milih windows kanthi id.

    Duwe nampa obyek AksesibilitasNodeInfo Kanggo unsur jendhela sing dikarepake, aplikasi, gumantung saka paramèter, bisa nindakake tumindak ing ngisor iki:

    • fokus - nyetel fokus kanggo obyek.
    • klik - klik ing obyek.
    • actionId - nindakake tumindak kanthi ID.
    • setText - ngganti teks obyek. Ngganti teks bisa kanthi rong cara: nindakake tumindak ACTION_SET_TEXT (yen versi Android piranti sing kena infeksi luwih enom saka utawa padha karo LOLLIPOP), utawa kanthi nyelehake senar ing clipboard lan nempelake menyang obyek (kanggo versi lawas). Printah iki bisa digunakake kanggo ngganti data ing aplikasi perbankan.

2. PARAMS_ACTIONS - podho karo PARAMS_ACTION, mung sawetara perintah JSON sing teka.

Iku misale jek sing akeh wong bakal kasengsem ing apa fungsi sesambungan karo unsur jendhela saka aplikasi liyane katon kaya. Mangkene fungsi iki ditindakake ing 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 panggantos 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;
}

Mangkono, kanthi konfigurasi server kontrol sing bener, Gustuff bisa ngisi kolom teks ing aplikasi perbankan lan klik tombol sing dibutuhake kanggo ngrampungake transaksi kasebut. Trojan malah ora perlu mlebu ing aplikasi-iku cukup kanggo ngirim printah kanggo nampilake kabar PUSH banjur mbukak aplikasi perbankan sing wis diinstal sadurunge. Pangguna bakal keasliane dhewe, sawise Gustuff bisa ngisi mobil.

Modul pangolahan pesen SMS

Aplikasi nginstal handler acara kanggo piranti sing kena infeksi kanggo nampa pesen SMS. Aplikasi sing diteliti bisa nampa prentah saka operator, sing ana ing awak pesen SMS. Printah teka ing format:

7!5=<%Base64 encoded printah%>

Aplikasi nggoleki senar ing kabeh pesen SMS sing mlebu 7!5 =, nalika senar dideteksi, decode senar saka Base64 ing offset 4 lan nglakokaké printah. Prentah kasebut padha karo sing nganggo CnC. Asil eksekusi dikirim menyang nomer sing padha saka printah kasebut. Format respon:

7*5=<%Base64 encode saka “result_code printah”%>

Opsional, aplikasi bisa ngirim kabeh pesen sing ditampa menyang nomer ROOT. Kanggo nindakake iki, nomer ROOT kudu ditemtokake ing file pilihan lan gendera pangalihan pesen kudu disetel. Pesen SMS dikirim menyang nomer penyerang kanthi format:

<%Saka angka%> - <%Wektu, format: dd/MM/yyyy HH:mm:ss%> <%SMS body%>

Uga, opsional, aplikasi bisa ngirim pesen menyang CnC. Pesen SMS dikirim menyang server ing format JSON:

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

Yen gendéra disetel nameGenerator("DEFAULT_APP_SMS") - aplikasi mandheg ngolah pesen SMS lan mbusak dhaptar pesen sing mlebu.

Modul proxy

Aplikasi sing diteliti ngemot modul Backconnect Proxy (sabanjure diarani modul Proxy), sing nduweni kelas kapisah sing kalebu kolom statis kanthi konfigurasi. Data konfigurasi disimpen ing conto ing wangun sing cetha:

Carane Trojan Gustuff Android skims krim (fiat lan crypto) saka akun

Kabeh tumindak sing ditindakake dening modul Proxy mlebu menyang file. Kanggo nindakake iki, aplikasi ing Panyimpenan Eksternal nggawe direktori sing disebut "log" (lapangan ProxyConfigClass.logsDir ing kelas konfigurasi), ing ngendi file log disimpen. Logging dumadi ing file kanthi jeneng:

  1. utama.txt – karya saka kelas disebut CommandServer mlebu menyang berkas iki. Ing ngisor iki, logging string str menyang file iki bakal dituduhake minangka mainLog(str).
  2. sesi-<%id%>.txt — berkas iki nyimpen data log sing digandhengake karo sesi proxy tartamtu. Ing ngisor iki, logging string str menyang file iki bakal dituduhake minangka sessionLog (str).
  3. server.txt – file iki digunakake kanggo nyathet kabeh data sing ditulis ing file kasebut ing ndhuwur.

Format data log:

<%Date%> [Utas[<%thread id%>], id[]]: log-string

Pangecualian sing kedadeyan sajrone operasi modul Proxy uga mlebu menyang file. Kanggo nindakake iki, aplikasi ngasilake obyek JSON ing format ing ngisor iki:

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

Banjur ngowahi dadi perwakilan senar lan log.

Modul Proxy diluncurake sawise nampa perintah sing cocog. Nalika printah kanggo miwiti modul Proxy ditampa, aplikasi miwiti layanan disebut Layanan Utama, sing tanggung jawab kanggo ngatur operasi modul Proxy - miwiti lan mungkasi.

Tahap miwiti layanan:

1. Miwiti timer sing mbukak sapisan menit lan mriksa aktivitas modul Proxy. Yen modul ora aktif, iku miwiti.
Uga nalika acara kasebut dipicu android.net.conn.CONNECTIVITY_CHANGE Modul Proxy diluncurake.

2. Aplikasi nggawe wake-lock karo parameter PARTIAL_WAKE_LOCK lan nangkep dheweke. Iki nyegah CPU piranti menyang mode turu.

3. Mbukak kelas pangolahan printah saka modul Proxy, pisanan logging baris mainLog("mulai server") и

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

ngendi proxy_cnc, command_port lan proxy_port – paramèter sing dipikolehi saka konfigurasi server proxy.

Kelas pangolahan printah diarani CommandConnection. Sanalika sawise wiwitan, nindakake tumindak ing ngisor iki:

4. Nyambung menyang ProxyConfigClass.host: ProxyConfigClass.commandPort lan ngirim data babagan piranti sing kena infeksi ing 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%>
}

Ngendi:

  • id - pengenal, nyoba entuk nilai kanthi kolom "id" saka file Preferensi Bersama sing jenenge "x". Yen nilai iki ora bisa dipikolehi, bakal ngasilake sing anyar. Mangkono, modul Proxy duwe pengenal dhewe, sing digawe padha karo Bot ID.
  • imei — IMEI piranti. Yen ana kesalahan sajrone proses entuk nilai kasebut, pesen teks kesalahan bakal ditulis tinimbang kolom iki.
  • imsi — Identitas Pelanggan Seluler Internasional piranti kasebut. Yen ana kesalahan sajrone proses entuk nilai kasebut, pesen teks kesalahan bakal ditulis tinimbang kolom iki.
  • model — Jeneng mburi-katon pangguna kanggo produk pungkasan.
  • pabrikan — Pabrikan produk/perangkat keras (Build.MANUFACTURER).
  • androidVersion - string ing format "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • negara — lokasi piranti saiki.
  • partnerId minangka string kosong.
  • packageName - jeneng paket.
  • networkType — jinis sambungan jaringan saiki (umpamane: "WIFI", "MOBILE"). Ing cilik saka kesalahan, bali null.
  • hasGsmSupport – bener – yen telpon ndhukung GSM, digunakake palsu.
  • simReady - status kertu SIM.
  • simCountry - kode negara ISO (adhedhasar panyedhiya kertu SIM).
  • networkOperator - jeneng operator. Yen ana kesalahan sajrone proses entuk nilai kasebut, pesen teks kesalahan bakal ditulis tinimbang kolom iki.
  • simOperator - Jeneng Panyedhiya Layanan (SPN). Yen ana kesalahan sajrone proses entuk nilai kasebut, pesen teks kesalahan bakal ditulis tinimbang kolom iki.
  • versi - kolom iki disimpen ing kelas konfigurasi; kanggo versi sing dites saka bot padha karo "1.6".

5. Ngalih menyang mode nunggu printah saka server. Printah saka server teka ing format:

  • 0 offset - printah
  • 1 offset – sessionId
  • 2 offset - dawa
  • 4 offset - data

Nalika prentah teka, log aplikasi:
mainLog("Header { sessionId<%id%>], ketik[<%command%>], dawa[<%length%>] }")

Printah ing ngisor iki saka server bisa uga:

jeneng Command Data Description
koneksi id 0 ID sambungan Nggawe sambungan anyar
SUKIT 3 wektu Ngaso modul Proxy
PING PONG 4 - Kirim pesen PONG

Pesen PONG dumadi saka 4 bita lan katon kaya iki: 0x04000000.

Nalika printah connectionId ditampa (kanggo nggawe sambungan anyar) CommandConnection nggawe conto saka kelas ProxyConnection.

  • Rong kelas melu proxying: ProxyConnection и ends. Nalika nggawe kelas ProxyConnection nyambung menyang alamat ProxyConfigClass.host: ProxyConfigClass.proxyPort lan ngliwati obyek JSON:

 {
    "id":<%connectionId%>
}

Kanggo nanggepi, server ngirim pesen SOCKS5 sing ngemot alamat server remot sing kudu disambungake. Interaksi karo server iki dumadi liwat kelas ends. Persiyapan sambungan bisa dituduhake kanthi skema kaya ing ngisor iki:

Carane Trojan Gustuff Android skims krim (fiat lan crypto) saka akun

Interaksi jaringan

Kanggo nyegah analisis lalu lintas dening sniffers jaringan, interaksi antarane server CnC lan aplikasi bisa direksa nggunakake protokol SSL. Kabeh data sing dikirim saka lan menyang server ditampilake ing format JSON. Aplikasi nindakake panjalukan ing ngisor iki sajrone operasi:

  • http://<%CnC%>/api/v1/set_state.php - asil saka eksekusi printah.
  • http://<%CnC%>/api/v1/get.php - nampa prentah.
  • http://<%CnC%>/api/v1/load_sms.php — ndownload pesen SMS saka piranti sing kena infeksi.
  • http://<%CnC%>/api/v1/load_ab.php — ngunggah dhaptar kontak saka piranti sing kena infeksi.
  • http://<%CnC%>/api/v1/aevents.php - panyuwunan digawe nalika nganyari paramèter sing ana ing file pilihan.
  • http://<%CnC%>/api/v1/set_card.php - ngunggah data sing dipikolehi nggunakake jendhela phishing sing masquerading minangka Google Play Market.
  • http://<%CnC%>/api/v1/logs.php - ngunggah data log.
  • http://<%CnC%>/api/v1/records.php - ngunggah data sing dipikolehi liwat windows phishing.
  • http://<%CnC%>/api/v1/set_error.php - kabar babagan kesalahan sing kedadeyan.

Rekomendasi

Kanggo nglindhungi para pelanggan saka ancaman Trojan seluler, perusahaan kudu nggunakake solusi komprehensif sing ngidini kanggo ngawasi lan nyegah kegiatan angkoro tanpa nginstal piranti lunak tambahan ing piranti pangguna.

Kanggo nindakake iki, cara teken kanggo ndeteksi Trojan seluler kudu dikuatake kanthi teknologi kanggo nganalisa prilaku klien lan aplikasi kasebut dhewe. Proteksi kasebut uga kudu kalebu fungsi identifikasi piranti kanthi nggunakake teknologi bekas driji digital, sing bakal ngidini sampeyan ngerti nalika akun digunakake saka piranti sing ora khas lan wis tiba ing tangan penipu.

Titik dhasar sing penting yaiku kasedhiyan analisis lintas saluran, sing ngidini perusahaan ngontrol risiko sing muncul ora mung ing Internet, nanging uga ing saluran seluler, contone, ing aplikasi kanggo perbankan seluler, kanggo transaksi karo cryptocurrencies lan liya-liyane. transaksi bisa ditindakake.transaksi finansial.

Aturan safety kanggo pangguna:

  • aja instal aplikasi kanggo piranti seluler kanthi OS Android saka sumber apa wae kajaba Google Play, mbayar manungsa waé khusus kanggo hak sing dijaluk aplikasi kasebut;
  • nginstal nganyari OS Android kanthi rutin;
  • mbayar manungsa waé kanggo ekstensi file sing diundhuh;
  • aja ngunjungi sumber daya sing curiga;
  • Aja ngeklik tautan sing ditampa ing pesen SMS.

Dibintangi Semyon Rogacheva, spesialis junior ing riset malware ing Laboratorium Forensik Komputer Group-IB.

Source: www.habr.com

Add a comment