SOC Prime Bias: Medio

18 May 2026 18:43 UTC

PureLogs consegnato tramite steganografia PawsRunner

Author Photo
SOC Prime Team linkedin icon Segui
PureLogs consegnato tramite steganografia PawsRunner
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Sommario

La campagna si basa su un’email di phishing che trasporta un archivio TXZ che consegna un loader JavaScript, il quale imposta variabili d’ambiente e avvia conhost.exe in modalità senza testa. Il loader quindi decritta un assembly .NET noto come PawsRunner, che recupera immagini PNG contenenti contenuto crittografato nascosto tramite tecniche steganografiche. Da quelle immagini, il malware estrae il carico finale: PureLogs, un infostealer .NET. Una volta attivo, PureLogs si connette a un server di comando e controllo remoto tramite HTTPS ed esfiltra le credenziali del browser insieme a informazioni sul sistema.

Indagine

L’analisi ha dimostrato che il loader JavaScript estrae comandi dalle variabili d’ambiente dei processi, avvia PowerShell con la finestra nascosta e decritta un payload crittografato AES che viene eseguito tramite riflessione .NET. PawsRunner ruota tra tre API di rete e tre diverse stringhe user-agent mentre recupera i file PNG, quindi analizza i chunk iTXt and IEND per individuare i dati nascosti e decritta la fase successiva con RC4. PureLogs utilizza a sua volta TripleDES e Gzip per caricare una DLL downloader, effettua richieste HTTP protette da TLS a endpoint specifici e raccoglie un ampio set di dati relativi al browser dal sistema della vittima.

Mitigazione

Le organizzazioni dovrebbero bloccare gli allegati TXZ al gateway email, monitorare le conhost.exe istanze attive senza una finestra visibile, e rilevare la PowerShell avviata con il flag -w hidden . I team di sicurezza dovrebbero anche distribuire firme per PawsRunner e PureLogs, limitare il traffico in uscita verso il dominio e l’indirizzo IP di comando e controllo identificati, e limitare l’esecuzione di assembly .NET non firmati. Dove possibile, la rilevazione della steganografia dovrebbe essere applicata ai file immagine sospetti in entrata.

Risposta

Se questa attività viene rilevata, isolare l’endpoint interessato, terminare i processi sospetti conhost.exe e i processi PowerShell, rimuovere eventuali binari .NET rilasciati dal sistema. Le credenziali compromesse dovrebbero essere revocate, imporre l’autenticazione a più fattori e reimpostare le password del browser memorizzate. Gli investigatori dovrebbero anche eseguire indagini di rete per confermare che non si sia verificata alcuna ulteriore comunicazione di comando e controllo e applicare misure di rimedio per prevenire reinfezioni.

graph TB %% Definizioni classi classDef action fill:#99ccff classDef tool fill:#cccccc classDef process fill:#ffdd99 classDef malware fill:#ff9999 %% Nodi initial_phishing[“<b>Azione</b> – <b>T1566.001 Allegato Spearphishing</b><br/>L’attaccante invia una email di phishing con un archivio TXZ allegato contenente il payload malevolo.”] class initial_phishing action malicious_archive[“<b>Malware</b> – <b>Nome</b>: Archivio TXZ Malevolo<br/><b>Descrizione</b>: Archivio utilizzato per distribuire il payload JavaScript iniziale.”] class malicious_archive malware user_execution[“<b>Azione</b> – <b>T1204.004 Esecuzione Utente</b><br/>La vittima estrae l’archivio, il JavaScript esegue PowerShell in modalità nascosta e legge i comandi dalle variabili d’ambiente.”] class user_execution action powershell_loader[“<b>Processo</b> – <b>Nome</b>: Loader PowerShell<br/><b>Descrizione</b>: Esegue assembly .NET decrittata tramite reflection senza scriverla su disco.”] class powershell_loader process defense_compile[“<b>Azione</b> – <b>T1027.004 Compilazione Dopo la Consegna</b><br/>L’assembly .NET decrittata viene caricata in memoria tramite reflection.”] class defense_compile action defense_compress[“<b>Azione</b> – <b>T1027.015 Compressione</b><br/>Il payload viene decrittato con AES e successivamente decompresso tramite Gzip.”] class defense_compress action defense_stego[“<b>Azione</b> – <b>T1027.003 Steganografia</b><br/>Il loader scarica immagini PNG ed estrae dati cifrati nascosti dai blocchi iTXt/IEND.”] class defense_stego action masquerade_icon[“<b>Azione</b> – <b>T1036.008 Mascheramento</b><br/>Il binario utilizza immagini di gatti come icona applicativa per apparire benigno.”] class masquerade_icon action c2_encrypted[“<b>Azione</b> – <b>T1573 Canale Cifrato</b><br/>Ulteriori comunicazioni C2 avvengono tramite HTTPS con payload cifrati AES-256.”] class c2_encrypted action credential_access[“<b>Azione</b> – <b>T1555.003 Credenziali da Browser Web</b><br/>PureLogs enumera i browser ed estrae password salvate, cookie e file di wallet crypto.”] class credential_access action purelogs_tool[“<b>Strumento</b> – <b>Nome</b>: PureLogs<br/><b>Descrizione</b>: Utility di dumping credenziali che raccoglie dati dai browser.”] class purelogs_tool tool collection_archive[“<b>Azione</b> – <b>T1560.003 Archiviazione Dati Raccolti</b><br/>I dati raccolti vengono compressi con Gzip e cifrati con AES prima dell’esfiltrazione.”] class collection_archive action exfiltration_http[“<b>Azione</b> – <b>T1048.003 Esfiltrazione Tramite Protocollo Non-C2 Non Cifrato</b><br/>I dati vengono inviati tramite richieste HTTP POST a multipli endpoint esterni.”] class exfiltration_http action initial_phishing –>|consegna| malicious_archive malicious_archive –>|attiva| user_execution user_execution –>|esegue| powershell_loader powershell_loader –>|esegue| defense_compile defense_compile –>|usa| defense_compress defense_compress –>|usa| defense_stego defense_stego –>|abilita| masquerade_icon masquerade_icon –>|stabilisce| c2_encrypted c2_encrypted –>|abilita| credential_access credential_access –>|usa| purelogs_tool credential_access –>|raccoglie| collection_archive collection_archive –>|esfiltra tramite| exfiltration_http

