Paano sinusuri ng Android Trojan Gustuff ang cream (fiat at crypto) mula sa iyong mga account

Paano sinusuri ng Android Trojan Gustuff ang cream (fiat at crypto) mula sa iyong mga account

Noong isang araw lang Group-IB alam tungkol sa aktibidad ng mobile Android Trojan Gustuff. Eksklusibo itong gumagana sa mga internasyonal na merkado, umaatake sa mga kliyente ng 100 pinakamalaking dayuhang bangko, mga gumagamit ng mobile 32 crypto wallet, pati na rin ang malalaking mapagkukunan ng e-commerce. Ngunit ang developer ng Gustuff ay isang cybercriminal na nagsasalita ng Russian sa ilalim ng palayaw na Bestoffer. Hanggang kamakailan, pinuri niya ang kanyang Trojan bilang "isang seryosong produkto para sa mga taong may kaalaman at karanasan."

Espesyalista sa pagsusuri ng nakakahamak na code sa Group-IB Ivan Pisarev sa kanyang pananaliksik, siya ay nagsasalita nang detalyado tungkol sa kung paano gumagana si Gustuff at kung ano ang mga panganib nito.

Sino ang hinahanap ni Gustuff?

Ang Gustuff ay kabilang sa isang bagong henerasyon ng malware na may ganap na automated na mga function. Ayon sa developer, ang Trojan ay naging bago at pinahusay na bersyon ng AndyBot malware, na mula noong Nobyembre 2017 ay umaatake sa mga Android phone at nagnanakaw ng pera sa pamamagitan ng phishing web form na nagpapanggap bilang mga mobile application ng mga kilalang internasyonal na bangko at mga sistema ng pagbabayad. Iniulat ni Bestoffer na ang presyo ng pagrenta ng Gustuff Bot ay $800 bawat buwan.

Ang pagsusuri sa sample ng Gustuff ay nagpakita na ang Trojan ay potensyal na nagta-target ng mga customer gamit ang mga mobile application ng pinakamalaking mga bangko, tulad ng Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, pati na rin ang mga crypto wallet Bitcoin Wallet, BitPay , Cryptopay, Coinbase, atbp.

Orihinal na nilikha bilang isang klasikong Trojan sa pagbabangko, sa kasalukuyang bersyon ay pinalawak ni Gustuff ang listahan ng mga potensyal na target para sa pag-atake. Bilang karagdagan sa mga Android application para sa mga bangko, mga kumpanya ng fintech at mga serbisyo ng crypto, ang Gustuff ay naglalayong sa mga gumagamit ng mga application ng marketplace, mga online na tindahan, mga sistema ng pagbabayad at mga instant messenger. Sa partikular, PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut at iba pa.

Entry point: pagkalkula para sa mass infection

Ang Gustuff ay nailalarawan sa pamamagitan ng "classic" na vector ng pagtagos sa mga Android smartphone sa pamamagitan ng mga SMS mailing na may mga link sa mga APK. Kapag ang isang Android device ay nahawahan ng Trojan sa utos ng server, maaaring kumalat pa si Gustuff sa pamamagitan ng contact database ng nahawaang telepono o sa pamamagitan ng database ng server. Ang functionality ni Gustuff ay idinisenyo para sa mass infection at maximum na capitalization ng negosyo ng mga operator nito - mayroon itong natatanging function na "auto-fill" sa mga lehitimong mobile banking application at crypto wallet, na nagbibigay-daan sa iyong pabilisin at sukatin ang pagnanakaw ng pera.

Ang isang pag-aaral ng Trojan ay nagpakita na ang autofill function ay ipinatupad dito gamit ang Accessibility Service, isang serbisyo para sa mga taong may mga kapansanan. Hindi si Gustuff ang unang Trojan na matagumpay na nalampasan ang proteksyon laban sa pakikipag-ugnayan sa mga elemento ng window ng iba pang mga application gamit ang serbisyong ito ng Android. Gayunpaman, ang paggamit ng Serbisyo sa Accessibility kasama ng isang filler ng kotse ay medyo bihira pa rin.

