Os operadores do Stantinko Botnet expandiram seu kit de ferramentas com um novo elemento para lucrar com os computadores sob seu controle. A rede de bots composta por aproximadamente meio milhão de unidades, conhecida por estar ativa desde pelo menos 2012 e apontar a usuários na Rússia, Ucrânia, Bielorrússia e Cazaquistão, agora distribui um módulo de criptomineração. Mining Monero, uma criptomoeda cuja taxa de câmbio flutuou em 2019 entre US$ 50 e US$ 110, é a funcionalidade de monetização da botnet desde pelo menos agosto de 2018. Antes disso, a botnet realizou fraudes por clique e injeção de anúncios, golpes nas redes sociais e ataques de roubo de senhas.

Neste artigo, descrevemos o módulo de criptomineração do Stantinko Botnet e apresentamos uma análise de sua funcionalidade.

A característica mais notável deste módulo é a forma em que se ofuscado para frustrar a análise e evitar a detecção. Devido ao uso de ofuscações a nível fonte com uma pitada de aleatoriedade e ao fato dos operadores do Stantinko Botnet compilarem este módulo para cada nova vítima, cada amostra do módulo é única.

Descreveremos as técnicas de ofuscação do módulo e apresentaremos, em um artigo separado e destinado a analistas de malware, uma possível abordagem para lidar com algumas delas. Como o Stantinko está constantemente desenvolvendo novos ofuscadores e melhorando os ofuscadores e os módulos personalizados já existentes, os quais estão bastante ofuscados, o trabalho de rastrear todas as pequenas melhorias e mudanças introduzidas seria enorme. Portanto, decidimos mencionar e descrever apenas o que acreditamos serem ajustes significativos. Afinal, pretendemos descrever neste artigo a forma como o módulo está atualmente.

Minerador de código aberto modificado

O módulo de criptomineração do Stantinko, que consome a maioria dos recursos da máquina comprometida para minerar criptomoedas, é uma versão altamente modificada do minerador de código aberto xmr-stak. Todas as sequências desnecessárias e até mesmo todas as funcionalidades foram eliminadas na tentativa de evitar a detecção. As strings e funções restantes são muito ofuscadas. Os produtos de segurança da ESET detectam esse malware como Win{32,64}/CoinMiner.Stantinko.

Uso de proxies de mineração

O CoinMiner.Stantinko não se comunica diretamente com seu pool de mineração, mas através de proxies cujos endereços de IP são obtidos a partir do texto que aparece na descrição dos vídeos do YouTube. O malware bancário Casbaneiro usa uma técnica semelhante para esconder dados na descrição dos vídeos do YouTube, embora o Casbaneiro use descrições e canais aparentemente mais legítimos, mas com o mesmo objetivo: armazenar C&C criptografados.

A descrição deste vídeo consiste em uma string composta por endereços de IP de proxy de mineração em formato hexadecimal. Por exemplo, o vídeo do YouTube que pode ser visto na Imagem 1 na descrição "03101f1712dec626", que corresponde a dois endereços de IP no formato hexadecimal: 03101f17 corresponde a 3.16.31 [.] 23 no formato decimal de quatro pontos e 12dec626 é 18.222.198 [.] 38. Quando produzimos este artigo, o formato foi ligeiramente ajustado. Atualmente, os endereços de IP estão contidos em "!!!!", o que simplifica o processo de análise e evita possíveis alterações na estrutura HTML do vídeo do YouTube, o que faria com que o analisador não funcionasse.

Imagem 1. Exemplo de vídeo do YouTube cuja descrição apresenta um endereço IP para a comunicação dos módulos com o pool de mineração.

Nas versões anteriores, a URL do YouTube era hardcodeada no binário CoinMiner.Stantinko. Atualmente, o módulo recebe um identificador de vídeo como parâmetro de linha de comando. Este parâmetro é usado para criar a URL do YouTube, no formato https://www.youtube.com/watch?v=%PARAM%. O módulo de criptomineração é executado pelo componente BEDS do Stantinko Botnet ou pelo rundll32.exe através de um arquivo em lotes que não capturamos, com o módulo carregado de um lugar do sistema de arquivos local no formato %TEMP%\%RANDOM%\%RANDOM_GUID%.dll.

Informamos o YouTube sobre esse problema e todos os canais que contêm esses vídeos foram removidos.

Recursos de criptomineração

Dividimos o módulo de criptomineração em quatro partes lógicas que representam diferentes conjuntos de recursos. A parte principal executa a criptomineração real, enquanto as outras partes do módulo são responsáveis ​​pelas seguintes funções adicionais:

  • suspender outros aplicativos de criptomineração (ou seja, a concorrência)
  • detectar software de segurança
  • suspender a função de criptomineração caso o PC funcione com bateria ou se um gerenciador de tarefas for detectado, para impedir que o usuário o detecte

