Mustang Panda’s Hodur : Vieux trucs, nouvelle variante de Korplug

Les chercheurs d'ESET ont découvert Hodur, une variante Korplug jusqu'alors non documentée, propagée par Mustang Panda, qui utilise des leurres d’hameçonnage faisant référence aux événements actuels en Europe, notamment l'invasion de l'Ukraine.

Les chercheurs d’ESET ont découvert Hodur, une variante Korplug jusqu’alors non documentée, propagée par Mustang Panda, qui utilise des leurres d’hameçonnage faisant référence aux événements actuels en Europe, notamment l’invasion de l’Ukraine.

Les chercheurs d’ESET ont découvert une campagne toujours en cours utilisant une variante Korplug non documentée auparavant, qu’ils ont nommée Hodur en raison de sa ressemblance avec le variant THOR précédemment documentée par l’Unité 42 en 2020. Dans la mythologie nordique, Hodur est le demi-frère aveugle de Thor, qui a été trompé par Loki pour tuer leur demi-frère Baldr.

Principales conclusions de cet article de blog :

  • En mars 2022, cette campagne est toujours en cours et remonte au moins à août 2021.
  • Les victimes connues comprennent des entités de recherche, des fournisseurs de services Internet et des missions diplomatiques européennes.
  • La chaîne de compromission comprend des documents leurres qui sont fréquemment mis à jour et se rapportent à des événements en Europe.
  • La campagne utilise un chargeur personnalisé pour exécuter une nouvelle variante de Korplug.
  • Chaque étape du processus de déploiement utilise des techniques d’anti-analyse et d’obscurcissement du flux de contrôle, ce qui la distingue des autres campagnes.
  • Les chercheurs d’ESET fournissent une analyse approfondie des capacités et des commandes de cette nouvelle variante.

Les victimes de cette campagne sont probablement attirées par des documents servant de tentatives d’hameçonnage instrumentalisant les récents événements survenus en Europe, tels que l’invasion de l’Ukraine par la Russie. Plus de trois millions d’habitants ont ainsi fui la guerre vers les pays voisins, ce qui a entraîné une crise sans précédent aux frontières de l’Ukraine. L’un des noms de fichiers liés à cette campagne est Situation at the EU borders with Ukraine.exe.

D’autres leurres de phishing mentionnent des restrictions de voyage COVID-19 mises à jour, une carte d’aide régionale approuvée pour la Grèce et un règlement du Parlement européen et du Conseil. Le dernier est un document réel disponible sur le site Web du Conseil européen. Cela montre que le groupe APT à l’origine de cette campagne suit l’actualité et est capable d’y réagir rapidement et avec succès.

Figure 1. Pays affectés par Mustang Panda dans cette campagne

Pays touchés :

  • Mongolie
  • Vietnam
  • Myanmar
  • Grèce
  • Russie
  • Chypre
  • Sud-Soudan
  • Afrique du Sud

Verticaux affectés :

  • Missions diplomatiques
  • Entités de recherche
  • Fournisseurs de services Internet (ISP)

Analyse

Sur la base des similitudes de code et des nombreux points communs dans les tactiques, techniques et procédures (TTP), les chercheurs d’ESET attribuent avec un niveau de confiance élevé cette campagne à Mustang Panda (également connu sous le nom de TA416, RedDelta, ou PKPLUG). Il s’agit d’un groupe de cyberespionnage qui cible principalement les entités gouvernementales et les ONG. Ses victimes se situent principalement, mais pas exclusivement, en Asie de l’Est et du Sud-Est, tout particulièrement en Mongolie. Le groupe est également connu pour sa campagne visant le Vatican en 2020.

Bien que nous n’ayons pas été en mesure d’identifier les verticaux de toutes les victimes, cette campagne semble avoir les mêmes objectifs de ciblage que les autres campagnes de Mustang Panda. Conformément à la victimologie typique de l’APT, la plupart des victimes sont situées en Asie de l’Est et du Sud-Est, ainsi que dans des pays européens et africains. Selon les données télémétriques d’ESET, la grande majorité des cibles sont situées en Mongolie et au Vietnam, puis au Myanmar, et seulement quelques-unes dans les autres pays touchés.

Les campagnes de Mustang Panda utilisent fréquemment des chargeurs personnalisés pour les logiciels malveillants partagés, notamment Cobalt Strike, Poison Ivy et Korplug (également connu sous le nom de PlugX). Le groupe est également connu pour créer ses propres variantes de Korplug. Par rapport aux autres campagnes utilisant Korplug, chaque étape du processus de déploiement utilise des techniques d’anti-analyse et d’obscurcissement du flux de contrôle.

Cet article de blog présente une analyse détaillée de la variante de Korplug utilisée dans cette campagne, qui n’avait jamais été vue auparavant. Cette activité fait partie de la même campagne récemment couverte par Proofpoint, mais nous fournissons des informations historiques et de ciblage supplémentaires.

Coffre à outil