Pagkatapos mag-download sa telepono ng biktima, si Gustuff, gamit ang Accessibility Service, ay nagagawang makipag-ugnayan sa mga elemento ng window ng iba pang mga application (banking, cryptocurrency, pati na rin ang mga application para sa online shopping, pagmemensahe, atbp.), na nagsasagawa ng mga aksyon na kinakailangan para sa mga umaatake. . Halimbawa, sa utos ng server, maaaring pindutin ng isang Trojan ang mga pindutan at baguhin ang mga halaga ng mga patlang ng teksto sa mga aplikasyon sa pagbabangko. Ang paggamit ng mekanismo ng Accessibility Service ay nagbibigay-daan sa Trojan na i-bypass ang mga mekanismo ng seguridad na ginagamit ng mga bangko upang kontrahin ang mga nakaraang henerasyong mobile Trojan, pati na rin ang mga pagbabago sa patakaran sa seguridad na ipinatupad ng Google sa mga bagong bersyon ng Android OS. Kaya, "alam" ni Gustuff kung paano i-disable ang proteksyon ng Google Protect: ayon sa may-akda, gumagana ang function na ito sa 70% ng mga kaso.

Paano sinusuri ng Android Trojan Gustuff ang cream (fiat at crypto) mula sa iyong mga account

Maaari ding magpakita si Gustuff ng mga pekeng PUSH notification na may mga icon ng mga lehitimong mobile application. Nag-click ang user sa PUSH notification at nakakita ng phishing window na na-download mula sa server, kung saan ipinasok niya ang hiniling na bank card o data ng crypto wallet. Sa isa pang senaryo ng Gustuff, binuksan ang application sa ngalan kung saan ipinakita ang notification ng PUSH. Sa kasong ito, ang malware, sa utos mula sa server sa pamamagitan ng Accessibility Service, ay maaaring punan ang mga field ng form ng isang banking application para sa isang mapanlinlang na transaksyon.

Kasama rin sa functionality ni Gustuff ang pagpapadala ng impormasyon tungkol sa isang nahawaang device sa server, ang kakayahang magbasa/magpadala ng mga mensaheng SMS, pagpapadala ng mga kahilingan sa USSD, paglulunsad ng SOCKS5 Proxy, pagsunod sa isang link, pagpapadala ng mga file (kabilang ang mga pag-scan ng larawan ng mga dokumento, mga screenshot, mga litrato) sa server , i-reset ang device sa mga factory setting.

Pagsusuri ng Malware

Bago mag-install ng nakakahamak na application, ipinapakita ng Android OS sa user ang isang window na naglalaman ng listahan ng mga karapatang hiniling ni Gustuff:

Paano sinusuri ng Android Trojan Gustuff ang cream (fiat at crypto) mula sa iyong mga account
Ang application ay mai-install lamang pagkatapos matanggap ang pahintulot ng user. Pagkatapos ilunsad ang application, ipapakita ng Trojan sa user ang isang window:

Paano sinusuri ng Android Trojan Gustuff ang cream (fiat at crypto) mula sa iyong mga account
Pagkatapos nito ay aalisin nito ang icon nito.

Ang Gustuff ay nakaimpake, ayon sa may-akda, ng isang packer mula sa FTT. Pagkatapos ng startup, pana-panahong nakikipag-ugnayan ang application sa server ng CnC para makatanggap ng mga utos. Gumamit ng IP address ang ilang file na sinuri namin bilang control server 88.99.171[.]105 (Pagkatapos nito ay tukuyin natin ito bilang <%CnC%>).

Pagkatapos ng paglunsad, ang programa ay magsisimulang magpadala ng mga mensahe sa server http://<%CnC%>/api/v1/get.php.

Ang tugon ay inaasahang JSON sa sumusunod na format:

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

Sa tuwing maa-access ang application, nagpapadala ito ng impormasyon tungkol sa nahawaang device. Ang format ng mensahe ay ipinapakita sa ibaba. Ito ay nagkakahalaga ng noting na ang mga patlang ganap, dagdag, app и pahintulot – opsyonal at ipapadala lamang sa kaso ng kahilingang utos mula sa 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%>
} 

Pag-iimbak ng data ng pagsasaayos

Nag-iimbak si Gustuff ng mahahalagang impormasyon sa pagpapatakbo sa isang kagustuhang file. Ang pangalan ng file, pati na rin ang mga pangalan ng mga parameter sa loob nito, ay ang resulta ng pagkalkula ng MD5 sum mula sa string 15413090667214.6.1<%name%>Saan <%name%> — paunang pangalan-halaga. Ang interpretasyon ng Python ng function ng pagbuo ng pangalan:

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

Sa kung ano ang mga sumusunod ay tukuyin natin ito bilang nameGenerator(input).
Kaya ang unang pangalan ng file ay: nameGenerator("API_SERVER_LIST"), naglalaman ito ng mga halaga na may mga sumusunod na pangalan:

Pangalan ng variable Halaga
nameGenerator("API_SERVER_LIST") Naglalaman ng isang listahan ng mga CnC address sa anyo ng isang array.
nameGenerator("API_SERVER_URL") Naglalaman ng CnC address.
nameGenerator("SMS_UPLOAD") Ang bandila ay itinakda bilang default. Kung nakatakda ang bandila, nagpapadala ng mga mensaheng SMS sa CnC.
nameGenerator("SMS_ROOT_NUMBER") Numero ng telepono kung saan ipapadala ang mga mensaheng SMS na natanggap ng nahawaang device. Ang default ay null.
nameGenerator("SMS_ROOT_NUMBER_RESEND") Ang bandila ay na-clear bilang default. Kung naka-install, kapag nakatanggap ng SMS ang isang nahawaang device, ipapadala ito sa root number.
nameGenerator("DEFAULT_APP_SMS") Ang bandila ay na-clear bilang default. Kung nakatakda ang flag na ito, ipoproseso ng application ang mga papasok na mensaheng SMS.
nameGenerator("DEFAULT_ADMIN") Ang bandila ay na-clear bilang default. Kung ang flag ay nakatakda, ang application ay may mga karapatan ng administrator.
nameGenerator("DEFAULT_ACCESSIBILITY") Ang bandila ay na-clear bilang default. Kung nakatakda ang flag, tumatakbo ang isang serbisyong gumagamit ng Serbisyo sa Accessibility.
nameGenerator("APPS_CONFIG") Isang object ng JSON na naglalaman ng listahan ng mga aksyon na dapat gawin kapag na-trigger ang isang kaganapan sa Accessibility na nauugnay sa isang partikular na application.
nameGenerator("APPS_INSTALLED") Nag-iimbak ng listahan ng mga application na naka-install sa device.
nameGenerator("IS_FIST_RUN") Ni-reset ang flag sa unang pagsisimula.
nameGenerator("UNIQUE_ID") Naglalaman ng natatanging identifier. Nabuo kapag inilunsad ang bot sa unang pagkakataon.

Module para sa pagproseso ng mga utos mula sa server

Iniimbak ng application ang mga address ng mga server ng CnC sa anyo ng isang array na na-encode ni Basexnumx mga linya. Ang listahan ng mga server ng CnC ay maaaring baguhin kapag natanggap ang naaangkop na utos, kung saan ang mga address ay maiimbak sa isang kagustuhang file.

Bilang tugon sa kahilingan, nagpapadala ang server ng command sa application. Kapansin-pansin na ang mga utos at parameter ay ipinakita sa format na JSON. Maaaring iproseso ng application ang mga sumusunod na command:

Koponan Описание
forwardStart Simulan ang pagpapadala ng mga mensaheng SMS na natanggap ng nahawaang device sa CnC server.
forwardStop Itigil ang pagpapadala ng mga mensaheng SMS na natanggap ng nahawaang device sa CnC server.
ussdRun Isagawa ang kahilingan sa USSD. Ang numero kung saan kailangan mong gumawa ng kahilingan sa USSD ay matatagpuan sa field ng JSON na "numero".
Magpadala ng SMS Magpadala ng isang SMS na mensahe (kung kinakailangan, ang mensahe ay "hatiin" sa mga bahagi). Bilang isang parameter, ang command ay kumukuha ng JSON object na naglalaman ng mga field na "to" - ang destination number at "body" - ang katawan ng mensahe.
magpadala ngSmsAb Magpadala ng mga mensaheng SMS (kung kinakailangan, ang mensahe ay "hatiin" sa mga bahagi) sa lahat ng nasa listahan ng contact ng nahawaang device. Ang pagitan ng pagpapadala ng mga mensahe ay 10 segundo. Ang katawan ng mensahe ay nasa field ng JSON na "katawan"
magpadala ngSmsMass Magpadala ng mga mensaheng SMS (kung kinakailangan, ang mensahe ay "hatiin" sa mga bahagi) sa mga contact na tinukoy sa mga parameter ng command. Ang pagitan ng pagpapadala ng mga mensahe ay 10 segundo. Bilang isang parameter, ang command ay kumukuha ng JSON array (ang "sms" field), ang mga elemento nito ay naglalaman ng mga field na "to" - ang destination number at "body" - ang katawan ng mensahe.
changeServer Ang command na ito ay maaaring kumuha ng value gamit ang key na "url" bilang isang parameter - pagkatapos ay babaguhin ng bot ang value ng nameGenerator("SERVER_URL"), o "array" - pagkatapos ay isusulat ng bot ang array sa nameGenerator ("API_SERVER_LIST") Kaya, binabago ng application ang address ng mga server ng CnC.
adminNumber Ang utos ay idinisenyo upang gumana sa isang numero ng ugat. Ang command ay tumatanggap ng JSON object na may mga sumusunod na parameter: “number” — palitan ang nameGenerator(“ROOT_NUMBER”) sa natanggap na value, “resend” — change nameGenerator(“SMS_ROOT_NUMBER_RESEND”), “sendId” — ipadala sa nameGenerator(“ROOT_NUMBER” ) uniqueID.
updateInfo Magpadala ng impormasyon tungkol sa nahawaang device sa server.
burahin ang detalye Ang utos ay inilaan upang tanggalin ang data ng user. Depende sa kung anong pangalan ang inilunsad sa application, maaaring ganap na mabura ang data sa pamamagitan ng pag-reboot ng device (pangunahing user), o data lang ng user ang tatanggalin (pangalawang user).
medyasStart Ilunsad ang Proxy module. Ang pagpapatakbo ng module ay inilarawan sa isang hiwalay na seksyon.
medyasStop Itigil ang Proxy module.
bukas na link Sundin ang link. Ang link ay matatagpuan sa JSON parameter sa ilalim ng "url" key. Ginagamit ang “android.intent.action.VIEW” para buksan ang link.
uploadAllSms Ipadala ang lahat ng mga mensaheng SMS na natanggap ng device sa server.
uploadAllPhotos Magpadala ng mga larawan mula sa isang nahawaang device sa isang URL. Dumating ang URL bilang isang parameter.
uploadFile Magpadala ng file sa isang URL mula sa isang nahawaang device. Dumating ang URL bilang isang parameter.
uploadPhoneNumbers Magpadala ng mga numero ng telepono mula sa iyong listahan ng contact sa server. Kung ang isang JSON object value na may key na "ab" ay natanggap bilang isang parameter, ang application ay makakatanggap ng isang listahan ng mga contact mula sa phone book. Kung ang isang object ng JSON na may key na "sms" ay natanggap bilang isang parameter, binabasa ng application ang listahan ng mga contact mula sa mga nagpadala ng mga mensaheng SMS.
changeArchive Dina-download ng application ang file mula sa address na nagmumula bilang isang parameter gamit ang "url" key. Ang na-download na file ay nai-save na may pangalang "archive.zip". I-unzip ng application ang file, na opsyonal na gamit ang archive password na "b5jXh37gxgHBrZhQ4j3D". Ang mga na-unzip na file ay naka-save sa [external storage]/hgps na direktoryo. Sa direktoryong ito, ang application ay nag-iimbak ng mga web fakes (inilarawan sa ibaba).
pagkilos Ang utos ay idinisenyo upang gumana sa Serbisyo ng Aksyon, na inilarawan sa isang hiwalay na seksyon.
pagsusulit Walang ginagawa.
download Ang utos ay inilaan upang mag-download ng isang file mula sa isang malayuang server at i-save ito sa direktoryo ng "Mga Download". Ang URL at pangalan ng file ay dumating bilang isang parameter, mga field sa object ng parameter ng JSON, ayon sa pagkakabanggit: “url” at “fileName”.
alisin Nag-aalis ng file mula sa direktoryo ng "Mga Download." Ang pangalan ng file ay nasa isang JSON parameter na may "fileName" key. Ang karaniwang pangalan ng file ay "tmp.apk".
abiso Magpakita ng notification na may mga paglalarawan at mga teksto ng pamagat na tinukoy ng server ng pamamahala.

Format ng Utos abiso:

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

Ang notification na nabuo ng file na nasa ilalim ng imbestigasyon ay mukhang magkapareho sa mga notification na nabuo ng application na tinukoy sa field app. Kung ang halaga ng patlang openApp — Totoo, kapag ang isang abiso ay binuksan, ang application na tinukoy sa field ay inilunsad app. Kung ang halaga ng patlang openApp — Mali, kung gayon:

  • Magbubukas ang isang window ng phishing, ang mga nilalaman nito ay na-download mula sa direktoryo <%external storage%>/hgps/<%filename%>
  • Magbubukas ang isang window ng phishing, ang mga nilalaman nito ay na-download mula sa server <%url%>?id=<%Bot id%>&app=<%Application name%>
  • May bubukas na window ng phishing, na itinago bilang isang Google Play Card, na may pagkakataong maglagay ng mga detalye ng card.

Ipinapadala ng application ang resulta ng anumang utos sa <%CnC%>set_state.php bilang JSON object sa sumusunod na format:

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

ActionsService
Ang listahan ng mga utos na kasama sa mga proseso ng aplikasyon aksyon. Kapag natanggap ang isang utos, ina-access ng module ng pagpoproseso ng command ang serbisyong ito upang maisagawa ang pinalawig na utos. Tumatanggap ang serbisyo ng JSON object bilang parameter. Maaaring isagawa ng serbisyo ang mga sumusunod na utos:

1. PARAMS_ACTION — kapag tumatanggap ng ganoong utos, unang natatanggap ng serbisyo mula sa parameter ng JSON ang halaga ng Type key, na maaaring ang mga sumusunod:

  • serviceInfo – nakukuha ng subcommand ang value sa pamamagitan ng key mula sa parameter ng JSON isama angHindi Mahalaga. Kung True ang flag, itatakda ng application ang flag FLAG_ISOLATED_PROCESS sa isang serbisyo gamit ang Accessibility Service. Sa ganitong paraan ang serbisyo ay ilulunsad sa isang hiwalay na proseso.
  • ugat — tumanggap at magpadala sa server ng impormasyon tungkol sa window na kasalukuyang nakatutok. Ang application ay nakakakuha ng impormasyon gamit ang AccessibilityNodeInfo class.
  • admin — humiling ng mga karapatan ng administrator.
  • antala — suspindihin ang ActionsService para sa bilang ng mga millisecond na tinukoy sa parameter para sa "data" key.
  • bintana — magpadala ng listahan ng mga window na makikita ng user.
  • install — i-install ang application sa nahawaang device. Ang pangalan ng archive package ay nasa "fileName" key. Ang archive mismo ay matatagpuan sa direktoryo ng Mga Download.
  • global – ang subcommand ay nilayon na mag-navigate mula sa kasalukuyang window:
    • sa menu ng Mga Mabilisang Setting
    • pabalik
    • bahay
    • sa mga notification
    • sa kamakailang binuksan na window ng mga application

  • ilunsad - ilunsad ang application. Ang pangalan ng application ay dumating bilang isang parameter sa pamamagitan ng key data.
  • tunog — baguhin ang sound mode sa katahimikan.
  • magbukas ng kandado — i-on ang backlight ng screen at keyboard sa buong liwanag. Ginagawa ng application ang pagkilos na ito gamit ang WakeLock, na tinutukoy ang string [Label ng Application]:INFO bilang isang tag
  • permissionOverlay — ang function ay hindi ipinatupad (ang tugon sa command execution ay {"message":"Not support"} o {"message":"low sdk"})
  • kilos — ang function ay hindi ipinatupad (ang tugon sa command execution ay {"message":"Not support"}o {"message":"Low API"})
  • mga pahintulot — ang utos na ito ay kinakailangan upang humiling ng mga pahintulot para sa aplikasyon. Gayunpaman, ang pag-andar ng query ay hindi ipinatupad, kaya ang utos ay walang kahulugan. Ang listahan ng mga hiniling na karapatan ay dumating bilang isang JSON array na may "mga pahintulot" na key. Karaniwang listahan:
    • 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

  • buksan — magpakita ng phishing window. Depende sa parameter na nagmumula sa server, maaaring ipakita ng application ang mga sumusunod na window ng phishing:
    • Magpakita ng window ng phishing na ang mga nilalaman ay nakasulat sa isang file sa isang direktoryo <%external directory%>/hgps/<%param_filename%>. Ang resulta ng pakikipag-ugnayan ng user sa window ay ipapadala sa <%CnC%>/records.php
    • Magpakita ng window ng phishing na ang mga nilalaman ay paunang na-load mula sa address <%url_param%>?id=<%bot_id%>&app=<%packagename%>. Ang resulta ng pakikipag-ugnayan ng user sa window ay ipapadala sa <%CnC%>/records.php
    • Magpakita ng isang window ng phishing na itinago bilang isang Google Play Card.

  • interactive — ang command ay idinisenyo upang makipag-ugnayan sa mga elemento ng window ng iba pang mga application gamit ang AcessibilityService. Isang espesyal na serbisyo ang ipinatupad sa programa para sa pakikipag-ugnayan. Ang application na sinisiyasat ay maaaring makipag-ugnayan sa mga bintana:
    • Kasalukuyang aktibo. Sa kasong ito, ang parameter ay naglalaman ng id o text (pangalan) ng bagay kung saan kailangan mong makipag-ugnayan.
    • Nakikita ng user sa oras na isagawa ang command. Pinipili ng application ang mga bintana sa pamamagitan ng id.

    Ang pagkakaroon ng natanggap na mga bagay AccessibilityNodeInfo Para sa mga elemento ng window ng interes, ang application, depende sa mga parameter, ay maaaring magsagawa ng mga sumusunod na aksyon:

    • pokus — itakda ang pokus sa bagay.
    • click — mag-click sa isang bagay.
    • actionId — magsagawa ng aksyon sa pamamagitan ng ID.
    • setText — baguhin ang teksto ng isang bagay. Ang pagbabago ng teksto ay posible sa dalawang paraan: magsagawa ng aksyon ACTION_SET_TEXT (kung ang bersyon ng Android ng nahawaang device ay mas bata sa o katumbas ng LOLLIPOP), o sa pamamagitan ng paglalagay ng string sa clipboard at pag-paste nito sa isang bagay (para sa mga mas lumang bersyon). Maaaring gamitin ang command na ito upang baguhin ang data sa isang banking application.

