Com el troià Android Gustuff elimina la crema (fiat i crypto) dels vostres comptes

Com el troià Android Gustuff elimina la crema (fiat i crypto) dels vostres comptes

Just l'altre dia Grup-IB reportat sobre l'activitat del mòbil Android Trojan Gustuff. Funciona exclusivament als mercats internacionals, atacant clients dels 100 bancs estrangers més grans, usuaris de moneders criptogràfics mòbils 32, així com grans recursos de comerç electrònic. Però el desenvolupador de Gustuff és un cibercriminal de parla russa sota el sobrenom de Bestoffer. Fins fa poc, elogiava el seu troià com "un producte seriós per a persones amb coneixements i experiència".

Especialista en anàlisi de codi maliciós a Group-IB Ivan Pisarev en la seva investigació, parla amb detall sobre com funciona Gustuff i quins són els seus perills.

A qui busca Gustuff?

Gustuff pertany a una nova generació de programari maliciós amb funcions totalment automatitzades. Segons el desenvolupador, el troià s'ha convertit en una versió nova i millorada del programari maliciós AndyBot, que des del novembre de 2017 ataca telèfons Android i roba diners mitjançant formularis web de pesca disfressats com aplicacions mòbils de bancs internacionals i sistemes de pagament coneguts. Bestoffer va informar que el preu del lloguer de Gustuff Bot era de 800 dòlars al mes.

L'anàlisi de la mostra Gustuff va mostrar que el troià potencialment s'adreça als clients que utilitzen aplicacions mòbils dels bancs més grans, com ara Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, així com moneders criptogràfics. Bitcoin Wallet, BitPay, Cryptopay, Coinbase, etc.

Creat originalment com un troià bancari clàssic, en la versió actual Gustuff ha ampliat significativament la llista d'objectius potencials per atacar. A més de les aplicacions d'Android per a bancs, empreses fintech i serveis criptogràfics, Gustuff s'adreça als usuaris d'aplicacions de mercat, botigues en línia, sistemes de pagament i missatgeria instantània. En particular, PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut i altres.

Punt d'entrada: càlcul de la infecció massiva

Gustuff es caracteritza pel vector "clàssic" de penetració als telèfons intel·ligents Android mitjançant missatges SMS amb enllaços a APK. Quan un dispositiu Android s'infecta amb un troià a l'ordre del servidor, Gustuff es pot estendre encara més a través de la base de dades de contactes del telèfon infectat o a través de la base de dades del servidor. La funcionalitat de Gustuff està dissenyada per a la infecció massiva i la màxima capitalització del negoci dels seus operadors: té una funció única d'"emplenament automàtic" en aplicacions de banca mòbil legítimes i carteres criptogràfiques, que us permeten accelerar i escalar el robatori de diners.

Un estudi del troià va demostrar que la funció d'emplenament automàtic s'hi va implementar mitjançant el Servei d'Accessibilitat, un servei per a persones amb discapacitat. Gustuff no és el primer troià que evita amb èxit la protecció contra la interacció amb elements de la finestra d'altres aplicacions que utilitzen aquest servei d'Android. Tanmateix, l'ús del Servei d'Accessibilitat en combinació amb un omplidor de cotxes encara és força rar.

Després de descarregar-se al telèfon de la víctima, Gustuff, mitjançant el Servei d'Accessibilitat, pot interactuar amb elements de la finestra d'altres aplicacions (bancària, criptomoneda, així com aplicacions de compres en línia, missatgeria, etc.), realitzant les accions necessàries per als atacants. . Per exemple, a les ordres del servidor, un troià pot prémer botons i canviar els valors dels camps de text a les aplicacions bancàries. L'ús del mecanisme del Servei d'Accessibilitat permet al troià evitar els mecanismes de seguretat utilitzats pels bancs per contrarestar els troians mòbils de generacions anteriors, així com els canvis en la política de seguretat implementats per Google en les noves versions del sistema operatiu Android. Així, Gustuff "sap com" desactivar la protecció de Google Protect: segons l'autor, aquesta funció funciona en el 70% dels casos.

Com el troià Android Gustuff elimina la crema (fiat i crypto) dels vostres comptes

