Recentemente, no Laboratório de Ameaças da EFF, temos nos concentrado muito no ecossistema de malware Android e fornecendo ferramentas para sua análise. Notamos que muitas amostras de malware Android na família tor-hydra vieram à tona, mascarando-se como aplicativos bancários para atrair clientes desavisados para instalá-los. Neste post, vamos dar um exemplo de uma dessas amostras e analisá-la usando ferramentas de código aberto disponíveis para qualquer pessoa.
De relance
A amostra que veremos foi vista pela primeira vez em 1º de março de 2022. Este malware em particular se apresenta como o aplicativo bancário para a BAWAG, uma instituição financeira proeminente na Áustria. Após a primeira execução, o aplicativo solicita ao usuário que dê permissão aos “serviços de acessibilidade” para o aplicativo. A permissão de serviços de acessibilidade concede a um aplicativo amplo acesso para ler a tela e imitar a interação do usuário. Ao conceder a permissão, o aplicativo se baseia em fundo. Qualquer tentativa do usuário de desinstalar o aplicativo é impedida pelo aplicativo interromper e fechar os diálogos desinstalados. Tentar abrir o aplicativo novamente também falha — nada acontece.
Analisando o PACOTE ANDROID APK
AndroidManifest.xml
O arquivo manifesto do aplicativo Para Android contém uma lista de permissões, atividades e serviços que um aplicativo fornece. Se uma atividade não estiver listada no manifesto do aplicativo, o aplicativo não poderá iniciar essa atividade. Usando uma ferramenta de análise estática android como jadx ou apktool podemos dar uma olhada no manifesto XML. O manifesto do aplicativo de malware pede uma ampla gama de permissões, incluindo a capacidade de ler e enviar mensagens SMS (uma maneira comum de o malware se propagar), solicitar instalação e exclusão de pacotes, ler contatos, iniciar chamadas e solicitar o serviço de acessibilidade acima mencionado. Além disso, uma série de classes são referenciadas que não são definidas em qualquer lugar do nosso código -invertido:jadx
com.ombththz.ufqsuqx.bot.components.commands.NLServicecom.ombththz.ufqsuqx.bot.components.injects.system.InjAccessibilityServicecom.ombththz.ufqsuqx.bot.components.locker.LockerActivitycom.ombththz.ufqsuqx.bot.components.locker.LockerActivity$DummyActivitycom.ombththz.ufqsuqx.bot.components.screencast.ScreencastServicecom.ombththz.ufqsuqx.bot.components.screencast.ScreencastStartActivitycom.ombththz.ufqsuqx.bot.components.screencast.UnlockActivitycom.ombththz.ufqsuqx.bot.components.socks5.Socks5ProxyServicecom.ombththz.ufqsuqx.bot.HelperAdmin$MyHomeReceivercom.ombththz.ufqsuqx.bot.PermissionsActivitycom.ombththz.ufqsuqx.bot.receivers.MainReceivercom.ombththz.ufqsuqx.bot.sms.ComposeSmsActivitycom.ombththz.ufqsuqx.bot.sms.HeadlessSmsSendServicecom.ombththz.ufqsuqx.bot.sms.MmsReceivercom.ombththz.ufqsuqx.bot.sms.SmsReceivercom.ombththz.ufqsuqx.core.injects_core.Screencom.ombththz.ufqsuqx.core.injects_core.Workercom.ombththz.ufqsuqx.core.PeriodicJobReceivercom.ombththz.ufqsuqx.core.PeriodicJobServicecom.ombththz.ufqsuqx.MainActivityinfo.pluggabletransports.dispatch.service.DispatchReceiverinfo.pluggabletransports.dispatch.service.DispatchServiceinfo.pluggabletransports.dispatch.service.DispatchVPNorg.torproject.android.service.OrbotService
O fato de o manifesto referenciar atividades, serviços e receptores que ele quer ser executado sem defini-los é a primeira indicação de que estamos lidando com um “lançador Android”.
Desempacotamento Android Droppers
Um dropr Android é um malware que ofusca seu comportamento escondendo sua carga útil e apenas decodificando e carregando o código de que precisa no tempo de execução. Como explica Ahmet Bilal Can, isso torna mais difícil para a AV e os pesquisadores de segurança detectarem o malware, incluindo “reflexão, ofuscação, achatamento do fluxo de código e códigos de lixo para tornar [o] processo de desempacotamento furtivo”. Embora furtivo, os passos que o malware toma para se esconder ainda podem ser detectados e subvertidos com uma pequena ajuda do kit de ferramentas de instrumentação dinâmica Frida. Frida é capaz de injetar-se no fluxo de controle de um aplicativo em execução, introduzindo seu próprio código. Isso pode ser útil para detectar métodos típicos que o malware usa para se disfarçar e carregar a carga subjacente. Neste caso, podemos usar um script curto para detectar que as classes Java estão sendo carregadas dinamicamente:
var classLoader = Java.use('java.lang.ClassLoader');
var loadClass = classLoader.loadClass.overload('java.lang.String', 'boolean');
loadClass.implementation = function(str, bool){
console.log("== Detected ClassLoader usage ==");
console.log("Args: ", str, bool);
return this.loadClass(str, bool)
}
Executando este código, nós temos
$ frida -U -f com.ombththz.ufqsuqx -l class-loader-usage.js --no-pause
____
/ _ | Frida 15.1.16 - A world-class dynamic instrumentation toolkit
| (_| |
> _ | Commands:
/_/ |_| help -> Displays the help system
. . . . object? -> Display information about 'object'
. . . . exit/quit -> Exit
. . . .
. . . . More info at https://frida.re/docs/home/
Spawned `com.ombththz.ufqsuqx`. Resuming main thread!
[Android Emulator 5554::com.ombththz.ufqsuqx]-> == Detected ClassLoader usage ==
Args: com.honey.miletes.k false
== Detected ClassLoader usage ==
Args: android.support.v4.content.FileProvider false
== Detected ClassLoader usage ==
Args: com.ombththz.ufqsuqx.App false
== Detected ClassLoader usage ==
Args: com.ombththz.ufqsuqx.MainActivity false
== Detected ClassLoader usage ==
Args: com.ombththz.ufqsuqx.core.injects_core.Worker false
== Detected ClassLoader usage ==
Args: com.ombththz.ufqsuqx.bot.PermissionsActivity false
== Detected ClassLoader usage ==
Args: org.torproject.android.service.OrbotService false
Nossas aulas perdidas estão sendo carregadas dinamicamente!
Iterações anteriores de malware carregaram dinamicamente um arquivo (um arquivo executável Android Dalvik), que poderia ser visto com , e usou a chamada para excluir esse arquivo, que seria visto em uma chamada. Para este aplicativo, podemos usar o comandotor-hydradexadb logcatunlinkstrace
monkey -p com.ombththz.ufqsuqx -c android.intent.category.LAUNCHER 1 && set `ps -A | grep com.ombththz.ufqsuqx` && strace -p $2
para ver as chamadas em tempo real. Não observamos ser usados nesta amostra, então essa iteração estava fazendo algo diferente. Java fornece um método chamado , que não acionará a chamada. Usando este script, podemos detectar quando esse método é usado, nos alertar do arquivo que ele tentou excluir e torná-lo uma não-operação:unlinkjava.io.Filedeleteunlink
var file = Java.use("java.io.File")
file.delete.implementation = function(a){
console.log("=> Detected and bypassed Java file deletion: ", this.getAbsolutePath());
return true;
}
The first few files deleted are of interest:
=> Detected and bypassed Java file deletion: /data/user/0/com.ombththz.ufqsuqx/tyfkjfUjju/HjIgfhjyqutIhjf/tmp-base.apk.gjGyTF88583765359401054429.88g
=> Detected and bypassed Java file deletion: /data/user/0/com.ombththz.ufqsuqx/tyfkjfUjju/HjIgfhjyqutIhjf/dfGgIgyj.HTgj
=> Detected and bypassed Java file deletion: /data/user/0/com.ombththz.ufqsuqx/tyfkjfUjju/HjIgfhjyqutIhjf/base.apk.gjGyTF81.88g
=> Detected and bypassed Java file deletion: /data/user/0/com.ombththz.ufqsuqx/tyfkjfUjju/HjIgfhjyqutIhjf
=> Detected and bypassed Java file deletion: /data/user/0/com.ombththz.ufqsuqx/shared_prefs/multidex.version.xml.bak
=> Detected and bypassed Java file deletion: /data/user/0/com.ombththz.ufqsuqx/shared_prefs/pref_name_setting.xml.bak
=> Detected and bypassed Java file deletion: /data/user/0/com.ombththz.ufqsuqx/files
=> Detected and bypassed Java file deletion: /data/user/0/com.ombththz.ufqsuqx/shared_prefs/prefs30.xml.bak
=> Detected and bypassed Java file deletion: /data/user/0/com.ombththz.ufqsuqx/files/all_tor.zip
Once we issue an to download the file from the device, we can use again to determine that this includes the missing class definitions referenced in the manifest.adb pullbase.apk.gjGyTF81.88gjadx
Investigating the Unpacked Payload
Looking into these files, there is a string obfuscation method that appears thousands of times throughout the code, unaltered from instance to instance:
private static String $(int i, int i2, int i3) {
char[] cArr = new char[i2 - i];
for (int i4 = 0; i4 < i2 - i; i4++) {
cArr[i4] = (char) ($[i + i4] ^ i3);
}
return new String(cArr);
}
Wherever we see a call which looks like in the code, it refers to this function and uses the variable in the same scope to return a string. We can use a Java sandbox like this one to define the locally-scoped variable, the method, and print out the decoded string.$(166, 217, 28670)$$$
In we see a method which looks like a promising lead called . Decoding the call, we get a base64-encoded onion address:sources/com/ombththz/ufqsuqx/bot/network/TorConnectionHelper.javaloadAdminUrl$(556, 664, 4277)
http://loa5ta2rso7xahp7lubajje6txt366hr3ovjgthzmdy7gav23xdqwnid.onion/api/mirrors
This address is available over the Tor network, and contains a base64-encoded URL which references the command and control (C&C) server, the server from which the malware operator issues commands. The author of this post reached out to the Tor Project on March 7th informing them of this C&C server. On app bootstrap, the Tor network is connected to by code lifted from Orbot in order to discover the C&C server, and then the Tor connection is promptly dropped. When first doing this investigation, the domain referenced , but this has since changed to . We can see a login page for the C&C server administrator when accessed:yuuzzlllaa.xyzzhgggga.in

Uma das principais características da rede Tor é a resistência à censura. Se você pode acessar a rede Tor, você pode acessar informações e sites que não podem ser facilmente retirados por causa da maneira como a rede é arquiteta. Isso é uma coisa boa para dissidentes em regimes de censura ou denunciantes que tentam obter informações privilegiadas aos repórteres: os serviços em que confiam estarão disponíveis mesmo que seus adversários não queiram que sejam. Esta é uma moeda de dupla mão, no entanto — neste caso, o malware também é capaz de direcionar os dispositivos das vítimas para servidores C&C de uma maneira que não pode ser retirada. Não há como ter um sem o outro e manter intacta a integridade da rede. Neste caso, o domínio clearnet foi presumivelmente retirado após ser relatado e, em seguida, o operador de malware girou para cima de outro domínio sem muita interrupção do comando e controle de malware. Nesses casos, relatar domínios maliciosos de C&C parece um jogo de whack-a-mole: assim que você derruba um, o próximo aparece.yuuzzlllaa.xyzzhgggga.in
No arquivo vemos um método interessante, que carrega uma carga de estágio 2 do caminho de url do administrador C&C . Este é um arquivo que pode ser decodificado por um ID de aplicativo de . Infelizmente, para o bem de nossa análise, este arquivo contém principalmente código desinteressante e não malicioso.com/ombththz/ufqsuqx/bot/DexTools.javarun()/payloaddexjadxcom.fbdevs.payload
Olhando para o caminho, muitos dos componentes parecem ser herdados diretamente do malware Android, uma excelente análise que pode ser encontrada aqui. Um dos componentes não incluídos nesta iteração anterior está no caminho, que abre um servidor proxy para um host especificado, a fim de receber comandos e lançar ataques. Todos os componentes são ativados e controlados pelo servidor C&C através de uma conexão FCM (Firebase Cloud Messaging, mensagens de mensagens em nuvem), permitindo mensagens direcionadas a dispositivos específicos.om/ombththz/ufqsuqx/bot/components/BianLiansocks5
Lutando contra o malware
Apesar de técnicas relativamente modernas empregadas para frustrar a análise, algumas poderosas ferramentas de código aberto acessíveis ao público foram usadas para interromper o fluxo de controle e engenharia reversa desta amostra. Malwares mais complexos detectarão perfis de hardware e serão capazes de determinar que ele está sendo executado em um emulador e alterar seu comportamento para ocultar ainda mais sua funcionalidade principal. Ainda assim, outros implantarão códigos maliciosos em cargas de estágio mais profundas na tentativa de enterrar ainda mais seu verdadeiro comportamento. No entanto, esta amostra mostra como alguns passos simples podem ser dados para descascar essas camadas para eventualmente descobrir o fluxo de controle de uma nova classe de malware. Seguindo em frente, outras amostras desta classe podem ser analisadas da mesma forma para acompanhar as mudanças no ecossistema e como os desenvolvedores de malware estão respondendo a tentativas de mitigar sua eficácia.
Analisar malware e traçar sua evolução é importante para lutar contra ele. Não só resulta em melhores assinaturas para o software antivírus para usar e proteger os usuários, como nos ajuda a entender quais proteções são necessárias no nível do sistema operacional e orienta as recomendações de segurança da plataforma. Às vezes, isso pode levar à paralisação dos servidores C&C e aos alvos das botnets ganhando algum adiamento tão necessário. E, por último, dá aos usuários uma visão sobre o software que está sendo executado em seus dispositivos para que eles possam retomar o controle.
androidmanifest.xml_.txt.