Hoe die Android Trojan Gustuff die room (fiat en crypto) van jou rekeninge afskep

Hoe die Android Trojan Gustuff die room (fiat en crypto) van jou rekeninge afskep

Net nou die dag Groep-IB berig oor die aktiwiteit van die mobiele Android Trojan Gustuff. Dit werk uitsluitlik in internasionale markte en val kliënte van die 100 grootste buitelandse banke aan, gebruikers van mobiele 32-crypto-beursies, sowel as groot e-handelsbronne. Maar die ontwikkelaar van Gustuff is 'n Russiessprekende kubermisdadiger onder die bynaam Bestoffer. Tot onlangs het hy sy Trojaan geprys as "'n ernstige produk vir mense met kennis en ervaring."

Kwaadwillige kode analise spesialis by Group-IB Ivan Pisarev in sy navorsing praat hy breedvoerig oor hoe Gustuff werk en wat die gevare daarvan is.

Na wie soek Gustuff?

Gustuff behoort aan 'n nuwe generasie wanware met ten volle outomatiese funksies. Volgens die ontwikkelaar het die Trojaan 'n nuwe en verbeterde weergawe van die AndyBot-wanware geword, wat sedert November 2017 Android-fone aanval en geld steel deur uitvissingswebvorms wat voorgedoen word as mobiele toepassings van bekende internasionale banke en betaalstelsels. Bestoffer het berig dat die Gustuff Bot-huurprys $800 per maand was.

Ontleding van die Gustuff-steekproef het getoon dat die Trojaan potensieel kliënte teiken wat mobiele toepassings van die grootste banke gebruik, soos Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, sowel as kripto-beursies Bitcoin Wallet, BitPay, Cryptopay, Coinbase, ens.

Oorspronklik geskep as 'n klassieke bank-Trojaan, in die huidige weergawe het Gustuff die lys van potensiële teikens vir aanval aansienlik uitgebrei. Benewens Android-toepassings vir banke, fintech-maatskappye en kriptodienste, is Gustuff gemik op gebruikers van marktoepassings, aanlynwinkels, betaalstelsels en kitsboodskappers. Veral PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut en ander.

Toegangspunt: berekening vir massa-infeksie

Gustuff word gekenmerk deur die "klassieke" vektor van penetrasie in Android-slimfone deur SMS-posse met skakels na APK's. Wanneer 'n Android-toestel met 'n Trojaan op bevel van die bediener besmet is, kan Gustuff verder versprei deur die kontakdatabasis van die besmette foon of deur die bedienerdatabasis. Gustuff se funksionaliteit is ontwerp vir massa-infeksie en maksimum kapitalisering van die besigheid van sy operateurs - dit het 'n unieke "outo-vul"-funksie in wettige mobiele banktoepassings en kripto-beursies, wat jou toelaat om die diefstal van geld te bespoedig en te skaal.

'n Studie van die Trojaan het getoon dat die outovul-funksie daarin geïmplementeer is met behulp van die Toeganklikheidsdiens, 'n diens vir mense met gestremdhede. Gustuff is nie die eerste Trojaan wat die beskerming teen interaksie met vensterelemente van ander toepassings wat hierdie Android-diens gebruik, suksesvol omseil nie. Die gebruik van Toeganklikheiddiens in kombinasie met 'n motorvul is egter nog redelik skaars.

Nadat dit na die slagoffer se foon afgelaai is, is Gustuff, deur die Toeganklikheidsdiens, in staat om interaksie te hê met vensterelemente van ander toepassings (bankdienste, kriptokurrency, sowel as toepassings vir aanlyn inkopies, boodskappe, ens.), en voer die aksies uit wat nodig is vir die aanvallers . Byvoorbeeld, op bevel van die bediener, kan 'n Trojaan knoppies druk en die waardes van teksvelde in banktoepassings verander. Deur die Toeganklikheiddiensmeganisme te gebruik, laat die Trojaan toe om die sekuriteitsmeganismes wat deur banke gebruik word om vorige generasie mobiele Trojane teen te werk te omseil, sowel as veranderinge in sekuriteitsbeleid wat deur Google in nuwe weergawes van die Android-bedryfstelsel geïmplementeer is. Dus, Gustuff "weet hoe" om Google Protect-beskerming te deaktiveer: volgens die skrywer werk hierdie funksie in 70% van die gevalle.

