Introduction
Elastic Security Labs a identifié une campagne récente distribuant une variante modifiée du RAT gh0st, attribuée à l'APT Dragon Breath (APT-Q-27), par le biais d'installateurs NSIS trojanisés se faisant passer pour des logiciels légitimes tels que Google Chrome et Microsoft Teams. La chaîne d'infection utilise un mécanisme de diffusion en plusieurs étapes qui exploite diverses techniques d'évasion, avec de nombreuses redondances visant à neutraliser les produits de sécurité des points d'extrémité populaires sur le marché chinois. Il s'agit notamment d'apporter un pilote signé légitimement, de déployer des politiques WDAC personnalisées et d'altérer le binaire Microsoft Defender par le biais d'une utilisation abusive de PPL.
Cette campagne cible principalement les utilisateurs de langue chinoise et démontre une nette évolution de la capacité d'adaptation par rapport aux précédentes campagnes liées à DragonBreath documentées en 2022-2023. Grâce à ce rapport, nous espérons attirer l'attention sur les nouvelles techniques que ces logiciels malveillants commencent à mettre en œuvre et mettre en lumière un chargeur unique que nous avons baptisé RoningLoader.
Principaux points abordés dans cet article
- Le logiciel malveillant utilise abusivement Protected Process Light (PPL) pour désactiver Windows Defender.
- Les acteurs de la menace s'appuient sur un pilote de noyau valide et signé pour tuer des processus.
- Politique WDAC non signée appliquée pour bloquer les exécutables de 360 Total Security et Huorong
- DLL fantômes et injection de charges utiles via des pools de threads pour interrompre le processus antivirus.
- La charge utile finale comporte des mises à jour mineures et est associée à DragonBreath.
Découverte
En août 2025, des recherches ont été publiées détaillant une méthode permettant d'abuser de Protected Process Light (PPL) pour désactiver les outils de sécurité des points d'extrémité. À la suite de cette révélation, nous avons élaboré une règle de comportement intitulée " Evasion potentielle via l'exécution de ClipUp" et, après avoir recherché des données télémétriques sur les menaces, nous avons identifié une campagne en cours utilisant cette technique.
Analyse du code RONINGLOADER
Le vecteur d'infection initial est un programme d'installation trojanisé créé à l'aide du système d'installation scriptable Nullsoft (NSIS). NSIS est un outil open-source légitime pour créer des programmes d'installation Windows, mais il est souvent utilisé de manière abusive par des acteurs de la menace pour emballer et diffuser des logiciels malveillants, comme dans le cas de GULOADER. Dans le cadre de cette campagne, nous avons observé que les programmes d'installation malveillants étaient distribués sous différents thèmes, se faisant passer pour des logiciels légitimes tels que Google Chrome, Microsoft Teams ou d'autres applications de confiance, afin d'inciter les utilisateurs à les exécuter.
Lors de l'exécution, le programme d'installation NSIS principal fonctionne comme un compte-gouttes, contenant deux autres programmes d'installation NSIS intégrés. L'un des installateurs imbriqués est bénin et installe le logiciel légitime, tandis que le second est malveillant et responsable du déploiement de la chaîne d'attaque.
La chaîne d'attaque exploite un pilote signé nommé ollama.sys pour mettre fin au processus antivirus. Le nom du signataire du pilote est Kunming Wuqi E-commerce Co., Ltd., avec un certificat valable de février 3, 2025, à février 3, 2026. La consultation de VirusTotal a révélé l'existence de 71 binaires signés supplémentaires. Parmi ceux-ci, nous avons identifié des droppers AgentTesla se faisant passer pour 慕讯公益加速器 (MuXunAccelerator), un logiciel VPN axé sur les jeux et populaire auprès des utilisateurs chinois, avec des échantillons datant d'avril 2025. Il est à noter que les techniques de signature varient d'un échantillon à l'autre. Certains échantillons antérieurs, comme inject.syscontiennent des artefacts HookSignTool y compris la chaîne JemmyLoveJenny, alors que l'échantillon d'octobre 2025 ollama.sys ne présente aucun artefact de ce type et utilise des procédures de signature standard, mais tous deux partagent la même période de validité du certificat.
En comparant l'artefact de la chaîne PDB ollama.sys's D:\VS_Project\加解密\MyDriver1\x64\Release\MyDriver1.pdb avec d'autres échantillons, nous avons découvert des artefacts différents des autres échantillons soumis.
D:\cpp\origin\ConsoleApplication2\x64\Release\ConsoleApplication2.pdbD:\a_work\1\s\artifacts\obj\coreclr\windows.x86.Release\Corehost.Static\singlefilehost.pdbC:\Users\0\Desktop\EAMap\x64\Release\ttt.pdbh:\projects\netfilter3\bin\Release\Win32\nfregdrv.pdb
En raison de la diversité des binaires et du grand nombre de soumissions, nous pensons que le certificat a pu faire l'objet d'une fuite, mais il ne s'agit pour l'instant que de spéculations.
Étape 1
Notre analyse a commencé par le binaire initial, identifié par son hachage SHA256 : da2c58308e860e57df4c46465fd1cfc68d41e8699b4871e9a9be3c434283d50b. Son extraction révèle deux exécutables intégrés : un programme d'installation bénin, letsvpnlatest.exe, et le programme d'installation malveillant Snieoatwtregoable.exe.
Le programme d'installation malveillant, Snieoatwtregoable.exe, crée un nouveau répertoire à l'adresse C:\Program Files\Snieoatwtregoable\. Dans ce dossier, il dépose deux fichiers : une DLL nommée Snieoatwtregoable.dll et un fichier crypté, tp.png.
Le cœur de l'activité malveillante réside dans Snieoatwtregoable.dll, qui exporte une seule fonction : DllRegisterServer. Lorsqu'elle est invoquée, cette fonction lit le contenu du fichier tp.png à partir du disque, puis décrypte ces données à l'aide d'un algorithme simple impliquant une rotation à droite (ROR) et une opération XOR.
Le contenu décrypté est un shellcode qui charge et exécute par réflexion un fichier PE en mémoire. Le logiciel malveillant alloue d'abord une nouvelle région mémoire au sein de son propre processus à l'aide de l'API NtAllocateVirtualMemory, puis crée un nouveau thread pour exécuter le shellcode en appelant NtCreateThreadEx.
Le logiciel malveillant tente de supprimer tous les crochets du domaine utilisateur en chargeant un nouveau site ntdll.dll, puis en utilisant GetProcAddress avec le nom de l'API pour résoudre les adresses.
Le logiciel malveillant tente de se connecter à localhost sur le port 5555 sans véritable objectif, car le résultat n'a pas d'importance ; il s'agit probablement d'un code mort ou d'un reste de code de pré-production.
Stage 2 - tp.png
RONINGLOADER vérifie d'abord s'il dispose de privilèges administratifs à l'aide de l'API GetTokenInformation. Si ce n'est pas le cas, il tente d'élever ses privilèges en utilisant la commande runas pour lancer une nouvelle instance élevée de lui-même avant de mettre fin au processus d'origine.
Il est intéressant de noter que le logiciel malveillant tente de communiquer avec une URL codée en dur http://www.baidu.com/ codée en dur avec le user-agent “Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko”, mais il semble s'agir d'un code mort, probablement dû à une fonctionnalité supprimée ou à un code de remplacement pour les versions futures. Il est conçu pour extraire et enregistrer la date de l'en-tête de la réponse HTTP à partir de l'URL.
Le logiciel malveillant analyse ensuite une liste de processus en cours d'exécution à la recherche de solutions antivirus spécifiques. Il vérifie une liste codée en dur de noms de processus et définit un indicateur booléen correspondant à "True" si l'un d'entre eux est trouvé.
Vous trouverez ci-dessous un tableau des processus et des produits de sécurité associés codés en dur dans le fichier binaire :
| Nom du processus | Produit de sécurité |
|---|---|
MsMpEng.exe | Antivirus Microsoft Defender |
kxemain.exe | Kingsoft Internet Security |
kxetray.exe | Kingsoft Internet Security |
kxecenter.exe | Kingsoft Internet Security |
QQPCTray.exe | Tencent PC Manager |
QQPCRTP.exe | Tencent PC Manager |
QMToolWidget.exe | Tencent PC Manager |
HipsTray.exe | Qihoo 360 Total Security |
HipsDaemon.exe | Qihoo 360 Total Security |
HipsMain.exe | Qihoo 360 Total Security |
360tray.exe | Qihoo 360 Total Security |
Arrêt d'un processus AV via un processus distant injecté
Ensuite, le logiciel malveillant tue ces processus. Il est intéressant de noter que le produit Qihoo 360 Total Security adopte une approche différente des autres.
Tout d'abord, il bloque toute communication réseau en modifiant le pare-feu. Il appelle ensuite une fonction pour injecter un shellcode dans le processus (vssvc.exe) associé au service Volume Shadow Copy (VSS).
Il s'octroie d'abord le jeton SeDebugPrivilege à haute intégrité.
Il démarre ensuite le service VSS (Volume Shadow Copy Service) s'il n'est pas déjà en cours d'exécution et récupère le PID de son processus associé (vssvc.exe).
Ensuite, le logiciel malveillant utilise NtCreateSection pour créer deux sections de mémoire distinctes. Il fait ensuite correspondre les vues de ces sections à l'espace mémoire du processus vssvc.exe. La première section contient un fichier Portable Executable (PE) complet, qui est un pilote portant le nom de périphérique \\.\Ollama. La deuxième section contient un shellcode destiné à être exécuté.
RONINGLOADER adopte une approche différente de l'injection de processus par rapport à d'autres méthodes d'injection utilisées ailleurs dans les logiciels malveillants. Cette technique exploite le pool de threads pour exécuter du code à distance via un déclencheur d'écriture de fichier dans le processus distant. Cette technique a été documentée par SafeBreach sur 2023 avec différentes variantes.
Une fois exécuté, le shellcode commence par résoudre dynamiquement les adresses des API Windows dont il a besoin pour fonctionner. Il s'agit de la seule partie de RONINGLOADER qui utilise l'obscurcissement, en utilisant l'algorithme de hachage Fowler-Noll-Vo (FNV) pour rechercher les fonctions par hachage plutôt que par nom.
Il récupère d'abord les adresses de CreateFileW, WriteFile, et CloseHandle pour écrire le pilote sur le disque à un chemin codé en dur, C:\windows\system32\drivers\1912763.temp.
Il effectue ensuite les opérations suivantes :
- Créez un service nommé
xererre1pour charger le pilote déposé sur le disque. - Pour chacun des processus suivants (
360Safe.exe,360Tray.exe, etZhuDongFangYu.exe), qui sont tous associés au logiciel Qihoo 360 , il appelle les fonctions 2 : une pour trouver le PID du processus par nom, suivie d'une fonction pour tuer le processus par PID - Il arrête ensuite le service et le supprime
xererre1
Pour tuer un processus, le logiciel malveillant utilise le pilote. Une analyse du pilote révèle qu'il n'enregistre que la fonctionnalité 1 : il gère un ID IOCTL (0x222000) qui prend un PID comme paramètre et tue le processus en l'ouvrant d'abord avec ZwOpenProcess, puis en le terminant avec ZwTerminateProcess kernel APIs.
Fin du processus AV
Pour revenir au flux d'exécution principal, le logiciel malveillant entre dans une boucle pour confirmer la fin de 360tray.exe, comme le fait le shellcode injecté dans le service VSS. Il ne procède qu'après avoir vérifié que le processus n'est plus en cours d'exécution. Immédiatement après cette confirmation, le système rétablit les paramètres du pare-feu. Il s'agit probablement d'une mesure défensive destinée à couper le canal de communication du logiciel, l'empêchant ainsi de télécharger les derniers journaux d'activité ou les alertes de sécurité vers ses services d'arrière-plan.
Il met ensuite fin aux autres processus de sécurité directement à partir de son processus principal. Notamment, il ne tente pas de dissimuler ces actions, abandonnant la technique de hachage de l'API précédente et appelant directement les fonctions nécessaires.
Le RONINGLOADER suit une procédure cohérente et reproductible pour mettre fin à ses processus cibles :
- Tout d'abord, il écrit le pilote malveillant sur le disque, cette fois-ci dans le chemin temporaire
C:\Users\analysis\AppData\Local\Temp\ollama.sys. - Un service temporaire (
ollama) est créé pour chargerollama.sysdans le noyau. - Le logiciel malveillant récupère ensuite le PID du processus cible par son nom et envoie une requête contenant le PID à son pilote pour qu'il procède à l'arrêt du processus.
- Immédiatement après l'envoi de la commande kill, le service est supprimé.
En ce qui concerne Microsoft Defender, le logiciel malveillant tente de tuer le processus MsMpEng.exe en utilisant la même approche que celle décrite ci-dessus. Nous avons remarqué un bogue dans le code de l'auteur : pour Microsoft Defender, le code ne vérifie pas si Defender est déjà en cours d'exécution, mais recherche directement le processus MsMpEng.exe. Cela signifie que si le processus n'est pas en cours d'exécution, le logiciel malveillant enverra 0 comme PID au pilote.
Le logiciel malveillant contient plus de code redondant pour tuer les processus de la solution de sécurité. Il injecte également un autre shellcode dans svchost.exe, similaire à celui qui a été injecté dans vssvc.exe, mais la liste des processus est différente, comme le montre la capture d'écran ci-dessous.
La technique d'injection utilise également des pools de threads, mais le code injecté est déclenché par un événement.
Après l'arrêt du processus, le logiciel malveillant crée des dossiers 4
C:\ProgramData\lnkC:\ProgramData\<current_date>C:\Users\Public\Downloads\<current_date>C:\ProgramData\Roning
Archives intégrées
Le logiciel malveillant écrit ensuite trois fichiers .txt sur C:\Users\Public\Downloads\<current_date>. Malgré leur extension, il ne s'agit pas de fichiers texte, mais plutôt de conteneurs construits avec un format spécifique, probablement adapté d'une autre base de code.
La structure de ce fichier personnalisé est organisée comme suit :
- Octets magiques : Le fichier commence par la signature
4B 44 01 00à des fins d'identification. - Nombre de fichiers : Il est immédiatement suivi d'une valeur indiquant le nombre de fichiers encapsulés dans le conteneur.
- Métadonnées du fichier : Une section d'en-tête décrit ensuite les informations relatives à chaque fichier stocké.
- Données compressées : Enfin, chaque fichier intégré est stocké dans un bloc de données compressées ZLIB.
Voici un exemple de format de fichier pour le site hjk.txt archive, qui contient les fichiers 2 : 1.bat et fhq.bat.
Ce format d'archivage s'applique à 2 d'autres fichiers intégrés dans l'étape en cours :
agg.txtqui contient les fichiers 3 -Enpug.bin,goldendays.dll, ettrustinstaller.binkill.txtqui contient le fichier 1 -1.dll
Scripts par lots pour contourner l'UAC et le réseau AV
1.bat est un simple script batch qui désactive le contrôle de compte d'utilisateur (UAC) en définissant la valeur de registre EnableLUA à 0.
fhq.bat est un autre script batch qui cible le programme défini dans C:\ProgramData\lnk\123.txt et le logiciel de sécurité Qihoo 360 (360Safe.exe). en créant des règles de pare-feu qui bloquent les connexions entrantes et sortantes. Il désactive également les notifications du pare-feu pour tous les profils.
Fin du processus AV via Phantom DLL
La DLL déployée, 1.dll, est copiée sur C:\Windows\System32\Wow64\Wow64Log.dll pour être chargée latéralement par tout processus WOW64, car Wow64Log.dll est une DLL fantôme qui n'est pas présente par défaut sur les machines Windows. Sa tâche est redondante et consiste essentiellement à tenter de tuer une liste de processus à l'aide des API Windows standard (TerminateProcess).
ClipUp MS Defender killer
Le logiciel malveillant tente ensuite d'utiliser une technique d'abus de PPL documentée par Zero Salarium en août 2025. Le PoC de l'article cible uniquement Microsoft Defender. Notez que toutes les commandes du système sont exécutées par l'intermédiaire de cmd.exe avec l'API ShellExecuteW
- Il recherche le dossier d'installation de Microsoft Defender sous
C:\ProgramData\Microsoft\Windows Defender\Platform\*, en ciblant uniquement le répertoire dont la date de modification est la plus récente, ce qui indique la version actuellement utilisée - Créez un dossier
C:\ProgramData\rominget un lien de répertoire avecmklinkpour pointer vers le répertoire trouvé avec la commande suivante :cmd.exe /c mklink /D "C:\ProgramData\roming" “C:\ProgramData\Microsoft\Windows Defender\Platform\4.18.25050.5-0” - Il exécute ensuite
C:\Windows\System32\ClipUp.exeavec le paramètre suivant :-ppl C:\ProgramData\roming\MsMpEng.exequi écraseMsMpEng.exeavec des données inutiles, ce qui désactive effectivement le RED, même après un redémarrage.
L'auteur semble avoir copié le code de EDR-Freeze pour démarrer ClipUp.exe.
Politiques du Ci
Le logiciel malveillant cible directement Windows Defender Application Control (WDAC) en écrivant un fichier de stratégie dans le chemin C:\\Windows\\System32\\CodeIntegrity\\CiPolicies\\Active\\{31351756-3F24-4963-8380-4E7602335AAE}.cip.
La politique malveillante fonctionne en mode "liste de refus", permettant à la plupart des applications de fonctionner tout en bloquant explicitement deux fournisseurs d'antivirus chinois populaires :
- Qihoo 360 Total Security en bloquant
360rp.exeet360sd.exe - Huorong Sécurité par blocage
ARPProte.exe - Tous les exécutables signés par Huorong Security (
北京火绒网络科技有限公司) via le certificat TBS hashA229D2722BC6091D73B1D979B81088C977CB028A6F7CBF264BB81D5CC8F099F87D7C296E48BF09D7EBE275F5498661A4
Un élément essentiel est la règle Enabled:Unsigned System Integrity Policy, qui permet de charger la politique sans signature numérique valide.
Truncated...
<Rule>
<Option>Enabled:Inherit Default Policy</Option>
</Rule>
<Rule>
<Option>Enabled:Unsigned System Integrity Policy</Option>
</Rule>
<Rule>
<Option>Enabled:Advanced Boot Options Menu</Option>
</Rule>
<Rule>
<Option>Enabled:Update Policy No Reboot</Option>
</Rule>
</Rules>
<EKUs />
<FileRules>
<Allow ID="ID_ALLOW_A_019A298478CE7BF4902DE08CA2D17630" FileName="*" />
<Allow ID="ID_ALLOW_A_019A298478CE7AB089C369772F34B39B" FileName="*" />
<Deny ID="ID_DENY_A_019A298478CE7DBA9913BFC227DACD14" FileName="360rp.exe" InternalName="360rp.exe" FileDescription="360杀毒 实时监控" ProductName="360杀毒" />
<Deny ID="ID_DENY_A_019A298478CE763C85C9F42EC8669750" FileName="360sd.exe" InternalName="360sd.exe" FileDescription="360杀毒 主程序" ProductName="360杀毒" />
<FileAttrib ID="ID_FILEATTRIB_A_019A298478CE766B9C39FB9CE6805A11" FileName="ARPProte.exe" MinimumFileVersion="6.0.0.0" />
</FileRules>
<Signers>
<Signer ID="ID_SIGNER_A_019A298478CE7608908CAE58FD9C3D8E" Name="">
<CertRoot Type="TBS" Value="A229D2722BC6091D73B1D979B81088C977CB028A6F7CBF264BB81D5CC8F099F87D7C296E48BF09D7EBE275F5498661A4" />
<CertPublisher Value="北京火绒网络科技有限公司" />
<FileAttribRef RuleID="ID_FILEATTRIB_A_019A298478CE766B9C39FB9CE6805A11" />
</Signer>
<Signer ID="ID_SIGNER_A_019A298478CE77F7B523D1581F518639" Name="">
<CertRoot Type="TBS" Value="A229D2722BC6091D73B1D979B81088C977CB028A6F7CBF264BB81D5CC8F099F87D7C296E48BF09D7EBE275F5498661A4" />
<CertPublisher Value="北京火绒网络科技有限公司" />
</Signer>
</Signers>
...Truncated
Stage 3 - goldendays.dll
Dans l'étape précédente, RONINGLOADER crée un nouveau service nommé MicrosoftSoftware2ShadowCop4yProvider pour exécuter l'étape suivante de l'exécution avec la commande suivante : regsvr32.exe /S "C:\ProgramData\Roning\goldendays.dll.
L'objectif principal de ce composant est d'injecter la charge utile suivante dans un processus système légitime et à privilèges élevés afin de camoufler ses activités.
Pour ce faire, RONINGLOADER identifie d'abord un processus cible approprié. Il dispose d'une liste codée en dur de deux noms de services qu'il tente de démarrer de manière séquentielle :
- TrustedInstaller (
TrustedInstaller.exe) - MicrosoftEdgeElevationService (
elevation_service.exe)
Le logiciel malveillant parcourt cette liste en tentant de démarrer chaque service. Une fois qu'un service est démarré avec succès, ou si un service est déjà en cours d'exécution, le logiciel malveillant enregistre son identifiant de processus (PID) pour la phase d'injection.
Ensuite, le logiciel malveillant établit la persistance en créant un fichier batch avec un nom aléatoire dans le répertoire C:\Windows\ (par exemple, C:\Windows\KPeYvogsPm.bat). Le script contenu dans ce fichier exécute une boucle continue avec la logique suivante :
- Il vérifie si le PID capturé du service de confiance (par exemple, PID
4016pourTrustedInstaller.exe) est toujours en cours d'exécution. - Si le service n'est pas en cours d'exécution, le script redémarre le service malveillant créé précédemment (
MicrosoftSoftware2ShadowCop4yProvider) pour s'assurer que les composants du logiciel malveillant restent actifs. - Si le processus de service est en cours d'exécution, le script s'endort pendant 10 secondes avant de procéder à une nouvelle vérification.
Enfin, le logiciel malveillant lit le contenu de C:\ProgramData\Roning\trustinstaller.bin. En utilisant le PID du service de confiance qu'il a acquis précédemment, il injecte cette charge utile dans le processus cible (TrustedInstaller.exe ou elevation_service.exe). La méthode d'injection est simple : elle effectue une allocation virtuelle à distance avec VirtualAllocEx, y écrit avec WriteProcessMemory, puis crée un thread distant pour l'exécuter avec CreateRemoteThread.
Étape 3 - trustinstaller.bin
La troisième étape, contenue dans trustinstaller.bin, est chargée d'injecter la charge utile finale dans un processus légitime. Il commence par énumérer les processus en cours et recherche une cible en comparant les noms de processus à une liste codée en dur de processus potentiels.
Lorsqu'il est trouvé, il injecte le shellcode dans C:\ProgramData\Roning\Enpug.bin, qui est la charge utile finale. Il créera une section avec NtCreateSection, en mappera une vue dans le processus distant avec NtMapViewOfSection et y écrira la charge utile. Il créera ensuite un thread distant avec CreateRemoteThread.
Étape 4 - Charge utile finale
La charge utile finale n'a pas subi de modifications majeures depuis la découverte par Sophosd'une campagne DragonBreath sur 2023 et le rapport de QianXin à la mi-2022. Il s'agit toujours d'une version modifiée du RAT open-source gh0st.
Dans les campagnes les plus récentes, un mutex de valeur Global\DHGGlobalMutex est créé au tout début de l'exécution. En dehors de la boucle principale de communication C2, on observe un code mort qui crée un mutex nommé MyUniqueMutexName et le détruit immédiatement après.
Le domaine et le port C2 restent codés en dur mais sont désormais cryptés par XOR. Le canal C2 fonctionne sur des sockets TCP bruts avec des messages cryptés dans les deux sens.
Données de la balise de la victime
L'implant se connecte au serveur C2 et envoie des balises au C2 à intervalles aléatoires, à l'aide du site Sleep(<random_amount> * 1000). Vous trouverez ci-dessous la structure des données que l'implant renvoie au serveur C2 pendant l'intervalle de balisage :
struct BeaconData {
// +0x000
uint32_t message_type; // Example Beacon ID - 0xC8 (200)
// +0x004
uint32_t local_ip; // inet_addr() of victim's IP
// +0x008
char hostname[50]; // Computer name or registry "Remark"
// +0x03A
char windows_version[?]; // OS version info
// +0x0D8
char cpu_name[64]; // Processor name
// +0x118
uint32_t entry_rdx;
// +0x11C
char time_value[64]; // Implant installed time or registry "Time" value
// +0x15C
char victim_tag[39]; // Command 6 buffer (Custom victim tag)
// +0x183
uint8_t is_wow64; // 1 if 32-bit on 64-bit Windows
// +0x184
char av_processes_found[128]; // Antivirus processes found
// +0x204
char uptime[12]; // System uptime
char padding[52];
// +0x244
char crypto_wallet_track[64]; // "狐狸系列" (MetaMask) or registry "ZU" (crypto related tracking)
// +0x284
uint8_t is_admin; // 1 if running with admin rights
// +0x285
char data[?];
// +0x305
uint8_t telegram_installed; // 1 if Telegram installed
// +0x306
uint8_t telegram_running; // 1 if Telegram.exe running
// +0x307
// (padding to 0x308 bytes)
};
Commandes C2
Les messages de demande envoyés par le serveur C2 à l'implant suivent la même structure :
struct C2_to_implant_msg {
uint32_t total_message_len;
uint32_t RC4_key;
char encrypted_command_id;
uint8_t encrypted_command_args;
};
L'implant décrypte les messages C2 à l'aide de la formule suivante :
RC4_decrypt(ASCII(decimal(RC4_key)), encrypted_command_id || command)
Vous trouverez ci-dessous une liste des commandes disponibles qui, pour la plupart, restent les mêmes qu'à l'adresse 2 il y a quelques années :
| ID de la commande | Description |
|---|---|
0 | ExitWindowsEx par l'intermédiaire d'un EXIT_WINDOWS_FLAGS |
1 | Mettre fin à l'implant de manière gracieuse |
2 | Attribuez la valeur False à la clé de registre Enable pour désactiver l'implant & de manière persistante. |
3 | Définissez la clé de registre Remark pour le renommage personnalisé de la victime (valeur par défaut : nom d'hôte). |
4 | Définissez la clé de registre ZU pour le marquage MetaMask / cryptographique |
5 | Effacer les journaux d'événements Windows (Application, Sécurité, Système) |
6 | Définir des balises personnalisées supplémentaires pour les balises client |
7 | Téléchargez et exécutez le fichier via l'URL fournie |
9 | ShellExecute (fenêtre visible) |
10 | ShellExecute (fenêtre cachée) |
112 | Obtenir les données du presse-papiers |
113 | Définir les données du presse-papiers |
125 | ShellExecute cmd.exe avec les paramètres de la commande (fenêtre cachée) |
126 | Exécutez la charge utile en la déposant sur le disque ou chargez et exécutez l'exportation PluginMe par réflexion. |
128 | Première option - ouvrir une nouvelle session avec un domaine C2, un port et un intervalle de balise fournis. Deuxième option - définissez la clé de registre CopyC pour mettre à jour le domaine et le port C2 de manière permanente. Stocké de manière cryptée via Base64Encode(XOR(C2_domain_and_port, 0x5)). |
241 | Vérifiez si Telegram est installé et/ou fonctionne |
243 | Configurer Clipboard Hijacker |
101, 127, 236, [...] | Injection d'un shellcode personnalisé dans svchost.exe à l'aide d'une usurpation d'identité par jeton de session WTS, retombant sur l'injection du processus CREATE_SUSPENDED par l'intermédiaire de CreateRemoteThread |
Note à l'attention des analystes : il existe plusieurs identifiants de commande qui renvoient à la même commande. Nous avons utilisé une ellipse pour identifier les cas où cela a été observé.
Enregistreur de système
Outre les commandes C2, l'implant met en œuvre un enregistreur de frappe, de presse-papiers et de fenêtres actives. Les données capturées sont écrites sur %ProgramData%\microsoft.dotnet.common.log et peuvent être activées ou désactivées via une clé de registre à HKEY_CURRENT_USER\offlinekey\open (1 pour activer, 0 pour désactiver). Le fichier journal met en œuvre une rotation automatique, se supprimant lui-même lorsqu'il dépasse 50 Mo pour éviter d'être détecté par une utilisation excessive du disque.
L'extrait de code ci-dessous montre la routine d'initialisation qui met en œuvre la rotation du journal et configure une interface DirectInput8 pour acquérir le périphérique de clavier pour la capture d'événements, suivie de la logique de récupération des événements du clavier.
Le logiciel malveillant entre ensuite dans une boucle de surveillance pour capturer trois catégories d'informations.
- Tout d'abord, il surveille le presse-papiers à l'aide de
OpenClipboardetGetClipboardData, en enregistrant toute modification du contenu du texte à l'aide du préfixe[剪切板:]. - Deuxièmement, il suit les changements d'orientation de la fenêtre via
GetForegroundWindow, en enregistrant le titre de la fenêtre active et l'horodatage avec les préfixes[标题:]et[时间:], respectivement, chaque fois que l'utilisateur change d'application. - Troisièmement, il récupère les événements clavier mis en mémoire tampon par le dispositif
DirectInput8(jusqu'à 60 événements par interrogation) et les traduit en texte lisible à l'aide d'une table de correspondance de caractères, en faisant précéder les résultats d'un préfixe[内容:].
Détourneur de presse-papiers
Le logiciel malveillant met également en œuvre un détournement de presse-papiers qui est configuré à distance par le biais de la commande C2 ID 243. Il surveille les modifications du presse-papiers et effectue des opérations de recherche et de remplacement sur le texte capturé, en remplaçant les chaînes définies par l'attaquant par des valeurs de remplacement. Les paramètres de configuration sont stockés dans le registre sous HKEY_CURRENT_USER\offlinekey avec les clés clipboard (activation/désactivation de la fonction), charac (chaîne de recherche), characLen (longueur de la recherche) et newcharac (chaîne de remplacement).
Il enregistre une classe de fenêtre nommée ClipboardListener_Class_Toggle et crée une fenêtre cachée intitulée ClipboardMonitor pour recevoir les notifications de modification du presse-papiers. La procédure de fenêtre traite les messages WM_CLIPBOARDUPDATE (0x31D) en vérifiant les numéros de séquence du presse-papiers avec GetClipboardSequenceNumber pour détecter les changements réels, puis en invoquant la routine de manipulation du noyau, qui échange le contenu du presse-papiers par l'intermédiaire de EmptyClipboard et SetClipboardData.
Logiciels malveillants et MITRE ATT&CK
Elastic utilise le cadre MITRE ATT& CK pour documenter les tactiques, techniques et procédures communes que les menaces persistantes avancées utilisent contre les réseaux d'entreprise.
Tactiques
Les tactiques représentent le pourquoi d'une technique ou d'une sous-technique. Il s'agit de l'objectif tactique de l'adversaire : la raison pour laquelle il effectue une action.
- Exécution
- Persistance
- Escalade des privilèges
- Évasion par la défense
- Accès aux identifiants
- Découverte
- Collecte
- Commande et contrôle
Techniques
Les techniques représentent la manière dont un adversaire atteint un objectif tactique en effectuant une action.
- Interprète de commandes et de scripts : Shell de commande Windows
- Services du système : Exécution des services
- Créer ou modifier un processus système : Service Windows
- Abuser d'un mécanisme de contrôle d'élévation : Contournement du contrôle de compte d'utilisateur
- Access Token Manipulation
- Affaiblir les défenses : Désactiver ou modifier des outils
- Affaiblir les défenses : Désactiver ou modifier le pare-feu du système
- Suppression de l'indicateur : Effacer les journaux d'événements de Windows
- Flux d'exécution du pirate : chargement latéral de DLL
- Injection de processus
- Mascarade : Faire correspondre un nom ou un lieu légitime
- Modify Registry
- Subvertir les contrôles de confiance : Modification de la politique de signature de code
- Capture d'entrée : Enregistrement du clavier
- Données du presse-papiers
- Découverte du processus
- Recherche d'informations sur le système
- System Owner/User Discovery
- Découverte de logiciels : Découverte de logiciels de sécurité
- Non-Application Layer Protocol
- Canal crypté : Cryptographie symétrique
Atténuations
Détection
- Evasion potentielle grâce à l'exécution ClipUp
- Allocation de mémoire à distance suspecte
- Injection potentielle d'un code de processus suspendu
- Écriture dans la mémoire distante d'un processus cible de confiance
- Écriture de la mémoire de processus à distance par le module de faible réputation
- Écriture dans la mémoire d'un processus à un processus non enfant
- Shellcode non sauvegardé provenant d'un module non signé
- Tentative de contournement de l'UAC via le chargement latéral de la DLL de l'enregistreur WOW64
- Network Connect API de Unbacked Memory
- Rundll32 or Regsvr32 Loaded a DLL from Unbacked Memory
- Module réseau chargé à partir d'une mémoire non sauvegardée suspecte
YARA
Elastic Security a créé des règles YARA pour identifier cette activité. Vous trouverez ci-dessous les règles de YARA pour identifier le RONINGLOADER et l'implant final :
Observations
Les observables suivants ont été examinés dans le cadre de cette recherche.
| Observable | Type | Nom | Référence |
|---|---|---|---|
da2c58308e860e57df4c46465fd1cfc68d41e8699b4871e9a9be3c434283d50b | SHA-256 | klklznuah.msi | Installateur NSIS initial |
82794015e2b40cc6e02d3c1d50241465c0cf2c2e4f0a7a2a8f880edaee203724 | SHA-256 | Snieoatwtregoable.exe | Un programme d'installation malveillant est décompressé à partir du programme d'installation initial |
c65170be2bf4f0bd71b9044592c063eaa82f3d43fcbd8a81e30a959bcaad8ae5 | SHA-256 | Snieoatwtregoable.dll | Étape 1 - chargeur pour l'étape 2 |
2515b546125d20013237aeadec5873e6438ada611347035358059a77a32c54f5 | SHA-256 | ollama.sys | Étape 2 - moteur de l'arrêt du processus |
1613a913d0384cbb958e9a8d6b00fffaf77c27d348ebc7886d6c563a6f22f2b7 | SHA-256 | tp.png | Étape 2 - charge utile cryptée |
395f835731d25803a791db984062dd5cfdcade6f95cc5d0f68d359af32f6258d | SHA-256 | 1.bat | Étape 2 - Script de contournement de l'UAC |
1c1528b546aa29be6614707cbe408cb4b46e8ed05bf3fe6b388b9f22a4ee37e2 | SHA-256 | fhq.bat | Étape 2 - script pour bloquer la mise en réseau des processus AV |
4d5beb8efd4ade583c8ff730609f142550e8ed14c251bae1097c35a756ed39e6 | SHA-256 | 1.dll | Étape 2 - Fin des processus AV |
96f401b80d3319f8285fa2bb7f0d66ca9055d349c044b78c27e339bcfb07cdf0 | SHA-256 | {31351756-3F24-4963-8380-4E7602335AAE}.cip | Étape 2 - Politique de la WDAC |
33b494eaaa6d7ed75eec74f8c8c866b6c42f59ca72b8517b3d4752c3313e617c | SHA-256 | goldendays.dll | Étape 3 - point d'entrée |
fc63f5dfc93f2358f4cba18cbdf99578fff5dac4cdd2de193a21f6041a0e01bc | SHA-256 | trustinstaller.bin | Stage 3 - chargeur pour Enpug.bin |
fd4dd9904549c6655465331921a28330ad2b9ff1c99eb993edf2252001f1d107 | SHA-256 | Enpug.bin | Étape 3 - chargement de la charge utile finale |
3dd470e85fe77cd847ca59d1d08ec8ccebe9bd73fd2cf074c29d87ca2fd24e33 | SHA-256 | 6uf9i.exe | Étape 4 - charge utile finale |
qaqkongtiao[.]com | nom de domaine | Étape 4 - charge utile finale C2 |
Références
Les éléments suivants ont été référencés tout au long de la recherche ci-dessus :
- https://nsis.sourceforge.io/Main_Page
- https://learn.microsoft.com/en-us/windows-server/storage/file-server/volume-shadow-copy-service
- https://github.com/Jemmy1228/HookSigntool
- https://www.safebreach.com/blog/process-injection-using-windows-thread-pools/
- https://hijacklibs.net/entries/microsoft/built-in/wow64log.html
- https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function
- https://www.zerosalarium.com/2025/08/countering-edrs-with-backing-of-ppl-protection.html
- https://github.com/TwoSevenOneT/EDR-Freeze/blob/ceffd5ea7b813b356c77d469561dbb5ee45aeb24/PPLHelp.cpp#L43
- https://news.sophos.com/en-us/2023/05/03/doubled-dll-sideloading-dragon-breath/
- https://ti.qianxin.com/blog/articles/operation-dragon-breath-%28apt-q-27%29-dimensionality-reduction-blow-to-the-gambling-industry/
- https://github.com/sin5678/gh0st
