
Së fundmi Group-IB për aktivitetin e Trojan-it të Android Gustuff. Ai vepron 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 burimeve të mëdha e-commerce. Ndërkohë, zhvilluesi i Gustuff është një kriminel kibernetik rus me pseudonimin Bestoffer. Pak kohë më parë, ai e reklamonte Trojan-in e tij si "një produkt serioz për njerëzit me njohuri dhe përvojë".
Specialisti për analizën e malware-it Group-IB Ivan Pisarëv në studimin e tij shpjegon në detaje sesi funksionon Gustuff dhe çfarë rreziku përfaqëson ai.
Kush është në shënjestër nga Gustuff
Gustuff i përket një brezi të ri të programeve të dëmshme me funksione të plota automatizuese. Sipas zhvilluesit, Trojan-i është një version i ri e përmirësuar i programit të dëmshëm AndyBot, i cili nga nëntori 2017 sulmon telefonat me OS Android dhe vjedh para përmes formave të falsifikuara të internetit, të cilat maskohen si aplikacione mobile të bankave të njohura ndërkombëtare dhe sistemeve të pagesave. Bestoffer ka raportuar se çmimi i qirasë për "Gustuff Bot" ishte 800 $ në muaj.
Analiza e mostrës së Gustuff ka treguar se potencialisht Trojan-i është drejtuar ndaj klientëve që përdorin aplikacione 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 ndaj portofolëve të kriptomonedhave Bitcoin Wallet, BitPay, Cryptopay, Coinbase etj.
Fillimisht i krijuar si një Trojan bankar klasik, versioni aktual i Gustuff ka zgjeruar ndjeshëm listën e objekteve të mundshme për sulm. Përveç aplikacioneve bankare të kompanive fintech dhe shërbimeve të kriptomonedhave, Gustuff sulmon përdoruesit e aplikacioneve të tregjeve, dyqaneve online, sistemeve të pagesave dhe mesazherëve. Në veçanti, PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut dhe të tjerët.
Pika e hyrjes: shpresohet në infektimin masiv
Gustuff ka njĂ« vektor «klasik» pĂ«r infektimin e smartphone-ve Android nĂ«pĂ«rmjet mesazheve SMS me lidhje pĂ«r APK. Kur njĂ« pajisje Android infektohet nga trojani, ai mund tĂ« shpĂ«rndajĂ« Gustuff-it nĂ«pĂ«rmjet kontakteve tĂ« telefonit tĂ« infektuar ose nĂ« bazĂ«n e tĂ« dhĂ«nave tĂ« serverit. Funksionalitetet e Gustuff janĂ« tĂ« dizajnuara pĂ«r infektim masiv dhe maksimizimin e kapitalizimit tĂ« biznesit tĂ« operuesve tĂ« tij â ai ka njĂ« funksion unik tĂ« «autozalit» nĂ« aplikacione legjitime bankare mobile dhe portofolat kriptografikĂ«, qĂ« lejon tĂ« pĂ«rshpejtojĂ« dhe tĂ« pĂ«rmasojĂ« vjedhjen e parave.
Studimi i trojanit ka treguar se funksioni i autolizĂ«s Ă«shtĂ« implementuar me ndihmĂ«n e Accessibility Service â njĂ« shĂ«rbim pĂ«r njerĂ«zit me aftĂ«si tĂ« kufizuara. Gustuff nuk Ă«shtĂ« trojani i parĂ« qĂ« kalon me sukses mbrojtjen ndaj ndĂ«rveprimit me elemente tĂ« dritareve tĂ« aplikacioneve tĂ« tjera pĂ«rmes kĂ«tij shĂ«rbimi Android. MegjithatĂ«, pĂ«rdorimi i Accessibility Service sĂ« bashku me autolizĂ«n mbetet ende njĂ« fenomen mjaft tĂ« rrallĂ«.
Pas shkarkimit në telefonin e viktimës, Gustuff, duke përdorur Accessibility Service, merr mundësinë të ndërveprojë me elementet e dritareve të aplikacioneve të tjera (bankare, kriptovalutash, si dhe aplikacione për blerje online, mesazhe etj.), duke kryer veprimet e nevojshme për sulmuesit. Për shembull, me urdhrin e serverit, trojani mund të klikohet në butona dhe të ndryshojë vlerat e fushave të tekstit në aplikacionet bankare. Përdorimi i mekanizmit të Accessibility Service lejon trojanin të kalojë mekanizmat e mbrojtjes që bankat përdorin për të kundërshtuar trojanët e telefonave mobil të brezit të kaluar, si dhe ndryshimet në politikat e sigurisë të implementuara nga Google në versionet e reja të sistemit operativ Android. Kështu, Gustuff «di» të çaktivizojë mbrojtjen Google Protect: sipas pretendimeve të autorit, ky funksion aktivizohet në 70% të rasteve.

