Selon une publication technique signée par Pierre Le Bourhis (Sekoia.io), cette recherche détaille le fonctionnement d’OysterLoader (a.k.a. Broomstick/CleanUp), un loader C++ multi‑étapes distribué via faux sites d’installateurs MSI signés, utilisé dans des campagnes menant au ransomware Rhysida et à la diffusion de l’infostealer Vidar.
— Aperçu et chaîne d’infection (4 étapes)
- Stage 1 – Packer/Obfuscator (TextShell) : API hammering massif (appels GDI/DLL sans but), résolution dynamique d’API par hachage custom, anti‑debug basique (IsDebuggerPresent → boucle infinie), allocation RWX et copie « mélangée » du stage suivant. Structure interne « core » embarquant données compressées, API résolues et config.
- Stage 2 – Shellcode : décompression LZMA custom (en‑tête et bitstream non standards), fixups de relocalisation (patch E8/E9), résolution d’imports via LoadLibraryA/GetProcAddress, changement des protections mémoire puis saut vers le payload reconstruit.
- Stage 3 – Downloader : vérifications d’environnement (compte les processus et quitte si < 60 ; fonction de test langue russe non appelée ; mesures de timing), premier contact C2 via HTTPS avec enregistrement (/reg) et déguisement réseau (entêtes x-amz-cf-id, Content-Encoding, UA « WordPressAgent » puis « FingerPrint »). Récupération du stage suivant via stéganographie dans une icône retournée par /login, décryptée en RC4 avec une clé hardcodée ; dépôt d’une DLL dans %APPDATA% et persistance par tâche planifiée (rundll32 DllRegisterServer, toutes les 13 min).
- Stage 4 – Core (COPYING3.dll) : réemploi de l’obfuscation (shellcode + LZMA custom), C2 HTTP clair (port 80) avec fallback sur 3 IPs, beacons et schéma JSON encodé par Base64 non standard avec décalage aléatoire (Mersenne Twister) et alphabet custom. Évolution récente vers /api/v2/ avec init/facade et rotation d’alphabet fournie par le C2 (champ tk) ; empreinte enrichie (t11/t12 : liste des processus et PIDs).
— Déguisement, évasion et communication C2
- Evasion & obfuscation : API hammering, anti‑debug simple, résolution dynamique par hachage (algorithmes variants), LZMA custom bloquant 7‑Zip/xz/lzma standard, patching de CALL/JMP relatifs.
- Délivrance furtive : faux sites d’outils IT (PuTTY, WinSCP, Google Authenticator, AI), MSI signés, payload caché dans une icône et RC4.
- C2 : headers/UA usurpés (WordPressAgent/FingerPrint/Chrome‑like), JSON encapsulé dans Base64 custom avec décalage aléatoire et alphabet remplaçable (tk), deux niveaux d’infrastructure (serveurs de livraison /reg, /login, puis C2 final avec endpoints évolutifs), WinINet (InternetOpenW/ConnectW/HttpOpenRequestW/HttpSendRequestA).
— Liens et écosystème
- Principalement observé depuis 2024, lié à des opérations Rhysida (rapports Expel) et utilisé pour diffuser Vidar ; également distribué via Gootloader (Huntress). Affiliation exacte (propriétaire vs MaaS privé) non tranchée dans les observations agrégées.
— IOCs (extraits) 🧷
- C2 IPs (port 80) : 85.239.53[.]66, 51.222.96[.]108, 135.125.241[.]45
- C2 domaines (Jan 2026) : grandideapay[.]com, nucleusgate[.]com, cardlowestgroup[.]com, socialcloudguru[.]com, coretether[.]com, registrywave[.]com
- Endpoints (historique) : /reg, /login, /api/connect, /api/session, /api/kcehc, /api/jgfnsfnuefcnegfnehjbfncejfh, /api/v2/init, /api/v2/facade, /api/v2/YgePIY5zPSoGUjzRx7C50MTx6EzABXIPd (et variante)
- Mutex : h6p#dx!&fse?%AS!
- Persistence/Artefacts : %APPDATA%<15 alphanum>\COPYING3.dll ; noms de tâches/DLL variables (COPYING3, VisualUpdater, AlphaSecurity, DetectorSpywareSecurity)
- User‑Agents : WordPressAgent ; FingerPrint ; Mozilla/6.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
- Clé RC4 (hardcodée, constante sur échantillons observés) : vpjNm4FDCr82AtUfhe39EG5JLwuZszKPyTcXWVMHYnRgBkSQqxzBfb6m75HZV3UyRY8vPxDna4WC2KMAgJjQqukrFdELXeGNSws9SBFXnYJ6ExMyu97KCebD5mTwaUj42NPAvHdkGhVtczWgfrZ3sLyRZg4HuX97AnQtK8xvpLU2CWDhVq5PEfjTNz36wdFasecBrkGSDApf83d6NMyaJCsvcRBq9ZYKthjuw5S27EVzWrPHgkmUxFL4bQSgMa4F
- Alphabet Base64 custom (exemple) : yog/N3fj5ISmbep=Wu2k+BZcP0t4CYR1dQxHUaXEwGDKJV7i9ML6snhzrlqO8vAFT
— TTPs (résumé) 🛠️
- Distribution via faux sites d’outils IT et MSI signés (loader/dételechargeur)
- API hammering, anti‑debug (IsDebuggerPresent → boucle infinie), résolution d’API par hachage custom
- LZMA custom (en‑tête/bitstream non standard), relocalisation E8/E9, imports dynamiques
- Stéganographie (payload caché dans image/x-icon), décryptage RC4 (clé hardcodée)
- Persistance par tâche planifiée (rundll32 DllRegisterServer, toutes les 13 min)
- Checks d’environnement (≥ 60 processus, langue russe testée dans une fonction non appelée)
- C2 via HTTPS (delivery) puis HTTP clair (core), entêtes/UA usurpés, Base64 custom à décalage aléatoire et alphabet mis à jour par le C2
Conclusion: il s’agit d’une analyse technique/analyse de menace détaillant l’architecture, les mécanismes d’évasion et l’évolution du protocole C2 d’OysterLoader, avec IOCs et TTPs pour le suivi et la chasse.
🧠 TTPs et IOCs détectés
TTP
Distribution via faux sites d’outils IT et MSI signés (loader/dételechargeur), API hammering, anti-debug (IsDebuggerPresent → boucle infinie), résolution d’API par hachage custom, LZMA custom (en-tête/bitstream non standard), relocalisation E8/E9, imports dynamiques, stéganographie (payload caché dans image/x-icon), décryptage RC4 (clé hardcodée), persistance par tâche planifiée (rundll32 DllRegisterServer, toutes les 13 min), checks d’environnement (≥ 60 processus, langue russe testée dans une fonction non appelée), C2 via HTTPS (delivery) puis HTTP clair (core), entêtes/UA usurpés, Base64 custom à décalage aléatoire et alphabet mis à jour par le C2
IOC
{‘ips’: [‘85.239.53.66’, ‘51.222.96.108’, ‘135.125.241.45’], ‘domains’: [‘grandideapay.com’, ’nucleusgate.com’, ‘cardlowestgroup.com’, ‘socialcloudguru.com’, ‘coretether.com’, ‘registrywave.com’], ’endpoints’: [’/reg’, ‘/login’, ‘/api/connect’, ‘/api/session’, ‘/api/kcehc’, ‘/api/jgfnsfnuefcnegfnehjbfncejfh’, ‘/api/v2/init’, ‘/api/v2/facade’, ‘/api/v2/YgePIY5zPSoGUjzRx7C50MTx6EzABXIPd’], ‘mutex’: ‘h6p#dx!&fse?%AS!’, ‘user_agents’: [‘WordPressAgent’, ‘FingerPrint’, ‘Mozilla/6.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36’], ‘rc4_key’: ‘vpjNm4FDCr82AtUfhe39EG5JLwuZszKPyTcXWVMHYnRgBkSQqxzBfb6m75HZV3UyRY8vPxDna4WC2KMAgJjQqukrFdELXeGNSws9SBFXnYJ6ExMyu97KCebD5mTwaUj42NPAvHdkGhVtczWgfrZ3sLyRZg4HuX97AnQtK8xvpLU2CWDhVq5PEfjTNz36wdFasecBrkGSDApf83d6NMyaJCsvcRBq9ZYKthjuw5S27EVzWrPHgkmUxFL4bQSgMa4F’, ‘custom_base64_alphabet’: ‘yog/N3fj5ISmbep=Wu2k+BZcP0t4CYR1dQxHUaXEwGDKJV7i9ML6snhzrlqO8vAFT’}
🔗 Source originale : https://blog.sekoia.io/oysterloader-unmasked-the-multi-stage-evasion-loader/