Manuel Roccon : 9 Maggio 2024 08:18
Autori Manuel Roccon (team leader di HackerHood) e Matteo Brandi
In questo articolo andremo ad analizzare come funziona un infostealer, nello specifico Agent Tesla, un malware che ha come obiettivo la sottrazione di dati sensibili come password, contatti mail ed accessi vari.
Eseguiremo sia un analisi statica e dinamica di questo infostealer, percorrendo tutti i passi per comprendere il funzionamento questo malware (e questa tipologia), dalla distribuzione, ai meccanismi usati per eludere i sistemi anti malware fino all’esfiltrazione dei dati.
Sei un Esperto di Formazione?
Entra anche tu nel Partner program!
Accedi alla sezione riservata ai Creator sulla nostra Academy e scopri i vantaggi riservati ai membri del Partner program.
Per ulteriori informazioni, scrivici ad [email protected] oppure su Whatsapp al 379 163 8765
Supporta RHC attraverso:
Ringraziamo Pietro Melillo (team Leader della Cyber Threat Intelligence di RHC) per averci fornito il sample e informazioni varie per poter eseguire l’analisi.
Questa è la storia di una scoperta sorprendente. Se fosse un’operazione di cyber security si chiamerebbe…operazione Pollicino, alla caccia di Agent Tesla. È un sabato come un altro, dopo aver lavorato tutta la settimana, ti ritrovi a fare le cose che non sei riuscito a fare ma che servono, come la spesa per esempio.
Ero al supermercato e come il miglior imbruttito milanese, compro quasi sempre le stesse cose anche perchè so già dove sono. Un salutare time saving. Sento il cellulare che vibra, una chiamata, chi chiama il Sabato pomeriggio??
È Manuel! Manuel non chiama mai, al massimo ti manda un messaggio. Se Manuel chiama, deve essere importante.
Rispondo: “Ciao Manuel, al momento sono afk…”
“Non importa, ho fatto una scoperta, ti mando tutto appena puoi guarda il materiale!”
“Ok appena posso lo guardo subito. Ciao.”
Nei gruppi di volontari di Red Hot Cyber, spesso viene sottoposto materiale da analizzare come file sospetti. Puntualmente il gruppo, armato di competenza e determinazione, si tuffa nell’analisi di quanto inviato.
Questa volta siamo arrivati ad una scoperta importante. Ma andiamo per gradi.
Rapidamente finisco la spesa e torno alla tastiera e guardo il materiale. Si Manuel aveva scoperto qualcosa di promettente.
Come tutte le storie, c’è sempre un inizio e la nostra comincia con una PEC all’amministrazione di una azienda italiana e quando ti arriva una PEC…la leggi. Pagamenti…qualcuno sta mandando una copia di un pagamento.
D’altro canto è prassi comune inviare una copia di un bonifico dopo averla fatta per accelerare le procedure. Questa volta il personale amministrativo era preparato (le persone sono sempre il primo baluardo di difesa) e complice anche il testo sgrammaticato ed informale, non aprono l’allegato ma lo mandano a noi.
Il file allegato alla PEC è un file archivio gz contenente un file hta quindi è un malware…what else? Come prassi viene caricato il file in una macchina Windows nel laboratorio per una analisi dinamica e l’analisi dice che il malware non è altro che un downloader che si connette ad un dominio.
Ecco la sequenza sintetica degli eventi una volta attivato il file hta:
Gli script powershell sono offuscati con codifica base64 e molta spazzatura. Manuel mi stava chiedendo una conferma di quello che aveva visto, che non era tanto il malware o lo script… Visionato il materiale lo chiamo subito: “Si Manuel confermo quello che hai visto”.
In questo punto percorreremo la parte più procedurale, andremo ad analizzare tutti gli step della catena di attacco che porteranno all’esfiltrazione dei dati. Qui sotto riassunti tutti i passaggi macro all’apertura del allegato malevolo fino al esfiltrazione dei dati.
Abbiamo eseguito un’analisi dinamica tramite sandbox e raccolto anche la catena di eventi dall’apertura del file hta, fino all’infiltrazione dati da parte del processo wab.exe.
Qui vediamo un dettaglio ancora migliore sui comandi eseguiti.
Riportiamo anche la matrice MITRE ATT&CK che ci dà subito un’idea delle tecniche utilizzate nell’attacco.
Possiamo vedere tecniche subito tecniche di code injection, offuscamento, scripting e quelle di esfiltrazione dati, quindi dovremmo aspettarci di vedere negli step successivi che andiamo ad analizzare.
Ora vediamo le varie fasi nel dettaglio.
Il vettore iniziale è un allegato gz che viene distribuito via email con una finta copia di pagamento.
All’interno dei file compressi è presente un “falso PDF” con estensione .hta.
“Sfortunatamente” dallo scorso anno Windows ha aggiunto il supporto a questi formati particolari quindi, estensioni meno conosciute all’utente come questa, potrebbero tranne in inganno l’utente
Dichiarazione Microsoft:.
Per chi non li conoscesse, i file HTA sono file HTML con il “potere” di eseguire del codice vbscript, quindi scrivere e leggere file su disco ed eseguire comandi powershell.
Qui sotto potete vedere il file originale aperto con il notepad, lo script è offuscato con varie tecniche per sfuggire agli antimalware:
Dopo una breve analisi, possiamo riassumere l’attività di questo HTA così: lo script, nonostante le numerose righe di codice, non farà altro che assemblare una stringa powershell, eseguire un replace e dopo aver verificato che endpoint è connesso a internet tramite un ping, ed infine eseguire il powershell.
Questo payload è lo script powershell creato al volo ed eseguito dal HTA. Possiamo vedere che il codice è stato offuscato anche questo con varie tecniche.
Sono presenti 2 funzioni che permettono di offuscare la logica, variabili e metodi per non essere individuabile facilmente agli anti malware ed EDR, nel dettaglio:
Questa funzione sottostante serve a portare “leggibili” e interpretabili da powershell le variabili dichiarate:
Function Fldeostens($Germaniserendes)
{
$Oppustningerne=$Germaniserendes.Length-$Ledighed;
For($Kommunalisere=5; $Kommunalisere -lt $Oppustningerne; $Kommunalisere+=(6))
{
$Americophobe+=$Germaniserendes.$Liveability.Invoke($Kommunalisere, $Ledighed);
}
$Americophobe;
}
La funzione farà in modo che il testo presente nella variabile, prima “decodificata”, verrà eseguita da powershell iex():
function Kambregner($Indflettendes)
{
. ($Pemphredo) ($Indflettendes);
}
Per esempio la variabile $Lactinate,
$Lactinate=Fldeostens 'T redM.ntanoResprzFrstkiSubtrlLat rl .aria salg/Delub5Calci.Belda0 N.st Tol (DevitWparagiGroatn Sugnd,ilsuoSkubowGedersVishe AntiqNPano,TSkamf Strim1,raba0Spot .Figen0 Unex;Over ho.eW Perii LemmnArgol6Aposp4Livet;Testa Pro,xLysbi6Otom 4Benth; Tryk Ch,rrrCad,ivUncon: Unsc1Kults2Scra.1A,nds.wangu0Eu or)Coapt BagaGDeklae PumicStoppk Begro staf/ Tako2 Int 0Desta1Skran0Er ve0Waddl1Tyver0Pa,an1Hyper He,aFSemisibasharSki se S lsfSolhjoK.edix,itch/.ndre1varme2 V.lu1Rege . ,fst0Syndi ';
diventerà:
$Lactinate= 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0';
Invece questa:
Kambregner (Fldeostens ' Opsti,eteof Fdek Belig(Conset Re,eeChales Udvet.erac-FadllpUdslaa.enattSvupphsinol he,sTBywal: Pdag\Uig,nS CohouepistpCreigeFj llrfyrinc S rmoAbstrr Ag.rd WastiOpdy aFanemlVi,trlMooncySe.iw2Subco4 Pass4Kende.,merctForkoxHostltOrlew) icis{PljnieM,nicx GuldiaromatAr,er}Gur,o;Tank. ');
Verrà tradotta in:
iex ('if (test-path T:\Supercordially244.txt){exit};');
Dopo alcune decodifiche, possiamo vedere che il file inizia a prendere forma:
ma rimane ancora lungo e complesso da leggere, in quanto ci sono molte variabili che vengono richiamate a catena per comporre i vari comandi.
Riorganizziamo un po’ la logica:
Vediamo che il file diventa molto semplice e non fa altro che scaricare un file da internet, salvarlo in %appdata% dell’utente, decodificarlo da base64 ed eseguirlo.
Nelle ultime righe di codice in particolare salva tutto il contenuto del file in una variabile $Protons che servirà durante l’esecuzione del secondo payload (ne parleremo dopo).
In seguito viene presa una parte di questo file, tramite substring, e inserita nella variabile $Aldersbestemmelserne e subito dopo verrà eseguita via powershell iex.
Il Payload 1 come avevamo visto, scarica un file da http://atordeg.com.br/nnn/Skinverdenerne.snp e lo salva in C:\Users\[user]\AppData\Roaming\Skemakanters.Tap
Facendo una codifica in base64 al volo possiamo osservare che dalla dalla riga posizione 326117 del file è presente del powershell:
Ora ci concentriamo nella parte in cui il Payload 1 taglia il file scaricato dal byte 326117 e successivamente vista prima.
Notiamo che viene rimossa tutta la parte indecifrabile (quella parte tornerà fondamentale nello step successivo) però osservando bene anche questo codice è offuscato.
Anche qui sono presenti le funzioni del primo payload quali “Fldeostens()” per decodificare la stringa e “Kambregner()” che esegue il codice presente nelle variabili tramite “iex ()”.
Inoltre sono presenti delle righe che iniziano con carattere “#”. Questa è spazzatura per evadere software di sicurezza, quindi andremmo a rimuoverlo.
Una volta rimossi i commenti e convertito il file dove erano presenti le funzioni “Fldeostens()” e “Kambregner()”, a metà compare una nuova funzione di offuscamento chiamata “Narratio()” e una nuova tipologia di variabili offuscate, questa volta con contenuto numerico.
A differenza di quella precedente, la funzione “Narratio()” è parametrizzata con 2 valori, il primo è la stringa da decodificare, la seconda un parametro 1 o 0 che farà eseguire o meno anche il comando dopo la decodifica della stringa.
Per esempio la variabile $Tilpropning230
$Tilpropning230=Narratio '684C46574A564A43510B724C4B16170B704B564443406B44514C53406840514D4A4156'
verrà convertita in:
$Tilpropning230='Microsoft.Win32.UnsafeNativeMethods'
Mentre:
Narratio '0142494A4744491F6844564E404B41400518057E645555614A48444C4B781F1F66505757404B51614A48444C4B0B624051645656404847494C40560D0C' 1
verrà convertita e sarà eseguita:
iex ('$global:Blidgres = $Wienerbrds.GetMethod($Komforten, [Type[]] @($Ubeskadiget, $Sceneskifts165))')
Pulendo e riorganizzando la logica dello script, questo è il risultato:
Prima abbiamo accennato che nella variabile “$Protons” era stato salvato tutto il contenuto del secondo payload scaricato dal primo.
Nelle fasi finali del secondo payload, il contenuto viene “tagliato” mantenendo invece solo la parte incomprensibile.
Infatti nell’ultimo segmento dello script (visibile qui sotto) sembra invocare uno shellcode nascosto nel contenuto della variabile “$Protons”.
Infatti come si vede lo script va a prelevare i dati dal byte 652, 325465 byte per creare il successivo shellcode da iniettare in memoria ed eseguire.
Per i successivi ultimi step non abbiamo eseguito un’analisi statica precisa, ma seguendo l’analisi dinamica abbiamo dedotto il comportamento.
Nella fase successiva shellcode crea un processo WAB.exe, eseguibile e risulta firmato da Microsoft.
Utilizzare un software firmato digitalmente e legittimo è una tecnica che può evadere alcuni sistemi anti malware.
Stiamo comunque parlando della tecnica di Reflective Code Loading nel Mitre ATT&C, in quanto viene iniettato del codice malevolo, spesso cifrato all’interno di un processo legittimo.
Questo processo, successivamente, scarica da internet un file BIN, la shellcode che conterrà il vero infostealer Agent Tesla.
L’infostealer andrà quindi alla ricerca nel sistema di credenziali ed indirizzi email che saranno caricati in remoto.
L’infostealer infine caricherà in un percorso ftp le credenziali rubate dai vari browser, i contatti mail ed i portachiavi di windows.
Analizzando il tracciato di dati scambiati con l’esterno, abbiamo scoperto che l’aggressore ha sfruttato un percorso FTP rubato da un azienda in territorio americano, recuperando anche le credenziali.
Abbiamo estratto anche il sample generato dalla sandbox:
Spesso i criminali informatici utilizzano punti d’appoggio rubati di aziende esistenti per abbassare il rischio di essere bloccati e per sfuggire ai Geo IP Block.
Come abbiamo visto sopra, per aggirare le difese, il malware è scaricato in formato bin ed iniettato direttamente nello spazio di memoria di un processo legittimo di Windows.
L’uso dell’istruzione “VirtualAlloc” nel codice da conferma.
Leggendo bene poi il codice, assomiglia molto a….Metasploit Powershell Reflection Payload.
Il metodo Reflection è un metodo usato per ispezionare processi a runtime, ovvero mentre sono eseguiti. Questo consente però anche di iniettare codice di file portable o DLL direttamente in memoria.
Esso è comune sia a .NET che a Java e C++.
Il Framework .NET, con il namespace System.Reflection, fornisce delle API per ispezionare un processo in esecuzione e questo consente anche di inserire del codice.
Per chi non li conoscesse gli indicatori di compromissione (IoC) sono informazioni su una specifica violazione della sicurezza che possono aiutare i team di sicurezza a determinare se si è verificato un attacco.
Questi dati possono includere dettagli sull’attacco, come il tipo di malware utilizzato, gli indirizzi IP coinvolti e altri dettagli tecnici.
Qui sotto sono elencati gli indicatori di compromissione rilevati:
Main object – PAGAMENTO_0240424 PDF.hta
DNS requests
Connections
HTTP/HTTPS requests
Dall’analisi il malware risulta essere Agent Tesla versione 2020, vista la capacità di esfiltrare dati via FTP.
Agent Tesla è un malware la cui firma è ben nota in quanto noto dal 2014 con una campagna dedicata al nostro paese rilevata nel 2022 .
Se ancora viene utilizzato significa che ha ancora delle potenzialità di infezione.
Il vettore di attacco in questo caso è codice VBScript, linguaggio che risulta deprecato dal 2019.
Questo ribadisce, se ce ne fosse bisogno:
Per completare, l’analisi come ci permette di capire se nella nostra infrastruttura abbiamo messo in campo tutte le procedure e best practice per poterci difendere.
In questo caso per antispam poteva evitare che la mail fosse recapitata al mittente, della formazione di non aprirla, limitazioni nelle connessioni di uscita per completare l’esfiltrazione dei dati su FTP.