Invitation dangereuse ou Fonctionnement de la charge de combat pour un e-mail de phishing



Récemment, des spécialistes PT ESC ont découvert un document au format Publisher appelé «Invitation 29-30 novembre 2018.pub» (1edd5b6a02ec82cec381c1a1ec74a67e). Dans cet article, nous vous expliquerons comment un document d'aspect ordinaire se transforme en cheval de Troie, permettant à un attaquant de capturer une image à partir de webcams, d'enregistrer le son par commande ou lorsqu'une fenêtre Skype est détectée, d'exécuter des scripts PowerShell, de prendre des captures d'écran, de copier des fichiers à partir d'appareils multimédias.

Ainsi, lorsque vous ouvrez le document, une fenêtre apparaît avec un talon de document flou et une demande pour inclure le script Microsoft Publisher.



Une fois que l'utilisateur l'a activé, le script intégré au document s'exécute en JavaScript. Cela ressemble à ceci:



Le résultat du script sera le décodage de deux fichiers, PDF et EXE, à partir de Base64. Les deux fichiers seront écrits dans C: \ Users \ {Username} \ AppData \ Roaming \ DBFUpdate. En conséquence, les deux fichiers seront exécutés et l'utilisateur verra un tel talon sur l'écran du document:



Treasure Hunter RAT


Les attaquants utilisent un RAT multi-module avec un large éventail de fonctions qui fournit un accès complet à la machine infectée.

Caractéristiques du code:

  1. Entièrement écrit en C ++ avec un grand nombre de constructions STL utilisées en interne.
  2. Application de la bibliothèque boost, en particulier JSON et Archive.
  3. Fonctions de débogage (plus dans la section sur le stager).

Cheval de Troie principal


Le cheval de Troie principal est fixé sur la machine de la victime et est une plate-forme sur laquelle des modules malveillants sont chargés à partir de C2.

Tout d'abord, stager initialise le répertoire de travail, qui stockera ensuite les informations collectées par les modules, les utilitaires nécessaires au fonctionnement des modules, etc.



Ci-dessous se trouve l'initialisation des chemins de création du répertoire de travail:



Une fois les répertoires nécessaires créés, le cheval de Troie principal collecte des informations sur la machine infectée et les envoie au serveur de contrôle.

Troyan s'intéresse à ces données:

  • identifiant de la version du système d'exploitation sur lequel le cheval de Troie principal s'exécute;
  • La langue d'interface par défaut
  • Le numéro de version principal du Service Pack OS;
  • nom d'ordinateur et identifiant de la machine (pour plus de détails sur l'obtention d'un identifiant de machine, voir la section sur le protocole réseau).

Voici comment les informations sur la machine infectée sont collectées:



Ensuite, le cheval de Troie principal est fixé sur la machine infectée par la modification de la valeur dans le registre à HKCU \ Environment \ UserInitMprLogonScript. Il s'agit du nom du fichier exécutable qui a été alloué lors de l'initialisation du répertoire de travail, dans ce cas il est égal à "DCTHOST.exe". Cette méthode est décrite sur le blog Hexacorn et a également été utilisée par APT28 et le groupe Cobalt dans leur ComDLLDroper.



Et la dernière étape de l'initialisation du cheval de Troie principal consiste à copier le fichier exécutable de son emplacement actuel vers le répertoire de travail avec le même nom qui a été sélectionné lors de l'initialisation du répertoire de travail.

Une fois le cheval de Troie principal initialisé, la préparation de la réception des commandes est effectuée. Le module Core est ajouté à la liste des modules en cours d'exécution, qui est le principal cheval de Troie. Ensuite, une commande est lancée à partir du module Core avec l'identifiant 0. Il n'y a pas d'implémentation de cette commande dans le module principal, mais à la place, c'est juste un stub. Le constructeur de l'objet du module Core est présenté ci-dessous.



À la fin, deux threads commencent. L'un des threads démarre une minuterie, qui se réveille par défaut toutes les secondes et essaie de demander une commande à C2.



