Tikai citu dienu Group-IB
Ä»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.
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:
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 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Ä:
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 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