Gustuff també pot mostrar notificacions PUSH falses amb icones d'aplicacions mòbils legítimes. L'usuari fa clic a la notificació PUSH i veu una finestra de pesca baixada del servidor, on introdueix les dades de la targeta bancària o de la cartera criptogràfica sol·licitada. En un altre escenari de Gustuff, s'obre l'aplicació en nom de la qual es va mostrar la notificació PUSH. En aquest cas, el programari maliciós, per ordre del servidor a través del Servei d'Accessibilitat, pot omplir els camps del formulari d'una aplicació bancària per a una transacció fraudulenta.

La funcionalitat de Gustuff també inclou l'enviament d'informació sobre un dispositiu infectat al servidor, la capacitat de llegir/enviar missatges SMS, enviar sol·licituds USSD, llançar SOCKS5 Proxy, seguir un enllaç, enviar fitxers (incloent-hi escanejos de fotos de documents, captures de pantalla, fotografies) al servidor. servidor , restabliu el dispositiu a la configuració de fàbrica.

Anàlisi de programari maliciós

Abans d'instal·lar una aplicació maliciosa, el sistema operatiu Android mostra a l'usuari una finestra que conté una llista de drets sol·licitats per Gustuff:

Com el troià Android Gustuff elimina la crema (fiat i crypto) dels vostres comptes
L'aplicació s'instal·larà només després de rebre el consentiment de l'usuari. Després d'iniciar l'aplicació, el troià mostrarà a l'usuari una finestra:

Com el troià Android Gustuff elimina la crema (fiat i crypto) dels vostres comptes
Després d'això, eliminarà la seva icona.

Gustuff és embalat, segons l'autor, per un empacador de FTT. Després de l'inici, l'aplicació contacta periòdicament amb el servidor CnC per rebre ordres. Diversos fitxers que vam examinar utilitzaven una adreça IP com a servidor de control 88.99.171[.]105 (a partir d'ara ho designarem com <%CnC%>).

Després del llançament, el programa comença a enviar missatges al servidor http://<%CnC%>/api/v1/get.php.

S'espera que la resposta sigui JSON en el format següent:

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

Cada vegada que s'accedeix a l'aplicació, envia informació sobre el dispositiu infectat. El format del missatge es mostra a continuació. Val a dir que els camps Complet, extra, aplicacions и permís – opcional i s'enviarà només en cas de sol·licitud d'ordre 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%>
} 

Emmagatzematge de dades de configuració

Gustuff emmagatzema informació important operativament en un fitxer de preferències. El nom del fitxer, així com els noms dels paràmetres que hi ha, són el resultat del càlcul de la suma MD5 a partir de la cadena 15413090667214.6.1<%name%>On <%name%> - nom-valor inicial. Interpretació de Python de la funció de generació de noms:

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

En el que segueix el denotarem com nameGenerator (entrada).
Així que el primer nom del fitxer és: nameGenerator("API_SERVER_LIST"), conté valors amb els noms següents:

Nom de la variable Valor
nameGenerator("API_SERVER_LIST") Conté una llista d'adreces CnC en forma de matriu.
nameGenerator ("API_SERVER_URL") Conté l'adreça CnC.
nameGenerator("SMS_UPLOAD") La bandera està establerta per defecte. Si la bandera està activada, envia missatges SMS a CnC.
nameGenerator ("SMS_ROOT_NUMBER") Número de telèfon al qual s'enviaran els missatges SMS rebuts pel dispositiu infectat. El valor per defecte és nul.
nameGenerator ("SMS_ROOT_NUMBER_RESEND") La bandera s'esborra de manera predeterminada. Si està instal·lat, quan un dispositiu infectat rebi un SMS, s'enviarà al número root.
nameGenerator ("DEFAULT_APP_SMS") La bandera s'esborra de manera predeterminada. Si s'estableix aquesta marca, l'aplicació processarà els missatges SMS entrants.
nameGenerator("DEFAULT_ADMIN") La bandera s'esborra de manera predeterminada. Si la marca està establerta, l'aplicació té drets d'administrador.
nameGenerator("DEFAULT_ACCESSIBILITY") La bandera s'esborra de manera predeterminada. Si la marca està activada, s'està executant un servei que utilitza el servei d'accessibilitat.
nameGenerator ("APPS_CONFIG") Un objecte JSON que conté una llista d'accions que s'han de realitzar quan s'activa un esdeveniment d'accessibilitat associat a una aplicació específica.
nameGenerator("APPS_INSTALLED") Emmagatzema una llista d'aplicacions instal·lades al dispositiu.
nameGenerator ("IS_FIST_RUN") La bandera es reinicia al primer inici.
nameGenerator("UNIQUE_ID") Conté un identificador únic. Es genera quan s'inicia el bot per primera vegada.

