Kako Android trojan Gustuff izvlači novac (fiat i kriptovalutu) s vaših računa

Kako Android trojan Gustuff izvlači novac (fiat i kriptovalutu) s vaših računa

Skoro svakog dana Group-IB javila izvještava o aktivnosti mobilnog Android trojanca Gustuff. On djeluje isključivo na međunarodnim tržištima, napadajući klijente 100 najvećih stranih banaka, korisnike 32 mobilna kriptokolica, kao i velike e-commerce resurse. A razvijač Gustuff — rusko govoreći cyber kriminalac pod nadimkom Bestoffer. Nedavno je hvalio svoj trojanac kao "ozbiljan proizvod za ljude sa znanjem i iskustvom".

Stručnjak za analizu zlonamjernog koda Group-IB Ivan Pisarjev u svom istraživanju detaljno opisuje kako Gustuff funkcionira i koja je njegova opasnost.

Na koga cilja Gustuff

Gustuff pripada novoj generaciji zlonamjernih programa s potpuno automatiziranim funkcijama. Prema riječima razvijača, trojanac je nova poboljšana verzija zlonamjernog programa AndyBot, koji od novembra 2017. napada telefone s Android operativnim sistemom i krade novac putem phishing web formi koje se maskiraju kao mobilne aplikacije poznatih međunarodnih banaka i platnih sistema. Bestoffer je izvijestio da je cijena najma "Gustuff Bot" iznosila 800 dolara mjesečno.

Analiza uzorka Gustuff pokazala je da potencijalno trojanac cilja klijente koji koriste mobilne aplikacije najvećih banaka, kao što su Bank of America, Bank of Scotland, J.P.Morgan, Wells Fargo, Capital One, TD Bank, PNC Bank, kao i kriptovalutne novčanike Bitcoin Wallet, BitPay, Cryptopay, Coinbase i druge.

Prvobitno kreiran kao klasični bankovni trojanac, u trenutnoj verziji Gustuff je značajno proširio popis potencijalnih ciljeva za napad. Osim Android aplikacija banaka, fintech kompanija i kripto servisa, Gustuff cilja korisnike aplikacija tržišnih mjesta, online prodavnica, platnih sistema i messendžera. Konkretno, PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut i druge.

Ulazna tačka: oslanjanje na masovno zaražavanje

Za Gustuff je karakterističan "klasični" način provale na Android pametne telefone putem SMS poruka sa linkovima na APK. Kada trojan zarazi Android uređaj, po naredbi servera može nastaviti širenje Gustuff-a kroz adresar inficiranog telefona ili kroz bazu podataka servera. Funkcionalnosti Gustuff-a su dizajnirane za masovno zaražavanje i maksimalnu kapitalizaciju biznisa svojih operatera – sadrži jedinstvenu funkciju "autounos" u legitimne mobilne bankarske aplikacije i kripto novčanike, što omogućava ubrzanu i masovnu krađu novca.

Istraživanje trojana pokazalo je da je funkcija autounosa implementirana uz pomoć Accessibility Service — servisa za osobe sa invaliditetom. Gustuff nije prvi trojan koji uspešno zaobilazi zaštitu od interakcije sa elementima drugih aplikacija putem ovog Android servisa. Ipak, korišćenje Accessibility Service u kombinaciji sa autounosom ostaje još uvek prilično retka pojava.

Nakon preuzimanja na telefon žrtve, Gustuff, koristeći Accessibility Service, stiče mogućnost interakcije sa elementima drugih aplikacija (bankarskih, kriptovalutnih, kao i aplikacija za online kupovinu, razmenu poruka i dr.), vršeći potrebne radnje za napadače. Na primer, po naredbi servera, trojan može da pritisne dugmad i menja vrednosti tekstualnih polja u bankarskim aplikacijama. Korišćenje mehanizma Accessibility Service omogućava trojanu da zaobđe mehanizme zaštite koje banke koriste protiv mobilnih trojana prethodne generacije, kao i promene u politici sigurnosti koje je Google implementirao u nove verzije operativnog sistema Android. Tako Gustuff "može" da isključi zaštitu Google Protect: prema tvrdnjama autora, ova funkcija se aktivira u 70% slučajeva.

Kako Android trojan Gustuff izvlači novac (fiat i kriptovalutu) s vaših računa