Mustang Panda est connu pour ses chargeurs personnalisés élaborés et ses variantes de Korplug, et les échantillons utilisés dans cette campagne en sont la parfaite illustration.

Les chaînes de compromission observées dans cette campagne suivent le modèle Korplug typique : un exécutable légitime, valablement signé et vulnérable au détournement de l’ordre de recherche des DLL, une DLL malveillante et un fichier Korplug chiffré sont déployés sur la machine cible. L’exécutable est détourné pour charger le module, qui déchiffre et exécute ensuite le RAT Korplug. Dans certains cas, un téléchargeur est d’abord utilisé pour déployer ces fichiers avec un document de leurre. Ce processus est illustré à la figure 2.

Figure 2. Aperçu du processus de déploiement de la variante Korplug de Hodur

Cette campagne se distingue par l’utilisation intensive de techniques d’obscurcissement du flux de contrôle et d’anti-analyse à chaque étape du processus de déploiement. Les sections suivantes décrivent le comportement de chaque étape et examinent en profondeur les techniques d’évasion de défense utilisées dans chacune d’elles.

Accès initial

Nous n’avons pas été en mesure d’observer le vecteur de déploiement initial, mais notre analyse indique que les attaques de phishing et de watering hole sont des vecteurs probables. Dans les cas où nous avons vu un téléchargeur, les noms de fichiers utilisés suggèrent un document dont le sujet est intéressant pour la cible. En voici des exemples :

  • COVID-19 travel restrictions EU reviews list of third countries.exe
  • State_aid__Commission_approves_2022-2027_regional_aid_map_for_Greece.exe
  • REGULATION OF THE EUROPEAN PARLIAMENT AND OF THE COUNCIL.exe
  • Situation at the EU borders with Ukraine.exe

Afin de renforcer l’illusion, ces binaires téléchargent et ouvrent un document portant le même nom mais avec une extension .doc ou .pdf. Le contenu de ces leurres reflète fidèlement le nom du fichier. Comme le montre la figure 3, au moins l’un d’entre eux est un document légitime du Parlement européen accessible au public.

Première page du document leurre pour le téléchargeur REGULATION OF THE EUROPEAN PARLIAMENT AND OF THE COUNCIL.exe . Il s’agit d’un document réel disponible sur le site Web du Conseil européen.

Téléchargeur

Bien que sa complexité ait augmenté au cours de la campagne, le téléchargeur est assez simple. Cette augmentation de la complexité provient de techniques anti-analyse supplémentaires, que nous couvrons plus loin dans cette section.

Il télécharge d’abord quatre fichiers via HTTPS : un document leurre, un exécutable légitime, un module malveillant et un fichier Korplug chiffré. La combinaison de ces trois derniers composants pour exécuter une charge utile par le biais d’un chargement latéral de DLL est parfois appelée trident et constitue une technique couramment utilisée par Mustang Panda et par les chargeurs Korplug en général. Les adresses des serveurs et les chemins des fichiers sont codés en dur dans l’exécutable du téléchargeur. Une fois que tout est téléchargé, et que le document leurre est ouvert pour distraire la victime, le téléchargeur utilise la ligne de commande suivante pour lancer l’exécutable légitime :

cmd /c ping 8.8.8.8 -n 70&& »%temp%\<legitimate executable> »

Cette commande ping vérifie la connectivité Internet et introduit un délai (grâce à l’option -n 70) avant d’exécuter l’exécutable légitime téléchargé.

Le téléchargeur utilise de nombreuses techniques anti-analyse, dont beaucoup sont également utilisées dans le chargeur et la charge utile finale. Des techniques d’obscurcissement supplémentaires ont été ajoutées aux nouvelles versions au cours de la campagne sans pour autant modifier leur objectif.

Dans les premières versions du téléchargeur, du code poubelle et des prédicats opaques étaient utilisés pour entraver l’analyse, comme le montre la figure 4, mais le serveur et les noms de fichiers sont clairement visibles en clair.

Figure 4. Obfuscation du flux de contrôle dans les premières versions du téléchargeur

Dans les versions ultérieures, les fichiers sur le serveur sont chiffrés en RC4, en utilisant la représentation de la chaîne de base 10 de la taille du fichier comme clé, puis codés en hexadécimal. Ce processus est illustré dans le snippet Python ci-dessous. Les opérations inverses sont effectuées côté client par le téléchargeur pour récupérer les fichiers en clair. Ceci est probablement fait pour contourner les protections au niveau du réseau.

from Crypto.cipher import ARC4
key = « %d » % len(plaintext)
rc4 = ARC4.new(key)
cipher_content = rc4.encrypt(plaintext).hex().upper()

Ces versions remplacent l’utilisation de chaînes de texte en clair par des chaînes de pile chiffrées. Elles sont toujours codées en dur dans le fichier, mais l’obscurcissement qui les entoure, et l’utilisation de différentes clés, rendent difficile leur déchiffrement statique de manière automatisée. Cette même technique est fortement utilisée dans les étapes suivantes. Les chaînes de pile chiffrées sont également utilisées pour obscurcir les appels aux fonctions de l’API Windows.

