Introduction : qu’est-ce que le virus Linux/Moose?

Linux/Moose est une famille de maliciels qui s’attaquent principalement aux routeurs des internautes basés sur Linux. Sur son passage, le virus infecte aussi d’autres systèmes Linux embarqués. Les appareils contaminés servent à détourner les données non chiffrées du trafic sur le réseau et à relayer les services à l’opérateur du zombienet. En réalité, ils volent les témoins de connexion HTTP sur les sites de réseaux sociaux populaires pour accomplir leurs méfaits : « suivre », « visualiser » et « aimer » artificiellement ce qui s’y trouve.

En mai 2015, ESET a publié un livre blanc portant sur la famille de maliciels surnommée Linux/Moose. Après la publication du document, les serveurs de commande et de contrôle de Linux/Moose ont fait profil bas et nous avons perdu leur trace. Quelques mois plus tard, en septembre 2015, une version évoluée de Linux/Moose a refait surface, comme il fallait s’y attendre.

Depuis la dernière année, ESET et la boîte de sécurité informatique GoSecure ont uni leurs forces pour faire une enquête en profondeur sur le virus. De son côté, GoSecure a étudié la fraude sur les médias sociaux pour faire la lumière sur une toute nouvelle affaire, le « marché de l’ego », qui fait d’ailleurs l’objet d’un nouveau livre blanc publié par GoSecure. Dans ce billet de bogue, il est question des modifications techniques apportées aux différentes variantes de Moose, qui sont présentées dans notre livre blanc, et des versions apparues en septembre 2015.

Un virus sournois qui cache l’adresse du système de commande et de contrôle

Dès l’apparition de la nouvelle variante, nous avons découvert une chose : l’adresse IP ne se trouve plus dans le code binaire du système de commande et de contrôle. Il semblerait que les opérateurs, après avoir épluché notre rapport, aient décidé de nous compliquer quelque peu la tâche. Dans la dernière version, l’adresse IP prend la forme d’une ligne de commande chiffrée, comme le montrent les données de sortie ci-dessous :

Adresse IP prenant la forme d’une ligne de commande chiffrée

Il nous est donc plus possible d’exécuter nous-mêmes le code. Pour récupérer l’adresse IP, nos machines d’essai doivent être contaminées par un appareil embarqué infecté par le virus et qui prolifère sur le Web. Les lecteurs attentifs remarqueront l’architecture 32 bits de l’adresse IP.

L’adresse IP est cryptée, ce qui rend inutile le code binaire si l’on ignore la valeur désignée comme argument. À l’inverse, la valeur elle-même n’est d’aucune utilité si le binaire ne renvoie pas la bonne valeur pour déchiffrer l’argument. On lui attribue une fonction de disjonction exclusive à valeur statique, comme l’illustre le code suivant :

Données de sortie du décompilateur

Données de sortie du décompilateur

À notre connaissance, cette valeur n’a pas changé depuis les derniers mois. Voici un fragment de code Python servant à déchiffrer la valeur entière codée sur 32 bits du système de commande et de contrôle :

Décryptage de l’adresse IP du système de commande et de contrôle

Décryptage de l’adresse IP du système de commande et de contrôle

Le génome du virus : la transmission par réseau

Le nouveau protocole est différent, mais les couches supplémentaires mises à part, la base demeure la même. Jetons un coup d’œil au morceau de code provenant des deux extraits. Selon toute vraisemblance, la principale modification a été apportée au protocole binaire, qui s’affiche désormais en caractères ASCII imprimables. Sur le côté gauche de la figure 1 est présenté l’ancien protocole du réseau, tandis que le nouveau protocole apparaît du côté droit.

Figure 1 : Différences du nouveau protocole

Figure 1 : Différences du nouveau protocole

Dans l’ancien extrait, le serveur de commande et de contrôle transmettait la configuration au maliciel et comportait plusieurs champs (de bits, d’adresse IP, de répertoire de listes blanches et de listes de mots de passe) afin de déterminer les fonctions à activer. Dans la nouvelle version, ces champs sont divisés en trois clés (voir le tableau 1). Afin d’envoyer ces champs de configuration, l’opérateur utilise les en-têtes HTTP Cookie: et Set-Cookie:. Cette configuration est chiffrée à l’aide d’une simple boucle de disjonction exclusive comme dans la première version, mais, cette fois, la fonction ci-dessous permet de la crypter dans des en-têtes HTTP à caractères imprimables.

