ESET: Novos esquemas de entrega de backdoor de grupos cibernéticos da OceanLotus

Em uma publicação, descreveremos como o cibergrupo da OceanLotus (APT32 e APT-C-00) recentemente utilizou uma das explorações públicas do CVE-2017-11882 , a vulnerabilidade de corrupção de memória no Microsoft Office e como o malware de grupo fornece persistência em sistemas comprometidos sem deixar vestígios . A seguir, descrevemos como, desde o início de 2019, o grupo usou arquivos de extração automática para executar o código.

A OceanLotus é especializada em espionagem cibernética, com objetivos prioritários no sudeste da Ásia. Os invasores falsificam documentos que atraem a atenção de possíveis vítimas para convencê-los a executar uma porta dos fundos e também trabalham no desenvolvimento de ferramentas. Os métodos usados ​​para criar chamarizes variam em ataques diferentes - de arquivos com "extensão dupla", arquivos com extração automática, documentos com macros a explorações conhecidas.


Usando uma exploração no Microsoft Equation Editor


Em meados de 2018, a OceanLotus lançou uma campanha usando a vulnerabilidade CVE-2017-11882. Um dos documentos maliciosos do cibergrupo foi analisado por especialistas do 360 Threat Intelligence Center (um estudo em chinês ), incluindo uma descrição detalhada da exploração. Na postagem abaixo, uma visão geral de um documento tão malicioso.

Primeira etapa


O FW Report on demonstration of former CNRP in Republic of Korea.doc (SHA-1: D1357B284C951470066AAA7A8228190B88A5C7C3 ) é semelhante ao mencionado no estudo acima. É interessante, pois visa usuários interessados ​​na política cambojana (CNRP - Partido Nacional da Salvação do Camboja, dissolvido no final de 2017). Apesar da extensão .doc, o documento possui o formato RTF (veja a figura abaixo), contém código indesejado e também está distorcido.


Figura 1. Lixo no RTF

Apesar da presença de elementos distorcidos, o Word abre com êxito esse arquivo RTF. Como pode ser visto na Figura 2, aqui está a estrutura EQNOLEFILEHDR com um deslocamento de 0xC00, seguido pelo cabeçalho MTEF e, em seguida, a entrada MTEF (Figura 3) para a fonte.


Figura 2. Valores do registro FONT


Figura 3. Formato de gravação FONT

É possível um estouro no campo de nome , porque seu tamanho não é verificado antes da cópia. Um nome muito longo desencadeia uma vulnerabilidade. Como pode ser visto no conteúdo do arquivo RTF (deslocamento 0xC26 na Figura 2), o buffer é preenchido com o código do shell, seguido por um comando fictício ( 0x90 ) e o endereço de retorno 0x402114 . O endereço é um item de diálogo no EQNEDT32.exe que aponta para uma instrução RET . Isso faz com que o EIP aponte para o início do campo de nome que contém o código de shell.


Figura 4. Início do código de exploração do shell

O endereço 0x45BD3C armazena uma variável que é desreferenciada até atingir um ponteiro para a estrutura MTEFData atualmente carregada. Aqui está o resto do código de shell.

O objetivo do código do shell é executar o segundo fragmento do código do shell incorporado em um documento aberto. Primeiro, o código de shell de origem tenta encontrar o descritor de arquivo do documento aberto, NtQuerySystemInformation todos os descritores do sistema ( NtQuerySystemInformation com o argumento SystemExtendedHandleInformation ) e verificando se o PID do descritor e o PID do processo do WinWord e se o documento foi aberto com a máscara de acesso - 0x12019F .

Para confirmar a detecção do descritor correto (e não o descritor de outro documento aberto), o conteúdo do arquivo é exibido usando a função CreateFileMapping , e o código do shell verifica se os últimos quatro bytes do documento correspondem a " yyyy " (método de caça ao ovo). Assim que uma correspondência é encontrada, o documento é copiado para uma pasta temporária ( GetTempPath ) como ole.dll . Em seguida, os últimos 12 bytes do documento são lidos.


Figura 5. Marcadores de fim de documento

O valor de 32 bits entre os marcadores AABBCCDD e yyyy é o deslocamento do próximo AABBCCDD . É chamado usando a função CreateThread . Extraiu o mesmo código de shell usado pelo OceanLotus antes. O script de emulação Python que lançamos em março de 2018 ainda funciona para despejar o segundo estágio.

Segunda etapa


