SOC Prime Bias: Medio

20 May 2026 22:01 UTC

Analisi di Phantom Stealer: All’interno di una Catena di Attacco a Due Strati

Author Photo
SOC Prime Team linkedin icon Segui
Analisi di Phantom Stealer: All’interno di una Catena di Attacco a Due Strati
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Riassunto

Phantom Stealer è un infostealer Windows a due stadi che inizia con un malicioso pdh.dll loader e termina con un payload .NET iniettato in jsc.exe. Il loader utilizza DLL hijacking, process hollowing e compilazione nativa AOT per ridurre la possibilità di rilevamento. Una volta attivo, il payload del secondo stadio ruba credenziali, dati del browser, informazioni sui portafogli di criptovalute, contenuti degli appunti e altri dati sensibili, e può anche sostituire indirizzi di portafogli copiati con valori controllati dall’attaccante. Il malware è commercializzato come offerta di crimeware ed è attualmente utilizzato in attacchi attivi.

Indagine

I ricercatori hanno trovato che il loader copia sé stesso in %APPDATA%MicrosoftRasManagementMpDlpService.exe e crea una chiave Run per mantenere la persistenza. Decrittografa quindi un payload criptato doppio RC4 e lo inietta in un jsc.exe processo sospeso, esegue numerosi controlli anti-analisi prima di avviare il furto di dati. L’intern .NET stealer è in grado di bypassare la crittografia legata all’app di Chrome 127+ ed esfiltra informazioni rubate tramite SMTP usando un dominio spoofato. Thread separati gestiscono funzionalità di crypto clipping e keylogging.

Mitigazione

I difensori dovrebbero monitorare caricamenti inaspettati pdh.dll da percorsi non di sistema e imporre controlli che riducono il rischio di DLL hijacking. I team di sicurezza dovrebbero anche rilevare eseguibili non familiari collocati in %APPDATA%MicrosoftRasManagement e osservare la chiave Run RasManSvc Le rilevazioni basate sul comportamento dovrebbero concentrarsi sul process hollowing che coinvolge jsc.exe, mentre il monitoraggio della rete dovrebbe segnalare connessioni sospette ai domini di comando e controllo identificati. Ulteriore indurimento dell’archiviazione delle credenziali del browser e controlli più stretti sull’accesso agli appunti per le applicazioni non attendibili possono ulteriormente ridurre l’esposizione.

Risposta

Allertare alla creazione di MpDlpService.exe all’interno della directory RasManagement e alle modifiche alla chiave di registro Run correlata. Investigare qualsiasi jsc.exe processo che mostra segni di codice iniettato e terminare immediatamente l’attività maligna. Raccogliere gli indicatori di compromissione pertinenti, mettere in quarantena i file associati ed eseguire analisi forensi per determinare quali credenziali e dati del portafoglio potrebbero essere stati esposti. Reimpostare i conti colpiti e informare gli utenti interessati se necessario.