Hoe die Android Trojan Gustuff die room (fiat en crypto) van jou rekeninge afskep

Gustuff kan ook vals PUSH-kennisgewings vertoon met ikone van wettige mobiele toepassings. Die gebruiker klik op die PUSH-kennisgewing en sien 'n phishing-venster wat van die bediener afgelaai is, waar hy die aangevraagde bankkaart- of kripto-beursie-data invoer. In 'n ander Gustuff-scenario word die toepassing namens wie die PUSH-kennisgewing vertoon is, oopgemaak. In hierdie geval kan die wanware, op bevel van die bediener via die Toeganklikheidsdiens, die vormvelde van 'n bankaansoek vir 'n bedrieglike transaksie invul.

Gustuff se funksionaliteit sluit ook in die stuur van inligting oor 'n besmette toestel na die bediener, die vermoë om SMS-boodskappe te lees/stuur, die stuur van USSD-versoeke, die bekendstelling van SOCKS5 Proxy, die volg van 'n skakel, die stuur van lêers (insluitend fotoskanderings van dokumente, skermkiekies, foto's) na die bediener, stel die toestel terug na fabrieksinstellings.

Malware-analise

Voordat 'n kwaadwillige toepassing geïnstalleer word, wys die Android-bedryfstelsel vir die gebruiker 'n venster wat 'n lys regte bevat wat deur Gustuff versoek is:

Hoe die Android Trojan Gustuff die room (fiat en crypto) van jou rekeninge afskep
Die toepassing sal eers geïnstalleer word nadat die gebruiker se toestemming ontvang is. Nadat die toepassing geloods is, sal die Trojaan die gebruiker 'n venster wys:

Hoe die Android Trojan Gustuff die room (fiat en crypto) van jou rekeninge afskep
Daarna sal dit sy ikoon verwyder.

Gustuff word volgens die skrywer deur 'n pakker van FTT verpak. Na opstart kontak die toepassing gereeld die CnC-bediener om opdragte te ontvang. Verskeie lêers wat ons ondersoek het, het 'n IP-adres as die beheerbediener gebruik 88.99.171[.]105 (hierna sal ons dit aandui as <%CnC%>).

Na bekendstelling begin die program boodskappe na die bediener stuur http://<%CnC%>/api/v1/get.php.

Die antwoord sal na verwagting JSON in die volgende formaat wees:

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

Elke keer wanneer toegang tot die toepassing verkry word, stuur dit inligting oor die besmette toestel. Die boodskapformaat word hieronder getoon. Dit is opmerklik dat die velde Volle, ekstra, programme и permission - opsioneel en sal slegs gestuur word in die geval van 'n versoekopdrag van 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%>
} 

Stoor konfigurasiedata

Gustuff stoor operasionele belangrike inligting in 'n voorkeurlêer. Die lêernaam, sowel as die name van die parameters daarin, is die resultaat van die berekening van die MD5-som vanaf die string 15413090667214.6.1<%naam%>Waar <%name%> — aanvanklike naam-waarde. Python-interpretasie van die naamgenereringsfunksie:

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

In wat volg sal ons dit aandui as naam Generator (invoer).
So die eerste lêernaam is: naamGenerator("API_SERVER_LIST"), dit bevat waardes met die volgende name:

Veranderlike naam Waarde
naamGenerator("API_SERVER_LIST") Bevat 'n lys van CnC-adresse in die vorm van 'n skikking.
naamGenerator("API_SERVER_URL") Bevat die CnC-adres.
naamGenerator("SMS_UPLOAD") Die vlag is by verstek gestel. As die vlag gestel is, stuur SMS-boodskappe na CnC.
naamGenerator("SMS_ROOT_NUMBER") Telefoonnommer waarna SMS-boodskappe wat deur die besmette toestel ontvang is, gestuur sal word. Verstek is nul.
naamGenerator("SMS_ROOT_NUMBER_RESEND") Die vlag is by verstek skoongemaak. As dit geïnstalleer is, sal dit na die wortelnommer gestuur word wanneer 'n besmette toestel 'n SMS ontvang.
naamGenerator("DEFAULT_APP_SMS") Die vlag is by verstek skoongemaak. As hierdie vlag gestel is, sal die toepassing inkomende SMS-boodskappe verwerk.
naamGenerator("DEFAULT_ADMIN") Die vlag is by verstek skoongemaak. As die vlag gestel is, het die toepassing administrateurregte.
naamGenerator("DEFAULT_ACCESSIBILITY") Die vlag is by verstek skoongemaak. As die vlag gestel is, loop 'n diens wat die Toeganklikheiddiens gebruik.
naamGenerator("APPS_CONFIG") 'n JSON-voorwerp wat 'n lys van handelinge bevat wat uitgevoer moet word wanneer 'n Toeganklikheidsgebeurtenis wat met 'n spesifieke toepassing geassosieer word, geaktiveer word.
naamGenerator("APPS_INSTALLED") Stoor 'n lys van toepassings wat op die toestel geïnstalleer is.
naamGenerator("IS_FIST_RUN") Die vlag word met die eerste aanvang teruggestel.
naamGenerator("UNIQUE_ID") Bevat 'n unieke identifiseerder. Gegenereer wanneer die bot vir die eerste keer geloods word.

Module vir die verwerking van opdragte vanaf die bediener

Die toepassing stoor die adresse van CnC-bedieners in die vorm van 'n skikking wat deur base85 lyne. Die lys van CnC-bedieners kan verander word by ontvangs van die toepaslike opdrag, in welke geval die adresse in 'n voorkeurlêer gestoor sal word.

In reaksie op die versoek stuur die bediener 'n opdrag na die toepassing. Dit is opmerklik dat opdragte en parameters in JSON-formaat aangebied word. Die toepassing kan die volgende opdragte verwerk:

Span Beskrywing
vorentoeBegin Begin om SMS-boodskappe wat deur die besmette toestel ontvang is na die CnC-bediener te stuur.
vorentoeStop Hou op om SMS-boodskappe wat deur die besmette toestel ontvang is na die CnC-bediener te stuur.
ussdRun Voer USSD-versoek uit. Die nommer waarheen jy 'n USSD-versoek moet rig, is geleë in die JSON-veld "nommer".
stuurSms Stuur een SMS-boodskap (indien nodig, word die boodskap in dele "verdeel"). As 'n parameter neem die opdrag 'n JSON-voorwerp wat die velde "na" bevat - die bestemmingsnommer en "liggaam" - die liggaam van die boodskap.
stuurSmsAb Stuur SMS-boodskappe (indien nodig, word die boodskap in dele “verdeel”) aan almal in die kontaklys van die besmette toestel. Die interval tussen die stuur van boodskappe is 10 sekondes. Die liggaam van die boodskap is in die JSON-veld "body"
stuurSmsMass Stuur SMS-boodskappe (indien nodig, is die boodskap "verdeel" in dele) na die kontakte gespesifiseer in die opdragparameters. Die interval tussen die stuur van boodskappe is 10 sekondes. As 'n parameter neem die opdrag 'n JSON-skikking (die "sms"-veld), waarvan die elemente die velde "na" bevat - die bestemmingsnommer en "liggaam" - die liggaam van die boodskap.
veranderServer Hierdie opdrag kan 'n waarde neem met die sleutel "url" as 'n parameter - dan sal die bot die waarde van nameGenerator(“SERVER_URL”), of “array” verander - dan sal die bot die skikking na nameGenerator skryf (“API_SERVER_LIST”) Die toepassing verander dus die adres van die CnC-bedieners.
adminnommer Die opdrag is ontwerp om met 'n wortelgetal te werk. Die opdrag aanvaar 'n JSON-voorwerp met die volgende parameters: “nommer” — verander naamGenerator(“ROOT_NUMBER”) na die ontvangde waarde, “herstuur” — verander naamGenerator(“SMS_ROOT_NUMBER_RESEND”), “sendId” — stuur na naamGenerator(“ROOT_NUMBER” ) unieke ID.
Opdateer inligting; Opdateer informasie Stuur inligting oor die besmette toestel na die bediener.
vee data uit Die opdrag is bedoel om gebruikersdata uit te vee. Afhangende van watter naam die toepassing van stapel gestuur is, word óf die data heeltemal uitgevee met 'n toestelherlaai (primêre gebruiker), óf slegs gebruikerdata word uitgevee (sekondêre gebruiker).
sokkiesBegin Begin die Proxy-module. Die werking van die module word in 'n aparte afdeling beskryf.
sokkiesStop Stop die Proxy-module.
oopskakel Volg die skakel. Die skakel is geleë in die JSON parameter onder die "url" sleutel. "android.intent.action.VIEW" word gebruik om die skakel oop te maak.
laai AlleSms op Stuur alle SMS-boodskappe wat deur die toestel ontvang is na die bediener.
laai alle foto's op Stuur beelde vanaf 'n besmette toestel na 'n URL. Die URL kom as 'n parameter.
laai leêr op Stuur 'n lêer na 'n URL vanaf 'n besmette toestel. Die URL kom as 'n parameter.
laai Telefoonnommers op Stuur telefoonnommers vanaf jou kontaklys na die bediener. As 'n JSON-objekwaarde met die sleutel "ab" as 'n parameter ontvang word, ontvang die toepassing 'n lys kontakte uit die telefoonboek. As 'n JSON-voorwerp met die sleutel "sms" as 'n parameter ontvang word, lees die toepassing die lys kontakte van die senders van SMS-boodskappe.
veranderArgief Die toepassing laai die lêer af vanaf die adres wat as 'n parameter kom deur die "url"-sleutel te gebruik. Die afgelaaide lêer word gestoor met die naam “archive.zip”. Die toepassing sal dan die lêer uitpak, opsioneel deur die argiefwagwoord “b5jXh37gxgHBrZhQ4j3D” te gebruik. Die uitgepakte lêers word in die [eksterne berging]/hgps-gids gestoor. In hierdie gids stoor die toepassing webvervalsings (hieronder beskryf).
aksies Die opdrag is ontwerp om saam met Action Service te werk, wat in 'n aparte afdeling beskryf word.
toets Niks doen nie.
Aflaai Die opdrag is bedoel om 'n lêer van 'n afgeleë bediener af te laai en dit in die "Downloads"-gids te stoor. Die URL en lêernaam kom as 'n parameter, velde in die JSON-parametervoorwerp, onderskeidelik: "url" en "lêernaam".
verwyder Verwyder 'n lêer uit die "Downloads" gids. Die lêernaam kom in 'n JSON-parameter met die "fileName"-sleutel. Die standaard lêernaam is “tmp.apk”.
kennisgewing Wys 'n kennisgewing met beskrywing en titeltekste wat deur die bestuurbediener gedefinieer is.

