Temps de lecture : 16 min
Le format MSI est depuis longtemps détourné comme stager : il supporte nativement des Custom Actions (DLL, PowerShell, JScript) exécutées à l’installation, souvent dans un contexte de privilèges élevés, et sa structure interne complique l’analyse statique. Surtout, il ne déclenche pas les mêmes réflexes de méfiance qu’un exécutable brut , il installe, il exécute, il disparaît dans les logs comme n’importe quel logiciel.
L’échantillon analysé ici exploite cette surface à deux niveaux : un MSI parent qui pose les bases, et un MSI secondaire qui déploie SectopRAT.
Le fichier MSI : un installeur comme les autres ?
Le fichier MSI analysé (0cfcfac10d0a3fa907498667a7b8057d0e95c5f6fd40d0de07452914178f0e71) se présente comme un installeur Windows classique, construit avec Advanced Installer 17.1.2. Ses métadonnées internes indiquent un auteur nommé « Burning Secrets » et un sujet : « EarlyLifeCrisis ». Ce fichier se fait donc passer pour un installateur de jeu pour adulte. Il ne comporte pas de signature numérique. Sa date de création interne, au 11/12/2009, semble manifestement falsifiée : il s’agit de la valeur par défaut d’Advanced Installer.

Le MSI embarque 78 fichiers, dont plusieurs DLL légitimes signées par Caphyon SRL, l’éditeur d’Advanced Installer.
Un MSI fonctionnel comme couverture
Ce qui rend ce MSI efficace comme stager, c’est qu’il se comporte comme un installeur légitime.
Un fichier MSI, construit avec Advanced Installer, est susceptible d’embarquer des DLL signées valides, avec différentes fonctionnalités comme SoftwareDetector.dll pour l’inventaire des logiciels installés ou encore PowerShellScriptLauncher.dll pour l’exécution de scripts PS1 lors de l’installation. Ces composants ne sont pas systématiquement présents, mais leur apparition dans un MSI n’a rien de surprenant : ils font partie du framework de l’outil et correspondent à des usages courants.
De la même façon, un installeur qui télécharge des composants distants et enchaîne des installations secondaires n’est pas, en soi, un signal d’alerte. C’est un pattern répandu dans la distribution logicielle : récupérer des prérequis, déployer des modules complémentaires… etc.
L’attaquant tire parti de cette banalité. Les comportements malveillants, téléchargement des payloads, déchiffrement, persistance, sont enveloppés dans un packaging qui correspond à ce qu’on peut raisonnablement attendre d’une installation logicielle.
La chaîne d’infection : deux voies, deux objectifs
Le MSI s’appuie sur un script Powershell identifié sur notre plateforme GLIMPS Malware.

Ce script télécharge et met en place deux payloads en parallèle :
MSI parent
├── Voie 1 , Frappe immédiate (fileless)
│ └── Téléchargement d'un assembly .NET chiffré en AES-256-CBC ```new30h.jar```
│ └── Chargement en mémoire → stealer de credentials navigateur
│
└── Voie 2 , Implant persistant
└── Téléchargement d'un MSI secondaire ```MicrosoftEdgeUpdateTaskMachineCoreC.msi```
└── Tâche planifiée → rundll32 → XOR decrypt → SectopRAT

Voie n°1 : Le stealer fileless
Le premier payload arrive déguisé en fichier .jar. Il n’a de Java que l’extension : c’est un assembly .NET chiffré en AES-256-CBC, clé et IV hardcodés dans le script PowerShell du MSI.
| Paramètre | Valeur |
| Algorithme | AES-256-CBC |
| Clé | 2B7E151628AED2A6ABF7158809CF4F3C762E7160F38B4DA16C940A258F4A89C7 |
| IV | 000102030405060708090A0B0C0D0E0F |
Une fois déchiffré en mémoire et chargé via [Reflection.Assembly]::Load(), il se révèle :
-
WbElevation.BrowserKeyDecryptor(we4ftg.exe). C’est un stealer .NET asynchrone entièrement fileless, il ne touche jamais le disque sous sa forme lisible.