Gjithashtu, Gustuff mund të tregojë njoftime PUSH fals me ikona të aplikacioneve të legjitimta mobile. Përdoruesi klikoni në njoftimin PUSH dhe sheh një dritare phishing të ngarkuar nga serveri, ku ai vetë fut informacionin e kërkuar për kartën bankare ose portofolin krypto. Në një skenar tjetër, Gustuff hap aplikacionin nën emrin e të cilit ishte shfaqur njoftimi PUSH. Në këtë rast, programi keqdashës me urdhrin e serverit përmes Accessibility Service mund të mbushë fushat e formës së aplikacionit bankar për një transaksion mashtrues.
Funksionalitetet e Gustuff përfshijnë gjithashtu dërgimin në server të informacionit mbi pajisjen e infektuar, mundësinë e leximit/dërgimit të mesazheve SMS, dërgimin e kërkesave USSD, aktivizimin e SOCKS5 Proxy, kalimin përmes lidhjeve, dërgimin e skedarëve (përfshirë skanime dokumentesh, screenshot-e, fotografi) në server, dhe rikthimin e pajisjes në parametrat fabrikë.
Analiza e programit keqdashës
Para instalimit të aplikacionit keqdashës, sistemi operativ Android i tregon përdoruesit një dritare që përmban një listë të të drejtave të kërkuara nga Gustuff:

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:

Pas kësaj, do të fshijë ikonën e tij.
Gustuff është i paketuar, sipas autorit, me ndihmën e paketuesit FTT. Pas aktivizimit, aplikacioni herë pas here i drejtohet serverit CnC për të marrë komanda. Në disa skedarë të hulumtuar nga ne, si server mbikëqyrës është përdorur adresa IP 88.99.171[.]105 (në vazhdim 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 në formatin e 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ë i paraqitur më poshtë. Duhet theksuar se fushat full, extra, aplikacione dhe permission së bashku me dy fusha janë opsionale dhe do të dërgohen vetëm në rastin e një kërkese komande 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 pĂ«r funksionimin nĂ« skedarin e preferencĂ«s. Emri i skedarit, ashtu si emrat e parametrave nĂ« tĂ«, Ă«shtĂ« rezultat i llogaritjes sĂ« hash-it MD5 tĂ« vargut. 15413090667214.6.1, ku <%name%> â emri origjinal çelĂ«s-vlerĂ«. Interpretimi nĂ« Python i funksionit tĂ« gjenerimit tĂ« emrit:
nameGenerator(input):
output = md5("15413090667214.6.1" + input) Në vazhdim, do të tregojmë si nameGenerator(input).
Kështu, emri i skedarit të parë: nameGenerator("API_SERVER_LIST"), ai përmban vlera me emrat e mëposhtëm:
| Emri i ndryshores | Vlera |
|---|---|
| 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") | Flaksohet nga default. NĂ«se flamuri Ă«shtĂ« i vendosur â dĂ«rgon mesazhe SMS nĂ« CnC. |
| nameGenerator(«SMS_ROOT_NUMBER») | Numri i telefonit, në të cilin do të dërgohen mesazhet SMS të pranuara nga pajisja e infektuar. Në mënyrë standart, null. |
| nameGenerator(«SMS_ROOT_NUMBER_RESEND») | Flaga në mënyrë standart është çaktivizuar. Nëse aktivizohet - kur marrë pajisja e infektuar një SMS, ai do të dërgohet në numrin root. |
| nameGenerator(«DEFAULT_APP_SMS») | Flaga në mënyrë standart është çaktivizuar. Nëse ky flag aktivizohet - aplikacioni do të përpunojë mesazhet SMS të ardhura. |
| nameGenerator(«DEFAULT_ADMIN») | Flaga në mënyrë standart është çaktivizuar. Nëse flaga aktivizohet - aplikacioni ka të drejtat e administratorit. |
| nameGenerator(«DEFAULT_ACCESSIBILITY») | Flaga në mënyrë standart është çaktivizuar. Nëse flaga aktivizohet - shërbimi që përdor Accessibility Service është aktivizuar. |
| nameGenerator(«APPS_CONFIG») | Objekti JSON, përmban një listë veprimesh që duhet të kryhen kur ndodh një ngjarje Accessibility lidhur me një aplikacion të caktuar. |
| nameGenerator(«APPS_INSTALLED») | Mban listën e aplikacioneve të instaluara në pajisje. |
| nameGenerator(«IS_FIST_RUN») | Flaga çaktivizohet gjatë ekzekutimit të parë. |
| nameGenerator(«UNIQUE_ID») | Përmban një identifikues unik. Gjenerohet gjatë ekzekutimit të parë të botit. |
Moduli përpunimit të komandave nga serveri
Aplikacioni mban adresat e serverëve CnC në formën e një array të koduar me Base85 të dhënave. Lista CnC - servera mund të ndryshohet me ardhjen e një komande përkatëse, në atë rast adresat do të mbahen në skedarin e preferencave.
Në përgjigje të kërkesës, serveri dërgon aplikacionit një komandë. Vlen të theksohet se komandat dhe parametrat janë paraqitur në formatin JSON. Aplikacioni mund të përpunojë komandat në vijim:
| Ekipa | Përshkrimi |
|---|---|
| forwardStart | Filloni dërgimin e mesazheve SMS të pranuara nga pajisja e infektuar në serverin CnC. |
| forwardStop | Ndalo dërgimin e mesazheve SMS të pranuara nga pajisja e infektuar në serverin CnC. |
| ussdRun | Kryeni një kërkesë USSD. Numri, për të cilin duhet të bëhet kërkesa USSD, ndodhet në fushën JSON «number». |
| sendSms | Dërgoni një mesazh SMS (nëse është e nevojshme, mesazhi «ndahen» në pjesë). Si parametër, komanda merr një objekt JSON, që përmban fushat «to» - numri i destinacionit dhe «body» - trupi i mesazhit. |
| sendSmsAb | Dërgoni mesazhe SMS (nëse është e nevojshme, mesazhi «ndahen» në pjesë) të gjithë atyre që janë në listën e kontaktëve të pajisjes së infektuar. Intervali midis dërgimeve të mesazheve është 10 sekonda. Trupi i mesazhit ndodhet në fushën JSON «body» |
| sendSmsMass | DĂ«rgoni mesazhe SMS (nĂ«se Ă«shtĂ« e nevojshme mesazhi "ndahen" nĂ« pjesĂ«) kontakteve tĂ« specifikuara nĂ« parametrat e komandĂ«s. Intervali midis dĂ«rgimeve tĂ« mesazheve â 10 sekonda. Si njĂ« parametĂ«r, komanda pranon njĂ« array JSON (fusha "sms"), elementet e tĂ« cilit pĂ«rmbajnĂ« fushat "to" â numri i destinacionit dhe "body" â pĂ«rmbajtja e mesazhit. |
| changeServer | Kjo komandĂ« si njĂ« parametĂ«r mund tĂ« pranojĂ« vlerĂ«n 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"). KĂ«shtu aplikacioni ndryshon adresĂ«n e serverĂ«ve CnC. |
| adminNumber | Komanda Ă«shtĂ« e destinuar pĂ«r tĂ« punuar me numrin root. Komanda pranon njĂ« objekt JSON me parametrat e mĂ«poshtĂ«m: "number" â ndryshoni nameGenerator("ROOT_NUMBER") nĂ« vlerĂ«n e marrĂ«, "resend" â ndryshoni nameGenerator("SMS_ROOT_NUMBER_RESEND"), "sendId" â dĂ«rgoni nĂ« nameGenerator("ROOT_NUMBER") uniqueID. |
| updateInfo | Dërgoni në server informacionin mbi pajisjen e infektuar. |
| wipeData | Komanda ë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 rinisjen e pajisjes (përdoruesi kryesor), ose fshirja vetëm e të dhënave të përdoruesit (përdoruesi sekondar). |
| socksStart | Nisni modulin Proxy. Funksionimi i modulit përshkruhet në një seksion të veçantë. |
| socksStop | Përfundo modulin Proxy. |
| openLink | Kalo në lidhjen. Lidhja ndodhet në parametrin JSON me çelësin "url". Për të hapur lidhjen përdoret "android.intent.action.VIEW". |
| uploadAllSms | Dërgoni në server të gjitha mesazhet SMS të pranuara nga pajisja. |
| uploadAllPhotos | Dërgoni në URL imazhin nga pajisja e infektuar. URL vjen si parametër. |
| uploadFile | Dërgoni në URL skedarin nga pajisja e infektuar. URL vjen si parametër. |
| uploadPhoneNumbers | Dërgoni në server numrat e telefonit nga lista e kontakteve. Nëse si një parametër vjen një objekt JSON me vlerën me çelësin "ab", aplikacioni merr listën e kontakteve nga libri i telefonit. Nëse si një parametër vjen një objekt JSON me çelësin "sms", aplikacioni lexon listën e kontakteve nga dërguesit e mesazheve SMS. |
| changeArchive | Aplikacioni ngarkon një skedar nga adresa, e cila vjen si parametër me çelësin «url». Skedari i ngarkuar ruhet me emrin «archive.zip». Pas kësaj, aplikacioni e nxjerr skedarin, duke përdorur, nëse është e nevojshme, fjalëkalimin për arkivin «b5jXh37gxgHBrZhQ4j3D». Skedarët e nxjerrë ruhen në drejtori [external storage]/hgps. Në këtë drejtori, aplikacioni ruan web-fakes (përshkruar më poshtë). |
| veprime | Kjo komandë është e destinuar për të punuar me Shërbimin e Veprimit, i cili përshkruhet në një seksion të veçantë. |
| test | Nuk bën asgjë. |
| shkarko | Kjo komandë është e destinuar për të ngarkuar një skedar nga një server i largët dhe për ta ruajtur atë në drejtori «Downloads». URL dhe emri i skedarit vijnë si parametër, fushat në objektin JSON janë përkatësisht: «url» dhe «fileName». |
| remove | Fshin skedarin nga drejtoria «Downloads». Emri i skedarit vjen në parametrin JSON me çelësin «fileName». Emri standard i skedarit është «tmp.apk». |
| njoftim | Shfaq një njoftim me tekstet e përshkrimit dhe titullit, të përcaktuara nga serveri menaxhues. |
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 krijuar nga skedari qĂ« po hetohet, duket identik me njoftimet e krijuara nga aplikacioni, i cili Ă«shtĂ« specifikuar nĂ« fushĂ«n app. NĂ«se vlera e fushĂ«s openApp â True, kur hapet njoftimi, ndizet aplikacioni, i cili Ă«shtĂ« specifikuar nĂ« fushĂ«n app. NĂ«se vlera e fushĂ«s openApp â False, atĂ«herĂ«:
- hapet një dritare phishing, përmbajtja e së cilës ngarkohet nga drejtoria /hgps/
- hapet një dritare phishing, përmbajtja e së 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 dërgohet në set_state.php në formën e një objekti JSON me formatin e mëposhtëm:
{
"command":
{
"command":,
"id":,
"state":
}
"id":
} ActionsService
Lista e komandave që aplikacioni trajton përfshin veprim. Kur merr një komandë, moduli i trajtimit të komandave i drejtohet kësaj shërbimi me qëllim realizimin e komandës së zgjeruar. Si parametër, shërbimi merr një objekt JSON. Shërbimi mund të kryejë komandat e mëposhtme:
1. PARAMSAT_ACTION â kur tĂ« pranohet njĂ« komandĂ« e tillĂ«, shĂ«rbimi nĂ« radhĂ« tĂ« parĂ« merr nga parameteri JSON vlerĂ«n sipas çelĂ«sit Type, e cila mund tĂ« jetĂ«:
- serviceInfo â nĂ«nkomanda merr nga parameteri JSON vlerĂ«n sipas çelĂ«sit includeNotImportant. NĂ«se flaga Ă«shtĂ« True â aplikacioni aktivizon flagun FLAG_ISOLATED_PROCESS nĂ« shĂ«rbimin qĂ« pĂ«rdor Accessibility Service. KĂ«shtu, shĂ«rbimi do tĂ« fillojĂ« nĂ« njĂ« proces tĂ« veçantĂ«.
- root â tĂ« marrĂ« dhe dĂ«rgojĂ« nĂ« server informacion mbi dritaren qĂ« Ă«shtĂ« aktualisht nĂ« fokus. Aplikacioni merr informacionin pĂ«rmes klasĂ«s AccessibilityNodeInfo.
- admin â tĂ« kĂ«rkojĂ« tĂ« drejtat e administratorit.
- delay â tĂ« ndalĂ« funksionimin e ActionsService pĂ«r atĂ« numĂ«r milisekondash qĂ« Ă«shtĂ« e specifikuar nĂ« parameterin sipas çelĂ«sit "data".
- windows â tĂ« dĂ«rgojĂ« listĂ«n e dritareve tĂ« dukshme pĂ«r pĂ«rdoruesin.
- install â tĂ« instalohet aplikacioni nĂ« pajisjen e infektuar. Emri i paketĂ«s â arkivimi ndodhet nĂ« çelĂ«sin "fileName". Arkivi vetĂ« ndodhet nĂ« drejtorinĂ« Downloads.
- global â nĂ«nkomanda ka pĂ«r qĂ«llim tĂ« realizojĂ« kalimin nga dritarja aktuale:
- në menunë Quick Settings
- mbrapa
- në shtëpi
- në njoftime
- në dritaren e aplikacioneve të hapura së fundmi
- launch â tĂ« fillojĂ« aplikacionin. Emri i aplikacionit vjen si parameter sipas çelĂ«sit data.
- sounds â tĂ« ndryshojĂ« mĂ«nyrĂ«n e zĂ«rit nĂ« silence.
- unlock â aktivizon ndriçimin e ekranit dhe tastierĂ«s nĂ« intensitet tĂ« plotĂ«. Aplikacioni e realizon kĂ«tĂ« veprim pĂ«rmes WakeLock, duke cituar si tag rreshtin [Application lable]:INFO
- permissionOverlay â funksioni nuk Ă«shtĂ« i realizuar (pĂ«rgjigja nĂ« ekzekutimin e komandĂ«s â {"message":"Not support"} ose {"message":"low sdk"})
- gesture â funksioni nuk Ă«shtĂ« i realizuar (pĂ«rgjigja nĂ« ekzekutimin e komandĂ«s â {"message":"Not support"} ose {"message":"Low API"})
- lejet â kjo komandĂ« Ă«shtĂ« e nevojshme pĂ«r tĂ« kĂ«rkuar tĂ« drejtat pĂ«r aplikacionin. MegjithatĂ«, funksioni i kĂ«rkesĂ«s nuk Ă«shtĂ« realizuar, kĂ«shtu qĂ« komandĂ«s nuk i ka kuptim. Lista e tĂ« drejatve tĂ« kĂ«rkuara vjen si njĂ« masiv 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 â tĂ« shfaqĂ« njĂ« dritare phishing. NĂ« varĂ«si tĂ« parameterit qĂ« vjen nga serveri, aplikacioni mund tĂ« demonstrojĂ« dritare tĂ« ndryshme phishing:
- Të tregojë dritaren phishing, përmbajtja e së cilës është shkruar në skedarin në drejtorinë /hgps/. Rezultati i ndërveprimit të përdoruesit me dritaren do të dërgohet në adresën /records.php
- Trego dritaren phishing, e cila ngarkohet paraprakisht nga adresa ?id=&app=. Rezultati i ndërveprimit të përdoruesit me dritaren do të dërgohet në adresën /records.php
- Trego dritaren phishing, e cila është maskuar si Google Play Card.
- interactive â komanda Ă«shtĂ« e destinuar pĂ«r ndĂ«rveprim me elementet e dritareve tĂ« aplikacioneve tĂ« tjera duke pĂ«rdorur AcessibilityService. PĂ«r ndĂ«rveprimin, Ă«shtĂ« realizuar njĂ« shĂ«rbim i veçantĂ«. Aplikacioni i hetuar mund tĂ« ndĂ«rveprojĂ« me dritaret:
- Aktive në këtë moment. Në këtë rast, parametri përmban id ose text (emrin) e 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.
Pas marrjes së objekteve AccessibilityNodeInfo për elementet e dritares që interesojnë, aplikacioni, në varësi të parametrave, mund të kryejë veprime:
- focus â tĂ« vendosĂ« fokusin nĂ« objekt.
- click â tĂ« klikojĂ« nĂ« objekt.
- actionId â tĂ« kryejĂ« veprim sipas ID.
- setText â tĂ« ndryshojĂ« tekstin e objektit. Ndryshimi i tekstit mund tĂ« bĂ«het nĂ« dy mĂ«nyra: duke realizuar veprimin ACTION_SET_TEXT (nĂ«se versioni i Android tĂ« pajisjes sĂ« infektuar Ă«shtĂ« mĂ« tĂ« vogĂ«l ose i barabartĂ« me LOLLIPOP), ose duke vĂ«nĂ« nĂ« clipboard njĂ« varg dhe duke e vendosur atĂ« 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 â e njĂ«jta si PARAMSAT_ACTION, vetĂ«m se vjen si njĂ« masĂ« JSON komando.
Duket se shumë njerëz do të jenë të interesuar se si duket funksioni i ndërveprimit me elementët e dritares së një aplikacioni tjetër. Kjo është mënyra se si është realizuar 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;
}Pra ndaj, me njĂ« konfigurim tĂ« duhur tĂ« serverit tĂ« menaxhimit, Gustuff Ă«shtĂ« nĂ« gjendje tĂ« plotĂ«sojĂ« fushat e tekstit nĂ« aplikacionet bankare dhe tĂ« klikojĂ« mbi butonat e nevojshĂ«m pĂ«r tĂ« realizuar transaksionet. Trojani as qĂ« ka nevojĂ« tĂ« kalojĂ« autorizimin nĂ« aplikacion â mjafton tĂ« dĂ«rgojĂ« njĂ« urdhĂ«r pĂ«r tĂ« demonstruar njĂ« njoftim PUSH dhe tĂ« hapĂ« aplikacionin bankar tĂ« instaluar mĂ« parĂ«. PĂ«rdoruesi do ta kalojĂ« autorizimin vetĂ«, pas sĂ« cilĂ«s Gustuff do tĂ« mund tĂ« realizojĂ« automatikisht ngarkimin.
Moduli i përpunimit të mesazheve SMS
Aplikacioni vendos një trajtues eventi për pranimin e mesazheve SMS nga pajisja e infektuar. Aplikacioni në shqyrtim mund të pranojë urdhra nga operatori, të cilat vijnë në tekstin e mesazhit SMS. Urdhërat vijnë në formatin:
7!5=<%Base64 encoded command%>
Aplikacioni kĂ«rkon nĂ« tĂ« gjitha mesazhet SMS qĂ« vijnĂ« pĂ«r tĂ« gjetur varg 7!5=, nĂ« rastin e zbulimit tĂ« njĂ« vargu â dekodon nga Base64 vargun me njĂ« zhvendosje prej 4 dhe ekzekuton komandĂ«n. Komandat janĂ« tĂ« ngjashme me komandat e CnC. Rezultati i ekzekutimit dĂ«rgohet nĂ« atĂ« numĂ«r nga i cili u mor 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 preference duhet të tregohen numri Root dhe të vendoset flagu i ridirektimit të mesazheve. Mesazhi SMS dërgohet në numrin e keqbërësit 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 pastron listĂ«n e mesazheve hyrĂ«se.
Moduli Proxy
Në aplikacionin e shqyrtuar, ekziston moduli Backconnect Proxy (më tej Moduli Proxy), i cili ka një klasë të veçantë që përmban fusha statike me konfigurimin. Të dhënat e konfiguruara ruhen në shembuj në formë të hapur:

