ABBATTIMENTO DI BLACKENERGY, PARTE 2 – “IL SEGNO”

[post-views]
Marzo 01, 2016 · 8 min di lettura
ABBATTIMENTO DI BLACKENERGY, PARTE 2 – “IL SEGNO”

Non farò un discorso su cosa sia un framework BlackEnergy, poiché se ne è già scritto molto, anche senza di me, tuttavia voglio fare riferimento alle informazioni di questa particolare recensione:

Il gruppo di criminali informatici dietro BlackEnergy, la famiglia di malware presente dal 2007 e riemersa nel 2014, era attivo anche nel 2015. ESET ha recentemente scoperto che il Trojan BlackEnergy è stato utilizzato recentemente come backdoor per consegnare un componente distruttivo, KillDisk, volto alla distruzione di file sui dischi rigidi in attacchi contro aziende mediatiche ucraine e contro l’industria dell’energia elettrica…

Tutti, incontrate il Flashplayer!

Durante l’indagine sull’attacco alla nostra infrastruttura, abbiamo rilevato vari campioni di malware e tra questi Flashplayerapp.exe (https://www.virustotal.com/ru/file/c787166ad731131c811d1a63080ac871ec11f10bcd77b9a1e665f1c9bbaa9a54/analysis/)In breve, flashplayerapp estrae main_light.dll nel proprio spazio di memoria e trasferisce il controllo ad esso. Questa libreria è una versione leggera di BlackEnergy ed è utilizzata per la comunicazione C&C per scaricare il carico utile principale con funzionalità a seconda degli obiettivi perseguiti dall’attaccante. Crea un file: C:UsersuserAppdataAdobecache.datblackenerfy-shtamp_2Sebbene criptato, questo file contiene varie informazioni, tra cui la versione build (come 2015lstb), l’indirizzo del centro di comando e controllo da cui può recuperare vari carichi (come hxxps://188.40.8.72/l7vogLG/BVZ99/rt170v/solocVI/eegL7p.php), ecc. Mentre esaminavo questo campione, ho spostato l’attenzione dal C&C in quanto una particolare parte del codice ha catturato la mia attenzione, poiché era un evidente segno dell’utilizzo di una tecnica chiamata permutazione del codice. Lasciami tradurre una citazione da questa fonte http://hacks.clan.su/publ/11-1-0-481:

…La permutazione è la trasformazione di codice già completo. I maggiori progressi in questa tecnica fino ad oggi sono stati fatti da Z0MBiE. Tuttavia, anche le versioni più vecchie del motore attribuivano a qualcuno chiamato Lord_ASD. I successivi avanzamenti in questa tecnica dopo di lui furono fatti da Vecna e SBVC. Allora, cos’è una permutazione? L’algoritmo di base per i motori di permutazione è la disassemblatura del codice seguita dalla sua mutazione e riassemblaggio. Diamo un’occhiata all’algoritmo più semplice usato in un motore di permutazione:
Tutte le istruzioni di codice sono disassemblate per lunghezza, i salti condizionali e incondizionali sono segnati.
Le istruzioni sono sostituite con quelle sinonime e vengono inserite istruzioni spazzatura tra di esse. Tutti i salti sono ricalcolati.
Questo tipo di polimorfismo è più promettente per i seguenti motivi:
Flessibilità (non facilità) di codifica del motore
Alto livello di mutazioni
Necessità di emulare tutte le istruzioni
Nonostante questo tipo di polimorfismo sia noto da un po’ di tempo, non è diventato mainstream a causa della difficoltà di implementazione…
Quindi ecco come si presentava il frammento di codice (le istruzioni aggiunte dal motore di permutazione sono evidenziate in rosso e non influiscono assolutamente sulla funzionalità, rendono solo il codice più difficile da comprendere):blackenerfy-shtamp_3Rimuovendo le stringhe non necessarie, otteniamo un meccanismo che elabora tutti i nomi delle funzioni in kernel32.dllblackenerfy-shtamp_4trasformandoli (i nomi) in una forma di hash che poi confronta con un certo valore:blackenerfy-shtamp_5Ricreiamo questo meccanismo usando C come esempio. Di conseguenza, otteniamo un’utilità che può produrre per noi un “dizionario” che contiene i nomi di tutte le funzioni nella libreria kernel32.dll e i valori hash di questi nomi. Proviamo a cercare i valori hash che abbiamo ottenuto durante l’analisi inversa del codice nel nostro nuovo “dizionario”. Per prima cosa cerchiamo il valore dal registro EAX (0x5147F60F), e lo confrontiamo con il valore di riferimento:blackenerfy-shtamp_6La nostra teoria sta funzionando: il nostro campione ha elaborato il nome della prima funzione, creato l’hash e ora lo sta confrontando con il valore di riferimento contenuto nel buffer (0xC8AC8026). Cerchiamo questo valore e… ecco che otteniamo la funzione LoadLibraryA!blackenerfy-shtamp_7Per saltare un altro muro di testo come esempio, menzionerò solo che il nostro “campione” utilizza lo stesso approccio per cercare un’altra funzione chiamata GetProcAdress.blackenerfy-shtamp_8Utilizzando queste due funzioni, il nostro “campione” può caricare altre librerie ed estrarre gli indirizzi per le funzioni di cui ha bisogno.

Le tracce lasciate dall’Engine

La tecnica di rendere l’analisi del codice statico difficile tramite chiamata di funzione basata su un valore hash piuttosto che sul suo nome non è nuova. Tuttavia, mi ha portato al seguente pensiero: nonostante come il codice dannoso venga elaborato, conosciamo l’algoritmo di hashing dei nomi delle funzioni e quindi possiamo cercare con fiducia queste due funzioni (LoadLibraryA e GetProcAdress) nel codice. Così, ho iniziato a cercarle nei motori di ricerca per i riferimenti a questo hash (0xC8AC8026) per vedere se qualcuno ha utilizzato lo stesso motore del nostro esempio prima e, con mia sorpresa, ho trovato qualcosa:Questo hash è menzionato per la prima volta nel 2006 (l’articolo si trova solo su archive.org): https://web.archive.org/web/20060614030412/http://osix.net/modules/article/?id=789

blackenerfy-shtamp_9Più tardi, nel 2008, un potenziale autore dell’algoritmo appare sul forum:https://exelab.ru/f/index.php?action=vthread&forum=6&topic=11845

blackenerfy-shtamp_10Successivamente, nel 2009, un articolo di analisi sul shellcode MS08-067 viene pubblicato sui blog.technet.com:http://blogs.technet.com/b/srd/archive/2009/06/05/shellcode-analysis-via-msec-debugger-extensions.aspx

blackenerfy-shtamp_11Poi, nel 2013, la rivista “XAKEP” (una delle più grandi stampe russe su IT e Sicurezza Informatica) pubblica un articolo https://xakep.ru/2011/06/23/55780/ dove menzionano lo stesso identico algoritmo che crea lo stesso hash (!):blackenerfy-shtamp_12Aspetta un attimo, la situazione che abbiamo qui è che lo stesso algoritmo che genera gli stessi valori hash è in uso da oltre 10 anni e nessuno se n’è accorto? Se fosse altrimenti, allora affinché il flashplayerapp.exe (https://www.virustotal.com/ru/file/c787166ad731131c811d1a63080ac871ec11f10bcd77b9a1e665f1c9bbaa9a54/analysis/) fosse lo stesso come appare ora, sarebbe impossibile che passasse inosservato dalle soluzioni antivirus mentre viviamo già nell’anno 2016:blackenerfy-shtamp_13C’è un chiaro “segno” lasciato da questo motore di permutazione concreto che è stato utilizzato nel nostro campione analizzato e mi sembra una firma valida. Inoltre, è piuttosto facile da tracciare direttamente nel testo chiaro:blackenerfy-shtamp_14Bene, abbiamo le nostre ipotesi e la teoria è chiarita, quindi procediamo alla pratica e proviamo a trasformare le nostre conclusioni in una firma/regola Yara:

rule API_Hash

{meta: description = “Hash of LoadLibrary that is {26 80 ac c8} e GetProcAddres {ee ea c0 1f}”26 80 ac c8

$a = {ee ea c0 1f

$b = {

condition: $a and $b

}

Win32/Spy.Bebloh (trojan bancario) — http://www.virusradar.com/en/Win32_Spy.Bebloh/detailWin32/PSW.Fareit (Trojan per il furto di password) — http://www.virusradar.com/en/Win32_PSW.Fareit/detailWin32/Rustock (Backdoor) — http://www.virusradar.com/en/Win32_Rustock/detailWin32/TrojanDownloader.Carberp (Dropper che installa Trojan bancario Carberp) — http://www.virusradar.com/en/Win32_TrojanDownloader.Carberp/detailWin32/Kelihos (Spammer) — http://www.virusradar.com/en/Win32_Kelihos/detailQuesta lista contiene solo famiglie note. Questi due valori di hash appaiono anche in altre famiglie di malware tra cui Ransomware / file encryptors (Win32/Filecoder.HydraCrypt), un miner di Bitcoin (CoinMiner.LC), un WinLocker (LockScreen.AQT) e altri.

Finora, posso anche aggiungere che questa regola Yara abbastanza semplice non ha portato a un singolo falso positivo fino ad oggi, ma il test è stato condotto solo su poche decine di computer. Quindi, esprimo davvero le mie speranze che dopo la pubblicazione di questa ricerca, Voi (!) e coloro che hanno letto fin qui condivideranno il loro feedback, che sarà abbastanza ampio da provare o confutare la precisione di questa regola! Ovviamente, l’uso di soli otto byte per una firma è eccezionalmente piccolo e la regola catturerà molto probabilmente alcuni file “legittimi”. Tuttavia, questa leggera regola Yara può vivere in un sandbox come parte di una logica di analisi più complessa.

Conclusioni

Lo scopo di questo articolo non è l’ingegneria inversa del malware BlackEnergy, ma voglio piuttosto evidenziare il fatto che gli strumenti utilizzati durante l’assemblaggio di un codice malware lasciano le loro tracce e possono portare alla comparsa di utili indicatori che possono essere utilizzati per la difesa. E quegli indicatori possono rimanere inosservati per un lungo tempo…

Tradotto dall’originale da Andrii Bezverkhyi | CEO SOC Prime

Indice dei Contenuti