Le deuxième flux charge des bibliothèques et des modules standard supplémentaires. Les bibliothèques, comme les modules, ont un identifiant, mais contrairement aux modules, les identifiants de bibliothèque sont négatifs, commencez par –1, augmentez vers des nombres inférieurs. Vous trouverez ci-dessous une liste des bibliothèques téléchargées depuis C2.



Fonctions de débogage du cheval de Troie principal


Au tout début de son travail, immédiatement après l'initialisation, le cheval de Troie principal définit un gestionnaire d'exceptions via SetUnhandledExceptionFilter, qui contient des fonctionnalités intéressantes. Lorsque des exceptions se produisent, elles tombent dans le gestionnaire, qui écrit le mini vidage de l'application, tout en enregistrant également des informations sur l'exception. Ensuite, il redémarre. Sur l'écran - création d'un mini vidage:



Protocole réseau


L'échange entre le logiciel et C2 s'effectue à l'aide d'un protocole binaire auto-écrit. Chaque message est décrit à l'aide de BinPackage (nom tiré de RTTI). Chaque BinPackage est essentiellement un wrapper sur std :: vector, qui stocke l'ensemble PackageRecord (le nom est inventé). PackageRecord est l'unité minimale de stockage des données.

struct PackageRecord { _DWORD dataId; _DWORD datatype; _DWORD szData; char[] data; }; 

En savoir plus sur les domaines de cette structure:

  • dataId - indique le type d'enregistrement. Soit l'entrée est un identifiant de module, soit un identifiant de commande, soit une charge utile.
  • szData - la taille des données stockées dans l'enregistrement.
  • type de données est un type de données.

Au total, l'utilisation de trois types de données a été enregistrée:
  • Une valeur de "0" signifie que les données stockées dans l'enregistrement doivent être interprétées comme un DWORD.
  • La valeur "1" - les données stockées dans l'enregistrement doivent être interprétées comme une chaîne ASCIIZ.
  • La valeur "2" - les données stockées dans l'enregistrement doivent être interprétées comme des données cryptées / tampon brut.


Lors de l'envoi de BinPackage au serveur de contrôle, l'identifiant de la machine lui est ajouté. L'identifiant est le GUID de la section à partir de laquelle tous les caractères spéciaux sont coupés. Dans la figure - obtenir l'identifiant de la machine:



Avant l'envoi, tous les enregistrements stockés dans BinPackage sont collectés séquentiellement dans un seul tampon et sont cryptés. Pour le chiffrement, la bibliothèque WinAES est utilisée , en particulier AES-128-CBC.

À l'aide de CryptoAPI Windows, deux tableaux pseudo-aléatoires de 16 octets sont générés. Un pour IV, l'autre pour la clé. Le chiffrement est effectué et les données chiffrées sont ajoutées à BinPackage, qui contient le paquet chiffré et se compose de trois entrées:

  • enregistrement avec l'ID 0x777 - contient la clé utilisée pour le cryptage;
  • enregistrement avec l'ID 0x555 - contient l'IV utilisé pour le cryptage;
  • enregistrement avec l'ID 0x999 - contient des données cryptées (en général, un enregistrement avec cet ID indique une charge utile et est utilisé non seulement pour stocker des données cryptées).

Une fois le processus de chiffrement terminé, le BinPackage généré est à nouveau collecté dans un seul tampon et envoyé via une requête HTTP POST au serveur de gestion 151.80.237.222.



Voici un exemple de package contenant des informations sur la machine:



Et ceci est un exemple de paquet chiffré avec des informations système:



Modules


Chaque module, à l'exception de Core, est chargé à partir du serveur de contrôle. Tous les modules peuvent être divisés en deux catégories: les modules chargés automatiquement et les modules chargés à la demande du serveur de contrôle.

Un exemple de package demandant un module:



Réponse à la demande de module:



Chaque module possède une interface simple composée de trois fonctions: appelée lors du chargement du module Init, appelée lors de l'achèvement de fini, et une fonction qui modifie la configuration du module. Chaque module a également une exportation nommée GetModule, qui construit un objet représentant ce module et le renvoie au cheval de Troie principal. Tous les modules que nous avons découverts sont lancés en mémoire par chargement réfléchissant.



De plus, les noms des modules sont donnés sous la forme dans laquelle ils sont présents dans RTTI en tant que noms de classe.

Module CCore


Ce module représente les fonctionnalités de base et est intégré directement dans le cheval de Troie principal. Son constructeur peut être vu dans le tableau ci-dessous:
Identifiant du moduleID d'équipeLa description
00Fondamentalement, un cheval de Troie au lieu d'une commande est un talon, et son objectif exact n'a pas pu être établi
1Modifier la configuration du module
2Demander des informations sur l'ordinateur
3Téléchargez l'utilitaire depuis le serveur de contrôle
4Demander la liste d'un répertoire contenant des utilitaires
5Téléchargez le module et exécutez-le

Module CShell


Ce module fournit un shell distant à une machine infectée. Lorsque le module est initialisé, le processus cmd.exe est créé, auquel deux tuyaux sont attachés: un pour l'entrée standard et un pour la sortie standard, via lesquels les commandes sont reçues et transmises depuis le serveur de contrôle et vice versa. Également à ce moment, un thread démarre, qui prend automatiquement toute la sortie et l'envoie au serveur de contrôle. La figure montre l'initialisation du module CShell.


Identifiant du moduleID d'équipeLa description
20Envoyer la commande au shell
1Imprimez le fichier. Un fichier est lu, dont le chemin est transmis depuis le serveur de contrôle, et le contenu de ce fichier est téléchargé sur le serveur de contrôle
2Obtenez une liste de tous les disques existants dans le système. Les données sont envoyées au serveur de contrôle au format JSON
3Téléchargez le fichier depuis le serveur de contrôle. Le chemin où enregistrer le fichier et les données sont reçues du serveur de contrôle

Module CFileSystemBrowser


Il s'agit d'un module passif qui, sur demande, vous permet de recevoir des informations sur la structure du système de fichiers. Voici comment l'initialisation du module CFileSystemBrowser se produit:


Identifiant du moduleID d'équipeLa description
30Obtenez une liste de tous les disques existants dans le système. Les données sont envoyées à C2 au format JSON
1Obtenez la liste des répertoires. La liste est générée au format JSON
2Imprimez le fichier. Un fichier est lu, dont le chemin est transféré depuis C2 et le contenu de ce fichier est téléchargé vers C2
3Supprimer le fichier. Le chemin d'accès au fichier est transféré depuis C2

Module CScreenShot


Ce module vous permet de prendre des captures d'écran ou de capturer des images à partir d'une webcam. Il peut le faire à la fois sur demande et avec une période spécifique dans la minuterie.

Identifiant du moduleID d'équipeLa description
40Prenez une capture d'écran et envoyez-la au serveur de contrôle
1Exécutez une minuterie, après quoi une capture d'écran est prise à partir de l'écran de la machine. Les captures d'écran résultantes sont emballées dans BinPackage et enregistrées dans le dossier des journaux. Les noms des fichiers sont générés à l'aide de l'API GetTempFileName avec le préfixe «MS_».
2Obtenez des vidéos des appareils disponibles sur une machine infectée
3Capturez un cadre de la webcam et envoyez-le au serveur de contrôle

Module CSender


Ce module n'est pas initialement activé. Il télécharge le contenu du dossier logs sur le serveur de contrôle. Il est activé lorsqu'une demande de modification de la configuration contient la période de vérification.



Module CKeylogger


Ce module n'est pas non plus activé initialement. Il est activé lorsqu'une demande de modification de configuration arrive contenant la taille du tampon dans lequel le journal est stocké. L'interception des entrées est effectuée via rawinput . De plus, l'enregistreur de frappe surveille la fenêtre dans laquelle l'utilisateur effectue une entrée et enregistre son titre.



Module CDictaphone


Ce module enregistre le son par commande ou lors de la détection d'une fenêtre Skype. Une fois lancé, il démarre un thread qui répertorie toutes les fenêtres et leurs fenêtres enfants dans le système et recherche la fenêtre parmi les classes dont le nom de classe est TLiveConversation ou TCallMonitorControl. Si une telle fenêtre a été trouvée, l'enregistrement démarre. Ci-dessous, l'initialisation du module CDictaphone:



Et recherche de fenêtre Skype



L'enregistrement se fait via le MCI en envoyant des commandes spéciales. Voici à quoi ressemble le cycle d'écriture du module CDictaphone:



Après avoir fermé la fenêtre ou reçu une commande pour terminer l'enregistrement, les données reçues sont enregistrées dans un dossier temporaire, après quoi elles sont encodées par l'encodeur MP3 boiteux (il est considéré comme un utilitaire et devrait déjà être chargé, il n'a pas été possible de les obtenir du serveur de contrôle). Le fichier encodé est enregistré dans le dossier logs. La génération d'un nom de dossier est similaire à la génération de noms pour les captures d'écran.
Identifiant du moduleID d'équipeLa description
70Commencez l'enregistrement et terminez-le après 15 minutes
1Arrêter l'enregistrement
2Vérifier l'état: l'enregistrement est en cours

Module CProcessesManager


Il s'agit d'un module passif, capable de renvoyer une liste de processus sur demande ou de se terminer par le PID qui lui est transmis.


Identifiant du moduleID d'équipeLa description
80Renvoie une liste de processus: leurs noms, PID et le nom de l'utilisateur propriétaire du processus.
1Achèvement du processus PID

Module CDownloader


Le module est conçu pour télécharger des fichiers volumineux sur le serveur de contrôle. Effectue la transmission de données par morceaux, dont la taille est établie par sa configuration. Le module lit les données d'un fichier, le chemin vers lequel il reçoit du serveur de contrôle, et emballe des morceaux dans BinPackage. Pour chaque BinPackage contenant le bloc, une entrée avec l'identifiant 0x888 est ajoutée, y compris le chemin d'accès au fichier. Après avoir passé chaque morceau, le sommeil est effectué pendant 5 secondes.

Identifiant du moduleID d'équipeLa description
90Stub, impossible de définir la valeur exacte
1Il transfère une grande quantité de données (0x500000 octets), après quoi il mesure le temps passé sur la transmission et envoie cette valeur à C2
2Télécharger un fichier depuis une machine

Module CPS


Ce module vous permet d'exécuter des scripts PowerShell.


Identifiant du moduleID d'équipeLa description
100Reçoit un script PowerShell de C2 et l'exécute

Module CDeviceMonitor


Un module passif qui surveille les périphériques multimédias connectés et copie des fichiers à partir d'eux. Il utilise les messages de diffusion WM_DEVICECHANGE pour détecter la connectivité du périphérique. Après avoir connecté l'appareil au serveur de contrôle, des informations sont envoyées sur le moment où l'appareil a été connecté, son étiquette de volume et le chemin d'accès à l'appareil. Le code utilisé pour obtenir le chemin vers le périphérique est très similaire à celui-ci. Tous les fichiers sont copiés dans le dossier logs. Les noms sont générés de la même manière que pour les captures d'écran. Le fichier fsIndex.dat est créé séparément, dans lequel se trouve le dictionnaire sérialisé avec boost :: archive. Ce dictionnaire stocke les chemins d'origine vers les fichiers qui ont été copiés et leurs hachages MD5. Vous trouverez ci-dessous la réception de DevicePath:



En épilogue, plusieurs recommandations:

  • Pas besoin d'ouvrir les pièces jointes dans les lettres de destinataires inconnus, et encore moins d'inclure un script Microsoft Publisher.
  • Il n'est pas moins dangereux de cliquer sur les liens dans les lettres des expéditeurs inconnus. Le site où vous allez peut héberger des logiciels malveillants qui seront automatiquement téléchargés sur votre PC.
  • Vous devez régulièrement mettre à jour le logiciel, en particulier Microsoft Windows et Microsoft Office, ce qui fermera l'accès à un large éventail de logiciels malveillants.

Source: https://habr.com/ru/post/fr432172/


All Articles