Stantinko: a botnet que acrescenta um módulo de mineração de criptomoedas às suas atividades

Investigadores de ESET descobriram que os operadores por detrás da botnet Stantinko estão a distribuir um módulo de mineração de criptomoeda nos computadores que controlam.

Os operadores da botnet Stantinko ampliaram o seu conjunto de ferramentas com um novo elemento para tirar vantagem dos computadores que controlam. A rede de bots composta por aproximadamente meio milhão de unidades, conhecida por estar ativa pelo menos desde 2012 e ter como alvos utilizadores na Rússia, Ucrânia, Bielorrússia e Cazaquistão, agora distribui um módulo de mineração de criptomoeda. Mining Monero, uma criptomoeda cujo valor oscilou em 2019 entre 50 e 110 dólares, tem pelo menos desde agosto de 2018 a função de monetização da botnet. Antes disso, a botnet realizou fraudes por clique, injeção de anúncios, fraudes nas redes sociais e ataques de roubo de passwords.

Neste artigo descrevemos o módulo de mineração de criptomoeda de Stantinko e analisamos a sua funcionalidade.

A caraterística mais notável deste módulo é a forma como tenta ludibriar a análise e evitar a deteção. Dado o uso de ofuscação ao nível da fonte de forma aleatória e o facto dos operadores Stantinko 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 faremos, num artigo à parte dirigido a analistas de malware, uma abordagem possível para lidar com algumas delas.

Dado que o Stantinko está constantemente a desenvolver novos ofuscadores a melhorar os ofuscadores e módulos personalizados já existentes, os quais estão fortemente ofuscados, seria descomunal o trabalho de rastrear cada pequena melhoria e alteração que introduz. Pelo que, decidimos mencionar e descrever apenas o que acreditamos tratar-se de ajustes significativos. Afinal, pretendemos descrever neste artigo o módulo tal como é atualmente.

Minerador de criptomoeda de código aberto modificado

O módulo de mineração de criptomoeda do Stantinko, que consome a maioria dos recursos da máquina comprometida para minerar criptomoeda, é uma versão altamente modificada do minerador de código aberto xmr-stak. Todas as strings desnecessárias, e mesmo funcionalidades completas, foram eliminadas numa tentativa de evitar a deteção. As strings e funções restantes são muito ofuscadas. Os produtos de segurança da ESET detetam este malware como como Win{32,64} /CoinMiner.Stantinko.

Uso de proxies de mineração

O CoinMiner.Stantiko não comunica diretamente com o seu pool de mineração, mas sim através de proxies cujos endereços IP são obtidos a partir do texto que aparece na descirção dos vídeos do YouTube. O malware bancário Casbaneiro utiliza uma técnica similar para ocultar dados na descrição dos vídeos do Youtube, embora use canais e descrições de aparência mais legítima, mas com o mesmo propósito: armazenar C&C encriptados.

A descrição deste vídeo consiste numa string composta por endereços IP de proxy de mineração em formato hexadecimal. Por exemplo, o vídeo do YouTube que se pode ver na Figura 1 na descrição “03101f1712dec626”, que corresponde a dois endereços IP em formato hexadecimal: 03101f17 corresponde a 3.16.31 [.] 23 em formato decimal de quatro pontos e 12dec626 é 18.222.198 [.] 38. No momento de escrita deste artigo, o formato já tinha sido ligeiramente ajustado. Os endereços IP estão atualmente inseridos dentro de “!!!!”, o que simplifica o processo de análise e evita possíveis alterações na estrutura HTML do vídeo do YouTube que fariam com que o analisador não funcionasse.

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

Em versões anteriores, o URL do YouTube estava codificado no binário CoinMiner.Stantiko. Atualmente, no seu lugar o módulo recebe um identificador de vídeo como um parâmetro de linha de comando. Este parâmetro usa-se para construir o URL do YouTube, no formato https://www.youtube.com/watch?v=%PARAM%. O módulo de mineração de criptomoeda é executado pelo componente BEDS do Stantiko ou pelo rundll32.exe através de um arquivo por lotes que não capturamos, com o módulo carregado de um local do sistema de arquivos local no formato %TEMP%\%RANDOM%\%RANDOM_GUID%.dll.

Informámos o YouTube sobre este abuso e todos os canais que contém estes vídeos foram eliminados.

Capacidades da mineração de criptomoeda

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

  • Suspender outras aplicações de mineração de criptomoeda (ou seja, a concorrência);
  • Detetar software de segurança;
  • Suspender a função de mineração de criptomoeda se o PC funciona com bateria ou quando é detetado um administrador de tarefas, para evitar que o utilizador perceba.
Mineração de criptomoeda

No núcleo da função de mineração de criptomoeda está o processo de hashing e a comunicação com a proxy. O método para obter a lista de proxies de mineração descrita anteriormente; o CoinMiner.Stantinko estabelece a comunicação com o primeiro proxy de mineração ativo.

A sua comunicação realiza-se através de TCP e está encriptada por RC4 com uma chave que consta dos primeiros 26 carateres do pi (incluindo o separador decimal, codificado na string “3,141592653589793238462643“) e depois codificado em base64. A mesma chave é utilizada em todas amostras que vimos.

O código do algoritmo de hash é descarregado a partir do proxy de mineração no início da comunicação e carregado na memória, seja diretamente ou, em versões anteriores, a partir da biblioteca libcr64.dll que é primeiro lançada no disco.

O download do código de hash a cada execução permite ao grupo Stantinko a alteração desse código rapidamente. Esta mudança possibilita, por exemplo, adaptar-se às configurações do algoritmo nas moedas existentes e mudar para mineração de outras criptomoedas para, talvez, minerar a criptomoeda mais rentável no momento da execução. A principal vantagem de fazer o download da parte central do módulo a partir de um servidor remoto e fazer o upload diretamente da memória é que esta parte do código nunca é armazenada no disco. Este ajuste adicional, que não está presente na versão anterior, tem como objetivo complicar a deteção porque os padrões nesses algoritmos são triviais para a deteção por parte de produtos de segurança.

Todas as instâncias do módulo de mineração de criptomoeda do Stantiko que analisámos fazem a mineração da Monero. Deduzimos isto a partir dos trabalhos proporcionados pelo proxy de mineração e o algoritmo de hash. Por exemplo, a Figura 2 é um trabalho enviado por um dos servidores de proxy.

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

Foi analisado o algoritmo de hash utilizado e identificámos o CryptoNight R. Dado que existem múltiplas criptomoedas que utilizam este algoritmo, o seu reconhecimento por si só não é suficiente, reduz simplesmente a lista. É possível ver no trabalho, que nesse momento a altura da blockchain era 1815711, pelo que tivemos que encontrar moedas usando o CryptoNight R com esta altura nos exploradores de blocos dedicados, o que nos levou à Monero. De facto, a dissecação da string 0b0bbfdee1e50567042dcfdfe96018227f25672544521f8ee2564cf8b4c3139a6a88c5f0b32664000000a1c8ee5c185ed2661daab9d0c454fd40e9f53f0267fe391bdb4eb4690395deb36018 revela que o hash do bloco anterior (67042dcfdfe96018227f25672544521f8ee2564cf8b4c3139a6a88c5f0b32664) e a marca do tempo (1555590859) encaixam na blockchain Monero à altura de 1815711. Pode-se encontrar a estrutura do blob a examinar a sua função geradora no código fonte da Monero. A função geradora expõe outra estrutura chamada cabeçalho do bloco que contém tanto o hash do bloco anterior como a marca do tempo.

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

Suspensão de outros mineradores de criptomoeda

O malware enumera os processos em execução em busca de outros mineradores de criptomoeda. Se é encontrado um concorrente, Stantinko suspende todos os seus threads.

O CoinMiner.Stantinko considera que um processo corresponde a um minerador de criptomoeda se a sua linha de comando contém uma string particular, 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

Estas strings referem-se aos seguintes mineradores de criptomoeda legítimos:

https://github.com/pooler/cpuminer, https://minergate.com/, https://github.com/xmrig, e incluso https://github.com/fireice-uk/xmr-stak, que curiosamente, é o minerador no qual se baseia este módulo de Stantinko. As strings também conduzem a várias amostras de malware pouco interessantes que contém a funcionalidade de mineração de criptomoeda.

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

Evitar a deteção

O CoinMiner.Stantinko suspende temporariamente a mineração se detetar que a máquina não está ligada à corrente. Esta medida, claramente dirigida aos computadores portáteis, evita que a bateria se esgote rapidamente, o que poderia fazer com que o utilizador suspeitasse que algo de estranho estava a acontecer.

Para além disso, suspende temporariamente a extração se for detetada a execução de uma aplicação de gestão de tarefas (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 novamente administradores de tarefas. Calcula o CRC-32 do nome do processo e compara-o a uma lista encriptada de somas de verificação CRC-32, incluídas no Apêndice. De um modo geral, esta técnica pode ajudar a evitar a deteção, já que os nomes dos processos desses produtos de segurança não se incluem 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 do malware estão à procura, porque é necessário desencriptar esses hashes, que tecnicamente representam o mesmo problema que a desencriptação de passwords. 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 registo (api-ms-win-crt-io-l1-1-0.dll). O arquivo de registo é presumivelmente exfiltrado posteriormente por algum componente do Stantinko que não vimos, já que não existe outra funcionalidade relacionada com o mesmo neste módulo.

Ofuscação

Para além das suas caraterísticas de mineração de critomoeda, o CoinMiner.Stantinko é notável também pelas suas técnicas de ofuscação destinadas a evitar a deteção e frustrar a análise.

Conclusão

A nossa descoberta mostra que os delinquentes dor detrás do Stantinko continuam a expandir as formas sobre como se aproveitam da botnet que controlam. As suas anteriores inovações foram ataques distribuídos baseados no dicionários de websites Joomla e WordPress que tinham como objetivo obter credenciais de servidor, provavelmente com o objetivo de vendê-las a outros criminosos.

Este módulo de mineração de criptomoeda configurado remotamente, distribuído pelo menos desde agosto de 2018 e ainda ativo no momento de escrita deste post, mostra que o grupo continua a inovar e a expandir os seus recursos para ganhar dinheiro.

Indicadores de Compromisso (IoCs)

Nomes de deteção da ESET

Win32/CoinMiner.Stantinko
Win64/CoinMiner.Stantinko

SHA-1

Uma lista completa de mais de 1.000 hashes está disponível no repositório GutHub.

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

Nomes de arquivo

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 do proxy de mineração

Endereços IP de proxys 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

Apêndice

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

DEIXE UMA RESPOSTA

Please enter your comment!
Please enter your name here

4 × three =