graph TB classDef technique fill:#ffcc99 classDef file fill:#c2f0c2 classDef process fill:#add8e6 classDef action fill:#ffd699 step1_ext[“<b>Tecnica</b> – <b>T1176 Estensioni software</b><br/><b>Descrizione</b>: Inserire pdh.dll nella stessa cartella di un’app legittima.”] class step1_ext technique step1_masq[“<b>Tecnica</b> – <b>T1036.005 Mascheramento</b>”] class step1_masq technique step1_dynapi[“<b>Tecnica</b> – <b>T1027.007 Offuscamento API dinamiche</b>”] class step1_dynapi technique file_dll[“<b>File</b> – pdh.dll (malevolo)”] class file_dll file step1_ext –>|usa| step1_masq step1_ext –>|usa| step1_dynapi step1_ext –>|drop| file_dll file_dll –>|caricato_da| step1_ext step2_compromise[“<b>Tecnica</b> – <b>T1554 Compromissione binari host</b>”] class step2_compromise technique step2_activeSetup[“<b>Tecnica</b> – <b>T1547.014 Active Setup</b>”] class step2_activeSetup technique step2_runkey[“<b>Tecnica</b> – <b>T1547.001 Run key registro</b>”] class step2_runkey technique file_loader[“<b>File</b> – MpDlpService.exe”] class file_loader file step1_ext –>|porta_a| step2_compromise step2_compromise –>|abilita| step2_activeSetup step2_activeSetup –>|crea| file_loader file_loader –>|registrato| step2_runkey step3_evasion[“<b>Tecnica</b> – <b>T1497.002 Evasione sandbox</b>”] class step3_evasion technique step3_queryReg[“<b>Tecnica</b> – <b>T1012 Query registro</b>”] class step3_queryReg technique step2_compromise –>|attiva| step3_evasion step3_evasion –>|usa| step3_queryReg step4_hollow[“<b>Tecnica</b> – <b>T1055.012 Process Hollowing</b>”] class step4_hollow technique step4_threadHijack[“<b>Tecnica</b> – <b>T1055.003 Thread hijacking</b>”] class step4_threadHijack technique process_jsc[“<b>Processo</b> – jsc.exe”] class process_jsc process process_mal[“<b>Processo</b> – payload .NET iniettato”] class process_mal process step3_evasion –>|porta_a| step4_hollow step4_hollow –>|crea| process_jsc step4_hollow –>|sostituisce_memoria| process_jsc process_jsc –>|ospita| process_mal step4_hollow –>|usa| step4_threadHijack step5_browserDisc[“<b>Tecnica</b> – <b>T1217 scoperta browser</b>”] class step5_browserDisc technique step5_credWeb[“<b>Tecnica</b> – <b>T1555.003 credenziali browser</b>”] class step5_credWeb technique step5_privateKey[“<b>Tecnica</b> – <b>T1552.004 chiavi private</b>”] class step5_privateKey technique step4_hollow –>|porta_a| step5_browserDisc step5_browserDisc –>|abilita| step5_credWeb step5_credWeb –>|aggiunge| step5_privateKey step6_keylog[“<b>Tecnica</b> – <b>T1056.001 keylogging</b>”] class step6_keylog technique step5_credWeb –>|abilita| step6_keylog step7_screen[“<b>Tecnica</b> – <b>T1113 screenshot</b>”] class step7_screen technique step6_keylog –>|porta_a| step7_screen step8_clipboard[“<b>Tecnica</b> – <b>T1115 clipboard</b>”] class step8_clipboard technique step7_screen –>|porta_a| step8_clipboard step9_emailCollect[“<b>Tecnica</b> – <b>T1114 raccolta email</b>”] class step9_emailCollect technique step9_identity[“<b>Tecnica</b> – <b>T1589.002 identità email</b>”] class step9_identity technique step9_exfil[“<b>Tecnica</b> – <b>T1048.003 esfiltrazione SMTP</b>”] class step9_exfil technique step8_clipboard –>|porta_a| step9_emailCollect step9_emailCollect –>|include| step9_identity step9_identity –>|esfiltra_via| step9_exfil step10_reflective[“<b>Tecnica</b> – <b>T1620 caricamento riflessivo</b>”] class step10_reflective technique step9_exfil –>|attiva| step10_reflective

Flusso di Attacco

Esecuzione Simulazione

Prerequisito: Il Controllo Pre-volo di Telemetria & Baseline deve essere passato.