Opdragformaat kennisgewing:

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

Die kennisgewing wat gegenereer word deur die lêer wat ondersoek word, lyk identies aan die kennisgewings wat gegenereer word deur die toepassing gespesifiseer in die veld artikels. As die veld waarde oopApp — Dit is waar, wanneer 'n kennisgewing oopgemaak word, word die toepassing wat in die veld gespesifiseer is, geloods artikels. As die veld waarde oopApp — Onwaar, dan:

  • 'n Uitvissing-venster word oopgemaak, waarvan die inhoud van die gids afgelaai word <%eksterne berging%>/hgps/<%lêernaam%>
  • 'n Uitvissing-venster word oopgemaak, waarvan die inhoud van die bediener afgelaai word <%url%>?id=<%Bot id%>&app=<%Application name%>
  • 'n Uitvissing-venster maak oop, vermom as 'n Google Play-kaart, met die geleentheid om kaartbesonderhede in te voer.

Die toepassing stuur die resultaat van enige opdrag na <%CnC%>stel_staat.php as 'n JSON-objek in die volgende formaat:

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

Aksiediens
Die lys van opdragte wat die toepassing verwerk, sluit in aksie. Wanneer 'n opdrag ontvang word, kry die opdragverwerkingsmodule toegang tot hierdie diens om die uitgebreide opdrag uit te voer. Die diens aanvaar 'n JSON-voorwerp as 'n parameter. Die diens kan die volgende opdragte uitvoer:

1. PARAMS_ACTION - wanneer so 'n opdrag ontvang word, ontvang die diens eers van die JSON-parameter die waarde van die Tipe-sleutel, wat soos volg kan wees:

  • diensinligting – die subopdrag kry die waarde per sleutel van die JSON-parameter sluit NieBelangrik in nie. As die vlag Waar is, stel die toepassing die vlag FLAG_ISOLATED_PROCESS na 'n diens wat die Toeganklikheiddiens gebruik. Op hierdie manier sal die diens in 'n aparte proses bekendgestel word.
  • wortel - ontvang en stuur na die bediener inligting oor die venster wat tans in fokus is. Die toepassing verkry inligting deur die AccessibilityNodeInfo-klas te gebruik.
  • admin - versoek administrateur regte.
  • vertraging - skort die ActionsService op vir die aantal millisekondes gespesifiseer in die parameter vir die "data" sleutel.
  • vensters - stuur 'n lys van vensters wat vir die gebruiker sigbaar is.
  • installeer - installeer die toepassing op die besmette toestel. Die naam van die argiefpakket is in die "lêernaam"-sleutel. Die argief self is in die Downloads-gids geleë.
  • globale – die subopdrag is bedoel om vanaf die huidige venster te navigeer:
    • op die Quick Settings-kieslys
    • gelede
    • tuis
    • aan kennisgewings
    • na die onlangs oopgemaakte toepassingsvenster

  • begin - begin die toepassing. Die toepassingsnaam kom as 'n parameter deur sleutel data.
  • klanke - verander die klankmodus na stilte.
  • ontsluit - skakel die agtergrond van die skerm en sleutelbord aan na volle helderheid. Die toepassing voer hierdie aksie uit met behulp van WakeLock, en spesifiseer die string [Application Lable]:INFO as 'n merker
  • toestemmingOverleg — die funksie is nie geïmplementeer nie (die reaksie op beveluitvoering is {"message":"Not support"} of {"message":"low sdk"})
  • gebaar — die funksie is nie geïmplementeer nie (die reaksie op beveluitvoering is {"message":"Not support"}of {"message":"Lae API"})
  • regte — hierdie opdrag is nodig om toestemmings vir die toepassing aan te vra. Die navraagfunksie is egter nie geïmplementeer nie, so die opdrag is betekenisloos. Die lys van gevraagde regte kom as 'n JSON-skikking met die "toestemmings" sleutel. Standaard lys:
    • 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

  • oop - vertoon 'n uitvissing-venster. Afhangende van die parameter wat van die bediener af kom, kan die toepassing die volgende uitvissingsvensters vertoon:
    • Wys 'n uitvissingsvenster waarvan die inhoud in 'n lêer in 'n gids geskryf is <%eksterne gids%>/hgps/<%param_lêernaam%>. Die resultaat van gebruikerinteraksie met die venster sal na gestuur word <%CnC%>/records.php
    • Wys 'n uitvissingsvenster waarvan die inhoud vooraf vanaf die adres gelaai is <%url_param%>?id=<%bot_id%>&app=<%pakketnaam%>. Die resultaat van gebruikerinteraksie met die venster sal na gestuur word <%CnC%>/records.php
    • Wys 'n uitvissing-venster wat as 'n Google Play-kaart vermom is.

  • interaktiewe - die opdrag is ontwerp om interaksie te hê met vensterelemente van ander toepassings wat AcessibilityService gebruik. 'n Spesiale diens is in die program vir interaksie geïmplementeer. Die toepassing wat ondersoek word, kan interaksie met Windows hê:
    • Tans aktief. In hierdie geval bevat die parameter die id of teks (naam) van die voorwerp waarmee jy moet interaksie.
    • Sigbaar vir die gebruiker wanneer die opdrag uitgevoer word. Die toepassing kies vensters volgens id.

    Na ontvangs van voorwerpe ToeganklikheidNodeInfo Vir vensterelemente wat van belang is, kan die toepassing, afhangende van die parameters, die volgende aksies uitvoer:

    • fokus — stel fokus op die voorwerp.
    • klik — klik op 'n voorwerp.
    • actionId — voer 'n aksie uit volgens ID.
    • setText — verander die teks van 'n voorwerp. Om die teks te verander is op twee maniere moontlik: voer 'n aksie uit ACTION_SET_TEXT (as die Android-weergawe van die besmette toestel jonger as of gelyk is aan Lollipop), of deur 'n string op die knipbord te plaas en dit in 'n voorwerp te plak (vir ouer weergawes). Hierdie opdrag kan gebruik word om data in 'n banktoepassing te verander.