Gustuff također može prikazivati lažne PUSH obavijesti s ikonama legitimnih mobilnih aplikacija. Korisnik klikne na PUSH obavijest i vidi phishing prozor preuzet s poslužitelja, gdje sam unosi tražene podatke o bankovnoj kartici ili kripto novčaniku. U drugom scenariju rada Gustuff-a dolazi do otvaranja aplikacije u ime koje je prikazana PUSH obavijest. U ovom slučaju, zlonamjerni program po naredbi poslužitelja putem Accessibility Service može ispunjavati polja obrasca bankovne aplikacije za prijevaru.

Funkcionalnosti Gustuff-a također uključuju slanje informacija o zaraženom uređaju na poslužitelj, mogućnost čitanja/slanja SMS poruka, slanje USSD zahtjeva, pokretanje SOCKS5 Proxy, odlazak na poveznicu, slanje datoteka (uključujući skenove dokumenata, snimke zaslona, fotografije) na poslužitelj, resetiranje uređaja na tvorničke postavke.

Analiza zlonamjernog programa

Prije instalacije zlonamjernog aplikacije, OS Android korisniku prikazuje prozor koji sadrži popis traženih dozvola od Gustuff-a:

Kako Android trojan Gustuff izvlači novac (fiat i kriptovalutu) s vaših računa
Instalacija aplikacije će se dogoditi samo nakon što korisnik da svoj pristanak. Nakon pokretanja aplikacije, trojanac će pokazati korisniku prozor:

Kako Android trojan Gustuff izvlači novac (fiat i kriptovalutu) s vaših računa
Nakon čega će ukloniti svoju ikonu.

Gustuff je upakiran, prema riječima autora, pakiračem FTT. Nakon pokretanja, aplikacija periodički pristupa CnC poslužitelju u svrhu dobivanja naredbi. U nekoliko istraženih datoteka korišten je IP adresa kao upravljački poslužitelj 88.99.171[.]105 (u daljnjem tekstu označavat ćemo kao <%CnC%>).

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

Kao odgovor očekuje se JSON sljedećeg formata:

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

Prilikom svakog pristupa, aplikacija šalje informacije o zaraženom uređaju. Format poruke prikazan je u nastavku. Važno je napomenuti da su polja full, extra, apps i permission – opcionalna i bit će poslana samo u slučaju zahtjeva od 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":<fault Sms Application%>,
 "isDefaultSmsApp":<%Current application is Default Sms Application%>,
 "dateTime":<%Current date time%>,
 "batteryLevel":<ttery 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":<vice 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%>
} 

Pohrana konfiguracijskih podataka

Gustuff pohranjuje važne informacije potrebne za rad u preference datoteci. Ime datoteke kao i imena parametara u njoj su rezultati izračunavanja MD5 sažetak stringa 15413090667214.6.1<%name%>, gdje <%name%> — izvorno ime-vrijednost. Python interpretacija funkcije za generiranje imena:

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

Dalje ćemo označavati kao nameGenerator(input).
Na taj način, ime prve datoteke: nameGenerator(«API_SERVER_LIST»), sadrži vrijednosti sa sljedećim imenima:

Ime varijableVrijednost
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 na zadano. Ako je zastavica postavljena, šalje SMS poruke na CnC.
nameGenerator(«SMS_ROOT_NUMBER»)Broj telefona na koji će biti poslane SMS poruke primljene zaraženim uređajem. Po defaultu null.
nameGenerator(«SMS_ROOT_NUMBER_RESEND»)Podrazumevana oznaka je resetovana. Ako je postavljena – prilikom primanja SMS-a zaraženim uređajem, biće poslat na root broj.
nameGenerator(«DEFAULT_APP_SMS»)Podrazumevana oznaka je resetovana. Ako je ovaj flag postavljen – aplikacija će obrađivati dolazne SMS poruke.
nameGenerator(«DEFAULT_ADMIN»)Podrazumevana oznaka je resetovana. Ako je flag postavljen – aplikacija ima administratorska prava.
nameGenerator(«DEFAULT_ACCESSIBILITY»)Podrazumevana oznaka je resetovana. Ako je flag postavljen – pokrenuta je usluga koja koristi Accessibility Service.
nameGenerator(«APPS_CONFIG»)JSON objekat koji sadrži listu akcija koje je potrebno izvršiti kada dođe do Accessibility događaja vezanog za određenu aplikaciju.
nameGenerator(«APPS_INSTALLED»)Čuva listu aplikacija instaliranih na uređaju.
nameGenerator(«IS_FIST_RUN»)Flag se resetuje pri prvom pokretanju.
nameGenerator(«UNIQUE_ID»)Sadrži jedinstveni identifikator. Generiše se pri prvom pokretanju bota.

