Hvordan Gustuff Android Trojan skummer cremen (fiat og krypto) fra dine konti

Hvordan Gustuff Android Trojan skummer cremen (fiat og krypto) fra dine konti

Bare forleden dag Group-IB informeret om aktiviteten af ​​den mobile Android Trojan Gustuff. Det opererer udelukkende på internationale markeder og angriber kunder fra de 100 største udenlandske banker, brugere af 32 mobile krypto-punge samt store e-handelsressourcer. Men udvikleren af ​​Gustuff er en russisktalende cyberkriminel under kælenavnet Bestoffer. For nylig roste han sin trojaner som "et seriøst produkt til folk med viden og erfaring."

Group-IB Malicious Code Analyst Ivan Pisarev i sin forskning taler han detaljeret om, hvordan Gustuff virker, og hvad dets fare er.

Hvem er Gustuff på jagt efter?

Gustuff tilhører en ny generation af malware med fuldt automatiserede funktioner. Ifølge udvikleren er trojaneren blevet en ny, forbedret version af AndyBot-malwaren, der har angrebet Android-telefoner siden november 2017 og stjålet penge gennem phishing-webformularer, der er maskeret som mobile applikationer fra velkendte internationale banker og betalingssystemer. Bestoffer rapporterede, at Gustuff Bot var prissat til $800 pr. måned.

Analyse af Gustuff-prøven viste, at trojaneren potentielt målretter mod kunder, der bruger mobilapplikationer fra de største banker, såsom Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank samt Bitcoin Wallet , BitPay crypto wallets. , Cryptopay, Coinbase osv.

Oprindeligt oprettet som en klassisk banktrojaner, har den nuværende version af Gustuff udvidet listen over potentielle angrebsmål betydeligt. Ud over Android-applikationer til banker, fintech-virksomheder og kryptotjenester, retter Gustuff sig mod brugere af markedspladsapplikationer, onlinebutikker, betalingssystemer og instant messengers. Især PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut og andre.

Indgangspunkt: beregning for masseinfektion

Gustuff er kendetegnet ved den "klassiske" vektor for indtrængen i Android-smartphones gennem SMS-mails med links til APK'er. Når en Android-enhed er inficeret med en trojaner på kommando af serveren, kan Gustuff spredes yderligere gennem kontaktdatabasen på den inficerede telefon eller gennem serverdatabasen. Funktionaliteten af ​​Gustuff er designet til masseinfektion og maksimal kapitalisering af dets operatørers forretning - den har en unik "auto-fill" funktion i legitime mobilbankapplikationer og krypto-punge, som giver dig mulighed for at fremskynde og skalere tyveri af penge .

En undersøgelse af trojaneren viste, at autofyld-funktionen er implementeret i den ved hjælp af Accessibility Service, en service for mennesker med handicap. Gustuff er ikke den første trojaner, der med succes omgår beskyttelse mod interaktion med vindueselementer i andre applikationer, der bruger denne Android-tjeneste. Brugen af ​​Tilgængelighedstjenesten i kombination med autofyld er dog stadig ret sjælden.

Efter at have downloadet til ofrets telefon får Gustuff, ved hjælp af tilgængelighedstjenesten, mulighed for at interagere med vindueselementer i andre applikationer (bankvirksomhed, kryptovaluta samt applikationer til online shopping, meddelelser osv.) og udføre de handlinger, der er nødvendige for angribere . For eksempel, på kommando af serveren, kan trojaneren klikke på knapper og ændre værdierne af tekstfelter i bankapplikationer. Brug af Accessibility Service-mekanismen gør det muligt for trojaneren at omgå de beskyttelsesmekanismer, som banker bruger til at modvirke mobile trojanske heste fra den tidligere generation, såvel som ændringer i sikkerhedspolitikken implementeret af Google i nye versioner af Android OS. Så Gustuff "ved hvordan" man deaktiverer Google Protect-beskyttelse: ifølge forfatteren fungerer denne funktion i 70% af tilfældene.

Hvordan Gustuff Android Trojan skummer cremen (fiat og krypto) fra dine konti

