Hur Android-trojanen Gustuff skördar frukterna (bÄde fiat och kryptovaluta) frÄn dina konton

Hur Android-trojanen Gustuff skördar frukterna (bÄde fiat och kryptovaluta) frÄn dina konton

Nyligen rapporterade Group-IB om aktiviteten av den mobila Android-trojanen Gustuff. Den verkar uteslutande pÄ internationella marknader, attackerar kunder till 100 av de största utlÀndska bankerna, anvÀndare av 32 mobila kryptovaluta plÄnböcker samt stora e-handelsplattformar. Utvecklaren av Gustuff Àr en rysktalande cyberkriminell vid namn Bestoffer. För bara en tid sedan berömde han sin trojan som "en seriös produkt för personer med kunskap och erfarenhet." Specialisten pÄ skadlig kod hos Group-IB

Ivan Pisarev i sin forskning beskriver i detalj hur Gustuff fungerar och vilka faror det medför. Vilka jagar Gustuff?

Gustuff tillhör en ny generation av skadlig programvara med helt automatiserade funktioner. Enligt utvecklaren har trojanen blivit en ny och förbÀttrad version av skadlig programvara AndyBot, som sedan november 2017 attackerar telefoner med Android OS och stjÀl pengar genom phishing-webbformulÀr som utger sig för att vara mobilappar frÄn kÀnda internationella banker och betalningssystem. Bestoffer rapporterade att hyran för "Gustuff Bot" var $800 per mÄnad.

Analysen av Gustuff-provet visade att trojanen potentiellt riktar sig mot kunder som anvÀnder mobilappar frÄn de största bankerna, sÄsom Bank of America, Bank of Scotland, J.P.Morgan, Wells Fargo, Capital One, TD Bank, PNC Bank, samt kryptovaluta plÄnböcker sÄsom Bitcoin Wallet, BitPay, Cryptopay, Coinbase och andra.

Ursprungligen skapad som en klassisk banktrojan, har Gustuff i sin nuvarande version kraftigt utökat listan över potentiella mÄl för attacker. Förutom Android-appar frÄn banker, fintech-företag och kryptotjÀnster, riktar sig Gustuff mot anvÀndare av appar för marknadsplatser, nÀtbutiker, betalningssystem och meddelandeappar. SÀrskilt pÄ PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut och andra.

IngÄngspunkt: rÀkna med massinfektion

IngÄngspunkt: berÀkning för massinfektion

Gustuff kĂ€nnetecknas av en "traditionell" infiltrationsvektor pĂ„ Android-smartphones via SMS-utskick med lĂ€nkar till APK. Vid infektion av en Android-enhet med ett trojan kan Gustuff sprida sig vidare genom kontaktlistan pĂ„ den infekterade telefonen eller genom serverns databas. Funktionerna i Gustuff Ă€r utformade för massinfektion och maximal kapitalisering av sina operatörers verksamhet – den har en unik "autoinladdnings"-funktion för legitima mobila bankapplikationer och kryptovaluta-plĂ„nböcker, vilket möjliggör snabbare och mer omfattande stöld av pengar.

Undersökningen av trojanen visade att autoinladdningsfunktionen implementeras genom Accessibility Service – en tjĂ€nst för personer med funktionsnedsĂ€ttning. Gustuff Ă€r inte den första trojanen som framgĂ„ngsrikt kringgĂ„r skydd mot interaktion med fönsterkomponenter frĂ„n andra applikationer med hjĂ€lp av denna Android-tjĂ€nst. Dock kvarstĂ„r anvĂ€ndning av Accessibility Service i kombination med autoinladdning som en relativt sĂ€llsynt företeelse.

Efter nedladdning pÄ offrets telefon, fÄr Gustuff, med hjÀlp av Accessibility Service, möjlighet att interagera med fönsterkomponenter i andra applikationer (bank-, kryptovaluta-, samt applikationer för online-shopping, meddelanden etc.), och utföra ÄtgÀrder som krÀvs av angriparna. Till exempel kan trojanen, pÄ uppdrag av servern, trycka pÄ knappar och Àndra vÀrden i textfÀlt i bankapplikationer. AnvÀndningen av Accessibility Service gör att trojanen kan kringgÄ de skyddsmekanismer som anvÀnds av banker för att motverka mobiltrojaner frÄn tidigare generationer, samt Àndringar i sÀkerhetspolitiken som Google har införlivat i nya versioner av Android OS. SÄledes kan Gustuff "stÀnga av" Google Protect-skyddet: enligt författaren aktiveras denna funktion i 70% av fallen.