Recuperação de componentes


Os nomes de arquivos e diretórios são selecionados dinamicamente. O código seleciona aleatoriamente o nome de um arquivo executável ou DLL em C:\Windows\system32 . Ele, então, faz uma solicitação aos seus recursos e recupera o campo FileDescription para uso como o nome da pasta. Se isso não funcionar, o código seleciona aleatoriamente o nome da pasta nos diretórios %ProgramFiles% ou C:\Windows (em GetWindowsDirectoryW). Evita o uso de um nome que possa entrar em conflito com os arquivos existentes e garante que ele não contenha as seguintes palavras: windows , Microsoft , desktop , system , system32 ou syswow64 . Se o diretório já existir, "NLS_ {6 caracteres}" será adicionado ao nome.

O recurso 0x102 analisado e os arquivos são despejados em %ProgramFiles% ou %AppData% , para uma pasta selecionada aleatoriamente. O tempo de criação foi alterado para ter os mesmos valores que o kernel32.dll .

Por exemplo, aqui está uma pasta e uma lista de arquivos criados, selecionando o arquivo executável C:\Windows\system32\TCPSVCS.exe como fonte de dados.


Figura 6. Extraindo vários componentes

A estrutura do recurso 0x102 no conta-gotas é bastante complicada. Em poucas palavras, contém:
- nomes de arquivos
- Tamanho e conteúdo dos arquivos
- Formato de compactação ( COMPRESSION_FORMAT_LZNT1 usado pela função RtlDecompressBuffer )

O primeiro arquivo é redefinido como TCPSVCS.exe , que é o legítimo AcroTranscoder.exe (de acordo com FileDescription , SHA-1: 2896738693A8F36CC7AD83EF1FA46F82F32BE5A3 ).

Você pode ter notado que alguns arquivos DLL são maiores que 11 MB. Isso ocorre porque um grande buffer contíguo de dados aleatórios está localizado dentro do arquivo executável. É possível que essa seja uma maneira de evitar a detecção por alguns produtos de segurança.

Persistência


O recurso 0x101 no conta-gotas contém dois números inteiros de 32 bits que determinam como manter a persistência. O valor do primeiro indica como o malware manterá a persistência sem direitos de administrador.


Tabela 1. Mecanismo de persistência sem direitos de administrador

O valor do segundo número inteiro indica como o malware deve garantir a persistência enquanto trabalha como administrador.


Tabela 2. Mecanismo de persistência com direitos de administrador

Um nome de serviço é um nome de arquivo sem extensão; o nome de exibição é o nome da pasta, mas se ela já existir, a string " Revision 1 " será adicionada a ela (o número aumenta até que um nome não utilizado seja encontrado). Os operadores garantiram que a persistência do serviço fosse estável - em caso de falha, o serviço deve ser reiniciado após 1 segundo. Em seguida, o valor WOW64 da nova chave de registro de serviço é definido como 4, o que indica que é um serviço de 32 bits.

A tarefa agendada é criada por meio de várias interfaces COM: ITaskScheduler , ITask , ITaskTrigger , IPersistFile e ITaskScheduler . Em essência, o programa malicioso cria uma tarefa oculta, define as informações da conta junto com as informações sobre o usuário ou administrador atual e, em seguida, define o gatilho.

Essa é uma tarefa diária com duração de 24 horas e intervalos entre duas execuções de 10 minutos, o que significa que será executada continuamente.

Bit malicioso


Em nosso exemplo, o arquivo executável TCPSVCS.exe ( AcroTranscoder.exe ) é um software legítimo que baixa DLLs que são despejadas nele. Nesse caso, o Flash Video Extension.dll é do seu interesse.

Sua função DLLMain simplesmente chama outra função. Alguns predicados difusos estão presentes:


Figura 7. Predicados nebulosos

Após essas verificações enganosas, o código recebe a seção TCPSVCS.exe arquivo TCPSVCS.exe , altera sua proteção para PAGE_EXECUTE_READWRITE e a substitui, adicionando instruções fictícias:


Figura 8. A sequência de instruções

No final, a instrução CALL é adicionada ao endereço da função FLVCore::Uninitialize(void) exportada pelo Flash Video Extension.dll . Isso significa que, após carregar a DLL mal-intencionada, quando o tempo de execução chamar o WinMain no TCPSVCS.exe , o ponteiro da instrução apontará para NOP, resultando na chamada de FLVCore::Uninitialize(void) , a próxima etapa.