Criptomineração

No centro da função de criptomineração está o processo de hash e a comunicação com o proxy. O método para obter a lista de proxies de mineração foi descrito acima; o CoinMiner.Stantinko estabelece comunicação com o primeiro proxy de mineração encontrado vivo.

Sua comunicação é feita através do TCP e é criptografada pelo RC4 com uma chave que consiste nos primeiros 26 caracteres do número pi (incluindo o separador decimal, hardcodeado na string “3.141592653589793238462643”) e depois codificado na base64. A mesma chave é usada em todas as amostras que vimos.

O código do algoritmo de hash é baixado do proxy de mineração no início da comunicação e é carregado na memória, diretamente ou, em versões anteriores, da biblioteca libcr64.dll que é “droppeada” no disco.

O download do código de hash a cada execução permite que o grupo Stantinko altere esse código rapidamente. Essa mudança possibilita, por exemplo, adaptar-se às configurações dos algoritmos nas moedas existentes e mudar para mineração de outras criptomoedas para, talvez, minerar a criptomoeda mais rentável no momento da execução. O principal benefício de baixar a parte central do módulo de um servidor remoto e carregá-lo diretamente na memória é que essa parte do código nunca é armazenada no disco. Esse ajuste adicional, que não está presente na versão anterior, visa complicar a detecção considerando que os padrões nesses algoritmos são triviais para que os produtos de segurança os detectem.

Todas as instâncias do módulo de criptomineração do Stantinko que analisamos mineram Monero. Deduzimos isso dos trabalhos fornecidos pelo proxy de mineração e pelo algoritmo de hash. Por exemplo, a Imagem 2 é um trabalho enviado por um dos servidores proxy.

{"error":null,"result":{"status":"OK"}}
{"method":"job","params":"blob":"0b0bbfdee1e50567042dcfdfe96018227f25672544521f8ee2564cf8b4c3139a6a88c5f0b32664000000a1c8ee5c185ed2661daab9d0c454fd40e9f53f0267fe391bdb4eb4690395deb36018","job_id":"281980000000000a10","target":"67d81500","height":1815711}}

Imagem 2. Exemplo de trabalho de mineração recebido pelo proxy de um pool de mineração.

O algoritmo de hash usado foi analisado e descobrimos que era o CryptoNight R. Como existem várias criptomoedas que fazem uso desse algoritmo, seu reconhecimento por si só não é suficiente; simplesmente reduz a lista. Foi possível ver no trabalho apresentado que a altura da blockchain era 1815711, então tivemos que encontrar moedas usando o CryptoNight R com essa altura em exploradores de blocos dedicados, o que nos levou a Monero. Na verdade, a dissecação da string 0b0bbfdee1e50567042dcfdfe96018227f25672544521f8ee2564cf8b4c3139a6a88c5f0b32664000000a1c8ee5c185ed2661daab9d0c454fd40e9f53f0267fe391bdb4eb4690395deb36018 revela que o hash do bloco anterior (67042dcfdfe96018227f25672544521f8ee2564cf8b4c3139a6a88c5f0b32664) e o timestamp (1555590859) se encaixam na blockchain Monero na altura 1815711. É possível encontrar a estrutura do blob examinando sua função geradora no código fonte do Monero. A função geradora expõe outra estrutura chamada cabeçalho de bloco que contém o hash do bloco anterior e o timestamp.

Por outro lado, o algoritmo de hash não está ofuscado, já que a ofuscação afetaria significativamente a velocidade de cálculo do hash e, por exemplo, o desempenho geral e a rentabilidade.

Suspensão de outros criptomineradores

O malware lista os processos em execução em busca de outras criptomoedas. Se um concorrente for encontrado, o Stantinko suspende todos os seus threads.

O CoinMiner.Stantinko considera que um processo corresponde a uma criptomoeda se sua linha de comando contém uma string específica ou uma combinação que varia de uma amostra para outra. Por exemplo:

  • minerd
  • minergate
  • xmr
  • cpservice
  • vidservice and stratum+tcp://
  • stratum://
  • -u and pool
  • "-u and pool
  • "-u and xmr
  • -u and xmr
  • -u and mining
  • "-u and mining
  • -encodedcommand and exe
  • --donate-level
  • windows and -c and cfgi
  • regsvr32 and /n and /s and /q
  • application data and exe
  • appdata and exe

Essas strings referem-se aos seguintes criptomineradores legítimos: https://github.com/pooler/cpuminer, https://minergate.com/, https://github.com/xmrig, e até mesmo https://github.com/fireice-uk/xmr-stak, que, curiosamente, é o minerador no qual este módulo do Stantinko se baseia. As strings também levam a várias amostras de malware que contém recursos de criptominerador.