2. PARAMS_ACTIONS - katulad ng PARAMS_ACTION, isang JSON array lang ng mga command ang dumating.

Mukhang maraming tao ang magiging interesado sa kung ano ang hitsura ng pag-andar ng pakikipag-ugnay sa mga elemento ng window ng isa pang application. Ito ay kung paano ipinatupad ang pagpapaandar na ito sa 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));
}

Pag-andar ng pagpapalit ng teksto:

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

Kaya, sa tamang pagsasaayos ng control server, nagagawang punan ni Gustuff ang mga text field sa application ng pagbabangko at mag-click sa mga pindutan na kinakailangan upang makumpleto ang transaksyon. Hindi na kailangan ng Trojan na mag-log in sa application—ito ay sapat na upang magpadala ng command upang magpakita ng PUSH notification at pagkatapos ay buksan ang dating naka-install na banking application. Ang gumagamit ay magpapatunay sa kanyang sarili, pagkatapos nito ay mapupuno ni Gustuff ang kotse.

Module sa pagproseso ng mensahe ng SMS

Ang application ay nag-i-install ng isang event handler para sa nahawaang device upang tumanggap ng mga mensaheng SMS. Ang application na pinag-aaralan ay maaaring makatanggap ng mga utos mula sa operator, na nasa katawan ng mensaheng SMS. Ang mga utos ay nasa format:

7!5=<%Base64 na naka-encode na command%>

Hinahanap ng application ang string sa lahat ng mga papasok na mensaheng SMS 7!5=, kapag may nakitang string, ide-decode nito ang string mula sa Base64 sa offset 4 at ipapatupad ang command. Ang mga utos ay katulad ng mga may CnC. Ang resulta ng pagpapatupad ay ipinadala sa parehong numero kung saan nagmula ang utos. Format ng tugon:

7*5=<%Base64 encode ng “result_code command”%>

Opsyonal, maaaring ipadala ng application ang lahat ng natanggap na mensahe sa Root number. Para magawa ito, dapat na tukuyin ang Root number sa preference na file at dapat itakda ang flag ng pag-redirect ng mensahe. Isang mensaheng SMS ang ipinapadala sa numero ng umaatake sa format:

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

Gayundin, opsyonal, ang application ay maaaring magpadala ng mga mensahe sa CnC. Ang mensaheng SMS ay ipinadala sa server sa JSON na format:

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

Kung nakatakda ang bandila nameGenerator("DEFAULT_APP_SMS") – huminto ang application sa pagproseso ng mensaheng SMS at nililinis ang listahan ng mga papasok na mensahe.

Proxy module

Ang application na pinag-aaralan ay naglalaman ng isang Backconnect Proxy module (mula rito ay tinutukoy bilang ang Proxy module), na may hiwalay na klase na kinabibilangan ng mga static na field na may configuration. Ang data ng configuration ay naka-imbak sa sample sa malinaw na anyo:

Paano sinusuri ng Android Trojan Gustuff ang cream (fiat at crypto) mula sa iyong mga account

Ang lahat ng mga aksyon na ginawa ng Proxy module ay naka-log in sa mga file. Upang gawin ito, ang application sa External Storage ay lumilikha ng isang direktoryo na tinatawag na "mga log" (ang ProxyConfigClass.logsDir na field sa klase ng pagsasaayos), kung saan naka-imbak ang mga log file. Nagaganap ang pag-log sa mga file na may mga pangalan:

  1. main.txt – ang gawain ng klase na tinatawag na CommandServer ay naka-log in sa file na ito. Sa kung ano ang sumusunod, ang pag-log sa string str sa file na ito ay ide-denote bilang mainLog(str).
  2. session-<%id%>.txt — ang file na ito ay nagse-save ng data ng log na nauugnay sa isang partikular na session ng proxy. Sa mga sumusunod, ang pag-log sa string str sa file na ito ay ituturing bilang sessionLog (str).
  3. server.txt – ang file na ito ay ginagamit upang i-log ang lahat ng data na nakasulat sa mga file na inilarawan sa itaas.

Format ng data ng log:

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

