Em março de 2019, uma nova amostra de malware para macOS do grupo cibernético OceanLotus foi carregada no VirusTotal, um popular serviço de verificação online. O arquivo executável do backdoor possui as mesmas funcionalidades que a versão anterior do malware para macOS que analisamos, mas sua estrutura mudou, tornando-se mais difícil de detectar. Infelizmente, não conseguimos encontrar o dropper associado a esta amostra, então ainda não sabemos o vetor de infecção.
Recentemente, publicamos e como os operadores tentam garantir persistência, agilizar a execução do código e minimizar as evidências de presença em sistemas Windows. Também é sabido que este grupo cibernético possui um componente para macOS. Este post descreve detalhadamente as mudanças na versão mais recente do malware para macOS em comparação com a versão anterior (), e fala sobre como a análise pode ser automatizada para decifrar strings usando a API IDA Hex-Rays.

Análise
Nas próximas três partes, descreveremos a análise da amostra com hash SHA-1 E615632C9998E4D3E5ACD8851864ED09B02C77D2. O arquivo é chamado flashlightd, e os produtos antivírus da ESET o detectam como OSX/OceanLotus.D.
Antidebugging e proteção contra sandboxes
Como todos os binários do OceanLotus para macOS, a amostra é empacotada com UPX, mas a maioria das ferramentas de identificação de empacotadores não a reconhece como tal. Provavelmente, porque elas normalmente dependem da presença da string “UPX” em sua assinatura, além disso, as assinaturas Mach-O aparecem com menos frequência e não são tão frequentemente atualizadas. Essa característica dificulta a detecção estática. Curiosamente, após a descompactação, o ponto de entrada está no início da seção __cfstring no segmento .TEXT. Nesta seção, existem atributos de flag, como mostrado na figura abaixo.

Figura 1. Atributos da seção MACH-O __cfstring
Como mostrado na figura 2, as localizações do código na seção __cfstring podem enganar algumas ferramentas de desassemblagem, apresentando o código como strings.

Figura 2. O código do backdoor é identificado pela IDA como dados
Após a execução, o arquivo binário cria uma thread como meio de proteção contra debugging, cujo único objetivo é verificar continuamente a presença de um debugger. Para isso, a thread:
— Tenta desconectar qualquer debugger, chamando ptrace com PT_DENY_ATTACH como parâmetro da solicitação
— Verifica se algumas portas de exceção estão abertas, chamando a função task_get_exception_ports
— Verifica se o depurador está conectado, conforme mostrado na figura abaixo, verificando a presença da flag P_TRACED no processo atual

Figura 3. Verificação da conexão do depurador através da função sysctl
Se o esquema de alerta detectar a presença do depurador, a função é chamada sigreturn. Além disso, em seguida, o amostra verifica o ambiente executando dois comandos:
ioreg -l | grep -e "Manufacturer" e sysctl hw.model
Depois disso, a amostra verifica o valor retornado em uma lista codificada de strings de sistemas de virtualização conhecidos: acle, vmware, virtualbox ou parallels. Finalmente, o seguinte comando verifica se a máquina é uma das seguintes “MBP”, “MBA”, “MB”, “MM”, “IM”, “MP” e “XS”. Esses são os códigos dos modelos do sistema, por exemplo, “MBP” significa MacBook Pro, “MBA” – MacBook Air, etc.
system_profiler SPHardwareDataType 2>/dev/null | awk '/Boot ROM Version/ {split($0, line, ":");printf("%s", line[2]);}'
Principais adições
Apesar de que os comandos do backdoor não mudaram desde a pesquisa da Trend Micro, notamos várias outras modificações. Os servidores C&C usados neste amostra são bastante novos, com data de criação em 22.10.2018.
— daff.faybilodeau[.]com
— sarc.onteagleroad[.]com
— au.charlineopkesston[.]com
O URL do recurso mudou para /dp/B074WC4NHW/ref=gbps_img_m-9_62c3_750e6b35.
O primeiro pacote enviado para o servidor C&C contém mais informações sobre a máquina host, incluindo todos os dados coletados pelos comandos na tabela abaixo.

