OceanLotus: novo backdoor, esquemas antigos

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 traseira

Quase 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 complementar

Alé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 / JMP

Como 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ção

Perceber 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 RobototFontUpdate

Quando 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 Symantec

També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ção

Exportar 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 gerado

Passos 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ção

Nota : 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 sistema

Este é 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

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


All Articles