Si Trojan Android Gustuff i merr më të mirat (fiat dhe kriptovaluta) nga llogaritë tuaja

Si Trojan Android Gustuff i merr më të mirat (fiat dhe kriptovaluta) nga llogaritë tuaja

Pikërisht në ditët e fundit, Group-IB njoftoi për aktivitetin e Trojanit Android Gustuff. Ai funksionon ekskluzivisht në tregjet ndërkombëtare, duke sulmuar klientët e 100 bankave më të mëdha të huaja, përdoruesit e 32 portofolëve të kriptomonedhave, si dhe të burimeve të mëdha e-commerce. Ndërsa zhvilluesi i Gustuff është një kriminal kibernetik rus me nofkën Bestoffer. Pati disa kohë që ai e lavdëronte Trojanin e tij si "një produkt serioz për njerëzit me njohuri dhe përvojë".

Specialisti i analizës së malware-it të Group-IB Ivan Pisarjov në studimin e tij tregon në detaje se si funksionon Gustuff dhe çfarë rreziku paraqet.

Kë të sulmon Gustuff

Gustuff i përket një brezi të ri të malware-it me funksione plotësisht të automatizuara. Sipas zhvilluesit, trojani është një version i ri të përmirësuar të malware-it AndyBot, i cili që nga nëntori 2017 sulmon telefonat me sistemin operativ Android dhe vjedh para përmes formave të phishing-ut, të maskuara si aplikacione mobile të bankave dhe sistemeve të pagesave të njohura ndërkombëtare. Bestoffer raportoi se çmimi i qirasë për "Gustuff Bot" ishte 800 dollarë në muaj.

Analiza e mostrës Gustuff tregoi se potencialisht trojani synon klientët që përdorin aplikacionet mobile të bankave më të mëdha, si Bank of America, Bank of Scotland, J.P.Morgan, Wells Fargo, Capital One, TD Bank, PNC Bank, si dhe për portofolët e kriptomonedhave Bitcoin Wallet, BitPay, Cryptopay, Coinbase dhe të tjerë.

Fillimisht e krijuar si një trojan klasik bankar, në versionin aktual Gustuff ka zgjeruar ndjeshëm listën e objektivave potenciale për sulm. Përveç aplikacioneve Android të bankave, kompanive fintech dhe shërbimeve të kriptomonedhave, Gustuff synon përdoruesit e aplikacioneve të tregtisë online, dyqaneve online, sistemeve të pagesave dhe mesazherëve. Në veçanti, PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut dhe të tjerë.

Pika e hyrjes: llogaritja për një infeksion masiv

Gustuff karakterizohet nga një "klasik" vektor depërtimi në smartfonët Android përmes dërgesave SMS me lidhje për APK. Kur një pajisje Android infektohet nga trojani, në komandën e serverit mund të ndodhi përhapja e mëtejshme e Gustuff-it në bazën e kontakteve të telefonit të infektuar ose në bazën e të dhënave të serverit. Mundësitë funksionale të Gustuff-it janë të dizajnuara për infektim masiv dhe maksimalizimin e kapitalit për operatorët e tij - ai ka një funksion unik të "autoshkarkimit" në aplikacionet legjitime bankare mobile dhe portofolat kripto, që lejon shpejtimin dhe zgjerimin e vjedhjes së parave.

Kërkimi i trojanit tregoi se funksioni i autoshkarkimit është realizuar përmes Shërbimit të Aksesueshmërisë - një shërbim për njerëzit me aftësi të kufizuara. Gustuff nuk është trojani i parë që kalon me sukses mbrojtjen nga ndërveprimi me elementët e dritareve të aplikacioneve të tjera përmes këtij shërbimi Android. Megjithatë, përdorimi i Shërbimit të Aksesueshmërisë në kombinim me autoshkarkimin mbetet ende një fenomen relativisht i rrallë.