Hur Android-trojanen Gustuff skördar frukterna (bÄde fiat och kryptovaluta) frÄn dina konton

Gustuff kan ocksÄ visa falska PUSH-notiser med ikoner av legitima mobilappar. AnvÀndaren klickar pÄ PUSH-notisen och ser ett phishing-fönster som laddas frÄn servern, dÀr de sjÀlva anger de begÀrda uppgifterna för sitt bankkort eller kryptovaluta-plÄnbok. I ett annat scenario öppnar Gustuff appen som PUSH-notisen representerade. I det hÀr fallet kan malware-programmet pÄ kommando frÄn servern, via Accessibility Service, fylla i fÀlten i bankappen för en bedrÀglig transaktion.

Funktionerna hos Gustuff inkluderar Àven att skicka information om den infekterade enheten till servern, möjlighet att lÀsa/skicka SMS, skicka USSD-förfrÄgningar, starta SOCKS5 Proxy, öppna lÀnkar, skicka filer (inklusive fotoscanningar av dokument, skÀrmdumpar, foton) till servern, samt ÄterstÀlla enheten till fabriksinstÀllningar.

Analys av malware-programmet

Innan installationen av den skadliga appen visar Android-operativsystemet en dialogruta för anvÀndaren som innehÄller en lista över de behörigheter som Gustuff begÀr:

Hur Android-trojanen Gustuff skördar frukterna (bÄde fiat och kryptovaluta) frÄn dina konton
Installationen av appen kommer bara att ske efter att anvÀndaren har gett sitt samtycke. NÀr appen har startats kommer trojanen att visa anvÀndaren en dialogruta:

Hur Android-trojanen Gustuff skördar frukterna (bÄde fiat och kryptovaluta) frÄn dina konton
DĂ€refter tar den bort sin ikon.

Gustuff Àr paketerad, enligt författaren, med en packer frÄn FTT. Efter att ha startats kontaktar appen regelbundet CnC-servern för att ta emot kommandon. I flera av de filer vi har analyserat anvÀndes följande IP-adress som kontrollserver: 88.99.171[.]105 (i fortsÀttningen kommer vi att beteckna detta som <%CnC%>).

NÀr programmet har startats börjar det skicka meddelanden till servern http:///api/v1/get.php.

Som svar förvÀntas en JSON med följande format:

{
    "results" : "OK",
    "command":{
        "id": "",
        "command":"",
        "timestamp":"",
        "params":{
		
        },
    },
}

Vid varje begĂ€ran skickar appen information om den infekterade enheten. Formatet för meddelandet presenteras nedan. Det Ă€r vĂ€rt att notera att fĂ€lten full, extra, apps och permission – Ă€r valfria och kommer endast att skickas vid en begĂ€ran frĂ„n CnC.

{
 "info":
 {
 "info":
 {
 "cell":,
 "country":,
 "imei":,
 "number":,
 "line1Number":,
 "advertisementId":
 },
 "state":
 {
 "admin":,
 "source":,
 "needPermissions":,
 "accesByName":,
 "accesByService":,
 "safetyNet":,
 "defaultSmsApp":,
 "isDefaultSmsApp":,
 "dateTime":,
 "batteryLevel":
 },
 "socks":
 {
 "id":,
 "enabled":,
 "active":
 },
 "version":
 {
 "versionName":,
 "versionCode":,
 "lastUpdateTime":,
 "tag":,
 "targetSdkVersion":,
 "buildConfigTimestamp":1541309066721
 },
 },
 "full":
 {
 "model":,
 "localeCountry":,
 "localeLang":,
 "accounts":,
 "lockType":
 },
 "extra":
 {
 "serial":,
 "board":,
 "brand":,
 "user":,
 "device":,
 "display":,
 "id":,
 "manufacturer":,
 "model":,
 "product":,
 "tags":,
 "type":,
 "imei":,
 "imsi":,
 "line1number":,
 "iccid":,
 "mcc":,
 "mnc":,
 "cellid":,
 "lac":,
 "androidid":,
 "ssid":
 },
 "apps":{},
 "permission":
} 

Lagring av konfigurationsdata