A função simplesmente cria um mutex começando com {181C8480-A975-411C-AB0A-630DB8B0A221} seguido pelo nome de usuário atual. Em seguida, ela lê o arquivo despejado com a extensão * .db3, que contém código independente da posição, e usa CreateThread para executar o conteúdo.

O conteúdo do arquivo * .db3 é o código de shell comumente usado pelo grupo OceanLotus. Mais uma vez, descompactamos sua carga útil com sucesso usando o script emulador que publicamos no GitHub .

O script recupera o estágio final. Esse componente é um backdoor que já analisamos em um estudo anterior da OceanLotus . Isso pode ser determinado pelo GUID {A96B020F-0000-466F-A96D-A91BBF8EAC96} arquivo binário. A configuração do malware ainda está criptografada no recurso do PE. Possui aproximadamente a mesma configuração, mas os servidores C&C são diferentes dos anteriores:

- andreagahuvrauvin[.]com
- byronorenstein[.]com
- stienollmache[.]xyz


O OceanLotus novamente demonstra uma combinação de diferentes técnicas para evitar a detecção. Eles retornaram com um esboço "refinado" do processo de infecção. Ao escolher nomes aleatórios e preencher arquivos executáveis ​​com dados aleatórios, eles reduzem o número de IoCs confiáveis ​​(com base em hashes e nomes de arquivos). Além disso, graças ao uso de carregamento de DLL de terceiros, os invasores precisam apenas remover o binário legítimo do AcroTranscoder .

Arquivos de extração automática