É interessante notar que os operadores do Stantinko tentaram se livrar do código da concorrência no passado. No entanto, eles se apoiaram no kit de ferramentas legítimo conhecido como AVZ Antiviral Toolkit, alimentado com um script escrito na linguagem de scripting incorporado a esta tarefa.

Impedir a detecção

O CoinMiner.Stantinko suspende temporariamente a mineração se detectar que a máquina não está conectada à energia. Esta medida, obviamente destinada aos laptops, impede que a bateria se esgote rapidamente, o que pode levar o usuário a suspeitar que algo estranho está acontecendo.

Além disso, ele suspende temporariamente a extração se um aplicativo do gerenciador de tarefas for detectado (um processo chamado procexp64.exe, procexp.exe ou taskmgr.exe).

O malware também analisa os processos em execução em busca de software de segurança e gerenciadores de tarefas. Calcula o CRC-32 do nome do processo e o compara com uma lista hardcodeada de somas de verificação CRC-32, incluída no apêndice. Em geral, essa técnica pode ajudar a evitar a detecção, uma vez que os nomes dos processos desses produtos de segurança não são incluídos no binário, o que ajuda a passar despercebido por não conter os nomes dos processos diretamente. Também torna mais difícil para os analistas descobrir o que os autores de malware estão procurando, porque é necessário decifrar esses hashes, que tecnicamente representam o mesmo problema que a quebra de senha. No entanto, o uso de uma lista de nomes de processos conhecidos geralmente é suficiente para determinar os nomes exatos.

Se uma correspondência CRC-32 for encontrada, o CRC será gravado em um arquivo de log (api-ms-win-crt-io-l1-1-0.dll). O arquivo de log é posteriormente filtrado por algum componente do Stantinko que não vimos, pois não há outra funcionalidade relacionada a ele neste módulo.

Ofuscação

Além de suas características de criptomineração, o CoinMiner.Stantinko também é notável por suas técnicas de ofuscação destinadas a impedir a detecção e análise. Algumas dessas técnicas são únicas e as descreveremos em detalhes em um artigo separado.

Conclusão

Nossa descoberta mostra que os criminosos por trás do Stantinko continuam expandindo a maneira como tiram vantagem da botnet que controlam. Suas inovações anteriores foram ataques distribuídos com base em dicionário nos sites Joomla e WordPress, que buscavam obter credenciais de servidor, provavelmente com o objetivo de vendê-las a outros criminosos.

Este módulo de criptomineração configurado remotamente, distribuído desde pelo menos agosto de 2018 e ainda ativo no momento de escrever este artigo, mostra que esse grupo continua inovando e expandindo seus recursos para ganhar dinheiro. Além de sua funcionalidade padrão de criptomineração, o módulo emprega algumas técnicas interessantes de ofuscação que iremos revelar, juntamente com algumas possíveis contramedidas, em um próximo artigo.

Indicadores de Comprometimento (IoCs)

Nomes de detecção da ESET

Win32/CoinMiner.Stantinko
Win64/CoinMiner.Stantinko

SHA-1

Uma lista completa de mais de 1.000 hashes está disponível em nosso repositório GitHub.

00F0AED42011C9DB7807383868AF82EF5454FDD8
01504C2CE8180D3F136DC3C8D6DDDDBD2662A4BF
0177DDD5C60E9A808DB4626AB3161794E08DEF74
01A53BAC150E5727F12E96BE5AAB782CDEF36713
01BFAD430CFA034B039AC9ACC98098EB53A1A703
01FE45376349628ED402D8D74868E463F9047C30

Nomes de arquivos

api-ms-win-crt-io-l1-1-0.dll
libcr64.dll
C:\Windows\TEMP\%RANDOM%\%RANDOM_GUID%.dll

Nome de Mutex e chave RC4

3,141592653589793238462643

URLs do YouTube URLs com dados de configuração de proxy de mineração

Endereços de IP de proxy de mineração

• 3.16.150[.]123
• 3.16.152[.]201
• 3.16.152[.]64
• 3.16.167[.]92
• 3.16.30[.]155
• 3.16.31[.]23
• 3.17.167[.]43
• 3.17.23[.]144
• 3.17.25[.]11
• 3.17.59[.]6
• 3.17.61[.]161
• 3.18.108[.]152
• 3.18.223[.]195
• 13.58.182[.]92
• 13.58.22[.]81
• 13.58.77[.]225
• 13.59.31[.]61
• 18.188.122[.]218
• 18.188.126[.]190
• 18.188.249[.]210
• 18.188.47[.]132
• 18.188.93[.]252
• 18.191.104[.]117
• 18.191.173[.]48
• 18.191.216[.]242
• 18.191.230[.]253
• 18.191.241[.]159
• 18.191.47[.]76
• 18.216.127[.]143
• 18.216.37[.]78
• 18.216.55[.]205
• 18.216.71[.]102
• 18.217.146[.]44
• 18.217.177[.]214
• 18.218.20[.]166
• 18.220.29[.]72
• 18.221.25[.]98
• 18.221.46[.]136
• 18.222.10[.]104
• 18.222.187[.]174
• 18.222.198[.]38
• 18.222.213[.]203
• 18.222.253[.]209
• 18.222.56[.]98
• 18.223.111[.]224
• 18.223.112[.]155
• 18.223.131[.]52
• 18.223.136[.]87
• 18.225.31[.]210
• 18.225.32[.]44
• 18.225.7[.]128
• 18.225.8[.]249
• 52.14.103[.]72
• 52.14.221[.]47
• 52.15.184[.]25
• 52.15.222[.]174

