SalatStealer : des chargeurs qui publient leurs clés, une configuration C2 identique sur 204 builds et un repli sur la blockchain TON
Catégorie : Infostealer
Analyste : Gordon PEIRS (@ozer0x777)
Famille : SalatStealer (aussi suivi sous le nom WEB_RAT), voleur et outil d'accès distant en Go, avec une réécriture en Rust
Méthode : Analyse purement statique (désassemblage, extraction de configuration, YARA) de 16 fichiers téléchargés individuellement, des 75 scripts batch et de 204 builds UPX publiés sur MalwareBazaar sous l'étiquette SalatStealer entre le 2026-10-27 et le 2026-10-30, complétée par de l'OSINT strictement passif (journaux de transparence des certificats, RDAP, DNS public, abuse.ch, historique public de la blockchain TON via tonapi.io, RIPEstat, API publique anonyme de GitHub pour les métadonnées de comptes, AlienVault OTX et rapports publics de CYFIRMA et de Solar 4RAYS). Aucun échantillon n'a été exécuté. Aucune connexion directe n'a été ouverte vers un serveur de l'opérateur, ni vers les comptes GitHub qui hébergeaient les secondes charges.
Résumé
SalatStealer (aussi suivi sous le nom WEB_RAT) est un voleur et outil d'accès distant écrit en Go, compilé pour Windows 32 bits (module salat, Go 1.24.0). Les rapports publics décrivent déjà ses capacités, une partie de sa configuration et les portefeuilles TON de son infrastructure (CYFIRMA en septembre 2025, Solar 4RAYS le 24 septembre 2026). Cette analyse recoupe ces sources de façon indépendante et ajoute ce qui les entoure : comment le voleur arrive (dépôts GitHub jetables, paquets de contournement de blocage piégés, trois formes de conteneurs), comment sa configuration est protégée, et ce que le tout laisse voir de l'opérateur et de ses paiements.
Le vecteur est un paquet de contournement de blocage piégé. Le script batch est un zapret-discord.bat glissé dans une copie d'un bundle public de contournement de blocage Discord et YouTube (le README cite le projet d'origine) : le reste du paquet est légitime, y compris le winws.exe dont le hash est identique à celui qu'un binder .NET du tag utilise comme leurre. Le fichier ajouté n'est pas listé dans le SHA256SUMS.txt du paquet. Les 75 scripts batch du tag décodent tous vers le même PE (fcaf1f46...) ; leur seule différence est un commentaire final de 16 caractères hexadécimaux. Les autres leurres du tag sont dans le même thème : un binder .NET qui embarque winws.exe, un RAT Python déguisé en « SoundCloud Unblock » et un chargeur nommé TgWsProxy.exe (le README du paquet recommande un outil nommé tg-ws-proxy).
Les chargeurs publient leurs propres secrets. Une partie des échantillons n'est pas Salat mais un chargeur Go qui contient la charge chiffrée en ChaCha20-Poly1305 (blob CBOR de 48 à 79 morceaux), puis télécharge une seconde charge sur une release GitHub. La clé de 32 octets et l'URL de la seconde charge sont passées en -ldflags "-X main.pass=... -X main.url=...". L'option -s -w retire les symboles mais pas ces informations de build, de sorte que la clé se lit avec un simple strings. Un extracteur qui essaie toutes les chaînes de 64 caractères hexadécimaux et laisse le tag Poly1305 trancher déchiffre les 6 chargeurs essayés (aucune adresse figée).
La configuration C2 de Salat est la même dans 204 builds sur 204. La protection est un enchaînement de couches (clé AES dérivée de la chaîne biba, clé XOR de 26 octets elle-même chiffrée, adresses stockées comme messages RSA-4096 à exposant public 65537) dont le module et les clés sont dans le binaire : un analyste qui a le fichier récupère tout. Résultat sur les 204 builds : un seul module RSA, un seul jeu de 10 entrées (quatre domaines HTTPS, un port alternatif, quatre noms .ton et un point d'accès TON), une seule version de Go. Seul l'identifiant de build bld varie : 13 valeurs, dont une porte 192 échantillons. Le même module RSA signe aussi la configuration de 76 builds Go plus anciens du tag salat (du 2026-03-22 au 2026-10-18) : c'est une clé d'opérateur stable depuis au moins sept mois, et l'état de la liste de C2 a changé trois fois sur cette période (§4).
Le repli passe par des enregistrements DNS de la blockchain TON. Lorsque les domaines tombent, Salat lit l'adresse « wallet » d'un nom .ton, qui n'est pas une adresse mais une liste d'hôtes en ASCII (32 octets complétés par des zéros). L'historique public de ces enregistrements donne la rotation de l'infrastructure sur 16 mois : neuf valeurs successives sur le seul nom webratpanel.ton, de 62.109.0.189 (2025-07-01) à policlinika.top avec 196.196.208.18 (2026-10-28). Un domaine .top enregistré le jour même du changement indique une infrastructure encore en mouvement.
Salat existe aussi en Rust, caché dans un « joiner ». TgWsProxy.exe est un stub C++ qui annexe, derrière un en-tête masqué et un AES-256-CBC, une vraie application Python de proxy et un Salat réécrit en Rust (vsekromeds.exe). Les trois formes de livraison du tag (batch piégé, binder .NET, joiner) reprennent le même procédé : un outil de contournement de blocage populaire sert d'appât et la charge cachée est un Salat.
Chaque build UPX porte l'adresse de son dépôt GitHub. Un marqueur de fabrication (GBZAP-PACK-UNIQUE) ajouté en fin de fichier contient un chemin compte/dépôt : 192 builds distincts pointent vers 135 dépôts de 55 comptes jetables, tous nommés d'après des outils de contournement de blocage (Discord, Telegram, YouTube). Ces 55 comptes existent encore : ils ont été créés par vagues automatisées (6 le 2026-08-18, 22 le 2026-08-23 en 12 minutes, 27 le 2026-09-08 en 34 minutes), n'ont aucun abonné, et leurs 191 dépôts portent tous une description russe quasi identique. Les 122 chemins compte/dépôt relevés dans les binaires existent tous publiquement. 155 de ces dépôts portent une release : un paquet « zapret-discord-youtube » en .zip et en .rar, d'empreinte propre à chaque dépôt, téléchargé 41 877 fois au total ; l'examen de quatre archives montre un paquet de contournement fonctionnel dont les scripts lancent la charge Salat cachée dans bin\.wd\ et, en secours, dans stun.bin, en ajoutant des exclusions Defender.
Qui est derrière, d'après les sources publiques. CYFIRMA et Solar 4RAYS attribuent le panneau « WebRat » (le vendeur de Salat) au groupe NyashTeam, que F6 et The Record décrivent comme un vendeur de DCRat et de WebRat par des bots Telegram. Les recoupements de cette analyse vont dans ce sens : l'hôte du panneau cité par CYFIRMA (62.109.0.189) est la première valeur écrite dans le dead drop TON (2025-07-01), et le portefeuille racine que j'ai suivi est le portefeuille de paiement « utilisé jusqu'en mai » décrit par Solar. Aucun canal Telegram, jeton, webhook ni contact n'est embarqué dans les 446 fichiers examinés. Je n'ai obtenu aucun identifiant de canal par ces sources.
Les paiements convergent vers un échange. Deux portefeuilles de paiement parallèles ont reçu des montants dans une bande de prix fixe (environ 15 à 16 USD) de 634 payeurs distincts entre juillet 2025 et juin 2026, ce qui recoupe le prix d'environ 1500 roubles indiqué par Solar. Un troisième portefeuille, décrit par Solar comme destinataire des fonds déplacés le 17 mai, fait transiter des sommes à solde nul et ne verse qu'à quatre portefeuilles que l'explorateur public étiquette « Bybit » (environ 106 000 USDT et 40 000 TON entre octobre 2025 et mai 2026). Je ne sais pas si ce portefeuille sert uniquement à l'opérateur.
Tout est reproductible depuis
runbook.md. Les scripts sont danstools/. Les réponses brutes des API (osint/raw/) pèsent 23 Mo et restent hors paquet.
1. Périmètre et sources
| Source | Usage |
|---|---|
MalwareBazaar, étiquette SalatStealer, API get_taginfo |
500 entrées les plus récentes (le paramètre limit=1000 provoque une erreur 502 côté service), du 2026-10-27 au 2026-10-30 ; le tag complet est plus grand |
MalwareBazaar, get_file |
16 fichiers de natures différentes, 204 builds UPX, vérification SHA-256 de chaque téléchargement |
| crt.sh, RDAP, dns.google | Certificats, enregistrement et résolution des domaines |
| RIPEstat, RDAP des blocs | Réseaux et systèmes autonomes des adresses IP |
| ThreatFox et URLhaus (abuse.ch) | Couverture publique des indicateurs |
| tonapi.io (lecture) | Enregistrements et historiques des noms .ton, des portefeuilles propriétaires et des portefeuilles de paiement |
| API publique de GitHub (anonyme, métadonnées seulement) | Existence et date de création de 55 comptes, liste publique de leurs dépôts, releases de ces dépôts (nom, taille, empreinte, téléchargements des pièces jointes) |
MalwareBazaar, étiquettes salat et RustyStealer, signature SalatStealer |
128 anciens exécutables du tag salat téléchargés (mars à octobre 2026) |
| ThreatFox (étiquettes, recherche par indicateur et par nom de malware) | Indicateurs réseau historiques, rapports de bacs à sable référencés, liens vers les échantillons |
| AlienVault OTX, urlscan.io, Internet Archive, HackerTarget | Impulsions publiques, analyses de pages, captures et noms co-hébergés |
| Rapports publics (CYFIRMA 2025, Solar 4RAYS 2025 et 2026, F6, The Record, Habr, Breakglass, Hunt.io, SOC Prime, dev.ua) | Attribution, canaux, tarifs, domaines de panneau (citées avec leur niveau de preuve en §8) |
Composition des 500 entrées : 425 exécutables et 75 scripts batch. Parmi les exécutables, 204 sont des builds Salat sous UPX (imphash 6ed4f5f0...) déposés par un même rapporteur, 210 sont leurs équivalents dépackés automatiquement par abuse.ch (imphash 1aae8bf5...), et 11 sont d'autres types (chargeurs du §3 et fichiers du §9). Les dépôts vont de 91 à 112 exécutables par jour, et 73 des 75 scripts batch datent du 2026-10-30.
2. Chaîne reconstituée
- Un script batch de 13 345 633 octets (13 345 611 dans l'archive d'origine, sans commentaire final) reconstruit un PE par lignes
echo <base64>>> %TEMP%\vcomp140.tmp, le décode aveccertutil -decodevers%TEMP%\vcomp140.exe(nom emprunté à une DLL du runtime Visual C++), supprime le fichier temporaire et lance le résultat avecstart /b. - Ce PE est un chargeur Go. Il se relance en administrateur par
ShellExecuteWavec le verberunass'il ne l'est pas déjà, attend un délai aléatoire, déchiffre sa charge embarquée, l'écrit sous%LOCALAPPDATA%\Microsoft\updater_<aléatoire>.exeet la lance dans une goroutine. - Après une pause de 60 à 539 secondes, il décode l'URL de la seconde charge, la télécharge (
net/http) et la lance de la même façon. Les deux comptes GitHub cités dans les échantillons renvoient « Not Found » à la date d'analyse : le contenu deservice.exeest inconnu. - Les charges embarquées sont des builds Salat sous UPX, qui contactent leurs C2 (§4 et §5).
Le paquet d'origine, référencé par ThreatFox pour l'URL de la seconde charge (échantillon 5c554838..., déposé le 2026-10-20), est une archive ZIP de 44 fichiers qui reprend le contenu d'un bundle public de contournement de blocage dont le README cite Flowseal/zapret-discord-youtube (nom lu dans le README ; je n'ai pas comparé le contenu au dépôt amont). Comparée à la release 1.9.9d du projet d'origine (publiée le 2026-07-04, téléchargée depuis son dépôt public), l'archive contient 42 fichiers identiques octet pour octet, n'a plus service.bat (présent en amont et listé dans SHA256SUMS.txt), et contient deux fichiers en plus : zapret-discord.bat, qui est le dropper ci-dessus, et un fichier .salt de 32 caractères hexadécimaux daté du 2026-10-18. Les écarts de contrôle relevés dans SHA256SUMS.txt (une ligne pour service.bat absent, une pour le fichier lui-même) existent déjà en amont. Le paquet piégé est donc la release légitime dont un fichier de lancement est retiré et un dropper ajouté.
Les 75 scripts batch du tag ont tous la même taille. Tous ont été décodés (tools/decode_bat.py, osint/salat_bat_decoded.csv) : ils produisent le même PE de 9 851 392 octets (SHA-256 fcaf1f46...), ont le même squelette une fois le commentaire final retiré, et portent 75 commentaires :: <16 caractères hexadécimaux> distincts. Ce commentaire change l'empreinte du fichier sans changer son contenu.
3. Les chargeurs Go
Trois noms de module ont été vus : 5q7z, rogw (Go 1.25.3, 386, clé et URL dans les ldflags) et stub (amd64, Go 1.25.3 puis 1.26.4, -trimpath, sans ldflags lisibles). Dans tous les cas la structure est la même : un paquet uac (élévation par runas), un paquet stealth (anti-débogage et contrôles de bac à sable : mémoire, disque), et un main aux fonctions renommées de façon aléatoire. La variante stub ajoute un paquet defender qui exclut un chemin de Windows Defender par une commande dont les arguments sont des chaînes base64.
| Chargeur | Module | Architecture | Morceaux | Seconde charge |
|---|---|---|---|---|
fcaf1f46... (extrait des .bat) |
5q7z |
386 | 70 | github.com/gigaempressclip/cbnoqxdb/releases/download/Ai/service.exe |
4fe4cfa7... |
rogw |
386 | 48 | github.com/EmpressRecognize22/Ai/releases/download/Ai/service.exe |
16e019fc..., 42da774d..., 74091f5f... |
stub |
amd64 | 55 à 57 | même URL que 5q7z |
b00784d9... |
sans symboles | non déterminé | 79 | non extraite |
Le conditionnement de l'anti-analyse est compilé : RunStealth reçoit un booléen issu de la comparaison d'une variable chaîne avec true, que l'opérateur peut fixer par -X. Dans les deux chargeurs dont les ldflags sont lisibles, l'opérateur ne la renseigne pas, donc les contrôles ne tournent probablement pas dans ce build (déduit de la lecture du code, non vérifié à l'exécution).
Les 6 charges extraites (3 sous UPX, 3 non packées) et leurs 3 versions dépackées sont toutes des PE Go 32 bits au module salat. Sur ces 9 fichiers distincts, 8 sont absents de MalwareBazaar au moment de l'analyse.
4. Configuration de Salat
Le déchiffrement a été reconstitué par la lecture de main.main, main.dec, main.gb, main.GetHWID et main.getEp :
| Élément | Construction |
|---|---|
Clé K (AES-128) |
MD5 de la chaîne biba, puis XOR cumulatif (b[i] ^= b[i-1]) |
Clé X (XOR, 26 octets) |
Une phrase vulgaire en russe (UTF-8), stockée chiffrée en AES-GCM sous K dans la pile de GetHWID et calculée au démarrage |
Module N |
Premier tableau de 129 mots : le premier mot XOR 0xa5a5a5a5 donne la longueur, les 128 suivants donnent chacun bswap(ror(w, 4i) ^ 4i ^ 0x9e3779b9) ; 4096 bits |
| Entrées | Les tableaux suivants, élevés à la puissance 65537 modulo N, donnent une chaîne hexadécimale ; XOR cumulatif inverse, XOR avec X, décodage hexadécimal, AES-GCM sous K |
| Certificats | Un bloc de 141 880 octets (91 certificats PEM) déchiffré en AES-GCM sous K : les racines de confiance utilisées pour le TLS, ce qui évite de dépendre du magasin Windows |
Cette protection ne résiste pas à un analyste qui a le fichier, puisque chaque constante est présente. Elle gêne surtout les recherches de chaînes et les signatures par domaine. Les dix entrées en clair :
| Rôle | Valeur |
|---|---|
| C2 HTTPS | salator.es, wruser.org, websalat.top, sa1atik.cn (chemin /sa1at/) |
| C2 HTTPS, port alternatif | wruser.org:992 |
| Résolveur TON (HTTP) | tonapi.io/v2/dns/webratpanel.ton/resolve, .../remoteadministratortool.ton/resolve |
| Noms TON | webratxaye1.ton, shyetootval.ton |
| Passerelle TON | ton.access.orbs.network/route/1/mainnet/toncenter-api-v2/runGetMethod |
Historique de la liste, relevé sur 76 builds Go plus anciens dont la configuration a pu être extraite (sur 128 exécutables du tag salat téléchargés, déposés du 2026-03-22 au 2026-10-18 pour ces 76 ; osint/salat_older_configs.jsonl) et sur les 204 builds d'octobre :
| Période de dépôt | Builds | Domaines HTTPS de la liste |
|---|---|---|
| 2026-03-22 au 2026-04-25 | 2 | salator.es, wrat.in, websalat.top, salat.cn (et wrat.in:992) |
| 2026-04-23 | 1 | idem, plus salator.ru |
| 2026-04-25 au 2026-10-13 | 18 | salator.es, wruser.org, websalat.top, salat.cn, wrat.in, sa1atik.cn (et wruser.org:992) |
| 2026-07-04 au 2026-10-30 | 55 puis 204 | salator.es, wruser.org, websalat.top, sa1atik.cn (et wruser.org:992) : salat.cn et wrat.in sont retirés |
Les quatre noms .ton sont présents dans tous ces états. Le premier build qui les contient date du 2026-03-22, soit onze jours après la création de shyetootval.ton (2026-03-11), ce qui est cohérent avec l'historique de la blockchain (§5). Le module RSA obfusqué occupe 129 mots à la même forme dans chaque build ; la règle Salat_Config_RSA_Module_Table en tire une signature. Empreinte SHA-256 du module (512 octets, grand-boutiste) : 71abd3648c95e4b1e6081ecfb7842b77d99a54aca60c24bafdbf65b12d4daaf2. Les 52 autres fichiers anciens du tag n'ont pas de configuration extraite : 32 ne sont pas des binaires Go (version Rust ou autres) et 20 n'ont pas livré de configuration (non analysés un à un). Un build plus ancien parmi les charges extraites ajoute salat.cn et wrat.in à la liste. Une collecte complémentaire faite le 2026-10-31, après l'analyse principale (84 échantillons récents des tags salat et SalatStealer absents du corpus, osint/new_since_pull.json), donne 53 binaires Go dépackés dont 52 avec configuration : le module RSA est toujours 71abd364..., la liste de C2 est l'un des états déjà décrits (50 avec sa1atik.cn et wruser.org:992, 2 avec salat.cn et wrat.in), 48 portent l'identifiant de build WF8wvauqSa11NbxrdPwN (celui des archives de release du §7) et 4 portent deux nouveaux identifiants (izkRynzwIFF8ePxY9NW4 et RJbYNitmnDxaIro9xFj4, deux builds chacun). Les 17 autres binaires de la collecte ne sont pas des Salat Go : conteneurs PyInstaller et .NET, scripts batch de 13 à 15 Mo du même type que ceux du §2, et un document Office ; ils n'ont pas été analysés un à un (osint/new_since_configs.jsonl). Le tag continue de grossir : le corpus principal est un instantané.
L'identifiant de build est le troisième morceau d'une concaténation avec l'identifiant matériel et le nom d'hôte, hachée en MD5 ; le résultat sert à forger un identifiant de victime de forme UUID et de clé XOR dérivée (lecture du code, non confirmée par exécution). Les 13 valeurs de bld et leurs dates de dépôt sont dans osint/salat_builds.csv.
Les noms de fonctions Go sont restés en clair, ce qui donne les capacités sans exécuter le programme : session WebSocket avec interface de commandes (wsSess, recvWss, shellCommand, startShell), journalisation de frappes, flux d'écran et de webcam (screenStream, ffwcam), transfert de fichiers et archives (downloadFile, zipFiles), proxy SOCKS pair à pair (p2pSocks), vol de mots de passe et cookies pour les navigateurs Chromium, Gecko et Yandex, de jetons Discord et de sessions Steam, déchiffrement de la clé « app-bound » de Chromium (StartAPPB, GetAppBoundKey), usurpation de jeton SYSTEM et DPAPI, auto-suppression (selfDelete, Suicide). Je n'ai pas vérifié leur fonctionnement.
5. Le repli TON
main.getBC interroge les noms .ton, extrait l'adresse « wallet » de la réponse, la décode en texte (decodeFromTonAddress) et en tire une liste d'hôtes séparés par des virgules, validés par l'expression régulière isValidString puis transformés en https://<hôte>/sa1at/. main.tonResolve fait le même travail par la méthode dnsresolve d'un contrat TON via la passerelle publique. Les deux voies ne reposent que sur des services tiers tout à fait ordinaires.
L'historique des transactions change_dns_record de ces noms, lu sur tonapi.io, donne :
| Date (UTC) | Nom | Valeur écrite |
|---|---|---|
| 2025-07-01 17:22 | webratpanel.ton |
255.255.255.255,255.255.255.254 (valeurs de test) |
| 2025-07-01 18:52 | webratpanel.ton |
62.109.0.189 |
| 2025-11-05 15:59 | webratpanel.ton |
91.142.75.172 |
| 2025-11-05 19:35 | webratpanel.ton |
217.26.28.234 |
| 2026-03-11 18:51 | shyetootval.ton |
217.26.28.234 |
| 2026-08-02 12:08 | webratpanel.ton |
168.222.202.171 |
| 2026-10-14 14:52 | webratpanel.ton |
196.196.208.18 |
| 2026-10-22 18:57 | webratpanel.ton |
196.196.208.18,195.208.21.65 |
| 2026-10-28 12:10 | webratpanel.ton |
policlinika.top,196.196.208.18 |
Le tableau complet (quatre noms, vingt mises à jour) est dans osint/ton_dns_history.csv. Les mêmes valeurs ont été écrites sur plusieurs noms à quelques minutes d'intervalle, ce qui indique une administration commune. Trois adresses de portefeuille possèdent les quatre noms ; elles sont reliées entre elles et au portefeuille racine par des virements de 5 TON le 2026-03-10 et par un transfert de NFT le 2026-03-11. J'estime avec une confiance moyenne qu'il s'agit d'un seul opérateur. Solar 4RAYS a publié les mêmes quatre noms, les mêmes trois adresses propriétaires et la même carte de neuf C2 le 24 septembre 2026, et précise que l'adresse « wallet » d'un nom n'est pas contrôlée par l'opérateur : elle ne fait qu'encoder des hôtes. Mes lectures de la blockchain recoupent donc cette source, elles ne l'avancent pas. Elles y ajoutent l'historique complet des mises à jour jusqu'au 2026-10-28 et la valeur la plus ancienne, 62.109.0.189, que CYFIRMA désigne comme l'hôte du panneau.
Les adresses vues dans le dead drop appartiennent à des hébergeurs ordinaires : SpaceWeb (AS44112, deux adresses), Beget (AS198610), VDSina (AS48282), JSC IOT (AS29182) et, depuis octobre 2026, 196.196.208.0/24 chez PacketExchange (AS58065, enregistré en Afrique du Sud).
6. Infrastructure et OSINT passif
| Domaine | Création | Première / dernière émission de certificat | Résolution | ThreatFox |
|---|---|---|---|---|
salator.es |
non disponible | 2025-10-29 / 2026-10-16 | 46.173.27.15 (Beget) |
SalatStealer, 2026-10-11 |
wruser.org |
2026-04-23 | 2026-04-23 / 2026-09-17 | 196.196.208.17 |
SalatStealer, 2026-10-11 |
websalat.top |
2024-03-13 | 2024-03-13 / 2026-09-14 | non résolu | SalatStealer, 2026-10-11 |
sa1atik.cn |
non disponible | 2026-03-13 / 2026-10-10 | 46.173.27.15 (Beget) |
SalatStealer, 2026-04-25 |
salat.cn |
non disponible | 2023-11-13 / 2026-07-02 | non résolu | aucun |
wrat.in |
2025-06-17 | 2025-06-30 / 2026-05-05 | non résolu | aucun |
policlinika.top |
2026-10-28 | aucune | Cloudflare (proxy) | SalatStealer, 2026-10-29 |
Les serveurs de noms de la plupart des domaines sont ceux de Cloudflare, mais les enregistrements A de salator.es, sa1atik.cn et wruser.org pointent directement vers des adresses non Cloudflare : le service ne sert ici que de DNS, l'origine est visible. Les deux adresses d'origine (46.173.27.15, 196.196.208.17) sont des cibles directes de signalement.
Domaines et adresses historiques du panneau, relevés dans les sources publiques et vérifiés par les données passives (Cloudflare n'y sert que de DNS, sauf mention) :
| Indicateur | Rôle d'après les sources publiques | Observation passive |
|---|---|---|
webr.at |
Domaine de panneau (Solar 4RAYS 2025 et CYFIRMA) | Enregistrement A direct vers 141.95.112.163 (OVH, France), adresse que ThreatFox a aussi saisie comme C2 de Salat le 2026-10-11 ; premiers certificats en 2021 |
webrat.in |
Domaine de panneau | Enregistré le 2025-03-11 ; 272 certificats en tout |
webrat.ru |
Domaine de panneau | Premier certificat le 2025-01-15 ; derrière Cloudflare |
webrat.su |
Domaine de panneau | Trois certificats d'avril à juin 2025 |
webrat.top |
Panneau, signalé inactif par Solar 4RAYS | Enregistré le 2023-12-26 chez Openprovider |
nyash.team |
Cité par CYFIRMA parmi ses indicateurs | 24 certificats de juillet 2025 à mai 2026 |
64.204.180.24, 109.237.98.213 |
Anciennes valeurs de repli (ThreatFox, 2026-10-11) | 64.204.180.24 a hébergé sa1atik.cn d'après urlscan (octobre 2026) |
209.141.54.188 |
Port 992 saisi dans ThreatFox le 2026-10-30 | Hébergeur Frantech/PONYNET (États-Unis) |
Un seul domaine, policlinika.top, est proxifié par Cloudflare. Il est enregistré le 2026-10-28 chez Devexpanse Ltd., soit le jour où le nom .ton a été mis à jour pour le contenir, et signalé dans ThreatFox le 2026-10-29.
Recoupements avec des rapports publics complémentaires
| Source | Apport | Statut dans cette analyse |
|---|---|---|
Breakglass Intelligence (2026-03-15, échantillon yesamsevo.exe, SHA-256 8651bf3f...13ef) |
Indique 85.198.98.75 (Rostov-sur-le-Don, AS43429), 85.117.234.216 (Moscou) et 157.22.174.200 (rotation de wrat.in) comme C2 actifs, uffyaa.ru comme domaine historique, des certificats de sa1at.ru (2026-01-22), webrat.ru (enregistré 2026-02-17), wrat.in (2026-02-27) et salat.cn (2026-02-28), et une même empreinte HASSH sur deux serveurs d'origine |
Source tierce, non revérifiée. Aucune de ces adresses ne figure dans mes 204 configurations extraites (builds d'octobre) : elles décrivent un état antérieur |
| Hunt.io | Associe 85.198.98.75 à l'activité UAC-0252 (SHADOWSNIFF, SalatStealer), hébergée chez Beget (AS198610) |
Contradiction avec breakglass sur l'AS de la même adresse : je ne tranche pas |
| Note CERT-UA#20032, lue à la source (cert.gov.ua, 2026-03-02) | Depuis janvier 2026, courriels qui se font passer pour des administrations, avec une archive contenant un EXE ou un lien vers un site légitime vulnérable au XSS qui télécharge un exécutable ; exécutables et scripts hébergés sur GitHub. Outils confirmés en janvier et février 2026 : SHADOWSNIFF (voleur public sur GitHub), SALATSTEALER (« voleur MaaS ») et DEAFTICK (porte dérobée Go primitive). Un dépôt contenait un programme de type rançongiciel (« AVANGARD ULTIMATE v6.0 ») et une archive d'exploit WinRAR (CVE-2025-8088). La note relie l'activité aux personnes couvertes par le canal Telegram « PalachPro ». Indicateurs Salat : main.exe (SHA-256 c149a236...5cef, vu dans MalwareBazaar le 2026-03-03, signature SalatStealer, 3 297 280 octets), main.deupx.exe (a4f1a6f8...0689, absent de MalwareBazaar), 91.92.34.130/main.exe, les quatre chemins /sa1at/ de salat.cn, salator.es, salator.ru et websalat.top, et wrat.in:992/sa1at/ |
Source primaire. salator.es, salator.ru, websalat.top, salat.cn et wrat.in:992 recoupent mes configurations (§4). La note ne rattache pas Salat à NyashTeam : elle le qualifie de voleur MaaS et lie le groupe à PalachPro. Les autres adresses de la note (150.241.64.21:8888, 95.85.224.14:8000, nfkavn.bond) servent des chemins /client/addclient qui ne sont pas ceux de Salat |
| Article tiers (Medium, relayé par une recherche, page inaccessible) | Cite websalat.top, salator.ru, ua-gov.info, 150.241.64.21 et 95.85.224.14 |
Tous ces indicateurs figurent bien dans la note CERT-UA lue à la source ; ua-gov.info et les deux adresses y servent la porte dérobée DEAFTICK ou son téléchargement, pas un C2 de Salat |
La note CERT-UA#20032, avec ses indicateurs, dont les quatre chemins /sa1at/ :

La constante de 32 octets b31c6e241ac846728da9c1fac4936651cffb944d143ab816276bcc6da0284787 (en base64 sxxuJBrI...) est présente dans 280 des 332 builds Go dépackés et dans le build Rust, en majuscules, à côté de la chaîne GetAppBoundKey. Breakglass y voit une clé liée à l'identifiant matériel. Sa position et sa valeur correspondent plutôt à la clé AES de 32 octets que les outils publics de déchiffrement des cookies Chromium « v20 » donnent pour le service d'élévation de Chrome : c'est une constante du navigateur, commune à tous les voleurs, qui ne désigne pas Salat (cette identification repose sur ma connaissance de ces outils, je ne l'ai pas revérifiée dans le code de Chromium). Elle ne doit pas servir de signature de famille.
7. Distribution par dépôts GitHub jetables
Les builds UPX portent à leur fin, dans la zone de remplissage laissée par le packer, un marqueur de fabrication de la forme :
GBZAP-PACK-UNIQUE\n<étiquette>\n<propriétaire/dépôt>\n<nom du fichier d'origine>\n<32 octets répétés>GBZAPUNQ2
tools/extract_pack_marker.py le lit sans rien exécuter. Il est présent dans 193 fichiers (192 builds distincts), la valeur de 32 octets étant propre à chaque build. Dans 178 cas l'étiquette est git-root et le champ suivant est un chemin compte/dépôt ; dans 14 cas l'étiquette est le nom flowseal, suivi d'un nom de dépôt, ce qui reprend le nom d'un auteur légitime d'outils de contournement de blocage comme s'il était propriétaire du dépôt (usurpation, je n'ai pas vérifié ce compte). Le nom d'origine du fichier est wdvcache.exe (67 builds), webrat.exe (62), zapret.exe (49) ou s.exe (14). Le nom webrat.exe relie directement ces builds au produit « WebRat ».
| Mesure | Valeur |
|---|---|
Comptes GitHub distincts (hors libellé flowseal) |
55, tous répondent encore (HTTP 200) à la date d'analyse |
| Dépôts distincts nommés dans les marqueurs (casse ignorée) | 135 |
| Thèmes des noms de dépôt | Discord (119 builds), Telegram (32), YouTube (30), Discord et YouTube (11) ; formes zapret, obhod (« contournement » en russe), unban, fix |
| Casse des noms de dépôt | Mélangée au hasard dans 105 builds (disCOrD-ZapREt, zaPRet-DIScORD-yOUTUbe) |
| Vagues de création des comptes | 6 comptes le 2026-08-18 (02:21 à 03:05 UTC), 22 comptes le 2026-08-23 (02:30 à 02:42, soit 12 minutes), 27 comptes le 2026-09-08 (01:55 à 02:29, soit 34 minutes) |
| Profil des comptes | Aucun abonné, 2 à 4 dépôts publics, noms formés de mots anglais accolés, parfois suivis de chiffres |
| Dépôts énumérés | 191 dépôts pour les 55 comptes (3 à 4 par compte) |
| Création des dépôts | 33 dépôts à nom aléatoire de 8 lettres, un par compte, créés vides au moment de la création du compte (6 le 2026-08-18, 27 le 2026-09-08 ; les 22 comptes du 2026-08-23 n'en ont pas de ce type) ; puis 158 dépôts à nom thématique créés du 2026-09-20 au 2026-09-30 par lots de 6 à 24 par jour |
| Contenu | Zéro étoile et zéro fork pour les 191 dépôts, description en russe pour les 191, taille d'environ 4,8 Mo pour les dépôts à nom thématique (les dépôts à nom aléatoire sont vides), descriptions quasi identiques du type « nouvelle version avec prise en charge du contournement de Discord dans les conditions actuelles » |
| Dernière mise à jour | Jusqu'au 2026-10-29 21:02 UTC, soit juste avant le dépôt massif des builds dans MalwareBazaar (27 au 30 octobre) |
| Concordance avec les binaires | 122 chemins compte/dépôt distincts relevés dans les marqueurs : les 122 existent dans la liste publique de leur compte, aucun n'est absent |
| Releases | 191 dépôts interrogés (/releases, osint/github_releases.csv) : 155 portent une release avec des pièces jointes, 310 pièces jointes en tout, publiées du 2026-09-20 au 2026-09-30. Chaque release offre un .zip et un .rar du paquet « zapret-discord-youtube » (version 1.9.9c pour 150 couples, 1.10.3 pour 5), de 15,9 à 16,9 Mo. Les 310 empreintes SHA-256 sont distinctes : chaque dépôt sert une archive propre. 41 877 téléchargements cumulés (391 au maximum pour une pièce jointe), un minorant du nombre de victimes puisque les téléchargements des archives ne sont pas tous des infections |
Ce dispositif se lit ainsi : des comptes jetables créés par un script hébergent chacun quelques dépôts qui imitent un outil de contournement de blocage populaire ; la release de chaque dépôt est un paquet de contournement dont la charge est un build UPX de Salat qui reçoit, au moment de sa fabrication, le nom du dépôt. Les noms de dépôt aléatoires et les descriptions copiées indiquent une génération automatique. Le contenu de quatre archives de release a été examiné (sous-section suivante) ; les autres dépôts n'ont été lus que par leurs métadonnées publiques (osint/github_accounts.csv). Les comptes websalat (cité par CYFIRMA comme hébergeant 7z.exe et ffmpeg.exe) et nyashteam n'existent pas (HTTP 404).
Contenu des archives de release
Les 155 archives .zip des releases ont été téléchargées sans être exécutées et analysées en mémoire (tools/analyze_release_zips.py, osint/release_zip_analysis.csv) ; leur SHA-256 correspond à chaque fois à celui que GitHub publie. Quatre d'entre elles ont aussi été extraites sur disque et lues (ringdesignerlaud/discord-unban, Blockadeeuclip/youtube-fix, CommercialDominate/zaPRet-DIScORD-yOUTUbe, Playiesculpt/ObhodDiscord). Chacune contient 55 fichiers : le paquet de contournement zapret-discord-youtube (versions 1.9.9c, 1.10.3 pour la dernière) avec ses 20 scripts general*.bat et service.bat modifiés, 8 fichiers de listes, des signatures réseau, winws.exe, WinDivert.dll, WinDivert64.sys et cygwin1.dll, auxquels s'ajoutent :
| Élément ajouté | Rôle |
|---|---|
bin/.wd/wdvcache.exe, webrat.exe, zapret.exe |
Trois copies identiques (3 592 704 à 3 593 029 octets selon l'archive) de la charge, un build UPX de Salat. Ces noms sont ceux des « noms d'origine » inscrits dans les marqueurs de fabrication (§7) |
bin/stun.bin |
Le paquet STUN de 100 octets du paquet légitime, suivi de GBZAP1, d'une taille de 8 octets, de la charge et du décalage de 8 octets en fin de fichier : une seconde copie de la charge, cachée dans un fichier de signature réseau |
bin/wd_cache.ps1 et bin/windivert_load.cmd |
Si les copies de .wd sont absentes (supprimées par l'antivirus), relisent la fin de stun.bin et réécrivent la charge sous %LOCALAPPDATA%\WinDivert\ (wdvcache.exe, zapret.exe, webrat.exe) et dans bin\.wd\ |
bin/defender_guard.cmd et bin/windivert_drv.cmd |
Ajoutent le paquet, bin\, bin\.wd\, wdvcache.exe, winws.exe et les pilotes aux exclusions de Defender (Add-MpPreference -ExclusionPath, -ExclusionProcess, -ControlledFolderAccessAllowedApplications) et retirent le marqueur Zone.Identifier |
bin/payload_kick.cmd, payload_run.cmd, payload_fire.cmd, gbzap_seed.cmd, admin_guard.cmd |
Lancent la charge en priorité haute et réduite, cachent le dossier (attrib +h +s), la copient en %LOCALAPPDATA%\WinDivert et relancent le script en administrateur par Start-Process -Verb RunAs |
bin/payload_fail.cmd, extract_guard.cmd |
Messages en russe qui demandent de restaurer les fichiers mis en quarantaine, d'ajouter des exclusions, de désactiver l'antivirus et de ne pas lancer les fichiers depuis l'archive |
Les 21 scripts .bat portent le marqueur GBZAP_INSTANT : leur troisième ligne exécute bin\.wd\webrat.exe avant même le reste du paquet, puis un second bloc (GBZAP_INLINE_ELEVATE) vérifie les droits d'administrateur, exige la présence de winws.exe et des pilotes, et recopie la charge si besoin. Le paquet reste donc fonctionnel (le contournement de blocage fonctionne), ce qui masque l'infection. Ce mécanisme est différent du paquet d'origine du §2 (un .bat de plus de 10 Mo qui reconstruit un exécutable par certutil).
Résultat sur les 155 archives : toutes ont 55 fichiers, les 21 scripts .bat portent le marqueur GBZAP_INSTANT dans chacune, bin/.wd/ contient trois copies identiques de la charge, et cette charge est identique à celle cachée dans stun.bin. Aucun fichier inattendu n'a été trouvé. Le mécanisme est donc le même dans toutes les releases. Les archives portent 45 charges distinctes (UPX, Salat Go) : la charge dépend du nom du dépôt, pas du compte, car le marqueur de fabrication de 154 d'entre elles (étiquette flowseal, nom d'origine s.exe) ne contient que le nom du dépôt ; des comptes qui reprennent le même nom de dépôt reçoivent la même charge (jusqu'à 16 comptes pour un nom). La 155e archive n'a pas de marqueur. Une fois dépackées, les 45 charges ont le même module RSA (71abd364...), le même identifiant de build (WF8wvauqSa11NbxrdPwN), go1.24.0 et la même liste de C2 (salator.es, wruser.org, websalat.top, sa1atik.cn, wruser.org:992 et les noms .ton) que les builds d'octobre du §4 (osint/release_payload_configs.jsonl). 33 de ces 45 charges sont dans MalwareBazaar (signature SalatStealer, vues du 2026-10-20 au 2026-10-27) ; 12 n'y ont jamais été déposées, et seules 5 des 45 étaient dans mon jeu de 204 builds (osint/release_payloads_mb.json). Chaque archive reste unique (les scripts portent des variantes de quelques octets), ce qui explique les 310 empreintes distinctes : le défenseur doit détecter le mécanisme, pas un hash. Les règles Salat_Release_Package_GBZAP_Scripts et Salat_Release_Package_Stun_Host couvrent les scripts et le stun.bin piégé.
Le dépôt ringdesignerlaud/discord-unban tel qu'il se présente : un seul contributeur, zéro étoile, une description russe, et les scripts general (ALT*).bat du paquet légitime.

Sa page de release copie le journal des modifications du projet légitime, cite ses vrais contributeurs, et demande de décompresser puis de lancer zapret-discord.bat en administrateur.

Cette distribution recoupe les descriptions publiques du produit : faux correctifs d'applications bloquées en Russie, vidéos de présentation sur YouTube avec lien vers une archive protégée par mot de passe, comptes GitHub qui se font passer pour des utilitaires (Solar 4RAYS, 2025) ; faux outils, « cracks » et triches sur GitHub et YouTube (The Record, à propos de NyashTeam).
8. Opérateurs, canaux de communication et paiements
8.1 Attribution d'après les sources publiques
| Élément | Source | Ma lecture |
|---|---|---|
| Le panneau « WebRat » est vendu et géré par NyashTeam, avec Kapchenka | CYFIRMA, septembre 2025 (« haute confiance », preuves citées : infrastructure, support par Telegram, commentaires dans le code, modèle commercial ; non détaillées) | Plausible. Je n'ai pas relu les preuves |
| NyashTeam développe et vend WebRat | Solar 4RAYS, 2026-09-24 | Indépendant de CYFIRMA pour le nom NyashTeam |
| NyashTeam vend DCRat et WebRat par des bots Telegram et des sites, actif depuis au moins 2022, plus de 350 domaines de second niveau, 110 domaines bloqués en zone RU en juillet 2025 | F6, The Record, Habr | Contexte sur le groupe, pas sur Salat précisément |
| Le nom Kapchenka | CYFIRMA seulement | Non corroboré par les autres sources que j'ai trouvées |
Un chemin de débogage contient le nom d'utilisateur ilyaz dans certains échantillons anciens |
Solar 4RAYS, 2025 | Non attribué par la source ; je ne l'ai pas retrouvé dans les 446 fichiers examinés |
| UAC-0252 a utilisé SalatStealer en Ukraine de janvier à février 2026 avec SHADOWSNIFF et DEAFTICK, via des exécutables et scripts hébergés sur GitHub ; CERT-UA relie l'activité aux personnes couvertes par le canal Telegram « PalachPro » | Note CERT-UA#20032 lue à la source (2026-03-02), qui donne les hashes main.exe et main.deupx.exe de Salat et les domaines C2 /sa1at/ |
Aucun lien établi entre ce canal et NyashTeam : la note ne cite ni l'un ni l'autre dans ce sens. Le groupe UAC-0252 est donc un utilisateur de Salat parmi d'autres |
Dans ses indicateurs de NyashTeam, F6 (juillet 2025) liste sa1at.ru, webr.at, webrat.ru, webrat.su, webrat.top, posholnahuy.ru et pidorasina.ru : des domaines de Salat et de WebRat se trouvent donc aussi dans une source indépendante de CYFIRMA. Recoupements propres à cette analyse : (a) 62.109.0.189, désigné par CYFIRMA comme l'hôte du panneau, est la première valeur réelle écrite dans le dead drop TON (2025-07-01 18:52 UTC) ; (b) webr.at, domaine de panneau, résout vers 141.95.112.163, adresse que ThreatFox a saisie comme C2 de Salat le 2026-10-11 ; (c) le nom de fichier webrat.exe figure dans les marqueurs de fabrication de 62 builds ; (d) le portefeuille racine est le portefeuille de paiement décrit par Solar. Ces quatre points relient le produit WebRat, le malware Salat et l'infrastructure TON sans passer par l'attribution à un groupe, qui reste celle des sources publiques.
8.2 Canaux de communication
- Dans le code. Recherche dans 446 fichiers distincts (builds Go dépackés, Rust, binders, chargeurs, scripts Python extraits) de liens
t.me, de jetons de bots Telegram, de webhooks Discord, d'adresses.onion, de courriels et de comptes GitHub (tools/scan_channels.py,osint/channels_scan.txt) : aucun canal d'opérateur. Les marqueurs de CYFIRMA (nyashsupbot,Lightshot,Procmon,alive.php,sniff_domain_list.txt) sont absents des builds Go ; seulRuntimeBrokerse retrouve, comme chemin d'installation du Salat Rust (§9.1). - Liste des identifiants. Tous les comptes, canaux, domaines, adresses TON et IP cités par le code ou par des sources publiques sont dans
comptes_et_canaux.md, avec leur source et leur niveau de confiance. Rien n'a été contacté. - Dans les sources publiques. Le panneau affiche des identifiants de bots Telegram et de comptes d'administration, avec une liste de revendeurs, et le support et les paiements passent par des bots (CYFIRMA, sans reproduire les identifiants). Une chaîne de distributeurs sur Telegram existe (Solar 4RAYS, 2025, sans nom). F6 a obtenu le retrait d'un canal Telegram qui hébergeait le code source de WebRat. Les seuls identifiants Telegram publiés sont
nyashsupbot(chaîne d'une règle YARA de CYFIRMA) etPalachPro(canal cité à propos d'UAC-0252, sans lien établi avec NyashTeam) ; F6 ne publie aucun nom de canal ni de bot. Je ne l'ai pas contacté et je ne l'ai pas cherché sur Telegram. - Moyens de paiement cités par CYFIRMA. Cryptobot, RUCARD, LOLZ, skins Steam ; abonnement mensuel de 1199 roubles pour le panneau, hébergement à 999 roubles pour deux mois.
- Distribution. GitHub (§7), YouTube, forums de triche pour jeux (sources publiques).
Conclusion de cette section : aucun identifiant de canal d'opérateur n'a été obtenu par l'analyse du code ni par les sources publiques accessibles ; l'accès au panneau, aux bots et aux canaux relève d'un accès actif que je n'ai pas tenté.
8.3 Paiements
Solar 4RAYS décrit des paiements entrants vers des adresses « roses » qui alimentent des adresses « noires » propriétaires des domaines, un prix d'environ 1500 roubles et deux portefeuilles de paiement successifs (jusqu'en mai, puis en juin). Les adresses brutes de ces portefeuilles, calculées à partir de leurs adresses publiées, sont :
| Rôle chez Solar | Adresse brute | Ce que j'ai observé |
|---|---|---|
| Paiement jusqu'en mai | 0:c441f18d...e0451 |
Mon « portefeuille racine » : déploie le premier NFT DNS (2025-06-26), 731 entrées, 489 payeurs distincts dans la bande de prix du 2025-07-01 au 2026-05-09 |
| Fonds déplacés le 17 mai | 0:0e4d1a5a...13119 |
Reçoit 279 USDT du portefeuille racine le 2026-05-17 (événement du portefeuille racine) ; fait par ailleurs transiter huit mois de flux à solde nul (entrées et sorties à peu près égales chaque mois, environ 27 000 USDT en octobre et 23 000 en novembre 2025) |
| Paiement en juin | 0:54b303f5...ca8b8 |
524 entrées, 157 payeurs distincts dans la bande, du 2026-01-07 au 2026-06-15 |
| Portefeuille de conservation (5000 USDT chez Solar) | 0:8d6cf0f7...a3f3d |
Reçoit du portefeuille de juin 2548 TON et 1700 USDT du 2026-03-31 au 2026-06-19, convertit les TON en USDT sur des échanges décentralisés (STON.fi, DeDust), dernière activité le 2026-07-22, aucun envoi sortant ; détient 5 456 USDT au 2026-10-31. L'adresse publiée par Solar, lue par mon outil de lecture, diffère d'un caractère de l'adresse réelle de la chaîne (...a3f3f contre ...a3f3d) : j'ai retenu celle de la chaîne, qui est la destinataire des transferts |
Les deux portefeuilles de paiement ne partagent que 12 payeurs sur 634 distincts, ce qui est cohérent avec deux périodes de vente successives (les périodes se recouvrent de janvier à mai 2026). Le prix quasi fixe observé (bande de 9 à 13 TON ou de 14 à 17,5 USD₮, soit environ 15 à 16 USD) recoupe le « prix de licence fixe » de Solar. Le portefeuille de juin se vide dans ce portefeuille de conservation, qui ne reçoit plus rien après le 2026-07-22. Je n'ai pas identifié de portefeuille de vente actif depuis juillet 2026 ; je n'ai relié aucun payeur à une identité (les adresses de contreparties restent dans les réponses brutes hors paquet).
Le portefeuille 0:0e4d1a5a... ne verse qu'à quatre contreparties, que l'explorateur public étiquette « Bybit 7 » à « Bybit 10 » (portefeuilles de dépôt de l'échange), pour environ 106 000 USDT et 40 000 TON du 2025-10-03 au 2026-05-21. Il compte 90 contreparties entrantes distinctes : je ne peux pas dire qu'il appartient à l'opérateur seul. C'est une piste pour une demande de conformité auprès de l'échange, qui peut associer ces dépôts à des comptes vérifiés.
8.4 Chronologie reconstituée
| Date | Événement | Source |
|---|---|---|
| 2025-01 | Première version de WebRat observée (0.13.2, 2025-01-28) | Solar 4RAYS (2025) |
| 2025-06-26 | Déploiement du premier NFT DNS webratpanel.ton |
Blockchain TON |
| 2025-07-01 | Première valeur réelle du dead drop : 62.109.0.189 |
Blockchain TON |
| 2025-08 | Salat observé et nommé | CYFIRMA |
| 2025-10-03 | Début des flux du portefeuille « conduit » vers les portefeuilles Bybit | Blockchain TON |
| 2025-10-16 | websalat.top/sa1at/ saisi dans ThreatFox |
ThreatFox |
| 2026-01 à 2026-02 | UAC-0252 utilise SalatStealer en Ukraine (note publiée le 2026-03-02) | CERT-UA#20032 |
| 2026-07-30, 2026-08-04 | Plus anciens builds UPX de type zapret relevés (537dea26..., a4aa0f96...) |
MalwareBazaar |
| 2026-08-18, 08-23, 09-08 | Trois vagues de création de comptes GitHub jetables | API GitHub |
| 2026-09-20 à 09-30 | Création par lots quotidiens de 105 dépôts thématiques | API GitHub |
| 2026-09-24 | Publication de Solar 4RAYS (noms TON, portefeuilles, carte de 9 C2) | Solar 4RAYS |
| 2026-10-14, 10-22, 10-28 | Mises à jour du dead drop vers 196.196.208.18, 195.208.21.65, puis policlinika.top |
Blockchain TON |
| 2026-10-20 | service.exe classé par ThreatFox |
ThreatFox |
| 2026-10-27 à 10-30 | Dépôt massif de builds UPX et de scripts batch dans MalwareBazaar | MalwareBazaar |
9. Autres fichiers du tag
| Fichier | Nature | Résultat |
|---|---|---|
2ac633cf..., 3d6fca3a... |
Binders .NET (famille XBinder v2), mutex hoYiWVtzIph905hvS et w4wotXxIy8V1G9uvF |
Ressources GZip déposées dans %Temp% : un leurre (le binder lui-même, ou winws.exe) et Hackmgr.exe (Salat UPX, SHA-256 be0a06cc...), caché, lancé après une exclusion Defender par PowerShell. Une fois dépacké, ce Salat a le même module RSA et les mêmes C2 (bld rxpLq72hDmfMaSEi4vWQ) |
3745e309... (SoundCloudUnblock.exe) |
RAT Python 3.14 empaqueté avec PyInstaller, interface Tk « SoundCloud Unblock » | Famille distincte de Salat : C2 77.239.96.159 port 4444 en dur, persistance par copie en %APPDATA%\Microsoft\Windows\Caches\svchost.exe et un WindowsSecurity.bat dans le dossier Démarrage, commandes de flux d'écran, webcam, micro, shell, liste et arrêt de processus, dépôt de fichiers, fond d'écran, ouverture d'URL. Le rapporteur l'a étiqueté salat ; je ne trouve aucun lien technique avec le Go ou le Rust de Salat, seulement le même tag |
794b7450... (sanert.exe) |
Rust, UPX | Réécriture de Salat (§9.1) |
f7161024... (TgWsProxy.exe) |
Chargeur C++ MinGW à overlay chiffré de 24 Mo | §9.2 |
b1d4b530... |
Exehead NSIS de 196 Ko sans données d'installation (aucun en-tête de premier bloc NSIS), exige les droits administrateur | Il porte, ajoutée à la suite du PE, une signature Authenticode au nom d'un grand éditeur de jeux vidéo : l'annuaire de sécurité du PE est vide, Windows ne la prendra pas en compte. Il s'agit d'un fichier incomplet ou d'un habillage, sans charge récupérable |
9.1 Le Salat réécrit en Rust
sanert.exe (SHA-256 dépacké 11fc792b...) est un PE 64 bits de 6,4 Mo qui envoie User-Agent: salat/2.0 et consulte tonapi.io et orbs.network : mêmes services que le repli TON de la version Go. Les chemins de compilation donnent ses modules (config, crypto, net, ws, tunnel, hwid, install, elevate, makelog/invdump/{chrome,gecko,steam,processes,users}, camera, sound, screen, dxgi_capture, filemanager, taskmanager, shell) et ses crates (tokio-tungstenite pour le WebSocket, h3 et quinn pour QUIC, rustls, aes-gcm, chacha20poly1305, rusqlite, nokhwa et cpal pour la caméra et le son). Il énumère des dizaines de navigateurs Chromium et Gecko, des extensions de portefeuilles, les clients Telegram (Telegram Desktop, AyuGram, Kotatogram), Exodus, Electrum, Atomic, Coinomi et Jaxx. La configuration de tunnel est une chaîne à cinq champs séparés par des barres (p2_host|p2_port|key|target_host|target_port). Aucun domaine C2 n'est en clair. La structure de configuration est construite par une seule fonction (0x1400ea1cd) qui décode des chaînes base64 : le mutex Global\WEBR_4D285JK5EBIZ (le préfixe WEBR est celui du panneau WebRat), le chemin d'installation $Appdata\RuntimeBroker.exe, le script PowerShell qui ajoute Program Files, %APPDATA% et %LOCALAPPDATA% aux exclusions de Defender, un jeton de 20 caractères (SHA-256 5a974e5f62be2a490074d946cffd3db2e63fb29c47287acf7701a9d4a1ba92fb, non reproduit ici car il peut servir d'authentification) et une série de délais (30 s, 1 min, 5 min, 30 min, 8 s, 5 s). Deux champs de texte de cette structure sont vides dans ce build : aucune adresse de serveur n'est donc embarquée, ni en clair ni chiffrée, et l'adresse est fournie autrement (argument d'exécution, repli par tonapi.io ou configuration déposée plus tard). La chaîne d'exécution se remonte ainsi : la structure de configuration (0x110 octets) est copiée dans la fermeture d'un fil d'exécution (0x1400e734f), qui lance l'exécuteur asynchrone tokio (0x14001c27d), lequel appelle la tâche réseau (0x1400dae5d) puis la résolution TON (0x1400dc26a). Les délais de la configuration (30 s, 8 s, 5 s) sont ceux de cette résolution ; les deux champs de texte vides sont les seuls emplacements possibles d'une adresse. Deux autres builds Rust, plus récents (HDSDriver.exe, vus le 2026-10-31 : SHA-256 0280901c2740795149dee80475e7819b8ac93a95d87413f15dd944eaad17a03b dépacké et 9aad498becf1c9c0b025bf6ee4f88e66c4c90404f49a8065afcef0625b0341fb sous UPX, qui se dépacke en un fichier identique de 6 492 160 octets), ont la même structure avec un autre mutex (Global\WEBR_AXTARNHZ7RS5), un autre jeton de 20 caractères (SHA-256 b3c92aedb9c97cd47f2be2ed2bb4580d7c0e5f320b5dcf54f0b9c70cb1f1da94), trois champs vides au lieu de deux (le chemin d'installation est vide) et les clés install, install_count, install_autorun, autorun_service, set_comment et install_paths juste après le jeton. Le mutex et le jeton changent donc d'un build à l'autre : ce sont des identifiants par build ou par client, et les champs vides sont des options choisies à la fabrication (installation désactivée), pas des champs oubliés. Aucun des builds Rust connus n'a de champ pour une adresse de serveur : elle vient du canal de commande (résolution par tonapi.io) ou d'une configuration reçue ensuite, ce que les clés install_* suggèrent. Sur les 41 échantillons récents d'étiquette RustyStealer examinés (2026-10-20 au 2026-10-31), seuls ces deux builds et sanert.exe portent salat/2.0, src/hwid.rs et tonapi.io ; les 37 autres n'en portent aucun. Le RSA du build (rsa_encrypt, bourrage PKCS#1 v1.5, src/crypto.rs) chiffre une clé de session de 32 octets et un vecteur de 16 octets pour protéger les données envoyées : il ne sert pas à déchiffrer la configuration comme dans la version Go. MalwareBazaar le suit sous l'étiquette RustyStealer (qui regroupe aussi des familles sans rapport : douze échantillons de janvier et février 2026 de cette étiquette ont été vérifiés, aucun ne porte salat/2.0, src/hwid.rs ni tonapi.io) (version UPX déposée le 2026-10-29, version dépackée générée par abuse.ch le même jour), en plus de SalatStealer.
9.2 TgWsProxy.exe : un joiner qui cache le Salat Rust
L'exécutable de 24 Mo est un petit stub C++ (MinGW, environ 300 Ko) suivi d'un overlay chiffré de 24 Mo. Le stub lit les 16 derniers octets de son propre fichier : un offset de 64 bits, une graine de 32 bits et un contrôle (graine ^ 0x3f8a7d2b). À l'offset indiqué, un en-tête de 28 octets est masqué par un flux pseudo-aléatoire (générateur congruentiel linéaire de constantes 0x5851f42d4c957f2d et 0x9e3779b97f4a7c15, initialisé par la graine). Il contient la version (4), des drapeaux, le schéma de chiffrement, un délai, les longueurs de clé (32) et de nonce (16) et le nombre de fichiers (2). La clé et le nonce suivent, masqués par le même flux. Chaque fichier annexé est ensuite stocké en clair pour son nom et ses tailles, chiffré pour son contenu (ici AES-256-CBC, bourrage PKCS#7) puis compressé en LZNT1. tools/joiner_extract.py reproduit l'ensemble : les tailles obtenues après décompression sont exactement celles que l'en-tête annonce.
| Fichier annexé | Contenu | Sort |
|---|---|---|
TgWsProxy.exe (21 797 942 octets) |
Application Python 3.11 empaquetée avec PyInstaller, module tg_ws_proxy |
Le fichier visible : un leurre qui fonctionne comme un outil de proxy pour Telegram |
vsekromeds.exe (2 405 888 octets, UPX) |
Le Salat réécrit en Rust (§9.1) | La charge cachée, drapeau b=0 |
Ni l'un ni l'autre n'est dans MalwareBazaar. Le stub dépose les fichiers dans un répertoire temporaire, puis démarre les exécutables avec CreateProcessW (lecture du code décompilé ; l'ordre et les drapeaux de lancement n'ont pas été reconstitués au-delà de la structure de l'en-tête).
10. Faiblesses exploitables par les défenseurs
- La clé et l'URL de seconde charge des chargeurs sont lisibles en clair : un défenseur qui détient un chargeur détient sa charge.
- Les 204 builds partagent module RSA, clés et jeu d'adresses : une seule règle de configuration couvre tout, et un nouveau build à un seul
blddifférent reste détecté. - Le dead drop TON est public et horodaté : on peut surveiller les mises à jour de
webratpanel.ton,remoteadministratortool.ton,webratxaye1.tonetshyetootval.tonpour anticiper les prochains C2. - Le trafic vers
tonapi.ioetton.access.orbs.networkémis par un processus qui n'est pas un navigateur ou un client TON connu est un signal fort.
11. Portée et limites
- Le tag est plus grand que les 500 entrées lues : l'API refuse
limit=1000. Les nombres de builds par jour sont des minorants. La requête par signature donne la même fenêtre de 500 entrées (du 27 au 31 octobre), la requête par étiquettesalatremonte à mars 2026 (128 exécutables téléchargés, §4) et celle par étiquetteRustyStealerà janvier 2026 (étiquette générique : les échantillons vérifiés n'ont pas de lien avec Salat). - ThreatFox renvoie au plus 1000 indicateurs par requête, surtout des hash des sept derniers jours ; les indicateurs réseau antérieurs ont été obtenus par étiquettes (
webrat,TON,dead-drop,Github). - Le contenu de
service.exeest inconnu : les deux comptes GitHub n'existent plus, et le rapport Triage du paquet d'origine (261020-fpe2zacz4w) ne contient que le script (score 3) sans seconde charge. ThreatFox classe l'URL du premier compte comme livraison de charge SalatStealer (confiance 75, rapporteur tiers, 2026-10-20) ; je n'ai aucun hash pour ce fichier. - Aucune exécution : les capacités de Salat sont déduites du code. Les chaînes littérales confirment le vol de navigateurs (mots de passe, cookies, saisie automatique, jetons), de Telegram Desktop et de portefeuilles, la persistance par la clé
Run, l'exécution viacmd.exe, l'élévationrunaset la capture d'écran. La lecture des appels d'API confirme aussi la capture de la webcam et du bureau (lancement de%TEMP%\ffmpeg.exeavec une entréedshowetvideo=), le proxy SOCKS (connexion TCP sortante), l'auto-suppression (renommage puis suppression du fichier parSetFileInformationByHandle, suppression de la tâche planifiée par la bibliothèquetaskmaster, puisos.Remove) et l'enregistrement de frappes (processus fils lancé paros/exec, avec une fonction qui charge des API Windows). Le détail des frappes enregistrées et du protocole WebSocket n'a pas été relu. - Le Salat réécrit en Rust n'embarque aucune adresse de serveur dans ce build (§9.1) : le module RSA du build Go n'y figure sous aucun de six encodages, sa structure de configuration ne contient que le mutex, le chemin d'installation, le script Defender, un jeton et des délais, et l'origine de l'adresse (argument, résolution par
tonapi.ioou configuration ultérieure) n'est pas établie. Les appels de la fonction de résolution TON n'ont pas pu être rattachés à une adresse de portefeuille. Ses canaux de communication sont donc inconnus. - Les ventes ne sont visibles que jusqu'en juin 2026 : le portefeuille de juin se vide dans un portefeuille de conservation inactif depuis le 2026-07-22 et je n'ai pas trouvé de portefeuille de vente plus récent. Je n'ai relié aucun payeur à une identité. Le portefeuille « conduit » reçoit de 90 contreparties : je ne le tiens pas pour exclusivement lié à l'opérateur. Pour chercher un portefeuille plus récent, j'ai lu les événements publics des 60 payeurs les plus récents des deux portefeuilles de paiement (dernier paiement du 2026-05-03 au 2026-06-15) et compté, après le 2026-06-16, les destinataires de leurs virements dans la même bande de prix : aucun destinataire n'est commun à deux payeurs. Les ventes ont pu passer par un service de paiement à solde interne (CYFIRMA cite Cryptobot parmi les moyens de paiement), dont les dépôts ne laissent pas de portefeuille commun visible, ou s'arrêter.
- Aucun canal Telegram, forum ou panneau n'a été interrogé ni recherché directement, par choix : ce serait contacter l'infrastructure ou les comptes de l'opérateur. Les identifiants de canaux restent donc inconnus. Les noms d'abonnés du panneau cités par CYFIRMA n'ont pas été reproduits.
- L'attribution à NyashTeam repose sur CYFIRMA et Solar 4RAYS ; le nom Kapchenka sur CYFIRMA seul. Je n'ai pas relu leurs preuves. La note CERT-UA#20032 a été lue à la source : elle établit l'usage de Salat par UAC-0252, pas l'attribution à NyashTeam.
- Les 155 archives
.zipde release ont été analysées ; les 155 archives.rar(même contenu supposé, non vérifié) et le contenu des dépôts eux-mêmes n'ont pas été téléchargés. La version amont 1.9.9c n'a pas été comparée ligne à ligne. - Le stub du joiner a été relu pour sa structure ; le déroulé exact de ses lancements n'est pas reconstitué.
12. Détection
Douze règles YARA dans salatstealer.yar :
| Règle | Cible | Correspondances sur le corpus |
|---|---|---|
Salat_Stealer_Go_Unpacked |
Salat dépacké (symboles wsSess, getBC, decodeFromTonAddress) |
212 fichiers, dont les 204 dépackés |
Salat_Stealer_UPX_Packed |
PE 32 bits UPX de 2 à 4 Mo, confiance faible | 212 fichiers (les 204 builds UPX et 8 autres) |
Salat_Go_Loader_Ldflags |
Chargeurs Go (ldflags ou paquets stealth/uac) |
5 chargeurs ; le sixième est couvert par la règle d'URL |
Salat_Loader_Batch_Dropper, Salat_Trojanized_Zapret_Batch |
Script batch certutil de reconstruction | 76 fichiers distincts : les 75 scripts du tag et celui de l'archive d'origine (78 correspondances sur le disque, deux scripts du tag y figurant en double) |
Salat_Loader_GitHub_Release_URL |
Chargeurs Go dont l'URL de seconde charge est lisible, y compris le build garblé b00784d9 |
6 chargeurs |
Salat_Rust_Variant_Unpacked |
Salat réécrit en Rust, dépacké | 2 fichiers |
XBinder_NET_Dropper_Defender_Exclusion |
Binders .NET à ressources GZip et exclusion Defender, règle générique | 2 fichiers |
Salat_Python_RAT_Script_Extracted |
Script sc du RAT Python (à appliquer à l'entrée extraite) |
1 fichier |
Salat_Joiner_Stub_TgWsProxy |
Stub du joiner | 1 fichier |
Salat_Config_RSA_Module_Table |
Table obfusquée du module RSA qui signe la configuration (identique de mars à octobre 2026) | 294 fichiers (tous les Go Salat du corpus, dont les 76 anciens) ; aucun faux positif sur /usr/bin, /usr/lib, /opt |
Salat_Release_Package_GBZAP_Scripts |
Scripts .bat, .cmd et .ps1 du paquet piégé de release |
92 fichiers sur les 4 archives examinées (23 par archive : les 21 scripts .bat, defender_guard.cmd et wd_cache.ps1) ; Salat_Stealer_UPX_Packed se déclenche en outre sur les 12 copies de la charge dans bin/.wd/ |
Salat_Release_Package_Stun_Host |
stun.bin contenant la charge |
4 fichiers (un par archive) |
Salat_Pack_Marker_GBZAP |
Marqueur de fabrication de fin de fichier (chemin GitHub) | 193 builds distincts (358 fichiers avec les copies dépackées) |
Aucune correspondance sur /usr/bin, /usr/lib et /opt. Les autres signaux : exécution de certutil -decode vers %TEMP%\vcomp140.exe, fichiers updater_*.exe sous %LOCALAPPDATA%\Microsoft, exclusion Defender ajoutée juste après le premier lancement, résolutions et connexions vers les indicateurs de iocs.csv.
| Technique ATT&CK | Observation |
|---|---|
| T1585.003 Création de comptes | 55 comptes GitHub jetables créés par vagues |
| T1608.001 Mise en place de logiciel malveillant | Dépôts GitHub hébergeant des paquets piégés |
| T1204.002 Exécution par l'utilisateur | Paquet de contournement de blocage, outil de proxy Telegram ou « SoundCloud Unblock » piégés |
| T1036 Usurpation de nom | vcomp140.exe, svchost.exe, WindowsSecurity.bat, signature copiée sur un exehead NSIS |
| T1027.013 Fichiers chiffrés | Joiner à overlay AES-256-CBC, blobs ChaCha20-Poly1305 des chargeurs |
| T1105 Transfert d'outil | Seconde charge téléchargée depuis GitHub |
| T1140 Désobfuscation | certutil -decode, ChaCha20-Poly1305, zstd |
| T1548.002 Contournement de l'UAC | Relance en runas |
| T1562.001 Affaiblissement des défenses | Exclusion Windows Defender (variante stub) |
| T1497 Évasion de virtualisation | Contrôles mémoire et disque (selon l'option de compilation) |
| T1102 Service web comme C2 | Noms TON et passerelles publiques |
| T1071.001 Protocole web | HTTPS vers /sa1at/, WebSocket |
| T1555.003 Mots de passe de navigateurs | Chromium, Gecko, Yandex |
| T1056.001 Journalisation de frappes | startKeylogger |
| T1113, T1123 Écran, audio et vidéo | screenStream, webcam |
13. Reproduire l'analyse
Le détail pas à pas et les commandes sont dans runbook.md, les outils dans tools/. Les indicateurs sont dans iocs.csv, les recommandations dans remediation.md, les règles dans salatstealer.yar et la liste des comptes, canaux et portefeuilles dans comptes_et_canaux.md.