Il gruppo Lynx è un nuovo e sofisticato Threat Actor emerso a metà del 2024, responsabile di oltre 166 attacchi in diversi settori di cui almeno 3 in Italia. [1]
Fin dalla sua comparsa, il gruppo dietro questo ransomware ha preso attivamente di mira organizzazioni di vari settori come la vendita al dettaglio, l’immobiliare, l’architettura e i servizi finanziari e ambientali negli Stati Uniti e nel Regno Unito.
Lynx ransomware ha particolari somiglianze con un altro noto ransomware, INC, motivo per cui diverse fonti di intelligence lo indicano come suo possibile rebranding.
Il gruppo dietro al ransomware Lynx rappresenta una minaccia a doppia estorsione sempre più diffusa e sofisticata. La diffusione del ransomware viene veicolata attraverso una varietà di vettori di attacco; una volta compromesso un sistema, cifra tutti i file trovati con AES, evitando quelli di sistema, aggiungendo l’estensione ‘.lynx’ e rimuove i file di backup, incluse le shadow copies, per impedire il ripristino dei dati.
Una caratteristica peculiare di Lynx è l’invio della nota di riscatto a tutte le stampanti disponibili in rete, che aggiunge un elemento inaspettato alla strategia di estorsione.
Parametri di configurazione
Di default il ransomware cripta tutti i file ed elimina tutti i backup, ma, analizzando il codice tramite IDA, è facilmente individuabile come questo ransomware sia altamente personalizzabile tramite flag passate in linea di comando.
Di seguito una tabella riassuntiva con i parametri che è possibile indicare all’esecuzione del malware:
| –file [1 o lista di file] | cripta 1 file o una lista specifici |
| –dir | cripta una cartella |
| –mode <mode> [fast, medium, slow, entire] | quanto cripta di ogni file: fast: 5%, medium: 15%, slow: 25%, entire: 100% |
| –help | printa l’help |
| –verbose | verbose mode |
| –silent | cripta il file senza aggiungere estensione e ransomnote |
| –stop-processes | prova a stoppare i processi tramite RestartManager |
| –encrypt-network | Cripta le cartelle di rete |
| –load-drives | corrompe boot loader |
| –hide-cmd | nasconde la console |
| –no-background | non imposta la ransomnote come sfondo desktop |
| –no-print | non manda la ransomnote alle stampanti |
| –kill | termina processi e servizi |
| –safe-mode | entra in safe-mode di Windows |
Una volta individuati i vari flag che il ransomware può prendere in input procediamo a dare un occhio al codice tramite IDA.
Stop dei processi
Qualora venisse passato il flag, la prima operazione eseguita dal ransomware è quella di termine dei processi. Nel seguente pseudocodice, generato da IDA, possiamo vedere come prima operazione utilizza una API di Windows, CreateToolhelp32Snapshot, per recuperare i PID dei vari processi in esecuzione.
Una volta ottenuto il risultato di questa chiamata, cicla su tutti i processi e li termina, avendo cura di non terminare sé stesso.

Una volta finito di terminare i processi passa i servizi richiamando una successiva subroutine rinominata da noi termina_servizi.
Anche per i servizi il procedimento è molto simile: il ransomware utilizza l’API OpenSCManagerW per ottenere l’handle al service control manager database,l’API EnumServicesStatusExW per effettuare un’enumerazione di tutti processi attivi e, infine, tramite un ciclo ricorsivo, li termina tutti.

RansomNote
Proseguendo con l’analisi, possiamo individuare la ransomnote che verrà scritta all’interno del file readme.txt ed inviata alle stampanti, come vedremo in seguito.

È molto interessante notare come la ransomnote sia encodata in base64: per vederne il contenuto, effettuiamo la decifratura tramite cyberchef e individuiamo facilmente il testo in chiaro:

Possiamo notare che l’unica parte non compilata è quella riguardante l’ID; esso verrà poi successivamente sostituito con quello univoco generato nei prossimi step.
Setup per cifratura dei file
Dopo aver decodificato la ransomnote e sostituito l’ID della vittima al suo interno, il malware comincia a inizializzare un ambiente multithread per procedere alla cifratura dei file.
Per prima cosa, la funzione richiama e popola la struttura SystemInfo con informazioni sul sistema corrente, come il numero di processori disponibili.
Il numero di thread da utilizzare viene impostato a quattro volte il numero di processori, sfruttando il multi-threading per accelerare la cifratura del disco.
Successivamente, viene creato un I/O Completion Port per gestire le operazioni di I/O asincrone.
- 0xffffffff: indica che inizialmente la completion port non è associata a nessun file handle.
- 0: specifica che la completion port non è collegata a una porta esistente.
- 0: la completion key è impostata a zero, e l’ultimo parametro definisce il numero massimo di thread che possono essere eseguiti contemporaneamente. Se impostato a zero, viene utilizzato il numero di processori del sistema.
Infine, viene creato un thread per ciascun processore per gestire il completamento delle operazioni di I/O.