Técnicas de MITRE ATT&CK

Tactic ID Name Description
Execution T1085 Rundll32 The module can be executed by rundll32.exe.
T1035 Service Execution The malware can be executed as a service.
Defense Evasion T1140 Deobfuscate/Decode Files or Information The module deobfuscates strings in its code during the execution process.
T1027 Obfuscated Files or Information The module obfuscates its code and strings in an apparent attempt to make analysis and detection difficult.
T1102 Web Service The malware acquires configuration data from description of YouTube videos.
Discovery T1063 Security Software Discovery The malware acquires a list of running security products.
Command and Control T1090 Connection Proxy The module uses proxies between itself and the mining pool.
T1008 Fallback Channels The module connects to another mining proxy if the initial one is inaccessible.
T1095 Standard Non-Application Layer Protocol The malware uses TCP for its communications.
T1043 Commonly Used Port The malware communicates over port 443.
T1132 Data Encoding The module encrypts then base64 encodes some network traffic.
T1032 Standard Cryptographic Protocol The module encrypts traffic with RC4.
T1071 Standard Application Layer Protocol Acquires configuration data from description of YouTube videos via HTTPS.
Impact T1496 Resource Hijacking The module mines cryptocurrency.

Apêndice

As somas de verificação CRC-32 verificadas pelo CoinMiner.Stantinko e os nomes de arquivo a que eles equivalem estão listados abaixo.

0xB18362C7 afwserv.exe
0x05838A63 ashdisp.exe
0x36C5019C ashwebsv.exe
0xB3C17664 aswidsagent.exe
0x648E8307 avastsvc.exe
0x281AC78F avastui.exe
0xAA0D8BF4 avgcsrva.exe
0x71B621D6 avgcsrvx.exe
0x7D6D668A avgfws.exe
0x1EF12475 avgidsagent.exe
0x010B6C80 avgmfapx.exe
0x6E691216 avgnsa.exe
0xB5D2B834 avgnsx.exe
0x36602D00 avgnt.exe
0x222EBF57 avgrsa.exe
0xF9951575 avgrsx.exe
0x2377F90C avgsvc.exe
0x37FAB74F avgsvca.exe
0xEC411D6D avgsvcx.exe
0x0BED9FA2 avgtray.exe
0x168022D0 avguard.exe
0x99BA6EAA avgui.exe
0x7A77BA28 avguix.exe
0x0D22F74A avgwdsvc.exe
0x98313E09 avira.servicehost.exe
0x507E7C15 avira.systray.exe
0xFF934F08 avp.exe
0x9AC5F806 avpui.exe
0xBD07F203 avshadow.exe
0x64FDC22A avwebg7.exe
0x0BC69161 avwebgrd.exe
0xBACF2EAC cureit.exe
0x8FDEA9A9 drwagntd.exe
0xE1856E76 drwagnui.exe
0xF9BF908E drwcsd.exe
0xC84AB1DA drwebcom.exe
0x183AA5AC drwebupw.exe
0xAC255C5E drwupsrv.exe
0x23B9BE14 dwantispam.exe
0xDAC9F2B7 dwarkdaemon.exe
0x7400E3CB dwengine.exe
0x73982213 dwnetfilter.exe
0x1C6830BC dwscanner.exe
0x86D81873 dwservice.exe
0xB1D6E120 dwwatcher.exe
0xD56C1E6F egui.exe
0x69DD7DB4 ekrn.exe
0xFB1C0526 guardgui.exe
0x5BC1D859 ipmgui.exe
0x07711AAE ksde.exe
0x479CB9C4 ksdeui.exe
0x6B026A91 nod32cc.exe 
0xCFFC2DBB nod32krn.exe
0x59B8DF4D nod32kui.exe
0x998B5896 procexp.exe
0xF3EEEFA8 procexp64.exe
0x81C16803 sched.exe
0x31F6B864 spideragent.exe
0x822C2BA2 taskmgr.exe
0x092E6ADA updrgui.exe
0x09375DFF wsctool.exe