Gustuff kan også vise falske PUSH-meddelelser med ikoner for legitime mobilapplikationer. Brugeren klikker på PUSH-meddelelsen og ser et phishing-vindue downloadet fra serveren, hvor han indtaster de anmodede data fra et bankkort eller en kryptopung. I et andet scenarie åbner Gustuff den applikation, som PUSH-meddelelsen blev vist på vegne af. I dette tilfælde kan malware, på kommando af serveren gennem tilgængelighedstjenesten, udfylde formularfelterne i bankansøgningen for en svigagtig transaktion.

Funktionaliteten i Gustuff inkluderer også at sende information om en inficeret enhed til serveren, muligheden for at læse/sende SMS-beskeder, sende USSD-anmodninger, starte SOCKS5 Proxy, følge et link, sende filer (inklusive fotoscanninger af dokumenter, skærmbilleder, fotos) til serveren, nulstil enheden til fabriksindstillingerne.

Malware analyse

Før du installerer et ondsindet program, viser Android OS brugeren et vindue, der indeholder en liste over de rettigheder, som Gustuff anmoder om:

Hvordan Gustuff Android Trojan skummer cremen (fiat og krypto) fra dine konti
Installationen af ​​applikationen vil kun finde sted efter at have indhentet samtykke fra brugeren. Efter at have startet programmet, vil trojaneren vise brugeren et vindue:

Hvordan Gustuff Android Trojan skummer cremen (fiat og krypto) fra dine konti
Derefter vil den fjerne sit ikon.

Gustuff pakkes, ifølge forfatteren, af FTT-pakkeren. Når applikationen er startet, får den periodisk adgang til CnC-serveren for at modtage kommandoer. I flere af de filer, vi undersøgte, blev IP-adressen brugt som kontrolserver 88.99.171[.]105 (herefter benævnt <%C&C%>).

Efter start begynder programmet at sende beskeder til serveren http://<%CnC%>/api/v1/get.php.

Følgende JSON-format forventes som svar:

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

Med hver anmodning sender applikationen oplysninger om den inficerede enhed. Meddelelsesformatet er vist nedenfor. Det skal bemærkes, at felterne fuld, ekstra, apps и tilladelse – valgfri og vil kun blive sendt i tilfælde af en anmodningskommando fra 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%>
} 

Lagring af konfigurationsdata

Gustuff gemmer vigtig information i en præferencefil. Filnavnet, såvel som parameternavnene i det, er resultatet af beregning af MD5-summen fra strengen 15413090667214.6.1<%navn%>Hvor <%navn%> er den oprindelige navneværdi. Python-fortolkning af navnegenereringsfunktionen:

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

I det følgende vil vi betegne som navnegenerator (input).
Så navnet på den første fil er: nameGenerator("API_SERVER_LIST"), den indeholder værdier med følgende navne:

Variabel navn Value
nameGenerator("API_SERVER_LIST") Indeholder en liste over CnC-adresser som et array.
nameGenerator("API_SERVER_URL") Indeholder CnC-adresse.
nameGenerator("SMS_UPLOAD") Flaget er indstillet som standard. Hvis flaget er indstillet, sender det SMS-beskeder til CnC.
nameGenerator("SMS_ROOT_NUMBER") Telefonnummer, som SMS-beskeder modtaget af den inficerede enhed vil blive sendt til. Standardindstillingen er null.
nameGenerator("SMS_ROOT_NUMBER_RESEND") Flaget er ryddet som standard. Hvis den er indstillet, vil den blive sendt til rodnummeret, når en inficeret enhed modtager en SMS.
nameGenerator("DEFAULT_APP_SMS") Flaget er ryddet som standard. Hvis dette flag er indstillet, behandler applikationen indgående SMS-beskeder.
nameGenerator("DEFAULT_ADMIN") Flaget er ryddet som standard. Hvis flaget er indstillet, har applikationen administratorrettigheder.
nameGenerator("DEFAULT_ACCESSIBILITY") Flaget er ryddet som standard. Hvis flaget er indstillet, kører den tjeneste, der bruger tilgængelighedstjenesten.
nameGenerator("APPS_CONFIG") JSON-objekt, indeholder en liste over handlinger, der skal udføres, når en tilgængelighedshændelse udløses forbundet med en specifik applikation.
nameGenerator("APPS_INSTALLED") Gemmer en liste over programmer installeret på enheden.
nameGenerator("IS_FIST_RUN") Flaget cleares ved første start.
nameGenerator("UNIQUE_ID") Indeholder en unik identifikator. Genereres, når botten lanceres første gang.