Pasi Gustuff shkarkohet në telefonin e viktimës, duke përdorur Shërbimin e Aksesueshmërisë, ai fiton mundësinë të ndërveprojë me elementët e dritareve të aplikacioneve të tjera (bankare, kriptovalutës, si dhe aplikacioneve për blerje online, mesazhe dhe të tjera), duke kryer veprimet e nevojshme për këdo që e keqpërdor. Për shembull, me komandën e serverit, trojani mund të shtypë butonat dhe të ndryshojë vlerat e fushave tekstuale në aplikacionet bankare. Përdorimi i mekanizmit të Shërbimit të Aksesueshmërisë i lejon trojanit të kalojë mekanizmat e mbrojtjes që përdoren nga bankat për të parandaluar trojanët mobilë të brezit të kaluar, si dhe ndryshimet në politikën e sigurisë që Google ka implementuar në versionet e reja të sistemit operativ Android. Në këtë mënyrë, Gustuff "di" të çaktivizojë mbrojtjen Google Protect: sipas pretendimeve të autorit, ky funksion aktivizohet në 70% të rasteve.

Si Trojan Android Gustuff i merr më të mirat (fiat dhe kriptovaluta) nga llogaritë tuaja

Gustuff gjithashtu mund të tregojë njoftime PUSH të rreme me ikona të aplikacioneve mobile legjitime. Përdoruesi klikon në njoftimin PUSH dhe sheh një dritare phishing të ngarkuar nga serveri, ku ai vetë fut të dhënat e kërkuara të kartës bankare ose portofolit të kriptomonedhave. Në një skenar tjetër, Gustuff hap aplikacionin të cilit i është treguar njoftimi PUSH. Në këtë rast, ky program malinj nën komandën e serverit përmes Accessibility Service mund të plotësojë fushat e formularit të aplikacionit bankar për një transaksion të paligjshëm.

Funksionaliteti i Gustuff përfshin gjithashtu dërgimin në server të informacionit mbi pajisjen e infektuar, mundësinë për të lexuar/dërguar SMS, dërgimin e kërkesave USSD, nisjen e SOCKS5 Proxy, kalimin përmes lidhjes, dërgimin e skedarëve (përfshirë fotot e dokumenteve, ekranë, fotografi) në server, dhe rivendosjen e pajisjes në gjendjen e fabrikës.

Analiza e programit malinj

Para se të instalohet aplikacioni malinj, sistemi operativ Android i tregon përdoruesit një dritare që përmban një listë të të gjitha të drejtave që kërkon Gustuff:

Si Trojan Android Gustuff i merr më të mirat (fiat dhe kriptovaluta) nga llogaritë tuaja
Instalimi i aplikacionit do të ndodhë vetëm pas marrjes së miratimit nga përdoruesi. Pas aktivizimit të aplikacionit, trojani do të tregojë përdoruesit një dritare:

Si Trojan Android Gustuff i merr më të mirat (fiat dhe kriptovaluta) nga llogaritë tuaja
Pas kësaj, ai do të fshijë ikonën e tij.

Gustuff është paketuar, sipas autorit, me ndihmën e paketuesit FTT. Pas aktivizimit, aplikacioni rregullisht komunikon me serverin CnC për të marrë komandat. Në disa nga skedarët që kemi shqyrtuar, adresa IP u përdor si serveri kontrollues. 88.99.171[.]105 (në të ardhmen do ta quajmë si <%CnC%>).

Pas aktivizimit, programi fillon dërgimin e mesazheve në serverin http:///api/v1/get.php.

Si përgjigje, pritet një JSON i formatit të mëposhtëm:

{
    "results" : "OK",
    "command":{
        "id": "",
        "command":"",
        "timestamp":"",
        "params":{
		
        },
    },
}

Me çdo kërkesë, aplikacioni dërgon informacion mbi pajisjen e infektuar. Formati i mesazhit është prezentuar më poshtë. Duhet theksuar se fushat full, extra, apps и permission janë opsionale dhe do të dërgohen vetëm në rast të kërkesës nga 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%>
} 

Ruajtja e të dhënave të konfigurimit

Gustuff ruan informacion të rëndësishëm për funksionimin në skedarin e preferencave. Emri i skedarit, si dhe emrat e parametrave në të, janë rezultat i llogaritjes së sumës MD5 nga stringu 15413090667214.6.1<%name%>index <%name%> — emri origjinal i çelësit. Interpretimi në Python i funksionit të gjenerimit të emrit:

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

Më vonë do ta quajmë nameGenerator(input).
Pra, emri i skedarit të parë: nameGenerator(«API_SERVER_LIST»), ai përmban vlera me emrat e mëposhtëm:

Emri i variablësVlera
nameGenerator(«API_SERVER_LIST»)Përmban një listë të adresave CnC si një varg.
nameGenerator(«API_SERVER_URL»)Përmban adresën CnC.
nameGenerator(«SMS_UPLOAD»)Flaga e parazgjedhur është e vendosur. Nëse flaga është aktive – dërgon SMS në CnC.
nameGenerator(«SMS_ROOT_NUMBER»)Numri i telefonit në të cilin do të dërgohen SMS-të e pranuara nga pajisja e infektuar. Në parazgjedhje null.
nameGenerator(«SMS_ROOT_NUMBER_RESEND»)Flaga për parazgjedhjen është rivendosur. Nëse është e vendosur – kur pajisja e infektuar merr një SMS, ajo do të dërgohet në numrin root.
nameGenerator(«DEFAULT_APP_SMS»)Flaga për parazgjedhjen është rivendosur. Nëse kjo flag është e vendosur – aplikacioni do të procesojë SMS-të e ardhura.
nameGenerator(«DEFAULT_ADMIN»)Flaga për parazgjedhjen është rivendosur. Nëse flaga është e vendosur – aplikacioni ka të drejta admin.
nameGenerator(«DEFAULT_ACCESSIBILITY»)Flaga për parazgjedhjen është rivendosur. Nëse flaga është e vendosur – shërbimi i aksesueshmërisë është aktivizuar.
nameGenerator(«APPS_CONFIG»)Objekti JSON përmban një listë veprimesh që duhet të kryhen kur ndodhin ngjarjet e aksesueshmërisë të lidhura me një aplikacion të caktuar.
nameGenerator(«APPS_INSTALLED»)Ruaj lista e aplikacioneve të instaluara në pajisje.
nameGenerator(«IS_FIST_RUN»)Flaga resetohet në fillim të funksionimit.
nameGenerator(«UNIQUE_ID»)Përmban identifikues unik. Krijohet në fillimin e parë të botit.

Moduli përpunues i komandave nga serveri

Aplikacioni ruan adresat e serverëve CnC si një masiv të koduar me Base85 të dhënave. Lista e CnC - serverësh mund të ndryshohet kur merr një komandë përkatëse, në këtë rast adresat do të ruhen në skedarin preference.

Në përgjigje të kërkesës, serveri i dërgon aplikacionit një komandë. Vlen të theksohet se komandat dhe parametrat janë përfaqësuar në formatin JSON. Aplikacioni mund të procesojë komandat e mëposhtme:

EkipaPërshkrimi
forwardStartFilloni dërgimin e SMS-ve të pranuara nga pajisja e infektuar në serverin CnC.
forwardStopNdalo dërgimin e SMS-ve të pranuara nga pajisja e infektuar në serverin CnC.
ussdRunKryeni një kërkesë USSD. Numri në të cilin duhet të bëhet kërkesa USSD ndodhet në fushën JSON «number».
sendSmsDërgoni një SMS të vetme (në rast se është e nevojshme, mesazhi ndahet në pjesë). Si parametër, komanda merr një objekt JSON që përmban fushat «to» - numrin e destinacionit dhe «body» - trupin e mesazhit.
sendSmsAbDërgoni SMS (në rast se është e nevojshme, mesazhi ndahet në pjesë) të gjithë kontakteve në pajisjen e infektuar. Intervalli midis dërgesave të mesazheve është 10 sekonda. Trupi i mesazhit ndodhet në fushën JSON «body»
sendSmsMassDërgoni mesazhe SMS (nëse është e nevojshme, mesazhi do të ndahen në pjesë) kontakteve të specificuara në parametrat e komandës. Intervali midis dërgimeve të mesazheve është 10 sekonda. Si parameter, komanda merr një array JSON (fusha «sms»), elementët e të cilit përmbajnë fushat «to» — numri i destinacionit dhe «body» — trupi i mesazhit.
changeServerKjo komandë si parameter mund të marrë një vlerë me çelësin «url» — atëherë boti do të ndryshojë vlerën nameGenerator(“SERVER_URL”), ose «array» — atëherë boti do të regjistrojë array në nameGenerator(“API_SERVER_LIST”). Në këtë mënyrë, aplikacioni ndryshon adresën e serverëve CnC.
adminNumberKomanda është e destinuar për të punuar me numrin root. Komanda pranon një objekt JSON me parametrat e mëposhtëm: «number» — ndrysho nameGenerator(“ROOT_NUMBER”) në vlerën e marrë, «resend» — ndrysho nameGenerator(“SMS_ROOT_NUMBER_RESEND”), «sendId» — dërgo në nameGenerator(“ROOT_NUMBER”) uniqueID.
updateInfoDërgoni në server informacionin për pajisjen e infektuar.
wipeDataKomanda është e destinuar për të fshirë të dhënat e përdoruesit. Në varësi të emrit me të cilin është nisur aplikacioni, ndodhin ose fshirja e plotë e të dhënave me rigjenerim të pajisjes (përdoruesi kryesor), ose fshirja vetëm e të dhënave të përdoruesit (përdoruesi sekondar).
socksStartNisni modulin Proxy. Funksionimi i modulit është i përshkruar në një seksion të veçantë.
socksStopNdalo punën e modulit Proxy.
openLinkShkoni në lidhje. Lidhja gjendet në parameterin JSON me çelësin «url». Për të hapur lidhjen përdoret «android.intent.action.VIEW».
uploadAllSmsDërgoni në server të gjitha mesazhet SMS të pranuara nga pajisja.
uploadAllPhotosDërgoni në URL imazhin nga pajisja e infektuar. URL vjen si parameter.
uploadFileDërgoni në URL skedarin nga pajisja e infektuar. URL vjen si parameter.
uploadPhoneNumbersDërgoni në server numrat e telefonit nga lista e kontakteve. Nëse si parameter vjen një objekt JSON me vlerën e çelësit «ab», aplikacioni merr listën e kontakteve nga agenda telefonike. Nëse si parameter vjen një objekt JSON me çelësin «sms», aplikacioni lexon listën e kontakteve nga dërguesit e mesazheve SMS.
changeArchiveAplikacioni ngarkon një skedar nga adresa që është marrë si parametrin me çelësin "url". Skedari i ngarkuar ruhet me emrin "archive.zip". Pas kësaj, aplikacioni e zbërthen skedarin, duke përdorur në rast nevoje fjalëkalimin e arkës "b5jXh37gxgHBrZhQ4j3D". Skedari i zbërthyer ruhet në direktorinë [external storage] /hgps. Në këtë direktori, aplikacioni ruan web-fake (të përshkruar më poshtë).
actionsKomanda është e destinuar për të punuar me Shërbimin e Veprimit, i cili është përshkruar në një seksion të veçantë.
testNuk bën asgjë.
downloadKomanda është e destinuar për të ngarkuar një skedar nga një server i largët dhe për ta ruajtur atë në direktorinë "Downloads". URL dhe emri i skedarit vijnë si parametrat, fushat në objektin JSON me çelësat përkatës "url" dhe "fileName".
removeFshin skedarin nga direktoria "Downloads". Emri i skedarit vjen në parametrin JSON me çelësin "fileName". Emri standard i skedarit është "tmp.apk".
notificationTregon një njoftim me tekstet e përshkrimit dhe titullit, të përcaktuara nga serveri menaxhues.

Formati i komandës notification:

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

Njoftimi, që krijohet nga skedari që po studiohet, duket identik me njoftimet, që krijohen nga aplikacioni, i specifikuar në fushën app. Nëse vlera e fushës openApp — True, kur hapet njoftimi, lançon aplikacionin, që është specifikuar në fushën app. Nëse vlera e fushës openApp — False, atëherë:

  • hapet një dritare phishing, përmbajtja e të cilës ngarkohet nga direktoria /hgps/
  • hapet një dritare phishing, përmbajtja e të cilës ngarkohet nga serveri ?id=&app=
  • hapet një dritare phishing, e maskuar si Google Play Card, me mundësinë për të futur të dhënat e kartës.

Rezultati i ekzekutimit të çdo komande aplikacioni e dërgon në set_state.php në formën e një objekti JSON me formatin e mëposhtëm:

{
    "command":
    {
        "command":,
        "id":,
        "state":
    }
    "id":
}

ActionsService
Në listën e komandave që përpunon aplikacioni, përfshihet action. Kur merr një komandë, moduli i përpunimit të komandave i qaset këtij shërbimi me qëllim që të ekzekutojë komandën e zgjeruar. Si parametrat, shërbimi pranon një objekt JSON. Shërbimi mund të ekzekutojë komandat e mëposhtme:

1. PARAMS_ACTION — kur të pranohet një porosi e tillë, shërbimi në radhë të parë merr nga parametri JSON vlerën sipas çelësit Type, që mund të jetë si më poshtë:

  • serviceInfo – nënkomanda merr nga parametri JSON vlerën sipas çelësit includeNotImportant. Nëse flagu është i barabartë me True — aplikacioni vendos flagun FLAG_ISOLATED_PROCESS në shërbimin që përdor Accessibility Service. Në këtë mënyrë, shërbimi do të niset në një proces të veçantë.
  • root — të marrë dhe dërgojë në server informacionin rreth dritares që është aktualisht në fokus. Aplikacioni merr informacionin me anë të klasës AccessibilityNodeInfo.
  • admin — kërko të drejtat e administratorit.
  • delay — ndalon funksionimin e ActionsService për numrin e milisekondave, që është e specifikuar në parametrin sipas çelësit "data".
  • windows — dërgo listën e dritareve të dukshme për përdoruesin.
  • instalo — instalon aplikacionin në pajisjen e infektuar. Emri i paketës — arkivi ndodhet në çelësin "fileName". Arkivi vetë ndodhet në direktorinë Downloads.
  • global – nënkomanda e dedikuar për të bërë kalimin nga dritarja aktuale:
    • në menunë Quick Settings
    • mbrapa
    • në shtëpi
    • tek njoftimet
    • në dritaren e aplikacioneve të hapura së fundmi

  • launch — nis aplikacionin. Emri i aplikacionit vjen si parametër sipas çelësit data.
  • sounds — ndryshon modin e zërit në heshtje.
  • unlock — aktivizon ndriçimin e ekranit dhe tastierës në të gjithë shkallën. Aplikacioni e realizon këtë veprim me anë të WakeLock, duke e shënuar si tag [Application lable]:INFO
  • permissionOverlay — funksioni nuk është realizuar (përgjigja për ekzekutimin e komandës — {"message":"Not support"} ose {"message":"low sdk"})
  • gesture — funksioni nuk është realizuar (përgjigja për ekzekutimin e komandës — {"message":"Not support"} ose {"message":"Low API"})
  • permissions — kjo komandë është e nevojshme për kërkesën e të drejtave për aplikacionin. Megjithatë, funksioni i kërkesës nuk është realizuar, kështu që komanda nuk ka kuptim. Lista e të drejtave të kërkuara vjen si një varg JSON me çelësin "permissions". Lista standarde:
    • 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

  • open — shfaq dritaren e phishing. Sipas parametrave që vijnë nga serveri, aplikacioni mund të tregojë dritare të ndryshme phishing:
    • Trego dritaren e phishing, përmbajtja e së cilës është e përshkruar në skedarin në direktorinë /hgps/Rezultati i ndërveprimit të përdoruesit me dritaren do të dërgohet në adresën <%CnC%>\/records.php
    • Trego dritaren phishing, përmbajtja e së cilës ngarkohet paraprakisht nga adresa <%url_param%>?id=<%bot_id%>&app=<%packagename%>Rezultati i ndërveprimit të përdoruesit me dritaren do të dërgohet në adresën <%CnC%>\/records.php
    • Trego dritaren phishing të veshur si Google Play Card.

  • interaktive — komanda është e destinuar për ndërveprimin me elementet e dritareve të aplikacioneve të tjera me anë të AccessibilityService. Për ndërveprimin, programi ka implementuar një shërbim të veçantë. Aplikacioni në studim mund të ndërveprojë me dritaret:
    • Aktualisht aktive. Në këtë rast, parametri përmban id ose tekst (emri) i objektit me të cilin duhet të ndërveprohet.
    • Të dukshme për përdoruesin në momentin e ekzekutimit të komandës. Aplikacioni zgjedh dritaret sipas id.

    Duke marrë objektet AccessibilityNodeInfo për elementet e interesit të dritares, aplikacioni mund të kryejë veprime në varësi të parametrave:

    • focus — vendos fokusin mbi objektin.
    • click — klikoni në objektin.
    • actionId — kryeni veprimin sipas ID-së.
    • setText — ndryshoni tekstin e objektit. Ndryshimi i tekstit mund të bëhet në dy mënyra: duke kryer veprimin ACTION_SET_TEXT (nëse versioni i Android të pajisjes së infektuar është më i vogël ose i barabartë me LOLLIPOP), ose duke e vendosur në skedarin e kopjimit njëër rresht dhe duke e ngjitur në objekt (për versionet më të reja). Kjo komandë mund të përdoret për të ndryshuar të dhënat në aplikacionin bankar.

2. PARAMS_ACTIONS — është e njëjta gjë si PARAMS_ACTION, vetëm se vjen si një array JSON komandash.

