Crystal Rans0m : un ransomware hybride émergent capable de voler
Cristal Rans0m est une famille de ransomwares jusqu’alors non documentée, développée dans le langage de programmation Rust, aperçue pour la première fois dans la nature le 2 septembre2023. Il est intéressant de noter qu’elle crypte les fichiers de la victime, exigeant une rançon pour leur libération, mais qu’elle vole également des informations sensibles sur les systèmes infectés.
Cette approche à double menace signifie que les attaquants peuvent doubler leur influence sur les victimes, augmentant potentiellement leurs chances de monétiser leurs attaques. Cette famille de ransomwares peut donc être classée dans la catégorie des malwares Stealer-as-a-Ransomware, un terme inventé par les chercheurs de Zscaler dans une publication sur RedEnergy.
En ce qui concerne sa paternité, Crystal Rans0m ne partage aucune similitude avec une autre famille de logiciels malveillants et n’a été attribué à aucun acteur de la menace connu. Dans cet article, nous analyserons les capacités techniques de Crystal Rans0m, décrivant en détail ses composants de ransomware et de voleur.
Menace émergente : ransomware hybride
Depuis que la double extorsion est devenue courante – les groupes de ransomware les plus connus publiant des informations confidentielles des victimes sur un site de fuite de données (DLS) – de nombreuses publications ont signalé l’utilisation de chaînes d’attaque à différentes étapes, impliquant à la fois un voleur d’informations et une charge utile de ransomware finale.
En combinant les capacités des ransomwares et des voleurs, les attaquants maximisent l’efficacité de leurs campagnes. Même si la rançon n’est pas payée, les données volées peuvent être vendues ou utilisées pour d’autres attaques, comme le vol d’identité ou le spear phishing. Il est très rare d’observer deux types de catégories de logiciels malveillants dans un seul fichier exécutable. Cependant, c’est le cas avec Crystal Rans0m, RedEnergy et FTCODE.
Actuellement, les groupes de ransomware semblent préférer séparer les activités d’exfiltration de données des activités de chiffrement, mais il est important de prêter attention à cette menace émergente et à la manière dont les groupes de ransomware innovent sur leurs TTP. Un autre cas documenté de ransomware hybride est le RAT-as-a-Ransomware, avec les cas de VenomRAT et Anarchy Panel RAT, qui intégrent un composant de ransomware.
Analyse technique
Cette section se concentrera sur un échantillon avec sha256 15219aa22db99f064c47c224a205cdd3ed438dabd2d2593242ed2882e6458311, qui était le dernier trouvé au moment de l’analyse. L’analyse technique comprendra d’abord un aperçu des actions initiales effectuées par le malware, suivi de ses principales caractéristiques en tant que voleur et ransomware. Enfin, l’équipe KrakenLabs d’Outpost24 ayant détecté un nouvel échantillon juste avant de publier ce billet de blog, la dernière section présentera les particularités d’un échantillon plus récent datant de juillet 2024.
Fonctionnalités clés
- Chiffrement des données de la victime pour obtenir une rançon
- Demande de paiement de rançon en Monero, améliorant l’anonymat
- En tant que voleur, il se concentre principalement sur les navigateurs, mais il cible également les clients de Steam, Discord et Riot Games
- Utilise les webhooks Discord pour les opérations de commande et de contrôle
Actions initiales
Avant toute opération de vol ou de ransomware, Crystal charge sa configuration :
Déchiffrement du Webhook Discord utilisé pour l’exfiltration
Crystal utilise un Webhook Discord pour exfiltrer les données volées ainsi que la clé et le nonce utilisés pour le chiffrement. Ce webhook est codé en dur mais il est crypté et encodé. Ainsi, à partir de sa configuration initiale, il procède à son décryptage, en utilisant une clé codée en dur (également utilisée pour déchiffrement une partie de la demande de rançon), et de simples opérations XOR et de tableau, puis le décode en utilisant la base 64.
Il génère ainsi des chemins d’accès pour les logiciels ciblés
Dans le cadre de sa configuration, il génère également les chemins d’accès aux répertoires de données ciblées (sous « %localappdata%» ou «%appdata% »). Pour les navigateurs, il génère deux ensembles distincts :
C:UsersMyPCAppDataRoamingOpera SoftwareOpera Stable
C:UsersMyPCAppDataRoamingOpera SoftwareOpera GX Stable
C:UsersMyPCAppDataLocalAmigoUser Data
C:UsersMyPCAppDataLocalTorchUser Data
C:UsersMyPCAppDataLocalKometaUser Data
C:UsersMyPCAppDataLocalOrbitumUser Data
C:UsersMyPCAppDataLocalCentBrowserUser Data
C:UsersMyPCAppDataLocal7Star7StarUser Data
C:UsersMyPCAppDataLocalSpfutnikSputnikUser Data
C:UsersMyPCAppDataLocalGoogleChrome SxSUser Data
C:UsersMyPCAppDataLocalVivaldiUser Data
C:UsersMyPCAppDataLocalMicrosoftEdgeUser Data
C:UsersMyPCAppDataLocalYandexYandexBrowserUser Data
C:UsersMyPCAppDataLocalIridiumUser Data
C:UsersMyPCAppDataLocaluCozMediaUranUser Data
C:UsersMyPCAppDataLocalBraveSoftwareBrave-BrowserUser Data
C:UsersMyPCAppDataLocalGoogleChromeUser Data
Il génère également des chemins pour Discord standard, Discord Canary et Discord PTB.
Composant Infostealer
Répertoire de travail du logiciel malveillant
Lors de la récupération d’un répertoire, d’un fichier ou de l’analyse du contenu d’un fichier, Crystal crée d’abord un nouveau dossier de travail personnalisé pour logiciels malveillants sous «%Temp%wintemp.<random>». Ensuite, le fichier ciblé sera copié dans le dossier de travail du logiciel malveillant, lu et supprimé lorsqu’il ne sera plus nécessaire.
Le processus de suppression n’utilise pas les API DeleteFileA/W. Pour effectuer la suppression du fichier, Crystal ouvre d’abord le fichier avec l’indicateur FILE_FLAG_DELETE_ON_CLOSE , ce qui provoquera la suppression du fichier une fois tous ses handles fermés. Ensuite, il renomme le fichier et le déplace vers le répertoire « %Temp% » à l’aide de l’API SetFileInformationByHandle , avec FileRenameInfo comme paramètre FileInformationClass et « \?%Temp%rm-<counter> » comme nouveau chemin.
Ce comportement n’est pas spécifique à cette famille de malwares, mais à la Bibliothèque Rust utilisée pour effectuer la suppression (supprimer_dir_alllibrary).
Vol d’informations du navigateur
Obtenir la clé principale du navigateur
Afin de voler la clé principale, Crystal parcourt les chemins du navigateur et vérifie s’ils sont présents dans l’hôte. Si tel est le cas, il tente de localiser leur fichier Local State pour extraire la clé principale du navigateur.
Crystal crée un dossier de travail temporaire pour les logiciels malveillants sous « %Temp%wintemp.<random> » et essaie de copier le fichier « <browser path>User DataLocal State » dans le dossier de travail MW.
En cas de succès, il lira son contenu et tentera de localiser la clé «os_crypt » et la clé «encrypted_key » à l’intérieur. Ensuite, il décodera la valeur récupérée – codée en base64 – supprimera le suffixe « DPAPI » et appellera l’API CryptUnprotectData pour obtenir la clé principale.
Collecte d’informations sur le navigateur
Une fois la clé principale obtenue avec succès, Crystal parcourt ensuite les fichiers à l’intérieur du répertoire « User Data » du navigateur afin de localiser le dossier « Default ».
Le tableau suivant montre le DDBB SQLite ciblé, ainsi que les requêtes SQL utilisées pour collecter les informations depuis elles. Encore une fois, s’ils sont trouvés, les fichiers ciblés seront copiés dans un dossier de travail de logiciel malveillant et lus à partir de là.
| Fichier | Requêtes SQL |
| <Browser path>User DataDefaultLogin Data | SELECT origin_url, username_value, password_value FROM logins |
| <Browser path>User DataDefaultHistory | select term from keyword_search_terms select current_path, tab_url from downloads select url from downloads_url_chains |
| <Browser path>User DataDefaultCookies <Browser path>User DataDefaultNetworkCookies | select host_key, name, encrypted_value, path from cookies |
Lorsque les informations des cookies sont récupérées, la « encrypted_value » sera décryptée à l’aide d’AES avec la clé principale précédemment obtenue.
Vol d’informations Discord
Le voleur a deux manières de cibler les données des utilisateurs de Discord :
- À partir des navigateurs
- Depuis l’application de bureau Discord
Obtenir des jetons d’utilisateur Discord à partir des navigateurs
Après avoir obtenu la clé principale et appelé la fonction de vol du navigateur, il essaiera de localiser le chemin «Local Storageleveldb» dans le chemin par défaut du navigateur. S’il est trouvé, il l’itérera en essayant de localiser les fichiers «.log » ou « .ldb ». Si l’un d’entre eux est trouvé, il recherchera les jetons d’utilisateur Discord sur leur contenu, en utilisant la regex suivante :
[w-]{24}.[w-]{6}.[w-]{25,110}
Depuis le client local Discord
Le voleur essaie de localiser les chemins Discord et, s’il en trouve, il essaie d’extraire la clé principale avec une approche équivalente à celle utilisée pour les navigateurs. Il essaie ensuite de localiser tous les fichiers «.log» ou «.lbd» dans les sous-chemins «leveldb».
Dans ce cas, il tentera de localiser les jetons chiffrés à l’aide de la regex suivante :
dQw4w9WgXcQ:[^]*