Além disso, a amostra utiliza uma biblioteca externa para filtragem de rede, em vez da biblioteca , que. Para encontrá-la, o backdoor tenta descriptografar cada arquivo no diretório atual, usando AES-256-CBC com a chave gFjMXBgyXWULmVVVzyxy, complementada com zeros. Cada arquivo é descriptografado e salvo como /tmp/store, e uma tentativa de carregá-lo como uma biblioteca é feita utilizando a função . Quando a tentativa de descriptografia resulta em uma chamada bem-sucedida dlopen, o backdoor extrai as funções exportadas Boriry e ChadylonV, que aparentemente são responsáveis pela interação de rede com o servidor. Não temos o dropper ou outros arquivos da origem da amostra, então não podemos analisar essa biblioteca. Além disso, como o componente está criptografado, a regra YARA baseada nessas strings não corresponderá ao arquivo encontrado no disco.
Como descrito no artigo mencionado acima, um clientID. Este identificador é um hash MD5 do valor retornado por um dos seguintes comandos:
— 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]); }'
— ifconfig en0 | awk '/ether /{print $2}' (obter endereço MAC)
— comando desconhecido (“x1ex72x0a“), que é utilizado em amostras anteriores
Antes que o valor retornado seja hash, um caractere “0” ou “1” é adicionado para indicar a presença de privilégios de root. Este clientID é armazenado em /Library/Storage/File System/HFS/25cf5d02-e50b-4288-870a-528d56c3cf6e/pivtoken.appex, se o código for executado como root ou em ~/Library/SmartCardsServices/Technology/PlugIns/drivers/snippets.ecgML em todos os outros casos. O arquivo geralmente é oculto usando a função , seu timestamp é modificado usando o comando touch –t com um valor aleatório.
Descriptografia de strings
Como nas versões anteriores, as strings são criptografadas usando AES-256-CBC (chave hexadecimal: 9D7274AD7BCEF0DED29BDBB428C251DF8B350B92 complementada com zeros, e o IV preenchido com zeros) através da função . A chave foi alterada em comparação com versões anteriores, mas, uma vez que o grupo ainda utiliza o mesmo algoritmo de criptografia de strings, a descriptografia pode ser automatizada. Além deste post, estamos lançando um script IDA que utiliza a API Hex-Rays para descriptografar strings presentes no arquivo binário. Este script pode ajudar na futura análise do OceanLotus e na análise de amostras existentes que ainda não conseguimos obter. O script é baseado em um método genérico de coleta de argumentos passados para a função. Além disso, ele procura pela atribuição de parâmetros. O método pode ser reutilizado para obter a lista de argumentos da função e, em seguida, fazer a chamada de retorno (callback).
Sabendo o protótipo da função decrypt, o script encontra todas as referências cruzadas para essa função, todos os argumentos e, em seguida, descriptografa os dados e insere o texto simples dentro do comentário no endereço da referência cruzada. Para que o script funcione corretamente, deve haver um alfabeto personalizado definido a ser utilizado pela função de decodificação base64, e uma variável global deve ser definida para conter o comprimento da chave (neste caso DWORD, veja a figura 4).

Figura 4. Definição da variável global key_len
Na janela Function, você pode clicar com o botão direito do mouse para chamar a função de descriptografia e selecionar "Extrair e descriptografar argumentos". O script deve colocar as strings descriptografadas nos comentários, conforme mostrado na figura 5.

Figura 5. Texto descriptografado colocado nos comentários
Dessa forma, as strings descriptografadas são convenientemente agrupadas na janela IDA xrefs para esta função, conforme mostrado na figura 6.

Figura 6. Xrefs para a função f_decrypt
A versão final do script pode ser encontrada em .
Saída
Como já mencionado, o OceanLotus está constantemente aprimorando e atualizando seu conjunto de ferramentas. Desta vez, o grupo de cibercriminosos melhorou o malware para usuários de Mac. O código não mudou muito, mas, como muitos usuários de Mac ignoram produtos de segurança, a proteção do malware contra detecção é secundária.
Os produtos ESET já detectaram este arquivo no momento da investigação. Como a biblioteca de rede usada para comunicação C&C agora está criptografada no disco, o protocolo de rede exato utilizado pelos atacantes ainda é desconhecido.
Indicadores de comprometimento
Os indicadores de comprometimento, assim como os atributos MITRE ATT&CK, também estão disponíveis em .
Fonte: habr.com
