Les managers de webshells
Écrit par Xylitol – Juin 2025
Note importante avant de commencer :
Le contenu qui suit s’adresse à un public disposant déjà de certaines compétences techniques en reverse engineering,
en analyse binaire et en utilisation d’outils comme x64dbg.
Ce tutoriel n’est pas une initiation aux bases du reverse, mais un parcours technique détaillé destiné à ceux qui
souhaitent approfondir leur compréhension de la rétro-ingénierie dans un contexte de sécurité défensive.
Le but est de documenter des techniques utilisées par les attaquants pour aider les défenseurs à mieux anticiper,
comprendre et piéger ces comportements dans le cadre d’un projet de honeypot.
Toutes les manipulations décrites ici sont menées dans un but d’étude et de recherche en cybersécurité. Ce
document ne constitue en aucun cas une incitation à contourner des protections logicielles à des fins malveillantes.
1.a: Introduction
Pour tester la résilience de notre honeypot face à des attaques automatisées, nous nous sommes
mis à la recherche d'outils de gestion de backdoors web couramment utilisés par les attaquants.
« Shell Enslaver » est une application PHP destinée à centraliser et piloter des webshells déployés sur des serveurs
compromis. L'interface épurée permet à l'attaquant de facilement ajouter ou importer des webshells. Il est ensuite possible de
sélectionner des webshells afin d'exécuter des commandes, d'uploader des fichiers, de vérifier la validité des backdoors ou
encore d'utiliser des modules complémentaires comme :
- « Framer » : pour l'injection d'iframes malveillantes
- « Htaccess » : pour la manipulation des règles de redirection
- « Domain Searcher » : pour l'exploration de domaines liés à l'hôte compromis

1.b: WSO Shell Manager, un outil malveillant techniquement abouti
En poursuivant nos recherches de hacktools, nous avons identifié « WSO Shell Manager ». Cet outil payant, développé pour
Windows par un russe, se distingue par son interface graphique soignée, des fonctionnalités avancées, et une logique
d'industrialisation d'attaques à grande échelle. WSO est vendu via des forums russes orientés vers des pratiques illicites de
Search Engine Optimisation, ce qui suggère une utilisation fréquente dans des campagnes malveillantes ciblant des sites
web ayant un fort trafic pour du détournement ou de la monétisation ( BlackSEO, redirections sauvages, hébergements de
contenus illicites, etc. ).
Voici une capture d’écran de l’annonce de vente du produit:

En 2014, son prix était fixé à 2500 WebMoney Rubles soit ~$55–60 dollars américains, ce qui n'était pas très onéreux. Le
premier message de la mise en vente sur ce forum remonte au 4 août 2014, en étant déjà à la version 5 du produit. Le dernier
message de l'auteur pour annoncer la version 10.45 date du 17 août 2023. Durant 9 ans, cet outil à un prix attractif a sû
évoluer et s'est rapidement professionnalisé grâce à un développement actif ce qui explique sa popularité.

2: Obtenir une copie de l'outil
En 2025, WSO n'est plus en vente sur les principaux black markets et l'auteur ne semble plus participer aux forums. L'outil
était aussi vendu sur shwrk.ru
, avec d'autres produits. Nous obtenons une copie du site web de l'auteur en cherchant sur
WaybackMachine. Une recherche avec le nom de domaine sur VirusTotal nous donne du grain à moudre. En effet, une URL
mentionne la présence de l'archive « wso8.zip ».

Quelqu'un en Russie a aussi scanné un fichier « wso.exe » en aout 2023, peu de temps après la sortie de la v10.45. Selon le
rapport VirusTotal, il s'agit de la v10.45.0.0 et il est interessant de noter qu'il y a communication avec auth.shwrk.ru
. C'est
possiblement ce que l'on cherche.

Ci-dessous, les signatures SHA-1 correspondantes:
- ws8.zip: b5232c91b3fe535bffa07dae5aa64bdbd066066e
- wso.exe: d632e2c75c951b9e3a9a2987686cc42b37330a49
3: Présentation rapide des fichiers récupérés
Ci-dessous, les fichiers présents dans l'archive « ws8.zip »

Ces fichiers sont en lecture seule dans l'archive. Les plus récents sont datés de 2020. Parmi eux, « wso8.exe » dont les
propriétés indiquent que la version du fichier est v9.29 et que la date de modification remonte au 27 août 2020.

