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
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 dados
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 ptracecomPT_DENY_ATTACHcomo 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_TRACEDno processo atual
 Figura 3. Verificando a conexão do depurador usando a função sysctl
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.modelDepois 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
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ário
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_decrypt
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 .