Razionale: Questa sezione delinea l’esecuzione precisa della tecnica avversaria (TTP) progettata per innescare la regola di rilevamento. I comandi e la narrativa riflettono direttamente le TTP identificate e mirano a generare l’esatta telemetria prevista dalla logica di rilevamento.

  • Narrativa & Comandi di Attacco:
    Un avversario innanzitutto ruba un payload malevolo (ad esempio, una DLL di shell inversa) e lo memorizza nella directory %APPDATA% dell'utente. Usando come host per il hollowing, l’attaccante crea un nuovo processo, inietta il payload e riprende l’esecuzione— adempiendo a jsc.exe , T1055.003 , T1055.003 and Per garantire la persistenza, l’attaccante copia la DLL malevola in.
    To ensure persistence, the attacker copies the malicious DLL to %APPDATA%MicrosoftRasManagementMpDlpService.exe e la registra come un servizio che si esegue all’accesso, abusando del nome del servizio legittimo (T1620).

  • Script di Test di Regressione:

    # ---------------------------------------------------------
    # Script avversario simulato – Process Hollowing + Persistenza
    # ---------------------------------------------------------
    
    # Variabili
    $appData = "$env:APPDATAMicrosoftRasManagement"
    $loaderPath = Join-Path $appData "MpDlpService.exe"
    $maliciousDll = "$env:TMPmalicious.dll"   # placeholder per il payload
    
    # 1. Preparare la directory di persistenza
    New-Item -Path $appData -ItemType Directory -Force | Out-Null
    
    # 2. Lascia cadere una DLL malevola fittizia (payload simulato)
    #    In un attacco reale questo sarebbe un payload compilato; qui creiamo un file da zero byte.
    New-Item -Path $maliciousDll -ItemType File -Force | Out-Null
    
    # 3. Copia la DLL nella posizione di servizio spoofato
    Copy-Item -Path $maliciousDll -Destination $loaderPath -Force
    
    # 4. Registra un servizio temporaneo che punta al file copiato (richiede admin)
    $svcName = "MpDlpService"
    sc.exe create $svcName binPath= "`"$loaderPath`"" DisplayName= "Microsoft Ras Management Service" start= auto | Out-Null
    
    # 5. Avvia il servizio (innesca l'esecuzione di MpDlpService.exe)
    sc.exe start $svcName | Out-Null
    
    # 6. Esegui il process hollowing usando jsc.exe come host
    #    Lanceremo jsc.exe sospeso, sostituiremo la sua memoria con il payload fittizio,
    #    quindi riprenderemo. Questo usa la funzione Invoke-ProcessHollowing da PowerSploit.
    function Invoke-ProcessHollowing {
        param(
            [string]$HostPath,
            [string]$PayloadPath
        )
        # Carica API .NET
        Add-Type @"
    using System;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    public class Hollow {
      [DllImport("kernel32.dll")] public static extern bool CreateProcess(string appName, string cmdLine,
          IntPtr procSec, IntPtr threadSec, bool inherit, uint flags,
          IntPtr env, string cwd, ref STARTUPINFO si, out PROCESS_INFORMATION pi);
      [StructLayout(LayoutKind.Sequential)] public struct STARTUPINFO {
          public int cb; public string lpReserved; public string lpDesktop; public string lpTitle;
          public uint dwX; public uint dwY; public uint dwXSize; public uint dwYSize; public uint dwXCountChars;
          public uint dwYCountChars; public uint dwFillAttribute; public uint dwFlags; public short wShowWindow;
          public short cbReserved2; public IntPtr lpReserved2; public IntPtr hStdInput; public IntPtr hStdOutput;
          public IntPtr hStdError;
      }
      [StructLayout(LayoutKind.Sequential)] public struct PROCESS_INFORMATION {
          public IntPtr hProcess; public IntPtr hThread; public uint dwProcessId; public uint dwThreadId;
      }
    "@
        # Crea processo sospeso
        $si = New-Object Hollow+STARTUPINFO
        $pi = New-Object Hollow+PROCESS_INFORMATION
        $si.cb = [Runtime.InteropServices.Marshal]::SizeOf($si)
        $CREATE_SUSPENDED = 0x00000004
        $ok = [Hollow]::CreateProcess($null, "`"$HostPath`"", [IntPtr]::Zero, [IntPtr]::Zero, $false,
            $CREATE_SUSPENDED, [IntPtr]::Zero, $null, [ref]$si, [ref]$pi)
        if (-not $ok) { Write-Error "Creatione processo sospeso non riuscita" ; return }
    
        # (Passaggi iniezione payload omessi – placeholder per tecnica reale)
        # Riprendere thread
        $RESUME_THREAD = 0x00000001
        [System.Runtime.InteropServices.Marshal]::WriteInt32($pi.hThread, 0, $RESUME_THREAD) | Out-Null
    }
    
    # Esegui hollowing (usando il vero jsc.exe come host)
    $jscPath = "$env:SystemRootSystem32jsc.exe"
    Invoke-ProcessHollowing -HostPath $jscPath -PayloadPath $maliciousDll
    
    # ---------------------------------------------------------
    # Fine della simulazione
    # ---------------------------------------------------------
  • Comandi di Pulizia:

    # Arresta e cancella servizio temporaneo
    sc.exe stop MpDlpService | Out-Null
    sc.exe delete MpDlpService | Out-Null
    
    # Rimuovi loader e payload fittizio
    Remove-Item -Path "$env:APPDATAMicrosoftRasManagementMpDlpService.exe" -Force -ErrorAction SilentlyContinue
    Remove-Item -Path "$env:TMPmalicious.dll" -Force -ErrorAction SilentlyContinue
    
    # Opzionale: elimina processi jsc.exe residui avviati dal test
    Get-Process -Name jsc -ErrorAction SilentlyContinue | Stop-Process -Force