Flusso di attacco

Esecuzione della simulazione

Prerequisito: Il controllo pre-volo Telemetria e Baseline deve essere superato.

  • Narrazione dell’attacco e comandi

    1. Fase 1 – Preparare il payload crittografato
      • L’attaccante crea un piccolo payload di prova ("segreto"), lo crittografa con AES‑256 usando una chiave conosciuta, codifica il testo cipher in Base64 e lo memorizza in una variabile d’ambiente ENC_PAYLOAD.
    2. Fase 2 – Eseguire il loader di decrittazione PowerShell
      • Un comando one-liner legge ENC_PAYLOAD, decodifica la stringa Base64, costruisce un AesCryptoServiceProvider.NET, deriva la chiave/IV, decritta i dati ed eventualmente esegue il testo in chiaro.
    3. Fase 3 – Generare la telemetria di rilevamento
      • Il comando PowerShell include la parola letterale “AES” (ad es., New-Object System.Security.Cryptography.AesCryptoServiceProvider) e viene registrato come EventID 4104, soddisfacendo la regola di rilevamento.
  • Script di test di regressione

    # -------------------------------------------------
    # Simulazione di decrittazione PowerShell AES (Attiva il rilevamento)
    # -------------------------------------------------
    # 1. Definire una chiave e un IV statici a 256 bit (per scopi dimostrativi)
    $key = [byte[]](0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,
                       0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20)
    $iv  = [byte]](0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0)
    
    # 2. Payload testo chiaro (esempio)
    $plain = [System.Text.Encoding]::UTF8.GetBytes("dati segreti")
    
    # 3. Criptare il payload usando AES (CBC, PKCS7)
    $aes = [System.Security.Cryptography.AesCryptoServiceProvider]::new()
    $aes.Key = $key
    $aes.IV  = $iv
    $aes.Mode = [System.Security.Cryptography.CipherMode]::CBC
    $aes.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7
    $encryptor = $aes.CreateEncryptor()
    $cipherBytes = $encryptor.TransformFinalBlock($plain,0,$plain.Length)
    $cipherB64 = [Convert]::ToBase64String($cipherBytes)
    
    # 4. Memorizzare il testo cifrato in una variabile d'ambiente
    
    # 5. Loader di decrittazione – la linea esatta che verrà registrata (contiene "AES")
    $loader = @"
    `$enc = [System.Environment]::GetEnvironmentVariable('ENC_PAYLOAD')
    `$bytes = [Convert]::FromBase64String(`$enc)
    `$aes = New-Object System.Security.Cryptography.AesCryptoServiceProvider
    `$aes.Key = $($key -join ',')
    `$aes.IV  = $($iv -join ',')
    `$decryptor = `$aes.CreateDecryptor()
    `$plain = `$decryptor.TransformFinalBlock(`$bytes,0,`$bytes.Length)
    `$result = [System.Text.Encoding]::UTF8.GetString(`$plain)
    Write-Output `"Decriptato: `$result`"
    "@
    
    # Eseguire il loader (verrà registrato come EventID 4104)
    Invoke-Expression $loader
  • Comandi di pulizia

    # Rimuovere la variabile d'ambiente
    
    # Eliminare tutte le variabili temporanee dalla sessione
    Remove-Variable -Name key,iv,plain,cipherBytes,cipherB64,loader -ErrorAction SilentlyContinue

Validazione post-simulazione

  1. Eseguire la query di validazione (esempio KQL sopra) ma filtrare per ScriptBlockText contiene "AES" per confermare che la rilevazione ha attivato.
  2. Esaminare i dettagli dell’allerta nel SIEM; verificare che il nome dell’allerta corrisponda alla regola (se definita) e che la gravità sia riportata come Alta.

Osservazioni finali

  • La regola rileva con successo lo scenario base di utilizzo “AES”.
  • Gli avversari possono evadere dividendo la parola (ad esempio, "AE"+"S"), caricando la classe .NET tramite riflessione, o eseguendo la decrittazione all’interno di binari compilati.
  • Migliorare la regola con indicatori comportamentali (uso di variabili d’ambiente per il testo cifrato, stringhe ad alta entropia, creazione di AesCryptoServiceProvider oggetti e successivi TransformFinalBlock chiama) migliorerà la resilienza contro l’offuscamento semplice.