Ang mga pagbubukod na nangyayari sa panahon ng pagpapatakbo ng Proxy module ay naka-log din sa isang file. Upang gawin ito, bumubuo ang application ng JSON object sa sumusunod na format:

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

Pagkatapos ay i-convert ito sa isang representasyon ng string at i-log ito.

Ang Proxy module ay inilunsad pagkatapos matanggap ang kaukulang command. Kapag natanggap ang isang command para ilunsad ang Proxy module, magsisimula ang application ng isang serbisyong tinatawag Pangunahing Serbisyo, na responsable para sa pamamahala sa pagpapatakbo ng Proxy module - pagsisimula at pagpapahinto nito.

Mga yugto ng pagsisimula ng serbisyo:

1. Magsisimula ng timer na tumatakbo nang isang beses sa isang minuto at sinusuri ang aktibidad ng Proxy module. Kung hindi aktibo ang module, sisimulan ito.
Gayundin kapag ang kaganapan ay na-trigger android.net.conn.CONNECTIVITY_CHANGE Inilunsad ang Proxy module.

2. Lumilikha ang application ng wake-lock na may parameter PARTIAL_WAKE_LOCK at hinuhuli siya. Pinipigilan nito ang CPU ng device na pumunta sa sleep mode.

3. Inilunsad ang klase ng pagpoproseso ng command ng Proxy module, unang nagla-log sa linya mainLog("simulan ang server") и

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

saan proxy_cnc, command_port at proxy_port – mga parameter na nakuha mula sa configuration ng Proxy server.

Ang command processing class ay tinatawag CommandConnection. Kaagad pagkatapos ng startup, nagsasagawa ng mga sumusunod na aksyon:

4. Kumokonekta sa ProxyConfigClass.host: ProxyConfigClass.commandPort at nagpapadala ng data tungkol sa nahawaang device doon sa JSON na format:

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

Saan:

  • id – identifier, sumusubok na makakuha ng value gamit ang field na “id” mula sa Shared Preference file na pinangalanang “x”. Kung hindi makuha ang halagang ito, bubuo ito ng bago. Kaya, ang Proxy module ay may sariling identifier, na nabuo nang katulad ng Bot ID.
  • imei — IMEI ng device. Kung may naganap na error sa proseso ng pagkuha ng halaga, isang error na text message ang isusulat sa halip na ang field na ito.
  • imsi — International Mobile Subscriber Identity ng device. Kung may naganap na error sa proseso ng pagkuha ng halaga, isang error na text message ang isusulat sa halip na ang field na ito.
  • modelo — Ang end-user-visible na pangalan para sa end product.
  • tagagawa — Ang tagagawa ng produkto/hardware (Build.MANUFACTURER).
  • androidVersion - isang string sa format na "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • bansa — kasalukuyang lokasyon ng device.
  • Ang partnerId ay isang walang laman na string.
  • packageName – pangalan ng package.
  • networkType — uri ng kasalukuyang koneksyon sa network (halimbawa: “WIFI”, “MOBILE”). Sa kaso ng error, nagbabalik ng null.
  • hasGsmSupport – true – kung sinusuportahan ng telepono ang GSM, kung hindi man ay false.
  • simReady – estado ng SIM card.
  • simCountry - ISO country code (batay sa SIM card provider).
  • networkOperator — pangalan ng operator. Kung may naganap na error sa proseso ng pagkuha ng halaga, isang error na text message ang isusulat sa halip na ang field na ito.
  • simOperator — Ang Pangalan ng Tagabigay ng Serbisyo (SPN). Kung may naganap na error sa proseso ng pagkuha ng halaga, isang error na text message ang isusulat sa halip na ang field na ito.
  • bersyon - ang patlang na ito ay naka-imbak sa klase ng config; para sa mga nasubok na bersyon ng bot ito ay katumbas ng "1.6".

5. Lumipat sa mode ng paghihintay ng mga utos mula sa server. Ang mga utos mula sa server ay nasa format:

  • 0 offset – utos
  • 1 offset – sessionId
  • 2 offset – haba
  • 4 offset - data

Kapag dumating ang isang command, ang application ay nag-log:
mainLog("Header { sessionId<%id%>], uri[<%command%>], haba[<%length%>] }")

Ang mga sumusunod na utos mula sa server ay posible:

Pangalan Utos data paglalarawan
connectionId 0 ID ng Koneksyon Gumawa ng bagong koneksyon
Magtulog 3 oras I-pause ang Proxy module
PING PONG 4 - Magpadala ng mensahe sa PONG

Ang isang mensahe ng PONG ay binubuo ng 4 na byte at ganito ang hitsura: 0x04000000.