Modul za obradu komandi sa servera

Aplikacija čuva adrese CnC servera u obliku niza kodiranih sa Base85 stringova. Lista CnC — poslužitelja može biti promenjena prilikom pristizanja odgovarajuće komande, u tom slučaju adrese će se čuvati u preference datoteci.

U odgovoru na zahtev server šalje aplikaciji komandu. Vredi napomenuti da su komande i parametri predstavljeni u JSON formatu. Aplikacija može obraditi sledeće komande:

KomandaOpis
forwardStartZapočni slanje primljenih SMS poruka zaraženim uređajem na CnC server.
forwardStopZavrši slanje primljenih SMS poruka zaraženim uređajem na CnC server.
ussdRunIzvrši USSD zahtev. Broj na koji treba izvršiti USSD zahtev nalazi se u JSON polju „number“.
sendSmsPošalji jednu SMS poruku (ako je potrebno, poruka se „raspe“ na delove). Kao parametar, komanda prihvata JSON objekat koji sadrži polja „to“ — broj odredišta i „body“ — telo poruke.
sendSmsAbPošalji SMS poruke (ako je potrebno, poruka se „raspe“ na delove) svima sa liste kontakata zaraženog uređaja. Interval između slanja poruka – 10 sekundi. Telo poruke se nalazi u JSON polju „body“.
sendSmsMassŠaljite SMS poruke (ako je potrebno, poruka se «rascjepka» na dijelove) kontaktima navedenim u parametrima komande. Interval između slanja poruka je 10 sekundi. Kao parametar, komanda prima JSON niz (polje «sms»), čiji elementi sadrže polja «to» — broj odredišta i «body» — tijelo poruke.
changeServerOva komanda može primiti vrijednost kao parametar s ključem «url» — tada bot mijenja vrijednost nameGenerator(“SERVER_URL”), ili «array» — tada bot zapisuje niz u nameGenerator(“API_SERVER_LIST”). Na taj način aplikacija mijenja adresu CnC servera.
adminNumberKomanda je namijenjena radu s root brojem. Komanda prima JSON objekt s sljedećim parametrima: «number» — promijeniti nameGenerator(“ROOT_NUMBER”) na primljenu vrijednost, «resend» — promijeniti nameGenerator(“SMS_ROOT_NUMBER_RESEND”), «sendId» — poslati na nameGenerator(“ROOT_NUMBER”) uniqueID.
updateInfoPošaljite na server informacije o zaraženom uređaju.
wipeDataKomanda je namijenjena brisanju korisničkih podataka. Ovisno o tome pod kojim imenom je aplikacija pokrenuta, dolazi do potpunog brisanja podataka s ponovnim pokretanjem uređaja (primarni korisnik) ili brisanja samo korisničkih podataka (sekundarni korisnik).
socksStartPokrenite Proxy modul. Rad modula opisan je u posebnom odjeljku.
socksStopZaustavite rad Proxy modula.
openLinkIdite na poveznicu. Poveznica se nalazi u JSON parametru s ključem «url». Za otvaranje poveznice koristi se «android.intent.action.VIEW».
uploadAllSmsPošaljite na server sve primljene SMS poruke na uređaju.
uploadAllPhotosPošaljite sliku s zaraženog uređaja na URL. URL dolazi kao parametar.
uploadFilePošaljite datoteku s zaraženog uređaja na URL. URL dolazi kao parametar.
uploadPhoneNumbersPošaljite na server brojeve telefona iz popisa kontakata. Ako kao parametar dolazi JSON objekt s ključem «ab», aplikacija dobiva popis kontakata iz telefonskog imenika. Ako kao parametar dolazi JSON objekt s ključem «sms», aplikacija čita popis kontakata s pošiljatelja SMS poruka.
changeArchiveAplikacija preuzima datoteku s adrese koja se prosljeđuje kao parametar pod ključem «url». Preuzeta datoteka se sprema pod imenom «archive.zip». Nakon toga, aplikacija dekompresira datoteku, ako je potrebno koristeći lozinku za arhivu «b5jXh37gxgHBrZhQ4j3D». Dekomprimirane datoteke spremaju se u direktorij [external storage]\/hgps. U tom direktoriju aplikacija pohranjuje web-lažnjake (opisano u nastavku).
akcijeKomanda je namijenjena radu s Action Service-om, koji je opisan u zasebnom odjeljku.
testNe radi ništa.
downloadKomanda je namijenjena preuzimanju datoteke s udaljenog servera i spremanju u direktorij «Downloads». URL i ime datoteke dolaze kao parametri, polja u JSON-objektu parametre su «url» i «fileName».
removeBriše datoteku iz direktorija «Downloads». Ime datoteke dolazi u JSON-parametru s ključem «fileName». Standardno ime datoteke je «tmp.apk».
notificationPrikaži obavijest s opisnim tekstovima i naslovom koji određuje upravljački server.

