Fantasma no cofre: Obsidian usado para entregar PhantomPulse RAT
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumo
Elastic Security Labs descobriu uma nova campanha de engenharia social que explora a plataforma de anotações Obsidian e seu ecossistema de plugins comunitários para entregar PhantomPulse, um RAT anteriormente não documentado que tem como alvo os sistemas Windows e macOS. A operação parece dirigida a indivíduos no espaço financeiro e de criptomoedas, com os atacantes usando LinkedIn e Telegram para distribuir um cofre Obsidian comprometido como isca inicial. No Windows, a cadeia de infecção depende do PowerShell, de um carregador personalizado na memória conhecido como PhantomPull, e de técnicas de carregamento reflexivo. No macOS, os atacantes usam AppleScript juntamente com um mecanismo de comando e controle baseado em Telegram morto. A campanha também incorpora descoberta de C2 baseada em blockchain através de dados de transações Ethereum.
Investigação
Os pesquisadores reproduziram o ataque construindo um cofre Obsidian armado que usava os plugins Shell Commands e Hider para acionar a execução maliciosa. Durante a análise, observaram scripts PowerShell baixando um carregador chamado syncobs.exe de 195.3.222.251, que então recuperava uma carga útil criptografada e a carregava reflexivamente na memória. O carregador criou um mutex, comunicou-se com um painel de controle hospedado em panel.fefea22134.net, e suportou infraestrutura de fallback derivada de dados de blockchain. No macOS, o malware estabeleceu persistência através de um plist do LaunchAgent e baixou uma carga útil secundária do AppleScript de um domínio codificado e de um canal no Telegram. Os investigadores recuperaram artefatos chave a partir de arquivos de configuração JSON e recursos na memória atrelados a ambos os caminhos de infecção.
Mitigação
As organizações devem impedir que o Obsidian gere processos filhos não autorizados, aplicar controles rígidos sobre o uso de plugins da comunidade e monitorar a atividade do PowerShell onde o Obsidian aparece como o processo pai. As defesas de rede devem bloquear o tráfego de saída para 195.3.222.251 e os domínios panel.fefea22134.net, 0x666.info, e locais conhecidos de Telegram dead-drop associados à campanha. As equipes de segurança também devem procurar sinais de carregamento reflexivo, abuso de callback em fila de temporizadores, e o valor específico do mutex usado pelo carregador de malware.
Resposta
Se forem detectados processos filhos suspeitos a partir de Obsidian, isole imediatamente o host afetado e colete o diretório .obsidian para revisão forense dos arquivos de plugins maliciosos e conteúdo do cofre. Procure pelo mutex hVNBUORXNiFLhYYh, então verifique os endpoints para rastros do carregador PHANTOMPULL e dos binários do RAT PHANTOMPULSE. Bloqueie a infraestrutura de comando e controle identificada, revogue quaisquer credenciais Obsidian comprometidas, e faça uma análise mais ampla para exposição de roubo de credenciais envolvendo contas financeiras e de criptomoedas.
graph TB %% Class definitions classDef technique fill:#99ccff classDef tool fill:#ffcc99 classDef malware fill:#ff9999 classDef process fill:#ccffcc %% Technique nodes tech_valid_accounts[“<b>Técnica</b> – <b>T1078 Contas válidas</b><br/><b>Descrição</b>: Adversários usam credenciais comprometidas para aceder a contas da vítima.<br/><b>Detalhes</b>: Credenciais do Obsidian fornecidas à vítima”] class tech_valid_accounts technique tech_user_execution[“<b>Técnica</b> – <b>T1204 Execução pelo utilizador</b><br/><b>Descrição</b>: Utilizadores são enganados para executar código malicioso.<br/><b>Detalhes</b>: Vítima abre vault partilhado e ativa sincronização de plugins”] class tech_user_execution technique tech_powershell_initial[“<b>Técnica</b> – <b>T1059.001 PowerShell</b><br/><b>Descrição</b>: PowerShell usado para executar comandos e scripts.<br/><b>Detalhes</b>: Comando Base64 descarrega script1.ps1”] class tech_powershell_initial technique tech_bits_transfer[“<b>Técnica</b> – <b>T1105 Transferência de ferramentas</b><br/><b>Descrição</b>: Transferência de ferramentas ou payloads para o host comprometido.<br/><b>Detalhes</b>: BitsTransfer descarrega syncobs.exe”] class tech_bits_transfer technique tech_reflective_loading[“<b>Técnica</b> – <b>T1620 Carga reflexiva</b><br/><b>Descrição</b>: Código carregado diretamente em memória.<br/><b>Detalhes</b>: PHANTOMPULL descifra payload AES-256-CBC em memória”] class tech_reflective_loading technique tech_process_injection[“<b>Técnica</b> – <b>T1055.002 Injeção PE</b><br/><b>Descrição</b>: Injeção de código em processos ativos.<br/><b>Detalhes</b>: module stomping reflectivo”] class tech_process_injection technique tech_dynamic_resolution[“<b>Técnica</b> – <b>T1568 Resolução dinâmica</b><br/><b>Descrição</b>: Resolução de C2 em runtime via blockchain.<br/><b>Detalhes</b>: transação blockchain resolve URL C2”] class tech_dynamic_resolution technique tech_powershell_c2[“<b>Técnica</b> – <b>T1059.001 PowerShell</b><br/><b>Descrição</b>: PowerShell usado para comunicação C2”] class tech_powershell_c2 technique tech_applescript[“<b>Técnica</b> – <b>T1059.007 AppleScript</b><br/><b>Descrição</b>: AppleScript executa código malicioso no macOS.<br/><b>Detalhes</b>: dropper via osascript”] class tech_applescript technique tech_launch_agent[“<b>Técnica</b> – <b>T1543.001 Launch Agent</b><br/><b>Descrição</b>: Persistência via LaunchAgent.<br/><b>Detalhes</b>: plist instalado”] class tech_launch_agent technique tech_dead_drop_resolver[“<b>Técnica</b> – <b>T1102.001 Dead Drop Resolver</b><br/><b>Descrição</b>: serviço web usado como resolução C2.<br/><b>Detalhes</b>: Telegram como C2 alternativo”] class tech_dead_drop_resolver technique %% Tool / Malware nodes tool_syncobs_exe[“<b>Ferramenta</b> – <b>Nome</b>: syncobs.exe<br/><b>Descrição</b>: binário de segunda fase”] class tool_syncobs_exe tool malware_phantompull[“<b>Malware</b> – <b>Nome</b>: PHANTOMPULL<br/><b>Descrição</b>: loader reflexivo que executa payload AES-256-CBC”] class malware_phantompull malware %% Flow connections tech_valid_accounts –>|leads_to| tech_user_execution tech_user_execution –>|leads_to| tech_powershell_initial tech_powershell_initial –>|executes| tech_bits_transfer tech_bits_transfer –>|downloads| tool_syncobs_exe tool_syncobs_exe –>|enables| tech_reflective_loading tech_reflective_loading –>|loads| malware_phantompull malware_phantompull –>|facilitates| tech_process_injection tech_process_injection –>|injects| tool_syncobs_exe tech_process_injection –>|enables| tech_dynamic_resolution tech_dynamic_resolution –>|resolves| tech_powershell_c2 tech_dynamic_resolution –>|resolves| tech_applescript tech_powershell_c2 –>|beacons| tech_dead_drop_resolver tech_applescript –>|creates| tech_launch_agent tech_launch_agent –>|persists| tech_dead_drop_resolver
Fluxo de Ataque
Detectações
Download ou Upload via PowerShell (via linha de comando)
Ver
Strings Suspeitas do PowerShell (via linha de comando)
Ver
Uso Suspeito do Invoke-RestMethod (via powershell)
Ver
Strings Suspeitas do PowerShell (via powershell)
Ver
Atividade Possível de Transferência de Bits (via powershell)
Ver
Comunicação Suspeita de Domínio Trycloudflare (via proxy)
Ver
Download de Arquivo Suspeito Direto por IP (via proxy)
Ver
Comunicação Suspeita de Domínio Trycloudflare (via dns)
Ver
Obsidian Explorados para Execução de Código e Persistência [Criação de Processo no Windows]
Ver
Execução Suspeita do PowerShell com Obsidian como Processo Pai [PowerShell no Windows]
Ver
Execução de Simulação
Pré-requisito: A Verificação de Pré-voo de Telemetria e Linha de Base deve ter passado.
Justificativa: Esta seção detalha a execução precisa da técnica do adversário (TTP) projetada para acionar a regra de detecção. Os comandos e a narrativa DEVEM refletir diretamente os TTPs identificados e visam gerar a telemetria exata esperada pela lógica de detecção. Exemplos abstratos ou não relacionados levarão a um diagnóstico incorreto.
-
Narrativa de Ataque & Comandos:
- Comprometimento Inicial: O atacante deixa um plugin malicioso do Obsidian (
evil-plugin.js) no diretório de plugins do usuário do Obsidian. - Gatilho de Execução: Quando o Obsidian é iniciado, o plugin executa uma linha única do PowerShell que lança
notepad.exeviaStart-Process. Isto cria a exata cadeia de processosObsidian.exe → notepad.exeque a regra monitora. - Persistência: O plugin é configurado para auto-carregar em cada inicialização do Obsidian, garantindo que o processo filho malicioso se repita.
- Evasão: O plugin também invoca brevemente
rundll32.exe(T1216.002) para carregar uma DLL inofensiva, mascarando o verdadeiro propósito enquanto mantém a cadeia detectada intacta.
- Comprometimento Inicial: O atacante deixa um plugin malicioso do Obsidian (
-
Script de Teste de Regressão:
# ------------------------------------------------- # Simulação de plugin malicioso do Obsidian (PowerShell) # ------------------------------------------------- # 1. Certifique-se de que o Obsidian está instalado no caminho esperado $obsidianPath = "C:Program FilesObsidianObsidian.exe" if (-Not (Test-Path $obsidianPath)) { Write-Error "Obsidian não encontrado em $obsidianPath" exit 1 } # 2. Lançar Obsidian *como pai* e imediatamente iniciar o Notepad $startInfo = New-Object System.Diagnostics.ProcessStartInfo $startInfo.FileName = $obsidianPath $startInfo.Arguments = "-c `"Start-Process notepad.exe`"" $startInfo.UseShellExecute = $false $startInfo.CreateNoWindow = $true $proc = [System.Diagnostics.Process]::Start($startInfo) # 3. Opcional: invoca um binário assinado (rundll32) para simular T1216.002 Start-Process -FilePath "C:WindowsSystem32rundll32.exe" -ArgumentList "shell32.dll,Control_RunDLL" -WindowStyle Hidden # 4. Mantenha o script ativo brevemente para permitir o registro de logs Start-Sleep -Seconds 5 # ------------------------------------------------- -
Comandos de Limpeza:
# Encerre qualquer instância de Obsidian ou Notepad criada pelo teste Get-Process -Name "Obsidian","notepad","rundll32" -ErrorAction SilentlyContinue | Stop-Process -Force # Remova o arquivo de plugin malicioso simulado (se existiu) $pluginPath = "$env:APPDATAObsidianpluginsevil-plugin.js" if (Test-Path $pluginPath) { Remove-Item $pluginPath -Force } Write-Host "Limpeza completa."