Operação TA505, parte quatro. Gêmeos



Continuamos a falar sobre as atividades do grupo de hackers TA505. A conhecida frase “o novo é o velho esquecido” é a mais adequada como epígrafe para o próximo capítulo da história sobre o grupo TA505. É verdade que desta vez o "velho" não é tanto "esquecido", como é retrabalhado e aprimorado.

No início de setembro, descobrimos vários downloaders maliciosos fornecidos com um PE-packer de grupo especial, sobre o qual escrevemos anteriormente . À primeira vista, pareciam os bem conhecidos estagiários de backdoor FlawedAmmyy. Mas uma análise mais profunda mostrou que não é assim. As técnicas mais avançadas para escrever código não nos levaram a cargas radicalmente opostas em termos de qualidade de execução.

Neste artigo, examinaremos mais de perto as ferramentas encontradas e traçaremos paralelos com o que já é conhecido.

Carregador de inicialização twein


Primeiro, o seguinte é curioso: de todas as amostras do gerenciador de inicialização que conseguimos coletar, apenas uma possui uma assinatura digital:



Fig. 1. Assinatura digital do gerenciador de inicialização

Certificado emitido em nome de PEAR SOLUTIONS LTD. A propósito, não é a primeira vez que um grupo assina suas ferramentas, passando-as como um software legítimo de organizações fictícias. Aqui estão alguns outros nomes que usaram o TA505 para outras famílias de malware:

  • ET HOMES LTD,
  • FIT AND FLEX LIMITED,
  • MISHA LONDON LTD,
  • SATOJI KAIDA MB,
  • MUITO TELE LIMITADO.

Como os gerenciadores de inicialização detectados não diferem entre si, selecionamos o assinado acima e nos detemos com mais detalhes.

Durante todo o trabalho do malware, quase todas as ações são acompanhadas da gravação no arquivo de log e na saída de depuração de tudo o que acontece:



Fig. 2. Saída e registro de depuração

Esse rastreamento não apenas simplifica a análise estática do arquivo, mas também ajuda a descobrir o que há de errado nos sistemas de análise dinâmica:



Fig. 3. Saída de depuração no analisador online ANY.RUN

Troyan verifica o layout do idioma do teclado - e não funciona na Rússia e nos países vizinhos:



Fig. 4. Verificando o layout do idioma do teclado
Em seguida, ele cria o mutex Global\system32_mutant_service e verifica a disponibilidade da Internet usando uma solicitação HTTP GET para google.com. Depois disso, determina a maneira de acessar a rede (endereço dedicado ou NAT ), determinando o endereço IP externo pelos serviços myexternalip.com, ipecho.net e ifconfig.me e comparando o valor obtido com o especificado nos parâmetros de rede do sistema:



Fig. 5. Comparação de endereços IP internos e externos

Em seguida, o malware determina a versão da biblioteca %SystemRoot%\system32\crypt32.dll e, se o número da compilação e o número da revisão forem menores que 7601 e 18741 respectivamente, baixa e instala a atualização KB3033929 acordo com a versão do sistema operacional:



Fig. 6. Baixe e instale atualizações do sistema

Os atacantes do TA505 cuidam da vítima e corrigem o sistema conforme necessário? Nem um pouco. A instalação da atualização está associada ao término do suporte para certificados de segurança de código assinado usando o SHA-1 e seu abandono em favor do algoritmo SHA-2. Provavelmente, os hackers já tiveram dificuldade em executar cargas úteis assinadas em sistemas não atualizados. Curiosamente, depois de instalar a atualização, o trojan envia o log de ações gerado ao servidor de gerenciamento, interrompe seu trabalho e se limpa, limpando os traços restantes.



Fig. 7. Desligar após instalar uma atualização do sistema

Se a instalação da atualização não for necessária, o carregador de inicialização coleta e envia as seguintes informações ao servidor de gerenciamento:

  • informações do sistema
  • informações sobre o software instalado,
  • informações sobre software assinado nos diretórios% ProgramFiles% e% ProgramFiles (x86)% (se houver),
  • Informações sobre drivers assinados no diretório% SystemRoot% \ drivers.

Observe que um código legítimo foi usado para obter informações sobre assinaturas.



Fig. 8. Obtendo informações do certificado

Depois disso, o carregador de inicialização cria o diretório C:\Windows\Logs\diag e inicia um encadeamento no qual rastreia as alterações no diretório, enviando notificações para o servidor de gerenciamento:



Fig. 9. Monitorando Alterações no Diretório

Em seguida, prepara as informações existentes e ausentes sobre o sistema (nome de usuário, versão do sistema, domínio, endereço IP, informações sobre a placa de vídeo, conexão de rede - NAT ou não NAT) e gera um arquivo JSON desse tipo:

 { "adm": "0", "bid": "M3xwwhqLH/AUOhmU2+W55A==", "bit": "1", "bnet": "ldr", "cam": "0", "cis": "0", "dmn": "WORKGROUP", "hash_r": "0", "lip": "192.168.100.153", "lvl": "0", "nat": "1", "osb": "0", "osv": "Windows 7 Professional", "pc": "USER-PC", "proc_c": "0", "proc_n": "cpu", "rep": 0, "tmt": "0", "ver": "163", "video": "Standard VGA Graphics Adapter," } 

Posteriormente, esses dados serão criptografados com RC4 (a chave de criptografia gJypA9RWUlYpnBbzujVqE6fDcEAk0zoz é criptografada no corpo do Trojan), codificada com Base64 e enviada por uma solicitação HTTP POST ao servidor de gerenciamento:



Fig. 10. Solicitação HTTP POST para o servidor de gerenciamento



Fig. 11. A lista de servidores de controle no gerenciador de inicialização

A resposta do servidor é descriptografada pelo RC4 (a chave de criptografia é a mesma usada para enviar os dados) e verificada: os dois primeiros bytes devem corresponder à linha MZ, que é um sinal do arquivo PE. Já conhecemos essa sequência anteriormente quando analisamos outro carregador de grupo que entregou o FlawedAmmyy RAT:



Fig. 12. Um código semelhante para descriptografar e verificar o arquivo baixado do gerenciador de inicialização em questão (à esquerda) e do gerenciador de inicialização FlawedAmmyy RAT (à direita)

O carregamento da carga útil ocorre não apenas no encadeamento principal, mas também em um criado separadamente. Em outras palavras, existem duas cargas úteis. Em um caso, o mutex Global \ system32_host_service é pré-verificado e, no caso de sua ausência, um componente é carregado, que é referido nas informações de depuração como carga útil ou bot. Curiosamente, após receber uma resposta do servidor, o arquivo PE não inicia de forma alguma. Em vez disso, seu corpo é gravado no registro na seção HKEY_LOCAL_MACHINE\SYSTEM na chave 0x228028 . Em seguida, o carregador de inicialização desativa o redirecionamento do sistema de arquivos WoW64 para aplicativos de 32 bits usando Wow64DisableWow64FsRedirection e inicia o processo %SystemRoot%\System32\services.exe com o parâmetro -ww. O uso desse parâmetro não faz sentido, mas isso completa a cadeia de instalação da carga útil resultante.



Fig. 13. Definindo a carga útil

Falaremos sobre a segunda carga útil mais tarde.

Plugins Twein


Examinando o Trojan discutido acima, notamos uma função que remove dois arquivos do diretório %SystemRoot% - twein_32.dll e twein_64.dll :



Fig. 14. Removendo os arquivos twein_32.dll e twein_64.dll

Esses arquivos não são encontrados em nenhum outro lugar, eles não aparecem na lógica do carregador de inicialização. No entanto, os nomes das bibliotecas nos lembraram outro grupo de malware, que consideraremos agora.
Dois meses antes, encontramos um Trojan do grupo TA505, com aproximadamente 9 MB de tamanho. O arquivo é empacotado pelo UPX . O cavalo de Troia é instalado no sistema como um serviço WMDICToss . Os recursos contêm três arquivos: systemdiron.bat , twein__32.dll e twein__64.dll , criptografados com o XOR linear.



Fig. 15. Descriptografia de um dos recursos do conta-gotas

Observe que os nomes dos dois arquivos quase coincidem com os já mencionados anteriormente: a diferença está apenas no número de sublinhados.

Espera-se que um dos recursos descriptografados com o nome systemdiron.bat seja um script de comando que forneça o lançamento de outros componentes, dependendo da capacidade do sistema:

 @echo off if defined PROCESSOR_ARCHITEW6432 (goto LABEL_X64) if %PROCESSOR_ARCHITECTURE%==IA64 (goto LABEL_X64) if %PROCESSOR_ARCHITECTURE%==AMD64 (goto LABEL_X64) if %PROCESSOR_ARCHITECTURE%==x86 (goto LABEL_X86) goto LABEL_NON :LABEL_X64 echo OS type: x64 copy c:\temp\tmp.log c:\i.txt rundll32.exe C:\Windows\twein__64.dll,Install copy c:\temp\tmp.log c:\i.txt rundll32.exe C:\Windows\twein__32.dll,Install del c:\temp\tmp.log del c:\i.txt shutdown.exe -r -t 00 goto LABEL_END :LABEL_X86 echo OS type: x86 copy c:\temp\tmp.log c:\i.txt rundll32.exe C:\Windows\twein__32.dll,Install del c:\temp\tmp.log del c:\i.txt shutdown.exe -r -t 00 goto LABEL_END :LABEL_NON echo OS type: undefined goto LABEL_END :LABEL_END pause 

Ambas as bibliotecas twein agem de maneira semelhante. Embalado com o empacotador característico do grupo TA505. Nomes originais da biblioteca: av_block.dll . A análise é significativamente complicada pelo uso de um ofuscador, e a proporção de código ofuscado é de cerca de 80%. Como resultado, a execução do programa é saturada com inúmeras transições, decodificação das próximas etapas do código, chamadas de função não lineares.

As bibliotecas contêm uma lista impressionante de cadeias do tipo Base64, descriptografadas da seguinte maneira:

1. A sequência de entrada é dividida em blocos de 4 bytes;
2. Cada bloco é decodificado usando o algoritmo de substituição e deslocamento:

 import binascii def block_decode(input_str, len_of_block): alphabet = '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3E\x00\x00\x00\x3F\x34\x35\x36\x37\x38\x39\x3A\x3B\x3C\x3D\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x00\x00\x00\x00\x00\x00\x1A\x1B\x1C\x1D\x1E\x1F\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F\x30\x31\x32\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' int_result = 0 for i in range(len_of_block): alph = ord(alphabet[ord(input_str[i])]) alph <<= 0x6 * i int_result += alph str_result = hex(int_result)[2:] if len(str_result) % 2 != 0: str_result = '0' + str_result return binascii.unhexlify(str_result).decode('latin1')[::-1] 


3) os blocos são coletados em uma única linha;
4) o resultado é descriptografado pelo algoritmo eexec com uma chave de byte duplo, passado como parâmetro:



Fig. 16. Implementação do algoritmo eexec

A maioria das linhas são os nomes e caminhos dos arquivos dos produtos antivírus, no entanto, alguns deles não pertencem a ferramentas de segurança: MS Exchange Server, MySQL Server, SAP, Apache, PostgreSQL, Elasticsearch, etc. Havia até mesmo caminhos únicos:

  • C: \ Users \ tislam \ Desktop \ aplicativo salik \ Aye_salik_data \ Aye_salik_data \ bin \ Debug \ Aye_salik_data.exe
  • C: \ oem13c \ agent13c \ agent_13.2.0.0.0 \ perl \ bin \ perl.exe
  • C: \ Usuários \ adadmin \ Ubiquiti UniFi \ bin \ mongod.exe
  • C: \ Usuários \ sakella \ AppData \ Local \ Microsoft \ OneDrive \ OneDrive.exe
  • Teste D: \ Add-ons \ IMI_CREDIT_POLICY v 02.01 \ IMI_CREDIT_POLICY.exe

Se um software for encontrado no sistema a partir da lista, os arquivos e diretórios serão excluídos.

Para se protegerem no sistema, as bibliotecas se definem como a interface do Windows Sockets Service Provider (SPI), denominada Intel e IntelFiltr. Além disso, eles alteram a ordem dos manipuladores na cadeia de protocolos para serem o primeiro SPI a manipular a solicitação do cliente.

Em 2015, nossos colegas FireEye introduziram a análise de bot LatentBot . É curioso que o algoritmo de criptografia de string no LatentBot e as bibliotecas twein revisadas sejam completamente iguais. Além disso, o LatentBot usa um módulo de segurança como um dos plug-ins, que procura ferramentas de segurança no sistema usando os caminhos e nomes de produtos especificados, embora esteja limitado a verificar a disponibilidade.

Rootkit twein


De volta ao gerenciador de inicialização, ou seja, a segunda carga útil. Nas linhas de depuração da tentativa de abrir o rootkit ... e o Driver% S instalado, é fácil adivinhar o formato da próxima carga útil. Após o carregamento bem-sucedido, o driver será gravado no %SystemRoot%\System32\drivers com um nome formado de maneira pseudo-aleatória a partir dos nomes de outros arquivos legítimos. Em seguida, o serviço será criado e lançado:



Fig. 17. Instalando e iniciando o serviço

Na fase final de seu trabalho, o carregador configurará o driver para ser incluído na lista negra nas chaves do Registro: os nomes dos processos antivírus, ferramentas de análise e fornecedores de proteção nas assinaturas de arquivos digitais serão inseridos nos valores numéricos especificados das chaves da ramificação HKEY_LOCAL_MACHINE\SYSTEM :



Fig. 18. configuração do driver na lista negra

No processo de pesquisa do gerenciador de inicialização, não conseguimos obter uma amostra de driver do servidor de gerenciamento. No entanto, descobrimos a menção de um rootkit que foi implementado por outro gerenciador de inicialização semelhante.

O driver é assinado digitalmente em nome da Lizas Limited com administrator@lizaslimited.site como email:



Fig. 19. driver assinado digitalmente

Durante a pesquisa, encontramos muito em comum com o conhecido rootkit da botnet Necurs, que foi usado ativamente pelo grupo TA505 para enviar spam e espalhar malware. Vamos considerar com mais detalhes as características mais interessantes de seu trabalho.

O driver registra manipuladores de eventos para iniciar processos e carregar imagens de PE usando PsSetCreateProcessNotifyRoutine e PsSetLoadImageNotifyRoutine . Em outras palavras, isso permite que o driver controle o lançamento de todos os novos processos e serviços. Usando as listas negras mencionadas anteriormente, o rootkit finaliza processos indesejados com o ZwTerminateProcess e impede que outros drivers potencialmente perigosos sejam carregados, substituindo o valor do ponto de entrada nas instruções:

 mov eax, 0C0000001 retn 8 

Como resultado, o serviço será descarregado com o erro STATUS_UNSUCCESSFULL .



Fig. 20. Conclusão do processo



Fig. 21. Substituindo pontos de entrada do driver

Por meio de CmRegisterCallback, o driver intercepta eventos de acesso ao registro do sistema. Em particular, seu trabalho adicional é parametrizado pelos valores numéricos das chaves que são acessadas em eventos interceptados.



Fig. 22. Gerenciamento de rootkits de acessos à chave do Registro

Curiosamente, em algumas versões do rootkit Necurs, os mesmos valores numéricos foram usados ​​como códigos de solicitação ioctl.



Fig. 23. Gerenciando um rootkit Necurs usando consultas ioctl

Esse truque pode ser considerado um passo em direção a um maior sigilo: o acesso ao registro causa menos suspeitas do que as solicitações ioctl para DeviceObject.

O corpo do rootkit contém uma biblioteca DLL auxiliar criptografada com XOR de byte único. Ao criar um novo processo, o driver injeta a biblioteca junto com outro arquivo PE, que é extraído do registro e descriptografado novamente com um XOR de um byte.



Fig. 24. Descriptografia e injeção da biblioteca auxiliar no processo criado

O componente auxiliar é um carregador reflexivo personalizado que coloca corretamente o segundo arquivo PE na memória, que atua como uma carga útil, e transfere o controle para ele. Agora fica claro como exatamente a carga útil que foi gravada no registro pelo gerenciador de inicialização da primeira parte do artigo começa a funcionar.



Fig. 25. Preenchendo a Tabela de Importação com uma Biblioteca Auxiliar

Conclusão


No artigo, nos familiarizamos com as características do trabalho de muitos trojans gêmeos. Por que gêmeos? O gerenciador de inicialização mal-intencionado com o qual iniciamos nossa pesquisa é muito semelhante ao conhecido gerenciador de inicialização backdoor FlawedAmmyy na qualidade da escrita de código e das nuances de implementação. As bibliotecas twein que ele está tentando remover do sistema provavelmente são as que examinaremos a seguir. As bibliotecas são muito semelhantes ao plug-in de segurança LatentBot. Uma das cargas úteis do carregador de inicialização é um driver derivado do popular rootkit Necurs.

Algumas famílias de malware têm mais de 5 anos; no entanto, os invasores continuam a atualizá-las e melhorá-las, levando em consideração o desenvolvimento de sistemas operacionais e ferramentas de segurança.

Autores : Alexey Vishnyakov e Daniil Koloskov, Positive Technologies

COI
a28a54abc30805cc6ea2ce0732989287 - Carregador de inicialização Twein
f6b6526b8d494dce14568e3703368432 - conta-gotas do plugin twein
983dd279722154a12093410067fe070e - rootkit Twein

Artigos anteriores da série:


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


All Articles