
Outro dia, o Group-IB
informou sobre a atividade do Trojan Gustuff para celular Android. Trabalha exclusivamente nos mercados internacionais, atacando clientes dos 100 maiores bancos estrangeiros, usuários de 32 carteiras criptográficas móveis, além de grandes recursos de comércio eletrônico. Mas o desenvolvedor do Gustuff é um cibercriminoso de língua russa sob o apelido de Bestoffer. Até recentemente, ele elogiava seu cavalo de Troia como "um produto sério para pessoas com conhecimento e experiência".
Ivan Pisarev, especialista em análise de códigos maliciosos do Group-IB, em sua pesquisa, detalhadamente sobre como o Gustuff funciona e qual é o seu perigo.
Quem está procurando Gustuff?
Gustuff é uma nova geração de malware com recursos totalmente automatizados. Segundo o desenvolvedor, o trojan se tornou uma nova versão aprimorada do malware AndyBot, que desde novembro de 2017 ataca telefones Android e rouba dinheiro por meio de formulários da web de phishing que se disfarçam 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 é potencialmente direcionado a 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, além de Bitcoin Wallet, BitPay Wallet e Crypto Wallet. , Cryptopay, Coinbase, etc.
Originalmente criada como um Trojan bancário clássico, a versão atual do Gustuff expandiu significativamente a lista de possíveis alvos para ataques. Além dos aplicativos Android de bancos, empresas de fintech e serviços de criptografia, o Gustuff é voltado para usuários de aplicativos de mercado, lojas on-line, sistemas de pagamento e mensagens instantâneas. 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 envio por SMS com links para APKs. Se o dispositivo Android estiver infectado com um trojan ao comando do servidor, o Gustuff poderá 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ções maciças e capitalização máxima dos negócios de suas operadoras - ela tem uma função exclusiva de "preenchimento automático" em aplicativos bancários móveis legítimos e cripto-carteiras, o que permite acelerar e escalar o roubo de dinheiro.
O estudo do Trojan mostrou que a função de preenchimento automático foi implementada usando o Serviço de Acessibilidade - um serviço para pessoas com deficiência. O Gustuff não é o primeiro cavalo de Troia que ignora com êxito a proteção contra a interação com os elementos da janela de outros aplicativos usando este serviço Android. No entanto, o uso do Serviço de Acessibilidade em conjunto com o carregamento automático ainda é bastante raro.
Depois de baixar a vítima para o telefone, o Gustuff, usando o Serviço de Acessibilidade, tem a oportunidade de interagir com os elementos da janela de outros aplicativos (banco, criptomoeda, além de aplicativos para compras online, mensagens etc.), executando as ações necessárias para os atacantes. Por exemplo, ao comando do servidor, o trojan pode clicar nos botões e alterar os valores dos campos de texto nos aplicativos bancários. O uso do mecanismo do Serviço de Acessibilidade permite que o trojan ignore os mecanismos de proteção usados pelos bancos para combater os cavalos de Troia móveis da geração anterior, bem como as mudanças na política de segurança introduzida pelo Google nas novas versões do sistema operacional Android. Portanto, Gustuff "sabe como" desativar a proteção do Google Protect: de acordo com o autor, essa função funciona em 70% dos casos.

