Il semble y avoir une récente recrudescence d’utilisateurs qui se plaignent sur divers forums que leurs appareils intégrés sont surchargés de tâches de calcul et de réseau. Ce que ces publications particulières ont en commun, c’est qu’elles attribuent toutes le problème au même processus. Celui-ci s’exécute à partir d’un répertoire temporaire et se dissimule dans une partie du cadre d’application Java, qui s’appelle « .javaxxx ». D’autres noms de processus, comme « .swap » ou « kworker », sont aussi utilisés. Il y a quelques semaines, nous avons discuté des récents incidents liés à Mirai et des problèmes de sécurité des appareils Mirai connectés de l’IdO dans l’article The Hive Mind: When IoT devices go rogue, et tout ce qu’on y décrit est toujours vrai.

Point d’attaque

L’attaque se réalise à l’aide de tentatives de connexion SSH en force, et son mode d’opération ressemble à celui de nombreux vers Linux, dont Linux/Moose (qui se propage en s’attaquant aux connexions Telnet) – dont on a aussi parlé ici, comme le rapportent les analyses d’ESET depuis l’année passée. Parmi les cibles, on trouve des appareils et des serveurs intégrés munis d’un port SSH protégé par un mot de passe très faible. L’objectif de ce cheval de Troie est évident : dresser une liste d’appareils non sécurisés afin de créer un réseau zombie formé du plus grand nombre d’appareils piratés possibles. Le balayage commence par une liste plus ou moins complète d’adresses IP et se propage graduellement vers d’autres cibles. Seules les machines les plus vulnérables du point de vue de la sécurité sont en danger. Notez qu’on a rapporté des cas où les victimes avaient un mot de passe sécuritaire, mais elles avaient oublié que le service en ligne était toujours activé. Leur appareil a subi une réinitialisation d’usine, ce qui a rétabli le mot de passe par défaut. Il a suffi de quelques heures d’exposition en ligne pour qu’une telle machine réinitialisée finisse par être en danger!

Analyse de Linux/Rakos

Le logiciel malveillant est programmé en langage Go et le fichier binaire est généralement compressé à l’aide de l’outil UPX standard. Ce qui posait problème, c’est que les noms des fonctions étaient effacés du fichier binaire comme d’habitude, mais se trouvaient quand même dans un emplacement particulier. À l’aide d’un script de RedNaga Security, qui retrace les symboles jusqu’à leur fonction respective dans le désassembleur IDA Pro, on a simplifié l’analyse, qui se résumait à examiner les fonctionnalités que les noms de fonction représentaient comme : main_loadConfig, main_startLocalHttp, main_Skaro_Upgrade, main_IPTarget_checkSSH, etc.  On a retrouvé des chaînes comme « Skaro » et « dalek » dans le fichier binaire. Le ou les créateurs du logiciel malveillant voulaient probablement faire référence à une planète fictive de la série télévisée de science-fiction Doctor Who, d’où proviennent les Daleks.

D’abord, [Linux/]Rakos charge sa configuration en format YAML à partir d’une entrée standard (stdin). Le fichier de configuration contient des renseignements comme des listes de serveurs de commande et de contrôle, l’ensemble des authentifiants essayés auprès des cibles, ainsi que des paramètres internes :

version: 30
logging: no
generation: 0

skaro:
ips:
– “193.0.178.151”
– “46.8.44.55”
– “5.34.183.231”
– “185.82.216.125”
– “195.123.210.100”
ping: 60

checkers:
– “http://193.0.178.151”
– “http://46.8.44.55”
– “http://5.34.183.231”
– “http://185.82.216.125”
– “http://195.123.210.100”
– “http://httpbin.org/ip”

userpass: [
“root:qwerty”,
“user:admin”,
“ubnt:ubnt”,
“root:12345”,

“guest:1234”,
“root:1111”,
“test:test”,
“support:password”,
“admin:1”,
“test:test123”,
“manager:manager”,
“fax:fax”,
“service:service”,
“root:letmein”,
“sales:sales”,
“guest:guest”,
“shell:sh”,
“enable:system”,
“user:password”,
“backup:backup”,
“ftpuser:ftpuser”,
“admin:password123”,
“monitor:monitor”,
“bin:bin”,
“root:ikwb”,
“admin:manager”,
“oracle:oracle”,
“test:12345”,
“bob:bob”,
“user1:1234”,
“root:1234”,
“root:system”,
PlcmSpIp:PlcmSpIp”,
“user1:123456”,
“1:1”,
“root:1”,
“support:123456”,
“nagios:nagios”,
“demo:demo”,
“admin:1111”,
“PlcmSpIp:PlcmSpIp”,
“pos:pos”,
“support:12345”,
“root:baseball”,
“guest:12345”,
“admin:1234”,
“apache:apache”,
“root:123456”,
“adam:adam”,
“root:alpine”,
“tester:retset”,
“root:raspberry”,
“pi:raspberry”,
“administrator:1234”,
“admin:abc123”,
“admin:qwerty”,
“root:openelec”,
“admin:admin1234”,
“shipping:shipping”,
“ftpuser:asteriskftp”,
“operator:operator”,
]