2. PARAMS_ACTIONS - dieselfde as PARAMS_ACTION, net 'n JSON-reeks opdragte arriveer.

Dit blyk dat baie mense sal belangstel in hoe die funksie van interaksie met vensterelemente van 'n ander toepassing lyk. Dit is hoe hierdie funksionaliteit in Gustuff geïmplementeer word:

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

Teksvervangingsfunksie:

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

Dus, met die korrekte opstelling van die beheerbediener, is Gustuff in staat om teksvelde in die banktoepassing in te vul en op die knoppies te klik wat nodig is om die transaksie te voltooi. Die Trojaan hoef nie eers by die toepassing aan te meld nie - dit is genoeg om 'n opdrag te stuur om 'n PUSH-kennisgewing te vertoon en dan die voorheen geïnstalleerde banktoepassing oop te maak. Die gebruiker sal homself verifieer, waarna Gustuff die kar sal kan volmaak.

SMS-boodskap verwerking module

Die toepassing installeer 'n gebeurtenishanteerder vir die besmette toestel om SMS-boodskappe te aanvaar. Die toepassing wat bestudeer word, kan opdragte van die operateur ontvang, wat in die liggaam van die SMS-boodskap verskyn. Opdragte kom in die formaat:

7!5=<%Base64-gekodeerde opdrag%>

Die toepassing soek die string in alle inkomende SMS-boodskappe 7!5=, wanneer 'n string opgespoor word, dekodeer dit die string vanaf Base64 by offset 4 en voer die opdrag uit. Die opdragte is soortgelyk aan dié met CnC. Die uitvoeringsresultaat word na dieselfde nommer gestuur waarvandaan die opdrag gekom het. Antwoordformaat:

7*5=<%Base64-enkodeer van “resultaatkode-opdrag”%>

Opsioneel kan die toepassing alle ontvangde boodskappe na die wortelnommer stuur. Om dit te doen, moet die wortelnommer in die voorkeurlêer gespesifiseer word en die boodskapherleidingsvlag moet gestel word. 'n SMS-boodskap word na die aanvaller se nommer gestuur in die formaat:

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

Opsioneel kan die toepassing ook boodskappe na CnC stuur. Die SMS-boodskap word in JSON-formaat na die bediener gestuur:

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

As die vlag gestel is naamGenerator("DEFAULT_APP_SMS") – die toepassing hou op om die SMS-boodskap te verwerk en maak die lys van inkomende boodskappe skoon.

Proxy module

Die toepassing wat bestudeer word, bevat 'n Backconnect Proxy-module (hierna na verwys as die Proxy-module), wat 'n aparte klas het wat statiese velde met konfigurasie insluit. Konfigurasiedata word in duidelike vorm in die monster gestoor:

Hoe die Android Trojan Gustuff die room (fiat en crypto) van jou rekeninge afskep

Alle aksies wat deur die Proxy-module uitgevoer word, word by lêers aangemeld. Om dit te doen, skep die toepassing in Eksterne Berging 'n gids genaamd "logs" (die ProxyConfigClass.logsDir-veld in die konfigurasieklas), waarin loglêers gestoor word. Aantekening vind plaas in lêers met name:

  1. hoof.txt – die werk van die klas genaamd CommandServer is by hierdie lêer aangemeld. In wat volg, sal die aanteken van die string str in hierdie lêer as mainLog(str) aangedui word.
  2. sessie-<%id%>.txt - hierdie lêer stoor logdata wat met 'n spesifieke instaanbedienersessie geassosieer word. In wat volg, sal die aanteken van die string str na hierdie lêer as sessionLog (str) aangedui word.
  3. bediener.txt – hierdie lêer word gebruik om alle data wat na die bogenoemde lêers geskryf is, aan te teken.

Log data formaat:

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

Uitsonderings wat tydens die werking van die Proxy-module voorkom, word ook by 'n lêer aangeteken. Om dit te doen, genereer die toepassing 'n JSON-voorwerp in die volgende formaat:

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

Dan verander dit dit na 'n stringvoorstelling en teken dit aan.