Të gjitha veprimet që kryhen nga Moduli Proxy regjistrohen në skedarë. Për këtë, aplikacioni krijon një direktor në Ruajtjen e Jashtme me emrin «logs» (fusha ProxyConfigClass.logsDir në klasën e konfigurimit), ku ruhen skedarët e regjistrimit. Regjistrimi ndodh në skedarë me emrat:
- main.txt â nĂ« kĂ«tĂ« skedar regjistrohet funksionimi i klasĂ«s sĂ« quajtur CommandServer. NĂ« vazhdim, regjistrimi i vargut str nĂ« kĂ«tĂ« skedar do tĂ« pĂ«rshkruhet si mainLog(str).
- session-.txt â nĂ« kĂ«tĂ« skedar ruhen tĂ« dhĂ«nat e regjistrimit tĂ« lidhura me njĂ« sesion tĂ« caktuar tĂ« proksimit. NĂ« vazhdim, regjistrimi i vargut str nĂ« kĂ«tĂ« skedar do tĂ« pĂ«rshkruhet si sessionLog(str).
- server.txt â nĂ« kĂ«tĂ« skedar regjistrohen tĂ« dhĂ«nat e tĂ« gjitha tĂ« dhĂ«nave shkruar nĂ« skedarĂ«t e pĂ«rmendur mĂ« lart.
Formati i të dhënave të regjistrimit:
<%Date%> [Thread[<%thread id%>], id[]]: log-string
Përjashtimet që ndodhin gjatë funksionimit të Moduli Proxy regjistrohen gjithashtu 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":
}
]
}Pas konverton në një përfaqësim tekstual dhe e regjistron atë.
LĂ«shimi i modulit Proxy ndodh pasi merr njĂ« komandĂ« pĂ«rkatĂ«se. Pas pranimit tĂ« urdhrit pĂ«r tĂ« aktivizuar modulit Proxy, aplikacioni nis 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Ă« aktivizohet çdo minutĂ« dhe kontrollon aktivitetin e modulit Proxy. NĂ«se moduli nuk Ă«shtĂ« aktiv â e aktivizon atĂ«.
Po ashtu, kur ndodh ngjarja android.net.conn.CONNECTIVITY_CHANGE aktivizohet moduli Proxy.
2. Aplikacioni krijon wake-lock me parametrin PARTIAL_WAKE_LOCK dhe e kap atë. Kështu, nuk e lejon CPU-në e pajisjes të kalojë në modalitetin gjumë.
3. Aktivizon klasën e përpunimit të komandave të modulit Proxy, duke regjistruar paraprakisht vargun mainLog("start server") dhe
Server::start() host[], commandPort[], proxyPort[]
ku proxy_cnc, command_port dhe proxy_port â janĂ« parametrat e marra nga konfigurimi i serverit Proxy.
Klasa e përpunimit të komandave quhet CommandConnection. Menjëherë pas aktivizimit, kryen veprimet e mëposhtme:
4. Konektimi me ProxyConfigClass.host: ProxyConfigClass.commandPort dhe dërgimi i të dhënave 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 nga fusha "id". NĂ«se nuk Ă«shtĂ« e mundur tĂ« merret kjo vlerĂ« â krijon njĂ« tĂ« re. KĂ«shtu, moduli Proxy ka identifikuesin e tij, i cili gjenerohet njĂ«soj si ID i Bot.
- imei â IMEI i pajisjes. NĂ«se ndodhi njĂ« gabim gjatĂ« marrjes sĂ« vlerĂ«s â nĂ« vend tĂ« kĂ«tij fushe do tĂ« regjistrohet njĂ« mesazh gabimi.
- imsi â Identiteti NdĂ«rkombĂ«tar i Abonentit tĂ« Mobilit tĂ« pajisjes. NĂ«se ndodhi njĂ« gabim gjatĂ« marrjes sĂ« vlerĂ«s, nĂ« vend tĂ« kĂ«tij fushĂ« do tĂ« shkruhet njĂ« mesazh gabimi.
- model â Emri i dukshĂ«m pĂ«r pĂ«rdoruesin pĂ«r produktin pĂ«rfundimtar.
- manufacturer â Prodhuesi i produktit/harduerit (Build.MANUFACTURER).
- androidVersion â vargu nĂ« formatin " (),"
- country â vendndodhja aktuale e pajisjes.
- partnerId â varg i zbrazĂ«t.
- packageName â emri i paketĂ«s.
- networkType â tipi i aktual i lidhjes rrjet (shembuj: "WIFI", "MOBILE"). NĂ« rast gabimi kthen null.
- hasGsmSupport â true â nĂ«se telefoni mbĂ«shtet GSM, pĂ«rndryshe false.
- simReady â statusi i kartĂ«s SIM.
- simCountry â Kodi ISO i vendit (sipĂ«rfaqĂ«suar mbi bazĂ«n e ofruesit tĂ« kartĂ«s SIM).
- networkOperator â emri i operatorit. NĂ«se ndodhi njĂ« gabim gjatĂ« marrjes sĂ« vlerĂ«s, nĂ« vend tĂ« kĂ«tij fushĂ« do tĂ« shkruhet njĂ« mesazh gabimi.
- simOperator â Emri i Ofruesit tĂ« ShĂ«rbimit (SPN). NĂ«se ndodhi njĂ« gabim gjatĂ« marrjes sĂ« vlerĂ«s, nĂ« vend tĂ« kĂ«tij fushĂ« do tĂ« shkruhet njĂ« mesazh gabimi.
- version â kjo fushĂ« ruhet nĂ« klasĂ«n e konfigurimit, pĂ«r versionet e shqyrtuara tĂ« robotit ajo ishte e barabartĂ« me "1.6".
5. Kaloni në modalitetin e pritjes për komandat nga serveri. Komandat nga serveri vijnë në format:
- 0 offset â komandĂ«
- 1 offset â sessionId
- 2 offset â gjatĂ«si
- 4 offset â tĂ« dhĂ«na
Kur merret komanda, aplikacioni regjistron:
mainLog("Header { sessionId], type[], length[] }")
Komandat e mëposhtme janë të mundshme nga serveri:
| Emri | Komanda | Data | Përshkrimi |
|---|---|---|---|
| connectionId | 0 | ID e Konneksionit | Krijo një lidhje të re |
| SLEEP | 3 | Koha | Pauzo punën e modulit Proxy |
| PING_PONG | 4 | â | DĂ«rgo njĂ« mesazh PONG |
Mesazhi PONG përbëhet nga 4 bajtë dhe duket si më poshtë: 0x04000000.
Kur merr komanda connectionId (për krijimin e një lidhjeje të re) CommandConnection krijon një instancë të klasës ProxyConnection.
- Në prokura marrin pjesë dy klasa: ProxyConnection dhe 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. Diagramatikisht, krijimi i lidhjes mund të paraqitet si më poshtë:

Ndërveprimet rrjetore
Për të parandaluar analizimin e trafikut nga sniffer-at e rrjetit, ndërveprimi 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, paraqiten 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 mesazheve SMS 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Ă« azhurnimit tĂ« parametrave, qĂ« ndodhen nĂ« skedarin preference.
- http:///api/v1/set_card.php â ngarkimi i tĂ« dhĂ«nave tĂ« marra pĂ«rmes njĂ« oknĂ«s phishing, qĂ« maskohet si Google Play Market.
- http:///api/v1/logs.php â ngarkimi i tĂ« dhĂ«nave tĂ« logĂ«ve.
- http:///api/v1/records.php â ngarkimi i tĂ« dhĂ«nave tĂ« marra pĂ«rmes oknave phishing.
- http:///api/v1/set_error.php â njoftimi mbi ndodhim tĂ« ndonjĂ« gabimi.
R rekomandimet
Me qëllim për të mbrojtur klientët e saj nga kërcënimi i trojaneve mobilë, kompanitë duhet të përdorin zgjidhje komplekse, të cilat lejojnë ndjekjen dhe paralajmërimin nga aktiviteti i dëmshëm pa instaluar ndonjë softuer shtesë në pajisjet e përdoruesve.
Për këtë arsye, metodat e zbuluar të nënshkrimit të trojaneve mobilë duhet të forcohen me teknologjitë e analizës së sjelljes si të klientit ashtu edhe të aplikacionit vetë. Gjithashtu, mbrojtja duhet të përfshijë një funksion të identifikimit të pajisjeve duke përdorur teknologjinë e gjurmës dixhitale, e cila do të lejojë të kuptohet kur llogaria përdoret nga një pajisje e pazakontë dhe tashmë ka rënë në duar të një mashtruesi.
Një pikë shumë e rëndësishme është pranimi i mundësisë për analizën ndër-kanal, e cila i jep mundësinë kompanive të kontrollojnë rreziqet që lindin jo vetëm nga kanali i internetit, por edhe nga kanali mobil, për shembull, në aplikacionet për bankat mobile, për operacionet me kriptovaluta dhe çdo gjë tjetër ku mund të kryhet një transaksion financiar.
Rregullat e sigurisë për përdoruesit:
- mos instalo aplikacione për pajisjet mobile me sistemin operativ Android nga ndonjë burim tjetër, përveç Google Play, duke i kushtuar vëmendje të veçantë të drejtave që aplikacioni kërkon;
- rregullisht instalo azhurnimet e sistemit operativ Android;
- të kushtoni vëmendje shtesave të skedareve që ngarkoni;
- të mos vizitoni burime të dyshimta;
- të mos klikoni në lidhjet e marra në mesazhet SMS.
Me pjesëmarrjen e Semenës Rogacheva, specialistes së re për hulumtimin e kodit të dëmshëm në Laboratorin e Kriminalistikës Kompjuterike Group-IB.
Burimi: habr.com