Toute la configuration de Linux/Rakos est accessible en texte clair sur la page Github d’ESET : https://github.com/eset/malware-ioc/tree/master/rakos.

Ensuite, le logiciel lance un service HTTP local accessible à l’adresse http://127.0.0.1:61314. Ce logiciel est installé pour deux raisons. En premier lieu, il s’agit d’une méthode astucieuse qui permet aux versions futures du robot de fermer les instances en exécution, peu importe leur nom, en effectuant une demande à l’adresse http://127.0.0.1:61314/et. D’autre part, le logiciel tente d’analyser une requête d’URL pour retrouver les paramètres « ip », « u » et « p » en lançant une requête à l’adresse http://127.0.0.1:61314/ex. Le but de cette ressource HTTP /ex n’est pas encore tout à fait déterminé à l’heure actuelle. Il ne semble pas y avoir de référence associée dans le code.

Le robot crée également un serveur Web qui effectue une écoute sur toutes les interfaces. Dans les premières versions, il écoutait le port TCP 13666, mais maintenant le port est choisi au hasard entre 20000 et 60000. Lorsqu’on envoie une demande à distance à l’appareil qui se situe sur ce port, on obtient la réponse...

{“origin”:”192.168.18.1″}

... où l’adresse IP correspond au côté client. Ce résultat est dans le même format que le serveur de test public http://httpbin.org avec une demande /ip. Dans le programme Linux/Rakos qui s’exécute en parallèle, il est possible de trouver la sortie standard suivante, à laquelle on a accédé :

“{2016/11/21 09:02:03 INFO StartChecker.func1  001 check: 192.168.18.1}”

Ensuite, le logiciel envoie une requête HTTP initiale contenant des renseignements importants sur l’appareil ciblé à l’adresse https://{C&C}/ping. Les données envoyées peuvent s’afficher comme suit (certains champs ont été modifiés) :

{
“arch”: “amd64”,
“config”: 30,
“fork”: 0,
“generation”: 0,
“ip”: “192.168.18.1”,
“origin”: “unknown”,
“password”: “shipping”,
“services:”: {“http”:{“addr”:”192.168.18.1:80″,”available”:false,”running”:false},
“dns”:{“addr”:””,”available”:false,”running”:false},
“checker”:{“addr”:”192.168.18.1:22418″,”available”:false,”running”:true}},
“stats”: {
“cnt”: “load: 0 scan: 0 bless: 0 sm:0 ins: 0 mem: 2692k”,
“cpu”: “1 x Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz 3591Mhz”,
“facts”: “host: ubuntu pid: 10219 uid: 0 args: [/tmp/.javaxxx]”,
“load”: “1.14 0.45 0.17”,
“mem”: “592MB / 1983MB free (35.21% used)”},“uptime”: 514,
“username”: “shipping”,
“uuid”: “ab-97-b1-d5-2d-8f”,
“version”: 706
}

La fonction principale de ce robot est de balayer le service SSH dans diverses adresses IP, qui sont obtenues à partir du serveur de commande et contrôle en demandant la liste située à l’adresse https://{C&C}/scan. Cette liste semble être souvent modifiée. Les versions précédentes de cheval de Troie effectuaient également un balayage pour retrouver le service SMTP, mais les pirates ont désactivé cette fonction dans la version actuelle. On imagine que cette fonction pourrait être en cours de développement, de même que d’autres fonctions de balayage de réseau.

L’attaque principale se déroule comme suit : si une des paires de nom d’utilisateur et de mot de passe du fichier de configuration réussit à faire une connexion dans l’un des appareils ciblés, deux commandes sont exécutées dans cet appareil (id, uname -m) et d’autres vérifications sont effectuées, dont les résultats sont signalés. En dernier lieu, le fichier binaire vérifie s’il est possible d’effectuer un téléversement vers la nouvelle victime et, si la réponse est affirmative, il le fait. Nous avons simulé une attaque locale sur deux cibles : 127.0.0.1 et 127.0.0.100 (normalement, les pirates s’en prennent à 200 cibles à la fois toutes les 10 secondes). Si, par exemple, le robot n’arrive pas à se connecter à la première cible, elle lui donne l’indicateur FORGET (oublier). Si elle réussit, elle donne l’indication INSTALL (installer). Cela indique qu’une connexion a été établie à l’aide des authentifiants de connexion shipping:shipping. Notez d’ailleurs que le fichier exécutable téléversé est automatiquement supprimé après son exécution.