Gustuff lagrar viktig arbetsinformation i preferensfilen. Filnamnet, liksom namnen pĂ„ parametrarna i den, Ă€r resultatet av en MD5-hash av strĂ€ngen 15413090667214.6.1, dĂ€r <%name%> — det ursprungliga namnet- vĂ€rdet. Python-tolkning av namn genereringsfunktionen:

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

Framöver kommer vi att beteckna som nameGenerator(input).
SÄledes, namnet pÄ den första filen: nameGenerator(«API_SERVER_LIST»), den innehÄller vÀrden med följande namn:

VariabelnamnVĂ€rde
nameGenerator(«API_SERVER_LIST»)InnehÄller en lista över CnC-adresser i form av en array.
nameGenerator(«API_SERVER_URL»)InnehÄller en CnC-adress.
nameGenerator(«SMS_UPLOAD»)Standardflaggan Àr aktiverad. Om flaggan Àr aktiverad skickar den SMS-meddelanden till CnC.
nameGenerator(«SMS_ROOT_NUMBER»)Telefonnumret dit SMS-meddelanden kommer att skickas av den infekterade enheten. Som standard Àr det null.
nameGenerator(«SMS_ROOT_NUMBER_RESEND»)Standardflaggan Àr inaktiverad. Om den Àr aktiverad kommer SMS som mottas av den infekterade enheten att skickas till root-numret.
nameGenerator(«DEFAULT_APP_SMS»)Standardflaggan Àr inaktiverad. Om denna flagga Àr aktiverad kommer applikationen att bearbeta inkommande SMS-meddelanden.
nameGenerator(«DEFAULT_ADMIN»)Standardflaggan Àr inaktiverad. Om flaggan Àr aktiverad har applikationen administratörsrÀttigheter.
nameGenerator(«DEFAULT_ACCESSIBILITY»)Standardflaggan Àr inaktiverad. Om flaggan Àr aktiverad körs en tjÀnst som anvÀnder Accessibility Service.
nameGenerator(«APPS_CONFIG»)JSON-objektet innehÄller en lista över ÄtgÀrder som mÄste utföras vid en Accessibility-hÀndelse kopplad till en specifik applikation.
nameGenerator(«APPS_INSTALLED»)InnehÄller en lista över de 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 vid botens första start.

Modul för kommandobearbetning frÄn servern

Applikationen lagrar adresserna till CnC-servrar i form av en array av kodade Base85 strÀngar. Listan över CnC kan Àndras vid mottagande av en motsvarande kommando, i sÄ fall kommer adresserna att lagras i en preference-fil. servrar 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 bearbeta följande kommandon:

forwardStart

