Nouveau malware VVS Stealer cible les comptes Discord via un code Python obfusqué
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
VVS Stealer est un nouveau logiciel malveillant d’exfiltration d’informations basé sur Python et vendu sur Telegram. Il est obscurci avec Pyarmor, empaqueté avec PyInstaller et persiste via le dossier de démarrage de Windows. Le malware récolte les jetons Discord, les identifiants des navigateurs, les cookies, l’historique, les mots de passe et les captures d’écran. Il peut également injecter un charge utile JavaScript malveillant pour détourner les sessions Discord actives.
Enquête
Palo Alto Networks Unit 42 a révélé le logiciel malveillant, notant qu’il est proposé à la vente depuis avril 2025. Les chercheurs ont décrit sa technique d’obscurcissement, son modèle de distribution et ses fonctionnalités, y compris le vol d’identifiants et l’injection sur Discord. Le rapport lie l’outil à des acteurs menaçants francophones actifs dans des groupes Telegram axés sur les stealer.
Atténuation
Les organisations devraient surveiller les exécutables PyInstaller inconnus et les raccourcis inattendus dans le dossier de démarrage. Déployer des règles de détection de points de terminaison pour les scripts Python obscurcis et les charges utiles JavaScript suspectes. Appliquer l’authentification multi-facteurs pour les comptes Discord et de navigateurs et limiter les privilèges administratifs qui pourraient être abusés pour récolter des identifiants.
Réponse
Si VVS Stealer est détecté, isoler le point de terminaison affecté, collecter la mémoire et les artefacts de fichiers, et extraire les IOC. Supprimer l’entrée de démarrage malveillante, terminer tous les processus Discord injectés et forcer une réinitialisation des mots de passe pour les comptes compromis. Mener une enquête médico-légale complète pour trouver des identifiants volés supplémentaires et assurer que l’infrastructure C2 à distance est bloquée.
Flux d’attaque
Détections
Fichier Python créé dans un répertoire inhabituel (via file_event)
Voir
Abus possible de Discord comme canal C2 (via dns_query)
Voir
Abus possible de Discord comme canal C2 (via proxy)
Voir
Binaire / scripts suspects dans l’emplacement de démarrage (via file_event)
Voir
Utilisation possible de PyInstaller (via file_event)
Voir
Package VVS Stealer PyInstaller et terminaison de Discord [Création de processus Windows]
Voir
Exécution de simulation
Prérequis : la vérification préliminaire de télémétrie et de référence doit avoir été réussie.
Justification : Cette section détaille l’exécution précise de la technique d’adversaire (TTP) conçue pour déclencher la règle de détection. Les commandes et le récit DOIVENT refléter directement les TTP identifiés et viser à générer exactement la télémétrie attendue par la logique de détection. Des exemples abstraits ou non liés mèneront à un diagnostic erroné.
-
Narratif d’attaque et commandes :
L’adversaire a compromis un compte utilisateur à faible privilège sur un poste de travail Windows. À l’aide d’un outil de téléchargement PowerShell, ils lancent un exécutable malveillant empaqueté avec PyInstaller (VVS_Stealer.exe) qui génère d’abord un processus avec la ligne de commande contenant la chaîne “PyInstaller”. Le payload ensuite force la terminaison du client Discord en cours d’exécution pour préparer une étape d’injection de vol de jeton. Toutes les actions se déroulent dans le contexte de l’utilisateur actuel, générant un seul Événement de création de processus qui correspond aux critères de la règle.Étape par étape :
- Copier le paquet PyInstaller malveillant dans
%TEMP%. - L’exécuter avec une ligne de commande qui inclut explicitement le mot “PyInstaller”.
- Le binaire malveillant appelle en interne
taskkill /IM Discord.exe /Fpour terminer Discord. - La terminaison génère un Événement de création de processus événement où le champ
Imagerésout le chemin de l’exécutable Discord (C:Users<user>AppDataLocalDiscordapp-... Discord.exe) et la ligne de commande d’origine contient encore “PyInstaller”.
- Copier le paquet PyInstaller malveillant dans
-
Script de test de régression : Le script PowerShell suivant reproduit exactement la télémétrie nécessaire pour déclencher la règle de détection. Il évite intentionnellement toute charge utile malveillante réelle ; à la place, il lance un processus
notepad.exeinoffensif mais prétend être un exécutable empaqueté avec PyInstaller en incorporant le mot-clé dans la ligne de commande. Il termine également tout processus Discord en cours d’exécution pour simuler la condition « Image se termine par Discord.exe ».# ------------------------------------------------- # Script de simulation – Déclenche la règle Sigma #f63685c4‑feea‑431b‑a749‑55cf8661e6ac # ------------------------------------------------- # 1. S'assurer que Discord est en cours d'exécution (facultatif, pour garantir la terminaison) $discordPath = "$env:LOCALAPPDATADiscordapp-1.0.9005Discord.exe" if (-Not (Get-Process -Name "Discord" -ErrorAction SilentlyContinue)) { Start-Process -FilePath $discordPath -WindowStyle Hidden Start-Sleep -Seconds 5 } # 2. Lancer un processus factice avec "PyInstaller" dans sa ligne de commande. # Utilisation de notepad.exe comme espace réservé bénin. $dummyCmd = "C:WindowsSystem32notepad.exe" $cmdLine = "PyInstaller_dummy_execution -run $dummyCmd" Start-Process -FilePath $dummyCmd -ArgumentList $cmdLine -WindowStyle Hidden Write-Host "[+] Processus factice lancé avec le mot-clé PyInstaller." # 3. Terminer immédiatement Discord pour générer l'événement Discord.exe image. if (Get-Process -Name "Discord" -ErrorAction SilentlyContinue) { Stop-Process -Name "Discord" -Force Write-Host "[+] Discord.exe terminé." } # 4. Optionnel : Nettoyer la fenêtre factice de notepad après un court délai. Start-Sleep -Seconds 8 Get-Process -Name "notepad" -ErrorAction SilentlyContinue | Stop-Process -Force Write-Host "[+] Nettoyage terminé." -
Commandes de nettoyage : Assurez-vous qu’aucun processus résiduel ne reste.
# Supprimer tous les processus factices notepad en cours Get-Process -Name "notepad" -ErrorAction SilentlyContinue | Stop-Process -Force # Redémarrer Discord si nécessaire pour la continuité post-test $discordPath = "$env:LOCALAPPDATADiscordapp-1.0.9005Discord.exe" if (-Not (Get-Process -Name "Discord" -ErrorAction SilentlyContinue)) { Start-Process -FilePath $discordPath Write-Host "[+] Discord redémarré pour les opérations normales." }