Mòdul per processar ordres des del servidor

L'aplicació emmagatzema les adreces dels servidors CnC en forma d'una matriu codificada per Base 85 línies. La llista de servidors CnC es pot canviar després de rebre l'ordre corresponent, en aquest cas les adreces s'emmagatzemaran en un fitxer de preferències.

En resposta a la sol·licitud, el servidor envia una ordre a l'aplicació. Val la pena assenyalar que les ordres i els paràmetres es presenten en format JSON. L'aplicació pot processar les ordres següents:

Equip Descripció
forwardStart Comenceu a enviar missatges SMS rebuts pel dispositiu infectat al servidor CnC.
forwardStop Deixeu d'enviar missatges SMS rebuts pel dispositiu infectat al servidor CnC.
ussdRun Executeu la sol·licitud USSD. El número al qual heu de fer una sol·licitud USSD es troba al camp JSON "número".
enviarSms Envieu un missatge SMS (si cal, el missatge es "divideix" en parts). Com a paràmetre, l'ordre pren un objecte JSON que conté els camps "a" - el número de destinació i "cos" - el cos del missatge.
enviarSmsAb Envieu missatges SMS (si cal, el missatge es "divideix" en parts) a tothom a la llista de contactes del dispositiu infectat. L'interval entre enviament de missatges és de 10 segons. El cos del missatge es troba al camp JSON "body"
enviarSmsMass Envieu missatges SMS (si cal, el missatge es "divideix" en parts) als contactes especificats als paràmetres de comanda. L'interval entre enviament de missatges és de 10 segons. Com a paràmetre, l'ordre pren una matriu JSON (el camp "sms"), els elements de la qual contenen els camps "a" - el número de destinació i "cos" - el cos del missatge.
canvi de servidor Aquesta ordre pot prendre un valor amb la clau "url" com a paràmetre; aleshores el bot canviarà el valor de nameGenerator ("SERVER_URL") o "array"; aleshores el bot escriurà la matriu a nameGenerator ("API_SERVER_LIST"). Així, l'aplicació canvia l'adreça dels servidors CnC.
adminNumber L'ordre està dissenyada per funcionar amb un número arrel. L'ordre accepta un objecte JSON amb els paràmetres següents: "número" - canvia nameGenerator ("ROOT_NUMBER") pel valor rebut, "reenvia" - canvia nameGenerator ("SMS_ROOT_NUMBER_RESEND"), "sendId" - envia a nameGenerator ("ROOT_NUMBER" ) ID únic.
actualitza la informació Envieu informació sobre el dispositiu infectat al servidor.
esborrar dades L'ordre està pensada per eliminar les dades de l'usuari. Depenent del nom que s'hagi llançat l'aplicació, les dades s'esborren completament amb un reinici del dispositiu (usuari principal) o només s'eliminen les dades de l'usuari (usuari secundari).
socksStart Inicieu el mòdul Proxy. El funcionament del mòdul es descriu en una secció a part.
mitjonsStop Atureu el mòdul Proxy.
enllaç obert Seguiu l'enllaç. L'enllaç es troba al paràmetre JSON sota la clau "url". "android.intent.action.VIEW" s'utilitza per obrir l'enllaç.
carregarAllSms Envieu tots els missatges SMS rebuts pel dispositiu al servidor.
carrega totes les fotos Envia imatges des d'un dispositiu infectat a una URL. L'URL ve com a paràmetre.
penja el document Envia un fitxer a una URL des d'un dispositiu infectat. L'URL ve com a paràmetre.
carregar números de telèfon Envieu números de telèfon de la vostra llista de contactes al servidor. Si es rep un valor d'objecte JSON amb la clau "ab" com a paràmetre, l'aplicació rep una llista de contactes de l'agenda telefònica. Si es rep un objecte JSON amb la clau "sms" com a paràmetre, l'aplicació llegeix la llista de contactes dels remitents dels missatges SMS.
canvia l'arxiu L'aplicació descarrega el fitxer des de l'adreça que ve com a paràmetre mitjançant la clau "url". El fitxer descarregat es desa amb el nom "archive.zip". A continuació, l'aplicació descomprimirà el fitxer, utilitzant opcionalment la contrasenya d'arxiu "b5jXh37gxgHBrZhQ4j3D". Els fitxers descomprimits es guarden al directori [emmagatzematge extern]/hgps. En aquest directori, l'aplicació emmagatzema falsificacions web (que es descriuen a continuació).
accions L'ordre està dissenyada per funcionar amb Action Service, que es descriu en una secció separada.
prova No fer res.
descarregar L'ordre pretén descarregar un fitxer des d'un servidor remot i desar-lo al directori "Descàrregues". L'URL i el nom del fitxer vénen com a paràmetre, camps a l'objecte de paràmetre JSON, respectivament: "url" i "fileName".
treure Elimina un fitxer del directori "Descàrregues". El nom del fitxer ve en un paràmetre JSON amb la clau "fileName". El nom de fitxer estàndard és "tmp.apk".
notificació Mostra una notificació amb textos de descripció i títol definits pel servidor de gestió.

