Principais conclusões
- Esta é uma notificação inicial de uma intrusão ativa com detalhes adicionais a seguir
- REF9134 utiliza ferramentas personalizadas e de código aberto para reconhecimento, comando e controle
- Os alvos desta atividade incluem uma bolsa de criptomoedas no Japão
Preâmbulo
Este artigo de pesquisa explora uma intrusão descoberta recentemente que estamos chamando de REF9134, que envolve o uso do backdoor sh.py para implantar a ferramenta de enumeração Swiftbelt do macOS. sh.py e xcc foram recentemente apelidados de JOKERSPY pelo Bitdefender.
Especificamente, esta pesquisa abrange:
- Como o Elastic Security Labs identificou o reconhecimento do grupo adversário
- As etapas do adversário para evitar a detecção usando xcc , instalando o backdoor sh.py e implantando ferramentas de enumeração
Uma análise mais aprofundada desse ataque poderá ser publicada posteriormente.
Overview
No final de maio de 2023, um adversário com acesso existente em uma importante bolsa de criptomoedas japonesa acionou um de nossos alertas de endpoint de diagnóstico que detectou a execução de um binário ( xcc ). O xcc não é confiável para a Apple, e o adversário se autoassinou usando o código de ferramenta nativo do macOS codesign. Embora essa detecção em si não tenha sido necessariamente inócua, o setor vertical e a atividade adicional que observamos após esses alertas iniciais chamaram nossa atenção e nos fizeram prestar mais atenção.
Após a execução do xcc , observamos o agente da ameaça tentando ignorar as permissões do TCC criando seu próprio banco de dados do TCC e tentando substituir o existente. Em 1º de junho, uma nova ferramenta baseada em Python foi vista sendo executada no mesmo diretório que o xcc e foi utilizada para executar uma ferramenta de enumeração pós-exploração do macOS de código aberto conhecida como Swiftbelt.
Análise
REF9134 é uma intrusão em um grande provedor de serviços de criptomoeda com sede no Japão, com foco em troca de ativos para negociação de Bitcoin, Ethereum e outras criptomoedas comuns.
O binário xcc
xcc ( d895075057e491b34b0f8c0392b44e43ade425d19eaaacea6ef8c5c9bd3487d8 ) é um binário multiarquitetura autoassinado escrito em Swift que é usado para avaliar as permissões atuais do sistema. A versão observada pelo Elastic Security Labs é assinada como XProtectCheck-55554944f74096a836b73310bd55d97d1dff5cd4 e tem uma assinatura de código semelhante a payloads publicamente conhecidos e não confiáveis.
Para identificar outros binários assinados com o mesmo identificador, convertemos XProtectCheck-55554944f74096a836b73310bd55d97d1dff5cd4 para hexadecimal e pesquisamos no VirusTotal para identificar 3 amostras adicionais ( content:{5850726f74656374436865636b2d353535343934346637343039366138333662373333313062643535643937643164666635636434} ).
Cada um continha a mesma funcionalidade principal com diferenças estruturais. Essas discrepâncias podem indicar que essas variantes do xcc foram desenvolvidas para ignorar recursos de endpoint que interferiam na execução.
Logo após a criação do xcc , os pesquisadores observaram o agente da ameaça copiando /Users/Shared/tcc.db no banco de dados TCC existente, /Library/Application Support/com.apple.TCC/TCC.db. Isso pode permitir que a ameaça evite prompts do TCC visíveis aos usuários do sistema e, ao mesmo tempo, abuse de um diretório com amplas permissões de gravação de arquivo.
Artefatos XCode
Durante a análise desse binário, os pesquisadores identificaram dois caminhos exclusivos, /Users/joker/Developer/Xcode/DerivedData/ e /Users/joker/Downloads/Spy/XProtectCheck/XProtectCheck/ , que se destacaram como anômalos. O caminho padrão para compilar código com o Xcode é /Users/[nome de usuário]/Developer/Xcode/DerivedData.
Abuso do TCC
Essas permissões de introspecção são gerenciadas pelo recurso nativo Transparência, Consentimento e Controle (TCC). Os pesquisadores determinaram que o xcc verifica as permissões FullDiskAccess e ScreenRecording, além de verificar se a tela está bloqueada no momento e se o processo atual é um cliente de acessibilidade confiável.
Após a execução bem-sucedida em nosso ambiente Detonate , os seguintes resultados foram exibidos:
Depois que o banco de dados TCC personalizado foi colocado no local esperado, o agente da ameaça executou o binário xcc .
Acesso inicial
O binário xcc foi executado via bash por três processos separados
- /Applications/IntelliJ IDEA.app/Contents/MacOS/idea
- /Applications/iTerm.app/Contents/MacOS/iTerm2
- /Aplicativos/Visual Studio Code.app/Conteúdo/MacOS/Electron.
Embora ainda estejamos investigando e coletando informações, acreditamos firmemente que o acesso inicial para esse malware foi um plugin malicioso ou de backdoor ou uma dependência de terceiros que forneceu acesso ao agente da ameaça. Isso se alinha com a conexão feita pelos pesquisadores da Bitdefender, que correlacionaram o domínio codificado encontrado em uma versão do backdoor sh.py a um Tweet sobre um leitor de código QR macOS infectado que apresentava uma dependência maliciosa.
Bibliotecas criptográficas implantadas
Em 31 de maio, pesquisadores observaram três DyLibs não nativas implantadas em /Users/shared/keybag/ chamadas libcrypto.1.0.0.dylib , libncursesw.5.dylib e libssl.1.0.0.dylib. No MacOS, as chaves para proteção de dados de arquivos e chaveiros são armazenadas em keybags e pertencem ao iOS, iPadOS, watchOS e tvOS. Neste momento, os pesquisadores propõem que essa encenação serve a um propósito de evasão de defesa e especulam que ela pode conter vulnerabilidades úteis. O agente da ameaça pode planejar introduzir essas vulnerabilidades em sistemas ou aplicativos que já foram corrigidos.
A porta dos fundos sh.py
sh.py é um backdoor Python usado para implantar e executar outros recursos pós-exploração, como o Swiftbelt .
O malware carrega sua configuração de ~/Public/Safari/sar.dat. O arquivo de configuração contém elementos cruciais, como URLs de comando e controle (C2), um temporizador de suspensão para fins de sinalização (o valor padrão é 5 segundos) e um identificador exclusivo de nove dígitos atribuído a cada agente.
Como parte de seu beacon periódico, o malware coleta e transmite diversas informações do sistema. As informações enviadas incluem:
- Hostname
- Nome de usuário
- Nome de domínio
- Diretório atual
- O caminho absoluto do binário executável
- Versão do SO
- É um sistema operacional de 64 bits
- É um processo de 64 bits
- Versão Python
Abaixo está uma tabela descrevendo os vários comandos que podem ser manipulados pelo backdoor:
Comando | Descrição |
---|---|
sk | Pare a execução do backdoor |
l | Listar os arquivos do caminho fornecido como parâmetro |
c | Executar e retornar a saída de um comando shell |
cd | Alterar diretório e retornar o novo caminho |
xs | Executar um código Python fornecido como parâmetro no contexto atual |
xsi | Decodificar um código Python codificado em Base64 fornecido como parâmetro, compilá-lo e executá-lo |
r | Remover um arquivo ou diretório do sistema |
e | Executar um arquivo do sistema com ou sem parâmetro |
u | Carregar um arquivo para o sistema infectado |
e | Baixe um arquivo do sistema infectado |
g | Obtenha a configuração atual do malware armazenada no arquivo de configuração |
w | Substituir o arquivo de configuração do malware por novos valores |
SWIFTBELT
Em 1º de junho, o sistema comprometido registrou um alerta de assinatura para MacOS.Hacktool.Swiftbelt, um recurso de enumeração do MacOS inspirado no SeatBelt e criado pelo red-teamer Cedric Owens. Ao contrário de outros métodos de enumeração, o Swiftbelt invoca o código Swift para evitar a criação de artefatos de linha de comando. Notavelmente, variantes xcc também são escritas usando Swift.
O alerta de assinatura indicou que o Swiftbelt foi gravado em /Users/shared/sb e executado usando o interpretador de shell bash, sh. A linha de comando completa observada pelos pesquisadores foi Users/Shared/sb /bin/sh -c /users/shared/sb \> /users/shared/sb.log 2\>&1 , demonstrando que o agente da ameaça capturou os resultados em sb.log enquanto os erros foram direcionados para STDOUT.
Modelo Diamante
O Elastic Security utiliza o Modelo Diamond para descrever relacionamentos de alto nível entre adversários, capacidades, infraestrutura e vítimas de intrusões. Embora o Modelo Diamante seja mais comumente usado com intrusões únicas e aproveitando o Activity Threading (seção 8) como uma forma de criar relacionamentos entre incidentes, um modelo centrado no adversário (seção 7.1.4) abordagem permite um único diamante, embora desordenado.
Táticas e técnicas observadas
Táticas MITRE ATT&CK
As táticas representam o porquê de uma técnica ou subtécnica. É o objetivo tático do adversário: a razão para executar uma ação. Estas são as táticas observadas pelo Elastic Security Labs nesta campanha:
MITRE ATT&CK Techniques / Sub techniques
Técnicas e subtécnicas representam como um adversário atinge um objetivo tático ao executar uma ação. Estas são as técnicas observadas pelo Elastic Security Labs nesta campanha:
- Interpretador de comandos e scripts
- Sequestro de Dylib
- Exploração potencial para execução de privilégios
- Mecanismo de controle de elevação de potencial abuso
- Ocultar Artefatos
- Mascarando
- Ofuscando arquivos ou informações
- Subversão de controles de confiança
- Descoberta da janela do aplicativo
- Captura de tela
- Software Criptopoistico
- Dados do Sistema Local
Lógica de detecção
YARA
O Elastic Security criou regras YARA para identificar essa atividade. Abaixo estão as regras do YARA para identificar o backdoor JOKERSPY e a ferramenta SwiftBelt.
rule Macos_Hacktool_JokerSpy {
meta:
author = "Elastic Security"
creation_date = "2023-06-19"
last_modified = "2023-06-19"
os = "MacOS"
arch = "x86"
category_type = "Hacktool"
family = "JokerSpy"
threat_name = "Macos.Hacktool.JokerSpy"
reference_sample = "d895075057e491b34b0f8c0392b44e43ade425d19eaaacea6ef8c5c9bd3487d8"
license = "Elastic License v2"
strings:
$str1 = "ScreenRecording: NO" fullword
$str2 = "Accessibility: NO" fullword
$str3 = "Accessibility: YES" fullword
$str4 = "eck13XProtectCheck"
$str5 = "Accessibility: NO" fullword
$str6 = "kMDItemDisplayName = *TCC.db" fullword
condition:
5 of them
}
rule MacOS_Hacktool_Swiftbelt {
meta:
author = "Elastic Security"
creation_date = "2021-10-12"
last_modified = "2021-10-25"
threat_name = "MacOS.Hacktool.Swiftbelt"
reference_sample = "452c832a17436f61ad5f32ee1c97db05575160105ed1dcd0d3c6db9fb5a9aea1"
os = "macos"
arch_context = "x86"
license = "Elastic License v2"
strings:
$dbg1 = "SwiftBelt/Sources/SwiftBelt"
$dbg2 = "[-] Firefox places.sqlite database not found for user"
$dbg3 = "[-] No security products found"
$dbg4 = "SSH/AWS/gcloud Credentials Search:"
$dbg5 = "[-] Could not open the Slack Cookies database"
$sec1 = "[+] Malwarebytes A/V found on this host"
$sec2 = "[+] Cisco AMP for endpoints found"
$sec3 = "[+] SentinelOne agent running"
$sec4 = "[+] Crowdstrike Falcon agent found"
$sec5 = "[+] FireEye HX agent installed"
$sec6 = "[+] Little snitch firewall found"
$sec7 = "[+] ESET A/V installed"
$sec8 = "[+] Carbon Black OSX Sensor installed"
$sec9 = "/Library/Little Snitch"
$sec10 = "/Library/FireEye/xagt"
$sec11 = "/Library/CS/falcond"
$sec12 = "/Library/Logs/PaloAltoNetworks/GlobalProtect"
$sec13 = "/Library/Application Support/Malwarebytes"
$sec14 = "/usr/local/bin/osqueryi"
$sec15 = "/Library/Sophos Anti-Virus"
$sec16 = "/Library/Objective-See/Lulu"
$sec17 = "com.eset.remoteadministrator.agent"
$sec18 = "/Applications/CarbonBlack/CbOsxSensorService"
$sec19 = "/Applications/BlockBlock Helper.app"
$sec20 = "/Applications/KextViewr.app"
condition:
6 of them
}
Referências
Os seguintes itens foram referenciados ao longo da pesquisa acima:
Observações
Os seguintes observáveis foram discutidos nesta pesquisa.
Observable | Tipo | Nome | Referência |
---|---|---|---|
app.influmarket[.]org | Domínio | N/D | domínio sh.py |
d895075057e491b34b0f8c0392b44e43ade425d19eaaacea6ef8c5c9bd3487d8 | SHA-256 | /Usuários/Compartilhado/xcc | Macos.Hacktool.JokerSpy |
8ca86f78f0c73a46f31be366538423ea0ec58089f3880e041543d08ce11fa626 | SHA-256 | /Usuários/Compartilhado/sb | MacOS.Hacktool.Swiftbelt |
aa951c053baf011d08f3a60a10c1d09bbac32f332413db5b38b8737558a08dc1 | SHA-256 | /Usuários/Compartilhado/sh.py | script sh.py |