Kot Android- Trojanec Gustuff pobere smetano (fiat in kripto) z vaših računov

Kot Android- Trojanec Gustuff pobere smetano (fiat in kripto) z vaših računov

Ravno pred dnevi Group-IB poročali o mobilni dejavnosti Android- trojanski konj Gustuff. Deluje izključno na mednarodnih trgih in napada stranke 100 največjih tujih bank, mobilne uporabnike 32 kripto denarnic in večja spletna mesta za e-trgovino. Razvijalec Gustuffa, rusko govoreči kibernetski kriminalec z vzdevkom Bestoffer, je svojega trojanskega konja nedavno pohvalil 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 nova in izboljšana različica zlonamerne programske opreme AndyBot, ki od novembra 2017 napada telefone s tem operacijskim sistemom. Android in krade denar prek spletnih obrazcev za lažno predstavljanje, prikritih kot mobilne aplikacije znanih mednarodnih bank in plačilnih sistemov. Bestoffer je poročal, da je cena najema za "Gustuff Bot" znašala 800 dolarjev 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.

Gustuff, ki je bil prvotno ustvarjen kot klasični bančni trojanec, je v trenutni različici znatno razširil svoj seznam potencialnih tarč za napad. Poleg tega Android- aplikacije bank, fintech podjetij in kripto storitev, Gustuff cilja na uporabnike tržnih aplikacij, spletnih trgovin, plačilnih sistemov in aplikacij za sporočanje. Natančneje, PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut in druge.

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

Za Gustuff je značilen "klasičen" vektor penetracije Android- pametne telefone prek SMS sporočil s povezavami do datotek APK. Ko so okuženi AndroidKo je naprava okužena, lahko trojanski konj na ukaz strežnika naprej širi Gustuff prek baze podatkov o stikih okuženega telefona ali baze podatkov strežnika. Funkcionalnost Gustuffa je zasnovana za množično okužbo in maksimalno poslovno kapitalizacijo za njegove operaterje – ima edinstveno funkcijo »samodejnega izpolnjevanja« za legitimne aplikacije za mobilno bančništvo in kripto denarnice, kar pospeši in poveča krajo sredstev.

Pregled trojanca je pokazal, da je njegova funkcija samodejnega nalaganja implementirana z uporabo storitve Accessibility Service, storitve za ljudi z invalidnostjo. Gustuff ni prvi trojanec, ki je uspešno zaobšel zaščito pred interakcijo z elementi oken drugih aplikacij z uporabo te storitve. AndroidVendar pa je uporaba storitve dostopnosti v kombinaciji s samodejnim nalaganjem še vedno precej redka.

Ko se Gustuff naloži na telefon žrtve, s pomočjo storitve Accessibility Service pridobi možnost interakcije z elementi drugih aplikacij (bančništvo, kriptovalute, spletno nakupovanje, sporočanje itd.) in izvaja dejanja, ki jih želijo napadalci. Na primer, trojanec lahko na ukaz strežnika klikne gumbe in spremeni vrednosti besedilnih polj v bančnih aplikacijah. Uporaba storitve Accessibility Service trojancu omogoča, da zaobide zaščitne mehanizme, ki jih banke uporabljajo za boj proti starejšim mobilnim trojancem, pa tudi spremembe varnostnih politik, ki jih Google uvaja v novejših različicah operacijskih sistemov. AndroidGustuff lahko na primer onemogoči Google Protect: po besedah ​​avtorja ta funkcija deluje v 70 % primerov.

Kot Android- Trojanec Gustuff pobere 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 za operacijski sistem Android uporabniku prikaže okno s seznamom pravic, ki jih zahteva Gustuff:

Kot Android- Trojanec Gustuff pobere 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:

Kot Android- Trojanec Gustuff pobere 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 spremenljivkeVrednost
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-jev - strežniki je mogoče spremeniti po prejemu ustreznega ukaza, v tem primeru bodo naslovi shranjeni v datoteki s preferencami.

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:

EkipaOpis
forwardStartZačnite pošiljati sporočila SMS, ki jih prejme okužena naprava, na strežnik CnC.
naprejStopPrenehajte pošiljati sporočila SMS, ki jih prejme okužena naprava, na strežnik CnC.
ussdRunIzvedite zahtevo USSD. Številka, na katero morate poslati zahtevo USSD, se nahaja v polju JSON »številka«.
pošlji SMSPoš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.
sendSmsAbPoš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"
sendSmsMassPoš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.
changeServerTa 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.
adminNumberUkaz 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.
updateInfoPošljite informacije o okuženi napravi na strežnik.
brisanje podatkovUkaz 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četekZaženite modul Proxy. Delovanje modula je opisano v posebnem razdelku.
nogaviceStopZaustavite modul proxy.
openLinkSledite povezavi. Povezava se nahaja v parametru JSON pod ključem “url”. »android.intent.action.VIEW« se uporablja za odpiranje povezave.
uploadAllSmsPošlji vsa sporočila SMS, ki jih prejme naprava, na strežnik.
uploadAllPhotosPošlji slike iz okužene naprave na URL. URL pride kot parameter.
naloži datotekoPošljite datoteko na URL iz okužene naprave. URL pride kot parameter.
uploadPhoneNumbersPoš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.
changeArchiveAplikacija 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).
dejavnostiUkaz je zasnovan tako, da deluje s storitvijo Action Service, ki je opisana v ločenem razdelku.
TestPočeti nič.
prenesiUkaz 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«.
odstraniOdstrani datoteko iz imenika »Prenosi«. Ime datoteke je v parametru JSON s ključem »fileName«. Standardno ime datoteke je »tmp.apk«.
ObvestiloPokaž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 Android okužena naprava je mlajša 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:

Kot Android- Trojanec Gustuff pobere 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:

ImeUkazdatumOpis
ConnectionId0ID povezaveUstvari novo povezavo
SLEEP3časZaustavite modul proxy
NAMIZNI TENIS4 -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:

Kot Android- Trojanec Gustuff pobere 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 mobilne naprave z operacijskim sistemom Android iz virov, ki niso Google Play, bodite še posebej pozorni na pravice, ki jih zahteva aplikacija;
  • redno nameščajte posodobitve operacijskega sistema 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

Kupite zanesljivo gostovanje za strani z DDoS zaščito, VPS VDS strežniki 🔥 Kupite zanesljivo spletno gostovanje z zaščito DDoS, VPS VDS strežniki | ProHoster