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).
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 |
Victim A (2017) |
Victim B |
Victim C |
Victim D |
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.
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).
Um clique no botão executa a função de atualização, mostrada na Figura 4.
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.
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.
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.
Essas tarefas agendadas são:
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
A implementação do keylogger é bastante tradicional, utilizando a função API GetKeyState do Windows - veja a Figura 19.
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.
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.
A configuração é formatada em JSON, como mostrado na Figura 22.
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>" "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.
"capture_on_key_press":"<value>",
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.
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.
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 |
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 |
Drive-by Compromise |
Disco is delivered via a fake Windows Update website. |
|
Execution |
User Execution: Malicious File |
Disco needs to be manually executed by the victim. |
|
Persistence |
Scheduled Task/Job: Scheduled Task |
Disco persists as a scheduled task that downloads an executable from a “fake” SMB share every minute. |
|
Create or Modify System Process: Windows Service |
NightClub persists as a ServiceDll of a service named WmdmPmSp. |
||
Privilege Escalation |
Exploitation for Privilege Escalation |
Disco has a plugin to exploit the CVE-2021-1732 local privilege escalation vulnerability. |
|
Defense Evasion |
Deobfuscate/Decode Files or Information |
Since 2020, NightClub has used an external configuration file encrypted with RSA. |
|
Collection |
Data from Local System |
NightClub steals recent files from the local system. |
|
Data from Removable Media |
NightClub steals files from the local system. |
||
Input Capture: Keylogging |
NightClub has a plugin to record keystrokes. |
||
Screen Capture |
NightClub and Disco each have a plugin to take screenshots. |
||
Audio Capture |
NightClub has a plugin to record audio. |
||
Command and Control |
Application Layer Protocol: File Transfer Protocols |
Disco communicates via the SMB protocol. |
|
Application Layer Protocol: Mail Protocols |
NightClub communicates via the SMTP protocol. |
||
Application Layer Protocol: DNS |
One of the NightClub plugins is a backdoor that communicates via DNS. |
||
Data Encoding: Standard Encoding |
NightClub encodes files, attached to email, in base64. |
||
Data Encoding: Non-Standard Encoding |
NightClub encodes commands and responses sent via its DNS C&C channel with a modified form of base64. |
||
Encrypted Channel: Symmetric Cryptography |
NightClub receives plugins in email attachments, encrypted using AES-CBC. |
||
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 |
Exfiltration Over C2 Channel |
NightClub and Disco exfiltrate data over the C&C channel (SMTP, SMB, and DNS). |
|
Impact |
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. |