Format komande notification:

{
 "results" : "OK",
 "command":{
 "id": <%id%>,
 "command":"notification",
 "timestamp":<%Server Timestamp%>,
 "params":{
 "openApp":<%Open original app or not%>,
 "array":[
 {"title":<%Title text%>,
 "desc":<scription text%>,
 "app":<%Application name%>}
 ]
 },
 },
}

Obavijest koju stvara istraživana datoteka izgleda identično obavijestima koje stvara aplikacija navedena u polju app. Ako je vrijednost polja openApp — True, prilikom otvaranja obavijesti pokreće se aplikacija navedena u polju app. Ako je vrijednost polja openApp — False, tada:

  • otvara se phishing prozor čiji se sadržaj preuzima iz direktorija \/hgps\/
  • otvara se phishing prozor čiji se sadržaj preuzima s servera ?id=&app=
  • otvorit će se phishing prozor, maskiran kao Google Play Kartica, s mogućnošću unosa podataka kartice.

Rezultat izvršenja svake komande aplikacija šalje na set_state.php u obliku JSON-objekta sljedećeg formata:

{
    "command":
    {
        "command":,
        "id":,
        "state":
    }
    "id":
}

ActionsService
Na popisu komandi koje aplikacija obrađuje nalazi se action. Pri primanju komande, modul za obradu komandi obraća se ovom servisu s ciljem izvršavanja proširene komande. Kao parametar, servis prima JSON-objekt. Servis može izvršiti sljedeće komande:

1. PARAMS_ACTION — prilikom primanja takve naredbe, usluga prvo dobiva iz JSON parametra vrijednost za ključ Type, koja može biti sljedeća:

  • serviceInfo – podkomanda dobiva iz JSON parametra vrijednost za ključ includeNotImportant. Ako je zastavica jednaka True — aplikacija postavlja zastavicu FLAG_ISOLATED_PROCESS na uslugu koja koristi Accessibility Service. Tako će usluga biti pokrenuta u zasebnom procesu.
  • root — dobiti i poslati na poslužitelj informacije o prozoru koji je trenutno u fokusu. Aplikacija dobiva informacije pomoću klase AccessibilityNodeInfo.
  • admin — zatražiti administratorska prava.
  • delay — suspendirati rad ActionsService na onoliko milisekundi koliko je navedeno u parametru za ključ «data».
  • windows — poslati popis prozora vidljivih korisniku.
  • install — instalirati aplikaciju na zaraženom uređaju. Ime paketa — arhiva nalaze se u ključu «fileName». Sama arhiva se nalazi u direktoriju Downloads.
  • global – podkomanda je namijenjena za prelazak sa trenutnog prozora:
    • na izbornik Quick Settings
    • natrag
    • kućna stranica
    • na obavijesti
    • na prozor nedavno otvorenih aplikacija

  • launch — pokrenuti aplikaciju. Ime aplikacije dolazi kao parametar za ključ data.
  • sounds — promijeniti zvučni režim na tiho.
  • unlock — uključuje osvjetljenje ekrana i tipkovnice na punu svjetlinu. Aplikacija izvršava ovu radnju pomoću WakeLock, i u tagu navodi string [Application lable]:INFO
  • permissionOverlay — funkcija nije implementirana (odgovor na izvršenje naredbe — {"message":"Not support"} ili {"message":"low sdk"})
  • gesture — funkcija nije implementirana (odgovor na izvršenje naredbe — {"message":"Not support"} ili {"message":"Low API"})
  • permissions — ova naredba je potrebna za zahtjev prava za aplikaciju. Međutim, funkcija zahtjeva nije implementirana, tako da naredba nema smisla. Popis traženih prava dolazi kao JSON niz s ključem «permissions». Standardni popis:
    • 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

  • open — prikazati phishing prozor. Ovisno o parametru koji dolazi s poslužitelja, aplikacija može prikazati sljedeće phishing prozore:
    • Prikazati phishing prozor čiji je sadržaj naveden u datoteci u direktoriju /hgps/Rezultat interakcije korisnika s prozorom bit će poslan na adresu /records.php
    • Prikaži phishing prozor čiji se sadržaj unaprijed učitava s adrese ?id=&app=Rezultat interakcije korisnika s prozorom bit će poslan na adresu /records.php
    • Prikaži phishing prozor maskiran kao Google Play kartica.

  • interaktivno — naredba je namijenjena interakciji s elementima prozora drugih aplikacija putem AccessibilityService. Za interakciju je implementirana posebna usluga. Istraživana aplikacija može komunicirati s prozorima:
    • Aktivnim u ovom trenutku. U tom slučaju, parametar sadrži id ili tekst (naziv) objekta s kojim je potrebno komunicirati.
    • Vidljivim korisniku u trenutku izvršenja naredbe. Aplikacija odabire prozore prema id-u.

    Nakon što se dobiju objekti AccessibilityNodeInfo za zanimljive elemente prozora, aplikacija ovisno o parametrima može izvršavati radnje:

    • focus — usredotočiti se na objekt.
    • click — kliknuti na objekt.
    • actionId — izvršiti radnju prema ID-u.
    • setText — promijeniti tekst objekta. Promjena teksta moguća je na dva načina: izvršavanjem radnje ACTION_SET_TEXT (ako je verzija Android zaraženog uređaja starija ili jednaka LOLLIPOP), ili stavljanjem stringa u međuspremnik i njegovim umetanjem u objekt (za novije verzije). Ova naredba može se koristiti za promjenu podataka u banci aplikaciji.

