Skip to main content
BlogSécuritéDigest de sécurité Linode du 23 au 30 janvier 2022

Digest de sécurité Linode 23-30 janvier 2022

Digest de sécurité Linode

Cette semaine, nous aborderons un nouveau spécimen de logiciel malveillant appelé Sysjoker et un guide pour l'analyse de la mémoire Linux. Bien que ce guide ne soit pas exhaustif, il peut aider à comprendre les bases d'un processus d'extraction et d'analyse de la mémoire à l'aide de Volatility.

Sysjoker Backdoor

Dans un récent post by IntezerDans le cadre du projet "Sysjoker", les auteurs ont analysé une nouvelle porte dérobée capable de fonctionner sur plusieurs systèmes d'exploitation. Selon l'analyse, "Sysjoker" peut fonctionner sur macOS, Linux et Windows. Sysjoker se cache sous la forme d'une mise à jour du système et utilise différentes méthodes pour dissimuler et modifier l'adresse IP de son serveur de commande et de contrôle (C2).

Il est également inquiétant de constater que l'échantillon n'a pas été analysé par VirusTotal, ce qui pourrait indiquer que la porte dérobée est relativement récente. Bien que les méthodes qu'il utilise pour infecter un système soient différentes selon les systèmes d'exploitation, une fois qu'il persiste sur un système, il commence à communiquer avec le serveur C2. Dans son analyse, Intezer indique qu'il n'a pas encore vu d'instruction d'étape suivante provenant du serveur C2. L'article suggère d'utiliser des scanners de mémoire pour détecter le logiciel malveillant.

Une autre façon d'effectuer une analyse forensique consiste à vider la mémoire et à l'analyser à l'aide d'un outil bien connu comme Volatility. Dans les anciennes versions du noyau Linux, le vidage de la mémoire pouvait être réalisé en copiant la mémoire virtuelle à partir de /dev/mem à l'aide d'un outil de ligne de commande comme dd; toutefois, cette méthode a été abandonnée en raison d'implications potentielles pour la sécurité. 

L'analyse de la mémoire sous Linux

Nous pouvons résumer l'analyse forensique comme étant les différentes méthodes utilisées pour l'acquisition de preuves, l'analyse des preuves et la documentation des conséquences d'un incident de sécurité. Après une faille de sécurité confirmée, une analyse forensique est généralement effectuée pour mieux comprendre ce qui s'est passé dans un système compromis. Il existe de nombreuses sources de preuves que vous pouvez analyser pour faire des réclamations défendables sur la source d'un incident ; cependant, nous ne ferons qu'une analyse pratique de la mémoire d'un système Linux compromis pour démontrer certaines des méthodologies et des outils que vous pouvez utiliser.

Mémoire

La mémoire vive, par nature, est volatile. Elle nécessite une alimentation constante pour fonctionner et elle est réinitialisée à chaque redémarrage du système. Linux conserve les données stockées en mémoire dans le répertoire /dev/mem; cependant, il est impossible d'extraire des artefacts de la mémoire en utilisant directement cette partition dans les distributions plus récentes. En effet, à partir du noyau Linux 4.16, une option(CONFIG_STRICT_DEVMEM) est activée par défaut pour interdire l'accès à cette partition sensible. 

Bien que cela rende plus difficile l'acquisition de l'image mémoire, il est également plus difficile pour les adversaires (et les utilisateurs inexpérimentés) de causer des dommages dévastateurs au système. Un attaquant disposant d'un accès root au système peut utiliser le périphérique mem pour injecter du code directement dans le noyau si cette option est désactivée.

Pour cette démonstration, nous avons démarré une Linode Debian 9 avec le nom d'hôte "forensics" dans l'un de nos centres de données. Nous avons configuré la boîte forensics comme un exemple d'environnement de construction et d'analyse. Bien qu'il ne soit pas nécessaire d'effectuer ces opérations sur une machine externe, il est déconseillé de manipuler un ordinateur contenant des preuves. Voici les étapes de notre analyse :

  1. Créer un profil Volatility pour un système compromis en utilisant une machine avec le même système d'exploitation et le même noyau.
  2. Videz la mémoire avec l'outil de votre choix (AVML dans cette démo).
  3. Inspectez la mémoire vidée en utilisant le profil que vous avez créé pour Volatility à l'aide de plugins.

Avertissement

Nous utiliserons le référentiel Python 2 de Volatility à des fins de démonstration en raison des problèmes de compatibilité actuellement en cours avec Volatility 3. Nous sommes conscients que le support de Python 2 a pris fin en 2020 ; il s'agit strictement de démontrer l'utilisation de l'outil dans un environnement contrôlé. Si vous souhaitez suivre le guide, faites-le à vos risques et périls.

Exigences

Par défaut, les Linodes Debian 9 ne disposent pas de certains des outils que nous allons utiliser dans cette démo. Il est recommandé de les installer avec la commande suivante avant de suivre les autres instructions :

sudo apt install make git zip dwarfdump linux-headers-$(uname -r) python-pip python-distorm3 python-crypto

Volatilité

Le cadre Volatility est une collection entièrement ouverte d'outils mis en œuvre dans Python sous la licence publique générale GNU pour extraire des artefacts numériques à partir d'échantillons de mémoire volatile (RAM).

Il est important de s'assurer que le bon profil Volatility est utilisé lors de l'analyse d'un vidage de mémoire. Un profil est un fichier contenant des informations sur la structure des données d'un noyau et des symboles de débogage qui peuvent être utilisés pour analyser correctement une image mémoire. Heureusement, créer un profil avec Volatility est assez simple. Vous pouvez également consulter le dépôt de profils Volatility pour des profils pré-construits.

Établir un profil

Après avoir installé les outils nécessaires, nous pouvons commencer à construire notre profil Volatility pour la machine sur laquelle il s'exécute.

1. git clone https://github.com/volatilityfoundation/volatility ~/volatility
2. cd ~/volatility/tools/linux/
3. make
4. zip ~/$(lsb_release -i -s)_$(uname -r).zip ./module.dwarf /boot/System.map-$(uname -r)
5. cp ~/$(lsb_release -i -s)_$(uname -r).zip ~/volatility/volatility/plugins/overlays/linux/
6. python ~/volatility/vol.py --info

La ligne initiale (1) clone le dépôt Volatility dans le répertoire personnel de l'utilisateur. En allant dans le répertoire (2) ~/volatility/tools/linux, nous pouvons utiliser make (3) pour recompiler les modules du noyau. Il est important d'avoir téléchargé les en-têtes du noyau au préalable, sinon ce processus risque d'échouer. 

Il en résulte un module .dwarf. La commande suivante (4) utilise ce module pour lire la carte du système à partir de /boot afin de générer le profil que nous devons utiliser dans Volatility. Nous pouvons alors copier ce profil (5) dans le bon répertoire, afin que Volatility puisse l'utiliser. Enfin, pour vérifier que notre profil est correctement chargé dans Volatility, nous pouvons exécuter Volatility une fois avec le drapeau info (6). Si toutes les étapes sont réussies, nous devrions voir notre profil personnalisé dans la section Profils de la sortie.

Installation d'un module caché du noyau

Pour cet exemple, nous avons utilisé HiddenWall pour générer un Linux Kernel Module (LKM) caché, nous l'avons nommé 'cantfindme' et nous l'avons chargé sur un autre Linode Debian 9 avec le même build/version de noyau que la machine 'forensics'. Bien que le module soit chargé, il n'est pas visible lorsque lsmod ou modprobe est exécuté sur le système : 

Cliquez sur l'image pour l'agrandir.

Acquisition de la mémoire

Il existe d'excellents outils que vous pouvez utiliser pour vider la mémoire sous Linux ; cependant, dans ce guide, nous utiliserons AVML (Acquire Volatile Memory for Linux) car LiME est fréquemment abordé sur le web. AVML est un outil d'acquisition de mémoire open-source pour Linux créé par Microsoft. Vous pouvez trouver la dernière version ici et télécharger le binaire sur la machine à partir de laquelle vous voulez vidanger la mémoire. Rappelez-vous que l'ordinateur à partir duquel nous vidons la mémoire doit avoir le même noyau/système d'exploitation et la même version que le profil Volatility que nous avons généré précédemment.

Dans un scénario réel, il est important de ne pas altérer un système compromis afin de s'assurer que les preuves que nous recueillons sont recevables devant un tribunal. Il est également important de ne pas compresser les images dans la mesure du possible, car l'acquisition bit à bit peut fournir des données qu'une image compressée ne peut pas fournir.

Après avoir téléchargé le binaire AVML dans le répertoire personnel, vous pouvez utiliser la commande suivante pour vidanger la mémoire d'un système dans le répertoire personnel.

sudo ~/avml ~/output.lime

AVML videra la mémoire au format LiME, afin que nous puissions commencer notre analyse avec le profil de volatilité que nous avons créé. Vous pouvez également vérifier la taille du dump pour vous assurer qu'elle correspond à la mémoire vive totale de l'appareil. Volatility ne devrait pas altérer le vidage de la mémoire, mais il est préférable de faire une copie du fichier et d'analyser les données copiées au lieu de l'original après s'être assuré que leurs hachages correspondent.

Après avoir vidé la mémoire de la boîte "pwnd", nous l'avons transférée à la boîte "forensics" pour analyse.

Plugins de volatilité

Volatility propose de nombreux plugins pour aider l'analyste judiciaire. Vous pouvez trouver une liste de ces plugins sur leur page Github. En utilisant les plugins de Volatility, nous pouvons obtenir une vue d'ensemble rapide de l'image mémoire. Le format de commande pour l'analyse d'une image mémoire se trouve ci-dessous :

python ~/volatility/vol.py -f <path_to_memory_dump> --profile=<profile>
<plugin_name> <plugin_options>

Voici la sortie du plugin linux_hidden_modules qui liste les modules du noyau chargés et cachés à partir de l'image mémoire :

Cliquez sur l'image pour l'agrandir.

Ce plugin peut vous aider à trouver des modules cachés du noyau Linux qui peuvent être malveillants. Même si ces modules ne sont pas visibles lorsque vous exécutez lsmod sur le système, ils peuvent être détectés et extraits d'un dump de mémoire. Vous pouvez utiliser le plugin linux_moddump pour extraire les modules du noyau soit en spécifiant leur nom dans un motif regex, soit en spécifiant l'adresse de base du module dans l'image mémoire :

Cliquez sur l'image pour l'agrandir.

Il y a bien d'autres choses à faire avec la volatilité que nous ne pouvons tout simplement pas couvrir dans cet article. N'hésitez pas à laisser un commentaire ci-dessous pour nous faire part de vos réflexions et suggestions.


Commentaires

Laissez un commentaire

Votre adresse électronique ne sera pas publiée. Les champs obligatoires sont marqués d'un *.