Serverkommandobehandlingsmodul

Applikationen gemmer adresser på CnC-servere som en række kodede Base 85 linjer. Listen over CnC-servere kan ændres ved modtagelse af den relevante kommando, i hvilket tilfælde adresserne vil blive gemt i præferencefilen.

Som svar på anmodningen sender serveren en kommando til applikationen. Det skal bemærkes, at kommandoer og parametre præsenteres i JSON-format. Applikationen kan behandle følgende kommandoer:

Team beskrivelse
fremStart Begynd at sende SMS-beskeder modtaget af den inficerede enhed til CnC-serveren.
fremadStop Stop med at sende SMS-beskeder modtaget af den inficerede enhed til CnC-serveren.
ussdRun Lav en USSD-anmodning. Nummeret, som du skal lave en USSD-anmodning til, er i "nummer" JSON-feltet.
send SMS Send en SMS-besked (om nødvendigt er beskeden "opdelt" i dele). Som en parameter tager kommandoen et JSON-objekt, der indeholder felterne "to" - destinationsnummeret og "body" - meddelelsens brødtekst.
sendSmsAb Send SMS-beskeder (om nødvendigt er beskeden "opdelt" i dele) til alle fra kontaktlisten på den inficerede enhed. Intervallet mellem afsendelse af beskeder er 10 sekunder. Brødteksten i meddelelsen er i JSON-feltet "body"
sendSmsMass Send SMS-beskeder (om nødvendigt er beskeden "opdelt" i dele) til de kontakter, der er angivet i kommandoparametrene. Intervallet mellem afsendelse af beskeder er 10 sekunder. Som parameter tager kommandoen et JSON-array (felt "sms"), hvis elementer indeholder felterne "to" - destinationsnummeret og "body" - meddelelsens brødtekst.
changeServer Denne kommando kan tage en værdi med "url"-tasten som en parameter - så vil botten ændre værdien af ​​nameGenerator("SERVER_URL") eller "array" - så vil botten skrive arrayet til nameGenerator ("API_SERVER_LIST") Således ændrer applikationen adressen på CnC-servere.
adminnummer Kommandoen er designet til at arbejde med rodnummeret. Kommandoen accepterer et JSON-objekt med følgende parametre: "number" - skift navnGenerator("ROOT_NUMBER") til den modtagne værdi, "resend" - skift navnGenerator("SMS_ROOT_NUMBER_RESEND"), "sendId" - send unikt ID til nameGenerator("ROOT_NUMBER ").
opdatere info Send oplysninger om den inficerede enhed til serveren.
slet data Kommandoen er beregnet til at slette brugerdata. Afhængigt af hvilket navn applikationen blev lanceret, sker enten fuldstændig sletning af data med en genstart af enheden (primær bruger) eller sletning af kun brugerdata (sekundær bruger).
sokkerStart Start proxy-modulet. Funktionen af ​​modulet er beskrevet i et separat afsnit.
sokker Stop Stop proxy-modulet.
Åben link Følg linket. Linket er i JSON-parameteren ved "url"-tasten. "android.intent.action.VIEW" bruges til at åbne linket.
upload AlleSms Send alle SMS-beskeder modtaget af enheden til serveren.
upload Alle billeder Send billeder fra den inficerede enhed til URL'en. URL'en kommer som en parameter.
Upload fil Send en fil fra en inficeret enhed til en URL. URL'en kommer som en parameter.
upload Telefonnumre Send telefonnumre fra kontaktlisten til serveren. Hvis et JSON-objekt med nøglen "ab" kommer som en parameter, modtager applikationen en liste over kontakter fra telefonbogen. Hvis et JSON-objekt med nøglen "sms" modtages som en parameter, læser applikationen listen over kontakter fra afsendere af SMS-beskeder.
ændre Arkiv Applikationen downloader en fil fra den adresse, der kommer som en parameter ved hjælp af "url"-tasten. Den downloadede fil gemmes med navnet "archive.zip". Applikationen vil derefter udpakke filen, eventuelt ved at bruge arkivadgangskoden "b5jXh37gxgHBrZhQ4j3D". De udpakkede filer gemmes i mappen [eksternt lager]/hgps. I denne mappe gemmer applikationen webforfalskninger (beskrevet nedenfor).
aktioner Kommandoen er designet til at fungere med Action Service, som er beskrevet i et separat afsnit.
prøve Laver ingenting.
downloade Kommandoen er designet til at downloade en fil fra en ekstern server og gemme den i mappen Downloads. URL'en og filnavnet kommer som en parameter, felterne i JSON objektet er parameteren henholdsvis: "url" og "fileName".
Fjern Fjerner en fil fra mappen Downloads. Filnavnet kommer i en JSON-parameter med "filnavn"-nøglen. Standardfilnavnet er "tmp.apk".
underretning Vis meddelelse med beskrivelse og titeltekster defineret af administrationsserveren.