Cifratura dei file
Ora che il ransomware è riuscito a inizializzare i thread correttamente, procede con la vera a propria cifratura.
Innanzitutto tenta di creare un file README.txt in una directory specificata, poi utilizzando la funzione FindFirstFileW, individua il primo file nella directory.
Per ogni file, la funzione verifica se si tratta di un file di sistema o se ha estensioni specifiche come .exe, .msi, .dll o .lynx. Se il file non soddisfa questi criteri e non si chiama LYNX o README.txt, viene messo in coda per la cifratura avviando un nuovo thread.
Per ogni sottodirectory, la funzione effettua una chiamata ricorsiva a enum_dir.
Le directory speciali come windows e program files vengono ignorate per evitare di processare le cartelle di sistema; invece, le directory Program Files e Program Files (x86) vengono gestite separatamente: per ciascuna sottodirectory, viene effettuata una chiamata ricorsiva a enum_dir per cercare e cifrare le directory relative a database, precisamente cerca Microsoft SQL Server, MongoDB e PostgreSQL.




Concludiamo questa sezione notando che il sample decifra una chiave pubblica da cui poi genera le chiavi AES utilizzate per la cifratura.

Crittografia delle share di rete
Una volta crittografati i file individuati nelle cartelle precedentemente enumerate, il ransomware non si ferma e continua la ricerca di file sensibili. In particolare, possiamo anche osservare che tenta di individuare cartelle di rete condivise per criptare i file all’interno.
La cifratura dei file tramite SMB è una pratica sempre più diffusa tra i threat actor ransomware. Questo perché rende più difficile le detection di AV ed EDR e quindi anche bloccarne l’esecuzione, poiché il processo malevolo non è in esecuzione sulla macchina che subisce la cifratura, ma su un’altra macchina della rete.

Ulteriori operazioni: Ricerca di driver esterni e cancellazione shadow copies
Il ransomware, prima di effettuare le ultime operazioni, ricerca all’interno del file system la presenza di driver particolari e/o nascosti. Tenta l’enumerazione per individuare ulteriori dispositivi collegati. Qualora li trovasse li trovasse, procede a criptare tutti i file all’interno:

Una volta terminata la ricerca dei driver nascosti, procede con la cancellazione delle shadow copies, per poi terminare:

Fase Finale e Richiesta del Riscatto
Le ultime operazioni che il ransomware esegue sono il cambio dello sfondo del desktop tramite il set di una chiave di registro con una foto tutti i siti onion di Lynx (chat e blog).
L’immagine viene scaricata nella cartella %TEMP% come “background-image.jpg”.


Infine, come ultima operazione, avviene l’invio della ransomnote a tutte le stampanti di rete individuate, caratteristica peculiare del ransomware Lynx.
La lista delle stampanti viene ottenuta tramite la funzione EnumPrintersW; successivamente, itera su ciascuna stampante, ignorando Microsoft Print to PDF e Microsoft XPS Document Writer.
Per le stampanti rimanenti, avvia il processo di stampa utilizzando StartDocPrinterW e StartPagePrinter.
Infine, tramite WritePrinter, la nota di riscatto viene inviata alla stampante:

IOC
Di seguito una lista di sha256 dei sample di Lynx raccolti:
| f71fc818362b1465fc1deb361de36badc73ac4dd9e815153c9022f82c4062787 |
| 0315dbb793f855f154aa8d227151f1098bd9b580a4f85064648b85bac1321663 |
| 6012a489883017a92c3745f267be6b49228e2ff41ae749d127b1f6fa78152aaf |
| 3e68e5742f998c5ba34c2130b2d89ca2a6c048feb6474bc81ff000e1eaed044e |
| 5da4f51e3ced3166336277bb04c32d0cd20f3e28db3d4f02826fee88b7583040 |
| 80908a51e403efd47b1d3689c3fb9447d3fb962d691d856b8b97581eefc0c441 |
Fonti e Link utili
[1] Dati forniti da RansomFeed: https://ransomfeed.it/stats.php?page=groups-stats
Malpedia: https://malpedia.caad.fkie.fraunhofer.de/details/win.lynx






