Vous allez voir concrètement le genre de code malveillant que l'on peut retrouver dans certain site Internet. J'ai découvert ce code lors d'un audit de sécurité sur un site wordpress en début de semaine suite à une mission pour un prospect. Cet article va être légèrement technique, car on va aller jusqu’à l'analyse du code malveillant.
Comment le code a-t-il été introduit sur le site ?
Pour commencer le client a été alerté par son prestataire qui souhaite lancer une campagne adwords. Adwords a rejeté la campagne en prétextant la présence d'un virus sur le site Internet en question. Alerté la personne nous a contactées. Première chose inquiétante pas d'indication dans Google avec la requête "site:domaine-du-site-infecte.com" comme quoi le site pourrait endommager votre ordinateur... Par contre Kaspersky a immédiatement affiché de grosses alertes bien rouge pour signaler un souci sur le site en question.
Le code avait été ajouté dans les pages du site Internet directement via l'interface d'administration. En fait le pirate a réussi à deviner le mot de passe d'un utilisateur avec des droits "éditeurs" et à ajouter son code malveillant à la fin des pages en question. Il l'a fait sur 19 pages rien que ça ! Bien entendu il l'a ajouté sur la page d'accueil et les pages principales du site. L'attaque était en place depuis juillet 2016 !
Le code en question dans le site
Dans la capture suivante vous pouvez voir une partie du code source du script qui a été ajouté dans le site :
On est donc sur une attaque en "XSS persistent" avec une particularité que je n'avais pas encore trouvé. On vois que l'attaquant utilise la technique classique du "fromCharCode" pour masquer ces fonctions malveillantes. Mais il a ajouté une jolie option en ne mettant pas directement le charCode demandé. En effet il pourrait avoir un filtre défensif qui serait sensible au "fromcharCode(10,118,etc.".
Petit rappel en javascript la fonction String.fromCharCode( INT ) va retourner un caractère ASCII en fonction du nombre passé en référence. Par exemple pour afficher un A il suffit de faire :
alert(String.fromCharCode(65));
Pour vous amuser si vous le souhaitez-vous trouverez une table ascii à cette adresse : http://www.asciitable.com/
L'attaquant avait posé deux codes les un à la suite des autres. Donc pour comprendre son attaque il faut "désobfusquer" les deux scripts. Je ne mets volontairement pas les codes malveillants en entier, il ne faudra pas que cela donne des idées à certains.
Désobfuscation du code en question
Pour pouvoir comprendre le code en question il faut prendre des précautions. Tout d'abord, le code orignal est stocké dans un fichier txt dans un répertoire qui n'est pas utilisé par un serveur web. Pour plus de sécurité toutes les sorties des fichiers seront elles aussi stockées dans des fichiers txt. Le but étant de limiter l’exécution par inadvertance du code et de se retrouver infecté. Même si le risque est faible Kaspersky veillant visiblement bien au grain sur l'attaque en question.
Première étape transformer cette longue très longue suite de chiffre en en texte compréhensible. Pour ce faire j'ai fait un petit bout de code en PHP ultra simple que vous pouvez trouver ici : gitHub qui va en fait réaliser toutes les étapes pour nous.
Donc voici le code en question :
Le code va juste dans un premier temps faire les soustractions et ensuite faire la conversion pour chaque du nombre vers la lettre. Ce qui va donner pour résultat sur la première partie du code malveillant ceci :
A première vue il reste encore au moins une étape avant de pouvoir comprendre exactement ce que fait l'attaque. Mais avant regardons la seconde partie de l'attaque on pourrait en apprendre plus. La seconde partie est en fait :
Pas vraiment de différence sauf deux choses. Tout d'abord, la clé n'est pas la même et la longueur du payload est plus grande dans le second cas. Ce qui est sympathique c'est que l'on a la fonction javascript pour rendre actif le code. Pour ne pas prendre de risque je l'ai donc retranscrite en PHP ce qui donne l'élément suivant :
Grace à cela on va pouvoir essayer de voir ce qui se cache vraiment dans ces scripts malveillants. Pour faire simple le décryptage est simple il faut décoder le base64 puis en fonction de la taille de la chaîne décodée et de la longueur de la clé il va venir faire un XOR sur deux valeurs. La fonction ord() est utilisé pour donner le nombre correspondant aux caractères ascii si on fait :
//il va afficher 65.
echo ord('A');
Alors qu'est-ce que cela a bien pu nous afficher comme résultat. En fait les fichiers extraits sont deux codes javascript qui vont être exécutés. Voici une capture partielle des deux codes :
Que fait le premier fichier JS ?
Ce qui m'a surpris lors de l'audit c'est que Google ne marque pas le site comme malveillant... En fait le code javascript désactive le virus si jamais c'est un bot de Google qui visite le site pour l'indéxer. Du coup Google ne voit pas la charge malveillante et laisse les internautes se faire prendre au piège. Très malin et inquiétant aussi je dois bien l'avouer.
Une fois terminée il va ajouter un cookie sur le navigateur et rediriger l'internaute vers le domaine paramétré au début. Vue l'adresse il y a fort à parier qu'un fichier index.php va s'activer pour véroler la machine de l'internaute.
Que fait le second fichier JS ?
Tout comme le premier fichier JS le second masque l'attaque à Google pour ne pas se faire détecter et ainsi agir le plus longtemps possible.
Une fois qu'il a fini de contrôler que l'on est pas un bot il va appeler une liste de domaine définie et voir si les scripts malveillants sont toujours disponibles, on remarquera la présence d'un site en .fr notamment. S'il a une réponse favorable il va alors choisir le dernier ayant répondu qu'il était disponible pour rediriger plus tard l'internaute vers cette page malveillante. Dans le même temps le virus affiche une popup sur le navigateur de la cible avec un bouton rouge "Continue" au clic sur ce bouton l'internaute et redirigé vers une page contenant un virus. Fin de partie pour l'internaute.
Pour dire que le pirate a poussé le vice il ajoute un cookie sur le PC de l'internaute pour ne pas l'infecter deux fois. Afin surtout de ne pas être détecté par les anti-virus et pouvoir rester installer sur la machine de l'internaute.
Conclusion
Un joli code malveillant qui montre une fois encore que la sécurité est un tout et nous concerne tous. Car sans la possibilité pour l'attaquant d'avoir ces codes malveillants stocké sur des sites tiers, cette attaque ne fonctionnerait pas. Donc même si vous pensez que votre site n'intéresse pas directement les pirates vous vous trompez.
Crédit photo : Conçu par Freepik