Kommandoformat underretning:

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

Underretningen, der genereres af den fil, der undersøges, ser identisk ud med meddelelser, der genereres af den applikation, der er angivet i feltet app. Hvis feltværdien åbne App — Sandt nok, når meddelelsen åbnes, startes den applikation, der er angivet i feltet app. Hvis feltværdien åbne App - Falsk, så:

  • et phishing-vindue åbnes, hvis indhold indlæses fra mappen <%external storage%>/hgps/<%filename%>
  • et phishing-vindue åbnes, hvis indhold downloades fra serveren <%url%>?id=<%Bot id%>&app=<%Application name%>
  • et phishing-vindue forklædt som et Google Play-kort åbnes med mulighed for at indtaste kortoplysninger.

Applikationen sender resultatet af udførelsen af ​​enhver kommando til <%CnC%>set_state.php som et JSON-objekt i følgende format:

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

ActionsService
Listen over kommandoer, som applikationen behandler, inkluderer Action. Når en kommando modtages, kalder kommandobehandlingsmodulet denne service for at udføre den udvidede kommando. Tjenesten tager et JSON-objekt som en parameter. Tjenesten kan udføre følgende kommandoer:

1. PARAMS_ACTION - Når du modtager en sådan kommando, modtager tjenesten først og fremmest en værdi fra JSON-parameteren med Type-tasten, det kan være som følger:

  • serviceinfo – underkommandoen får værdien fra JSON-parameteren med nøgle includeNotImportant. Hvis flaget er True, sætter applikationen flaget FLAG_ISOLATED_PROCESS til en tjeneste, der bruger Tilgængelighedstjenesten. Tjenesten vil således blive lanceret i en separat proces.
  • rod - modtage og sende til serveren information om det vindue, der i øjeblikket er i fokus. En applikation henter information ved hjælp af AccessibilityNodeInfo-klassen.
  • admin - anmode om administratorrettigheder.
  • forsinkelse - suspender ActionsService i det antal millisekunder, der er angivet i parameteren med "data"-tasten.
  • vinduer — send en liste over vinduer, der er synlige for brugeren.
  • installere — installer applikationen på den inficerede enhed. Navnet på pakken - arkiv er i "filnavn" nøglen. Selve arkivet er placeret i mappen Downloads.
  • global – underkommandoen er beregnet til at skifte fra det aktuelle vindue:
    • i menuen Hurtige indstillinger
    • siden
    • hjem
    • til underretninger
    • til det nyligt åbnede programvindue

  • lancere - start applikationen. Navnet på applikationen kommer som en nøgleparameter data.
  • lyde — skift lydtilstanden til lydløs.
  • låse - tænder baggrundsbelysningen på skærmen og tastaturet til fuld lysstyrke. Applikationen udfører denne handling ved hjælp af WakeLock, specificerer strengen [Application Lable]:INFO som et tag
  • permissionOverlay — funktion ikke implementeret (svar på kommandoudførelse — {"message":"Not support"} eller {"message":"low sdk"})
  • gestus — funktion ikke implementeret (svar på kommandoudførelse — {"message":"Not support"}eller {"message":"Low API"})
  • Tilladelser - Denne kommando er påkrævet for at anmode om tilladelser til applikationen. Anmodningsfunktionen er dog ikke implementeret, så kommandoen er meningsløs. Listen over anmodede tilladelser kommer som et JSON-array med nøglen "tilladelser". Standard liste:
    • 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

  • åbent — Vis et phishing-vindue. Afhængigt af parameteren, der kommer fra serveren, kan applikationen vise følgende phishing-vinduer:
    • Vis et phishing-vindue, hvis indhold er skrevet i en fil i en mappe <%ekstern mappe%>/hgps/<%param_filnavn%>. Resultatet af brugerinteraktion med vinduet vil blive sendt til adressen <%CnC%>/records.php
    • Vis et phishing-vindue, hvis indhold er forudindlæst fra en adresse <%url_param%>?id=<%bot_id%>&app=<%pakkenavn%>. Resultatet af brugerinteraktion med vinduet vil blive sendt til adressen <%CnC%>/records.php
    • Vis et phishing-vindue forklædt som et Google Play-kort.

  • interaktiv — kommandoen er designet til at interagere med vindueselementer i andre applikationer ved hjælp af AcessibilityService. En særlig service er implementeret i programmet for interaktion. Den applikation, der undersøges, kan interagere med Windows:
    • Aktiv i øjeblikket. I dette tilfælde indeholder parameteren id'et eller teksten (navnet) på det objekt, du vil interagere med.
    • Synlig for brugeren på det tidspunkt, kommandoen udføres. Applikationen vælger vinduer efter id.

    Efter at have modtaget genstandene AccessibilityNodeInfo for vindueselementer af interesse kan applikationen, afhængigt af parametrene, udføre følgende handlinger:

    • fokus - sæt fokus på et objekt.
    • klik - klik på et objekt.
    • actionId - udfør en handling efter ID.
    • setText - skift objektets tekst. Det er muligt at ændre teksten på to måder: udfør en handling ACTION_SET_TEXT (hvis Android-versionen af ​​den inficerede enhed er yngre end eller lig med LOLLIPOP), eller ved at placere en streng på udklipsholderen og indsætte den i et objekt (for ældre versioner). Denne kommando kan bruges til at ændre data i bankapplikationen.