Die Proxy-module word geloods nadat die ooreenstemmende opdrag ontvang is. Wanneer 'n opdrag ontvang word om die Proxy-module te begin, begin die toepassing 'n diens wat genoem word Hoofdiens, wat verantwoordelik is vir die bestuur van die werking van die Proxy-module - begin en stop dit.

Stadiums om die diens te begin:

1. Begin 'n timer wat een keer per minuut loop en kontroleer die aktiwiteit van die Proxy-module. As die module nie aktief is nie, begin dit dit.
Ook wanneer die gebeurtenis geaktiveer word android.net.conn.CONNECTIVITY_CHANGE Die Proxy-module word geloods.

2. Die toepassing skep 'n wake-lock met die parameter PARTIAL_WAKE_LOCK en vang hom. Dit verhoed dat die toestel-SVE in slaapmodus gaan.

3. Begin die opdragverwerkingsklas van die Proxy-module, en teken eers die lyn aan mainLog ("begin bediener") и

Bediener::start() gasheer[<%proxy_cnc%>], commandPort[<%command_port%>], proxyPort[<%proxy_port%>]

waar proxy_cnc, command_port en proxy_port – parameters verkry vanaf die instaanbedienerkonfigurasie.

Die opdragverwerkingsklas word genoem CommandConnection. Voer die volgende aksies uit onmiddellik na opstart:

4. Koppel aan ProxyConfigClass.host: ProxyConfigClass.commandPort en stuur data oor die besmette toestel daarheen in JSON-formaat:

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

Waar:

  • id - identifiseerder, probeer om 'n waarde te kry met die "id" veld van die gedeelde voorkeurlêer genaamd "x". As hierdie waarde nie verkry kon word nie, genereer dit 'n nuwe een. Die Proxy-module het dus sy eie identifiseerder, wat soortgelyk aan die Bot-ID gegenereer word.
  • imei — IMEI van die toestel. As 'n fout plaasgevind het tydens die proses om die waarde te verkry, sal 'n fout-teksboodskap in plaas van hierdie veld geskryf word.
  • imsi — Internasionale mobiele intekenaar-identiteit van die toestel. As 'n fout plaasgevind het tydens die proses om die waarde te verkry, sal 'n fout-teksboodskap in plaas van hierdie veld geskryf word.
  • model — Die eindgebruiker-sigbare naam vir die eindproduk.
  • vervaardiger — Die vervaardiger van die produk/hardeware (Build.MANUFACTURER).
  • androidVersion - 'n string in die formaat "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • land — huidige ligging van die toestel.
  • partnerId is 'n leë string.
  • pakketnaam – pakketnaam.
  • netwerktipe — tipe huidige netwerkverbinding (byvoorbeeld: "WIFI", "MOBIEL"). In die geval van fout, gee nul terug.
  • hasGsmSupport – waar – as die foon GSM ondersteun, anders vals.
  • simReady – SIM-kaartstatus.
  • simCountry - ISO-landkode (gebaseer op SIM-kaartverskaffer).
  • netwerkOperateur — operateurnaam. As 'n fout plaasgevind het tydens die proses om die waarde te verkry, sal 'n fout-teksboodskap in plaas van hierdie veld geskryf word.
  • simOperator — Die diensverskaffernaam (SPN). As 'n fout plaasgevind het tydens die proses om die waarde te verkry, sal 'n fout-teksboodskap in plaas van hierdie veld geskryf word.
  • weergawe - hierdie veld word in die konfigurasieklas gestoor; vir die getoetsde weergawes van die bot was dit gelyk aan "1.6".

5. Skakel oor na die modus van wag vir opdragte vanaf die bediener. Opdragte vanaf die bediener kom in die formaat:

  • 0 offset – opdrag
  • 1 offset – sessie-ID
  • 2 offset – lengte
  • 4 offset - data

Wanneer 'n opdrag aankom, teken die toepassing aan:
mainLog("Header { sessionId<%id%>], tipe[<%command%>], lengte[<%length%>] }")

Die volgende opdragte vanaf die bediener is moontlik:

Naam Command data Beskrywing
verbinding-ID 0 Verbinding ID Skep 'n nuwe verbinding
SLAAP 3 tyd Onderbreek die Proxy-module
TAFELTENNIS 4 - Stuur PONG boodskap