Tout d’abord, le nom de la fonction cible est déchiffré et transmis à une fonction. Cette fonction obtient un pointeur vers le champ InMemoryOrderModuleList du PEB (Process Environment Block). Elle itère ensuite sur les modules chargés, en passant chaque handle à GetProcAddress avec le nom de la fonction jusqu’à ce que la fonction cible soit résolue avec succès. Une partie de ce processus est illustrée à la figure 5.

Figure 5. Obfuscation des appels de l’API Windows dans le téléchargeur. La capture d’écran montre un appel à WriteFile, mais le même modèle est utilisé pour toutes les fonctions API

Chargeur

Comme c’est souvent le cas avec Korplug, le chargeur est une DLL qui exploite une vulnérabilité de chargement latéral dans un exécutable légitime et signé. Nous avons observé que de nombreuses applications différentes sont exploitées dans le cadre de cette campagne, par exemple un exécutable SmadAV vulnérable vu précédemment par Qurium dans une campagne attribuée à Mustang Panda qui ciblait le Myanmar.

Le chargeur exporte plusieurs fonctions. La liste exacte varie en fonction de l’application maltraitée, mais dans tous les cas, une seule d’entre elles a une action importante. Dans tous les chargeurs que nous avons observés, il s’agit de la fonction exportée dont l’adresse de chargement est la plus élevée. Toutes les autres exportations, ainsi que le point d’entrée de la bibliothèque, soit retournent immédiatement, soit exécutent un code inutile. Beaucoup de ces exportations ont des noms qui consistent en des lettres minuscules aléatoires et pointent vers la même adresse, comme le montre le tableau 1.

Tableau 1. Fonctions exportées par un chargeur Hodur. L’exportation createSystemFontsUsingEDL est celle qui charge l’étape finale du logiciel malveillant dans cette version.

NameOrdinalFunction RVA
CreatePotPlayerExW10x00007894
RunPotPlayer20x000166A5
createSystemFontsUsingEDL30x00016779
gGegcerhwyvxtkrtyawvugo40x00007894
liucigvyworf50x00007639
ojohjinbgdfqtcwxojeusoneslciyxtiyjuieaugadjpd60x000077CA
soeevhiywsypipesxfhgxboleahfwvlqcqp70x00007894
srkeqffanuhiuwahbmatdurggpffhbkcpukyxgxmosn80x00007894
thggvmrv90x00007701

La fonction du chargeur obtient le répertoire dans lequel la DLL s’exécute à l’aide de GetModuleFileNameA et tente d’ouvrir le fichier Korplug chiffré qu’il contient. Ce nom de fichier est codé en dur dans le chargeur. Il lit le contenu du fichier dans un tampon alloué localement et le déchiffre. Le chargeur rend ce tampon exécutable en utilisant VirtualProtect avant de l’appeler à l’offset 0x00.

Les appels aux fonctions de l’API Windows sont obscurcis par une technique différente de celle utilisée dans le téléchargeur. Contrairement au chargeur, qui contient les noms de ses fonctions (comme indiqué dans le tableau 1 ci-dessus), seuls les hashes 64 bits des appels de fonctions de l’API Windows sont présents dans le binaire. Pour résoudre ces fonctions, le chargeur parcourt les listes d’exportation de toutes les bibliothèques chargées via la liste InMemoryOrderModuleList du PEB. Le nom de chaque exportation est haché, puis comparé à la valeur attendue. L’algorithme de hachage FNV-1a, récemment remis au goût du jour par la backdoor Sunburst, a déjà été utilisé par Mustang Panda, dans les chargeurs Korplug documentés par XORHEX, pour résoudre GetProcAddress et LoadLibraryA, bien qu’il n’ait pas été identifié par son nom dans cette analyse. Dans cette version, cependant, il est utilisé pour toutes les fonctions de l’API.

Backdoor Korplug

Korplug (également connu sous le nom de PlugX) est un RAT utilisée par plusieurs groupes APT. Bien qu’il soit largement utilisé, ou peut-être à cause de cela, peu de rapports décrivent en détail ses commandes et les données qu’il exfiltre. Ses fonctionnalités ne sont pas constantes d’une variante à l’autre, mais il semble exister un chevauchement important dans la liste des commandes entre la version que nous avons analysée et d’autres sources telles que le rapport Avira de janvier 2020 et le projet plugxdecoder sur GitHub.

Comme mentionné précédemment, la variante utilisée dans cette campagne présente de nombreuses similitudes avec la variante THOR, c’est pourquoi nous l’avons nommée Hodur. Ces similitudes incluent l’utilisation de la clé de registre Software\CLASSES\ms-pu, le même format pour les serveurs C&C dans la configuration et l’utilisation de la classe de fenêtre Static .