2. PARAMS_ACTIONS - det samme som PARAMS_ACTION, kun et JSON-array af kommandoer ankommer.

Det ser ud til, at mange vil være interesserede i, hvordan funktionen til at interagere med elementerne i vinduet i en anden applikation ser ud. Sådan er denne funktionalitet implementeret i 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));
}

Teksterstatningsfunktion:

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

Med den korrekte konfiguration af kontrolserveren er Gustuff således i stand til at udfylde tekstfelterne i bankapplikationen og klikke på de nødvendige knapper for at gennemføre transaktionen. Trojaneren behøver ikke engang at bestå autorisation i applikationen - det er nok at sende en kommando for at demonstrere en PUSH-meddelelse, efterfulgt af at åbne en tidligere installeret bankapplikation. Brugeren selv bliver autoriseret, hvorefter Gustuff vil kunne autofylde.

SMS-behandlingsmodul

Applikationen indstiller en hændelseshandler til at modtage SMS-beskeder af den inficerede enhed. Ansøgningen under undersøgelse kan modtage kommandoer fra operatøren, der kommer i brødteksten i en SMS-besked. Kommandoer kommer i formatet:

7!5=<%Base64 kodet kommando%>

Applikationen søger efter strengen i alle indgående SMS-beskeder 7!5=, når en streng er fundet, afkoder den strengen fra Base64 ved offset 4 og udfører kommandoen. Kommandoerne ligner kommandoerne med CnC. Resultatet af udførelsen sendes til det samme nummer, som kommandoen blev modtaget fra. Svarformat:

7*5=<%Base64-kodning af "result_code-kommando"%>

Eventuelt kan applikationen sende alle modtagne beskeder til rodnummeret. For at gøre dette skal rodnummeret angives i præferencefilen, og beskedomdirigeringsflaget skal indstilles. En SMS-besked sendes til angriberens nummer i følgende format:

<%Fra nummer%> - <%Tid, format: dd/MM/åååå TT:mm:ss%> <%SMS body%>

Applikationen kan også valgfrit sende beskeder til CnC. SMS-beskeden sendes til serveren i JSON-format:

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

Hvis flaget er sat nameGenerator("DEFAULT_APP_SMS") – applikationen stopper behandlingen af ​​SMS-beskeden og rydder listen over indgående beskeder.

Proxy modul

I den applikation, der undersøges, er der et Backconnect Proxy-modul (herefter benævnt Proxy-modulet), som har en separat klasse, der inkluderer statiske felter med en konfiguration. Konfigurationsdata gemmes i eksemplet i klartekst:

Hvordan Gustuff Android Trojan skummer cremen (fiat og krypto) fra dine konti

