O grupo OceanLotus (também conhecido como APT32 e APT-C-00) é conhecido por seus ataques no leste da Ásia. No ano passado, vários estudos sobre o trabalho do grupo foram publicados, incluindo documentos do
CyberReason , uma revisão do
FireEye e uma descrição do ataque do
Volexity . Como podemos ver, o grupo atualiza backdoors, infraestrutura e vetores de infecção.
A OceanLotus continua a atingir empresas e agências governamentais no leste da Ásia. De acordo com a telemetria da ESET, as metas prioritárias da OceanLotus estão no Vietnã, Laos, Camboja e Filipinas.
Alguns meses atrás, descobrimos e analisamos uma de suas mais recentes backdoors. Ele implementa várias ferramentas que dificultam a análise e evitam a detecção - as discutiremos em um post.

Distribuição
Os invasores usam métodos diferentes para convencer a vítima a lançar um conta-gotas malicioso.
Extensões duplas e ícones de aplicativos falsos (Word, PDF etc.)
É provável que os conta-gotas se espalhem por meio de anexos de email. Observamos os seguintes nomes de arquivo:
-
Mi17 Technical issues - Phonesack Grp.exe
(Mi-17 - modelo de helicóptero russo)
-
Chi tiet don khieu nai gui saigontel.exe
(traduzido do vietnamita - “detalhes da reivindicação enviada à Saigontel”, Saigontel - empresa de telecomunicações vietnamita)
-
Updated AF MOD contract - Jan 2018.exe
-
remove_pw_Reschedule of CISD Regular Meeting.exe
-
Sorchornor_with_PM_-_Sep_2017.exe
-
20170905-Evaluation Table.xls.exe
-
CV_LeHoangThing.doc.exe
(currículos falsos também foram encontrados no Canadá)
Todos esses arquivos têm algo em comum - iniciar um documento de isca protegido por senha. Não está claro se a senha está em algum lugar nos dados da carta transmitida ou se o documento não deve ser aberto.
Instaladores falsos
Vários instaladores falsos que se apresentam como instaladores ou atualizações de software foram vistos em campanhas de watering hole. Um exemplo é o instalador reembalado do Firefox descrito pelo 360 Labs no
Freebuf (em chinês).
Outro exemplo que vimos foi chamado
RobototFontUpdate.exe
. Provavelmente se espalhou por sites comprometidos, mas não temos evidências suficientes disso.
Todos os arquivos descritos, distribuídos por correio ou baixados ao visitar um site comprometido, entregaram o mesmo componente de backdoor. Em uma postagem, analisaremos uma amostra do
RobototFontUpdate.exe
e mostraremos como ele consegue executar uma carga maliciosa no sistema.
Análise técnica
O processo de instalação e execução depende da ofuscação de várias camadas, como criptografia de componentes, reconstrução de arquivos PE, técnicas de carregamento de código de shell e carregamento lateral. Este último foi descrito no
estudo anterior da Koretug da ESET.
Revisão do Progresso
O ataque consiste em duas partes: um conta-gotas e um veículo de lançamento. Cada etapa de cada parte do processo será explicada em detalhes na seção correspondente. Os dois diagramas abaixo dão uma breve idéia do progresso geral do malware.
Figura 1. O progresso do conta-gotas
Figura 2. Progresso da porta traseiraQuase todos esses componentes são ofuscados. A ofuscação é baseada em comandos complementares de transição de pares condicionais. Para cada um dos formulários: JZ / JNZ, JP / JNP, JO / JNO e assim por diante, cada par realiza uma transição para o mesmo objetivo. A sequência é intercalada com código de lixo eletrônico que usa o ponteiro da pilha, mas não altera o valor do sinalizador condicional. Acontece que a transição ocorre dentro do mesmo ramo. Isso leva a problemas durante o processo de descompilação devido ao uso de valores positivos do ponteiro da pilha.
Figura 3. Transição condicional complementarAlém disso, alguns elementos básicos do programa adicionam um endereço à pilha, após o qual terminam em JMP / CALL, enquanto outros elementos básicos adicionam dois endereços e terminam com o comando RET. A adição do segundo item é a função chamada e o primeiro é o endereço do próximo elemento básico do programa em que a transição será feita. Assim, os elementos básicos do programa são criados sem objetos pai.
Figura 4. Técnica PUSH / JMPComo resultado de uma combinação de duas técnicas de ofuscação, são obtidos gráficos "bonitos":
Figura 5. Ofuscando uma sequência de execuçãoPerceber códigos indesejados é bem simples. Pode ser ignorado na análise de amostras, se você conhecer o esquema de aplicação.
Conta-gotas
Etapa 1. Documento de isca
Nos últimos meses, o OceanLotus usou várias iscas. Um deles é um software falso para atualizar a fonte TrueType
Roboto Slab regular
do
Roboto Slab regular
. A escolha de uma fonte parece um pouco estranha, pois não suporta muitos idiomas do leste asiático.
Figura 6. Ícone de atualização da fonte RobototFontUpdateQuando executado, o arquivo binário descriptografa seus recursos (XOR, 128 bytes, chave codificada) e restaura os dados descriptografados (LZMA). Arquivo legítimo RobotoSlab-Regular.ttf
(SHA1:
912895e6bb9e05af3a1e58a1da417e992a71a324
) é gravado na pasta
%temp%
e iniciado usando a função
ShellExecute
API do Win32.
O código do shell decodificado dos recursos é executado. Após a execução, uma atualização de fonte falsa implementa outro aplicativo cujo único objetivo é remover o conta-gotas. Este aplicativo de
%temp%\[0-9].tmp.exe
é
%temp%\[0-9].tmp.exe
como
%temp%\[0-9].tmp.exe
.
Etapa 2. Código do Shell
Em cada estágio, o mesmo código de shell é usado.
O shellcode é um carregador de PE personalizado. Restaura o arquivo executável na memória - descriptografa todas as seções e calcula os movimentos necessários e outros recuos. O
RtlMoveMemory
usa as três funções da API do Windows:
VirtualAlloc
,
RtlMoveMemory
e
RtlZeroMemory
.
A função
RtlZeroMemory
usada para
RtlZeroMemory
campos no cabeçalho do PE. Confiar em um despejo automático de memória falhará, pois os cabeçalhos MZ / PE estão corrompidos.
O código do shell chama a função de logon PE descriptografada e, em seguida, a
DLLEntry
exportação
DLLEntry
.
Etapa 3. O verdadeiro conta-gotas
{103004A5-829C-418E-ACE9-A7615D30E125}.dll
Este executável descriptografa recursos usando o algoritmo AES no modo CBC por meio da API do Windows. A chave codificada possui 256 bits de tamanho. Após a descriptografia, os dados compactados são descomprimidos (algoritmo LZMA).
Se o processo for iniciado com direitos de administrador, o malware fornecerá persistência criando um serviço. Caso contrário, a chave clássica do Registro Executar será usada (
HKCU\SOFTWARE\Microsoft\ Windows\CurrentVersion\Run;DeviceAssociationService;rastlsc.exe
).
Se o código dropper for executado com direitos de administrador, ele tenta gravar os arquivos listados abaixo na pasta
C:\Program Files\Symantec\Symantec Endpoint Protection\12.1.671.4971.104a\DeviceAssociationService\
, se não, grava-os na
%APPDATA%\Symantec\Symantec Endpoint Protection\12.1.671.4971.104a\DeviceAssociationService\
:
-
rastlsc.exe
(SHA1:
2616da1697f7c764ee7fb558887a6a3279861fac
, cópia do aplicativo legítimo Symantec Network Access Control,
dot1xtra.exe
)
-
SyLog.bin
(SHA1:
5689448b4b6260ec9c35f129df8b8f2622c66a45
, backdoor criptografado)
-
rastls.dll
(SHA1:
82e579bd49d69845133c9aa8585f8bd26736437b
, uma DLL maliciosa que o
rastlsc.exe
)
O caminho varia de amostra para amostra, mas o layout é semelhante. Dependendo dos direitos, o malware despeja arquivos em
%ProgramFiles%
ou
%appdata%
. Observamos também:
-
\Symantec\CNG Key Isolation\
-
\Symantec\Connected User Experiences and Telemetry\
-
\Symantec\DevQuery Background Discovery Broker Tasks\
Esses caminhos são usados por vários produtos da Symantec.
Após obter persistência e implementar o arquivo executável, um arquivo legítimo,
rastlsc.exe
, é executado usando
CreateProcessW
.
Também observamos uma versão (
{BB7BDEC9-B59D-492E-A4AF-4C7B1C9E646B}.dll
) que executa o
rastlsc.exe
com o parâmetro
krv
. Discutiremos com mais detalhes abaixo.
Componente backdoor: preenchimento do rastlsc.exe
A equipe do OceanLotus usa uma técnica antiga e conhecida em um dos executáveis do produto Symantec. A linha inferior é usar o processo de carregar uma biblioteca de um arquivo .exe legítimo e assinado, escrevendo uma biblioteca maliciosa na mesma pasta. Isso fará com que o comportamento malicioso pareça legítimo, pois essas ações são executadas enquanto o executável confiável está em execução.
Como mencionado acima, o arquivo legítimo
rastlsc.exe
é redefinido e executado.
Ele importa o arquivo
rastls.dll
, que neste caso tem conteúdo malicioso.
Figura 7. Rastlsc.exe assinado digitalmente da SymantecTambém vimos um preenchimento usando outros executáveis legítimos e assinados, incluindo o
mcoemcpy.exe
da McAfee, que carrega o
McUtil.dll
. Essa técnica foi usada anteriormente pelo PlugX, que atraiu a atenção do
Vietnam CERT (em vietnamita).
Etapa 1. Preenchendo a biblioteca, rastls.dll
O nome interno do arquivo dll é
{7032F494-0562-4422-9C39-14230E095C52}.dll
, mas vimos outras versões, por exemplo,
{5248F13C-85F0-42DF-860D-1723EEAA4F90}.dll
. Todas as funções exportadas levam à execução da mesma função.
Figura 8. Todas as exportações rasltls.dll levam a uma única funçãoExportar tenta ler o arquivo
SyLog.bin
localizado na mesma pasta. Outras versões tentaram abrir o arquivo
OUTLFLTR.DAT
. Se o arquivo existir, ele será descriptografado usando o algoritmo AES no modo CBC com uma chave de 256 bits codificada e os dados compactados recebidos serão descompactados (compactação LZMA).
A variante
McUtil.dll
usa uma técnica diferente. À primeira vista, a função principal não faz nada de mal-intencionado, mas na verdade substitui a seção
.text
do arquivo legítimo
mcoemcpy.exe
, um arquivo binário. Ele gera um código de shell cuja tarefa é chamar uma função para ler o código de shell criptografado do segundo estágio no arquivo
mcscentr.adf
.
O pseudocódigo a seguir é usado para criar o código do shell:
x = False i = 0
buff = genRandom()
opc1 = [0x58,0x59,0x5a,0x5b]
opc2 = [0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57]
opc3 = [0x90,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,
0x49,0x4a,0x4b]
while i < len(buff):
currentChar = buff[i] if currentChar < 0xc8:
buff[i] = opc1[currentChar % len(opc1)]
else:
if x:
buff[i] = opc2[currentChar % len(opc2)]
else:
buff[i] = opc3[currentChar % len(opc3)] x = x == False
i+=1
Abaixo na figura, você pode ver uma lista do resultado do montador:
Figura 9. Código de shell geradoPassos 2–4. Shellcode, lançador e shellcode novamente
O
{E1E4CBED-5690-4749-819D-24FB660DF55F}.dll
descriptografa e baixa a
{E1E4CBED-5690-4749-819D-24FB660DF55F}.dll
. A biblioteca carrega recursos e tenta iniciar o serviço DeviceAssociationService. As informações descriptografadas também contêm um código de shell. O último descriptografa a etapa final: uma porta dos fundos.
A variante
{92BA1818-0119-4F79-874E-E3BF79C355B8}.dll
verifica se
rastlsc.exe
executado com
krv
como o primeiro parâmetro.
rastlsc.exe
caso, uma tarefa é criada e o
rastlsc.exe
é executado novamente, mas sem esse parâmetro.
Etapa 5. Backdoor
{A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll
Primeiro, o malware tenta baixar seus recursos e descriptografá-los usando o algoritmo RC4. Os recursos resultantes contêm dados usados para configurar o backdoor. O formato de configuração não é difícil de encontrar. Usando o Kaitai struct e seu amortecedor de estrutura, obtemos o seguinte:
Figura 10. Estrutura de configuraçãoNota : com exceção da linha domain_encoding_str e da biblioteca httpprov, os dados mudam de amostra para amostra. As chaves do registro são quase as mesmas, mas possuem um esquema semelhante:
\HKCU\SOFTWARE\Classes\AppX[a-f0-9]{32}
, nada de notável.
O programa malicioso recebe os 10 primeiros bytes do nome de usuário (UTF-16), codifica-os com a sequência de três letras
mutex_encoding_str
em UTF-16 e codifica em hexadecimal. O resultado é usado como o nome do mutex. Por exemplo, para um usuário cujo nome começa com
abc
e uma chave na forma de
vwx
, o mutex será
\Sessions\1\BaseNamedObjects\170015001b
.
O backdoor inclui um carregador de PE que carrega a biblioteca
HTTPProv.dll
na memória, chama o ponto de entrada e chama a função de exportação
CreateInstance
.
Comunicação
O backdoor usa o protocolo de comunicação TCP padrão na porta
25123
. Para obter o endereço IP do servidor, o backdoor primeiro cria uma consulta DNS específica.
O programa malicioso seleciona um dos três domínios da configuração e adiciona um subdomínio especial que é gerado usando dois valores. O primeiro valor é o nome do computador com um comprimento de 16 bytes. O segundo é um ID de versão de quatro bytes. O código Python 2 abaixo é um algoritmo de codificação:
letters=domain_encoding_str # “ghijklmnop” hex_pc_name=pc_name.encode(“UTF-16LE”).encode(“hex”) s=''
for c in hex_pc_name:
if 0x2f < ord(c) < 0x3a:
s+=letters[ord(c) - 0x30]
else:
s+=c
Por exemplo, se o nome do computador for
random-pc
e o ID da versão for 0x0a841523, o seguinte domínio será gerado:
niggmhggmeggmkggmfggmdggidggngggmjgg.ijhlokga.dwarduong[.]com
A seguinte expressão regular pode ser usada para rotular o servidor C&C desse backdoor:
[ghijklmnopabcdef]{4-60}\.[ghijklmnopabcdef]{8}\.[az]+\.[az]+
Se o endereço IP pertencer a um domínio específico, o malware tentará estabelecer uma conexão TCP através da porta
25123
. Cada uma das amostras possui três nomes de domínio diferentes que são usados para localizar o servidor C&C.
O processo de comunicação é criptografado via RC4 e compactado usando LZMA. É possível descriptografar o tráfego, pois a chave é adicionada ao início dos pacotes. O formato é o seguinte:
[ RC4 (4 )][ ]
Cada byte de chave é gerado pela função
rand
. Após descriptografar e descompactar o pacote, os dados têm o seguinte formato:
[dw:][dw:][dw: ][dw: ][dw:] [dw:]
Na primeira vez em que o cliente se conecta ao servidor, o UUID é transmitido, que é usado como o identificador da sessão. O último é armazenado na chave do Registro como dados binários:
HKCU\SOFTWARE\Classes\ AppXc52346ec40fb4061ad96be0e6cb7d16a\DefaultIcon
Como dissemos anteriormente, o backdoor também contém uma biblioteca chamada
HTTPprov
. É usado como uma maneira alternativa de se comunicar com o servidor. O arquivo DLL envia uma solicitação POST por HTTP. Ele também suporta HTTPS e proxies usando SOCKS5, SOCKS4a e SOCKS4. A biblioteca está estaticamente vinculada ao
libcurl
.
Após a inicialização, uma entrada do registro será criada - um comando para que o backdoor use ainda o HTTP para se comunicar com o servidor de comando:
HKCU\SOFTWARE\Classes\ CLSID{E3517E26-8E93-458D-A6DF-8030BC80528B}
.
O aplicativo cliente padrão é usado:
Mozilla/4.0 ( ; MSIE 8.0; Windows NT 6.0; Trident/4.0)
.
A principal característica desta biblioteca é um algoritmo de criptografia especial para um identificador universal de recursos. A parte do recurso do URI é criada usando o seguinte pseudocódigo:
buffEnd = ((DWORD)genRand(4) % 20) + 10 + buff; while (buff < buffEnd){
b=genRand(16);
if (b[0] - 0x50 > 0x50)
t=0;
else
*buf++= UPPER(vowels[b[1] % 5]);
v=consonants[b[1]%21]); if (!t)
v=UPPER(v);
*buff++= v;
if (v!='h' && b[2] - 0x50 < 0x50)
*buff++= 'h';
*buff++= vowels[b[4] % 5];
if (b[5] < 0x60)
*buff++= vowels[b[6] % 5];
*buff++= consonants[b[7] % 21];
if (b[8] < 0x50)
*buff++= vowels[b[9] % 5];
*buff++= '-';
};
*buff='\0';
Nota : para maior clareza, a parte responsável pela verificação do comprimento da string foi removida do código.
Para obter o identificador da sequência gerada, dois números são adicionados usando um algoritmo de verificação de soma especial:
checksum=crc32(buff)
num2=(checksum >> 16) + (checksum & 0xffff) * 2
num1=(num2 ^ 1) & 0xf
URL=GENERATED_DOMAIN+ “/” + num1 + “/” + num2 + “-” + buff
Adicionando o gerador de URI da biblioteca
HTTPprov
, obtemos o seguinte URL:
hXXp://niggmhggmeggmkggmfggmdggidggngggmjgg.ijhlokga.aisicoin[.]com/ 13/139756-Ses-Ufali-L
Equipas
Depois de receber o identificador da sessão SESSIONID, o backdoor faz uma impressão digital do sistema. O pacote é construído da seguinte forma (recuo no pacote - descrição):
0x000 - bytes: o valor muda em cada versão
0x001 - 0x01: byte codificado
0x002 - bool: privilégios elevados
0x003 - dword: ID da versão
0x007 - sequência (UTF-16), nome do computador (máx. 0x20)
0x027 - sequência (UTF-16), nome de usuário
0x079 - o resultado de uma consulta do registro nos valores
HKLM\SOFTWARE\Microsoft\Windows NT\ CurrentVersion
:
ProductName
,
CSDVersion
,
CurrentVersion
,
ReleaseId
,
CurrentBuildNumber
e o resultado da chamada
IsWow64Process (x86|x64)
0x179 - o formato subsequente da sequência% s (% s); substituído por (
GetVolumeInformationW:VolumeNameBuffer
),
VolumePathNames
0x279 - Disco físico, controle de E / S de um dispositivo PhysicalDriveIOControl 0x2D1400 (IOCTL_STORAGE_QUERY_ PROPERTY) (VolSerialNumber)
0x379 -
wmi SELECT SerialNumber FROM Win32_BaseBoard
0x3f9 - Obtenha a data e hora atuais GetSystemTimeAsFileTime
0x400 - bool: desconhecido
0x401 - dword: recebido após descriptografar o recurso
Aqui está um exemplo de uma impressão digital do sistema:
Figura 11. Impressão digital do sistemaEste é um backdoor completo que fornece a seus operadores vários recursos: manipulação de arquivos, registro e processos, download de componentes adicionais, obtenção de uma impressão digital digital do sistema. Abaixo estão os números e descrições dos comandos suportados:
0 - impressão digital
1 - define o ID da sessão
2 - criando um processo e obtendo um resultado (usando canais de programa)
3 - define o contador de tentativas de conexão
4 - adia o tempo de votação
5 - lê um arquivo ou chave do registro e considera MD5
6 - criando um processo
7 - cria um arquivo, entrada do registro ou fluxo na memória
8 - grava no registro
9 - pesquisa o registro
10 - procura por arquivos no sistema
11 - transfere arquivos para outro diretório
12 - remove arquivos do disco
13 - obtendo uma lista de discos marcados no sistema usando a função
GetLogicalDriveStringW
14 - cria um diretório
15 - remove o diretório
16 - lê o arquivo do deslocamento
17 - chama o carregador PE (alterne para comunicação via
HTTPprov
)
18 - [desconhecido]
19 - 0: pesquisando o valor no registro; 1: implementação e implementação do programa
20 - define a variável de ambiente
21 - lança shellcode em um novo thread
22 - retorna a variável de ambiente
23 na nova versão - reinicia-se se a variável de ambiente APPL não existir
Conclusão
O OceanLotus permanece altamente ativo e continua a atualizar o kit de ferramentas.
O grupo busca ocultar suas atividades, para isso os atacantes selecionam cuidadosamente as vítimas, limitam a disseminação de malware, usam vários servidores para não chamar a atenção para o mesmo domínio ou endereço IP. A descriptografia do componente que está sendo implementado e a técnica de carregamento lateral, apesar de sua ampla popularidade, tornam possível evitar a detecção, uma vez que o trabalho dos invasores, neste caso, é disfarçado de aplicativo legítimo.
Indicadores de compromisso (IoCs)
Amostras
Tabela 1: conta-gotas

Tabela 2: Bibliotecas

Rede
Endereços IP
46.183.220.81
46.183.220.82
46.183.222.82
46.183.222.83
46.183.222.84
46.183.223.106
46.183.223.107
74.121.190.130
74.121.190.150
79.143.87.230