Données de sortie du décompilateur

Données de sortie du décompilateur

Le tableau 1 (tableau de valeur des clés) résume la configuration principale de la seconde version de Moose :

Package Name Hash Detection
goodish.weather CA2250A787FAC7C6EEF6158EF48A3B6D52C6BC4B Android/Spy.Banker.HH
goodish.weather A69C9BAD3DB04D106D92FD82EF4503EA012D0DA9 Android/Spy.Banker.HU
follon.weather F533761A3A67C95DC6733B92B838380695ED1E92 Android/Spy.Banker.HW

La clé PHPSESSID comprend la valeur chiffrée des champs de bits permettant d’activer ou de désactiver certaines fonctions de Moose (analyse locale ou externe, balayage ou fin du processus). La clé LP contient la liste de mots de passe. Cherchant toujours à se propager, Linux/Moose attaque Telnet par force brute pour lui subtiliser ses authentifiants. Cette liste a beaucoup changé; en 2015, il y figurait environ 300 connexions et mots de passe, contre 10 en 2016 (voir ci-dessous).

En 2015, il y figurait environ 300 connexions et mots de passe, contre 10 en 2016

La clé WL ouvre le répertoire de listes blanches. À son tour, la liste est passée de 50 adresses IP à 10. Celles-ci sont répertoriées à la section des indicateurs de compromission. Linux/Moose est toujours en mesure d’exécuter un service mandataire par la voie du port TCP 20012. La variante précédente empruntait la voie du port 10073. Grâce aux fonctionnalités mandataires, les adresses IP de la liste blanche peuvent interagir avec le maliciel.

Conclusion

De toute évidence, les auteurs de Linux/Moose ont déployé des efforts considérables pour continuer à opérer sans éveiller les soupçons. Dans sa nouvelle version, l’emplacement du serveur de commande et de contrôle est dissimulé, et le protocole du réseau a été modifié. Ainsi, Moose passe sous le radar des indicateurs de compromission publiés en 2015 dans le livre blanc d’ESET. En abrégeant le répertoire des listes blanches et la liste de mots de passe, le virus tente de passer inaperçu. Par ailleurs, le code binaire renferme certains indices trompeurs, comme un domaine factice (www.challpok.cn) apparaissant en texte clair dans la liste de chaînes, et même des noms de fichiers faussement apparentés à des tentatives de minage par bitcoin et à des attaques par déni de service. Il n’en demeure pas moins que Linux/Moose réside exclusivement dans la mémoire de l’appareil embarqué, qu’il suffit de redémarrer pour mettre fin à la menace.

Indicateurs de compromission

Empreintes numériques

Version 0x1F (31)

c6edfa2bf916d374e60f1b5444be6dbbee099692
c9ca4820bb7be18f36b7bad8e3044b2d768a5db8
5b444f1ac312b4c24b6bde304f00a5772a6a19a4
f7574b3eb708bd018932511a8a3600d26f5e3be9

Version 0x20 (32)

34802456d10efdf211a7d486f7108319e052cd17
0685cb1d72107de63fa1da52930322df04a72dbc
2876cad26d6dabdc0a9679bb8575f88d40ebd960
f94b6cc5aea170cee55a238eaa9339279fba962f
274ef5884cb256fd4edd7000392b0e326ddd2398
c3f0044ffa9d0bc950e9fd0f442c955b71a706b6
f3daea1d06b1313ec061d93c9af12d0fe746839a

Version 0x21 (33)

7767c8317fb0bbf91924bddffe6a5e45069b0182
1caac933ae6ca326372f7e5dd9fff82652e22e34
5dea6c0c4300e432896038661db2f046c523ce35
e8dc272954d5889044e92793f0f637fe4d53bb91
0843239b3d0f62ae6c5784ba4589ef85329350fa
1d1d46c312045e17f8f4386adc740c1e7423a24a
d8b45a1114c5e0dbfa13be176723b2288ab12907

Version 0x22 (34)

c35d6812913ef31c20404d9bbe96db813a764886

Adresses IP

Principaux serveurs de commande et contrôle

192.3.8.218
192.3.8.219

Liste blanche

155.133.18.64
178.19.111.181
151.80.8.2
151.80.8.19
151.80.8.30
62.210.6.34

Les indicateurs de compromission de Moose sont offerts et mis à jour dans le dépôt d’archives des indicateurs de compromission des codes malicieux GitHub d’ESET.