Alle handlinger udført af Proxy-modulet logges til filer. For at gøre dette opretter applikationen en mappe kaldet "logs" i External Storage (feltet ProxyConfigClass.logsDir i konfigurationsklassen), hvori logfiler er gemt. Logning foregår i filer med navne:

  1. main.txt – denne fil bruges til at logge arbejdet i klassen ved navn CommandServer. I det følgende vil logningen af ​​strengen str til denne fil blive betegnet som mainLog(str).
  2. session-<%id%>.txt — logdata knyttet til en bestemt proxy-session gemmes i denne fil. I det følgende vil logningen af ​​strengen str til denne fil blive betegnet som sessionLog (str).
  3. server.txt – denne fil er hvor alle data, der er skrevet til ovenstående filer, logges.

Logdataformat:

<%Date%> [Tråd[<%tråds-id%>], id[]]: log-streng

Undtagelser, der opstår under driften af ​​Proxy-modulet, logges også til en fil. For at gøre dette genererer applikationen et JSON-objekt i formatet:

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

Derefter konverterer den den til en strengrepræsentation og logfiler.

Proxymodulet startes, efter at den tilsvarende kommando ankommer. Når der modtages en kommando om at starte proxymodulet, starter applikationen tjenesten med navnet Hovedservice, som er ansvarlig for at styre driften af ​​Proxy-modulet - starte og stoppe det.

Trin til servicestart:

1. Starter en timer, der udløses en gang i minuttet og kontrollerer proxymodulets aktivitet. Hvis modulet ikke er aktivt, starter det det.
Også når arrangementet udløses android.net.conn.CONNECTIVITY_CHANGE proxy-modulet startes.

2. Applikationen opretter en wake-lock med en parameter PARTIAL_WAKE_LOCK og fanger ham. Det tillader således ikke enhedens CPU at gå i dvaletilstand.

3. Kører kommandobehandlingsklassen for proxymodulet og logger linjen først mainLog("startserver") и

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

где proxy_cnc, command_port og proxy_port – parametre modtaget fra proxyserverkonfigurationen.

Kommandobehandlingsklassen er navngivet CommandConnection. Umiddelbart efter lanceringen udfører den følgende handlinger:

4. Forbinder til ProxyConfigClass.host: ProxyConfigClass.commandPort og sender data om den inficerede enhed dertil i JSON-format:

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

Hvor:

  • id - identifikator, der forsøger at hente fra Shared Preference-filen med navnet "x" en værdi med "id"-feltet. Hvis denne værdi ikke kunne opnås, genererer den en ny. Således har proxy-modulet sin egen identifikator, som genereres på samme måde som Bot ID'et.
  • imei - enhedens IMEI. Hvis der opstod en fejl under hentning af værdien, vil en fejl-tekstmeddelelse blive skrevet i stedet for dette felt.
  • imsi - International Mobile Subscriber Identity af enheden. Hvis der opstod en fejl under hentning af værdien, vil en fejl-tekstmeddelelse blive skrevet i stedet for dette felt.
  • model - Det slutbruger-synlige navn for slutproduktet.
  • fabrikant - Producenten af ​​produktet/hardwaren (Build.MANUFACTURER).
  • androidVersion er en streng i formatet "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • land er den aktuelle placering af enheden.
  • partnerId er en tom streng.
  • pakkenavn - pakkenavn.
  • networkType - type af aktuel netværksforbindelse (eksempel: "WIFI", "MOBILE"). Returnerer null ved fejl.
  • hasGsmSupport - sand - hvis telefonen understøtter GSM, ellers falsk.
  • simReady - SIM-kortstatus.
  • simCountry - ISO-kode for landet (baseret på SIM-kortudbyderen).
  • networkOperator - navnet på operatøren. Hvis der opstod en fejl under hentning af værdien, vil en fejl-tekstmeddelelse blive skrevet i stedet for dette felt.
  • simOperator - Serviceudbyderens navn (SPN). Hvis der opstod en fejl under hentning af værdien, vil en fejl-tekstmeddelelse blive skrevet i stedet for dette felt.
  • version - dette felt er gemt i config-klassen, for de undersøgte versioner af botten var det lig med "1.6".

5. Skifter til tilstanden for at vente på kommandoer fra serveren. Kommandoer fra serveren kommer i formatet:

  • 0 offset-kommando
  • 1 offset-session-id
  • 2 offset-længde
  • 4 offset-data