O Gustuff também pode exibir notificações falsas de PUSH 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 ele próprio insere os dados solicitados de um cartão bancário ou carteira criptográfica. Em outro cenário do Gustuff, um aplicativo é aberto em nome do qual uma notificação PUSH foi exibida. Nesse caso, o programa malicioso, sob o comando do servidor por meio do Serviço de Acessibilidade, pode preencher os campos do formulário do aplicativo bancário para uma transação fraudulenta.
A funcionalidade do Gustuff também inclui o envio de informações sobre um dispositivo infectado ao servidor, a capacidade de ler / enviar mensagens SMS, enviar solicitações USSD, iniciar o SOCKS5 Proxy, seguir o link, enviar arquivos (incluindo digitalizações de documentos, capturas de tela, fotos) para o servidor redefina o dispositivo para as configurações de fábrica.
Análise de malware
Antes de instalar um aplicativo mal-intencionado, o Android OS exibe ao usuário uma janela contendo uma lista dos direitos solicitados pelo Gustuff:
A instalação do aplicativo ocorrerá somente após a obtenção do consentimento do usuário. Depois de iniciar o aplicativo, o trojan mostrará ao usuário uma janela:
Em seguida, ele excluirá seu ícone.
Gustuff é empacotado, de acordo com o autor, por um empacotador de FTT. Após o início, o aplicativo acessa periodicamente o servidor CnC para receber comandos. Em vários dos arquivos que examinamos, o endereço IP
88.99.171 [.] 105 foi usado como servidor de controle (a seguir, o designaremos como
<% CnC%> ).
Após o início, o programa começa a enviar mensagens para o servidor
http: // <% CnC%> /api/v1/get.php .
Como resposta, o JSON é esperado no seguinte formato:
{ "results" : "OK", "command":{ "id": "<%id%>", "command":"<%command%>", "timestamp":"<%Server Timestamp%>", "params":{ <%Command parameters as JSON%> }, }, }
Sempre que o aplicativo envia informações sobre um dispositivo infectado. O formato da mensagem é apresentado abaixo. Vale ressaltar que os campos
completos ,
extras ,
aplicativos e
permissão são opcionais e serão enviados apenas no caso de um 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%> }
Armazenamento de Dados de Configuração
O Gustuff armazena informações importantes sobre o trabalho em um arquivo de preferências. O nome do arquivo, assim como os nomes dos parâmetros, é o resultado do cálculo da soma MD5 da linha
15413090667214.6.1 <% name%> , onde
<% name%> é o valor do nome original. 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
nameGenerator (input) .
Portanto, o nome do primeiro arquivo é:
nameGenerator ("API_SERVER_LIST") , contém valores com os seguintes nomes:
Nome da variável | Valor |
---|
nameGenerator ("API_SERVER_LIST") | Contém uma lista de endereços CnC como uma matriz. |
nameGenerator ("API_SERVER_URL") | Contém um endereço CnC. |
nameGenerator ("SMS_UPLOAD") | O sinalizador é definido por padrão. Se o sinalizador estiver definido - envia mensagens SMS para o CnC. |
nameGenerator ("SMS_ROOT_NUMBER") | O número de telefone para o qual as mensagens SMS recebidas pelo dispositivo infectado serão enviadas. O padrão é nulo. |
nameGenerator ("SMS_ROOT_NUMBER_RESEND") | O sinalizador é limpo por padrão. Se instalado, quando um dispositivo infectado receber um SMS, ele será enviado para o número raiz. |
nameGenerator ("DEFAULT_APP_SMS") | O sinalizador é limpo por padrão. Se esse sinalizador estiver definido, o aplicativo processará as mensagens SMS recebidas. |
nameGenerator ("DEFAULT_ADMIN") | O sinalizador é limpo por padrão. Se o sinalizador estiver definido, o aplicativo terá direitos de administrador. |
nameGenerator ("DEFAULT_ACCESSIBILITY") | O sinalizador é limpo por padrão. Se o sinalizador estiver definido, um serviço usando o Serviço de Acessibilidade será iniciado. |
nameGenerator ("APPS_CONFIG") | O objeto JSON contém uma lista de ações que devem ser executadas quando o evento Acessibilidade associado a um aplicativo específico é acionado. |
nameGenerator ("APPS_INSTALLED") | Armazena uma lista de aplicativos instalados no dispositivo. |
nameGenerator ("IS_FIST_RUN") | O sinalizador é redefinido na primeira partida. |
nameGenerator ("UNIQUE_ID") | Contém um identificador exclusivo. É gerado no primeiro lançamento do bot. |
Módulo de processamento de comandos do servidor
O aplicativo armazena os endereços dos servidores CnC como uma matriz de
seqüências codificadas
Base85 . A lista de servidores CnC pode ser alterada após o recebimento do comando apropriado; nesse caso, os endereços serão armazenados em um arquivo de preferências.
Em resposta à solicitação, o servidor envia um comando para o aplicativo. Vale ressaltar que os comandos e parâmetros são apresentados no formato JSON. Um aplicativo pode processar os seguintes comandos:
A equipe | Descrição do produto |
---|
forwardStart | Comece a enviar mensagens SMS recebidas pelo dispositivo infectado para o servidor CnC. |
forwardStop | Pare de enviar mensagens SMS recebidas pelo dispositivo infectado para o servidor CnC. |
ussdRun | Execute a solicitação USSD. O número para o qual você deseja fazer uma solicitação USSD está no campo JSON "number". |
sendSms | Envie uma mensagem SMS (se necessário, a mensagem é "dividida" em partes). Como parâmetro, o comando usa um objeto JSON que contém os campos "para" - o número de destino e "corpo" - o corpo da mensagem. |
sendSmsAb | Envie mensagens SMS (se necessário, a mensagem será "dividida" em partes) para todos da 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" |
sendSmsMass | Envie mensagens SMS (se necessário, a mensagem é "dividida" em partes) para os contatos especificados nos parâmetros de comando. O intervalo entre o envio de mensagens é de 10 segundos. Como parâmetro, o comando aceita uma matriz JSON (campo "sms"), cujos elementos contêm os campos "a" - o número de destino e "corpo" - o corpo da mensagem. |
changeServer | Este comando como parâmetro pode ter um valor com a chave "url" - então o bot alterará o valor de nameGenerator ("SERVER_URL") ou "array" - então o bot gravará o array em nameGenerator ("API_SERVER_LIST"). Assim, o aplicativo altera o endereço dos servidores CnC. |
adminNumber | O comando foi projetado para funcionar com o número raiz. O comando aceita um objeto JSON com os seguintes parâmetros: "number" - altere nameGenerator ("ROOT_NUMBER") para o valor recebido, "reenvie" - altere nameGenerator ("SMS_ROOT_NUMBER_RESEND"), "sendId" - envie para nameGenerator ("ROOT_NUMBER") ID exclusivo. |
updateInfo | Envie informações sobre um dispositivo infectado para o servidor. |
wipeData | O comando foi projetado para excluir dados do usuário. Dependendo do nome do aplicativo que foi iniciado, os dados são completamente apagados com a reinicialização do dispositivo (usuário principal) ou apenas os dados do usuário são excluídos (usuário secundário). |
socksStart | Inicie o módulo proxy. A operação do módulo é descrita em uma seção separada. |
meias | Pare o módulo proxy. |
openLink | Siga o link. O link está localizado no parâmetro JSON pela chave "url". Para abrir o link, use "android.intent.action.VIEW". |
uploadAllSms | Envie ao servidor todas as mensagens SMS recebidas pelo dispositivo. |
uploadAllPhotos | Envie imagens de um dispositivo infectado para o URL. O URL vem como um parâmetro. |
uploadFile | Envie o arquivo para o URL do dispositivo infectado. O URL vem como um parâmetro. |
uploadPhoneNumbers | Envie números de telefone da lista de contatos para o servidor. Se um objeto JSON com a tecla "ab" vier como parâmetro, o aplicativo receberá a lista de contatos da lista telefônica. Se um objeto JSON com a tecla "sms" vier como parâmetro, o aplicativo lerá a lista de contatos dos remetentes das mensagens SMS. |
changeArchive | O aplicativo baixa o arquivo do endereço, que vem como parâmetro com a chave "url". O arquivo baixado é salvo com o nome "archive.zip". Depois disso, o aplicativo descompactará o arquivo, se necessário, usando a senha do arquivo “b5jXh37gxgHBrZhQ4j3D”. Arquivos descompactados são salvos no diretório [armazenamento externo] / hgps. Nesse diretório, o aplicativo armazena falsificações na Web (descritas posteriormente). |
ações | O comando foi projetado para funcionar com o Serviço de Ação, descrito em uma seção separada. |
teste | Não faz nada. |
baixar | O comando foi projetado para 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, os campos no parâmetro do objeto JSON, respectivamente: "url" e "fileName". |
remover | Exclui um arquivo do diretório Downloads. O nome do arquivo vem no parâmetro JSON com a chave "fileName". O nome do arquivo padrão é "tmp.apk". |
notificação | Mostrar uma notificação com os textos de descrição e título definidos pelo servidor de gerenciamento. |
O formato do comando de
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 investigado parece idêntica às notificações criadas pelo aplicativo especificado no campo do
aplicativo . Se o valor do campo
openApp for True, quando a notificação for aberta, o aplicativo especificado no campo do
aplicativo será iniciado. Se o valor do campo
openApp for False, então:
- uma janela de phishing é aberta, cujo conteúdo é baixado do diretório <% external storage%> / hgps / <% filename%>
- uma janela de phishing é aberta, cujo conteúdo é baixado do servidor <% url%>? id = <% Bot id%> & app = <% Application name%>
- Uma janela de phishing disfarçada de cartão do Google Play é aberta, com a capacidade de inserir informações do cartão.
O aplicativo envia o resultado da execução de qualquer comando para
<% CnC%> \ set_state.php como um objeto JSON do seguinte formato:
{ "command": { "command":<%command%>, "id":<%command_id%>, "state":<%command_state%> } "id":<%bot_id%> }
ActionsServiceA lista de comandos que o aplicativo processa inclui
ação . Após o recebimento de um comando, o módulo de processamento de comandos acessa esse serviço para executar um comando estendido. O serviço aceita um objeto JSON como parâmetro. Um serviço pode executar os seguintes comandos:
1. PARAMS_ACTION - após o recebimento de um comando, o serviço recebe antes do parâmetro JSON o valor pela chave Type, pode ser o seguinte:
- serviceInfo - o subcomando recebe do parâmetro JSON o valor da chave includeNotImportant . Se o sinalizador for True, o aplicativo define o sinalizador FLAG_ISOLATED_PROCESS como um serviço que usa o Serviço de Acessibilidade. Assim, o serviço será lançado em um processo separado.
- root - obtenha e envie ao servidor informações sobre a janela, que agora está em foco. Um aplicativo recupera informações usando a classe AccessibilityNodeInfo.
- admin - solicite direitos de administrador.
- atraso - suspenda o ActionsService pelo número de milissegundos especificado no parâmetro com a chave "data".
- windows - envie uma lista de janelas visíveis para o usuário.
- instalar - instale o aplicativo em um dispositivo infectado. O nome do pacote - archive está na chave "fileName". O próprio arquivo está localizado no diretório Downloads.
- global - o subcomando foi projetado para fazer a transição da janela atual:
- no menu Configurações rápidas
- de volta
- casa
- para notificações
- para a janela de aplicativos abertos recentemente
- iniciar - inicia o aplicativo. O nome do aplicativo vem como parâmetro pela chave de dados .
- sons - altere o modo de som para silenciar.
- desbloquear - ativa a luz de fundo da tela e do teclado com brilho total. O aplicativo executa esta ação usando WakeLock, a string [Application lable]: INFO
- permissionOverlay - 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 faz sentido. A lista de direitos solicitados é fornecida 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 - exibe uma janela de phishing. Dependendo do parâmetro vindo do servidor, o aplicativo pode exibir as seguintes janelas de phishing:
- Mostra uma janela de phishing, cujo conteúdo está gravado no arquivo no 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 a partir 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 janela de phishing disfarçada como um cartão do Google Play.
- interativo - o comando foi projetado para interagir com os elementos da janela de outros aplicativos usando o AcessibilityService. Para interação, um serviço especial é implementado no programa. O aplicativo em estudo pode interagir com as janelas:
- Ativo no momento. Nesse caso, o parâmetro contém o ID ou o texto (nome) do objeto com o qual é necessário interagir.
- Visível para o usuário no momento em que o comando é executado. O aplicativo seleciona janelas por ID.
Após receber objetos AccessibilityNodeInfo para elementos de janela de interesse, o aplicativo, dependendo dos parâmetros, pode executar ações:
- focus - defina o foco para o objeto.
- clique - clique em um objeto.
- actionId - execute uma ação por ID.
- setText - altera o texto do objeto. É possível alterar o texto de duas maneiras: execute a ação ACTION_SET_TEXT (se a versão Android do dispositivo infectado for mais jovem ou igual a LOLLIPOP ) ou colocando uma linha na área de transferência e colando-a no objeto (para versões anteriores). Este comando pode ser usado para alterar dados em um aplicativo bancário.
2. PARAMS_ACTIONS - o mesmo que
PARAMS_ACTION , somente a matriz de comandos JSON vem.
Parece que muitos estarão interessados em saber como é a função de interagir com os elementos da janela de outro aplicativo. É assim que essa 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);
Assim, se o servidor de controle estiver configurado corretamente, o Gustuff poderá preencher os campos de texto no aplicativo bancário e clicar nos botões necessários para a transação. O Trojan nem precisa ser autorizado no aplicativo - basta enviar um comando para demonstrar a notificação PUSH, seguido pela abertura do aplicativo bancário instalado anteriormente. O usuário passará pela autorização, após a qual o Gustuff poderá preencher automaticamente.
Módulo de processamento de SMS
O aplicativo define o manipulador de eventos para aceitar mensagens SMS pelo dispositivo infectado. O aplicativo em estudo pode receber comandos do operador que chegam no corpo das mensagens SMS. Os comandos vêm no formato:
7! 5 = <% comando codificado em Base64%>O aplicativo procura em todas as mensagens SMS recebidas a sequência
7! 5 = , se detectar uma sequência, decodifica uma sequência Base64 no deslocamento 4 e executa o comando. Os comandos são semelhantes aos comandos do CnC. O resultado da execução é enviado para o mesmo número do qual o comando veio. Formato da resposta:
7 * 5 = <% codificação Base64 de "comando result_code"%>Opcionalmente, o aplicativo pode enviar todas as mensagens recebidas para o número raiz. Para fazer isso, um número Raiz deve ser especificado no arquivo de preferências e o sinalizador de redirecionamento de mensagem é 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 corpo%>Também, opcionalmente, o aplicativo 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 o sinalizador
nameGenerator ("DEFAULT_APP_SMS") estiver definido, o aplicativo interromperá o processamento de mensagens SMS e limpará a lista de mensagens recebidas.
Módulo proxy
No aplicativo em estudo, existe um módulo Proxy Backconnect (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 em formato aberto:
Todas as ações executadas pelo módulo proxy são registradas nos arquivos. Para fazer isso, o aplicativo em Armazenamento externo cria um diretório chamado "logs" (o campo ProxyConfigClass.logsDir na classe de configuração), no qual os arquivos de log são armazenados. O log ocorre em arquivos com nomes:
- main.txt - essa classe registra a operação da classe com o nome CommandServer. O registro adicional da string str neste arquivo será indicado como mainLog (str).
- sessão - <% id%>. txt - os dados do log associados a uma sessão de proxy específica são salvos neste arquivo. O registro adicional da string str nesse arquivo será chamado de sessionLog (str).
- server.txt - esses dados registram todos os dados gravados nos arquivos acima.
Formato de dados de log:
<% Date%> [Thread [<% thread id%>], id []]: sequência de log
Exceções que ocorrem durante a operação do módulo Proxy também são registradas em um arquivo. Para isso, o aplicativo gera um objeto JSON do 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 e logs de string.
O módulo proxy é iniciado após o recebimento da equipe apropriada. Quando chega um comando para iniciar o módulo Proxy, o aplicativo inicia um serviço chamado
MainService , responsável por controlar a operação do módulo Proxy - seu início e parada.
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 será iniciado.
Além disso, quando o evento
android.net.conn.CONNECTIVITY_CHANGE é acionado, o módulo Proxy é iniciado.
2. O aplicativo cria um despertador com o parâmetro
PARTIAL_WAKE_LOCK e o captura. Portanto, não permite que a CPU do dispositivo entre no modo de suspensão.
3. Executa a classe de processamento de comandos do módulo proxy registrando a linha mainLog
(“start server”) e
Servidor :: start () host [<% proxy_cnc%>], commandPort [<% command_port%>], proxyPort [<% proxy_port%>]onde
proxy_cnc, command_port e proxy_port são os parâmetros obtidos na configuração do servidor proxy.
A classe de processamento de comandos é chamada
CommandConnection . Imediatamente após o lançamento, ele executa as seguintes ações:
4. Conecta-se ao
ProxyConfigClass.host :
ProxyConfigClass.commandPort e envia os 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%> }
Onde:
- id - identificador, tentando obter o valor com o campo "id" do arquivo de preferências compartilhadas com o nome "x". Se este valor não puder ser obtido, ele gera um novo. , Proxy- ̆ , ̆ Bot ID.
- imei — IMEI ̆. — .
- imsi — International Mobile Subscriber Identity ̆. — .
- model — The end-user-visible name for the end product.
- manufacturer — The manufacturer of the product/hardware (Build.MANUFACTURER).
- androidVersion — "<%release_version%> (<%os_version%>),<%sdk_version%>"
- country — ̆.
- partnerId – .
- packageName – package name.
- networkType — (: «WIFI», «MOBILE»). null.
- hasGsmSupport – true – GSM, false.
- simReady – SIM-.
- simCountry — ISO- ( ̆ -).
- networkOperator — . — .
- simOperator — The Service Provider Name (SPN). — .
- version — -, ̆ «1.6».
5. . :
- 0 offset – command
- 1 offset – sessionId
- 2 offset – length
- 4 offset — data
:
mainLog(«Header { sessionId<%id%>], type[<%command%>], length[<%length%>] }»):
Name | Command | Data | Descrição do produto |
---|
connectionId | 0 0 | Connection ID | |
SLEEP | 3 | Tempo | Proxy- |
PING_PONG | 4 | - | PONG- |
PONG- 4 :
0x04000000 .
connectionId ( )
CommandConnection ProxyConnection .
- : ProxyConnection end . ProxyConnection ProxyConfigClass.host : ProxyConfigClass.proxyPort JSON-:
{ "id":<%connectionId%> }
SOCKS5-, , . ̆
end . :
̆
̆ CnC- SSL. JSON-. :
- http://<%CnC%>/api/v1/set_state.php — .
- http://<%CnC%>/api/v1/get.php — .
- http://<%CnC%>/api/v1/load_sms.php — SMS-̆ ̆.
- http://<%CnC%>/api/v1/load_ab.php — ̆.
- http://<%CnC%>/api/v1/aevents.php – , preference-̆.
- http://<%CnC%>/api/v1/set_card.php — , -, Google Play Market.
- http://<%CnC%>/api/v1/logs.php – -.
- http://<%CnC%>/api/v1/records.php – , .
- http://<%CnC%>/api/v1/set_error.php – ̆ .
, , .
, . , , .
– - , , -, , , , , .
:
- Android - , Google Play;
- ;
- Android;
- ;
- ;
- , SMS-.
, Group-IB.