O Platinum é um dos atores APT mais avançados tecnologicamente, com foco tradicional na região APAC. Durante uma análise recente, descobrimos o Platinum usando um novo backdoor que chamamos de Titanium (nomeado após uma senha de um dos arquivos auto-executáveis). O titânio é o resultado final de uma sequência de etapas de descarte, download e instalação. O malware oculta a cada passo imitando o software comum (relacionado à proteção, software de drivers de som, ferramentas de criação de vídeo em DVD).
Vitimologia
Durante nossa pesquisa, descobrimos que os principais alvos desta campanha estavam localizados no sul e sudeste da Ásia.
Introdução
O Titanium APT inclui uma sequência complexa de estágios de descarte, download e instalação, com a implantação de um Trojan-backdoor como etapa final. Quase todos os níveis do sistema imitam software conhecido, como software de segurança, software para gravação de vídeos em DVD, software de drivers de som etc.
Em todos os casos, a distribuição padrão é:
- uma exploração capaz de executar código como um usuário do SYSTEM
- um código de shell para baixar o próximo downloader
- um downloader para baixar um arquivo SFX que contém um script de instalação de tarefas do Windows
- um arquivo SFX protegido por senha com um instalador de Trojan-backdoor
- um script de instalação (ps1)
- uma DLL de objeto COM (um carregador)
- o próprio Trojan-backdoor
Vetor de infecção
Acreditamos que o Titanium APT usa sites da intranet local com um código malicioso para começar a se espalhar.
1 – Shellcode
Outra maneira conhecida de espalhar é o uso de um código de shell que precisa ser injetado em um processo. Nesse caso, era winlogon.exe. Infelizmente, não sabemos como o código de shell foi injetado. Veja a descrição do código do shell abaixo.
2 – DLLs de invólucro
Os invasores fazem uso ativo de vários tipos de ‘ invólucros’ . Cada wrapper geralmente é uma DLL COM, com as funções exportadas correspondentes. O principal objetivo dessas bibliotecas é descriptografar e carregar um arquivo criptografado (anteriormente descartado em algum lugar) na memória do sistema (uma carga) e, em seguida, redirecionar as chamadas para o wrapper em si para as funções exportadas da carga.
Outro tipo de DLL de invólucro é projetado para obter uma linha de comando do argumento de função exportado passado por um chamador e criar um novo processo.
3 – Instalador de tarefas do Windows (arquivo SFX)
Este é um arquivo SFX criptografado por senha que pode ser baixado via BITS Downloader. A senha é codificada permanentemente no downloader usado para descriptografar o arquivo SFX usando o argumento da linha de comando -p.
A principal característica deste arquivo é que ele contém o código executável cURL, compilado em uma DLL. Seu objetivo é instalar a tarefa do Windows para estabelecer persistência no sistema infectado.
4 – Instalador de Trojan-Backdoor (arquivo SFX)
O próprio backdoor usa um arquivo SFX que deve ser iniciado a partir da linha de comando usando uma senha para descompactá-lo. Todos os exemplos de caminhos aqui e ali serão para o software de criação de DVD. No entanto, essas notas também podem ser aplicadas a quaisquer outros caminhos de software conhecidos.
5 – BITS Downloader
Este componente é usado para baixar arquivos criptografados do servidor C&C, descriptografar e iniciá-los.
Descrição do código de shell
O próprio código de shell contém código independente da posição e não requer bibliotecas carregadas anteriormente (exceto Kernel32.dll). Seu único objetivo é conectar-se ao endereço C&C codificado, baixar uma carga criptografada (o arquivo SFX protegido por senha) e depois descriptografá-lo e iniciá-lo usando a senha de descompactação codificada. A linha de comando usual é:
1 | “rundll32 “$temp\IOZwXLeM023.tmp”,GetVersionInfo -t 06xwsrdrub2i84n6map3li3vz3h9bh4vfgcw” |
Descrição do BITS Downloader
O BITS Downloader é um arquivo DLL que possui apenas uma função exportada: GetVersionInfoA. O principal objetivo desta biblioteca é fazer o download de arquivos criptografados do C&C e iniciá-los.
Sequência de execução
A primeira coisa que o downloader faz é verificar se foi iniciado usando o usuário SYSTEM. Se fosse, ele lança argumentos de linha de comando (que foram passados para o binário carregado pela DLL do downloader) usando o WMI.
Se não foi iniciado com o usuário SYSTEM, o downloader passa os argumentos da linha de comando para o analisador de argumentos.
Analisador de argumento
Chave | Descrição do parâmetro |
-ondulação | Especifica um endereço de URL para o qual as informações do sistema serão enviadas. |
-t STRING | Uma sequência adicional que será anexada a uma sequência de solicitação no C&C |
-u URL | URL de confirmação em que o downloader envia várias confirmações ou solicita dados. Possível construir em dois URLs de confirmação adicionais |
-br GUID | Interrompa o download de uma carga útil. O parâmetro GUID deve fornecer uma GUID da tarefa de download |
Se um desses parâmetros existir, o downloader coletará informações sobre produtos antivírus instalados e as enviará para a C&C.
Depois disso, ele envia a solicitação de download para o URL de confirmação. Em resposta, o C&C envia um arquivo que será baixado no diretório% USERPROFILE%.
Para descriptografar o arquivo baixado, o downloader usa um hash MD5 da chave de criptografia das strings.
Solicitação de URL de confirmação e download de arquivo
URL padrão (codificado): http://70.39.115.196/payment/confirm.gif
A solicitação é uma sequência como:
- http://70.39.115.196/payment/confirm.gif?f=1 (x86)
- http://70.39.115.196/payment/confirm.gif?f=2 (x64)
Descriptografia e lançamento da carga útil
Esta é a estrutura do arquivo criptografado:
123456789 | typedef struct { byte hash[16]; // md5 hash of the following data dword data_size; byte data[data_size]; } enc_data; |
O downloader verifica o campo de hash em relação a um MD5 calculado do hash do campo de dados e, se o hash estiver correto, executa as seguintes ações:
- Anexa uma extensão (DLL ou EXE, dependendo do tipo de dados)
- Armazena o arquivo baixado na pasta% TMP% usando o nome % (SystemTimeAsFileTime.dwLowDateTime).% TMP
Em seguida, o downloader especifica uma linha de comando para iniciar o arquivo baixado. Se o arquivo for uma DLL, a linha de comando final será:
1 | “%systemroot%\system32\rundll32.exe %(SystemTimeAsFileTime.dwLowDateTime)%.TMP,-peuwewh383eg -t 06xwsrdrub2i84n6map3li3vz3h9bh4vfgcw” |
Se o arquivo for um arquivo EXE:
1 | %(SystemTimeAsFileTime.dwLowDateTime)%.TMP -peuwewh383eg -t 06xwsrdrub2i84n6map3li3vz3h9bh4vfgcw |
Depois disso, o downloader se exclui usando a seguinte linha de comando:
1 | /c for /L %i in (1,1,100) do ( for /L %k in (1,1,100) do (del /f /q module_path > NUL & if not exist module_path exit /b 0)) |
Lançamento de arquivo
Para iniciar o arquivo baixado, o downloader usa as classes WMI Win32_ProcessStartup, Win32_Process e seus métodos e campos.
Download de arquivo usando o BITS
Para baixar um arquivo, o downloader usa o serviço BITS e sua interface COM, chamada IBackgroundCopyManager.
Ele cria uma tarefa com o nome Microsoft Download e especifica caminhos e tempos limites remotos e locais de arquivos.
Instalação de tarefas do Windows (arquivo SFX com cURL)
Contém:
Nome | Descrição |
p.bat | Lança scripts ps1 cURL e ofuscados |
c.dll | executável cURL compilado como uma DLL (7.50.3) |
f1.ps1 | Será executado após a primeira solicitação ao C&C; descriptografa x.dat |
f2.ps1 | Será executado após a segunda solicitação ao C&C; descriptografa b.dat |
e.ps1 | Contém código que calcula uma sequência para o campo Autorização do cabeçalho HTTP |
h.ps1 | Obtém informações sobre as configurações de proxy do sistema |
e.dll | Um arquivo DLL com uma única função exportada; chama CreateProcessA |
Faz o download:
Arquivo fonte | Arquivo baixado e descriptografado | Descrição |
x.dat | u.xml | Arquivo criptografado em AES (consulte f1.ps1 para o algoritmo de descriptografia) |
b.dat | i.bat | Arquivo criptografado em AES (o mesmo algoritmo de descriptografia) |
O resultado:
Nome | Descrição |
i.bat | Executa a instalação de tarefas do Windows |
Quando um chamador (etapa anterior) executa esse arquivo, ele deve especificar dois argumentos:
Argumento | Descrição |
-pKEY | Argumento com uma chave para descompactar o arquivo SFX |
-t ACCEPTANCE_ID_STRING | Argumento com uma sequência longa – AcceptanceID (usado em solicitações ao C&C) |
p.bat
Ele inicia o script h.ps1 para obter informações sobre as configurações de proxy em todo o sistema. Depois disso, ele lança o script e.ps1 para calcular o SystemID que será usado nas solicitações ao C&C.
Para enviar uma solicitação, ele usa c.dll (que é cURL e tem uma função exportada chamada DllGetClassObject).
Pedido 1
Argumentos da linha de comando:
Onde:
Parâmetro | Descrição |
% pp% | Proxy em todo o sistema |
%resultado% | SystemID |
% p3% | AcceptanceID |
Essa solicitação baixa o arquivo x.dat e o script f1.ps1 o descriptografa em u.xml. Depois disso, lança a próxima solicitação.
Pedido 2
Argumentos da linha de comando:
Ele baixa o arquivo b.dat e o script f2.ps1 o descriptografa no i.bat (usando o mesmo algoritmo de descriptografia).
Instalação de tarefas
Depois disso, ele lança a seguinte linha de comando para instalar a tarefa de persistência:
O arquivo i.bat usa o arquivo u.xml descriptografado anteriormente como a descrição da tarefa.
Instalador de Trojan-backdoor
O arquivo descompacta seus arquivos na seguinte pasta (no caso do software de criação de DVD):
O arquivo em si contém:
Nome | Descrição |
BabyBoyStyleBackground.wmv | Dados de configuração |
DvDupdate.dll | Carregador de Trojan-backdoor |
nav_downarrow.png | Trojan-backdoor |
psinstrc.ps1 | Script de instalação do carregador |
No caso do software de drivers de áudio , ele difere apenas no método de instalação em comparação ao software de criação de DVD : o script ps1 usa dois CLSIDs conhecidos para substituir os caminhos COM DLL por outros maliciosos.
psinstrc.ps1
Este é o script do instalador que registra o DvDupdate.dll como o serviço ‘DVDMaker Help’ e define seu ponto de entrada como o nome DllGetClassObject . Requer privilégios de administrador para ser executado corretamente.
O script contém parâmetros configuráveis, portanto, é fácil alterar qualquer um dos parâmetros necessários para diferentes sistemas.
Há duas maneiras de instalar o carregador:
- Serviço do sistema, com a função exportada DllGetClassObject como a função ServiceMain
- Objeto COM, substituindo um caminho de registro CLSID existente por seu próprio
DvDupdate.dll
Esta é uma DLL de serviço, mas com as mesmas exportações que você esperaria de um objeto COM. Basicamente, é um carregador de carga útil.
Todo o código é ofuscado com diferentes chamadas e loops da API do Windows. Ele não foi projetado para confundir um engenheiro reverso ou dificultar a engenharia reversa, mas para contornar alguns mecanismos simples de emulação AV.
A primeira função exportada para cada objeto COM é DllGetClassObject .
DllGetClassObject
O carregador cria um encadeamento que descriptografa a carga útil, restaura seus cabeçalhos PE e MZ e, em seguida, carrega-o na memória e o lança. A carga útil é criptografada com o AES 256 CBC. A chave de descriptografia é codificada juntamente com outras seqüências criptografadas. Ele não contém as tags ‘ MZ ‘ e ‘ PE ‘ que permitem ignorar os simples mecanismos AV. Após inicializar a carga, o carregador chama sua função com o ordinal 1.
nav_downarrow.png
A carga útil, com funcionalidade de backdoor, é um arquivo DLL. A funcionalidade do malware está apenas na primeira entrada exportada.
nav_downarrow.png – Ordinal 1 (função principal do Trojan-backdoor)
A primeira coisa que faz é descriptografar o outro binário criptografado (contendo dados de configuração) do conteúdo do SFX:
A configuração em si é dividida em blocos, e cada bloco tem seu próprio índice. A carga útil usa esses índices para obter um item específico. A configuração contém:
- o endereço C&C
- chave de criptografia de tráfego
- a sequência UserAgent
- outros parâmetros menos importantes
Thread de execução
O encadeamento de execução é responsável por receber comandos do servidor C&C e enviar respostas. Ele contém um loop de execução que começa lendo o item de configuração # 00 para obter o endereço C&C.
Inicializando a comunicação C&C
Para inicializar a conexão com o C&C, a carga envia uma solicitação codificada em base64 que contém um SystemID exclusivo, nome do computador e número de série do disco rígido. Depois disso, o malware começa a receber comandos.
Recebendo comandos
Para receber comandos do C&C, a carga útil envia uma solicitação vazia ao C&C. Ele usa a sequência UserAgent da configuração e um algoritmo especial de geração de cookie para preparar uma solicitação. O malware também pode obter configurações de proxy no Internet Explorer .
Em resposta a essa solicitação, o C&C responde com um arquivo PNG que contém dados esteganograficamente ocultos. Esses dados são criptografados com a mesma chave que as solicitações de C&C. Os dados descriptografados contêm comandos e argumentos de backdoor para eles.
Exemplos de arquivos PNG:
Processador de comando C&C (descrições de comando)
O backdoor pode aceitar muitos comandos diferentes, sendo os seguintes os mais interessantes:
- Leia qualquer arquivo de um sistema de arquivos e envie-o para o C&C
- Solte ou exclua um arquivo no sistema de arquivos
- Solte um arquivo e execute-o
- Execute uma linha de comando e envie os resultados da execução para o C&C
- Atualizar parâmetros de configuração (exceto a chave de criptografia AES)
- Modo interativo – permite ao invasor receber informações dos programas do console e enviar sua saída para o C&C
Conclusões
O Titanium APT possui um esquema de infiltração muito complicado. Envolve várias etapas e requer uma boa coordenação entre todas elas. Além disso, nenhum dos arquivos no sistema de arquivos pode ser detectado como malicioso devido ao uso de criptografia e tecnologias sem arquivo. Outro recurso que dificulta a detecção é a imitação de software conhecido.
Em relação à atividade da campanha, não detectamos nenhuma atividade atual relacionada ao Titanium APT.
FONTE: Kaspersky