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.
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.
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.
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.
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.
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.
Name | Ordinal | Function RVA |
---|---|---|
CreatePotPlayerExW | 1 | 0x00007894 |
RunPotPlayer | 2 | 0x000166A5 |
createSystemFontsUsingEDL | 3 | 0x00016779 |
gGegcerhwyvxtkrtyawvugo | 4 | 0x00007894 |
liucigvyworf | 5 | 0x00007639 |
ojohjinbgdfqtcwxojeusoneslciyxtiyjuieaugadjpd | 6 | 0x000077CA |
soeevhiywsypipesxfhgxboleahfwvlqcqp | 7 | 0x00007894 |
srkeqffanuhiuwahbmatdurggpffhbkcpukyxgxmosn | 8 | 0x00007894 |
thggvmrv | 9 | 0x00007701 |
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.
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
Offset | Field | Description |
---|---|---|
0x00 | Nonce | Random nonce appended to the RC4 key. |
0x04 | Command number | This field indicates the command to run or the command that caused this response to be sent. |
0x08 | Length of body | Length of the message body. It seems that this field isn’t checked by the client for messages from the C&C server. |
0x0C | Command exit status | The 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
ID | Name | Description | Data in client response |
---|---|---|---|
0x1000 | Ping | Sent by the client when it starts listening for commands from this group. | Between 0 and 64 random bytes |
0x1001 | GetSystemInfo | Get information about the system. | See Table 4 |
0x1002 | ListenThread | Start a new thread that listens for group 0x1002 commands. | None |
0x1004 | ResetConnection | Terminate with WSAECONNRESET. | N/A |
0x1005 | Uninstall | Delete persistence registry keys, remove itself and created folders. | None |
0x1007 | Stop | Set 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
Offset | Value | Offset | Value |
---|---|---|---|
0x00 | Magic bytes 0x20190301 | 0x38 | Suite mask |
0x04 | Client IP address of the C&C socket | 0x3A | Product type |
0x08 | Server IP address of the C&C socket | 0x3C | 0x01 if the process is running as WOW64 |
0x0C | RAM in KB | 0x40 | System time – year |
0x10 | CPU clock rate in MHz | 0x42 | System time – month |
0x14 | Display width in pixels | 0x44 | Timestamp of first run (offset) |
0x18 | Display height in pixels | 0x46 | Service pack version string (offset) |
0x1C | Default locale | 0x48 | Unknown |
0x20 | Current tick count | 0x4A | Username (offset) |
0x24 | OS major version | 0x4C | Computer name (offset) |
0x28 | OS minor version | 0x4E | Mutex name (offset) |
0x2C | OS build number | 0x50 | Unknown |
0x30 | OS platform ID | 0x52 | List of machine IP addresses (offset) |
0x34 | Service pack major version | 0x54 | Always two 0x00 bytes |
0x36 | Service 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
ID | Name | Description | Data in C&C request | Data in client response |
---|---|---|---|---|
0x1002 | Ping | Sent by the client when it starts listening for commands from this group. | N/A | None |
0x3000 | ListDrives | List 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 |
|
0x3001 | ListDirectory | List the contents of the specified directory. The client sends one response message per entry. | Directory path |
|
0x3002 | #rowspan# | Sent by the client when it has finished executing the ListDirectory command. | N/A | None |
0x3004 | ReadFile | Read a file in chunks of 0x4000 bytes. |
|
|
0x10003005 | #rowspan# | Chunk of read file data. | N/A | Read data |
0x10003006 | #rowspan# | Sent by the client when it has finished executing the ReadFile command. | N/A | None |
0x3007 | WriteFile | Write to a file and restore previous timestamp.
Creates parent directories if they don’t exist. |
|
None |
0x10003008 | #rowspan# | Sent by the server with data to write to the file. | Data to write | N/A |
0x10003009 | #rowspan# | Sent by the server when the WriteFile operation is complete. | None | N/A |
0x300A | CreateDirectory | Create a directory. | Directory path | None |
0x300B | CanReadFile | Try to open a file with read permissions. | File path | None |
0x300C | DesktopExecute | Execute a command on a hidden desktop. | Command line to execute | PROCESS_INFORMATION structure for the created process. |
0x300D | FileOperation | Perform a file operation using SHFileOperation. |
|
None |
0x300E | GetEnvValue | Get the value of an environment variable. | Environment variable | Environment variable value. |
0x300F | CreateProgramDataDir | Creates the directory %SYSTEM%\ProgramData, optionally with a subdirectory. | Subdirectory relative path (optional) | None |
0x3102 | FindFiles | Recursively search a directory for files matching a given pattern. |
|
See response body format in Table 6. |
0x7002 | RemoteShell | Start an interactive remote cmd.exe session. | None | None |
0x7003 | #rowspan# | Result of the last command run. | N/A | Command 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
Offset | Value | Offset | Value |
---|---|---|---|
0x00 | File attributes | 0x24 | Folder path (offset) |
0x04 | File size in bytes | 0x26 | Filename (offset) |
0x0C | Creation time | 0x28 | 8.3 filename (offset) |
0x1C | Last 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-1 | Filename | ESET detection name | Description |
---|---|---|---|
69AB6B9906F8DCE03B43BEBB7A07189A69DC507B | coreclr.dll | Win32/Agent.ADMW | Korplug loader. |
10AE4784D0FFBC9CD5FD85B150830AEA3334A1DE | N/A | Win32/Korplug.TC | Decrypted Korplug (dumped from memory). |
69AB6B9906F8DCE03B43BEBB7A07189A69DC507B | coreclr.dll | Win32/Agent.ADMW | Korplug loader. |
4EBFC035179CD72D323F0AB357537C094A276E6D | PowerDVD18.exe | Win32/Delf.UTN | Korplug loader. |
FDBB16B8BA7724659BAB5B2E1385CFD476F10607 | N/A | Win32/Korplug.TB | Decrypted Korplug (dumped from memory). |
7E059258CF963B95BDE479D1C374A4C300624986 | N/A | Win32/Korplug.TC | Decrypted Korplug (dumped from memory). |
7992729769760ECAB37F2AA32DE4E61E77828547 | SHELLSEL.ocx | Win32/Agent.ADMW | Korplug loader. |
F05E89D031D051159778A79D81685B62AFF4E3F9 | SymHp.exe | Win32/Delf.UTN | Korplug loader. |
AB01E099872A094DC779890171A11764DE8B4360 | BoomerangLib.dll | Win32/Korplug.TH | Korplug loader. |
CDB15B1ED97985D944F883AF05483990E02A49F7 | PotPlayer.dll | Win32/Agent.ADYO | Korplug loader. |
908F55D21CCC2E14D4FF65A7A38E26593A0D9A70 | SmadHook32.dll | Win32/Agent.ADMW | Korplug loader. |
477A1CE31353E8C26A8F4E02C1D378295B302C9E | N/A | Win32/Agent.ADMW | Korplug loader. |
52288C2CDB5926ECC970B2166943C9D4453F5E92 | SmadHook32c.dll | Win32/Agent.ADMW | Korplug loader. |
CBD875EE456C84F9E87EC392750D69A75FB6B23A | SHELLSEL.ocx | Win32/Agent.ADMW | Korplug loader. |
2CF4BAFE062D38FAF4772A7D1067B80339C2CE82 | Adobe_Caps.dll | Win32/Agent.ADMW | Korplug loader. |
97C92ADD7145CF9386ABD5527A8BCD6FABF9A148 | DocConvDll.dll | Win32/Agent.ADYO | Korplug loader. |
39863CECA1B0F54F5C063B3015B776CDB05971F3 | N/A | Win32/Korplug.TD | Decrypted Korplug (dumped from memory). |
0D5348B5C9A66C743615E819AEF152FB5B0DAB97 | FontEDL.exe | clean | Vulnerable legitimate Font File Generator executable. |
C8F5825499315EAF4B5046FF79AC9553E71AD1C0 | Silverlight.Configuration.exe | clean | Vulnerable legitimate Microsoft Silverlight Configuration Utility executable. |
D4FFE4A4F2BD2C19FF26139800C18339087E39CD | PowerDVDLP.exe | clean | Vulnerable legitimate PowerDVD executable. |
65898ACA030DCEFDA7C970D3A311E8EA7FFC844A | Symantec.exe | clean | Vulnerable legitimate Symantec AntiVirus executable. |
7DDB61872830F4A0E6BF96FAF665337D01F164FC | Adobe Stock Photos CS3.exe | clean | Vulnerable legitimate Adobe Stock Photos executable. |
C13D0D669365DFAFF9C472E615A611E058EBF596 | COVID-19 travel restrictions EU reviews list of third countries.exe | Win32/Agent_AGen.NJ | Downloader. |
062473912692F7A3FAB8485101D4FCF6D704ED23 | REGULATION OF THE EUROPEAN PARLIAMENT AND OF THE COUNCIL.exe | Win32/TrojanDownloader.Agent.GDL | Downloader. |
2B5D6BB5188895DA4928DD310C7C897F51AAA050 | log.dll | Win32/Agent.ACYW | Korplug loader. |
511DA645A7282FB84FF18C33398E67D7661FD663 | 2.exe | Win32/Agent.ADPL | Korplug loader. |
59002E1A58065D7248CD9D7DD62C3F865813EEE6 | log.dll | Win32/Agent.ADXE | Korplug loader. |
F67C553678B7857D1BBC488040EA90E6C52946B3 | KINGSTON.exe | Win32/Agent.ADXZ | Korplug Loader. |
58B6B5FD3F2BFD182622F547A93222A4AFDF4E76 | PotPlayer.exe | clean | Vulnerable legitimate executable. |
Réseaux
Domain | IP | First seen | Notes |
---|---|---|---|
103.56.53[.]120 | 2021‑06‑15 | Korplug C&C | |
154.204.27[.]181 | 2020‑10‑05 | Korplug C&C. | |
43.254.218[.]42 | 2021‑02‑09 | Download server. | |
45.131.179[.]179 | 2020‑10‑05 | Korplug C&C. | |
176.113.69[.]91 | 2021-04-19 | Korplug C&C. | |
upespr[.]com | 45.154.14[.]235 | 2022-01-17 | Download server. |
urmsec[.]com | 156.226.173[.]23 | 2022‑02‑23 | Download server. |
101.36.125[.]203 | 2021-06-01 | Korplug C&C. | |
185.207.153[.]208 | 2022‑02‑03 | Download server. | |
154.204.27[.]130 | 2021-12-14 | Korplug C&C. | |
92.118.188[.]78 | 2022-01-27 | Korplug C&C. | |
zyber-i[.]com | 107.178.71[.]211 | 2022-03-01 | Download server. |
locvnpt[.]com | 103.79.120[.]66 | 2021-05-21 | Download 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.
Tactic | ID | Name | Description |
---|---|---|---|
Resource Development | T1583.001 | Acquire Infrastructure: Domains | Mustang Panda has registered domains for use as download servers. |
T1583.003 | Acquire Infrastructure: Virtual Private Server | Some download servers used by Mustang Panda appear to be on shared hosting. | |
T1583.004 | Acquire Infrastructure: Server | Mustang Panda uses servers that appear to be exclusive to the group. | |
T1587.001 | Develop Capabilities: Malware | Mustang Panda has developed custom loader and Korplug versions. | |
T1588.006 | Obtain Capabilities: Vulnerabilities | Multiple DLL hijacking vulnerabilities are used in the deployment process. | |
T1608.001 | Stage Capabilities: Upload Malware | Malicious payloads are hosted on the download servers. | |
Execution | T1059.003 | Command and Scripting Interpreter: Windows Command Shell | Windows command shell is used to execute commands sent by the C&C server. |
T1106 | Native API | Mustang Panda uses CreateProcess and ShellExecute for execution. | |
T1129 | Shared Modules | Mustang Panda uses LoadLibrary to load additional DLLs at runtime. The loader and RAT are DLLs. | |
T1204.002 | User Execution: Malicious File | Mustang Panda relies on the user executing the initial downloader. | |
T1574.002 | Hijack Execution Flow: DLL Side-Loading | The downloader obtains and launches a vulnerable application so it loads and executes the malicious DLL that contains the second stage. | |
Persistence | T1547.001 | Boot or Logon Autostart Execution: Registry Run Keys / Startup Folder | Korplug can persist via registry Run keys. |
T1053.005 | Scheduled Task/Job: Scheduled Task | Korplug can persist by creating a scheduled task that runs on startup. | |
Defense Evasion | T1140 | Deobfuscate/Decode Files or Information | The Korplug file is encrypted and only decrypted at runtime, and its configuration data is encrypted with XOR. |
T1564.001 | Hide Artifacts: Hidden Files and Directories | Directories created during the installation process are set as hidden system directories. | |
T1564.003 | Hide Artifacts: Hidden Window | Korplug can run commands on a hidden desktop. Multiple hidden windows are used during the deployment process. | |
T1070 | Indicator Removal on Host | Korplug’s uninstall command deletes registry keys that store data and provide persistence. | |
T1070.004 | Indicator Removal on Host: File Deletion | Korplug can remove itself and all created directories. | |
T1070.006 | Indicator Removal on Host: Timestomp | When writing to a file, Korplug sets the file’s timestamps to their previous values. | |
T1036.004 | Masquerading: Masquerade Task or Service | Scheduled tasks created for persistence use legitimate-looking names. | |
T1036.005 | Masquerading: Match Legitimate Name or Location | File and directory names match expected values for the legitimate app that is abused by the loader. | |
T1112 | Modify Registry | Korplug can create, modify, and remove registry keys. | |
T1027 | Obfuscated Files or Information | Some downloaded files are encrypted and stored as hexadecimal strings. | |
T1027.005 | Obfuscated Files or Information: Indicator Removal from Tools | Imports are hidden by dynamic resolution of API function names. | |
T1055.001 | Process Injection: Dynamic-link Library Injection | Some versions of the Korplug loader inject the Korplug DLL into a newly launched process. | |
T1620 | Reflective Code Loading | Korplug parses and loads itself into memory. | |
Discovery | T1083 | File and Directory Discovery | Korplug can list files and directories along with their attributes and content. |
T1082 | System Information Discovery | Korplug collects extensive information about the system including uptime, Windows version, CPU clock rate, amount of RAM and display resolution. | |
T1614 | System Location Discovery | Korplug retrieves the system locale using GetSystemDefaultLCID. | |
T1016 | System Network Configuration Discovery | Korplug collects the system hostname and IP addresses. | |
T1016.001 | System Network Configuration Discovery: Internet Connection Discovery | The downloader pings Google’s DNS server to check internet connectivity. | |
T1033 | System Owner/User Discovery | Korplug obtains the current user’s username. | |
T1124 | System Time Discovery | Korplug uses GetSystemTime to retrieve the current system time. | |
Collection | T1005 | Data from Local System | Korplug collects extensive data about the system it’s running on. |
T1025 | Data from Removable Media | Korplug can collect metadata and content from all mapped drives. | |
T1039 | Data from Network Shared Drive | Korplug can collect metadata and content from all mapped drives. | |
Command and Control | T1071.001 | Application Layer Protocol: Web Protocols | Korplug can make the initial handshake over HTTPS. |
T1095 | Non-Application Layer Protocol | C&C communication is done over a custom TCP-based protocol. | |
T1573.001 | Encrypted Channel: Symmetric Cryptography | C&C communication is encrypted using RC4. | |
T1008 | Fallback Channels | The Korplug configuration contains fallback C&C servers. | |
T1105 | Ingress Tool Transfer | Korplug can download additional files from the C&C server. | |
T1571 | Non-Standard Port | When Hodur performs its initial handshake over HTTPS, it uses the same port (specified in the configuration) as for the rest of the communication. | |
T1132.001 | Data Encoding: Standard Encoding | Korplug compresses transferred data using LZNT1. | |
Exfiltration | T1041 | Exfiltration Over C2 Channel | Data exfiltration is done via the same custom protocol used to send and receive commands. |