Comme prévu pour les charges utiles Korplug, cette étape n’est jamais déchiffrée en mémoire par le chargeur. Seule la version chiffrée est écrite sur le disque dans un fichier avec une extension .dat.

Sauf indication contraire, toutes les chaînes codées en dur dont il est question dans cette section sont stockées sous forme de chaînes de pile chiffrées.

Dans ce module, les fonctions de l’API Windows sont obfusquées par une combinaison des méthodes utilisées dans les étapes précédentes. LoadLibraryA et GetProcAddress sont résolus via la technique de hachage FNV-1a et les chaînes de pile sont déchiffrées et leur sont passées pour obtenir la fonction cible.

Chargement

Une fois déchiffrée, la charge utile est une DLL valide qui exporte une seule fonction. Dans presque tous les échantillons observés de cette campagne, cette fonction s’appelle StartProtect. Cependant, le lancement direct via cette exportation ou son point d’entrée n’exécutera pas la charge utile principale et le processus de chargement est assez complexe.

Comme expliqué dans la section précédente, le fichier est déchiffré en mémoire comme un blob continu par le chargeur et l’exécution commence à l’offset 0x00. L’en-tête du PE contient un shellcode, illustré à la figure 6, qui appelle un offset spécifique correspondant à l’exportation unique du module.

Figure 6. Shellcode dans l’en-tête PE qui appelle la fonction exportée

Cette fonction analyse le blob PE en mémoire et le mappe manuellement comme une bibliothèque dans un tampon nouvellement alloué. Cela inclut le mappage des différentes sections, la résolution des importations et, enfin, l’utilisation de DLL_PROCESS_ATTACH pour appeler le point d’entrée de la DLL. Une fois encore, des prédicats opaques et du code poubelle sont utilisés pour obscurcir l’objectif de cette fonction.

Le point d’entrée de la bibliothèque correctement chargée est ensuite appelé avec la valeur non standard de 0x04 pour le paramètre fdwReason (seules les valeurs de 0x00 à 0x03 sont actuellement définies). Cette valeur spéciale est nécessaire pour qu’il exécute sa charge utile principale. Cette simple vérification empêche l’exécution triviale de la RAT directement avec un outil générique comme rundll32.exe.

Le backdoor commence par déchiffrer sa configuration en utilisant la chaîne 123456789 comme clé XOR répétitive. Une fois déchiffré, le bloc de configuration commence par ########. La présentation de la configuration varie légèrement d’un échantillon à l’autre, mais ils contiennent tous au moins les champs suivants :

  • Nom du répertoire d’installation. Également utilisé comme nom de la clé de registre créée pour la persistance. Cette valeur correspond approximativement au nom de l’application abusée avec trois lettres aléatoires ajoutées (par exemple, FontEDLZeP ou AdobePhotosGQp).
  • Nom du mutex
  • Une valeur qui est soit une version, soit une chaîne d’identification
  • Liste des serveurs C&C. Chaque entrée comprend l’adresse IP, le numéro de port et un numéro indiquant le protocole à utiliser avec ce C&C.

La backdoor vérifie ensuite le chemin d’accès à partir duquel il s’exécute en utilisant GetModuleFileNameW. S’il correspond à %userprofile%\<installation directory> ou %allusersprofile%\<installation directory>, la fonctionnalité RAT sera exécutée. Sinon, elle passera par le processus d’installation.

Installation

Pour s’installer, le logiciel malveillant crée le répertoire susmentionné sous %allusersprofile%. À l’aide de SetFileAttributesW, il est ensuite marqué comme hidden et system. L’exécutable vulnérable, le module de chargement et les fichiers Korplug chiffrés sont copiés dans le nouveau répertoire.

Ensuite, la persistance est établie. Les échantillons antérieurs y parvenaient en créant une tâche planifiée à exécuter au démarrage via schtasks.exe. Les échantillons plus récents ajoutent une entrée de registre dans Software\Microsoft\Windows\CurrentVersion\Run, en essayant d’abord la ruche HKLM, puis HKCU. Cette entrée porte le même nom que le répertoire d’installation et sa valeur correspond au chemin de l’exécutable nouvellement copié.

Une fois la persistance mise en place, le logiciel malveillant lance l’exécutable depuis son nouvel emplacement et quitte.

RAT

La fonctionnalité de la RAT de la variante de Hodur utilisée dans cette campagne correspond essentiellement à celle des autres variantes de Korplug, avec quelques commandes et caractéristiques supplémentaires. Cependant, comme nous l’avons indiqué précédemment, les analyses détaillées des commandes Korplug sont rares. Nous souhaitons donc fournir une telle analyse dans l’espoir d’aider les futurs analystes.

Dans ce mode, la porte dérobée parcourt la liste des serveurs C&C dans sa configuration jusqu’à ce qu’elle arrive à la fin ou reçoive une commande de désinstallation. Pour chacun de ces serveurs, il traite les commandes jusqu’à ce qu’il reçoive une commande Stop ou qu’il rencontre une erreur.