Após os arquivos RTF, o grupo mudou para os arquivos de extração automática (SFX) com ícones de documentos comuns para confundir ainda mais o usuário. Isso foi escrito pelo Threatbook ( link em chinês ). Após o início, os arquivos RAR de extração automática são despejados e as DLLs com a extensão .ocx são executadas, cuja carga final foi documentada anteriormente {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll . Desde meados de janeiro de 2019, o OceanLotus reutilizou essa técnica, mas com o tempo, algumas configurações foram alteradas. Nesta seção, falaremos sobre tecnologia e mudanças.

Criação de iscas


O documento THICH-THONG-LAC-HANH-THAP-THIEN-VIET-NAM (1).EXE (SHA-1: AC10F5B1D5ECAB22B7B418D6E98FA18E32BBDEAB ) foi encontrado pela primeira vez em 2018. Este arquivo SFX foi criado com sabedoria - a descrição ( Informações da versão ) diz que esta é uma imagem JPEG. O script SFX é o seguinte:


Figura 9. Comandos SFX

O malware redefine {9ec60ada-a200-4159-b310-8071892ed0c3}.ocx (SHA-1: EFAC23B0E6395B1178BCF7086F72344B24C04DCC ), além da imagem 2018 thich thong lac.jpg.

A imagem da isca é a seguinte:


Figura 10. A imagem da isca

Você deve ter notado que as duas primeiras linhas do script SFX chamam o arquivo OSX duas vezes, mas isso não é um erro.

{9ec60ada-a200-4159-b310-8071892ed0c3} .ocx (ShLd.dll)


O fluxo de controle de arquivo OSX é muito semelhante a outros componentes do OceanLotus - há muitas sequências de comandos JZ/JNZ e PUSH/RET alternando com o código de lixo eletrônico.


Figura 11. Código ofuscado

Após filtrar o código não solicitado, a exportação DllRegisterServer chamada por regsvr32.exe fica assim:


Figura 12. Código básico do instalador

De fato, na primeira vez que DllRegisterServer chamado DllRegisterServer exportação define o valor do Registro HKCU\SOFTWARE\Classes\CLSID\{E08A0F4B-1F65-4D4D-9A09-BD4625B9C5A1}\Model para o deslocamento criptografado na DLL ( 0x10001DE0 ).

Quando uma função é chamada pela segunda vez, ela lê o mesmo valor e é executada nesse endereço. A partir daqui, um recurso é lido e executado e várias ações na RAM.

O shellcode é o mesmo carregador de PE usado nas campanhas anteriores do OceanLotus. Pode ser emulado usando nosso script . Como resultado, ele despeja o db293b825dcc419ba7dc2c49fa2757ee.dll , carrega-o na memória e executa o DllEntry .

A DLL extrai o conteúdo de seu recurso, descriptografa (AES-256-CBC) e descompacta (LZMA). O recurso possui um formato específico que é fácil de descompilar.


Figura 13. Estrutura de configuração do instalador (KaitaiStruct Visualizer)

A configuração é definida explicitamente - dependendo do nível de privilégio, os dados binários serão gravados em %appdata%\Intel\logs\BackgroundUploadTask.cpl ou %windir%\System32\BackgroundUploadTask.cpl (ou SysWOW64 para sistemas de 64 bits).

A persistência é garantida através da criação de uma tarefa chamada BackgroundUploadTask[junk].job , em que [junk] é um conjunto de bytes 0x9D e 0xA0 .

O nome do aplicativo da tarefa é %windir%\System32\control.exe e o valor do parâmetro é o caminho para o arquivo binário descarregado. A tarefa oculta é executada todos os dias.

Estruturalmente, o arquivo CPL é uma DLL com o nome interno ac8e06de0a6c4483af9837d96504127e.dll , que exporta a função CPlApplet . Este arquivo descriptografa seu único recurso {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll , carrega essa DLL e chama sua única exportação DllEntry .

Arquivo de configuração de backdoor


A configuração de backdoor é criptografada e incorporada em seus recursos. A estrutura do arquivo de configuração é muito semelhante à anterior.


Figura 14. Estrutura de configuração de backdoor (KaitaiStruct Visualizer)

Apesar da estrutura semelhante, os valores de muitos campos foram atualizados em comparação com os dados fornecidos em nosso antigo relatório .

O primeiro elemento da matriz binária contém a DLL ( HttpProv.dll MD5: 2559738D1BD4A999126F900C7357B759 ) identificada pelo Tencent . Mas como o nome da exportação foi removido do binário, os hashes não correspondem.

Pesquisa adicional


Coletando amostras, chamamos a atenção para algumas características. A amostra que acabou de descrever apareceu por volta de julho de 2018 e outras semelhantes recentemente, em meados de janeiro - início de fevereiro de 2019. Um arquivo SFX foi usado como vetor de infecção, descarregando um documento de isca legítimo e um arquivo OSX malicioso.

Embora o OceanLotus use registros de data e hora falsos, notamos que os registros de data e hora dos arquivos SFX e OCX são sempre os mesmos ( 0x57B0C36A (14/08/2016 às 19:15 UTC) e 0x498BE80F ( 0x498BE80F às 19:34 UTC) ) respectivamente). Isso provavelmente indica que os autores têm um certo "construtor" que usa os mesmos modelos e simplesmente altera algumas características.

Entre os documentos que estudamos desde o início de 2018, existem vários nomes que indicam os países de interesse do ataque:

- As novas informações de contato do Cambodia Media (New) .xls.exe
- 李建 香 (个人 简历) .exe (documento pdf falso de um CV)
- feedback, Rally nos EUA de 28 a 29 de julho de 2018.exe

Desde a descoberta do backdoor {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll e a publicação de sua análise por vários pesquisadores, observamos algumas alterações nos dados de configuração do malware.

Primeiro, os autores começaram a remover nomes das DLL DLLs auxiliares ( DNSprov.dll e duas versões do HttpProv.dll ). Em seguida, os operadores pararam de compactar a terceira DLL (a segunda versão do HttpProv.dll ), optando por incorporar apenas uma.

Em segundo lugar, muitos campos de configuração de backdoor foram alterados, provavelmente para evitar a detecção, pois muitas IoCs ficaram disponíveis. Entre os campos importantes modificados pelos autores estão os seguintes:

  • Chave de registro do AppX alterada (consulte IoCs)
  • sequência de codificação mutex ("def", "abc", "ghi")
  • número da porta

Finalmente, em todas as novas versões analisadas, os novos C&Cs são listados na seção IoCs.

Conclusões


OceanLotus continua a evoluir. O cibergrupo está focado no refinamento e expansão de ferramentas e iscas. Os autores mascaram cargas maliciosas com a ajuda de documentos que chamam a atenção e são relevantes para as supostas vítimas. Eles desenvolvem novos designs e também usam ferramentas publicamente disponíveis, como a exploração do Equation Editor. Além disso, eles estão aperfeiçoando ferramentas para reduzir o número de artefatos restantes nas máquinas das vítimas, reduzindo assim a chance de detecção por software antivírus.

Indicadores de compromisso


Indicadores de compromisso e atributos MITRE ATT e CK estão disponíveis no Welivesecurity e no GitHub .

Source: https://habr.com/ru/post/pt446604/


All Articles