Kapag natanggap ang connectionId command (upang lumikha ng bagong koneksyon) CommandConnection lumilikha ng isang halimbawa ng isang klase ProxyConnection.

  • Dalawang klase ang nakikibahagi sa pag-proxy: ProxyConnection и dulo. Kapag gumagawa ng klase ProxyConnection pagkonekta sa address ProxyConfigClass.host: ProxyConfigClass.proxyPort at pagpasa sa JSON object:

 {
    "id":<%connectionId%>
}

Bilang tugon, nagpapadala ang server ng SOCKS5 na mensahe na naglalaman ng address ng malayuang server kung saan dapat maitatag ang koneksyon. Ang pakikipag-ugnayan sa server na ito ay nangyayari sa pamamagitan ng klase dulo. Ang setup ng koneksyon ay maaaring ilarawan sa eskematiko tulad ng sumusunod:

Paano sinusuri ng Android Trojan Gustuff ang cream (fiat at crypto) mula sa iyong mga account

Mga pakikipag-ugnayan sa network

Upang maiwasan ang pagsusuri ng trapiko ng mga sniffer ng network, ang pakikipag-ugnayan sa pagitan ng CnC server at ng application ay maaaring maprotektahan gamit ang SSL protocol. Ang lahat ng ipinadalang data mula at papunta sa server ay ipinapakita sa JSON na format. Isinasagawa ng application ang mga sumusunod na kahilingan sa panahon ng operasyon:

  • http://<%CnC%>/api/v1/set_state.php — ang resulta ng pagpapatupad ng utos.
  • http://<%CnC%>/api/v1/get.php — pagtanggap ng utos.
  • http://<%CnC%>/api/v1/load_sms.php — pag-download ng mga mensaheng SMS mula sa isang nahawaang device.
  • http://<%CnC%>/api/v1/load_ab.php — pag-upload ng listahan ng mga contact mula sa isang nahawaang device.
  • http://<%CnC%>/api/v1/aevents.php – ang kahilingan ay ginawa kapag nag-a-update ng mga parameter na matatagpuan sa preference na file.
  • http://<%CnC%>/api/v1/set_card.php — pag-upload ng data na nakuha gamit ang isang phishing window na nagpapanggap bilang Google Play Market.
  • http://<%CnC%>/api/v1/logs.php – pag-upload ng data ng log.
  • http://<%CnC%>/api/v1/records.php – pag-upload ng data na nakuha sa pamamagitan ng phishing windows.
  • http://<%CnC%>/api/v1/set_error.php – abiso ng isang error na naganap.

Rekomendasyon

Upang maprotektahan ang kanilang mga customer mula sa banta ng mga mobile Trojan, dapat gumamit ang mga kumpanya ng mga komprehensibong solusyon na nagbibigay-daan sa kanila na subaybayan at maiwasan ang malisyosong aktibidad nang hindi nag-i-install ng karagdagang software sa mga device ng user.

Upang magawa ito, kailangang palakasin ang mga pamamaraan ng lagda para sa pag-detect ng mga mobile na Trojan gamit ang mga teknolohiya para sa pagsusuri sa gawi ng parehong kliyente at mismong application. Ang proteksyon ay dapat ding may kasamang function ng pagkakakilanlan ng device gamit ang digital fingerprint technology, na gagawing posible na maunawaan kapag ang isang account ay ginagamit mula sa isang hindi tipikal na device at nahulog na sa mga kamay ng isang manloloko.

Ang isang pangunahing mahalagang punto ay ang pagkakaroon ng cross-channel analysis, na nagpapahintulot sa mga kumpanya na kontrolin ang mga panganib na nagmumula hindi lamang sa Internet, kundi pati na rin sa mobile channel, halimbawa, sa mga application para sa mobile banking, para sa mga transaksyon sa mga cryptocurrencies at anumang iba pa kung saan. maaaring isagawa ang mga transaksyon.transaksyon sa pananalapi.

Mga panuntunan sa kaligtasan para sa mga user:

  • huwag mag-install ng mga application para sa isang mobile device na may Android OS mula sa anumang mga mapagkukunan maliban sa Google Play, bigyang-pansin ang mga karapatang hiniling ng application;
  • regular na i-install ang mga update sa Android OS;
  • bigyang-pansin ang mga extension ng mga na-download na file;
  • huwag bisitahin ang mga kahina-hinalang mapagkukunan;
  • Huwag mag-click sa mga link na natanggap sa mga mensaheng SMS.

Pinagbibidahan Semyon Rogacheva, junior specialist sa malware research sa Group-IB Computer Forensics Laboratory.

Pinagmulan: www.habr.com

Magdagdag ng komento