La poignée de main initiale de Hodur peut se faire par HTTPS ou TCP. Ceci est déterminé par une valeur dans la configuration pour ce serveur C&C particulier. Les communications ultérieures se font toujours via TCP à l’aide d’un protocole personnalisé que nous décrivons dans cette section, ainsi que les commandes qui peuvent être émises. Hodur utilise des sockets de l’API Windows Sockets (Winsock) qui prennent en charge les I/O superposées.

Après la poignée de main initiale, les communications de Hodur impliquent des messages TCP qui se composent d’un en-tête, avec la structure décrite dans le tableau 2, suivi d’un corps de message qui est généralement compressé en utilisant LZNT1 et toujours chiffré avec RC4. Les messages dont le champ d’en-tête Command number a le bit 0x10000000 activé (ceux qui contiennent des contenus de fichiers pour les commandes ReadFile et WriteFile, décrites dans le Tableau 3) ont des corps de message chiffrés mais pas compressés. Tous les corps de message chiffrés utilisent la clé codée en dur sV!e@T#L$PH% à laquelle est ajouté un nonce aléatoire de quatre octets (la valeur située au décalage 0x00 dans l’en-tête).

Tableau 2. Format d’en-tête utilisé pour la communication entre le C&C et le backdoor

OffsetFieldDescription
0x00NonceRandom nonce appended to the RC4 key.
0x04Command numberThis field indicates the command to run or the command that caused this response to be sent.
0x08Length of bodyLength of the message body. It seems that this field isn’t checked by the client for messages from the C&C server.
0x0CCommand exit statusThe return or error value of the command that was run. This field is not checked by the client in messages received from the C&C server.

Les en-têtes des messages du C&C d’Hodur sont transmis en clair, suivis de corps de messages de taille variable (la valeur au décalage 0x08 de l’en-tête). Le format du corps du message varie selon la commande, mais une fois déchifré et décompressé, les valeurs de longueur variable (comme les chaînes de caractères) se trouvent toujours à la fin du corps du message et leur décalage dans le corps est stocké sous forme d’un nombre entier dans le champ du message correspondant.

Comme la version décrite par Avira, Hodur possède deux groupes de commandes – 0x1001 et 0x1002 – chacun ayant son propre gestionnaire. Le serveur C&C peut définir le groupe à écouter en envoyant l’ID correspondant comme numéro de commande lorsqu’un client n’est pas déjà dans l’un des deux modes. Il continuera à écouter le même groupe jusqu’à ce qu’il reçoive la commande Stop, ou qu’une erreur se produise (y compris la réception d’un message dont l’en-tête contient un numéro de commande invalide).

Le premier groupe, 0x1001, contient des commandes permettant de gérer l’exécution de la porte dérobée et d’effectuer une reconnaissance initiale sur un hôte nouvellement compromis. Comme ces commandes ne prennent aucun argument, les messages envoyés par le serveur C&C ne sont constitués que des en-têtes. Le Tableau 3 contient une liste de ces commandes. La commande GetSystemInfo est décrite plus en détail ci-dessous. Notez qu’aucun nom de commande n’est présent dans la RAT ; ils ont été soit repris d’analyses précédentes, soit fournis par nous.

Tableau 3. Commandes du groupe 0x1001

IDNameDescriptionData in client response
0x1000PingSent by the client when it starts listening for commands from this group.Between 0 and 64 random bytes
0x1001GetSystemInfoGet information about the system.See Table 4
0x1002ListenThreadStart a new thread that listens for group 0x1002 commands.None
0x1004ResetConnectionTerminate with WSAECONNRESET.N/A
0x1005UninstallDelete persistence registry keys, remove itself and created folders.None
0x1007StopSet registry key System\CurrentControlSet\Control\‌Network\allow to 1 and exit.N/A

La commande GetSystemInfo collecte de nombreuses informations sur le système, comme détaillé dans le Tableau 4. Si elle n’existe pas déjà, la clé de registre Software\CLASSES\ms-pu\CLSID est définie avec l’horodatage actuel, en essayant d’abord HKLM puis HKCU. La valeur de cette clé est ensuite envoyée dans la réponse.

Tableau 4. Format du corps de réponse pour la réponse GetSystemInfo

OffsetValueOffsetValue
0x00Magic bytes 0x201903010x38Suite mask
0x04Client IP address of the C&C socket0x3AProduct type
0x08Server IP address of the C&C socket0x3C0x01 if the process is running as WOW64
0x0CRAM in KB0x40System time – year
0x10CPU clock rate in MHz0x42System time – month
0x14Display width in pixels0x44Timestamp of first run (offset)
0x18Display height in pixels0x46Service pack version string (offset)
0x1CDefault locale0x48Unknown
0x20Current tick count0x4AUsername (offset)
0x24OS major version0x4CComputer name (offset)
0x28OS minor version0x4EMutex name (offset)
0x2COS build number0x50Unknown
0x30OS platform ID0x52List of machine IP addresses (offset)
0x34Service pack major version0x54Always two 0x00 bytes
0x36Service pack minor version

Le groupe 0x1002 contient des commandes qui fournissent la fonctionnalité de la RAT, comme détaillé dans le Tableau 5. Certaines d’entre elles prennent des paramètres fournis dans le corps du message de la commande. La commande FindFiles est décrite plus en détail ci-dessous. Encore une fois, notez qu’aucun nom de commande n’est présent dans la RAT ; ils ont été soit repris d’analyses précédentes, soit fournis par nous.

Tableau 5. Commandes du groupe 0x1002

IDNameDescriptionData in C&C requestData in client response
0x1002PingSent by the client when it starts listening for commands from this group.N/ANone
0x3000ListDrivesList all mapped drives (A: to Z:) and their properties.

All 26 entries are sent back in one message body. Drives that aren’t present have all fields set to 0x00.
None· Drive type
· Total size
· Space available to user
· Free space
· Volume name (offset)
· File system name (offset)
0x3001ListDirectoryList the contents of the specified directory. The client sends one response message per entry.Directory path· Is a directory?
· File attributes
· File size
· Creation time
· Last write time
· Filename (offset)
· 8.3 filename (offset)
0x3002Sent by the client when it has finished executing the ListDirectory command.N/ANone
0x3004ReadFileRead a file in chunks of 0x4000 bytes. · Creation time
· Last access time
· Last write time
· Has offset
· Offset in file
· File size
· File path
0x10003005Chunk of read file data.N/ARead data
0x10003006Sent by the client when it has finished executing the ReadFile command.N/ANone
0x3007WriteFileWrite to a file and restore previous timestamp.

Creates parent directories if they don’t exist.
· Creation time
· Last access time
· Last write time
· Has offset
· Offset in file
· File path (offset)
None
0x10003008Sent by the server with data to write to the file.Data to writeN/A
0x10003009Sent by the server when the WriteFile operation is complete.NoneN/A
0x300ACreateDirectoryCreate a directory.Directory pathNone
0x300BCanReadFileTry to open a file with read permissions.File pathNone
0x300CDesktopExecuteExecute a command on a hidden desktop.Command line to executePROCESS_INFORMATION structure for the created process.
0x300DFileOperationPerform a file operation using SHFileOperation.· wFunc
· fFlags
· pFrom (offset)
· pTo (offset)
None
0x300EGetEnvValueGet the value of an environment variable.Environment variableEnvironment variable value.
0x300FCreateProgramDataDirCreates the directory %SYSTEM%\ProgramData, optionally with a subdirectory.Subdirectory relative path (optional)None
0x3102FindFilesRecursively search a directory for files matching a given pattern.· Starting directory
· Search pattern
See response body format in Table 6.
0x7002RemoteShellStart an interactive remote cmd.exe session.NoneNone
0x7003Result of the last command run.N/ACommand output

FindFiles command

À partir du répertoire fourni, cette commande recherche les fichiers dont le nom correspond au motif donné. Ce modèle prend en charge les mêmes caractères génériques que l’API Windows FindFirstFile. Pour chaque fichier correspondant, le client envoie un message de réponse dont le corps a le format décrit dans le Tableau 6.

Tableau 6. Format du corps de la réponse pour la commande FindFiles

OffsetValueOffsetValue
0x00File attributes0x24Folder path (offset)
0x04File size in bytes0x26Filename (offset)
0x0CCreation time0x288.3 filename (offset)
0x1CLast write time

Un message de réponse avec un corps sans contenu est envoyé une fois la recherche terminée.

Conclusion

Les leurres utilisés dans cette campagne montrent une fois de plus la rapidité avec laquelle Mustang Panda est capable de réagir aux événements mondiaux. Par exemple, un règlement de l’UE sur le COVID-19 a été utilisé comme leurre deux semaines seulement après sa publication, et des documents sur la guerre en Ukraine ont commencé à être utilisés dans les jours qui ont suivi le début du lancement de l’invasion. Ce groupe fait également preuve d’une capacité à améliorer ses outils de manière itérative, y compris son utilisation caractéristique de téléchargeurs tridentés pour déployer Korplug.

Pour toute question concernant nos recherches publiées sur WeLiveSecurity, veuillez nous contacter à threatintel@eset.com.

ESET Recherche propose désormais des rapports privés de renseignements sur les groupes APT et des flux de données. Pour toute demande de renseignements sur ce service, visitez la page ESET Threat Intelligence.

Indicateurs de compromission (IoCs)

SHA-1FilenameESET detection nameDescription
69AB6B9906F8DCE03B43BEBB7A07189A69DC507Bcoreclr.dllWin32/Agent.ADMWKorplug loader.
10AE4784D0FFBC9CD5FD85B150830AEA3334A1DEN/AWin32/Korplug.TCDecrypted Korplug (dumped from memory).
69AB6B9906F8DCE03B43BEBB7A07189A69DC507Bcoreclr.dllWin32/Agent.ADMWKorplug loader.
4EBFC035179CD72D323F0AB357537C094A276E6DPowerDVD18.exeWin32/Delf.UTNKorplug loader.
FDBB16B8BA7724659BAB5B2E1385CFD476F10607N/AWin32/Korplug.TBDecrypted Korplug (dumped from memory).
7E059258CF963B95BDE479D1C374A4C300624986N/AWin32/Korplug.TCDecrypted Korplug (dumped from memory).
7992729769760ECAB37F2AA32DE4E61E77828547SHELLSEL.ocxWin32/Agent.ADMWKorplug loader.
F05E89D031D051159778A79D81685B62AFF4E3F9SymHp.exeWin32/Delf.UTNKorplug loader.
AB01E099872A094DC779890171A11764DE8B4360BoomerangLib.dllWin32/Korplug.THKorplug loader.
CDB15B1ED97985D944F883AF05483990E02A49F7PotPlayer.dllWin32/Agent.ADYOKorplug loader.
908F55D21CCC2E14D4FF65A7A38E26593A0D9A70SmadHook32.dllWin32/Agent.ADMWKorplug loader.
477A1CE31353E8C26A8F4E02C1D378295B302C9EN/AWin32/Agent.ADMWKorplug loader.
52288C2CDB5926ECC970B2166943C9D4453F5E92SmadHook32c.dllWin32/Agent.ADMWKorplug loader.
CBD875EE456C84F9E87EC392750D69A75FB6B23ASHELLSEL.ocxWin32/Agent.ADMWKorplug loader.
2CF4BAFE062D38FAF4772A7D1067B80339C2CE82Adobe_Caps.dllWin32/Agent.ADMWKorplug loader.
97C92ADD7145CF9386ABD5527A8BCD6FABF9A148DocConvDll.dllWin32/Agent.ADYOKorplug loader.
39863CECA1B0F54F5C063B3015B776CDB05971F3N/AWin32/Korplug.TDDecrypted Korplug (dumped from memory).
0D5348B5C9A66C743615E819AEF152FB5B0DAB97FontEDL.execleanVulnerable legitimate Font File Generator executable.
C8F5825499315EAF4B5046FF79AC9553E71AD1C0Silverlight.Configuration.execleanVulnerable legitimate Microsoft Silverlight Configuration Utility executable.
D4FFE4A4F2BD2C19FF26139800C18339087E39CDPowerDVDLP.execleanVulnerable legitimate PowerDVD executable.
65898ACA030DCEFDA7C970D3A311E8EA7FFC844ASymantec.execleanVulnerable legitimate Symantec AntiVirus executable.
7DDB61872830F4A0E6BF96FAF665337D01F164FCAdobe Stock Photos CS3.execleanVulnerable legitimate Adobe Stock Photos executable.
C13D0D669365DFAFF9C472E615A611E058EBF596COVID-19 travel restrictions EU reviews list of third countries.exeWin32/Agent_AGen.NJDownloader.
062473912692F7A3FAB8485101D4FCF6D704ED23REGULATION OF THE EUROPEAN PARLIAMENT AND OF THE COUNCIL.exeWin32/TrojanDownloader.Agent.GDLDownloader.
2B5D6BB5188895DA4928DD310C7C897F51AAA050log.dllWin32/Agent.ACYWKorplug loader.
511DA645A7282FB84FF18C33398E67D7661FD6632.exeWin32/Agent.ADPLKorplug loader.
59002E1A58065D7248CD9D7DD62C3F865813EEE6log.dllWin32/Agent.ADXEKorplug loader.
F67C553678B7857D1BBC488040EA90E6C52946B3KINGSTON.exeWin32/Agent.ADXZKorplug Loader.
58B6B5FD3F2BFD182622F547A93222A4AFDF4E76PotPlayer.execleanVulnerable legitimate executable.

Réseaux

DomainIPFirst seenNotes
103.56.53[.]1202021‑06‑15Korplug C&C
154.204.27[.]1812020‑10‑05Korplug C&C.
43.254.218[.]422021‑02‑09Download server.
45.131.179[.]1792020‑10‑05Korplug C&C.
176.113.69[.]912021-04-19Korplug C&C.
upespr[.]com45.154.14[.]2352022-01-17Download server.
urmsec[.]com156.226.173[.]232022‑02‑23Download server.
101.36.125[.]2032021-06-01Korplug C&C.
185.207.153[.]2082022‑02‑03Download server.
154.204.27[.]1302021-12-14Korplug C&C.
92.118.188[.]782022-01-27Korplug C&C.
zyber-i[.]com107.178.71[.]2112022-03-01Download server.
locvnpt[.]com103.79.120[.]662021-05-21Download server. This domain was previously used in a 2020 campaign documented by Recorded Future.

Techniques MITRE ATT&CK

Ce tableau a été conçu en utilisant la version 10 de MITRE ATT&CK.

TacticIDNameDescription
Resource DevelopmentT1583.001Acquire Infrastructure: DomainsMustang Panda has registered domains for use as download servers.
T1583.003Acquire Infrastructure: Virtual Private ServerSome download servers used by Mustang Panda appear to be on shared hosting.
T1583.004Acquire Infrastructure: ServerMustang Panda uses servers that appear to be exclusive to the group.
T1587.001Develop Capabilities: MalwareMustang Panda has developed custom loader and Korplug versions.
T1588.006Obtain Capabilities: VulnerabilitiesMultiple DLL hijacking vulnerabilities are used in the deployment process.
T1608.001Stage Capabilities: Upload MalwareMalicious payloads are hosted on the download servers.
ExecutionT1059.003Command and Scripting Interpreter: Windows Command ShellWindows command shell is used to execute commands sent by the C&C server.
T1106Native APIMustang Panda uses CreateProcess and ShellExecute for execution.
T1129Shared ModulesMustang Panda uses LoadLibrary to load additional DLLs at runtime. The loader and RAT are DLLs.
T1204.002User Execution: Malicious FileMustang Panda relies on the user executing the initial downloader.
T1574.002Hijack Execution Flow: DLL Side-LoadingThe downloader obtains and launches a vulnerable application so it loads and executes the malicious DLL that contains the second stage.
PersistenceT1547.001Boot or Logon Autostart Execution: Registry Run Keys / Startup FolderKorplug can persist via registry Run keys.
T1053.005Scheduled Task/Job: Scheduled TaskKorplug can persist by creating a scheduled task that runs on startup.
Defense EvasionT1140Deobfuscate/Decode Files or InformationThe Korplug file is encrypted and only decrypted at runtime, and its configuration data is encrypted with XOR.
T1564.001Hide Artifacts: Hidden Files and DirectoriesDirectories created during the installation process are set as hidden system directories.
T1564.003Hide Artifacts: Hidden WindowKorplug can run commands on a hidden desktop. Multiple hidden windows are used during the deployment process.
T1070Indicator Removal on HostKorplug’s uninstall command deletes registry keys that store data and provide persistence.
T1070.004Indicator Removal on Host: File DeletionKorplug can remove itself and all created directories.
T1070.006Indicator Removal on Host: TimestompWhen writing to a file, Korplug sets the file’s timestamps to their previous values.
T1036.004Masquerading: Masquerade Task or ServiceScheduled tasks created for persistence use legitimate-looking names.
T1036.005Masquerading: Match Legitimate Name or LocationFile and directory names match expected values for the legitimate app that is abused by the loader.
T1112Modify RegistryKorplug can create, modify, and remove registry keys.
T1027Obfuscated Files or InformationSome downloaded files are encrypted and stored as hexadecimal strings.
T1027.005Obfuscated Files or Information: Indicator Removal from ToolsImports are hidden by dynamic resolution of API function names.
T1055.001Process Injection: Dynamic-link Library InjectionSome versions of the Korplug loader inject the Korplug DLL into a newly launched process.
T1620Reflective Code LoadingKorplug parses and loads itself into memory.
DiscoveryT1083File and Directory DiscoveryKorplug can list files and directories along with their attributes and content.
T1082System Information DiscoveryKorplug collects extensive information about the system including uptime, Windows version, CPU clock rate, amount of RAM and display resolution.
T1614System Location DiscoveryKorplug retrieves the system locale using GetSystemDefaultLCID.
T1016System Network Configuration DiscoveryKorplug collects the system hostname and IP addresses.
T1016.001System Network Configuration Discovery: Internet Connection DiscoveryThe downloader pings Google’s DNS server to check internet connectivity.
T1033System Owner/User DiscoveryKorplug obtains the current user’s username.
T1124System Time DiscoveryKorplug uses GetSystemTime to retrieve the current system time.
CollectionT1005Data from Local SystemKorplug collects extensive data about the system it’s running on.
T1025Data from Removable MediaKorplug can collect metadata and content from all mapped drives.
T1039Data from Network Shared DriveKorplug can collect metadata and content from all mapped drives.
Command and ControlT1071.001Application Layer Protocol: Web ProtocolsKorplug can make the initial handshake over HTTPS.
T1095Non-Application Layer ProtocolC&C communication is done over a custom TCP-based protocol.
T1573.001Encrypted Channel: Symmetric CryptographyC&C communication is encrypted using RC4.
T1008Fallback ChannelsThe Korplug configuration contains fallback C&C servers.
T1105Ingress Tool TransferKorplug can download additional files from the C&C server.
T1571Non-Standard PortWhen Hodur performs its initial handshake over HTTPS, it uses the same port (specified in the configuration) as for the rest of the communication.
T1132.001Data Encoding: Standard EncodingKorplug compresses transferred data using LZNT1.
ExfiltrationT1041Exfiltration Over C2 ChannelData exfiltration is done via the same custom protocol used to send and receive commands.

Rejoignez le nombre des lecteurs de WLS qui reçoivent une mise à jour dès la publication de tout nouvel article concernant la Crise en Ukraine.

Infolettre

Discussion