Les attaquants ont transformé des centaines de sites piratés exécutant le logiciel WordPress en serveurs de commande et de contrôle qui obligent les navigateurs des visiteurs à effectuer des attaques de piratage de mots de passe.
Une recherche sur le Web du code JavaScript qui effectue l’attaque a montré qu’il était hébergé sur 708 sites au moment où cet article a été publié sur Ars, contre 500 il y a deux jours. Denis Sinegubko, le chercheur qui a repéré la campagne, a déclaré à l’époque qu’il avait vu des milliers d’ordinateurs de visiteurs exécuter le script, ce qui les avait amenés à accéder à des milliers de domaines pour tenter de deviner les mots de passe des noms d’utilisateur possédant des comptes.
Des visiteurs recrutés involontairement
« C’est ainsi que des milliers de visiteurs sur des centaines de sites Web infectés tentent, sans le savoir et simultanément, de forcer brutalement des milliers d’autres sites WordPress tiers », a écrit Sinegubko. « Et comme les requêtes proviennent des navigateurs de vrais visiteurs, vous pouvez imaginer que filtrer et bloquer de telles requêtes constitue un défi. »
Comme les sites Web piratés hébergeant le JavaScript malveillant, tous les domaines ciblés exécutent le système de gestion de contenu WordPress. Le script, d’une taille de seulement 3 kilobits, atteint une getTaskURL contrôlée par un attaquant, qui à son tour fournit le nom d’un utilisateur spécifique sur un site WordPress spécifique, ainsi que 100 mots de passe courants. Lorsque ces données sont introduites dans le navigateur visitant le site piraté, celui-ci tente de se connecter au compte utilisateur ciblé à l’aide des mots de passe candidats. Le JavaScript fonctionne en boucle, demandant des tâches à getTaskURL, rapportant les résultats à completeTaskURL, puis exécutant les étapes encore et encore.
Un extrait du JavaScript hébergé apparaît ci-dessous, et en dessous, la tâche résultante :
const getTaskUrl = 'hxxps://dynamic-linx[.]com/getTask.php'; const completeTaskUrl = 'hxxps://dynamic-linx[.]com/completeTask.php'; …
[871,"https://REDACTED","redacted","60","junkyard","johncena","jewish","jakejake","invincible","intern","indira","hawthorn","hawaiian","hannah1","halifax","greyhound","greene","glenda","futbol","fresh","frenchie","flyaway","fleming","fishing1","finally","ferris","fastball","elisha","doggies","desktop","dental","delight","deathrow","ddddddd","cocker","chilly","chat","casey1","carpenter","calimero","calgary","broker","breakout","bootsie","bonito","black123","bismarck","bigtime","belmont","barnes","ball","baggins","arrow","alone","alkaline","adrenalin","abbott","987987","3333333","123qwerty","000111","zxcv1234","walton","vaughn","tryagain","trent","thatcher","templar","stratus","status","stampede","small","sinned","silver1","signal","shakespeare","selene","scheisse","sayonara","santacruz","sanity","rover","roswell","reverse","redbird","poppop","pompom","pollux","pokerface","passions","papers","option","olympus","oliver1","notorious","nothing1","norris","nicole1","necromancer","nameless","mysterio","mylife","muslim","monkey12","mitsubishi"]
Avec 418 lots de mots de passe mardi, Sinegubko a conclu que les attaquants essayaient 41 800 mots de passe sur chaque site ciblé.
Sinegubko a écrit :
Étapes d’attaque et cycle de vie
L’attaque se compose de cinq étapes clés qui permettent à un acteur malveillant d’exploiter des sites Web déjà compromis pour lancer des attaques distribuées par force brute contre des milliers d’autres sites de victimes potentielles.
- Étape 1 : Obtenir les URL des sites WordPress. Les attaquants explorent eux-mêmes Internet ou utilisent divers moteurs de recherche et bases de données pour obtenir des listes de sites WordPress cibles.
- Étape 2 : Extraire les noms d’utilisateur des auteurs. Les attaquants analysent ensuite les sites cibles et extraient les vrais noms d’utilisateur des auteurs qui publient sur ces domaines.
- Étape 3 : Injecter des scripts malveillants. Les attaquants injectent ensuite leur dynamique-linx[.]com/chx.js script vers des sites Web qu’ils ont déjà compromis.
- Étape 4 : informations d’identification par force brute. Lorsque les visiteurs normaux du site ouvrent des pages Web infectées, le script malveillant est chargé. En coulisses, les navigateurs des visiteurs mènent une attaque par force brute distribuée sur des milliers de sites cibles sans aucune implication active des attaquants.
- Étape 5 : Vérifiez les informations d’identification compromises. Les mauvais acteurs vérifient les informations d’identification forcées et obtiennent un accès non autorisé aux sites ciblés à l’étape 1.
Alors, comment les attaquants peuvent-ils réellement lancer une attaque distribuée par force brute à partir des navigateurs de visiteurs de sites Web totalement innocents et sans méfiance ? Examinons l’étape 4 plus en détail.
Étapes d’attaque par force brute distribuée :
- Lorsqu’un visiteur du site ouvre une page Web infectée, le navigateur de l’utilisateur demande une tâche au hxxps://dynamique-linx[.]com/getTask.php URL.
- Si la tâche existe, elle analyse les données et obtient l’URL du site à attaquer ainsi qu’un nom d’utilisateur valide et une liste de 100 mots de passe à essayer.
- Pour chaque mot de passe de la liste, le navigateur du visiteur envoie le wp.uploadFichier Demande d’API XML-RPC pour télécharger un fichier avec les informations d’identification chiffrées qui ont été utilisées pour authentifier cette demande spécifique. Cela représente 100 requêtes API pour chaque tâche ! Si l’authentification réussit, un petit fichier texte avec des informations d’identification valides est créé dans le répertoire de téléchargement WordPress.
- Lorsque tous les mots de passe sont vérifiés, le script envoie une notification à hxxps://dynamique-linx[.]com/completeTask.php que la tâche avec un spécifique ID de tâche (probablement un site unique) et ID de contrôle (lot de mots de passe) est terminé.
- Enfin, le script demande la tâche suivante et traite un nouveau lot de mots de passe. Et ainsi de suite indéfiniment tant que la page infectée est ouverte.
Mardi, le chercheur avait observé « des dizaines de milliers de requêtes » adressées à des milliers de domaines uniques vérifiant les fichiers téléchargés par les navigateurs des visiteurs. La plupart des fichiers ont signalé des erreurs Web 404, indiquant que la connexion à l’aide du mot de passe deviné a échoué. Environ 0,5 % des cas ont renvoyé un code de réponse 200, laissant ouverte la possibilité que la tentative de deviner le mot de passe ait réussi. Après une inspection plus approfondie, un seul des sites a été compromis. Les autres utilisaient des configurations non standard qui renvoyaient la réponse 200, même pour les pages qui n’étaient pas disponibles.
Au cours d’une période de quatre jours se terminant mardi, Sinegubko a enregistré plus de 1 200 adresses IP uniques qui tentaient de télécharger le fichier d’informations d’identification. Parmi celles-ci, cinq adresses représentaient plus de 85 % des demandes :
IP | % | ASN |
146.70.199.169 | 34,37% | M247, RO |
138.199.60.23 | 28,13% | CDNEXT, GB |
138.199.60.32 | 10,96% | CDNEXT, GB |
138.199.60.19 | 6,54% | CDNEXT, GB |
87.121.87.178 | 5,94% | SOUZA-AS, BR |
Le mois dernier, le chercheur a observé l’une des adresses, 87.121.87.178, hébergeant une URL utilisée dans une attaque de cryptojacking. Une possibilité de changement est que la campagne précédente a échoué parce que l’URL malveillante sur laquelle elle s’appuyait n’était pas hébergée sur suffisamment de sites piratés et, en réponse, le même attaquant utilise le script de craquage de mot de passe pour tenter de recruter davantage de sites.
Comme le souligne Sinegubko, la campagne la plus récente est importante car elle exploite les ordinateurs et les connexions Internet de visiteurs involontaires qui n’ont rien fait de mal. Une façon pour les utilisateurs finaux d’arrêter cela consiste à utiliser NoScript ou un autre outil qui bloque l’exécution de JavaScript sur des sites inconnus. NoScript détruit suffisamment de sites pour ne pas convenir aux utilisateurs moins expérimentés, et même ceux qui ont plus d’expérience trouvent souvent que les tracas n’en valent pas la peine. Un autre remède possible consiste à utiliser certains bloqueurs de publicités.