Ses cibles sont les navigateurs. Chrome, Chromium, Firefox : credentials, cookies, données de paiement. Il embarque SharpInjector, un framework d’injection de processus complet, et utilise rstrtmgr.dll (Windows Restart Manager) pour déverrouiller les bases de données navigateur en cours d’utilisation.
L’exfiltration se fait vers dns-providersa2.com, domaine enregistré le 12 mars 2026, soit, cinq jours avant l’analyse. Hébergé derrière Njalla reposant sur un enregistrement orienté anonymat avec un WHOIS masqué; les pays déclarés étants Saint Kitts et Nevis. Le domaine imite un fournisseur DNS légitime. L’URI de callback https://dns-providersa2[.]com/check redirige vers un domaine dom.top1vpn[.]ru dont le certificat généré via Let’s Encrypt semble renouvelé souvent.

Ce payload est conçu pour une frappe rapide et silencieuse : il s’exécute, collecte, exfiltre, disparaît. On peut imaginer que c’est un fichier de premier effet, au cas ou l’autre charge ne peut être implantée.
Voie n°2 : L’implant persistant
La deuxième voie installe un MSI secondaire téléchargé depuis main45.b-cdn.net, présenté sous le nom MicrosoftEdgeUpdateTaskMachineCoreC.msi qui imite un mécanisme de mise à jour de Microsoft Edge. Les métadonnées internes « MpAsDesc » faisant référence à Microsoft Malware Protection. Au passage, lui aussi a comme « last_saved_date » le 11/12/2009 ce qui i
ndique aussi la valeur par défaut du packager MSI. Ce qui est incohérent avec la date de la mise à jour de ses streams…

Ce MSI dépose deux fichiers dans C:\ProgramData\Microsoft\NetFramework\ :
-
olecli32ba_Win.dll, loader .NET de 10 Ko, compilé le 26 février 2026, se présentant comme « igfxCUIServiceN » (imitation Intel Graphics CUI Service). Une petite erreur de SECOPS qui pointe l’environnement de build :C:\Users\Ardor\AppData\Local\Temp\DllExporter\olecli32.pdb. -
cmiaisupportSYS.dll, conteneur chiffré de 1,6 Mo, déguisé en DLL PE32. Timestamp COFF falsifié à ~1982. DllMain zeroed. Imports et exports chiffrés. Le fichier est inutilisable par le loader Windows standard , il n’est pas conçu pour être chargé viaLoadLibrary. Sa section.debug2est artificiellement gonflée (technique de zip bomb) pour entraver l’analyse par certains outils statiques mais cette heuristique est identifiée par notre plateforme d’analyse.
La persistance est assurée par un script PowerShell embarqué dans les tables MSI (!_StringData). Plutôt que de réutiliser le nom « Edge », le malware crée une tâche planifiée qui imite le processus OneDrive légitime, avec un SID Windows valide hardcodé et un suffixe numérique aléatoire pour contourner les détections par nom fixe :

La tâche se déclenche à chaque ouverture de session (AtLogOn). Un délai aléatoire de 2 à 3 secondes précède l’exécution immédiate post-installation.
XorExtract : le loader reconstitué
La classe principale du loader s’appelle XorExtract. Son algorithme a été entièrement reconstitué par décompilation manuelle du bytecode IL .NET.
Le loader lit cmiaisupportSYS.dll comme données brutes

puis il effectue les opérations suivantes :
1. Lit un entier 32-bit à l’offset 0x5FE → longueur du payload (913 408 bytes)

2. Extrait le blob chiffré à partir de l’offset 0x602

3. Vérifie le marqueur 0xDEADC0DE après le blob

4. Applique un XOR cyclique avec la clé {0, 1, 2, ..., 31}

La vérification confirme le résultat : les premiers octets déchiffrés donnent 4D 5A 90 00..., l’en-tête MZ d’un exécutable Windows. L’assembly résultant est chargé en mémoire via Assembly.Load(). Aucun fichier déchiffré n’est écrit sur le disque.

Avant d’exécuter ce déchiffrement, le loader s’impose une routine anti-sandbox (DelayExecutor) : calcul de 100 000 racines carrées pour saturer le CPU, suivi d’un sleep aléatoire de 1 à 3 secondes. Ces deux mécanismes combinés visent à dépasser les timeouts des environnements d’analyse automatisée.