2. PARAMS_ACTIONS — to isto što i PARAMS_ACTION, samo dolazi kao JSON niz naredbi.

Čini se da će mnogima biti zanimljivo kako izgleda funkcija interakcije s elementima prozora druge aplikacije. Tako je ostvarena ova funkcionalnost 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;
}

Na taj način, uz pravilno postavljanje, kontrolni server Gustuff može ispuniti tekstualna polja u aplikaciji za bankarstvo i pritisnuti neophodne tipke za obavljanje transakcija. Trojanski konj čak ne mora proći autorizaciju u aplikaciji — dovoljno je poslati naredbu za prikaz PUSH obavijesti uz otvaranje prethodno instalirane aplikacije za bankarstvo. Korisnik će sam proći autorizaciju, nakon čega će Gustuff moći izvršiti automatsku uplatu.

Modul za obradu SMS poruka

Aplikacija instalira obrtnika događaja na primitak SMS poruka zaraženim uređajem. Istraživana aplikacija može primati naredbe od operatera, koje dolaze u tijelu SMS poruka. Naredbe dolaze u formatu:

7!5=<se64 encoded command%>

Aplikacija pretražuje sve dolazne SMS poruke za niz 7!5=, prilikom otkrivanja reda – dekodira Base64 niz s pomakom 4 i izvršava naredbu. Naredbe su slične onima s CnC. Rezultat izvršenja šalje se na isti broj s kojeg je naredba poslana. Format odgovora:

7*5=<se64 encode of «result_code command»%>

Opcionalno, aplikacija može slati sve primljene poruke na Root-broj. Za to u preference datoteci mora biti naveden Root-broj i postavljena oznaka za preusmjeravanje poruka. SMS-poruka šalje se na broj napadača u formatu:

—

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

{
    "id":,
    "sms":
    {
        "text":,
        "number":,
        "date":
    }
}

Ako je postavljena oznaka nameGenerator(«DEFAULT_APP_SMS») – aplikacija zaustavlja obradu SMS-poruke i čisti popis primljenih poruka.

Proxy modul

U istraživanom se aplikaciji nalazi Backconnect Proxy modul (dalje Proxy modul), koji ima zasebnu klasu, koja uključuje statičke polja s konfiguracijom. Konfiguracijski podaci pohranjuju se u uzorku u otvorenom obliku:

Kako Android trojan Gustuff izvlači novac (fiat i kriptovalutu) s vaših računa

Sve radnje koje provodi Proxy modul logiraju se u datoteke. Za to aplikacija u External Storage stvara direktorij s nazivom «logs» (polje ProxyConfigClass.logsDir u konfiguracijskoj klasi), u kojem se pohranjuju log-datoteke. Logiranje se odvija u datoteke s imenima:

  1. main.txt – u ovu datoteku se logira rad klase nazvane CommandServer. Dalje, logiranje niza str u ovu datoteku ćemo označavati kao mainLog(str).
  2. session-.txt — u ovu datoteku se pohranjuju log-podaci povezani s određenom sesijom proksiranja. Dalje, logiranje niza str u ovu datoteku ćemo označavati kao sessionLog(str).
  3. server.txt – u ovu datoteku se logira svi podaci, zapisani u gore opisane datoteke.

Format log-podataka:

<te%> [Thread[<%thread id%>], id[]]: log-string

Izuzeci koji se javljaju tijekom rada Proxy modula također se logiraju u datoteku. Za to aplikacija formira JSON objekt formata:

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

Nakon toga, konvertira ga u string predstavljanje i logira.

Pokretanje Proxy modula se vrši nakon primanja odgovarajuće komande. Kada primi komandu za pokretanje Proxy modula, aplikacija pokreće servis pod nazivom MainService, koji je odgovoran za upravljanje radom Proxy modula – njegovim pokretanjem i zaustavljanjem.

Faze pokretanja servisa:

1. Pokreće tajmer koji se aktivira jednom u minuti i proverava aktivnost Proxy modula. Ako modul nije aktivan – pokreće ga.
Takođe, pri aktivaciji događaja android.net.conn.CONNECTIVITY_CHANGE pokreće se Proxy modul.

2. Aplikacija stvara wake-lock sa parametrom PARTIAL_WAKE_LOCK i zadržava ga. Tako sprečava CPU uređaja da pređe u režim spavanja.

3. Pokreće klasu obrade komandi Proxy modula, prethodno logirajući string mainLog("start server") i

Server::start() host[], commandPort[], proxyPort[]

gdje proxy_cnc, command_port i proxy_port su parametri dobijeni iz konfiguracije Proxy servera.

Klasa obrade komandi nosi naziv CommandConnection. Odmah nakon pokretanja preduzima sledeće radnje:

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

{
    "id":,
    "imei":,
    "imsi":,
    "model":,
    "manufacturer":,
    "androidVersion":,
    "country":,
    "partnerId":,
    "packageName":,
    "networkType":,
    "hasGsmSupport":,
    "simReady":,
    "simCountry":,
    "networkOperator":,
    "simOperator":,
    "version":
}

Gdje:

  • id – identifikator, pokušava da dobije iz Shared Preference fajla pod nazivom "x" vrednost sa poljem "id". Ako nije moguće dobiti ovu vrednost — generiše novu. Tako Proxy modul ima svoj identifikator, koji se generiše slično Bot ID.
  • imei — IMEI uređaja. Ako dođe do greške prilikom dobijanja vrednosti — umesto ovog polja biće upisano tekstualno objašnjenje greške.
  • imsi — Međunarodni identitet mobilnog pretplatnika uređaja. Ako dođe do greške prilikom dobivanja vrijednosti, umjesto ovog polja bit će zabilježena poruka o grešci.
  • model — Naziv proizvoda vidljiv krajnjem korisniku.
  • manufacturer — Proizvođač proizvoda/ hardvera (Build.MANUFACTURER).
  • androidVersion — niz u formatu „ (),“
  • country — Trenutačna lokacija uređaja.
  • partnerId – prazni niz.
  • packageName – naziv paketa.
  • networkType — tip trenutne mrežne veze (primjer: „WIFI“, „MOBILE“). U slučaju greške vraća null.
  • hasGsmSupport – true – ako telefon podržava GSM, inače false.
  • simReady – stanje SIM kartice.
  • simCountry — ISO kod zemlje (na temelju davatelja SIM kartice).
  • networkOperator — naziv operatera. Ako dođe do greške prilikom dobivanja vrijednosti, umjesto ovog polja bit će zabilježena poruka o grešci.
  • simOperator — Ime davatelja usluga (SPN). Ako dođe do greške prilikom dobivanja vrijednosti, umjesto ovog polja bit će zabilježena poruka o grešci.
  • version — Ovo polje se čuva u konfiguracijskom razredu, za ispitivane verzije bota bilo je jednako „1.6“.

5. Prelazi u stanje čekanja komandi s poslužitelja. Komande s poslužitelja dolaze u formatu:

  • 0 offset – komanda
  • 1 offset – sessionId
  • 2 offset – duljina
  • 4 offset — podaci

Kada dođe komanda, aplikacija evidentira:
mainLog("Header { sessionId, type[], length[] }")

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

NameKomandaDataOpis
connectionId0ID vezeStvoriti novu vezu
SLEEP3TimeObustaviti rad Proxy-modula
PING_PONG4—Poslati PONG poruku

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

Kada dođe komanda connectionId (za stvaranje nove veze) CommandConnection stvara instancu klase ProxyConnection.

  • U proksiranju sudjeluju dvije klase: ProxyConnection i kraj. Prilikom stvaranja klase ProxyConnection događa se povezivanje na adresu ProxyConfigClass.host: ProxyConfigClass.proxyPort i prijenos JSON objekta:

 {
    "id":
}

U odgovoru poslužitelj šalje SOCKS5 poruku, koja sadrži adresu udaljenog poslužitelja s kojim je potrebno uspostaviti vezu. Interakcija s tim poslužiteljem odvija se putem klase kraj. Shematski, uspostavu veze možemo prikazati na sljedeći način:

Kako Android trojan Gustuff izvlači novac (fiat i kriptovalutu) s vaših računa

Mrežne interakcije

Kako bi se spriječila analiza prometa od strane mrežnih sniffera, interakcija između CnC servera i aplikacije može biti zaštićena putem SSL protokola. Svi preneseni podaci, kako s servera, tako i na server, su predstavljeni u JSON formatu. Aplikacija tijekom rada izvršava sljedeće zahtjeve:

  • http:///api/v1/set_state.php — rezultat izvršavanja naredbe.
  • http://<%CnC%>/api/v1/get.php — primanje naredbe.
  • http:///api/v1/load_sms.php — preuzimanje SMS poruka sa zaraženog uređaja.
  • http:///api/v1/load_ab.php — preuzimanje popisa kontakata sa zaraženog uređaja.
  • http:///api/v1/aevents.php – zahtjev se šalje prilikom ažuriranja postavki u preference datoteci.
  • http:///api/v1/set_card.php — preuzimanje podataka dobivenih putem phishing prozora koji se maskira kao Google Play Market.
  • http:///api/v1/logs.php – preuzimanje log podataka.
  • http:///api/v1/records.php – preuzimanje podataka dobivenih putem phishing prozora.
  • http:///api/v1/set_error.php – obavijest o nastaloj pogrešci.

Preporuke

Kako bi zaštitile svoje klijente od prijetnje mobilnih trojanskih virusa, tvrtke bi trebale koristiti sveobuhvatna rješenja koja omogućuju praćenje i upozoravanje na zlonamjernu aktivnost bez instaliranja dodatnog softvera na korisničke uređaje.

Za to, potpisne metode otkrivanja mobilnih trojanskih virusa treba pojačati tehnologijama analize ponašanja kako korisnika, tako i same aplikacije. Također, zaštita bi trebala uključivati funkciju identifikacije uređaja koristeći tehnologiju digitalnih otisaka, što će omogućiti prepoznavanje kada se račun koristi s nespecifičnog uređaja, koji može biti u rukama prevaranta.

Ključna točka je prisutnost mogućnosti analize među kanalima, što omogućava tvrtkama da kontroliraju rizike koji se javljaju ne samo na internetskoj, već i na mobilnoj strani, na primjer, u aplikacijama za mobilno bankarstvo, za transakcije s kriptovalutama i u svim drugim situacijama gdje se mogu izvoditi financijske transakcije.

Sigurnosna pravila za korisnike:

  • ne instalirajte aplikacije za mobilne uređaje s operativnim sistemom Android iz drugih izvora osim Google Playa, obratite posebnu pažnju na tražena dopuštenja aplikacije;
  • redovito instalirajte ažuriranja operativnog sistema Android;
  • obratite pažnju na proširenja učitanih datoteka;
  • ne posjećujte sumnjive resurse;
  • ne kliknite na linkove primljene u SMS porukama.

Učešće Sjeme Roagčeva, mlađeg stručnjaka za istraživanje zloćudnog koda Laboratorije računalne forenzike Group-IB.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster