OceanLotus: atualização de Malvari para macOS

Em março de 2019, o VirusTotal, um popular serviço de verificação on-line, enviou uma nova amostra de malware para o macOS do cibergrupo OceanLotus. O arquivo executável de backdoor possui os mesmos recursos da versão anterior do malvari que estudamos para o macOS, mas sua estrutura foi alterada e ficou mais difícil de detectar. Infelizmente, não conseguimos encontrar o conta-gotas associado a esta amostra, portanto ainda não conhecemos o vetor de infecção.

Recentemente, publicamos um post sobre o OceanLotus e como os operadores tentam garantir persistência, acelerar a execução do código e minimizar traços de presença nos sistemas Windows. Também é sabido que esse grupo cibernético tem um componente para o macOS. Esta postagem descreve em detalhes as alterações na versão mais recente do Malware para macOS em comparação com a versão anterior ( descrita pela Trend Micro ), bem como como a análise pode automatizar a descriptografia de cadeias usando a API IDA Hex-Rays.


Análise


As três partes a seguir descrevem a análise de amostra com o hash SHA-1 E615632C9998E4D3E5ACD8851864ED09B02C77D2 . O arquivo é chamado flashlightd ; os produtos antivírus da ESET o detectam como OSX / OceanLotus.D.

Proteção anti-depuração e sandbox


Como todos os binários do OceanLotus macOS, a amostra é empacotada com UPX, mas a maioria das ferramentas de identificação de empacotador não a reconhece como tal. Provavelmente porque eles contêm principalmente uma assinatura, dependendo da presença da string "UPX", além disso, as assinaturas de Mach-O são menos comuns e não são atualizadas com tanta frequência. Esse recurso dificulta a detecção de estática. Curiosamente, após descompactar, o ponto de entrada está no início da seção __cfstring no segmento .TEXT . Existem atributos de sinalizador nesta seção, como mostrado na imagem abaixo.


Figura 1. Atributos da seção MACH-O __cfstring

Conforme mostrado na Figura 2, o local do código na seção __cfstring permite enganar algumas ferramentas de desmontagem, exibindo o código como seqüências de caracteres.


Figura 2. O código de backdoor é definido pelo IDA como dados

Depois de iniciar o arquivo binário, cria um fluxo como um meio de proteção contra a depuração, cujo único objetivo é verificar constantemente a presença de um depurador. Para esta discussão:

  • Tenta desengatar qualquer depurador chamando ptrace com PT_DENY_ATTACH como o parâmetro de solicitação
  • Verifica se algumas portas de exceção estão abertas chamando task_get_exception_ports
  • Verifica se o depurador está conectado, conforme mostrado na figura abaixo, verificando a presença do sinalizador P_TRACED no processo atual


Figura 3. Verificando a conexão do depurador usando a função sysctl

Se o cão de guarda detectar a presença de um depurador, a função de exit será chamada. Além disso, a amostra verifica o ambiente executando dois comandos:

ioreg -l | grep -e "Manufacturer" sysctl hw.model

Depois disso, a amostra verifica o valor de retorno em uma lista codificada de strings de sistemas de virtualização conhecidos: acle , vmware , virtualbox ou paralelos . Por fim, o comando a seguir verifica se a máquina é um dos seguintes “MBP”, “MBA”, “MB”, “MM”, “IM”, “MP” e “XS”. Estes são códigos de modelo de sistema, por exemplo, "MBP" significa MacBook Pro, "MBA" significa MacBook Air, etc.

system_profiler SPHardwareDataType 2>/dev/null | awk '/Boot ROM Version/ {split($0, line, ":");printf("%s", line[2]);}

Principais adições


Apesar do fato de as equipes de backdoor não terem mudado desde o estudo da Trend Micro, notamos várias outras modificações. Os servidores de C&C usados ​​nesta amostra são bastante novos, a data de sua criação é 22/10/2018.

  • daff.faybilodeau [.] com
  • sarc.onteagleroad [.] com
  • au.charlineopkesston [.] com

URL do recurso alterado para /dp/B074WC4NHW/ref=gbps_img_m-9_62c3_750e6b35 .
O primeiro pacote enviado ao servidor C&C contém mais informações sobre a máquina host, incluindo todos os dados coletados pelos comandos da tabela abaixo.



Além dessa alteração na configuração, a amostra não usa a biblioteca libcurl para filtragem de rede, mas uma biblioteca externa. Para encontrá-lo, o backdoor tenta descriptografar cada arquivo no diretório atual usando o AES-256-CBC com a chave gFjMXBgyXWULmVVVzyxy com zeros. Cada arquivo é descriptografado e salvo como /tmp/store , e uma tentativa de carregá-lo como uma biblioteca foi feita usando a função dlopen . Quando uma tentativa de descriptografia leva a uma chamada dlopen bem-sucedida, o backdoor recupera as Boriry exportadas Boriry e ChadylonV , que parecem ser responsáveis ​​pela comunicação em rede com o servidor. Como não temos um conta-gotas ou outros arquivos do local de origem da amostra, não podemos analisar esta biblioteca. Além disso, como o componente é criptografado, a regra YARA com base nessas linhas não corresponderá ao arquivo encontrado no disco.

Conforme descrito no artigo acima, o cliendID é criado. Esse identificador é um hash MD5 do valor de retorno de um dos seguintes comandos:

- ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformSerialNumber/ { split($0, line, "\""); printf("%s", line[4]); }' ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformSerialNumber/ { split($0, line, "\""); printf("%s", line[4]); }'
- ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformUUID/ { split($0, line, "\""); printf("%s", line[4]); }' ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformUUID/ { split($0, line, "\""); printf("%s", line[4]); }'
- ifconfig en0 | awk \'/ether /{print $2}\' ifconfig en0 | awk \'/ether /{print $2}\' (obtenha o endereço MAC)
- comando desconhecido (" \x1e\x72\x0a "), usado em amostras anteriores

Antes do hash, o caractere "0" ou "1" é adicionado ao valor retornado, indicando a presença de privilégios de root. Esse clientID é armazenado em /Library/Storage/File System/HFS/25cf5d02-e50b-4288-870a-528d56c3cf6e/pivtoken.appex se o código estiver sendo executado como raiz ou em ~ / Library / SmartCardsServices / Technology / PlugIns / drivers / snippets.ecgML em todos os outros casos. Um arquivo geralmente é oculto usando a função _chflags ; seu registro de data e hora é alterado usando o comando touch –t com um valor aleatório.

Decodificando strings


Como nas versões anteriores, as seqüências de caracteres são criptografadas usando AES-256-CBC (chave hexadecimal: 9D7274AD7BCEF0DED29BDBB428C251DF8B350B92 com zeros e IV é preenchido com zeros) usando a função CCCrypt . A chave foi alterada em relação às versões anteriores, mas como o grupo ainda usa o mesmo algoritmo de criptografia de cadeia, a descriptografia pode ser automatizada. Além desta postagem, estamos lançando um script IDA que usa a API Hex-Rays para descriptografar cadeias presentes em um arquivo binário. Esse script pode ajudar na análise futura do OceanLotus e na análise de amostras existentes que ainda não conseguimos obter. O script é baseado em um método universal para receber argumentos passados ​​para uma função. Ele também está procurando configurações de destino. O método pode ser reutilizado para obter uma lista de argumentos da função e depois passá-la para um retorno de chamada.

Conhecendo o protótipo da função de descriptografia , o script encontra todas as referências cruzadas para essa função, todos os argumentos, descriptografa os dados e coloca texto sem formatação dentro do comentário no endereço da referência cruzada. Para que o script funcione corretamente, ele deve ter o alfabeto definido pelo usuário usado pela função de decodificação base64 e uma variável global contendo o comprimento da chave deve ser definida (neste caso, DWORD, consulte a Figura 4).


Figura 4. Definição da variável global key_len

Na janela Função, você pode clicar com o botão direito do mouse na função de descriptografia e clicar em "Extrair e descriptografar argumentos". O script deve colocar as linhas descriptografadas nos comentários, como mostra a Figura 5.


Figura 5. O texto descriptografado é colocado no comentário

Assim, as linhas descriptografadas são convenientemente colocadas juntas na janela refexs da IDA para esta função, como mostra a Figura 6.


Figura 6. Xrefs para a função f_decrypt

O script final pode ser encontrado no repositório do Github .

Conclusão


Como já mencionado, a OceanLotus está constantemente aprimorando e atualizando seu conjunto de ferramentas. Desta vez, o grupo cibernético aprimorou o malware para trabalhar com usuários de Mac. O código não mudou muito, mas como muitos usuários de Mac ignoram os produtos de segurança, proteger o Malware da detecção é de importância secundária.

Os produtos da ESET já detectaram esse arquivo no momento do estudo. Como a biblioteca de rede usada para a comunicação C&C agora está criptografada em disco, o protocolo de rede exato usado pelos atacantes ainda não é conhecido.

Indicadores de compromisso


Indicadores de compromisso e atributos MITRE ATT e CK também estão disponíveis no GitHub .

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


All Articles