Når en kommando modtages, logger applikationen:
mainLog("Header { sessionId<%id%>], type[<%command%>], længde[<%length%>] }")

Følgende kommandoer er mulige fra serveren:

Navn Kommando data Beskrivelse
forbindelses-id 0 Forbindelses-id Opret en ny forbindelse
SLEEP 3 Tid Suspendér proxymodulet
BORDTENNIS 4 Send PONG besked

En PONG-meddelelse består af 4 bytes og ser således ud: 0x04000000.

Når en connectionId-kommando modtages (for at oprette en ny forbindelse) CommandConnection opretter en forekomst af klassen ProxyConnection.

  • To klasser deltager i fuldmagt: ProxyConnection и ende. Når du opretter en klasse ProxyConnection oprettes forbindelse til adressen ProxyConfigClass.host: ProxyConfigClass.proxyPort og sender et JSON-objekt:

 {
    "id":<%connectionId%>
}

Som svar sender serveren en SOCKS5-meddelelse, der indeholder adressen på den fjernserver, som forbindelsen skal etableres til. Interaktion med denne server sker gennem klassen ende. Skematisk kan forbindelsesopsætningen repræsenteres som følger:

Hvordan Gustuff Android Trojan skummer cremen (fiat og krypto) fra dine konti

Netværksinteraktioner

For at forhindre netværkssniffere i at analysere trafik, kan interaktionen mellem CnC-serveren og applikationen sikres ved hjælp af SSL-protokollen. Alle overførte data både fra serveren og til serveren er i JSON-format. Applikationen udfører følgende anmodninger under drift:

  • http://<%CnC%>/api/v1/set_state.php er resultatet af kommandoudførelse.
  • http://<%CnC%>/api/v1/get.php - modtage en kommando.
  • http://<%CnC%>/api/v1/load_sms.php — download af SMS-beskeder fra en inficeret enhed.
  • http://<%CnC%>/api/v1/load_ab.php — upload af listen over kontakter fra den inficerede enhed.
  • http://<%CnC%>/api/v1/aevents.php – anmodningen foretages ved opdatering af parametrene i præferencefilen.
  • http://<%CnC%>/api/v1/set_card.php - upload af data, der er opnået ved hjælp af et phishing-vindue, der forklæder sig som Google Play Market.
  • http://<%CnC%>/api/v1/logs.php – aflæsning af logdata.
  • http://<%CnC%>/api/v1/records.php – upload af data opnået ved hjælp af phishing-vinduer.
  • http://<%CnC%>/api/v1/set_error.php – fejlmeddelelse.

Anbefalinger

For at beskytte deres kunder mod truslen fra mobile trojanske heste, skal virksomheder bruge omfattende løsninger, der tillader, uden at installere yderligere software på brugernes enheder, at overvåge og forhindre ondsindet aktivitet.

For at gøre dette skal signaturbaserede metoder til at detektere mobile trojanske heste forbedres med teknologier til at analysere adfærden hos både klienten og selve applikationen. Beskyttelsen bør også omfatte funktionen til at identificere enheder ved hjælp af digital fingeraftryksteknologi, som vil gøre det muligt at forstå, hvornår en konto bruges fra en atypisk enhed og allerede er faldet i hænderne på en svindler.

Et grundlæggende vigtigt punkt er muligheden for cross-channel analyse, som giver virksomheder mulighed for at kontrollere de risici, der opstår på siden af ​​ikke kun internettet, men også mobilkanalen, for eksempel i applikationer til mobilbank, for transaktioner med krypto. -valutaer og enhver anden, hvor den kan udføres finansiel transaktion.

Sikkerhedsregler for brugere:

  • installer ikke applikationer til en mobilenhed med Android OS fra andre kilder end Google Play, vær særlig opmærksom på de rettigheder, applikationen anmoder om;
  • regelmæssigt installere Android OS-opdateringer;
  • vær opmærksom på udvidelserne af uploadede filer;
  • besøg ikke mistænkelige ressourcer;
  • Klik ikke på links modtaget i SMS-beskeder.

Medvirkende Semyon Rogachev, Associate Malicious Code Researcher, Group-IB Computer Forensics Lab.

Kilde: www.habr.com

Tilføj en kommentar