TeamBeskrivning
Börja skicka de mottagna SMS-meddelanden frÄn den infekterade enheten till CnC-servern.forwardStop
Stoppa sÀndningen av de mottagna SMS-meddelanden frÄn den infekterade enheten till CnC-servern.ussdRun
Utför USSD-förfrÄgan. Numret för USSD-förfrÄgan finns i JSON-fÀltet «number».sendSms
Skicka ett SMS-meddelande (om nödvĂ€ndigt delas meddelandet upp i delar). Som parameter tar kommandot ett JSON-objekt som innehĂ„ller fĂ€lten «to» — mottagarens nummer och «body» — meddelandets innehĂ„ll.sendSmsAb
skickaSmsAbSkicka SMS-meddelanden (om nödvÀndigt delas meddelandet i delar) till alla i listan över kontakter pÄ den infekterade enheten. Intervallet mellan meddelandeutskicken Àr 10 sekunder. Meddelandets innehÄll finns i JSON-fÀltet «body»
sendSmsMassSkicka SMS-meddelanden (om nödvĂ€ndigt delas meddelandet i delar) till kontakter angivna i kommandoparametrarna. Intervallet mellan meddelandeutskicken Ă€r 10 sekunder. Kommandot tar en JSON-matris (fĂ€ltet «sms») som parameter, vars element innehĂ„ller fĂ€lten «to» — destinationsnummer och «body» — meddelandets innehĂ„ll.
changeServerDetta kommando kan ta ett vĂ€rde med nyckeln «url» som parameter — dĂ„ Ă€ndrar boten vĂ€rdet pĂ„ nameGenerator(“SERVER_URL”), eller «array» — dĂ„ skriver boten en matris till nameGenerator(“API_SERVER_LIST”). PĂ„ sĂ„ sĂ€tt Ă€ndrar applikationen adressen till CnC-servrar.
adminNumberKommando avsett att anvĂ€ndas med root-numret. Kommandot tar ett JSON-objekt med följande parametrar: «number» — Ă€ndra nameGenerator(“ROOT_NUMBER”) till det angivna vĂ€rdet, «resend» — Ă€ndra nameGenerator(“SMS_ROOT_NUMBER_RESEND”), «sendId» — skicka uniqueID till nameGenerator(“ROOT_NUMBER”).
updateInfoSkicka information om den infekterade enheten till servern.
wipeDataKommando avsett för att ta bort anvÀndardata. Beroende pÄ vilket namn applikationen kördes med sker antingen en fullstÀndig dataavtÀckning med omstart av enheten (primary user), eller endast borttagning av anvÀndardata (secondary user).
socksStartStarta Proxy-modulen. Modulens funktionalitet beskrivs i ett separat avsnitt.
socksStopStoppa Proxy-modulens verksamhet.
openLinkÖppna lĂ€nken. LĂ€nken finns i JSON-parametern med nyckeln «url». För att öppna lĂ€nken anvĂ€nds «android.intent.action.VIEW».
uploadAllSmsSkicka alla mottagna SMS-meddelanden frÄn enheten till servern.
uploadAllPhotosSkicka bilder frÄn den infekterade enheten till URL:en. URL:en kommer som parameter.
uploadFileSkicka en fil frÄn den infekterade enheten till URL:en. URL:en kommer som parameter.
uploadPhoneNumbersSkicka telefonnummer frÄn kontaktlistan till servern. Om JSON-objektet med nyckeln «ab» skickas som parameter fÄr applikationen kontaktlistan frÄn telefonboken. Om JSON-objektet med nyckeln «sms» skickas, lÀser applikationen kontaktlistan frÄn avsÀndarna av SMS-meddelanden.
changeArchiveApplikationen laddar ner en fil frĂ„n en adress som ges som parameter via nyckeln ”url”. Den nedladdade filen sparas med namnet ”archive.zip”. Efter detta avzippar applikationen filen, om nödvĂ€ndigt med lösenordet för arkivet ”b5jXh37gxgHBrZhQ4j3D”. De avzipparna filerna sparas i katalogen [external storage]\/hgps. I denna katalog lagrar applikationen web-fakes (som beskrivs nedan).
ÄtgÀrderKommandot Àr avsett för att arbeta med Action Service, som beskrivs i en separat sektion.
testGör ingenting.
ladda nerKommandot Ă€r avsett för att ladda ner en fil frĂ„n en fjĂ€rrserver och spara den i katalogen ”Downloads”. URL:en och filnamnet ges som parametrar, fĂ€lten i JSON-objektet som respektive: ”url” och ”fileName”.
ta bortTar bort filen frĂ„n katalogen ”Downloads”. Filnamnet ges i JSON-parametern med nyckeln ”fileName”. Standardfilnamnet Ă€r ”tmp.apk”.
aviseringVisa en avisering med beskrivningstexter och rubrik som definieras av kontrollservern.

Kommandots format avisering:

{
 "results" : "OK",
 "command":{
 "id": ,
 "command":"notification",
 "timestamp":,
 "params":{
 "openApp":,
 "array":[
 {"title":,
 "desc":,
 "app":}
 ]
 },
 },
}

Aviseringen som skapas av den undersökta filen ser identisk ut med aviseringar som skapas av applikationen som anges i fĂ€ltet app. Om vĂ€rdet i fĂ€ltet openApp — True, vid öppnandet av aviseringen startas applikationen som anges i fĂ€ltet app. Om vĂ€rdet i fĂ€ltet openApp — False, sĂ„:

  • öppnas ett phishing-fönster vars innehĂ„ll hĂ€mtas frĂ„n katalogen \/hgps\/
  • öppnas ett phishing-fönster vars innehĂ„ll hĂ€mtas frĂ„n servern ?id=&app=
  • öppnas ett phishing-fönster maskerat som Google Play-kort, med möjlighet att ange kortuppgifter.

Resultatet av att utföra nÄgot kommando skickar applikationen till set_state.php i form av ett JSON-objekt av följande format:

{
    "command":
    {
        "command":,
        "id":,
        "state":
    }
    "id":
}