Duket se shumë do të jenë të interesuar të dinë se si duket funksioni i ndërveprimit me elementet e dritares së një aplikacioni tjetër. Ky është mënyra si është realizuar kjo mundësi funksionale në 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));
}

Funksioni për ndryshimin e tekstit:

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

Kështu, me konfigurimin e duhur të serverit të kontrollit, Gustuff është në gjendje të plotësojë fushat e teksteve në aplikacionin bankar dhe të klikojë butonat e nevojshëm për të kryer transaksionet. Trojani nuk do të ketë nevojë të kalojë autorizimin në aplikacion — mjafton të dërgojë një komandë për të demonstruar njoftimin PUSH me hapjen e aplikacionit bankar të instaluar më parë. Përdoruesi do të kalojë vetë autorizimin, pas së cilës Gustuff do të jetë në gjendje të realizojë autologimin.

Moduli i përpunimit të SMS-ve

Aplikacioni vendos një trajtues ngjarjesh për pranimin e SMS-ve të infektuar. Aplikacioni në studim mund të pranojë komanda nga operatori, të cilat vijnë në përmbajtjen e SMS-ve. Komandat vijnë në formatin:

7!5=<%Base64 encoded command%>

Aplikacioni kërkon në të gjitha SMS-të e ardhura varg. 7!5=, kur zbulohet vargu - dekodon nga Base64 vargun me zhvendosje 4 dhe ekzekuton komandën. Komandat janë të ngjashme me komandat me CnC. Rezultati i ekzekutimit dërgohet në atë numër, nga i cili erdhi komanda. Formati i përgjigjes:

7*5=<%Base64 encode of «result_code command»%>

Opcionalisht, aplikacioni mund të dërgojë të gjitha mesazhet e pranuara në numrin Root. Për këtë, në skedarin e preferencave duhet të specifikohet numri Root dhe të vendoset flagu i ridirektimit të mesazheve. Mesazhi SMS dërgohet në numrin e sulmuesit në formatin:

Gjithashtu opcionalisht, aplikacioni mund të dërgojë mesazhe në CnC. Mesazhi SMS dërgohet në server në formatin JSON:

{
    "id":,
    "sms":
    {
        "text":,
        "number":,
        "date":
    }
}

Nëse është vendosur flagu nameGenerator(«DEFAULT_APP_SMS») – aplikacioni ndalon përpunimin e mesazhit SMS dhe e pastron listën e mesazheve të pranuara.

Moduli Proxy

Në aplikacionin e shqyrtuar, është i pranishëm moduli Backconnect Proxy (më pas Moduli Proxy), i cili ka një klasë të veçantë, e cila përfshin fushat statike me konfigurim. Të dhënat konfiguruese ruhen në skemë në formë të hapur:

Si Trojan Android Gustuff i merr më të mirat (fiat dhe kriptovaluta) nga llogaritë tuaja

Të gjitha veprimet që kryhen nga Moduli Proxy regjistrohen në skedarë. Për këtë, aplikacioni në Storage të Jashtëm krijon një direktor me emrin 'logs' (fusha ProxyConfigClass.logsDir në klasën konfiguruese), ku ruhen skedarët e log-eve. Regjistrimi ndodh në skedarë me emrat:

  1. main.txt – në këtë skedar regjistrohet puna e klasës me emrin CommandServer. Në vazhdim, regjistrimi i vargut str në këtë skedar do të quhet mainLog(str).
  2. session-.txt – në këtë skedar regjistrohen të dhënat log, të lidhura me një sesion të caktuar të prokseve. Në vazhdim, regjistrimi i vargut str në këtë skedar do të quhet sessionLog(str).
  3. server.txt – në këtë skedar regjistrohet të gjitha të dhënat e shkruara në skedarët e përshkruar më lart.

Formati i të dhënave të regjistrimit:

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

Përjashtimet që ndodhin gjatë punës së Modulit Proxy gjithashtu regjistrohen në skedar. Për këtë, aplikacioni formon një objekt JSON në formatin:

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

Ajo konverton në një përfaqësim me tekst dhe e regjistron atë.

Lëshimi i modulit Proxy ndodh pas marrjes së komandës përkatëse. Pas pranimimit të komandës për të aktivizuar modul Proksi, aplikacioni aktivizon shërbimin me emrin MainService, i cili është përgjegjës për menaxhimin e funksionimit të modulit Proxy – aktivizimin dhe ndalimin e tij.