SectopRAT / ArechClient2 : le payload principal
Le payload déchiffré (fdhfghfghfgh.exe, sha256 2c1630f00a7903d2895e648571a5e302475ef1ca56daa862050ae298c06d0309) est détecté en statique comme SectopRAT, alias ArechClient2, un RAT/infostealer .NET.

Dans GLIMPS Malware Expert, le Deep Engine nous précise les éléments ayant participé à sa décision de classer ce fichier comme malveillant :

Afin d’essayer de qualifier cette menace, nous décidons d’effectuer le reverse de ce fichier .NET.
Point d’entrée , boucle principale (wh.a())

Capacités stealer
La configuration est pilotée par StealerSettingConfigParce (DataContract JSON, reçu du C2. On notera l’appellation « Parce » et non « Parse », caractéristique d’un SectopRat) :
| Module | Flag Config | Données ciblées |
| Navigateurs | (actif par défaut) | Logins, mots de passe, autofill, cookies, cartes bancaires (Chrome, Edge, Firefox, tous profils) |
OsCrypt |
(actif par défaut) | Clé DPAPI de Chrome (encrypted_key) pour déchiffrer les credentials |
| Discord | discord: true |
Tokens d’authentification |
| Steam | steam: true |
Fichiers de session |
| Telegram | telegram: true |
Données de session |
| FTP | ftp: true |
Credentials clients FTP |
| VPN | vpn: true |
Credentials clients VPN |
| Fichiers | files: true |
Fichiers par extension (liste grabber) |
| Fingerprint | (actif par défaut) | HW, OS, langue, pays, ville, IP publique, timezone, résolution, screenshot |
Structure du résultat (ScanResult) envoyé au C2 :

Capacités RAT
| Capacité | Indicateurs techniques |
|---|---|
| Session TCP persistante | Socket, TcpClient, IPEndPoint, BeginSend, EndSend, SocketAsyncEventArgs |
| Capture d’écran temps réel | BitmapData, Screen, Rectangle, Graphics |
| Keylogging | keybd_event (Win32 API) |
| Clipboard monitoring/hijacking | OpenClipboard, CloseClipboard, SetClip, GetClipboard |
| Exécution de processus | ProcessStartInfo, Process.Start() |
| Téléchargement de payload | DownloadData (WebClient) |
| Upload de données | HttpClient, MultipartFormDataContent, SendAsync |
| Compression | GZipStream, ZipFile |
| Sérialisation | DataContractSerializer, JavaScriptSerializer |
| Reconnaissance réseau | IPGlobalProperties, GetIPGlobalProperties |
Toutes les chaînes sont déchiffrées à l’exécution par
Module.c()(ConfuserEx). L’ensemble des IoCs réseau a néanmoins été extrait par déchiffrement statique , voir section dédiée.
Extraction des adresses C2 , Déchiffrement statique ConfuserEx
Les adresses C2 ont été extraites par déchiffrement statique de la fonction <Module>.c(int, int, int) (ConfuserEx string encryption).
Méthode
-
Décompilation de
<Module>.c(overload index 1, token0x060001F5) via REpythonNET -
Reconstruction de l’algorithme : XOR sur ressource embarquée (
resource, 282 KB), avec offset et longueur calculés depuis les 3 arguments entiers -
Extraction des triplets (A_0, A_1, A_2) par décompilation des 343 callers identifiés
-
Déchiffrement Python de tous les triplets résolus
Algorithme reconstitué
Voici un algorithme permettant de déchiffrer les éléments chiffrés dans ce SectopRat