S'attarder sur les fichiers « history.txt » et « history_en.txt » semble inutile car les dates de modifications remontent à 2017
donc ces fichiers ne sont pas à jour contrairement à « history_ru.txt » qui indique quant à lui la version 9.29 du 27 août
2020.
À l'époque, l'auteur présentait la version 9.29 en indiquant qu'elle datait du 27 août 2020.

Parmi les fichiers de l'archive, la présence de « wso.chm » : un guide complet rédigé en russe détaillant comment prendre en
main le produit.

Le fichier « wso_en.csv » est utilisé par le programme pour basculer de la langue russe à l'anglais, ce qui laisse sous-
entendre que WSO Shell Manager n'est pas exclusivement vendu a des russophones. Le fichier « iptocountry.csv » est une
base de données hors-ligne d'adresses IPv4 servant à la géolocalisation. Les deux librairies Windows « ssleay32.dll » & «
libeay32.dll » sont sans doute là pour la compatibilité SSL du programme lors des communications via le protocole HTTPS.
« bouncer » est un binaire linux au format ELF, et « miniBrowser.exe » est sans doute un sous composant de « wso8.exe »
Voilà globalement à quoi ça doit ressembler. À présent il n'y a plus qu'à extraire l'archive dans un dossier en plaçant notre «
wso.exe » en version 10.45.

Bon ok, c'était prévisible surtout que auth.shwrk.ru
ne réponds même plus.

4.a: Cracking - La liste d'outils
À l'exécution du programme, il y a une authentification en ligne et celle-ci ne fonctionne plus.
On va donc installer les outils ci-dessous et s'en servir correctement pour contourner tout ça:
- x64dbg (
https://x64dbg.com/
) - DiE (
https://horsicq.github.io/
)
4.b: Cracking - Unpacking de MPRESS
Commençons par inspecter « wso.exe » en le scannant avec DiE
DiE détecte une couche de MPRESS en version 2.19 et aussi des traces qui laisseraient penser que l'outil a été codé en
Delphi, à moins que cela ne soit le packer MPRESS qui provoque ce faux positif.

Sur l'interface DiE, si l'on clique à droite pour cocher « Advanced » et que l'on regarde l'entropie, on observera sous les
sections .MPRESS1
& .MPRESS2
que le diagramme de l'entropie nous confirme clairement que l'exécutable est compressé.

