Résumé
- Guardicore a découvert le botnet sophistiqué peer-to-peer (P2P) FritzFrog , qui pirate activement les serveurs SSH depuis janvier 2020.
- Logiciel malveillant sur Golang : FritzFrog exécute un code malveillant modulaire, multithread et sans fichier sur Golang qui ne laisse aucune trace sur le disque dur d'un appareil infecté.
- Ciblage actif des ressources gouvernementales, éducatives, financières et autres : FritzFrog a tenté de forcer brutalement et de distribuer à des dizaines de millions d'adresses IP des bureaux gouvernementaux, des établissements d'enseignement, des centres médicaux, des banques et de nombreuses entreprises de télécommunications. Parmi eux, plus de 500 serveurs ont été attaqués avec succès, y compris des universités bien connues aux États-Unis et en Europe, et une compagnie ferroviaire.
- Complexité : FritzFrog est totalement propriétaire, son implémentation P2P est écrite à partir de zéro, ce qui indique un haut niveau de professionnalisme de ses créateurs dans le domaine du développement logiciel.
- : Guardcore Labs Golang, P2P FritzFrog .
- : , FritzFrog, Rakos.
FritzFrog est un botnet peer-to-peer très sophistiqué qui s'introduit activement dans les serveurs SSH du monde entier. Grâce à sa structure décentralisée, il répartit le contrôle sur tous ses nœuds. Ce réseau n'a pas de point de défaillance unique et les pairs communiquent constamment entre eux pour le maintenir stable, mis à jour et constamment actif. Les connexions P2P sont établies sur un canal crypté en utilisant AES pour le cryptage symétrique et Diffie-Hellman pour l'échange de clés.
Contrairement aux autres botnets P2P, FritzFrog est unique dans son ensemble de propriétés: il est sans fichier car il collecte et exécute les packages directement en mémoire; malgré la répartition efficace et uniforme des cibles dans son réseau, il les force de façon très agressive; ses protocoles P2P propriétaires ne sont basés sur aucune des implémentations actuellement connues.
Le code malveillant écrit en Golang est très modifiable et ne laisse aucune trace sur le disque dur. Il crée une porte dérobée sous la forme d'une clé SSH publique et donne ainsi aux attaquants un accès permanent à l'appareil de la victime. Dès le début de son activité, nous avons identifié 20 versions différentes du malware exécutable.
Dans cet article, nous expliquerons comment FritzFrog a été exposé, ainsi que la nature de son réseau P2P et les éléments internes du code malveillant - y compris le processus d'infection, le cryptage des commandes et le comportement volatil.
Guardicore Labs a mis à disposition un référentiel Github avec un script pour détecter ce malware et une liste d'indicateurs de compromission (IoC) pour son activité.
Répartition géographique des hôtes infectés. Les pays les plus vulnérables étaient les États-Unis, la Chine et la Corée du Sud.
Recherche FritzFrog
Guardcore Labs a d'abord examiné FritzFrog dans une étude de Botnet Encyclopedia . Le 9 janvier, de nouvelles attaques avec l'exécution de processus malveillants
ifconfig
et nginx
. Nous avons commencé à suivre une augmentation régulière et significative des activités malveillantes, qui ont rapidement atteint 13 000 attaques sur le Guardcore Global Sensors Network (GGSN). Nous avons suivi 20 versions différentes des binaires FritzFrog au fil des ans.
Le graphique montre le nombre d'attaques FritzFrog sur GGSN.
Étonnamment, à première vue, le code malveillant n'a contacté aucun serveur de commande et de contrôle (CNC). Ce n'est que lorsque nous avons commencé à enquêter sérieusement sur le botnet que nous avons réalisé qu'il n'y avait pas du tout de serveur.
Pour intercepter le réseau botnet, Guardcore Labs a développé un client sur Golang qui peut échanger des clés avec des logiciels malveillants, envoyer des commandes et recevoir des réponses. Ce programme, que nous avons alors appelé "frogger", nous a permis d'enquêter sur la nature et le but du réseau, et grâce au frogger, nous avons "ajouté" nos propres nœuds au réseau, en pouvant nous connecter au botnet, et participer à la transmission de données de trafic P2P actives.
FritzFrog a forcé brutalement des millions d'adresses IP, y compris des bureaux gouvernementaux, des établissements d'enseignement, des centres médicaux, des banques et de nombreuses entreprises de télécommunications. Parmi ceux-ci, plus de 500 serveurs ont été attaqués avec succès, y compris des universités bien connues aux États-Unis et en Europe, et une compagnie ferroviaire.
P2P de nouvelle génération
Pourquoi nouvelle génération?
FritzFrog , :
- : FritzFrog , (BLOB).
- : .
- : . , P2P DDG «root».
- : .
- : P2P - P2P , μTP.
Dès que la victime est piratée avec succès, un code malveillant contenant UPX est lancé dessus, qui se supprime immédiatement. Pour minimiser les soupçons, des processus malveillants sont exécutés sous les noms ifconfig et nginx. Au tout début de son travail, le code malveillant écoute sur le port 1234, en attente de commandes. Les premières commandes reçues synchronisent la victime avec la base de données des pairs du réseau et des cibles de force brute.
Cluster hôte FritzFrog. Chaque nœud est un serveur SSH infecté. La taille des nœuds démontre leur connectivité au reste du réseau.
Le trafic sur un port non standard, par exemple 1234, peut être facilement détecté et bloqué par un pare-feu ou tout autre système de sécurité. Par conséquent, les développeurs de FritzFrog ont abordé le problème de manière créative et au lieu de transmettre directement des commandes via le port 1234, l'attaquant se connecte à la victime via SSH et lance un client sur le périphérique netcat, qui à son tour se connecte au serveur botnet. De cette façon, toute commande sera transmise via SSH en tant qu'entrée netcat et atteindra facilement le code malveillant.
FritzFrog tunnel ses commandes P2P via le port SSH classique en utilisant le client netcat local du périphérique infecté.
Les attaquants de FritzFrog ont déployé un canal de commande crypté avec plus de 30 commandes différentes. Les paramètres de commande et les réponses sont transmis dans des structures de données spécifiées et libérés («mobilisés») au format JSON. Les données sont cryptées avec un cryptage AES symétrique et encodées en Base64 avant d'être envoyées. Les nœuds impliqués dans le transfert de données utilisent le protocole Diffie-Hellman pour échanger des clés.
Les nœuds du réseau FritzFrog maintiennent un contact étroit, se faisant constamment des requêtes ping pour vérifier la connectivité, l'échange entre pairs et cibles et la synchronisation mutuelle. Les nœuds s'engagent également dans un processus électoral intelligent qui affecte la répartition des cibles de force brute sur le réseau. Les observations de Guardcore Labs confirment que les cibles sont uniformément réparties sur le réseau et qu'aucun nœud ne tentera de pirater la même cible.
Plonger dans un code malveillant
Le binaire FritzFrog est un code malveillant avancé sur Golang. Il fonctionne entièrement en mémoire, chaque nœud avec du code malveillant stocke toute la base de données des cibles et des pairs en mémoire. Le code malveillant crée plusieurs threads pour traiter simultanément diverses tâches, comme indiqué dans le tableau ci-dessous.
FritzFrog définit les états de contrôle de la victime et du périphérique cible comme suit:
- Cible : Le périphérique de la requête cible sera ensuite transmis au module Cracker, qui à son tour essaiera de le scanner et de le casser.
- Déployer : un périphérique compromis avec succès est mis en file d'attente pour une infection par un logiciel malveillant via le module DeployMgmt.
- Owned (): P2P Owned.
Chaque nœud avec un code malveillant a un thread de travail qui est chargé de recevoir les commandes, de les analyser et de les transmettre aux fonctions appropriées du code.
Une fonction de travail dans un désassembleur. Chaque branche correspond à la fonctionnalité P2P prise en charge.
Le code malveillant est de nature temporaire: même s'il tente de survivre aux redémarrages du système, pour un accès futur à la cible piratée, une porte dérobée est enregistrée, dont le login et le mot de passe sont stockés par les pairs sur le réseau. Le code malveillant ajoute la clé publique SSH-RSA au fichier
authorized_keys
. Cette simple porte dérobée permet à un attaquant - avec une clé privée privée - de s'authentifier sans mot de passe, au cas où le mot de passe d'origine serait modifié. La seule clé publique utilisée par FritzFrog est indiquée ci-dessous.
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJYZIsncBTFc+iCRHXkeGfFA67j+kUVf7h/IL+sh0RXJn7yDN0vEXz7ig73hC//2/71sND+x+Wu0zytQhZxrCPzimSyC8FJCRtcqDATSjvWsIoI4j/AJyKk5k3fCzjPex3moc48TEYiSbAgXYVQ62uNhx7ylug50nTcUH1BNKDiknXjnZfueiqAO1vcgNLH4qfqIj7WWXu8YgFJ9qwYmwbMm+S7jYYgCtD107bpSR7/WoXSr1/SJLGX6Hg1sTet2USiNevGbfqNzciNxOp08hHQIYp2W9sMuo02pXj9nEoiximR4gSKrNoVesqNZMcVA0Kku01uOuOBAOReN7KJQBt
Le fichier malveillant exécute toutes sortes de commandes shell sur le périphérique local, parfois plusieurs fois, pour surveiller l'état du système. Par exemple, il s'exécute
free –m
pour vérifier la RAM disponible uptime
, journalctl –s @0 –u sshd
pour suivre les connexions SSH et d'autres commandes pour afficher les statistiques de charge du processeur. Ces statistiques sont disponibles pour d'autres nœuds sur le réseau et sont utilisées pour prendre diverses décisions, par exemple, exécuter le cryptominer sur l'appareil ou non. Si une décision est prise, le code malveillant lance un processus distinct libexec
pour miner Monero. Ce mineur est basé sur le célèbre mineur XMRig et communique avec la piscine publique web.xmrpool.eu
via le port 5555.
Réseau vicieux de type torrent
FritzFrog s'appuie sur la capacité de partager des fichiers sur l'ensemble du réseau, à la fois pour infecter de nouveaux appareils et pour lancer des éléments malveillants tels que le cryptominer Monero.
Pour échanger des fichiers entre les nœuds, FritzFrog utilise une approche furtive sans fichier: les fichiers sont divisés en tableaux de données binaires stockées en mémoire et un code malveillant surveille les tableaux disponibles en les stockant dans une carte avec la valeur de hachage de chaque tableau.
Lorsque le nœud A souhaite recevoir un fichier de son homologue, le nœud B, il peut envoyer une requête
getblobstats
au nœud B pour savoir quels tableaux il possède. Ensuite, le nœud A peut obtenir un tableau spécifique via son hachage, soit en utilisant une commande P2P, getbin
soit en utilisant HTTP à l'adresse http://1234/
. Une fois que le nœud A a reçu tous les tableaux, il crée le fichier via le module Assemble et l'exécute.
getblolbstats
. , .
Le suivi des opérations de botnet P2P est difficile. En raison de la nature distribuée du réseau, les commandes qu'il contient peuvent être transmises de n'importe quel nœud à n'importe quel nœud. Cependant, nous avons essayé de comparer ce botnet P2P avec des menaces similaires précédentes.
Même comparé aux autres botnets P2P, FritzFrog reste unique: il n'utilise pas IRC comme IRCflu , contrairement à DDG, il s'exécute directement en mémoire et il fonctionne sur des appareils Unix par opposition au botnet InterPlanetary Storm. Si cela ressemble à n'importe qui, en particulier en termes de dénomination des fonctionnalités et de numérotation de version, c'est sur Rakos , un botnet P2P sur Golang analysé par ESET en 2016.
Suivi et atténuation des activités
Guardcore Labs a fourni un script de suivi FritzFrog à exécuter sur des serveurs SSH. Il recherche les indicateurs de botnet suivants:
- Lancement de processus
nginx
,ifconfig
oulibexec
dont le fichier exécutable n'existe plus sur le système (comme vous pouvez le voir ci-dessous). - Écoute sur le port 1234.
De plus, le trafic TCP sur le port 5555 peut indiquer un trafic réseau vers le pool Monero.
ubuntu@ip-111-11-11-11:~$ ./detect_fritzfrog.sh
FritzFrog Detection Script by Guardicore Labs
=============================================
[*] Fileless process nginx is running on the server.
[*] Listening on port 1234
[*] There is evidence of FritzFrog's malicious activity on this machine.
FritzFrog exploite la fonction de forçage de port et de protocole de la plupart des systèmes de pare-feu. Vous pouvez éliminer ces menaces en utilisant des règles de segmentation basées sur les processus.
Les mots de passe faibles s'avèrent être une vulnérabilité clé pour les attaques FritzFrog. Nous vous recommandons d'utiliser des mots de passe forts et des clés d'autorisation publiques, qui sont beaucoup plus sécurisées. En outre, il est extrêmement important d'exclure la clé publique FritzFrog du fichier
authorization_keys
pour empêcher les attaquants d' accéder à l'appareil. Les routeurs et les appareils IoT exposent généralement leur SSH et deviennent donc vulnérables aux attaques FritzFrog; nous vous recommandons de changer le port SSH pour ces appareils ou, si la fonctionnalité n'est pas utilisée, de désactiver complètement SSH.