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 RTFApesar 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 shellO 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 documentoO 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 componentesA 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 administradorO 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 administradorUm 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 nebulososApó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çõesNo 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 SFXO 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 iscaVocê 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 ofuscadoApó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 instaladorDe 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.exeDesde 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 .