Il va donc falloir commencer par unpacker MPRESS.
Et pour se faire, nous utiliserons x32dbg / x64dbg
Lancer x32dbg / x64dbg puis faire glisser « wso.exe » sur l'interface afin de le charger.
Au chargement de « wso.exe », vous serez automatiquement positionné sur le point d'entrée (EntryPoint) de l'application
c'est à dire sur l'instruction « PUSHAD
». À ce moment là, appuyer sur la touche F8
, ou bien utiliser l'icône « Step over ». Si
vous avez correctement effectué cette tâche, vous devriez être positionné sur l'instruction « CALL ». À ce moment là, dans
la fenêtre des Registres située à droite envoyer la valeur du registre ESP (soulignée en jaune sur l'image) dans la fenêtre de
la vue hexadécimale. Sélectionner ensuite les 4 premiers octets puis faire un clique droit afin de poser un point d'arrêt
matériel en accès sur ce Dword (voir capture d'écran). Cette manipulation va permettre de s'arrêter lorsque MPRESS va finir
de décompresser et donc de déposer l'adresse de l'Original Entry Point à cet emplacement mémoire.

Appuyer sur F9 pour lancer l'exécution, le débugger va s'arrêter automatiquement comme sur cette image.

Appuyer encore une fois sur F8 ( ou bien F7 ). Félicitations! MPRESS est derrière nous. Vous êtes maintenant sur le point
d'entrée d'origine (OEP). Il n'y a plus qu'à réaliser un Dump, c'est à dire une extraction mémoire du programme. Pour cela,
appuyer sur CTRL+I
, ou bien depuis le menu « Plugins » lancer « Scylla ».

Nous allons d'abord saisir l'OEP sur l'interface de Scylla afin que celui-ci puisse faire fonctionner correctement sa
fonctionnalité de recherche automatique. Cliquer maintenant sur le bouton « IAT Autosearch ». Une boîte de dialogue
s'affiche à l'écran indiquant que des valeurs ont été trouvées en indiquant les Relative Virtual Address.
Fermer la boîte de dialogue puis cliquer sur le bouton « Get Imports » pour permettre à Scylla d'extraire la table des imports
depuis la mémoire via toutes ces nouvelles informations.
Cliquer ensuite sur le bouton « Show Invalid » et « Show Suspect » pour afficher les entrées problématiques ou douteuses.
Si vous ne savez pas comment corriger, supprimer manuellement ces valeurs afin d'assurer l'intégrité du fichier final.

Une fois que les entrées problématiques sont corrigées / supprimées, cliquer sur le bouton « Dump » pour sauvegarder une
copie mémoire de l'exécutable. Une fois le dump créé, cliquer sur le bouton « Fix Dump » pour corriger les anomalies
restantes dans les sections. Enfin, cliquer sur le bouton « PE Rebuild » pour reconstruire les entêtes PE du fichier (sections,
alignements, champs manquants, etc.) afin de rendre ce Portable Exécutable pleinement fonctionnel et compatible avec les
outils d'analyse statique.

Et voilà, bien joué. Maintenant décompressé, vous noterez que le poids est plus imposant. Le fichier fait 76.5 Mo tandis qu'il
faisait 15.8 Mo quand il était packé par MPRESS :o

Si vous repassez l'exécutable dans DiE, vous observerez une entropie un peu plus classique désormais

Côté VirusTotal, si l'on scan notre exécutable décompressé, celui-ci n'a pas pris beaucoup plus de détections, avec un résultat à 7/71.
- wso_dump_SCY.exe: 204b8546766bcdc21879620dbadef750f8407ff5
4.c: Cracking - Dans le vif du sujet
Désormais nous pouvons débugger convenablement. Charger votre exécutable de 76 Mo dans x32dbg / x64dbg. Effectuer
ensuite un clic droit afin de chercher les références à des chaînes dans le module courant.

On va rechercher une partie du message que nous avions lorsque nous avons tenté d'exécuter sans succès le programme.
Dans la barre de recherche de la fenêtre des références, saisir « Authorization failed »
Il y a 2 resultats pour cette chaîne de caractères:
"Authorization failed!\n\nTry again later if the problem persists, contact us by email: support@shwrk.ru\n" "Authorization failed!\n\nThe daily binding limit has expired. You can run the program in 0.00 (UTC + 3)\n"
On va uniquement cliquer sur la première chaîne qui contient le « Try again later » car la deuxième ne nous intéresse pas.
Une fois à l'emplacement où il y a une référence à cette chaîne, on va se positionner au début de la procédure, à savoir sur lePUSH EBP
puis on va chercher toutes les références vers l'adresse sélectionnée c'est à dire pour savoir d'où l'on vient et par
quel moyen.

Lucky! Cette procédure n'est appellée que par un seul CALL
.
Allez hop petits chanceux, on clique dessus pour l'explorer.

On arrive sur une plus grande procédure alors on va d'abord noter d'où l'on vient avec un point d'arrêt avec la touche F2 ainsi
qu'un commentaire pour identifier l'appel (CALL) de la procédure que l'on veut éviter.

En remontant, un peu plus haut dans la procédure, on remarque des références à la chaîne de caractères « wso.key » On va
poser un point d'arrêt avec la touche F2
un peu plus haut sur le Jump if Not Equal puis on va lancer le debug avec la toucheF9
. On va laisser le débugger arrêté sur notre point d'arrêt pendant quelques temps afin de se concentrer tranquillement à
tracer cette procédure.

À force de tests, on en déduit des chemins logiques ( voir capture d'écran ci-dessous ). Par exemple, quand on obtient le
message de refus, on arrive systématiquement sur le second jump via le « vilain » CALL 0x0070E5E0
et celui-ci nous emmène
plus haut dans la procédure pour au final redescendre dans l'appel vers « Authorization failed » qui mène directement vers la
porte de sortie via un appel à l'API GetCurrentProcessId
suivi d'un TerminateProcess
.
En revenche, le JMP du dessus quant à lui va sauter tout ça par conséquent on a plutôt intérêt à atterrir dessus. Si l'on est sur
le JMP dans dessous, on va redéfinir notre origine sur le jump du dessus pour pouvoir continuer. Pour ne plus tomber sur le
« vilain » CALL 0x0070E5E0
on va le patcher par des NOPs.

On poursuit le traçage jusqu'à rencontrer ce Jump if Not Equal. Celui-ci doit être absolument pris sinon un second message
de refus en lien avec une autorisation échouée pour cause d'expiration s'affiche.

On continue de tracer et cette fois on découvre une procédure de vérification de mise à jour d'exécutable ce qui ne constitue
pas un obstacle en soit. Puis on arrive devant des sauts conditionnels. Il faut prendre le Jump if Equal et ne surtout pas
sauter avant au risque de finir dans une procédure qui va nous renvoyer en échec.

Pour changer l'état du flag de votre saut conditionnel, vous pouvez jouer avec ZF dans la fenêtre de registre

On va faire la même chose ici et forcer le JE pour prendre le saut.

On continue à tracer, puis le splash screen arrive

À ce stade, on va directement appuyer sur la touche F9
. Une fenêtre s'affiche avec un champs de saisie, ne sachant pas quoi
mettre, on va s'abstenir et cliquer sur le bouton « Cancel ».

L'interface graphique intitulée « Shell Manager » s'affiche à l'écran.

On sauvegarde notre version modifiée dans x32dbg / x64dbg et on arrive à la fin de ce petit tutoriel de reverse et
d'introduction au manager de backdoors web.
- wso_dump_SCY_patched.exe: 02e720393c3ce80600293f442b6adb83ff08330c
5: Un p'tit truc en plus
L'auteur de ce programme a aussi programmé un outil pour automatiquement exploiter les CMS Wordpress.
Le schéma de protection de son programme fonctionne de la même manière.

- up.zip: 1aa1d6e038b593dbda81333ae53e2af74c787d2a
- ShellUploader.exe: 003ae70051051f80384286076d0e66024d8d5c1c
- ShellUploader_patch.exe: 8c84dbc42b0c980808b449330a7168d68f3ddd7e
Après un rapide test en local contre la derniere version de WordPress (v6.8.1 du 6 mai 2025)
L'outil fonctionne toujours très bien.

6: La chute de WSO Shell Manager
En juillet 2023, la dernière mise à jour de WSO Shell Manager (version 10.45) est publiée. Peu après, l'auteur disparaît
soudainement des forums russes où il vendait son produit. Cette absence restera inexpliquée jusqu'à l'été 2024.
En août 2024, un jugement du tribunal de Moscou révèle que R.Y. Suvorov, développeur de WSO Shell Manager
et administrateur du site shwrk.ru, a été condamné à 1 an et 6 mois de restriction de liberté pour la distribution d'un programme
malveillant permettant la modification, la suppression et la copie non autorisée de données informatiques.
Le 26 octobre 2023, dans le cadre d'un piège tendu par les services du FSB, un agent infiltré achète le logiciel via Telegram.
Suvorov, utilisant le pseudonyme @shwrkru, envoie le programme, une clé d'activation et une vidéo explicative en échange
d'un paiement sur son compte personnel.
Le tribunal a également ordonné des restrictions de déplacement ainsi qu'une obligation de pointage mensuel. Plusieurs
appareils ont été saisis, mais la décision de leur destruction a été annulée en appel pour vice de procédure.
Suvorov a reconnu les faits, coopéré avec les autorités et bénéficié de circonstances atténuantes (père de deux enfants, aucun
antécédent judiciaire, soutien de famille).
Référence: Апелляционное постановление Московского городского суда от 13 августа 2024 г. по делу № 10-16751/2024
https://base.garant.ru/341853179/
7: Conclusion
À l’origine, notre objectif était simple: identifier des outils utilisés dans la gestion de webshells afin d’améliorer le réalisme de notre honeypot.
Mais comme souvent dans ce type de projet, le chemin prévu dévie.
L’outil que nous avons trouvé, WSO Shell Manager, s’est révélé à la fois obsolète et verrouillé par une authentification en ligne... devenue inopérante.
Il a donc fallu en venir au reverse engineering pour contourner ces protections logicielles.
Ce processus, loin d’être anecdotique, illustre à quel point les projets liés aux honeypots exigent une diversité de compétences:
de l’analyse malware, au reverse engineering, jusqu’à la compréhension des outils offensifs réels.
C’est aussi là que l’aspect collectif prend tout son sens: faire partie d’un hackerspace comme Hackgyver permet de s’appuyer sur des membres aux expertises variées
reverse, dev, infra, analyse etc.. Pour faire avancer ce genre de projet qui dépasse très vite le cadre initial.
Au final, on ne se contente pas de "piéger" un attaquant: on comprend ses outils, ses méthodes, et on conçoit un honeypot capable d’y répondre avec précision.
Et dans cette histoire, une chose est claire: même en Russie, le développement et la vente d’outils malveillants peuvent mener à des poursuites pénales.
⚠️ Attention : cette archive contient des échantillons de fichiers malveillants destinés à l’analyse en environnement contrôlé.
L'archive ZIP est protégée par un mot de passe lors de l’ouverture : infected