Fantasma nella cassaforte: Obsidian sfruttato per consegnare PhantomPulse RAT
Detection stack
- AIDR
- Alert
- ETL
- Query
Riepilogo
Elastic Security Labs ha scoperto una nuova campagna di ingegneria sociale che sfrutta la piattaforma di gestione delle note Obsidian e il suo ecosistema di plugin della comunità per distribuire PhantomPulse, un RAT precedentemente non documentato che prende di mira sia i sistemi Windows che macOS. L’operazione sembra mirare a individui nel settore finanziario e delle criptovalute, con gli attaccanti che utilizzano LinkedIn e Telegram per distribuire un vault Obsidian compromesso come esca iniziale. Su Windows, la catena di infezione si basa su PowerShell, un loader personalizzato in memoria noto come PhantomPull, e tecniche di caricamento riflessivo. Su macOS, gli attaccanti utilizzano AppleScript insieme a un meccanismo di comando e controllo tramite dead-drop su Telegram. La campagna incorpora inoltre la scoperta C2 basata su blockchain attraverso i dati delle transazioni su Ethereum.
Indagine
I ricercatori hanno riprodotto l’attacco costruendo un vault Obsidian armato che utilizzava i plugin Shell Commands e Hider per attivare l’esecuzione malevola. Durante l’analisi, hanno osservato script PowerShell scaricare un loader chiamato syncobs.exe da 195.3.222.251, che quindi recuperava un payload criptato e lo caricava in memoria riflessivamente. Il loader creava un mutex, comunicava con un pannello di controllo ospitato su panel.fefea22134.net, e supportava infrastrutture di fallback derivate dai dati blockchain. Su macOS, il malware stabiliva la persistenza attraverso un plist LaunchAgent e scaricava un payload AppleScript secondario da un dominio hard-coded e da un canale Telegram. Gli investigatori hanno recuperato artefatti chiave da file di configurazione JSON e risorse in memoria legate a entrambi i percorsi di infezione.
Mitigazione
Le organizzazioni dovrebbero impedire a Obsidian di generare processi figli non autorizzati, applicare controlli rigorosi sull’uso dei plugin della comunità e monitorare l’attività di PowerShell quando Obsidian appare come processo genitore. Le difese di rete dovrebbero bloccare il traffico in uscita verso 195.3.222.251 e i domini panel.fefea22134.net, 0x666.info, e le posizioni note di dead-drop su Telegram associate alla campagna. I team di sicurezza dovrebbero anche cercare segni di caricamento riflessivo, abuso di callback della coda dei timer e il valore specifico del mutex utilizzato dal malware loader.
Risposta
Se vengono rilevati processi figli sospetti da Obsidian, isolare immediatamente l’host interessato e raccogliere la directory .obsidian per una revisione forense dei file plugin malevoli e del contenuto del vault. Cercare il mutex hVNBUORXNiFLhYYh, quindi eseguire la scansione degli endpoint per tracce dei binari loader PHANTOMPULL e RAT PHANTOMPULSE. Bloccare l’infrastruttura di comando e controllo identificata, revocare eventuali credenziali compromesse relative a Obsidian e eseguire una revisione più ampia per l’esposizione al furto di credenziali coinvolgendo conti finanziari e di criptovalute.
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>Tecnica</b> – <b>T1078 Account validi</b><br/><b>Descrizione</b>: Gli attori usano credenziali compromesse per accesso account.<br/><b>Dettagli</b>: credenziali Obsidian fornite alla vittima”] class tech_valid_accounts technique tech_user_execution[“<b>Tecnica</b> – <b>T1204 Esecuzione utente</b><br/><b>Descrizione</b>: L’utente viene indotto a eseguire codice malevolo.<br/><b>Dettagli</b>: apertura vault condiviso e sync plugin”] class tech_user_execution technique tech_powershell_initial[“<b>Tecnica</b> – <b>T1059.001 PowerShell</b><br/><b>Descrizione</b>: PowerShell esegue comandi/script.<br/><b>Dettagli</b>: download script1.ps1 in Base64”] class tech_powershell_initial technique tech_bits_transfer[“<b>Tecnica</b> – <b>T1105 Trasferimento strumenti</b><br/><b>Descrizione</b>: trasferimento payload su host compromesso.<br/><b>Dettagli</b>: download syncobs.exe”] class tech_bits_transfer technique tech_reflective_loading[“<b>Tecnica</b> – <b>T1620 Caricamento riflessivo</b><br/><b>Descrizione</b>: codice caricato in memoria senza disco.<br/><b>Dettagli</b>: payload AES-256-CBC decriptato in memoria”] class tech_reflective_loading technique tech_process_injection[“<b>Tecnica</b> – <b>T1055.002 Iniezione PE</b><br/><b>Descrizione</b>: iniezione codice in processo attivo.<br/><b>Dettagli</b>: module stomping”] class tech_process_injection technique tech_dynamic_resolution[“<b>Tecnica</b> – <b>T1568 Risoluzione dinamica</b><br/><b>Descrizione</b>: risoluzione C2 runtime via blockchain.<br/><b>Dettagli</b>: transazione blockchain”] class tech_dynamic_resolution technique tech_powershell_c2[“<b>Tecnica</b> – <b>T1059.001 PowerShell</b><br/><b>Descrizione</b>: comunicazione e beacon C2”] class tech_powershell_c2 technique tech_applescript[“<b>Tecnica</b> – <b>T1059.007 AppleScript</b><br/><b>Descrizione</b>: esecuzione malware su macOS<br/><b>Dettagli</b>: eseguito via osascript”] class tech_applescript technique tech_launch_agent[“<b>Tecnica</b> – <b>T1543.001 Launch Agent</b><br/><b>Descrizione</b>: persistenza tramite LaunchAgent<br/><b>Dettagli</b>: plist installato”] class tech_launch_agent technique tech_dead_drop_resolver[“<b>Tecnica</b> – <b>T1102.001 Dead Drop Resolver</b><br/><b>Descrizione</b>: C2 tramite servizio web<br/><b>Dettagli</b>: Telegram fallback”] class tech_dead_drop_resolver technique %% Tool / Malware nodes tool_syncobs_exe[“<b>Strumento</b> – <b>Nome</b>: syncobs.exe<br/><b>Descrizione</b>: binario seconda fase”] class tool_syncobs_exe tool malware_phantompull[“<b>Malware</b> – <b>Nome</b>: PHANTOMPULL<br/><b>Descrizione</b>: loader che esegue 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
Flusso di Attacco
Rilevamenti
Download o Upload via PowerShell (tramite cmdline)
Visualizza
Stringhe sospette di PowerShell (tramite cmdline)
Visualizza
Uso sospetto di Invoke-RestMethod (tramite PowerShell)
Visualizza
Stringhe sospette di PowerShell (tramite PowerShell)
Visualizza
Attività possibile di Bits Transfer (tramite PowerShell)
Visualizza
Comunicazione sospetta con dominio Trycloudflare (tramite proxy)
Visualizza
Download di file sospetti con IP diretto (tramite proxy)
Visualizza
Comunicazione sospetta con dominio Trycloudflare (tramite dns)
Visualizza
Obsidian sfruttato per esecuzione di codice e persistenza [Creazione processo Windows]
Visualizza
Esecuzione sospetta di PowerShell con Obsidian come processo genitore [PowerShell Windows]
Visualizza
Esecuzione di Simulazione
Prerequisito: Il Controllo Prevolo di Telemetria e Baseline deve essere passato.
Motivazione: Questa sezione dettaglia l’esecuzione precisa della tecnica dell’avversario (TTP) progettata per attivare la regola di rilevamento. I comandi e la narrazione DEVONO riflettere direttamente i TTP identificati e mirare a generare la telemetria esatta attesa dalla logica di rilevamento. Esempi astratti o non correlati porteranno a diagnosi errate.
-
Narrazione & Comandi dell’Attacco:
- Compromissione Iniziale: L’attaccante inserisce un plugin malevolo di Obsidian (
evil-plugin.js) nella directory dei plugin di Obsidian dell’utente. - Attivazione Esecuzione: Quando Obsidian si avvia, il plugin esegue un one-liner di PowerShell che lancia
notepad.exeviaStart-Process. Questo crea esattamente la catena di processoObsidian.exe → notepad.exeche la regola monitora. - Persistenza: Il plugin è impostato per caricarsi automaticamente ad ogni avvio di Obsidian, garantendo che il processo figlio malevolo si ripeta.
- Evasione: Il plugin invoca brevemente anche
rundll32.exe(T1216.002) per caricare una DLL benigna, mascherando il vero intento mentre mantiene intatta la catena che innesca il rilevamento.
- Compromissione Iniziale: L’attaccante inserisce un plugin malevolo di Obsidian (
-
Script di Test di Regressione:
# ------------------------------------------------- # Simulazione plugin malevolo Obsidian (PowerShell) # ------------------------------------------------- # 1. Assicurarsi che Obsidian sia installato nella posizione prevista $obsidianPath = "C:Program FilesObsidianObsidian.exe" if (-Not (Test-Path $obsidianPath)) { Write-Error "Obsidian not found at $obsidianPath" exit 1 } # 2. Avviare Obsidian *come genitore* e immediatamente avviare 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. Opzionale: invocare un binario firmato (rundll32) per simulare T1216.002 Start-Process -FilePath "C:WindowsSystem32rundll32.exe" -ArgumentList "shell32.dll,Control_RunDLL" -WindowStyle Hidden # 4. Mantenere lo script attivo brevemente per permettere la generazione di log Start-Sleep -Seconds 5 # ------------------------------------------------- -
Comandi di Pulizia:
# Terminare eventuali istanze di Obsidian o Notepad lasciate dal test Get-Process -Name "Obsidian","notepad","rundll32" -ErrorAction SilentlyContinue | Stop-Process -Force # Rimuovere il file del plugin malevolo simulato (se esisteva) $pluginPath = "$env:APPDATAObsidianpluginsevil-plugin.js" if (Test-Path $pluginPath) { Remove-Item $pluginPath -Force } Write-Host "Pulizia completata."