Format d'ordres notificació:

{
    "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 notificació generada pel fitxer investigat té un aspecte idèntic a les notificacions generades per l'aplicació especificada al camp aplicació. Si el valor del camp openApp — És cert que quan s'obre una notificació, s'inicia l'aplicació especificada al camp aplicació. Si el valor del camp openApp —Fals, doncs:

  • S'obre una finestra de pesca, el contingut de la qual es baixa del directori <%emmagatzematge extern%>/hgps/<%filename%>
  • S'obre una finestra de pesca, el contingut de la qual es baixa del servidor <%url%>?id=<%Bot id%>&app=<%Nom de l'aplicació%>
  • S'obre una finestra de pesca, disfressada com una targeta de Google Play, amb l'oportunitat d'introduir els detalls de la targeta.

L'aplicació envia el resultat de qualsevol comanda a <%CnC%>set_state.php com a objecte JSON en el format següent:

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

Servei d'Accions
La llista d'ordres que inclou l'aplicació acció. Quan es rep una ordre, el mòdul de processament d'ordres accedeix a aquest servei per executar l'ordre ampliada. El servei accepta un objecte JSON com a paràmetre. El servei pot executar les ordres següents:

1. PARAMS_ACTION — en rebre aquesta ordre, el servei rep primer del paràmetre JSON el valor de la clau de tipus, que pot ser el següent:

  • informació del servei – la subordre obté el valor per clau del paràmetre JSON inclouNotImportant. Si la marca és True, l'aplicació estableix la marca FLAG_ISOLATED_PROCESS a un servei que utilitza el Servei d'Accessibilitat. D'aquesta manera, el servei es posarà en marxa en un procés independent.
  • root — rebre i enviar al servidor informació sobre la finestra que està actualment enfocada. L'aplicació obté informació mitjançant la classe AccessibilityNodeInfo.
  • admin - sol·licitar drets d'administrador.
  • delay — suspendre ActionsService durant el nombre de mil·lisegons especificat al paràmetre de la clau "data".
  • finestres — enviar una llista de finestres visibles per l'usuari.
  • instal · lar — instal·leu l'aplicació al dispositiu infectat. El nom del paquet d'arxiu es troba a la clau "fileName". El propi arxiu es troba al directori de descàrregues.
  • global – la subordre està pensada per navegar des de la finestra actual:
    • al menú de configuració ràpida
    • Назад
    • casa
    • a les notificacions
    • a la finestra d'aplicacions oberta recentment

  • llançar - iniciar l'aplicació. El nom de l'aplicació ve com a paràmetre per clau dades.
  • sons — Canvieu el mode de so a silenci.
  • desbloquejar — activa la llum de fons de la pantalla i el teclat a la brillantor total. L'aplicació realitza aquesta acció mitjançant WakeLock, especificant la cadena [Etiqueta de l'aplicació]:INFO com a etiqueta
  • superposició de permís — la funció no està implementada (la resposta a l'execució de l'ordre és {"message":"No és compatible"} o {"message":"low sdk"})
  • gest — la funció no està implementada (la resposta a l'execució de l'ordre és {"message":"No és compatible"}o {"message":"API baixa"})
  • permisos — aquesta ordre és necessària per sol·licitar permisos per a l'aplicació. Tanmateix, la funció de consulta no està implementada, de manera que l'ordre no té sentit. La llista de drets sol·licitats es presenta com una matriu JSON amb la clau "permisos". Llista estàndard:
    • 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

  • obrir — mostrar una finestra de pesca. Depenent del paràmetre procedent del servidor, l'aplicació pot mostrar les següents finestres de pesca:
    • Mostra una finestra de pesca el contingut de la qual està escrit en un fitxer d'un directori <%directori extern%>/hgps/<%param_filename%>. El resultat de la interacció de l'usuari amb la finestra s'enviarà a <%CnC%>/records.php
    • Mostra una finestra de pesca el contingut de la qual està carregat prèviament des de l'adreça <%url_param%>?id=<%bot_id%>&app=<%packagename%>. El resultat de la interacció de l'usuari amb la finestra s'enviarà a <%CnC%>/records.php
    • Mostra una finestra de pesca disfressada com una targeta de Google Play.

  • interactiu — l'ordre està dissenyada per interactuar amb elements de la finestra d'altres aplicacions mitjançant AccessibilityService. S'ha implementat un servei especial al programa d'interacció. L'aplicació investigada pot interactuar amb Windows:
    • Actualment actiu. En aquest cas, el paràmetre conté l'identificador o el text (nom) de l'objecte amb el qual necessiteu interactuar.
    • Visible per l'usuari en el moment en què s'executa l'ordre. L'aplicació selecciona Windows per identificador.

    Haver rebut objectes AccessibilityNodeInfo Per als elements de finestra d'interès, l'aplicació, en funció dels paràmetres, pot realitzar les accions següents:

    • focus: posa el focus a l'objecte.
    • clic: feu clic a un objecte.
    • actionId — realitza una acció per ID.
    • setText: canvia el text d'un objecte. Canviar el text és possible de dues maneres: realitzar una acció ACTION_SET_TEXT (si la versió d'Android del dispositiu infectat és menor o igual a LOLLIPOP), o col·locant una cadena al porta-retalls i enganxant-la a un objecte (per a versions anteriors). Aquesta ordre es pot utilitzar per canviar dades en una aplicació bancària.