ActionsService
Den lista över kommandon som applikationen hanterar inkluderar ÄtgÀrd. Vid mottagandet av kommandot vÀnder sig kommandobehandlingsmodulen till denna tjÀnst för att utföra det utökade kommandot. Som parameter tar tjÀnsten emot ett JSON-objekt. TjÀnsten kan utföra följande kommandon:

1. PARAMS_ACTION — nĂ€r kommandot mottas fĂ„r tjĂ€nsten först vĂ€rdet frĂ„n JSON-parametern med nyckeln Type, vilket kan vara följande:

  • serviceInfo – underkommandot fĂ„r vĂ€rdet frĂ„n JSON-parametern med nyckeln includeNotImportant. Om flaggan Ă€r True kommer applikationen att stĂ€lla in flaggan FLAG_ISOLATED_PROCESS för tjĂ€nsten som anvĂ€nder Accessibility Service. DĂ€rmed kommer tjĂ€nsten att köras i en separat process.
  • root — hĂ€mta och skicka till servern information om det fönster som för nĂ€rvarande Ă€r i fokus. Applikationen fĂ„r informationen via klassen AccessibilityNodeInfo.
  • admin — begĂ€ra administratörsrĂ€ttigheter.
  • delay — pausa ActionsService i det antal millisekunder som anges i parametern med nyckeln "data".
  • windows — skicka en lista över synliga fönster för anvĂ€ndaren.
  • install — installera applikationen pĂ„ den infekterade enheten. Paketnamnet för arkivet finns i nyckeln "fileName". SjĂ€lva arkivet finns i katalogen Downloads.
  • global – underkommandot Ă€r avsett för att navigera frĂ„n det aktuella fönstret:
    • till Quick Settings-menyn
    • bakĂ„t
    • hem
    • till aviseringar
    • till fönstret med nyligen öppnade applikationer

  • launch — starta applikationen. Applikationens namn anges som parameter med nyckeln data.
  • sounds — Ă€ndra ljudlĂ€get till tyst.
  • unlock — slĂ„r pĂ„ belysningen för skĂ€rmen och tangentbordet till full ljusstyrka. Applikationen utför denna Ă„tgĂ€rd med hjĂ€lp av WakeLock, angivande av strĂ€ngen [Application lable]:INFO som tagg.
  • permissionOverlay — funktionen Ă€r inte implementerad (svar pĂ„ kommandot — {"message":"Not support"} eller {"message":"low sdk"})
  • gesture — funktionen Ă€r inte implementerad (svar pĂ„ kommandot — {"message":"Not support"} eller {"message":"Low API"})
  • permissions — detta kommando behövs för att begĂ€ra rĂ€ttigheter för applikationen. Men begĂ€rningsfunktionen Ă€r inte implementerad, sĂ„ kommandot Ă€r meningslöst. Listan över begĂ€rda rĂ€ttigheter kommer som en JSON-array med nyckeln "permissions". 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

  • open — visa phishing-fönstret. Beroende pĂ„ den parameter som kommer frĂ„n servern kan applikationen visa följande phishing-fönster:
    • Visa phishing-fönstret, vars innehĂ„ll Ă€r skrivet i filen i katalogen /hgps/Resultatet av anvĂ€ndarens interaktion med fönstret kommer att skickas till adressen /records.php
    • Visa phishingfönster vars innehĂ„ll förladdas frĂ„n adressen ?id=&app=Resultatet av anvĂ€ndarens interaktion med fönstret kommer att skickas till adressen /records.php
    • Visa ett phishingfönster som Ă€r maskerat som ett Google Play Card.

  • interaktiv — kommandot Ă€r avsett för interaktion med fönster frĂ„n andra applikationer via AccessibilityService. För interaktion i programmet implementeras en speciell tjĂ€nst. Den undersökta applikationen kan interagera med fönster:
    • Aktiva för tillfĂ€llet. I sĂ„ fall innehĂ„ller parametern id eller text (namnet) pĂ„ objektet som det behöver interagera med.
    • Synliga för anvĂ€ndaren vid tidpunkten för kommandots utförande. Applikationen vĂ€ljer fönster efter id.

    Efter att ha fÄtt objekten AccessibilityNodeInfo för de intressanta elementen i fönstret kan applikationen, beroende pÄ parametrarna, utföra ÄtgÀrder:

    • focus — sĂ€tt fokus pĂ„ objektet.
    • click — klicka pĂ„ objektet.
    • actionId — utför Ă„tgĂ€rd enligt ID.
    • setText — Ă€ndra texten pĂ„ objektet. TextĂ€ndring kan göras pĂ„ tvĂ„ sĂ€tt: utföra Ă„tgĂ€rden ACTION_SET_TEXT (om Android-versionen pĂ„ den infekterade enheten Ă€r Ă€ldre Ă€n eller lika med LOLLIPOP), eller genom att placera en strĂ€ng i urklipp och klistra in den i objektet (för versioner senare). Detta kommando kan anvĂ€ndas för att Ă€ndra uppgifter i en bankapplikation.

