# Mustang Panda’s Hodur : Vieux trucs, nouvelle variante de Korplug **welivesecurity.com/fr/2022/03/25/mustang-pandas-hodur-nouveau-korplug/** March 25, 2022 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. [Alexandre Côté Cyr](https://www.welivesecurity.com/fr/author/acotecyr/) 25 Mar 2022 - 04:54PM 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](https://unit42.paloaltonetworks.com/thor-plugx-variant/) 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](https://data2.unhcr.org/fr/situations/ukraine) 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. ----- aut es eu es de p s g e t o e t des est ct o s de oyage CO 9 ses à jou, u e ca te d a de ég o a e app ou ée pou a 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.](https://www.recordedfuture.com/reddelta-targets-catholic-organizations/) 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](https://www.proofpoint.com/us/blog/threat-insight/good-bad-and-web-bug-ta416-increases-operational-tempo-against-european) historiques et de ciblage supplémentaires. ## Coffre à outil ----- usta g a da est co u pou ses c a geu s pe so a sés é abo és et ses a a tes de o p ug, et es éc a t o s ut sés da s 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 ----- S tuat o at t e U bo de s t U a e e e 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](https://www.welivesecurity.com/2020/12/10/luckymouse-ta428-compromise-able-desktop/) 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%\ » 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_ ----- a s es e s o s u té eu es, es c e s su e se eu so t c és e C, e ut sa t a ep ése tat o de a c a e de base 0 de a ta e 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 à](https://docs.microsoft.com/fr-fr/windows/win32/api/winternl/ns-winternl-peb) 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](https://www.qurium.org/alerts/targeted-malware-against-crph/) 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 ----- **Name** **Ordinal** **Function RVA** 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](https://www.mandiant.com/resources/sunburst-additional-technical-details) [Panda, dans les chargeurs Korplug documentés par XORHEX, pour résoudre GetProcAddress et LoadLibraryA, bien qu’il n’ait pas été](https://blog.xorhex.com/blog/reddeltaplugxchangeup/) 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](https://www.avira.com/en/blog/new-wave-of-plugx-targets-hong-kong) _[plugxdecoder sur GitHub.](https://github.com/kcreyts/plugxdecoder)_ 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 ----- o ct o 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](https://docs.microsoft.com/fr-fr/windows/win32/dlls/dllmain) 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%\ ou %allusersprofile%\, 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.](https://docs.microsoft.com/fr-fr/windows/win32/winsock/overlapped-i-o-2) 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. ----- **Offset** **Field** **Description** **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 ----- **Offset** **Value** **Offset** **Value** **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 cidessous. 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** **0x1002** Ping Sent by the client when it starts listening for commands from this group. **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. **0x3001** ListDirectory List the contents of the specified directory. The client sends one response message per entry. **Data in C&C** **request** **Data in client response** N/A None None - Drive type - Total size - Space available to user - Free space - Volume name (offset) - File system name (offset) Directory path - Is a directory? - File attributes - File size - Creation time - Last write time - Filename (offset) - 8.3 filename (offset) **0x3002** 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. - Creation time Last access time - Last write time - Has offset - Offset in file - File size - File path **0x10003005** Chunk of read file data. N/A Read data **0x10003006** Sent by the client when it has finished executing the ReadFile command. **0x3007** WriteFile **0x10003008** Sent by the server with data to write to the file. **0x10003009** Sent by the server when the WriteFile operation is complete. N/A None - Creation time Write to a file and restore previous - Last access timestamp. time - Last write time Creates parent directories if they don’t - Has offset exist. - Offset in file - File path (offset) Data to write N/A None N/A None **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. ----- **ID** **Name** **Description** **0x300D** FileOperation Perform a file operation using SHFileOperation. **Data in C&C** **request** **Data in client response** - wFunc - fFlags - pFrom (offset) - pTo (offset) **0x300E** GetEnvValue Get the value of an environment variable. Environment variable **0x300F** CreateProgramDataDir Creates the directory %SYSTEM%\ProgramData, optionally with a subdirectory. **0x3102** FindFiles Recursively search a directory for files matching a given pattern. **0x7002** RemoteShell Start an interactive remote cmd.exe session. Subdirectory relative path (optional) - Starting directory - Search pattern None Environment variable value. None See response body format in Table 6. None None **0x7003** Result of the last command run. **_FindFiles command_** N/A Command output À 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.](http://10.10.0.46/mailto: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.](https://www.eset.com/int/business/services/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 Korpl (dumped from memory). 69AB6B9906F8DCE03B43BEBB7A07189A69DC507B coreclr.dll Win32/Agent.ADMW Korplug loader. 4EBFC035179CD72D323F0AB357537C094A276E6D PowerDVD18.exe Win32/Delf.UTN Korplug loader. ----- **SHA-1** **Filename** **ESET detection name** **Description** FDBB16B8BA7724659BAB5B2E1385CFD476F10607 N/A Win32/Korplug.TB Decrypted Korpl (dumped from memory). 7E059258CF963B95BDE479D1C374A4C300624986 N/A Win32/Korplug.TC Decrypted Korpl (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 Korpl (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 C13D0D669365DFAFF9C472E615A611E058EBF596 COVID-19 travel restrictions EU reviews list of third countries.exe 062473912692F7A3FAB8485101D4FCF6D704ED23 REGULATION OF THE EUROPEAN PARLIAMENT AND OF THE COUNCIL.exe clean Vulnerable legitimate Adobe Stock Photos executable. Win32/Agent_AGen.NJ Downloader. 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. ----- **SHA-1** **Filename** **ESET detection name** **Description** 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.](https://attack.mitre.org/resources/versions/) **Tactic** **ID** **Name** **Description** Resource Development [T1583.001](https://attack.mitre.org/versions/v10/techniques/T1583/001) Acquire Infrastructure: Domains Mustang Panda has registered domains for use as download servers. [T1583.003](https://attack.mitre.org/versions/v10/techniques/T1583/003) Acquire Infrastructure: Virtual Private Server [T1583.004](https://attack.mitre.org/versions/v10/techniques/T1583/004) Acquire Infrastructure: Server [T1587.001](https://attack.mitre.org/versions/v10/techniques/T1587/001) Develop Capabilities: Malware [T1588.006](https://attack.mitre.org/versions/v10/techniques/T1588/006) Obtain Capabilities: Vulnerabilities [T1608.001](https://attack.mitre.org/versions/v10/techniques/T1608/001) Stage Capabilities: Upload Malware Some download servers used by Mustang Panda appear to be on shared hosting. Mustang Panda uses servers that appear to be exclusive to the group. Mustang Panda has developed custom loader and Korplug versions. Multiple DLL hijacking vulnerabilities are used in the deployment process. Malicious payloads are hosted on the download servers. Execution [T1059.003](https://attack.mitre.org/versions/v10/techniques/T1059/003) Command and Scripting Interpreter: Windows Command Shell [T1106](https://attack.mitre.org/versions/v10/techniques/T1106) Native API Mustang Panda uses CreateProcess and ShellExecute for execution. [T1129](https://attack.mitre.org/versions/v10/techniques/T1129) Shared Modules Mustang Panda uses LoadLibrary to load additional DLLs at runtime. The loader and RAT are DLLs. Windows command shell is used to execute commands sent by the C&C server. [T1204.002](https://attack.mitre.org/versions/v10/techniques/T1204/002) User Execution: Malicious File Mustang Panda relies on the user executing the initial downloader. ----- **Tactic** **ID** **Name** **Description** [T1574.002](https://attack.mitre.org/versions/v10/techniques/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](https://attack.mitre.org/versions/v10/techniques/T1547/001) Boot or Logon Autostart Execution: Registry Run Keys / Startup Folder Korplug can persist via registry Run keys. [T1053.005](https://attack.mitre.org/versions/v10/techniques/T1053/005) Scheduled Task/Job: Scheduled Task Korplug can persist by creating a scheduled task that runs on startup. Defense Evasion [T1140](https://attack.mitre.org/versions/v10/techniques/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](https://attack.mitre.org/versions/v10/techniques/T1564/001) Hide Artifacts: Hidden Files and Directories [T1564.003](https://attack.mitre.org/versions/v10/techniques/T1564/003) Hide Artifacts: Hidden Window [T1070](https://attack.mitre.org/versions/v10/techniques/T1070) Indicator Removal on Host [T1070.004](https://attack.mitre.org/versions/v10/techniques/T1070/004) Indicator Removal on Host: File Deletion [T1070.006](https://attack.mitre.org/versions/v10/techniques/T1070/006) Indicator Removal on Host: Timestomp [T1036.004](https://attack.mitre.org/versions/v10/techniques/T1036/004) Masquerading: Masquerade Task or Service [T1036.005](https://attack.mitre.org/versions/v10/techniques/T1036/005) Masquerading: Match Legitimate Name or Location Directories created during the installation process are set as hidden system directories. Korplug can run commands on a hidden desktop. Multiple hidden windows are used during the deployment process. Korplug’s uninstall command deletes registry keys that store data and provide persistence. Korplug can remove itself and all created directories. When writing to a file, Korplug sets the file’s timestamps to their previous values. Scheduled tasks created for persistence use legitimate-looking names. File and directory names match expected values for the legitimate app that is abused by the loader. [T1112](https://attack.mitre.org/versions/v10/techniques/T1112) Modify Registry Korplug can create, modify, and remove registry keys. [T1027](https://attack.mitre.org/versions/v10/techniques/T1027) Obfuscated Files or Information [T1027.005](https://attack.mitre.org/versions/v10/techniques/T1027/005) Obfuscated Files or Information: Indicator Removal from Tools [T1055.001](https://attack.mitre.org/versions/v10/techniques/T1055/001) Process Injection: Dynamic-link Library Injection Some downloaded files are encrypted and stored as hexadecimal strings. Imports are hidden by dynamic resolution of API function names. Some versions of the Korplug loader inject the Korplug DLL into a newly launched process. [T1620](https://attack.mitre.org/versions/v10/techniques/T1620) Reflective Code Loading Korplug parses and loads itself into memory. Discovery [T1083](https://attack.mitre.org/versions/v10/techniques/T1083) File and Directory Discovery Korplug can list files and directories along with their attributes and content. [T1082](https://attack.mitre.org/versions/v10/techniques/T1082) System Information Discovery [T1614](https://attack.mitre.org/versions/v10/techniques/T1614) System Location Discovery [T1016](https://attack.mitre.org/versions/v10/techniques/T1016) System Network Configuration Discovery [T1016.001](https://attack.mitre.org/versions/v10/techniques/T1016/001) System Network Configuration Discovery: Internet Connection Discovery [T1033](https://attack.mitre.org/versions/v10/techniques/T1033) System Owner/User Discovery Korplug collects extensive information about the system including uptime, Windows version, CPU clock rate, amount of RAM and display resolution. Korplug retrieves the system locale using GetSystemDefaultLCID. Korplug collects the system hostname and IP addresses. The downloader pings Google’s DNS server to check internet connectivity. Korplug obtains the current user’s username. ----- **Tactic** **ID** **Name** **Description** [T1124](https://attack.mitre.org/versions/v10/techniques/T1124) System Time Discovery Korplug uses GetSystemTime to retrieve the current system time. Collection [T1005](https://attack.mitre.org/versions/v10/techniques/T1005) Data from Local System Korplug collects extensive data about the system it’s running on. [T1025](https://attack.mitre.org/versions/v10/techniques/T1025) Data from Removable Media [T1039](https://attack.mitre.org/versions/v10/techniques/T1039) Data from Network Shared Drive Korplug can collect metadata and content from all mapped drives. Korplug can collect metadata and content from all mapped drives. Command and Control [T1071.001](https://attack.mitre.org/versions/v10/techniques/T1071/001) Application Layer Protocol: Web Protocols Korplug can make the initial handshake over HTTPS. [T1095](https://attack.mitre.org/versions/v10/techniques/T1095/) Non-Application Layer Protocol [T1573.001](https://attack.mitre.org/versions/v10/techniques/T1573/001) Encrypted Channel: Symmetric Cryptography C&C communication is done over a custom TCPbased protocol. C&C communication is encrypted using RC4. [T1008](https://attack.mitre.org/versions/v10/techniques/T1008) Fallback Channels The Korplug configuration contains fallback C&C servers. [T1105](https://attack.mitre.org/versions/v10/techniques/T1105) Ingress Tool Transfer Korplug can download additional files from the C&C server. [T1571](https://attack.mitre.org/versions/v10/techniques/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](https://attack.mitre.org/versions/v10/techniques/T1132/001) Data Encoding: Standard Encoding Korplug compresses transferred data using LZNT1. Exfiltration [T1041](https://attack.mitre.org/versions/v10/techniques/T1041) Exfiltration Over C2 Channel Data exfiltration is done via the same custom protocol used to send and receive commands. 25 Mar 2022 - 04:54PM ### 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 -----