2. PARAMS_ACTIONS - el mateix que PARAMS_ACTION, només arriba una matriu JSON d'ordres.

Sembla que molta gent estarà interessada en com és la funció d'interactuar amb els elements de la finestra d'una altra aplicació. Així és com s'implementa aquesta funcionalitat a 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));
}

Funció de substitució de text:

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

Així, amb la configuració correcta del servidor de control, Gustuff és capaç d'omplir camps de text a l'aplicació bancària i fer clic als botons necessaris per completar la transacció. El troià ni tan sols necessita iniciar sessió a l'aplicació; n'hi ha prou amb enviar una ordre per mostrar una notificació PUSH i després obrir l'aplicació bancària instal·lada anteriorment. L'usuari s'autenticarà, després del qual Gustuff podrà omplir el cotxe.

Mòdul de processament de missatges SMS

L'aplicació instal·la un gestor d'esdeveniments perquè el dispositiu infectat accepti missatges SMS. L'aplicació en estudi pot rebre ordres de l'operador, que vénen al cos del missatge SMS. Les ordres tenen el format:

7!5=<%Ordre codificada en Base64%>

L'aplicació cerca la cadena a tots els missatges SMS entrants 7!5=, quan es detecta una cadena, descodifica la cadena de Base64 a l'offset 4 i executa l'ordre. Les ordres són similars a les de CnC. El resultat de l'execució s'envia al mateix número del qual prové l'ordre. Format de resposta:

7*5=<%Codificació Base64 de l'"ordre de codi_resultat"%>

Opcionalment, l'aplicació pot enviar tots els missatges rebuts al número d'arrel. Per fer-ho, s'ha d'especificar el número arrel al fitxer de preferències i s'ha d'establir el senyalador de redirecció de missatges. S'envia un missatge SMS al número de l'atacant amb el format:

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

També, opcionalment, l'aplicació pot enviar missatges a CnC. El missatge SMS s'envia al servidor en format JSON:

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

Si la bandera està posada nameGenerator ("DEFAULT_APP_SMS") – l'aplicació deixa de processar el missatge SMS i esborra la llista de missatges entrants.

Mòdul proxy

L'aplicació en estudi conté un mòdul Backconnect Proxy (d'ara endavant, el mòdul Proxy), que té una classe separada que inclou camps estàtics amb configuració. Les dades de configuració s'emmagatzemen a la mostra en forma clara:

Com el troià Android Gustuff elimina la crema (fiat i crypto) dels vostres comptes