Hapat e aktivizimit të shërbimit:

1. Aktivizon një timer që funksionon një herë në minutë dhe kontrollon aktivitetin e modulit Proxy. Nëse moduli nuk është aktiv – e aktivizon atë.
Gjithashtu, kur ndodh ngjarja android.net.conn.CONNECTIVITY_CHANGE aktivizohet moduli Proxy.

2. Aplikacioni krijon një wake-lock me parametrin PARTIAL_WAKE_LOCK dhe e kap atë. Në këtë mënyrë nuk lejon që CPU i pajisjes të kalojë në gjendjen e gjumit.

3. Aktivizon klasën përpunuese të komandave të modulit Proxy, duke regjistruar paraprakisht vargun mainLog(«start server») и

Server::start() host[], commandPort[], proxyPort[]

ku proxy_cnc, command_port dhe proxy_port – parametrat e marra nga konfigurimi i serverit Proxy.

Klasës përpunuese të komandave i është dhënë emri CommandConnection. Menjëherë pas aktivizimit kryen veprimet e mëposhtme:

4. Lidhet me ProxyConfigClass.host: ProxyConfigClass.commandPort dhe dërgon atje të dhëna për pajisjen e infektuar në formatin JSON:

{
    "id":,
    "imei":,
    "imsi":,
    "model":,
    "manufacturer":,
    "androidVersion":,
    "country":,
    "partnerId":,
    "packageName":,
    "networkType":,
    "hasGsmSupport":,
    "simReady":,
    "simCountry":,
    "networkOperator":,
    "simOperator":,
    "version":
}

Ku:

  • id – identifikuesi, përpiqet të marrë nga skedari Shared Preference me emrin «x» vlerën me fushën «id». Nëse kjo vlerë nuk mund të merret – gjeneron një të re. Në këtë mënyrë, moduli Proxy ka identifikuesin e tij, i cili gjenerohet në të njëjtën mënyrë si ID e Bot.
  • imei – IMEI i pajisjes. Nëse ndodh një gabim gjatë marrjes së vlerës – në vend të kësaj fushe do të shkruhet një mesazh gabimi.
  • imsi — Identiteti Ndërkombëtar i Abonentit të Mobilit të pajisjes. Nëse ka ndodhur një gabim gjatë marrjes së vlerës, në vend të këtij fushe do të regjistrohet një mesazh gabimi.
  • model — Emri i dukshëm për përdoruesin i produktit përfundimtar.
  • manufacturer — Prodhuesi i produktit/pajisjes (Build.MANUFACTURER).
  • androidVersion — një varg në formatin « (),»
  • country — vendndodhja aktuale e pajisjes.
  • partnerId – një varg i zbrazët.
  • packageName – emri i paketës.
  • networkType — tipi aktual i lidhjes rrjet, (shembuj: «WIFI», «MOBILE»). Në rast të një gabimi kthehet null.
  • hasGsmSupport – true – nëse telefoni mbështet GSM, përndryshe false.
  • simReady – gjendja e kartës SIM.
  • simCountry — kodi ISO i vendit (në bazë të ofruesit të kartës SIM).
  • networkOperator — emri i operatorit. Nëse ka ndodhur një gabim gjatë marrjes së vlerës, në vend të këtij fushe do të regjistrohet një mesazh gabimi.
  • simOperator — Emri i Shërbimit të Ofruesit (SPN). Nëse ka ndodhur një gabim gjatë marrjes së vlerës, në vend të këtij fushe do të regjistrohet një mesazh gabimi.
  • version — kjo fushë ruan informacionin në klasën e konfigurimit, për versionet e shqyrtuara të botit ajo ishte e barabartë me «1.6».

5. Kaloni në modalitetin e pritjes për komandat nga serveri. Komandat nga serveri vijnë në formatin:

  • 0 offset – komandë
  • 1 offset – sessionId
  • 2 offset – gjatësia
  • 4 offset — të dhëna

Kur merr një komandë, aplikacioni logon:
mainLog(«Header { sessionId, type[], length[] }»)

Komandat e mëposhtme janë të mundshme nga serveri:

EmriKomandëTë dhënaPërshkrimi
connectionId0ID e LidhjesKrijoni një lidhje të re
SLEEP3KohaPejtoni funksionimin e modulit Proxy
PING_PONG4Dërgoni një mesazh PONG