'n PONG-boodskap bestaan ​​uit 4 grepe en lyk so: 0x04000000.

Wanneer die connectionId-opdrag ontvang word (om 'n nuwe verbinding te skep) CommandConnection skep 'n instansie van 'n klas Proxy Connection.

  • Twee klasse neem deel aan volmag: Proxy Connection и einde. Wanneer 'n klas geskep word Proxy Connection koppel aan die adres ProxyConfigClass.host: ProxyConfigClass.proxyPort en verby die JSON-voorwerp:

 {
    "id":<%connectionId%>
}

In reaksie stuur die bediener 'n SOCKS5-boodskap wat die adres van die afgeleë bediener bevat waarmee die verbinding tot stand gebring moet word. Interaksie met hierdie bediener vind deur die klas plaas einde. Die verbindingsopstelling kan skematies soos volg voorgestel word:

Hoe die Android Trojan Gustuff die room (fiat en crypto) van jou rekeninge afskep

Netwerk interaksies

Om verkeersontleding deur netwerksnuffelaars te voorkom, kan die interaksie tussen die CnC-bediener en die toepassing met die SSL-protokol beskerm word. Alle oorgedra data van en na die bediener word in JSON-formaat aangebied. Die toepassing voer die volgende versoeke tydens werking uit:

  • http://<%CnC%>/api/v1/set_state.php — die resultaat van die beveluitvoering.
  • http://<%CnC%>/api/v1/get.php - 'n opdrag ontvang.
  • http://<%CnC%>/api/v1/load_sms.php - aflaai van SMS-boodskappe vanaf 'n besmette toestel.
  • http://<%CnC%>/api/v1/load_ab.php - die oplaai van 'n lys kontakte vanaf 'n besmette toestel.
  • http://<%CnC%>/api/v1/aevents.php – die versoek word gemaak wanneer parameters in die voorkeurlêer opgedateer word.
  • http://<%CnC%>/api/v1/set_card.php — die oplaai van data wat verkry is met 'n uitvissing-venster wat as die Google Play Market voorgedoen word.
  • http://<%CnC%>/api/v1/logs.php - oplaai van logdata.
  • http://<%CnC%>/api/v1/records.php – die oplaai van data wat verkry is deur uitvissingsvensters.
  • http://<%CnC%>/api/v1/set_error.php – kennisgewing van 'n fout wat plaasgevind het.

Aanbevelings

Om hul kliënte teen die bedreiging van mobiele Trojans te beskerm, moet maatskappye omvattende oplossings gebruik wat hulle in staat stel om kwaadwillige aktiwiteite te monitor en te voorkom sonder om bykomende sagteware op gebruikerstoestelle te installeer.

Om dit te doen, moet handtekeningmetodes vir die opsporing van mobiele Trojans versterk word met tegnologieë vir die ontleding van die gedrag van beide die kliënt en die toepassing self. Die beskerming moet ook 'n toestelidentifikasiefunksie insluit wat digitale vingerafdruktegnologie gebruik, wat dit moontlik sal maak om te verstaan ​​wanneer 'n rekening vanaf 'n atipiese toestel gebruik word en reeds in die hande van 'n bedrieër geval het.

'n Fundamenteel belangrike punt is die beskikbaarheid van kruiskanaalanalise, wat maatskappye in staat stel om risiko's te beheer wat nie net op die internet ontstaan ​​nie, maar ook op die mobiele kanaal, byvoorbeeld in toepassings vir mobiele bankdienste, vir transaksies met kripto-geldeenhede en enige ander waar transaksies uitgevoer kan word finansiële transaksie.

Veiligheidsreëls vir gebruikers:

  • moenie toepassings vir 'n mobiele toestel met Android-bedryfstelsel installeer vanaf enige ander bronne as Google Play nie, let veral op die regte wat deur die toepassing versoek word;
  • installeer gereeld Android OS-opdaterings;
  • let op die uitbreidings van afgelaaide lêers;
  • moenie verdagte hulpbronne besoek nie;
  • Moenie op skakels klik wat in SMS-boodskappe ontvang word nie.

Hoofrol Semyon Rogacheva, junior spesialis in wanwarenavorsing by die Group-IB Computer Forensics Laboratory.

Bron: will.com

Voeg 'n opmerking