MoustachedBouncer é um grupo de ciberespionagem descoberto pela Equipe de Pesquisa da ESET. O grupo está ativo desde pelo menos 2014 e tem como alvo exclusivamente embaixadas estrangeiras na Bielorrússia. Desde 2020, é muito provável que o MoustachedBouncer tenha sido capaz de realizar ataques de adversary-in-the-middle (AitM) ao nível do ISP (Internet Service Provider), dentro da Bielorrússia, para comprometer seus alvos. O grupo utiliza dois conjuntos de ferramentas que chamamos de NightClub e Disco.

Pontos-chave desta publicação:

  • O MoustachedBouncer é especializado em espionagem de embaixadas estrangeiras na Bielorrússia;

  • O MoustachedBouncer tem utilizado a técnica de adversary-in-the-middle (AitM) desde 2020 para redirecionar verificações de portal cativo para um servidor C&C (Comand and Control) e fornecer plugins de malware via compartilhamento SMB (Server Message Block);

  • Acreditamos que o MoustachedBouncer utiliza um sistema de interceptação legal (como o SORM) para conduzir suas operações de AitM;

  • Acreditamos que o MoustachedBouncer está cooperando de forma muito próxima com o Winter Vivern, outro grupo que tem como alvo diplomatas europeus, mas usando TTPs diferentes;

  • Desde 2014, o grupo opera um framework de malware que chamamos de NightClub. Ele utiliza os protocolos SMTP e IMAP para comunicações de C&C;

  • A partir de 2020, o grupo passou a utilizar, em paralelo, um segundo framework de malware que chamamos de Disco;

  • Tanto o NightClub quanto o Disco suportam plugins de espionagem adicionais que capturam tela, gravam áudio e roubam arquivos.

Vitimologia

De acordo com a telemetria da ESET, o grupo tem como alvo embaixadas estrangeiras na Bielorrússia, e identificamos quatro países diferentes cujos funcionários de embaixadas foram alvo: dois da Europa, um do Sul da Ásia e um da África. As datas-chave são mostradas na Figura 1 (em inglês).

MoustachedBouncer_Timeline_edited

Figura 1: Linha do tempo das atividades do MoustachedBouncer.

Atribuição

Enquanto acompanhávamos o MoustacheBouncer como um grupo separado, encontramos elementos que nos levam a considerar, com um nível de confiança baixo, que eles estão colaborando estreitamente com outro grupo conhecido como Winter Vivern. Este último grupo foi descoberto em 2021 e continua ativo. Em março de 2023, o Winter Vivern utilizou uma vulnerabilidade XSS (CVE-2022-27926) no portal de e-mails Zimbra para roubar credenciais de webmail de diplomatas de vários países europeus. Essa campanha foi tornada pública por pesquisadores da Proofpoint.

A atividade do MoustachedBouncer abrange o período de 2014 a 2022 e suas TTP (Táticas, Técnicas e Procedimentos) evoluíram ao longo do tempo. Por exemplo, observamos o uso de ataques AitM apenas em 2020. No entanto, o alvo vertical permaneceu constante.

A Tabela 1 mostra as características de cada campanha. Com base nesses elementos, consideramos com um nível elevado de confiança que todos estão relacionados ao MoustachedBouncer.

Tabela 1. Conexões entre as campanhas do MoustachedBouncer.

 

VirusTotal
(2014)

Victim A (2017)

Victim B
 (2020-2022)

Victim C
(2020-2022)

Victim D
(2021-2022)

NightClub implant

X

X

 

X

 

NightClub plugins

 

X

X

X

 

Disco implant

 

 

X

 

X

SharpDisco dropper

 

 

X

 

 

Compromise via AitM

?

?

?

?

X

Malware delivery via AitM on SMB shares

 

 

X

 

X

Victims: foreign embassies in Belarus

?

X

X

X

X

 

Vetor de Comprometimento: AitM

Nesta seção, detalhamos o acesso inicial para o Disco. Ainda não sabemos o método de acesso inicial que o MoustachedBouncer utiliza para instalar o NightClub.

Atualização Falsa do Windows

de suas vítimas, provavelmente no nível do ISP, para fazer com que o Windows acredite que está atrás de um portal cativo. O Windows 10 verifica se consegue acessar a internet com uma solicitação HTTP para http://www.msftconnecttest.com/connecttest.txt. No caso de a resposta não ser Microsoft Connect Test, uma janela do navegador é aberta para http://www.msftconnecttest.com/redirect. Para faixas de IP direcionadas pelo MoustachedBouncer, o tráfego de rede é adulterado no nível do ISP, e a URL mencionada redireciona para uma URL de Atualização do Windows aparentemente legítima, mas falsa, http://updates.microsoft[.]com/. Assim, a página falsa de Atualização do Windows é exibida a uma potencial vítima ao se conectar à rede. A página de atualização falsa é mostrada na Figura 2. O texto que observamos está em russo, provavelmente porque é o idioma principal usado na Bielorrússia, mas é possível que versões em outros idiomas também existam. A página indica que há atualizações críticas de segurança do sistema que devem ser instaladas.

Figure 2. Fake Windows Update page

Figura 2: Página Falsa de Atualização do Windows.

Nota-se a utilização de HTTP não criptografado, e não HTTPS, e que o subdomínio updates.microsoft[.]com não está presente entre os nomes de servidores da Microsoft, portanto, não é resolvido na internet pública. Durante o ataque, esse domínio foi resolvido como 5.45.121[.]106 na máquina da vítima do ataque. Este endereço IP é usado para estacionar domínios e não está relacionado à Microsoft. Embora seja um endereço IP roteável para a internet, o tráfego proveniente desse IP nunca alcança a internet durante o ataque AitM. Tanto a resolução DNS quanto as respostas HTTP foram injetadas no tráfego, provavelmente no nível do ISP.

Um ponto importante é que a técnica de AitM ocorre apenas contra algumas organizações selecionadas (possivelmente apenas embaixadas), e não em todo o país. Não é possível reproduzir a redireção a partir de um endereço de IP aleatório na Bielorrússia.

Delivery de malware

A página HTML, mostrada na Figura 2, carrega código JavaScript de http://updates.microsoft[.]com/jdrop.js. Este script primeiro chama setTimeout para executar a função jdrop um segundo após a página ter sido carregada. Essa função (veja a Figura 3) exibe uma janela modal com um botão denominado Получить обновления (tradução: obter atualizações).

Figure 3. jdrop function

Figura 3. Função jdrop.

Um clique no botão executa a função de atualização, mostrada na Figura 4.

Figure 4. update function

Figura 4. Função de Atualização.

Esta função desencadeia o download de um instalador falso de Atualização do Windows a partir da URL que aparenta ser legítima http://updates.microsoft[.]com/MicrosoftUpdate845255.zip. Ela também exibe algumas instruções para instalar a atualização: Для установки обновлений, скачайте и запустите "MicrosoftUpdate845255.msi". (tradução: Para instalar as atualizações, faça o download e execute "MicrosoftUpdate845255.msi").

Não fomos capazes de recuperar o arquivo MicrosoftUpdate845255.zip baixado, mas nossa telemetria mostra que ele contém um executável malicioso chamado MicrosoftUpdate845255.exe.

Escrito em Go, ele cria uma tarefa agendada que executa \35.214.56[.]2\OfficeBroker\OfficeBroker.exe a cada minuto. Como o caminho sugere, ele busca o executável via SMB de 35.214.56[.]2. Este endereço IP pertence a um cliente do Google Cloud, mas assim como o servidor HTTP, acreditamos que as respostas SMB são injetadas dinamicamente via AitM e que os atacantes não controlam o endereço IP real roteável na internet.

Também observamos os seguintes servidores SMB, interceptados via AitM:

  • \\209.19.37[.]184
  • \\38.9.8[.]78
  • \\59.6.8[.]25

Observamos esse comportamento em duas redes ISP separadas: Unitary Enterprise A1 e Beltelecom. Isso sugere que esses ISPs podem não garantir confidencialidade e integridade total dos dados. Recomendamos fortemente que organizações estrangeiras na Bielorrússia usem um túnel VPN criptografado de ponta a ponta, idealmente fora do canal normal (ou seja, não diretamente do endpoint), para fornecer conectividade à internet a partir de uma rede confiável.

A Figura 5 representa nossa hipótese sobre o vetor de comprometimento e a interceptação do tráfego.

 

Figure 5. Compromise via AitM scenario

Figura 5. Cenário de Comprometimento via AitM.

AitM - Considerações gerais

O cenário AitM nos lembra dos atores de ameaças Turla e StrongPity, que têm trojanizado instaladores de software em tempo real no nível do ISP.

Geralmente, esse método de acesso inicial é utilizado por atores de ameaças que operam em seu próprio país, porque exige um acesso significativo dentro dos provedores de serviços de internet, ou de seus provedores de upstream. Em muitos países, os serviços de segurança têm permissão para realizar a chamada "interceptação legal" usando dispositivos especiais instalados nas instalações dos ISPs.

Na Rússia, uma lei de 2014 exige que os ISPs instalem dispositivos chamados SORM-3, que permitem ao Serviço Federal de Segurança (FSB) realizar vigilância direcionada. Os dispositivos possuem capacidades de inspeção profunda de pacotes (DPI) e provavelmente foram usados pelo Turla em sua campanha Mosquito.

Em 2018, o Citizen Lab revelou que dispositivos DPI desenvolvidos pela empresa canadense Sandvine foram usados para modificar o tráfego HTTP na Turquia e no Egito. Na Turquia, os dispositivos foram supostamente usados para redirecionar os usuários da internet para um servidor malicioso quando tentavam baixar determinados aplicativos Windows, o que está de acordo com as atividades do StrongPity. No Egito, esses dispositivos foram supostamente usados para injetar anúncios e scripts de mineração de criptomoedas para gerar dinheiro.

Em 2020, um artigo da Bloomberg revelou que o Centro Nacional de Intercâmbio de Tráfego de Belarus comprou o mesmo equipamento DPI da Sandvine, mas de acordo com um artigo da Cyberscoop, o contrato foi cancelado em setembro de 2020.

De acordo com um relatório da Anistia Internacional publicado em 2021, "De acordo com a legislação bielorrussa, todos os provedores de telecomunicações do país devem tornar seu hardware compatível com o sistema SORM". Eles também afirmam que "O sistema SORM permite que as autoridades acessem diretamente e controlem remotamente todas as comunicações do usuário e os dados associados sem notificar o provedor". Avaliamos com baixa confiança que o MoustachedBouncer utiliza esse sistema SORM para conduzir suas operações.

Embora o comprometimento de roteadores para realizar AitM em redes de embaixadas não possa ser totalmente descartado, a presença de capacidades de interceptação legal em Belarus sugere que a adulteração do tráfego está ocorrendo no nível do ISP, em vez de nos roteadores dos alvos.

Implantes: NightClub e Disco

Desde 2014, as famílias de malware usadas pelo MoustachedBouncer evoluíram, e uma grande mudança ocorreu em 2020, quando o grupo começou a usar ataques AitM. Ao mesmo tempo, eles começaram a usar ferramentas muito mais simples desenvolvidas em .NET e Go. Em referência ao NightClub, nomeamos este novo conjunto de ferramentas como Disco.

O MoustachedBouncer opera as duas famílias de implantes em paralelo, mas em uma máquina específica, apenas uma é implantada por vez. Acreditamos que o Disco é usado em conjunto com os ataques AitM, enquanto o NightClub é usado para vítimas onde a interceptação de tráfego no nível do ISP não é possível devido a uma mitigação, como o uso de uma VPN criptografada de ponta a ponta, onde o tráfego da internet é roteado fora de Belarus.

Disco

Conforme mencionado na seção anterior, uma página falsa de Atualização do Windows fornece o primeiro estágio (SHA-1: E65EB4467DDB1C99B09AE87BA0A964C36BAB4C30). Este é um dropper simples escrito em Go que cria uma tarefa agendada para executar \35.214.56[.]2\OfficeBroker\OfficeBroker.exe a cada minuto. O OfficeBroker.exe é baixado através do protocolo SMB via ataque AitM. A função principal do dropper é mostrada na Figura 6.

Figure 6. Main function of the Go dropper

Figura 6. Função principal do dropper em Go.

Por fim, o dropper realiza uma consulta DNS para windows.system.update[.]com. Esse domínio não existe, mas a solicitação DNS provavelmente é interceptada via AitM, e provavelmente é um sinal para notificar os operadores de que a máquina foi comprometida com sucesso.

Não fomos capazes de recuperar o arquivo OfficeBroker.exe, mas é muito provável que ele atue como um downloader, já que observamos plugins adicionais sendo executados a partir de compartilhamentos SMB. Os plugins são desenvolvidos em Go e são bastante simples, pois dependem principalmente de bibliotecas externas Go. A Tabela 2 resume os diferentes plugins.

Tabela 2. Plugins Go usados pelo MoustachedBouncer em 2021-2022.

Download URL / Path on disk

Description

\\209.19.37[.]184\driverpack\aact.exe

Takes screenshots using the kbinani/screenshot library. Screenshots are saved in .\AActdata\<d>_<s>.dat (on the SMB share) where <d> is the active display number and <s> the date. It sleeps 15 seconds between each screenshot.

C:\Users\Public\driverpack\driverpackUpdate.exe

Executes PowerShell scripts with powershell.exe -NoProfile -NonInteractive <command>, where <command> is read from the file .\idata. The output is written in .\odata.

C:\Users\Public\driverpack\sdrive.exe

Executes C:\Users\Public\‌driverpack\driverpackUpdate.exe (the plugin above) using elevated rights via CVE-2021-1732. The code was likely inspired by a PoC on GitHub and uses the zydis code generation library.

\\209.19.37[.]184\driverpack\officetelemetry.exe

A reverse proxy strongly inspired by the GitHub repository revsocks. We were unable to retrieve the command line parameters with the proxy IP address.

\\38.9.8[.]78\driverpack\DPU.exe

Another sample of the PowerShell plugin.

%userprofile%\appdata\nod32update\nod32update.exe

Another sample of the reverse proxy plugin.

\\59.6.8[.]25\outlooksync\outlooksync.exe

Takes screenshots; it is similar to the first plugin. Images are saved in ./logs/${DATETIME}.dat.

\\52.3.8[.]25\oracle\oracleTelemetry.exe

Screenshot plugin packed with Themida.

Curiosamente, os plugins também usam compartilhamentos SMB para a exfiltração de dados. Não há um servidor C&C fora das instalações dos atacantes para ser observado ou derrubado. Também parece não haver uma maneira de alcançar esse servidor C&C a partir da internet. Isso confere alta resiliência à infraestrutura de rede dos atacantes.

Plugins SharpDisco e NightClub

Em janeiro de 2020, observamos um dropper do MoustachedBouncer, que chamamos de SharpDisco, sendo baixado de https://mail.mfa.gov.<redacted>/EdgeUpdate.exe por um processo do Microsoft Edge. Não está claro como os atacantes conseguiram interferir no tráfego HTTPS, mas é possível que um aviso de certificado TLS inválido tenha sido mostrado à vítima. Outra possibilidade é que o MoustachedBouncer tenha comprometido esse site governamental.

SharpDisco (SHA-1: A3AE82B19FEE2756D6354E85A094F1A4598314AB)

O SharpDisco é um dropper desenvolvido em C#. Ele exibe uma janela falsa de atualização, mostrada na Figura 7, enquanto cria duas tarefas agendadas em segundo plano.

Figure 7. Fake Microsoft Edge update window

Figura 7. Janela falsa de atualização do Microsoft Edge.

Essas tarefas agendadas são:

scheduled tasks

WINCMDA.EXE e WINCMDB.EXE provavelmente são apenas cmd.exe renomeados. A cada minuto, a tarefa lê o que está em \24.9.51[.]94\EDGEUPDATE\EDGEAIN (no compartilhamento SMB), direciona para o cmd.exe e escreve a saída em \24.9.51[.]94\EDGEUPDATE\EDGEAOUT. É o mesmo para a segunda tarefa, mas com os arquivos EDGEBIN e EDGEBOUT. De uma visão mais ampla, essas tarefas são shells reversos com uma latência de um segundo.

Em seguida, como mostrado na Figura 8, o dropper envia uma solicitação DNS para um domínio não registrado, edgeupdate-security-windows[.]com. Isso é semelhante ao que o dropper Disco de 2022 faz.

Figure 8. Dropper used in 2020

Figura 8. Dropper usado em 2020.

A telemetria da ESET mostra que o shell reverso foi usado para deixar um interpretador Python genuíno em C:\Users\Public\WinTN\WinTN.exe. Em seguida, observamos dois plugins sendo deixados no disco pelo cmd.exe, o que significa que provavelmente também foram deixados pelo shell reverso. Os dois plugins são:

  • Um ladrão de arquivos recentes em C:\Users\Public\WinSrcNT\It11.exe.

  • Um monitor de unidades externas em C:\Users\Public\It3.exe.

É interessante notar que esses plugins compartilham código com o NightClub (descrito na seção NightClub - 2017 (SHA-1: F92FE4DD679903F75ADE64DC8A20D46DFBD3B277) abaixo). Isso nos permitiu vincular os conjuntos de ferramentas Disco e NightClub.

Ladrão de arquivos recentes (SHA-1: 0DAEA89F91A55F46D33C294CFE84EF06CE22E393)

Este plugin é um executável do Windows chamado It11.exe. Acreditamos que ele foi executado através do shell reverso mencionado acima. Não há mecanismo de persistência implementado no plugin.

Ele obtém os arquivos recentemente abertos na máquina lendo o conteúdo da pasta %USERPROFILE%\Recent (no Windows XP) ou de %APPDATA%\Microsoft\Windows\Recent (em versões mais recentes do Windows). Essas pastas contêm arquivos LNK, cada um apontando para um arquivo aberto recentemente.

O plugin incorpora seu próprio analisador de formato LNK para extrair o caminho para o arquivo original.

Não conseguimos fazer esse plugin funcionar, mas a análise estática mostra que os arquivos são exfiltrados para o compartilhamento SMB \24.9.51[.]94\EDGEUPDATE\update. O plugin mantém uma lista de arquivos já exfiltrados e seus checksums CRC-32 em %TEMP%\index.dat. Isso provavelmente evita a retransmissão do mesmo arquivo mais de uma vez.

Monitor de unidades externas (SHA-1: 11CF38D971534D9B619581CEDC19319962F3B996)

Este plugin é um executável do Windows chamado It3.exe. Assim como o roubador de arquivos recentes, ele não implementa nenhum mecanismo de persistência.

O plugin chama GetLogicalDrives em um loop para obter uma lista de todas as unidades conectadas, incluindo unidades removíveis, como chaves USB. Em seguida, ele faz uma cópia bruta do volume NTFS de cada unidade removível e a escreve no diretório de trabalho atual, C:\Users\Public\ em nosso exemplo. O nome do arquivo é uma sequência aleatória de seis a oito caracteres alfanuméricos, por exemplo heNNYwmY.

Ele mantém um arquivo de log em <diretório de trabalho>\index.dat com os checksums CRC-32 dos discos copiados.

 

O plugin não parece ter capacidades de exfiltração. É provável que os dumps de unidades organizados sejam posteriormente recuperados usando o shell reverso.

NightClub

Desde 2014, o MoustachedBouncer tem usado um framework de malware que chamamos de NightClub porque ele contém uma classe C++ chamada nightclub. Encontramos amostras de 2014, 2017, 2020 e 2022. Esta seção descreve a evolução do NightClub de um simples backdoor para um implante C++ totalmente modular.

Resumidamente, o NightClub é uma família de implantes que usa e-mails para suas comunicações C&C. Desde 2016, módulos adicionais podem ser entregues por e-mail para ampliar suas capacidades de espionagem.

NightClub - 2014

Esta é a versão mais antiga conhecida do NightClub. Encontramos um dropper e um orquestrador.

O dropper (SHA-1: 0401EE7F3BC384734BF7E352C4C4BC372840C30D) é um executável chamado EsetUpdate-0117583943.exe, e foi enviado ao VirusTotal da Ucrânia em 19/11/2014. Não sabemos como ele foi distribuído naquela época.

A função principal, ilustrada na Figura 9, carrega o recurso MEMORY e escreve seu conteúdo em %SystemRoot%\System32\creh.dll. Ele é armazenado em texto claro no recurso PE.

Figure 9. Main function of the dropper

Figura 9. Função principal do dropper.

Em seguida, o dropper modifica os carimbos de data e hora de Criação, Acesso e Gravação do creh.dll para os da DLL legítima do Windows user32.dll.

Por fim, ele cria um serviço do Windows chamado WmdmPmSp e define, no registro, o ServiceDll como %SystemRoot%\System32\creh.dll - veja a Figura 10.

Figure 10. Modification of the value ServiceDll

Figura 10. Modificação do valor ServiceDll.

A DLL previamente deixada, creh.dll (SHA-1: 5B55250CC0DA407201B5F042322CFDBF56041632), é o orquestrador do NightClub. Ela possui uma única exportação chamada ServiceMain e o caminho do seu PDB é D:\Programming\Projects\Work\SwampThing\Release\Win32\WorkingDll.pdb.

Ela é escrita em C++ e os nomes de alguns métodos e classes estão presentes nos dados RTTI - veja a Figura 11.

Figure 11. Method and class names from the RTTI data

Figura 11. Nomes de métodos e classes dos dados RTTI.

Algumas das strings estão criptografadas usando o seguinte gerador congruencial linear (LCG): staten+1 = (690069 × staten + 1) mod 232. Para cada string criptografada, é fornecida uma semente (state0) entre 0 e 255. Para descriptografar uma string, o staten é subtraído de cada byte criptografado. Um exemplo de estrutura de string criptografada é mostrado na Figura 12.

Figure 12. Encrypted string format

Figura 12. Formato de string criptografada.

Um arquivo de log não criptografado está presente em C:\Windows\System32\servdll.log. Ele contém informações muito básicas sobre a inicialização do orquestrador - veja a Figura 13.

Figure 13. Log file

Figura 13. Arquivo de log.

O NightClub possui duas capacidades principais:

• Monitoramento de arquivos

• Exfiltração de dados via SMTP (email)

Monitoramento de arquivos

A funcionalidade implementada aqui é muito semelhante à do plugin de monitoramento de arquivos recentes visto em 2020 e descrito acima. Ele também navega pelos diretórios %USERPROFILE%\Recent no Windows XP e, em versões mais recentes do Windows, %APPDATA%\Microsoft\Windows\Recent, e implementa o mesmo analisador de LNK - veja a Figura 14 e a Figura 15.

Figure 14. LNK parser (2014 sample – 5B55250CC0DA407201B5F042322CFDBF56041632)

Figura 14. Analisador de LNK (amostra de 2014 - 5B55250CC0DA407201B5F042322CFDBF56041632).

Figure 15. LNK parser (2020 sample – 0DAEA89F91A55F46D33C294CFE84EF06CE22E393)

Figura 15. Analisador de LNK (amostra de 2020 - 0DAEA89F91A55F46D33C294CFE84EF06CE22E393).

Os arquivos recuperados dos arquivos LNK são copiados para %TEMP%<nome do arquivo original>.bin. Note que, ao contrário da variante de 2020, apenas arquivos com extensões .doc, .docx, .xls, .xslx ou .pdf são copiados.

Ele também monitora unidades removíveis em um loop, a fim de roubar arquivos delas.

Comunicações C&C via SMTP

O NightClub usa o protocolo SMTP para exfiltrar dados. Embora a comunicação C&C por e-mail não seja exclusiva do MoustachedBouncer e também seja utilizada por outros adversários como o Turla (ver LightNeuron e a backdoor do Outlook ), é bastante rara. O código é baseado no projeto CSmtp disponível no GitHub. As informações das contas de e-mail são codificadas, encriptadas com o algoritmo LCG. Na amostra que analisámos, a configuração do correio é a seguinte

- Servidor SMTP: smtp.seznam.cz

- Endereço do remetente: glen.morriss75@seznam[.]cz

- Senha do remetente: <redacted>

- Endereço do destinatário: SunyaF@seznam[.]cz

seznam.cz é um portal web tcheco que oferece um serviço de webmail gratuito. Acreditamos que os atacantes tenham criado suas próprias contas de e-mail, em vez de comprometer contas legítimas.

O NightClub exfiltra os arquivos previamente copiados para %TEMP% pela funcionalidade de monitoramento de arquivos (FileMonitor na Figura 11). Eles são codificados em base64 e adicionados como anexo. O nome do anexo é o nome do arquivo original com a extensão .bin.

A Figura 16 mostra a exfiltração de um arquivo via SMTP. O NightClub autentica usando as credenciais da conta glen.morriss75@seznam[.]cz e envia um email para SunyaF@seznam[.]cz com o arquivo roubado anexado.

Figure 16. TCP stream of the SMTP communication from our test machine

Figura 16. Fluxo TCP da comunicação SMTP da nossa máquina de teste.

Observe que alguns cabeçalhos que podem parecer suspeitos à primeira vista são os padrões do projeto CSmtp, portanto, provavelmente não são distintivos. Isso inclui:

- X-Mailer: The Bat! (v3.02) Professional

- Content-Type: multipart/mixed; boundary="__MESSAGE__ID__54yg6f6h6y456345"

The Bat! é um cliente de e-mail amplamente usado no leste europeu. Como tal, o cabeçalho X-Mailer provavelmente se mistura ao tráfego de e-mail em Belarus.

NightClub - 2017 (SHA-1: F92FE4DD679903F75ADE64DC8A20D46DFBD3B277)

Em 2017, encontramos uma versão mais recente do NightClub, que foi compilada em 05 de junho de 2017. Na máquina da vítima, ela estava localizada em C:\Windows\System32\metamn.dll. Seu nome de arquivo no diretório de exportação da DLL é DownloaderService.dll, e ela possui uma única exportação chamada ServiceMain. Ela contém o caminho do PDB D:\AbcdMainProject\Rootsrc\Projects\MainS\Ink\Release\x64\EtfFavoriteFinder.pdb.

Para persistência, ela cria um serviço do Windows chamado WmdmPmSp, como nas versões anteriores. Infelizmente, não conseguimos recuperar o dropper.

Essa versão do NightClub também inclui alguns nomes de classe e método em C++, incluindo nightclub, nos dados RTTI - veja a Figura 17.

Figure 17. Method and class names from the RTTI data of the 2017 NightClub version

Figura 17. Nomes de métodos e classes dos dados RTTI da versão NightClub de 2017.

Como em versões anteriores, as comunicações C&C usam o protocolo SMTP, por meio da biblioteca CSmtp, com credenciais codificadas. Na amostra que analisamos, a configuração do email é a seguinte:

- Servidor SMTP: smtp.mail.ru

- Endereço do remetente: fhtgbbwi@mail[.]ru

- Senha do remetente: [redacted]

- Endereço do destinatário: nvjfnvjfnjf@mail[.]ru

A principal diferença é que eles trocaram o provedor de email gratuito de Seznam.cz para Mail.ru.

Essa versão do NightClub usa plugins externos armazenados na pasta %APPDATA%\NvmFilter. Eles são DLLs nomeadas como <aleatório>.cr (por exemplo, et2z7q0FREZ.cr) com uma única exportação chamada Starts. Identificamos dois plugins: um keylogger e um monitor de arquivos.

Keylogger (SHA-1: 6999730D0715606D14ACD19329AF0685B8AD0299)

Esse plugin estava armazenado em %APPDATA%\NvmFilter\et2z7q0FREZ.cr e é uma DLL com uma exportação, Starts. Ela contém o caminho do PDB D:\Programming\Projects\Autogen\Kh\AutogenAlg\Release\x64\SearchIdxDll.pdb e foi desenvolvida em C++. Dados RTTI mostram alguns nomes de classes - veja a Figura 18.

Figure 18. Method and class names from the RTTI data of the NightClub keylogger plugin

Figura 18. Nomes de métodos e classes dos dados RTTI do plug-in do keylogger do NightClub.

A implementação do keylogger é bastante tradicional, utilizando a função API GetKeyState do Windows - veja a Figura 19.

Figure 19. NightClub keylogger

Figura 19. Keylogger do NightClub.

O keylogger mantém um arquivo de log em texto simples em %TEMP%\uirtl.tmp. Ele contém a data, o título do aplicativo e as teclas pressionadas registradas para esse aplicativo específico. Um exemplo que geramos é fornecido na Figura 20.

Figure 20. Example of the output of the keylogger (generated by us)

Figura 20. Exemplo do resultado do keylogger (gerado por nós).

Monitor de arquivos (SHA-1: 6E729E84C7672F048ED8AE847F20A0219E917FA)

Este plugin estava armazenado em %APPDATA%\NvmFilter\sTUlsWa1.cr e é uma DLL com uma única exportação chamada Starts. Seu caminho PDB, D:\Programming\Projects\Autogen\Kh\AutogenAlg\Release\x64\FileMonitoringModule.pdb, não foi removido, e ele reutiliza código dos monitores de arquivo de 2014 e 2020, descritos acima. Ele monitora unidades e arquivos recentes, e copia arquivos para exfiltração em %TEMP%\AcmSym\rm. Seu arquivo de log é armazenado em %TEMP%\indexwti.sxd.

NightClub - 2020-2022

Em novembro de 2020, observamos uma nova versão do NightClub implantada na Bielorrússia, nos computadores da equipe diplomática de um país europeu. Em julho de 2022, o MoustachedBouncer comprometeu novamente alguns dos mesmos computadores. As versões de 2020 e 2022 do NightClub são praticamente idênticas, e o vetor de comprometimento permanece desconhecido.

Sua arquitetura é ligeiramente diferente das versões anteriores, pois o orquestrador também implementa funções de rede. O segundo componente, que seus desenvolvedores chamam de agente de módulo, é responsável apenas por carregar os plugins. Todas as amostras foram encontradas na pasta %APPDATA%\microsoft\def\ e são escritas em C++ com bibliotecas estaticamente vinculadas, como CSmtp ou cpprestsdk. Como resultado, os executáveis são bastante grandes - cerca de 5MB.

Orquestrador

Nas máquinas das vítimas, ambas as variantes do orquestrador (SHA-1: 92115E21E565440B1A26ECC20D2552A214155669 e D14D9118335C9BF6633CB2A41023486DACBEB052) tinham o nome svhvost.exe. Acreditamos que o MoustachedBouncer tentou se disfarçar com o nome do executável legítimo svchost.exe. Para persistência, ele cria um serviço chamado vAwast.

Ao contrário das versões anteriores, para criptografar as strings, eles simplesmente adicionam 0x01 a cada byte. Por exemplo, a string cmd.exe seria criptografada como dne/fyf. Outra diferença é que a configuração é armazenada em um arquivo externo, em vez de codificada no binário. Ela é armazenada no caminho codificado %APPDATA%\Microsoft\def\Gfr45.cfg e os dados são descriptografados com uma chave RSA privada de 2048 bits (veja a Figura 21) usando as funções BCryptImportKeyPair e BCryptDecrypt.

Figure 21. Hardcoded private RSA key

Figura 21. Chave RSA privada codificada.

A configuração é formatada em JSON, como mostrado na Figura 22.

Figure 22. NightClub external configuration format

Figura 22. Formato de configuração externa do NightClub.

As chaves mais importantes são "transport" e "modules". A primeira contém informações sobre a caixa de correio usada para as comunicações C&C, assim como nas versões anteriores. A segunda contém a lista de módulos.

Agente de módulo

As duas variantes do agente de módulo (SHA-1: DE0B38E12C0AF0FD63A67B03DD1F8C1BF7FA6128 e E6DE72516C1D4338D7E45E028340B54DCDC7A8AC) foram nomeadas de schvost.exe, que é outra imitação do nome de arquivo svchost.exe.

Este componente é responsável por iniciar os módulos especificados na configuração. Eles são DLLs, cada uma com uma exportação chamada Start ou Starts. Elas são armazenadas no disco sem criptografia com a extensão .ini, mas na verdade são DLLs.

Módulos

Ao longo de nossa investigação, encontramos cinco módulos diferentes: um gravador de áudio, dois capturadores de tela quase idênticos, um keylogger e uma porta dos fundos DNS. Para todos eles: sua configuração, que é formatada em JSON, é passada como argumento para a função Start ou Starts.

Por padrão, a saída do plugin é escrita em %TEMP%\tmp123.tmp. Isso pode ser alterado usando o campo de configuração "file". A Tabela 3 mostra os diferentes plugins do NightClub.

Tabela 3. Plugins do NightClub.

DLL export name

Configuration

Description

NotifyLoggers.dll

{

    "name":"<value>",

    "enabled":"<value>",

    "max_size":"<value>",

    "file":"<value>",

    "chk_t":"<value>",

    "r_d":"<value>",

    "f_hs":"<value>",

    "t_hs":"<value>"

}

An audio recorder that uses the Lame library, and mciSendStringW to control the audio device. The additional configuration fields are likely used to specify options for Lame.

MicroServiceRun.dll

{

    "name":"<value>",

    "enabled":"<value>",

    "max_size":"<value>",

    "file":"<value>"
    "capture_on_key_press":"<value>",

    "period_in_sec":"<value>",

    "quality":"<value>",

    "app_keywords":"<value>"

}

A screenshotter that uses CreateCompatibleDC and GdipSaveImageToStream and writes captured images in file to disk. If app_keywords is not empty, it uses GetForegroundWindow to check the name of the active Window and capture it only if it matches app_keywords.

JobTesterDll.dll

{

    "name":"<value>",

    "enabled":"<value>",

    "max_size":"<value>",

    "file":"<value>"

}

A keylogger that uses the GetKeyState API. It writes the log in file to disk and the format is <Date><Title bar><content>.

ParametersParserer.dll

{

    "name":"<value>",

    "enabled":"<value>",

    "max_size":"<value>",

    "file":"<value>",

    "cc_server_address":"<value>"

}

A DNS-tunneling backdoor. cc_server_address specifies the IP address of a DNS server to which requests are sent. More details follow.

O backdoor de tunelamento DNS (ParametersParserer.dll) utiliza um protocolo personalizado para enviar e receber dados de um servidor DNS malicioso (cc_server_address). A Figura 23 demonstra que a solicitação DNS é enviada para o endereço IP fornecido na configuração, utilizando o parâmetro pExtra de DnsQuery_A.

Figure 23. DNS request to the C&C server

Figura 23. Solicitação de DNS para o servidor C&C

O plugin adiciona os dados a serem exfiltrados como parte do nome do subdomínio do domínio utilizado na solicitação DNS (pszName acima). O domínio é sempre 11.1.1.cid e os dados estão contidos no subdomínio. Ele utiliza o seguinte formato, onde x é a letra, não uma variável:

x + <base64 modificado(buffer)> + x.11.1.1.cid

Por exemplo, a primeira solicitação DNS que o plugin envia é xZW1wdHkx.11.1.1.cid, onde ZW1wdHk decodifica para vazio.

Observe que a função base64 não é padrão. Ela remove o =, se houver, do resultado da codificação base64 e também substitui os caracteres / por -s e os caracteres + por -p. Isso é feito para criar subdomínios válidos, pois a saída da codificação base64 padrão pode incluir os caracteres +, / e =, todos inválidos em nomes de domínio e que podem ser detectados no tráfego de rede.

Em seguida, o plugin lê o resultado que deve ser um ou vários registros DNS TXT, uma vez que a flag DNS_TYPE_TEXT é passada para DnsQuery_A. A Microsoft nomeia a estrutura subjacente de DNS_TXT_DATAA. Ela contém uma matriz de strings, que são concatenadas para calcular o buffer de saída.

Figure 24. The plugin reads the TXT record

Figura 24. O plugin lê o registo TXT.

O formato esperado da resposta é:

x + <argumento codificado com base64 modificado> + x.<cmd_id>.<inteiro desconhecido>.1.<nome_do_comando>

 Isso é semelhante ao formato das solicitações. O <argumento codificado com base64 modificado> também utiliza a codificação base64 personalizada, sem = e com -p para + e -s para /. <nome_do_comando> é uma string arbitrária que não é usada pelo backdoor; provavelmente é usada pelos operadores para controlar os diferentes comandos. <cmd_id> é um inteiro que corresponde a um comando na declaração switch do backdoor.

Por exemplo, se os operadores quisessem executar calc.exe, o servidor DNS C&C enviaria a resposta xYzpcd2luZG93c1xzeXN0ZW0zMlxjYWxjLmV4ZQx.27.2.1.calc, onde Yzpcd2luZG93c1xzeXN0ZW0zMlxjYWxjLmV4ZQ decodifica para c:\windows\system32\calc.exe e 27 é o ID do comando para criar um novo processo. Todos os comandos suportados por este backdoor estão detalhados na Tabela 4.

Tabela 4. Comandos implementados pelo backdoor DNS.

ID

Description

0x15 (21)

Copy a directory (from a source to a destination)

0x16 (22)

Move a file (from a source to a destination)

0x17 (23)

Remove a file or a directory

0x18 (24)

Search a file for a given pattern (Note: we are unsure about the exact behavior of this command)

0x19 (25)

Write a buffer to a file

0x1A (26)

Read a file

0x1B (27)

Create a process

O resultado dos comandos é exfiltrado de volta para o atacante usando solicitações DNS, conforme detalhado acima. A única diferença é que o número 11 é substituído por 12 no nome de domínio, como mostrado neste exemplo: xdGltZW91dAx.12.1.1.cid. Neste caso, o plugin enviou a mensagem "timeout" para o servidor C&C.

Conclusão

O MoustachedBouncer é um ator de ameaça habilidoso que visa diplomatas estrangeiros na Bielorrússia. Ele utiliza técnicas bastante avançadas para comunicações de C&C, incluindo interceptação de rede no nível do ISP para o implante Disco, e-mails para o implante NightClub, e DNS em um dos plugins do NightClub.

A principal lição é que organizações em países estrangeiros onde a internet não pode ser confiável devem usar um túnel VPN criptografado de ponta a ponta para um local confiável para todo o tráfego da internet, a fim de contornar qualquer dispositivo de inspeção de rede.

Para qualquer dúvida sobre nossa pesquisa publicada no WeLiveSecurity, entre em contato conosco pelo e-mail threatintel@eset.com.

IoCs

Arquivos

SHA-1

Filename

Detection

Description

02790DC4B276DFBB26C714F29D19E53129BB6186

index.html

JS/TrojanDownloader.Agent.YJJ

Fake Windows update webpage.

6EFF58EDF7AC0FC60F0B8F7E22CFE243566E2A13

jdrop.js

JS/TrojanDownloader.Agent.YJJ

JavaScript code that triggers the download prompt of the fake Windows update.

E65EB4467DDB1C99B09AE87BA0A964C36BAB4C30

MicrosoftUpdate845255.exe

WinGo/Agent.ET

Disco dropper.

3A9B699A25257CBD0476CB1239FF9B25810305FE

driverpackUpdate.exe

WinGo/Runner.B

Disco plugin. Executes PowerShell scripts.

19E3D06FBE276D4AAEA25ABC36CC40EA88435630

DPU.exe

WinGo/Runner.C

Disco plugin. Executes PowerShell scripts.

52BE04C420795B0D9C7CD1A4ACBF8D5953FAFD16

sdrive.exe

Win64/Exploit.CVE-2021-1732.I

Disco plugin. LPE exploit for CVE-2021-1732.

0241A01D4B03BD360DD09165B59B63AC2CECEAFB

nod32update.exe

WinGo/Agent.EV

Disco plugin. Reverse proxy based on revsocks.

A01F1A9336C83FFE1B13410C93C1B04E15E2996C

aact.exe

WinGo/Spy.Agent.W

Disco plugin. Takes screenshots.

C2AA90B441391ADEFAA3A841AA8CE777D6EC7E18

officetelemetry.exe

WinGo/Agent.BT

Disco plugin. Reverse proxy based on revsocks.

C5B2323EAE5E01A6019931CE35FF7623DF7346BA

oracleTelemetry.exe

WinGo/Spy.Agent.W

Disco plugin packed with Themida. Takes screenshots.

C46CB98D0CECCB83EC7DE070B3FA7AFEE7F41189

outlooksync.exe

WinGo/Spy.Agent.W

Disco plugin. Takes screenshots.

A3AE82B19FEE2756D6354E85A094F1A4598314AB

kb4480959_EdgeUpdate.exe

MSIL/TrojanDropper.Agent.FKQ

Disco .NET dropper.

4F1CECF6D05571AE35ED00AC02D5E8E0F878A984

WinSrcNT.exe

Win32/Nightclub.B

NightClub plugin used by Disco. Steals recent files.

0DAEA89F91A55F46D33C294CFE84EF06CE22E393

It11.exe

Win32/Nightclub.B

NightClub plugin used by Disco. Steals recent files.

11CF38D971534D9B619581CEDC19319962F3B996

It3.exe

Win32/Nightclub.B

NightClub plugin used by Disco. Makes raw dumps of removable drives.

F92FE4DD679903F75ADE64DC8A20D46DFBD3B277

metamn.dll

Win64/Nightclub.B

NightClub (2017 version).

6999730D0715606D14ACD19329AF0685B8AD0299

et2z7q0FREZ.cr

Win64/Nightclub.B

NightClub plugin. Keylogger.

6E729E84C7672F048ED8AE847F20A0219E917FA3

sTUlsWa1.cr

Win64/Nightclub.A

NightClub plugin.  File stealer.

0401EE7F3BC384734BF7E352C4C4BC372840C30D

EsetUpdate-0117583943.exe

Win32/Nightclub.C

NightClub dropper.

5B55250CC0DA407201B5F042322CFDBF56041632

creh.dll

Win32/Nightclub.C

NightClub (2014).

D14D9118335C9BF6633CB2A41023486DACBEB052

svhvost.exe

Win32/Nightclub.D

Orchestrator (NightClub).

E6DE72516C1D4338D7E45E028340B54DCDC7A8AC

schvost.exe

Win32/Nightclub.D

Module agent (NightClub).

3AD77281640E7BA754E9B203C8B6ABFD3F6A7BDD

nullnat.ini

Win32/Nightclub.D

Backdoor with DNS tunneling (NightClub plugin).

142FF0770BC6E3D077FBB64D6F23499D9DEB9093

soccix.ini

Win32/Nightclub.D

Keylogger (NightClub plugin).

FE9527277C06D7F986161291CE7854EE79788CB8

oreonion.ini

Win32/Nightclub.D

Screenshotter (NightClub plugin).

92115E21E565440B1A26ECC20D2552A214155669

svhvost.exe

Win32/Nightclub.D

Orchestrator (NightClub).

DE0B38E12C0AF0FD63A67B03DD1F8C1BF7FA6128

schvost.exe

Win32/Nightclub.D

Module agent (NightClub).

D2B715A72BBA307CC9BF7690439D34F62EDF1324

sysleg.ini

Win32/Nightclub.D

Records audio (NightClub plugin).

DF8DED42F9B7DE1F439AEC50F9C2A13CD5EB1DB6

oreonion.ini

Win32/Nightclub.D

Takes screenshots (NightClub plugin).

Servidores C&C

IP

Domain

First seen

Comment

185.87.148[.]86

centrocspupdate[.]com

November 3, 2021

Suspected NightClub C&C server.

185.87.151[.]130

ocsp-atomsecure[.]com

November 11, 2021

Suspected NightClub C&C server.

45.136.199[.]67

securityocspdev[.]com

July 5, 2022

NightClub C&C server.

45.136.199[.]129

dervasopssec[.]com

October 12, 2022

Suspected NightClub C&C server.

Domínios "falsos" usados no AitM

Nota: Esses domínios são usados em um contexto em que as consultas DNS são interceptadas antes de alcançar a internet. Eles não resolvem fora do contexto do ataque AitM.

windows.network.troubleshooter[.]com

updates.microsoft[.]com

Endereços IP de partilha SMB enquanto o AitM está em curso

Nota: Estes endereços IP são utilizados num contexto em que o tráfego para eles é intercetado antes de chegar à Internet. Estes endereços IP encaminháveis pela Internet não são maliciosos fora do contexto do ataque AitM.

24.9.51[.]94

35.214.56[.]2

38.9.8[.]78

52.3.8[.]25

59.6.8[.]25

209.19.37[.]184

E-mails:

fhtgbbwi@mail[.]ru

nvjfnvjfnjf@mail[.]ru

glen.morriss75@seznam[.]cz

SunyaF@seznam[.]cz

Técnicas MITRE ATT&CK

Esta tabela foi criada usando a versão 13 do framework MITRE ATT&CK.

Tactic

ID

Name

Description

Reconnaissance

T1590.005

Gather Victim Network Information: IP Addresses

MoustachedBouncer operators have collected IP addresses, or address blocks, of their targets in order to modify network traffic for just those addresses.

Initial Access

T1189

Drive-by Compromise

Disco is delivered via a fake Windows Update website.

Execution

T1204.002

User Execution: Malicious File

Disco needs to be manually executed by the victim.

Persistence

T1053.005

Scheduled Task/Job: Scheduled Task

Disco persists as a scheduled task that downloads an executable from a “fake” SMB share every minute.

T1543.003

Create or Modify System Process: Windows Service

NightClub persists as a ServiceDll of a service named WmdmPmSp.

Privilege Escalation

T1068

Exploitation for Privilege Escalation

Disco has a plugin to exploit the CVE-2021-1732 local privilege escalation vulnerability.

Defense Evasion

T1140

Deobfuscate/Decode Files or Information

Since 2020, NightClub has used an external configuration file encrypted with RSA.

Collection

T1005

Data from Local System

NightClub steals recent files from the local system.

T1025

Data from Removable Media

NightClub steals files from the local system.

T1056.001

Input Capture: Keylogging

NightClub has a plugin to record keystrokes.

T1113

Screen Capture

NightClub and Disco each have a plugin to take screenshots.

T1123

Audio Capture

NightClub has a plugin to record audio.

Command and Control

T1071.002

Application Layer Protocol: File Transfer Protocols

Disco communicates via the SMB protocol.

T1071.003

Application Layer Protocol: Mail Protocols

NightClub communicates via the SMTP protocol.

T1071.004

Application Layer Protocol: DNS

One of the NightClub plugins is a backdoor that communicates via DNS.

T1132.001

Data Encoding: Standard Encoding

NightClub encodes files, attached to email, in base64.

T1132.002

Data Encoding: Non-Standard Encoding

NightClub encodes commands and responses sent via its DNS C&C channel with a modified form of base64.

T1573.001

Encrypted Channel: Symmetric Cryptography

NightClub receives plugins in email attachments, encrypted using AES-CBC.

T1557

Adversary-in-the-Middle

MoustachedBouncer has performed AitM at the ISP level to redirect its targets to a fake Windows Update page. It has also done AitM on the SMB protocol to deliver malicious files from “fake” servers.

Exfiltration

T1041

Exfiltration Over C2 Channel

NightClub and Disco exfiltrate data over the C&C channel (SMTP, SMB, and DNS).

Impact

T1565.002

Data Manipulation: Transmitted Data Manipulation

MoustachedBouncer has modified the HTTP traffic from specific IP addresses at the ISP level in order to redirect its targets to a fake Windows Update page.