Mesazhi PONG përbëhet nga 4 byte dhe duket si më poshtë: 0x04000000.

Kur merr komandën connectionId (për krijimin e lidhjes së re) CommandConnection krijon një instancë të klasës ProxyConnection.

  • Në prokristimin marrin pjesë dy klasa: ProxyConnection и end. Kur krijohet klasa ProxyConnection ndodh lidhja me adresën ProxyConfigClass.host: ProxyConfigClass.proxyPort dhe dërgimi i objektit JSON:

 {
    "id":
}

Në përgjigje, serveri dërgon një mesazh SOCKS5, i cili përmban adresën e serverit të largët, me të cilin duhet të krijohet lidhja. Ndërveprimi me këtë server ndodh përmes klasës end. Skematikisht, vendosja e lidhjes mund të paraqitet si më poshtë:

Si Trojan Android Gustuff i merr më të mirat (fiat dhe kriptovaluta) nga llogaritë tuaja

Ndërveprimet rrjetërore

Për të parandaluar analizën e trafikut nga sniffers të rrjetit, interaksioni midis serverit CnC dhe aplikacionit mund të mbrohet përmes protokollit SSL. Të gjitha të dhënat e transmetuara, si nga serveri ashtu edhe në server, janë në formatin JSON. Aplikacioni gjatë funksionimit kryen kërkesat e mëposhtme:

  • http:///api/v1/set_state.php — rezultati i ekzekutimit të komandës.
  • http:///api/v1/get.php — marrja e komandës.
  • http:///api/v1/load_sms.php — ngarkimi i SMS-ve nga pajisja e infektuar.
  • http:///api/v1/load_ab.php — ngarkimi i listës së kontakteve nga pajisja e infektuar.
  • http:///api/v1/aevents.php – kërkesa bëhet gjatë përditësimit të parametra që ndodhen në skedarin preference.
  • http:///api/v1/set_card.php — ngarkimi i të dhënave të marra përmes dritares phishing, që maskohet si Google Play Market.
  • http:///api/v1/logs.php – ngarkimi i të dhënave log.
  • http:///api/v1/records.php – ngarkimi i të dhënave të marra përmes dritareve phishing.
  • http:///api/v1/set_error.php – njoftimi për ndodhinë e një gabimi.

Rekomandime

Për të mbrojtur klientët e tyre nga kërcënimi i trojanëve mobil, kompanitë duhet të përdorin zgjidhje të plota, që lejojnë mbikëqyrjen dhe parandalimin e aktiviteteve të dëmshme pa instaluar softuer të tjera në pajisjet e përdoruesve.

Për këtë, metodat e zbulimit të trojanëve mobil duhet të forcohen me teknologji analize komportamentale si të klientit ashtu edhe të vetë aplikacionit. Po ashtu, mbrojtja duhet të përfshijë funksionin e identifikimit të pajisjeve duke përdorur teknologjinë e gishtit digjital, e cila do të lejojë të kuptohet kur llogaria përdoret nga një pajisje jotipike dhe tashmë ka rënë në duar të mashtruesve.

Një pikë thelbësore është ekzistenca e mundësisë për analizën ndërkanal, e cila i jep mundësi kompanive të kontrollojnë risket që lindin jo vetëm në anën e internetit, por edhe në kanalin mobil, për shembull, në aplikacione për bankat mobile, për operacione me kriptovaluta dhe çdo tjetër, ku mund të realizohet një transaksion financiar.

Rregullat e sigurisë për përdoruesit:

  • mos instaloni aplikacione për pajisje mobile me sistemin operativ Android nga burime të tjera përveç Google Play, kushtoni vëmendje të veçantë të drejtave që kërkon aplikacioni;
  • instaloni rregullisht përditësimet e sistemit operativ Android;
  • të kushtohet vëmendje zgjerimeve të skedave të ngarkuara;
  • të mos vizitoni burime dyshuese;
  • të mos klikoni në lidhjet e marrë në mesazhet SMS.

Me pjesëmarrjen e Semen Rogačev, specialistit të ri për hulumtimin e kodit të keqbërësit në Laboratorin e Kriminalistikës Kompjuterike Group-IB.

Burimi: habr.com

Купить надежный хостинг для сайтов с защитой от DDoS, VPS VDS серверы 🔥 Купить надежный хостинг для сайтов с защитой от DDoS, VPS VDS серверы | ProHoster