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 __cfstringConforme 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 dadosDepois 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 sysctlSe 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_lenNa 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árioAssim, 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_decryptO 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 .