Aussi, le logiciel malveillant est capable de faire ce qui suit :

  • mettre à jour le fichier de configuration (à partir de l’adresse https://{C&C}/upgrade/vars.yaml);
  • se mettre à jour.

Aucune activité purement malveillante à laquelle on aurait pu s’attendre, comme les attaques par saturation ou la propagation par pourriel, n’est intégrée au logiciel. Toutefois, le renvoi de l’adresse IP, du nom d’utilisateur et du mot de passe permet aux attaquants de faire ce qu’ils veulent de la machine après coup. Si on tient également compte du langage grossier utilisé dans le code, on doute qu’il puisse seulement s’agir d’une expérience innocente ou d’un exercice malheureux de recherche scolaire.

On trouve des rapports sur les attaques en ligne. Par exemple, on peut en trouver un qui date du 23 août 2016 sur Pastebin. Le tableau ci-dessous donne les résultats obtenus si on exécute la commande « lsof -n » dans le processus malveillant. Remarquez que les plages d’adresses IP auxquelles on essaie de se connecter à l’aide du protocole SSH semblent être choisies au hasard :

SHA1 Detección Nota
fa4f2e3f7c56210d1e380ec6d74a0b6dd776994b Win64/Spy.Banker.AX Dropper;fdsvc.exe
11568dffd6325ade217fbe49ce56a3ee5001cbcc Win64/Spy.Banker.AX Módulo cifrado;fdsvc.dll
e45ca027635f904101683413dd58fbd64d602ebe Win64/Spy.Banker.AX Módulo descifrado; RAT;libcurl v. 7.49.1 (*)
50b4f9a8fa6803f0aabb6fd9374244af40c2ba4c Win32/Spy.Banker.ADRO Módulo de 32 bits; RAT;libcurl v. 7.49.1

Atténuation et nettoyage

Après un redémarrage du système, le cheval de Troie n’est pas capable de reprendre à l’endroit où il s’est arrêté. Il peut plutôt attaquer les appareils vulnérables de nouveau.

Pour effectuer un nettoyage après une attaque, il faut suivre les étapes suivantes :

  • connectez-vous à votre appareil à l’aide de SSH ou de Telnet;
  • recherchez un processus appelé .javaxxx;
  • lancez des commandes comme netsat ou lsof suivies de l’opérateur -n pour vérifier si le processus est responsable des connexions non désirées;
  • rassemblez (volontairement) des preuves en vidant la mémoire où le processus se trouve (à l’aide de la commande gcore, par exemple). Il est aussi possible de récupérer l’échantillon supprimé du répertoire /proc à l’aide de la commande cp /proc/{pid}/exe {output_file};
  • fermez le processus à l’aide de la commande -KILL.

Il va sans dire que les victimes doivent sécuriser leurs authentifiants SSH et le refaire après chaque réinitialisation d’usine.

Nous avons également conçu un module d’extension pour Volatility Framework appelé vf_ioc_linux_rakos_a.py, qui pourrait détecter des indicateurs d’attaque si on parvient à acquérir l’ensemble des éléments vidés de la mémoire. De plus, ce module extrait des données du processus malveillant comme la configuration ou l’information envoyée au serveur de commande et contrôle. Vous pouvez le télécharger à cette adresse :https://github.com/eset/malware-ioc/tree/master/rakos

Conclusion

Dans cet article, nous avons présenté un autre exemple d’un logiciel espion Linux qui se répand dans un canal bien connu. Il semble que les pirates auraient fort à gagner de concevoir de nouveaux logiciels malveillants pour tirer profit des faiblesses de l’état actuel de notre sécurité de réseau. Notre conseil est le suivant : ne bâtissez pas les murs autour de votre appareil à l’aide de bâtons et de paille, mais plutôt à l’aide de briques et de pierres. Sur Internet, le vent souffle fort.

Nous tenons à remercier Marc-Étienne Léveillé.

Indicateurs de compromissions

Échantillons

Une fois que le logiciel malveillant s’exécute avec succès, son fichier binaire est supprimé. On a donc accès à peu d’échantillons disponibles

Nombre del paquete Hash Detección
goodish.weather A69C9BAD3DB04D106D92FD82EF4503EA012D0DA9 Android/Spy.Banker.HU

Serveurs de commande et contrôle

217.12.208.28
217.12.203.31
193.169.245.68
46.8.44.55
195.123.210.100
5.34.183.231
5.34.180.64
185.82.216.125
185.14.30.78
185.14.29.65
185.20.184.117