Redazione RHC : 1 Ottobre 2022 16:51
BlueSky è un ransomware individuato per la prima volta nel maggio 2022 e ha attirato l’attenzione dei ricercatori delle minacce per due motivi principali: il primo è che il gruppo dietro il ransomware non adotta il modello della doppia estorsione; la seconda è che i loro bersagli sono anche utenti normali perché il ransomware è stato individuato colpire software non originali.
Per questi motivi, Yoroi malware ZLab ha deciso di tenere traccia della minaccia, seguendo la distribuzione dei campioni, effettuando un’analisi tecnica del payload del ransomware.
Hash | 9e302bb7d1031c0b2a4ad6ec955e7d2c0ab9c0d18d56132029c4c6198b91384f |
Minaccia | ransomware |
Breve descrizione | BlueSky ransomware |
SSDEEP | 1536:G+5geBR2Q+a8M124Zl2i5SADBDg8trv4t9MBY5ySvV:GDeBgQ+a8M12Y2i59hrvWMBGvV |
Si inizia eseguendo il PEB (Process Environment Block) per caricare dinamicamente le API. È una tecnica comune per non mostrarli staticamente nella tabella di importazione e si percorre uno dei tre elenchi collegati, situati in PEB_LDR_DATA come InLoadOrderModuleList.
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:
In questo modo si è in grado di enumerare i moduli contenuti all’interno della lista collegata e di confrontarli con i nomi hash nascosti all’interno del codice per importare correttamente quelli desiderati.
In questo caso, le API vengono convertite in hash con l’algoritmo djb2 .
La figura seguente mostra invece le routine per caricare dinamicamente la funzione:
Altre stringhe critiche vengono offuscate tramite il metodo stackstrings e una semplice routine per crittografarle
Tuttavia, l’algoritmo è facile da ripristinare ed è stata sviluppato un semplice script per decrittografare le stackstring:
string = [123,82,90,123,45,56,32,88,94]
decrypted = ""
for i in string:
decrypted += chr((34 * (i - 94) % 127 + 127) % 127)
print(decrypted)
Una volta risolte le prime funzioni, si chiama NtSetInformationThread con ThreadHideFromDebugger nascondendo il thread per evitare che possa essere eseguito il debug.
Durante l’analisi del campione, si sono riscontrate somiglianze con Conti Ransomware nel modo in cui le stringhe vengono offuscate e in alcune altre routine, come il modo in cui BlueSky rimuove le copie shadow tramite l’interfaccia COM WMI.
Il malware abusa dell ‘ “Interfaccia COM ICMLuaUtil (3E5FC7F9-9A51-4367-9063-A120244FBEC7)”. Tuttavia, questa tecnica è una tecnica ben nota e documentata disponibile pubblicamente su Internet, adottata sia nelle operazioni di intrusione che di sviluppo di malware.
L’esempio chiama le API RtlAdjustPrivilege con il token “SeDebugPrivilege“, al fine di ottenere il privilegio di manipolare arbitrariamente ogni file e processo.
BlueSky procede generando l’ID vittima eseguendo l’hashing con MD5 delle seguenti informazioni di sistema:
Quindi l’hash viene passato alla seguente routine personalizzata:
Viene quindi creato un mutex “Global\\{generated_id}” in questo caso essendo “Global\1580B4213F8F3E90E4E0E3CD1F6FAC52”
Ora è il momento di crittografare i file.
La prima operazione dell’esempio consiste nell’acquisire un handle al provider di crittografia PROV_RSA_FULL chiamando CryptAcquireContextA :
BlueSky memorizza le informazioni relative alla crittografia, nella chiave di registro “HKCU\SOFTWARE\1580B4213F8F3E90E4E0E3CD1F6FAC52\”. Per memorizzare le informazioni di ripristino, utilizza “ ChaCha20 + Curve25519 + RC4 (su RECOVERYBLOB) ”, mentre “ ChaCha20 + Curve25519 ” per la crittografia
Sotto la routine di crittografia:
BlueSky crea un elenco dei file esclusi all’interno del codice.
L’elenco è il seguente:
L’esempio implementa anche alcune interessanti funzionalità di gestione delle eccezioni per evitare il crash del sistema.
Nel dettaglio, prima di procedere alla cifratura BlueSky controlla se dopo aver chiamato CreateFileW il LastErrorValue è ERROR_SHARING_VIOLATION se true, l’esempio richiama NtQueryInformatonFile recuperando il FileProcessIdsUsingFileInformation che contiene un elenco dei PID che utilizzano il file.
Se il PID non è uguale a se stesso o al PID di explorer.exe recuperato in precedenza, chiama NtQueryInformatonProcess con ProcessInformationClass impostato su 29 (ProcessBreakOnTermination) per recuperare un valore che indica se il processo è considerato critico.
In questo caso, il malware salta quel file e continua a crittografare gli altri.
L’esempio può impedire al sistema di entrare in modalità di sospensione o spegnere il display chiamando SetThreadExecutionState a ES_CONTINUOUS
Al termine della crittografia, la richiesta di riscatto punta al blog degli aggressori:
Il ransomware Blusky è una prova che ancora oggi i criminali informatici utilizzano tecniche di ingegneria sociale altamente efficaci. Quando cerchiamo un software crackato, dobbiamo sapere che si potrebbe annidare al suo interno un un ransomware che ci chiederà un riscatto elevato.
Quindi, è necessario sensibilizzare le persone ad evitare l’installazione di software crackati, non solo all’interno del perimetro aziendale, ma anche all’interno dei dispositivi domestici. È una misura preventiva semplice ma efficace per difendersi da minacce simili.
rule bluesky_ransomware
{
meta:
author = "Yoroi Malware ZLab"
description = "Rule for BlueSky Ransomware"
last_updated = "2022-09-14"
tlp = "WHITE"
category = "informational"
hash = "9e302bb7d1031c0b2a4ad6ec955e7d2c0ab9c0d18d56132029c4c6198b91384f"
strings:
//sub_00407a30
$1 = {55 8b ec 83 ec ?? 56 e8 ?? ?? ?? ?? 85 c0 0f 84 ?? ?? ?? ?? 0f 10 05 ?? ?? ?? ?? 68 ?? ?? ?? ?? 68 ?? ?? ?? ?? 0f 11 4? ?? 68 ?? ?? ?? ?? 0f 10 05 ?? ?? ?? ?? c7 4? ?? ?? ?? ?? ?? c7 4? ?? ?? ?? ?? ?? 0f 11 4? ?? e8 ?? ?? ?? ?? 0f 10 4? ?? 83 c4 ?? 8b d0 8d 4? ?? 50 83 ec ?? 8b cc 6a ?? 6a ?? 83 ec ?? 0f 11 01 8b c4 0f 10 4? ?? 0f 11 00 ff d2 85 c0 0f 88 ?? ?? ?? ?? 68 ?? ?? ?? ?? 68 ?? ?? ?? ?? 68 ?? ?? ?? ?? e8 ?? ?? ?? ?? 83 c4 ?? 8d 4? ?? 51 ff d0 68 ?? ?? ?? ?? 68 ?? ?? ?? ?? 68 ?? ?? ?? ?? e8 ?? ?? ?? ?? 83 c4 ?? 8d 4? ?? 51 ff d0 68 ?? ?? ?? ?? 68 ?? ?? ?? ?? 68 ?? ?? ?? ?? e8 ?? ?? ?? ?? 83 c4 ?? 8d 4d c8 51 ff d0 68 ?? ?? ?? ?? 68 ?? ?? ?? ?? 68 ?? ?? ?? ?? e8 ?? ?? ?? ?? 83 c4 ?? 8d 4? ?? 51 ff d0 0f 10 4? ?? 8b 4? ?? 83 ec ?? 8b c4 83 ec ?? 8b 11 0f 11 00 8b c4 83 ec ?? 0f 10 4? ?? 0f 11 00 8b c4 83 ec ?? 0f 10 4? ?? 0f 11 00 8b c4 0f 10 4? ?? 51 0f 11 00 ff 52 28 68 ?? ?? ?? ?? 68 ?? ?? ?? ?? 68 ?? ?? ?? ?? 8b f0 e8 ?? ?? ?? ?? 83 c4 ?? 8d 4? ?? 51 ff d0 68 ?? ?? ?? ?? 68 ?? ?? ?? ?? 68 ?? ?? ?? ?? e8 ?? ?? ?? ?? 83 c4 ?? 8d 4? ?? 51 ff d0 68 ?? ?? ?? ?? 68 ?? ?? ?? ?? 68 ?? ?? ?? ?? e8 ?? ?? ?? ?? 83 c4 ?? 8d 4? ?? 51 ff d0 68 ?? ?? ?? ?? 68 ?? ?? ?? ?? 68 ?? ?? ?? ?? e8 ?? ?? ?? ?? 83 c4 ?? 8d 4? ?? 51 ff d0 85 f6 78 ?? 8b 4? ?? 8d 5? ?? 52 68 ?? ?? ?? ?? 50 8b 08 ff 5? ?? 85 c0 78 ?? 8b 4? ?? 6a ?? ff 7? ?? 8b 08 50 ff 5? ?? 8b 4? ?? 85 c9 74 ?? 8b 01 51 ff 5? ?? 8b 4? ?? 85 c9 74 ?? 8b 01 51 ff 50 08 68 ?? ?? ?? ?? 68 ?? ?? ?? ?? 68 ?? ?? ?? ?? e8 ?? ?? ?? ?? 83 c4 ?? ff d0 5e 8b e5 5d c3}
condition:
uint16(0) == 0x5A4D and $1
}