Totes les accions realitzades pel mòdul Proxy es registren als fitxers. Per fer-ho, l'aplicació a l'emmagatzematge extern crea un directori anomenat "logs" (el camp ProxyConfigClass.logsDir de la classe de configuració), en el qual s'emmagatzemen els fitxers de registre. El registre es produeix en fitxers amb noms:

  1. main.txt – el treball de la classe anomenada CommandServer està registrat en aquest fitxer. A continuació, registrar la cadena str en aquest fitxer es denotarà com a mainLog(str).
  2. sessió-<%id%>.txt — aquest fitxer desa les dades de registre associades a una sessió de proxy específica. A continuació, registrar la cadena str en aquest fitxer es denominarà sessionLog (str).
  3. server.txt – aquest fitxer s'utilitza per registrar totes les dades escrites als fitxers descrits anteriorment.

Format de dades de registre:

<%Date%> [Thread[<%thread id%>], id[]]: cadena de registre

Les excepcions que es produeixen durant el funcionament del mòdul Proxy també es registren en un fitxer. Per fer-ho, l'aplicació genera un objecte JSON en el format següent:

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

A continuació, la converteix en una representació de cadena i la registra.

El mòdul Proxy s'inicia després de rebre l'ordre corresponent. Quan es rep una ordre per iniciar el mòdul Proxy, l'aplicació inicia un servei anomenat Servei principal, que s'encarrega de gestionar el funcionament del mòdul Proxy: iniciar-lo i aturar-lo.

Fases d'inici del servei:

1. Inicia un temporitzador que s'executa un cop per minut i comprova l'activitat del mòdul Proxy. Si el mòdul no està actiu, l'inicia.
També quan es desencadena l'esdeveniment android.net.conn.CONNECTIVITY_CHANGE S'inicia el mòdul Proxy.

2. L'aplicació crea un wake-lock amb el paràmetre PARTIAL_WAKE_LOCK i el captura. Això evita que la CPU del dispositiu entri en mode de repòs.

3. Llança la classe de processament d'ordres del mòdul Proxy, primer registrant la línia mainLog("inicia el servidor") и

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

on proxy_cnc, port_ordre i port_proxy – paràmetres obtinguts de la configuració del servidor intermediari.

S'anomena la classe de processament d'ordres CommandConnection. Immediatament després de l'inici, realitza les accions següents:

4. Es connecta a ProxyConfigClass.host: ProxyConfigClass.commandPort i hi envia dades sobre el dispositiu infectat en format 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%>
}

On:

  • id - identificador, intenta obtenir un valor amb el camp "id" del fitxer de preferències compartides anomenat "x". Si aquest valor no es pot obtenir, se'n genera un de nou. Així, el mòdul Proxy té el seu propi identificador, que es genera de manera similar a l'ID del bot.
  • imei — IMEI del dispositiu. Si s'ha produït un error durant el procés d'obtenció del valor, s'escriurà un missatge de text d'error en lloc d'aquest camp.
  • imsi — Identitat de subscriptor mòbil internacional del dispositiu. Si es va produir un error durant el procés d'obtenció del valor, s'escriurà un missatge de text d'error en lloc d'aquest camp.
  • model — El nom visible per a l'usuari final del producte final.
  • fabricant — El fabricant del producte/maquinari (Build.MANUFACTURER).
  • androidVersion: una cadena en el format "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • país: ubicació actual del dispositiu.
  • partnerId és una cadena buida.
  • packageName: nom del paquet.
  • networkType — tipus de connexió de xarxa actual (exemple: “WIFI”, “MÒBIL”). En cas d'error, retorna null.
  • hasGsmSupport - true - si el telèfon admet GSM, en cas contrari fals.
  • simReady: estat de la targeta SIM.
  • simCountry: codi de país ISO (basat en el proveïdor de la targeta SIM).
  • networkOperator — nom de l'operador. Si es va produir un error durant el procés d'obtenció del valor, s'escriurà un missatge de text d'error en lloc d'aquest camp.
  • simOperator — El nom del proveïdor de serveis (SPN). Si es va produir un error durant el procés d'obtenció del valor, s'escriurà un missatge de text d'error en lloc d'aquest camp.
  • versió: aquest camp s'emmagatzema a la classe de configuració; per a les versions provades del bot era igual a "1.6".

5. Canvia al mode d'espera d'ordres del servidor. Les ordres del servidor tenen el format:

  • 0 offset - comanda
  • 1 desplaçament - sessionId
  • 2 desplaçament - longitud
  • 4 offset - dades

Quan arriba una ordre, l'aplicació registra:
mainLog("Encapçalament { sessionId<%id%>], tipus[<%command%>], length[<%length%>] }")

Les ordres següents des del servidor són possibles:

Nom Comando dades Descripció
connectionId 0 ID de connexió Creeu una connexió nova
DORMIT 3 Temps Posa en pausa el mòdul Proxy
TENIS DE TAULA 4 - Envia un missatge a PONG

Un missatge PONG consta de 4 bytes i té aquest aspecte: 0x04000000.

Quan es rep l'ordre connectionId (per crear una nova connexió) CommandConnection crea una instància d'una classe ProxyConnection.

  • Dues classes participen en el proxy: ProxyConnection и final. Quan es crea una classe ProxyConnection connectant a l'adreça ProxyConfigClass.host: ProxyConfigClass.proxyPort i passant l'objecte JSON:

 {
    "id":<%connectionId%>
}

En resposta, el servidor envia un missatge SOCKS5 que conté l'adreça del servidor remot amb el qual s'ha d'establir la connexió. La interacció amb aquest servidor es produeix a través de la classe final. La configuració de la connexió es pot representar esquemàticament de la següent manera:

Com el troià Android Gustuff elimina la crema (fiat i crypto) dels vostres comptes

Interaccions en xarxa

Per evitar l'anàlisi del trànsit per sniffers de xarxa, la interacció entre el servidor CnC i l'aplicació es pot protegir mitjançant el protocol SSL. Totes les dades transmeses tant des del servidor com cap al servidor es presenten en format JSON. L'aplicació executa les peticions següents durant el funcionament:

  • http://<%CnC%>/api/v1/set_state.php — el resultat de l'execució de l'ordre.
  • http://<%CnC%>/api/v1/get.php - rebre una ordre.
  • http://<%CnC%>/api/v1/load_sms.php — baixar missatges SMS des d'un dispositiu infectat.
  • http://<%CnC%>/api/v1/load_ab.php — penjar una llista de contactes des d'un dispositiu infectat.
  • http://<%CnC%>/api/v1/aevents.php – la sol·licitud es fa en actualitzar els paràmetres situats al fitxer de preferències.
  • http://<%CnC%>/api/v1/set_card.php — penjar dades obtingudes mitjançant una finestra de pesca dissimulada com a Google Play Market.
  • http://<%CnC%>/api/v1/logs.php - càrrega de dades de registre.
  • http://<%CnC%>/api/v1/records.php – càrrega de dades obtingudes mitjançant finestres de pesca.
  • http://<%CnC%>/api/v1/set_error.php - Notificació d'un error que s'ha produït.

Recomanacions

Per tal de protegir els seus clients de l'amenaça dels troians mòbils, les empreses han d'utilitzar solucions integrals que els permetin controlar i prevenir activitats malicioses sense instal·lar programari addicional als dispositius dels usuaris.

Per fer-ho, cal reforçar els mètodes de signatura per detectar troians mòbils amb tecnologies per analitzar el comportament tant del client com de la pròpia aplicació. La protecció també hauria d'incloure una funció d'identificació del dispositiu mitjançant la tecnologia d'empremtes digitals, que permetrà entendre quan s'està utilitzant un compte des d'un dispositiu atípic i ja ha caigut en mans d'un estafador.

Un punt fonamental és la disponibilitat de l'anàlisi multicanal, que permet a les empreses controlar els riscos que sorgeixen no només a Internet, sinó també al canal mòbil, per exemple, en aplicacions de banca mòbil, per a transaccions amb criptomonedes i qualsevol altra on es poden realitzar transaccions.transacció financera.

Normes de seguretat per als usuaris:

  • no instal·leu aplicacions per a un dispositiu mòbil amb sistema operatiu Android des de cap altra font que no sigui Google Play, presteu especial atenció als drets que demana l'aplicació;
  • instal·lar regularment actualitzacions del sistema operatiu Android;
  • presta atenció a les extensions dels fitxers descarregats;
  • no visiteu recursos sospitosos;
  • No feu clic als enllaços rebuts als missatges SMS.

Protagonitzada Semyon Rogacheva, especialista júnior en recerca de programari maliciós al Laboratori d'Informàtica Forense del Grup-IB.

Font: www.habr.com

Afegeix comentari