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.

"grafico TB %% Definizioni delle classi classeDef azione riempimento:#99ccff classeDef strumento riempimento:#cccccc classeDef processo riempimento:#ffdd99 classeDef malware riempimento:#ff9999 %% Nodi inizio_phishing["<b>Azione</b> – <b>T1566.001 Allegato di spearphishing</b><br/>L’attaccante invia un’email di phishing con un allegato archive TXZ che contiene il payload malevolo."] classe inizio_phishing azione archive_malware["<b>Malware</b> – <b>Nome</b>: Archive TXZ Malevolo<br/><b>Descrizione</b>: Archive utilizzato per consegnare il payload iniziale JavaScript."] classe archive_malware malware esecuzione_utente["<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."] classe esecuzione_utente azione loader_powershell["<b>Processo</b> – <b>Nome</b>: Loader PowerShell<br/><b>Descrizione</b>: Esegue l’assembly .NET decrittato via riflessione senza scrivere su disco."] classe loader_powershell processo compilazione_difesa["<b>Azione</b> – <b>T1027.004 Compilare dopo la consegna</b><br/>L’assembly .NET decrittato viene caricato in memoria via riflessione."] classe compilazione_difesa azione compressione_difesa["<b>Azione</b> – <b>T1027.015 Compressione</b><br/>Il payload viene decrittato AESu2011 e quindi decompresso usando Gzip."] classe compressione_difesa azione stego_difesa["<b>Azione</b> – <b>T1027.003 Steganografia</b><br/>Il loader scarica immagini PNG ed estrae dati crittografati nascosti dai chunk iTXt/IEND."] classe stego_difesa azione mascherare_icona["<b>Azione</b> – <b>T1036.008 Mascheramento</b><br/>Il binario utilizza immagini di gatti come icona dell’applicazione per apparire innocuo."] classe mascherare_icona azione c2_crittografato["<b>Azione</b> – <b>T1573 Canale crittografato</b><br/>Ulteriori comunicazioni C2 avvengono tramite HTTPS con payload crittografati AESu2011256."] classe c2_crittografato azione accesso_cred["<b>Azione</b> – <b>T1555.003 Credenziali dai browser Web</b><br/>PureLogs enumera i browser ed estrae password salvate, cookie e file di cripto-u2011portafogli."] classe accesso_cred azione purelogs_strumento["<b>Strumento</b> – <b>Nome</b>: PureLogs<br/><b>Descrizione</b>: Utilità di dumps delle credenziali che raccoglie dati dai browser."] classe purelogs_strumento strumento archiviazione_dati["<b>Azione</b> – <b>T1560.003 Archiviazione dei dati raccolti</b><br/>I dati raccolti vengono compressi con Gzip e crittografati con AES prima dell’esfiltrazione."] classe archiviazione_dati azione esfiltrazione_http["<b>Azione</b> – <b>T1048.003 Esfiltrazione tramite protocollo non crittografato Nonu2011C2</b><br/>I dati vengono inviati tramite richieste HTTP POST a molteplici endpoint esterni."] classe esfiltrazione_http azione %% Connessioni inizio_phishing –>|consegna| archive_malware archive_malware –>|innesca| esecuzione_utente esecuzione_utente –>|esegue| loader_powershell loader_powershell –>|esegue| compilazione_difesa compilazione_difesa –>|usa| compressione_difesa compressione_difesa –>|usa| stego_difesa stego_difesa –>|abilita| mascherare_icona mascherare_icona –>|stabilisce| c2_crittografato c2_crittografato –>|abilita| accesso_cred accesso_cred –>|usa| purelogs_strumento accesso_cred –>|raccoglie| archiviazione_dati archiviazione_dati –>|esfiltra via| esfiltrazione_http %% Assegnazioni delle classi classe inizio_phishing azione classe archive_malware malware classe esecuzione_utente azione classe loader_powershell processo classe compilazione_difesa azione classe compressione_difesa azione classe stego_difesa azione classe mascherare_icona azione classe c2_crittografato azione classe accesso_cred azione classe purelogs_strumento strumento classe archiviazione_dati azione classe esfiltrazione_http azione "

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.