2. PARAMS_ACTIONS — samma som PARAMS_ACTION, endast att ett JSON-array av kommandon kommer.

Det verkar som att mÄnga Àr intresserade av hur funktionen för interaktion med elementen i fönstret för en annan applikation ser ut. SÄ hÀr har denna funktion implementerats 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));
}

Textutbytesfunktion:

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

DĂ€rmed, med korrekt konfiguration av kontrollservern, kan Gustuff fylla i textfĂ€lt i bankapplikationen och trycka pĂ„ nödvĂ€ndiga knappar för att genomföra transaktionen. Trojan behöver inte ens logga in i applikationen — det rĂ€cker med att skicka en kommando för att visa PUSH-meddelandet följt av att öppna den tidigare installerade bankapplikationen. AnvĂ€ndaren loggar sjĂ€lv in, efter vilket Gustuff kan genomföra autofyllning.

Modul för SMS-meddelandehantering

Applikationen sÀtter en hÀndelsehanterare för att ta emot SMS-meddelanden pÄ den infekterade enheten. Den undersökta applikationen kan ta emot kommandon frÄn operatören som kommer i kroppen av SMS-meddelandet. Kommandona kommer i formatet:

7!5=

Applikationen letar efter strĂ€ngen i alla inkommande SMS-meddelanden 7!5=, vid identifiering av en strĂ€ng – avkodar den Base64-strĂ€ng med ett förskjutning pĂ„ 4 och utför kommandot. Kommandona liknar de med CnC. Resultatet av utförandet skickas till samma nummer som kommandot kom ifrĂ„n. Svarformat:

7*5=

Valfritt kan applikationen skicka alla mottagna meddelanden till Root-numret. För detta mÄste Root-numret anges i preferensfilen och en flagga för omdirigering av meddelanden stÀllas in. SMS-meddelandet skickas till angriparens nummer i formatet:

—

Dessutom kan applikationen valfritt skicka meddelanden till CnC. SMS-meddelandet skickas till servern i JSON-format:

{
    "id":,
    "sms":
    {
        "text":,
        "number":,
        "date":
    }
}

Om flaggan Ă€r instĂ€lld nameGenerator(«DEFAULT_APP_SMS») – stoppar applikationen behandlingen av SMS-meddelandet och rensar listan över inkommande meddelanden.

Proxy-modul

I den undersökta applikationen finns en Backconnect Proxy-modul (hÀdanefter Proxy-modul), som har en separat klass som inkluderar statiska fÀlt med konfiguration. Konfigurationsdata lagras i exempel i klartext:

Hur Android-trojanen Gustuff skördar frukterna (bÄde fiat och kryptovaluta) frÄn dina konton

Alla ÄtgÀrder som utförs av Proxy-modulen loggas i filer. För detta skapar applikationen en katalog med namnet «logs» i External Storage (fÀltet ProxyConfigClass.logsDir i konfigurationsklassen), dÀr loggfiler lagras. Loggningen sker i filer med namnen:

  1. main.txt – i denna fil loggas arbetet av klassen med namnet CommandServer. Vidare kommer loggningen av strĂ€ngen str i denna fil att betecknas som mainLog(str).
  2. session-.txt – i denna fil sparas loggdata relaterad till en viss proxy-session. Vidare kommer loggningen av strĂ€ngen str i denna fil att betecknas som sessionLog (str).
  3. server.txt – i denna fil loggas all data som skrivs i ovanstĂ„ende filer.

Formatet för loggdata:

[Thread[], id[]]: log-string

Undantag som uppstÄr under driften av Proxy-modulen loggas ocksÄ i filen. För detta skapar applikationen ett JSON-objekt av formatet:

{
 "uncaughtException":
 "thread":
 "message":
 "trace": //Stack trace info
 [
 {
 "ClassName":
 "FileName":
 "LineNumber":
 "MethodName":
 },
 {
 "ClassName":
 "FileName":
 "LineNumber":
 "MethodName":
 }
 ]
}

DÀrefter konverteras det till en strÀngrepresentation och loggas.

Starten av Proxy-modulen initieras efter att motsvarande kommando har mottagits. Vid mottagande av körkommandot för Proxy-modulen startar applikationen en tjĂ€nst med namnet MainService, som ansvarar för att hantera Proxy-modulens arbete – dess start och stopp.

Steg för att starta tjÀnsten:

1. Startar en timer som utlöses en gĂ„ng i minuten och kontrollerar aktiviteten för Proxy-modulen. Om modulen inte Ă€r aktiv – startar den den.
Även vid utlösning av hĂ€ndelsen android.net.conn.CONNECTIVITY_CHANGE startas Proxy-modulen.

2. Applikationen skapar en wake-lock med parametern PARTIAL_WAKE_LOCK och tar över den. DÀrmed förhindrar den att enhetens CPU gÄr in i vilolÀge.

3. Startar klassen för kommandobearbetning av Proxy-modulen, efter att ha loggat strÀngen mainLog("start server") och

Server::start() host[], commandPort[], proxyPort[]

w proxy_cnc, command_port och proxy_port – parametrar som erhĂ„llits frĂ„n Proxy-serverns konfiguration.

Klassen för kommandobearbetning heter CommandConnection. Omedelbart efter start utför den följande ÄtgÀrder:

4. Ansluter till ProxyConfigClass.host: ProxyConfigClass.commandPort och skickar dit data om den infekterade enheten i JSON-format:

{
    "id":,
    "imei":,
    "imsi":,
    "model":,
    "manufacturer":,
    "androidVersion":,
    "country":,
    "partnerId":,
    "packageName":,
    "networkType":,
    "hasGsmSupport":,
    "simReady":,
    "simCountry":,
    "networkOperator":,
    "simOperator":,
    "version":
}

Hvor:

  • id – identifier, försöker fĂ„ vĂ€rdet frĂ„n Shared Preference-filen med namnet "x" i fĂ€ltet "id". Om detta vĂ€rde inte kan erhĂ„llas – genereras ett nytt. PĂ„ sĂ„ sĂ€tt har Proxy-modulen sitt eget identifierare, som genereras liknande Bot ID.
  • imei – IMEI för enheten. Om ett fel intrĂ€ffar vid vĂ€rdehĂ€mtningen – registreras istĂ€llet ett textmeddelande om felet.
  • imsi — International Mobile Subscriber Identity för enheten. Om ett fel intrĂ€ffade under hĂ€mtningen av vĂ€rdet, kommer istĂ€llet för detta fĂ€lt att ett meddelande om felet att registreras.
  • model — Det namn som slutkunden ser för slutprodukten.
  • manufacturer — Tillverkaren av produkten/hĂ„rdvaran (Build.MANUFACTURER).
  • androidVersion — en strĂ€ng i formatet " (),"
  • country — enhetens nuvarande plats.
  • partnerId – en tom strĂ€ng.
  • packageName – paketnamn.
  • networkType — typen av den aktuella nĂ€tverksanslutningen (t.ex. "WIFI", "MOBILE"). I hĂ€ndelse av ett fel returneras null.
  • hasGsmSupport – true – om telefonen stöder GSM, annars false.
  • simReady – status för SIM-kortet.
  • simCountry — ISO-koden för landet (baserat pĂ„ SIM-kortets leverantör).
  • networkOperator — namnet pĂ„ operatören. Om ett fel intrĂ€ffade under hĂ€mtningen av vĂ€rdet, kommer istĂ€llet för detta fĂ€lt att ett meddelande om felet att registreras.
  • simOperator — Service Provider Name (SPN). Om ett fel intrĂ€ffade under hĂ€mtningen av vĂ€rdet, kommer istĂ€llet för detta fĂ€lt att ett meddelande om felet att registreras.
  • version — detta fĂ€lt lagras i konfigurationsklassen, för de undersökta versionerna av boten var det lika med "1.6".

5. GÄr in i vÀntelÀge för kommandon frÄn servern. Kommandon frÄn servern kommer i följande format:

  • 0 offset – kommando
  • 1 offset – sessionId
  • 2 offset – lĂ€ngd
  • 4 offset — data

