Introduzione
C’è una DLL che fa tremare gli analisti del malware: si chiama ADVAPI32.dll.
Al suo interno ci sono svariate funzioni, tristemente note sono CryptAcquireContextA, CryptEncrypt e CryptDecrypt.
Ok, avete capito già di cosa stiamo parlando: ransomware.
Sappiamo bene che gli attaccanti trovano sempre modi creativi per aggirare le difese. Tradizionalmente questo veniva fatto con packer, crypter e offuscamento del codice. L’intelligenza artificiale in termini di protezione preventiva tuttavia solleva subito un sacco di “red flag” se vengono usati questi strumenti. Il miglior modo oggigiorno è usare le funzionalità native del sistema operativo. Ne abbiamo già parlato in un altro articolo.
Se già questo approccio è già geniale di per sé, non possiamo che soffermarci sulla creatività usata dagli attaccanti nel concepire un attacco come ShrinkLocker.
Disclaimer: Si tratta di malware che è male, fatto da criminali (che è male). Quello che cerchiamo di approfondire qui è l’approccio e la creatività dell’attaccante e ribadire ancora una volta come la macchina sia semplicemente una macchina che fa quello che gli viene chiesto di fare.
Torniamo a Shrinklocker. Prima cosa da dire: l’analisi che segue non è stata fatta da personale BeSafe, ma 4 ricercatori di Kaspersky che hanno rilasciato i dettagli di questa minaccia.
E’ una minaccia pericolosa ? Se ci sono in pista delle contromisure minime, direi di no. Buona parte delle operazioni richiedono diritti amministrativi e una configurazione decente di un buon EPP e di un EDR fermano completamente l’attacco. Ma ora cerchiamo di capire perchè ShrinkLocker utilizza LOLBAS come ransomware.
Informazioni preliminari:
Dobbiamo presentare un po’ di attori:
- il primo è BitLocker. Per chi non lo sapesse, BitLocker è un componente nativo del sistema operativo Windows che consente di applicare la crittografia a dei dischi.
- Il secondo attore è VBScript. Si tratta di un linguaggio di programmazione che Microsoft ha recentemente dichiarato che disabiliterà a partire dal 2027.
- l terzo attore è WMI (che sta per Windows Management Instrumentation) . Ne abbiamo parlato nell’articolo di cui sopra ma si tratta di una interfaccia su un sottosistema che è in grado di operare sul sistema operativo a basso livello.
- Un altro simpatico amico è bcdboot, (Boot configuration data boot) una utility integrata del sistema che consente di configurare i file di avvio del PC.
- Il cast non è ancora completo: manca “diskpart” che è l’utility disco integrata sul sistema operativo in grado di gestire le partizioni presenti sugli hard-disk.
- A completare il tutto, un po’ di eventviewer, firewall di sistema e task schedulati per ripulire il tutto. Ci siamo !
L’incident.
I ricercatori di Kaspersky stanno analizzando un incident dove gli attaccanti sono riusciti a distribuire ed eseguire uno script VBS avanzato che sfruttava BitLocker per criptare file senza autorizzazione. È stato individuato questo script e le sue versioni modificate in Messico, Indonesia e Giordania.
Vediamo da vicino questo script e cosa effettivamente fa. Fortunatamente per noi, lo script è in chiaro, ed è quindi possibile leggerlo.
Il primo passo della funzione principale dello script (main) consiste nell’utilizzare Windows Management Instrumentation (WMI) per interrogare le informazioni sul sistema operativo con l’aiuto della classe Win32_OperatingSystem (select * from Win32_OperatingSystem). Lo script vuole quindi sapere su che piattaforma si trova. Per ogni oggetto nei risultati della query, lo script verifica se il dominio corrente è diverso dall’obiettivo. In caso affermativo, lo script si interrompe automaticamente. Poi verifica se il nome del sistema operativo contiene “xp”, “2000”, “2003” o “vista”, e , se la versione di Windows corrisponde a una di queste, lo script si autoelimina e termina.
Questa prima fase quindi indaga la piattaforma target, perchè l’attacco effettuerà delle operazioni di ridimensionamento sui dischi locali e queste operazioni possono cambiare a seconda del sistema operativo. In ogni caso vengono messi a target solo i dischi locali e non i dischi di rete per evitare che ci sia riconoscimento di traffico sospetto sulla rete.
Lo Shrink
Per effettuare il resize dei dischi su windows server 2008 o su 2012 lo script va ad effettuare dei controlli interrogando le partizioni di boot dopodichè effettua delle operazioni sulle partizioni con il tool nativo diskpart. (Su windows 7,8 e 8.1 queste operazioni vengono effettuate in modalità differente )In particolare
- Cerca le partizioni che non sono di boot, su queste ultime, restringe la dimensione di ogni partizione di 100megabyte. Si crea quindi uno spazio non-allocato da 100 Megabyte
- Crea una nuova partizione da 100 Megabyte nello spazio appena creato
- Formatta la partizione con “override” e assegna un filesystem e una lettera ad ogni partizione
- Attiva le partizioni.
- Se tutto è andato a buon fine mette un “ok” dentro ad una variabile.
Nuove partizioni
A questo punto se tutto è andato bene, lo script utilizza bcdboot e re-installa i file di boot sulla nuova partizione appena creata.
Ok, ma a cosa serve tutto questo ?
Lo script ha di fatto modificato i parametri di avvio del sistema operativo in modo da poter avviare il computer crittografato in un secondo momento.
Niente è lasciato al caso e ci sono all’interno dello script molti riferimenti a seconda del sistema operativo che lo script incontra.
Chiavi di registro e Bitlocker check
A questo punto comunque lo script scrive una serie di chiavi di registro che servono principalmente per evitare che l’utente possa recuperare il possesso della macchina. Da questo punto in poi, lo script ha come unico obiettivo cifrare le partizioni con i dati.
Le chiavi che vengono modificate sono queste
- fDenyTSConnections = 1: disabilita connessioni RDP;
- scforceoption = 1: enforce autentica via smart card;
- UseAdvancedStartup = 1: chiedi il BitLocker PIN in fase di pre-boot authentication;
- EnableBDEWithNoTPM = 1: consenti BitLocker anche senza un TPM compatibile;
- UseTPM = 2: se c’è TPM, usalo;
- UseTPMPIN = 2: se c’è la possibilità di usare uno startup PIN con il TPM, usalo;
- UseTPMKey = 2: se c’è la possibilità di usare una startup KEY con il TPM, usala;
- UseTPMKeyPIN = 2: se c’è la possibilità di usare uno startup PIN e una startup KEY con il TPM, fallo;
- EnableNonTPM = 1: consenti BitLocker senza un chip TPM compatibile, richiedi una password o una chiave di avvio su un’unità flash USB;
- UsePartialEncryptionKey = 2: richiedi l’uso di una una startup KEY con il TPM;
- UsePIN = 2: richiedi l’uso di una startup KEY con il TPM
Ma andiamo avanti, lo script controlla se il BDEService è attivo o no (BitLocker Drive Encryption Tools), in caso, lo accende.
Rimozione delle protezioni bitlocker
a questo punto lo script disattiva le protezioni utilizzate per proteggere la chiave di crittografia di BitLocker e le elimina. Il metodo di eliminazione può variare a seconda della versione del sistema operativo. In uno scenario Windows Server 2008 o Windows 7, questo avviene tramite funzioni VBS, dopodiché lo script utilizza PowerShell per forzare l’eliminazione dei protettori. La ragione dell’eliminazione delle protezioni predefinite è di evitare il recupero delle chiavi da parte dell’utente.
Dopo aver completato l’eliminazione, abilita l’uso di una password numerica come protettore e la funzione di crittografia.
Come passo successivo, viene generata una chiave di crittografia di 64 caratteri utilizzando una moltiplicazione e sostituzione casuale dei seguenti elementi:
- Una variabile con i numeri da 0 a 9;
- La famosa frase “The quick brown fox jumps over the lazy dog”, in minuscolo e maiuscolo, che contiene tutte le lettere dell’alfabeto inglese;
- Caratteri speciali.
La casualità di questa password è ottenuta grazie a un seed costituito da vari elementi del sistema interessato, come la memoria utilizzata e le statistiche di rete. Lo script converte quindi la chiave di crittografia precedentemente generata in una stringa sicura – un’opzione di PowerShell (ConvertTo-SecureString) che impedisce la creazione di un oggetto stringa in memoria – e abilita effettivamente BitLocker sulle unità.
Request, POST e DATA
E’ arrivato poi il momento di mandare le informazioni e per farlo lo script prepara un oggetto WinHTTP come request
e poi viene “appiccicato” un POST http che si porta dietro il nome del computer e ovviamente le stringhe che interessano ( la versione di windows, i drive usati e la password)
E se non dovesse andare al primo colpo ?
Ecco la routine che prova per ben 5 volte ad inviare i dati in POST
Cleaning
Dopo aver rimosso le protezioni BitLocker e configurato la crittografia delle unità, lo script esegue i seguenti passaggi per coprire le proprie tracce.
Elimina questi file
- \Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Preferences\ScheduledTasks\ScheduledTasks.xml
- \scripts log-in.vbs
- \scripts\Disk.vbs
- C:\ProgramData\Microsoft\Windows\Templates\Disk.vbs
Lo script cancella quindi i registri Windows PowerShell e Microsoft-Windows-PowerShell/Operational con wevtutil.
If Len((CreateObject("WScript.Shell").Exec("wevtutil cl ""Windows PowerShell""")).stdout.readall) > 0 Then: End If If Len((CreateObject("WScript.Shell").Exec("wevtutil cl ""Microsoft-Windows-PowerShell/Operational""")).stdout.readall) > 0 Then: End If
Attiva il firewall di sistema ed elimina tutte le sue regole.
If Len((CreateObject("WScript.Shell").Exec("netsh advfirewall set allprofiles state on")).stdout.readall) > 0 Then: End If If Len((CreateObject("WScript.Shell").Exec("netsh advfirewall firewall delet rule name=all")).stdout.readall) > 0 Then: End If
Cancella anche le attività VolumeInit e VolumeCheck. Infine, il malware esegue un arresto forzato.
If Len((CreateObject("WScript.Shell").Exec("schtasks /Delete /TN ""VolumeInit"" /F")).stdout.readall) > 0 Then: End If If Len((CreateObject("WScript.Shell").Exec("schtasks /Delete /TN ""VolumeCheck"" /F")).stdout.readall) > 0 Then: End If
Reboot
Dopo lo spegnimento, la vittima vedrà la schermata di BitLocker. Se l’utente tenta di utilizzare le opzioni di ripristino, non vedrà altro che il messaggio “Non ci sono più opzioni di ripristino BitLocker sul PC”.
Ovviamente a questo punto non c’è molto da fare. Senza chiave, i dati sono persi.
Pensieri a riguardo
Di questo attacco ne hanno parlato molti, la cosa veramente straordinaria è la possibilità di leggere in chiaro lo script che in sé non è nemmeno complesso se paragonato ad altri attacchi. La cosa veramente interessante è la padronanza degli strumenti di sistema e del linguaggio integrato nel sistema. In sé lo script effettua tutte operazioni formalmente legittime, sebbene lo script sia semplice è molto complesso rilevarlo attraverso regole classiche di detection. Indubbiamente bisogna lavorare in termini comportamentali per riuscire a fermare questo genere di minacce.