Ce que cette analyse nous révèle est que cette instance présente deux caractéristiques qui méritent d’être soulignées:
-
hidden desktop. le sample ouvre un bureau virtuel invisible (
CreateDesktop+SetThreadDesktop) pour interagir avec les navigateurs sans visibilité pour l’utilisateur. C’est la technique signature de cette famille SectopRAT: manipuler des sessions navigateur actives en direct, sans déclencher d’alerte visuelle. -
architecture C2 en trois canaux. Cette instance implémente des mécanismes de résilience de C2 progressifs : un canal primaire TCP et deux mécanismes de repli activés en mode dégradé.
| Canal | Mécanisme | Configuration |
|---|---|---|
| 1 , Primaire | TCP direct → 179.61.145.140:9000 |
xk.b (IP) + xk.c (port) |
| 2 , Repli BSC | Dead-drop resolver via Binance Smart Chain : round-robin sur 12 nœuds RPC publics, eth_call() sur le contrat 0x67b4af41467a51e0816752a6b223c7c55ae71957 → nouvelle IP C2 |
xk.k (adresse contrat, AES-CBC déchiffré avec xk.i) |
| 3 , Repli DNS | Résolution DNS de be142f61-9b8a-42e3-9639-9e4a3798d67b.com, activée après 50 échecs cumulés TCP + BSC |
xk.j (hostname AES-CBC déchiffré avec xk.i) |
La clé AES-256 maître xk.i déchiffre les configurations des canaux de repli ; la clé de session xk.g chiffre le trafic TCP. L’opérateur met à jour l’IP C2 dans le storage du contrat BSC , infrastructure décentralisée et non saisissable tant que la blockchain existe.
L’IP du canal primaire a été extraite par déchiffrement statique ConfuserEx (fonction <Module>.c(int, int, int), XOR sur ressource embarquée de 282 Ko). Elle est référencée dans nos bases de CTI comme rat, sectop. L’identifiant de campagne extrait est carina_v2_v2.
L’hypothèse la plus probable étant que cette chaine fait partie d’une infrastructure SectopRAT dont la campagne est carina_v2_v2.
Les features de vol de données identifiées sont les suivantes :
-
Credentials, cookies, cartes bancaires , tous navigateurs Chrome et Gecko
-
24 extensions de crypto wallets : MetaMask, Coinbase, Binance Chain Wallet, Phantom, Ronin, Atomic Wallet, TronLink, et 17 autres (vol de seeds et clés privées depuis les extensions de navigateur)
-
Steam, Telegram, Discord, FileZilla (FTP), NordVPN, OpenVPN, ProtonVPN
-
Keylogging, capture d’écran, clipboard monitoring , incluant la substitution silencieuse d’adresses crypto dans le presse-papiers
-
Fingerprinting complet de la machine : IP publique, géolocalisation, matériel, logiciels, processus
La configuration est modulaire : chaque module de vol est activable ou désactivable par le C2 via la classe ScanningArgs. SectopRAT n’est donc pas un outil générique et automatique, c’est un implant opéré activement.
Conclusion de l’analyse
Ce MSI est une chaîne à plusieurs étages où chaque maillon apporte un niveau de sophistication propre.
La stratégie d’ensemble est cohérente avec la montée en puisse inéluctable des outils permettant de générer des fichiers et infrastructures malveillantes. Dans notre exemple deux payloads aux objectifs complémentaires sont déployés en parallèle, chacun indépendant de l’autre. Si l’artefact final ne peut s’implanter, le stealer fileless aura déjà collecté et exfiltré. Les deux peuvent coexister sans interférence. L’analyse approfondie de cette menace nous permet de la qualifier comme appartenant à une campagne carina_v2_v2 de SectopRAT.
Observables et indicateurs de compromission
Indicateurs de compromission
| Type | Valeur | Contexte |
|---|---|---|
| sha256 | 0cfcfac10d0a3fa907498667a7b8057d |
MSI stager principal |
| sha256 | f69b998c75ca3c8a84cdd4191efaedfb0 |
MSI secondaire (faux Edge Update) |
| sha256 | 05014843844ee265afee90e5b5489e9fa |
Loader .NET XorExtract (olecli32ca_Win.dll) |
| sha256 | 51706f55c0da0a99606124f2c25 |
Authentihash loader olecli32ca_Win.dll |
| sha256 | 614788471ee5474b7bbc09c5bb4e2 |
cmiaisupportSYS.dll ,conteneur chiffré (original) |
| sha256 | 3ac00474450d3c7c7252864666165 |
cmiaisupportSYS.dll ,après suppression zip bomb |
| sha256 | ac7a644b79b6e1d1cf33ff39be243e |
Assembly .NET chiffré (new30h.jar) |
| sha256 | 5062d43c6c8486b263de5a9c6da60 |
Stealer WbElevation.BrowserKeyDecryptor (we4ftg.exe) |
| sha256 | 6e0146fae6444b3382ba3b12627d0a |
PE auto-extrait CAPE , stealer (we4ftg.exe) |
| sha256 | 2c1630f00a7903d2895e648571a |
SectopRAT / ArechClient2 (fdhfghfghfgh.exe) |
| sha256 | 5ead45bc83c4fee8955212a5d8fc |
PE auto-extrait CAPE , SectopRAT |
| ip-dst|port | 179.61.145.140:9000 |
C2 SectopRAT TCP , confirmé MISP event 104436 + OpenCTI (confiance 100 %) |
| domain | dns-providersa2.com |
C2 stealer fileless (Njalla, créé 2026-03-12) |
| url | https://dns-providersa2.com/check |
URI de callback C2 stealer |
| domain | main45.b-cdn.net |
Serveur de staging (BunnyCDN) |
| url | https://main45.b-cdn.net/new26/MicrosoftEdge |
URL de téléchargement MSI secondaire |
| url | https://main45.b-cdn.net/new26/new30h.jar |
URL de téléchargement stealer chiffré |
| domain | be142f61-9b8a-42e3-9639-9e4a3798d67b.com |
Domaine fallback DNS SectopRAT (canal 3) |
| blockchain-address | 0x67b4af41467a51e0816752a6b223c7c55ae71957 |
Contrat BSC dead-drop, stocke l’IP C2 courante (canal 2) |
| campaign-id | carina_v2_v2 |
Identifiant de campagne SectopRAT |
| filepath | C:\ProgramData\Microsoft\Net |
Loader SectopRAT (emplacement non standard) |
| filepath | C:\ProgramData\Microsoft\Net |
Payload SectopRAT chiffré |
| filepath | \Microsoft\crds.rtt |
Fichier de persistance secondaire SectopRAT |
| scheduled-task | OneDrive Standalone Update Task |
Persistance SectopRAT au logon (SID hardcodé, suffixe aléatoire) |
| pdb | C:\Users\Ardor\AppData\Local\Temp |
Artefact de compilation , username développeur « Ardor » |
Observables
Artefacts observés mais non spécifiques à cette menace, à contextualiser avec d’autres signaux.
| Type | Valeur | Contexte |
|---|---|---|
| regkey | Software\Microsoft\Windows\CurrentVersion\Run |
Persistance au démarrage (mécanisme générique) |
| regkey | SOFTWARE\Policies\Microsoft\Windows Defender\Exclusions\Processes |
Exclusion Defender (mécanisme générique) |
| regkey | SOFTWARE\Policies\Microsoft\Windows Defender\Spynet |
Désactivation SpyNet (mécanisme générique) |
Cartographie MITRE ATT&CK
| ID | Technique | Implémentation |
|---|---|---|
| T1566 | Phishing , Spearphishing Attachment | MSI déguisé en mise à jour Edge |
| T1036 | Masquerading | Noms imitant Edge, OneDrive, Intel, OLE |
| T1547.005 | Scheduled Task/Job | Tâche AtLogOn via PowerShell |
| T1059.001 | PowerShell | Script embarqué dans !_StringData MSI |
| T1218.011 | Rundll32 | Loader exécuté via rundll32.exe ... ApiNet |
| T1027 | Obfuscated Files or Information | Payload XOR-chiffré, strings runtime, noms obfusqués |
| T1620 | Reflective Code Loading | Assembly.Load(bytes) , stage 3 fileless |
| T1497 | Virtualization/Sandbox Evasion | CPU burn + délais aléatoires |
| T1555.003 | Credentials from Web Browsers | Logins, cookies, CB via SQLite Chrome/Firefox |
| T1528 | Steal Application Access Token | Tokens Discord |
| T1056.001 | Keylogging | keybd_event |
| T1113 | Screen Capture | Screenshot via GDI+ |
| T1115 | Clipboard Data | Monitoring/hijacking presse-papier |
| T1539 | Steal Web Session Cookie | Cookies navigateurs |
| T1041 | Exfiltration Over C2 Channel | HTTP multipart + socket TCP |
| T1132 | Data Encoding | Compression GZip avant exfiltration |
| T1568 | Dynamic Resolution | Dead-drop BSC : IP C2 lue depuis le smart contract 0x67b4af41... via eth_call() |
| T1102 | Web Service | 12 nœuds RPC BSC publics (binance.org, defibit.io, ninicoin.io) comme canal de résolution C2 |
Annexes
Nœuds RPC BSC utilisés comme dead-drop resolvers
Le payload effectue un round-robin sur les 12 nœuds suivants pour interroger le contrat 0x67b4af41467a51e0816752a6b223c7c55ae71957 via eth_call() :
| # | URL |
|---|---|
| 1 | https://bsc-dataseed1.binance.org/ |
| 2 | https://bsc-dataseed2.binance.org/ |
| 3 | https://bsc-dataseed3.binance.org/ |
| 4 | https://bsc-dataseed4.binance.org/ |
| 5 | https://bsc-dataseed1.defibit.io/ |
| 6 | https://bsc-dataseed2.defibit.io/ |
| 7 | https://bsc-dataseed3.defibit.io/ |
| 8 | https://bsc-dataseed4.defibit.io/ |
| 9 | https://bsc-dataseed1.ninicoin.io/ |
| 10 | https://bsc-dataseed2.ninicoin.io/ |
| 11 | https://bsc-dataseed3.ninicoin.io/ |
| 12 | https://bsc-dataseed4.ninicoin.io/ |
Extensions de navigateur ciblées, portefeuilles crypto
24 extensions Chrome/Edge/Firefox ciblées pour l’extraction de seeds phrases et clés privées :
| Extension | ID Chrome |
|---|---|
| MetaMask | nkbihfbeogaeaoehlefnkodbefgpgknn |
| Coinbase Wallet | hnfanknocfeofbddgcijnmhnfnkdnaad |
| Binance Chain Wallet | fhbohimaelbohpjbbldcngcnapndodjp |
| Brave Wallet | odbfpeeihdkbihmopkbjmoonfanlbfcl |
| TronLink | ibnejdfjmmkpcnlpebklmnkoeoihofec |
| Yoroi | ffnbelfdoeiohenkjibnmadjiehjhajb |
| Atomic Wallet | fhilaheimglignddkjgofkcbgekhenbh |
| Guarda Wallet | hpglfhgfnhbgpjdenjgmdgoeiappafln |
| Math Wallet | afbcbjpbpfadlkmhmclhkeeodmamcflc |
| Nifty Wallet | jbdaocneiiinmjbjlgalhcelgbejmnid |
| Equal Wallet | blnieiiffboillknjnepogjhkgnoapac |
| Jaxx Liberty | cjelfplplebdjjenllpjcblmjkfcffne |
| BitApp Wallet | fihkakfobkmkjojpchpfgcmhfjnmnfpi |
| iWallet | kncchdigobghenbbaddojjnnaogfppfj |
| Wombat | amkmjjmmflddogmhpjloimipbofnfjih |
| MEW CX | nlbmnnijcnlegkjjpcfjclmcfggfefdm |
| Guild Wallet | nanjmdknhkinifnkgdcggcfnhdaammmj |
| Saturn Wallet | nkddgncdjgjfcddamfgcmfnlhccnimig |
| Ronin Wallet | fnjhmkhhmkbjkkabndcnnogagogbneec |
| Terra Station | ailfbnbfobpmeekipheeijimdpnlpgpp |
| Harmony Wallet | fnnegphlobjdpkhecapkijjdkgcjhkib |
| Coin98 Wallet | aeachknmefphepccionboohckonoeemg |
| TON Crystal | cgeeodpfagjceefiefladfphplkenlfk |
| KardiaChain Wallet | pdadjkfkgcafgbceimcpbkalnfnepbnk |
Auteurs : Sylvio Hoarau et Caroline Fernandez
Ces articles pourraient vous intéresser :