Vid mottagandet av ett kommando loggar applikationen:
mainLog("Header { sessionId], type[], length[] }")

Följande kommandon kan tas emot frÄn servern:

NamnKommandoDataBeskrivning
connectionId0Anslutnings-IDSkapa en ny anslutning
SLEEP3TidPausa Proxy-modulen
PING_PONG4—Skicka PONG-meddelande

PONG-meddelandet bestÄr av 4 byte och ser ut som följer: 0x04000000.

Vid mottagande av kommandot connectionId (för att skapa en ny anslutning) CommandConnection skapas en instans av klassen ProxyConnection.

  • Vid proxyhantering deltar tvĂ„ klasser: ProxyConnection och end. Vid skapandet av klassen ProxyConnection ansluts till adressen ProxyConfigClass.host: ProxyConfigClass.proxyPort och överför JSON-objektet:

 {
    "id":
}

Som svar skickar servern ett SOCKS5-meddelande som innehÄller adressen till den fjÀrrserver som en anslutning mÄste göras mot. Interaktionen med denna server sker via klassen end. Schematisk kan anslutningsinstallationen representeras pÄ följande sÀtt:

Hur Android-trojanen Gustuff skördar frukterna (bÄde fiat och kryptovaluta) frÄn dina konton

NĂ€tverksinteraktioner

För att förhindra trafikanalys av nÀtverks-sniffers kan interaktionen mellan CnC-servern och applikationen skyddas med SSL-protokollet. All data som överförs till och frÄn servern presenteras i JSON-format. Applikationen utför följande förfrÄgningar under sin drift:

  • http:///api/v1/set_state.php — resultatet av kommandons exekvering.
  • http:///api/v1/get.php — hĂ€mtar kommandon.
  • http:///api/v1/load_sms.php — hĂ€mtar SMS-meddelanden frĂ„n den infekterade enheten.
  • http:///api/v1/load_ab.php — hĂ€mtar kontaktlistan frĂ„n den infekterade enheten.
  • http:///api/v1/aevents.php – förfrĂ„gan görs vid uppdatering av instĂ€llningar i preferences-filen.
  • http:///api/v1/set_card.php — hĂ€mtar data som erhölls genom ett phishing-fönster som maskerar sig som Google Play Market.
  • http:///api/v1/logs.php – hĂ€mtar loggdata.
  • http:///api/v1/records.php – hĂ€mtar data som erhölls genom phishing-fönster.
  • http:///api/v1/set_error.php – notifierar om uppkomna fel.

Rekommendationer

För att skydda sina kunder frÄn hotet av mobiltrojaner mÄste företag anvÀnda heltÀckande lösningar som lÄter dem övervaka och varna för skadlig aktivitet utan att installera ytterligare programvara pÄ anvÀndarnas enheter.

För detta ÀndamÄl mÄste signaturmetoder för att upptÀcka mobiltrojaner förstÀrkas med beteendeanalystekniker bÄde för klienten och sjÀlva applikationen. Skyddet bör ocksÄ inkludera en funktion för att identifiera enheter med hjÀlp av digitala fingeravtryck, vilket gör det möjligt att förstÄ nÀr ett konto anvÀnds frÄn en ovanlig enhet och redan har hamnat i fel hÀnder.

En viktig punkt Àr möjligheten till korskanalanalys, vilket ger företag möjlighet att övervaka risker som uppstÄr inte bara vid internetkanalen utan Àven mobilkanalen, som i mobilbankapplikationer, för kryptovalutaoperationer och andra dÀr finansiella transaktioner kan Àga rum.

SÀkerhetsregler för anvÀndare:

  • installera inte applikationer för mobil enhet med Android OS frĂ„n nĂ„gra kĂ€llor utanför Google Play, var sĂ€rskilt uppmĂ€rksam pĂ„ de rĂ€ttigheter som applikationen begĂ€r;
  • installera regelbundet uppdateringar av Android OS;
  • vara uppmĂ€rksam pĂ„ filĂ€ndelserna av de uppladdade filerna;
  • inte besöka misstĂ€nkta resurser;
  • inte klicka pĂ„ lĂ€nkar som mottagits i SMS-meddelanden.

Vid deltagande Semena Rogacheva, junior specialisten för forskning av skadlig kod vid Laboratoriet för datorforensik Group-IB.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster