Les kobalos sont apparus à l'état sauvage



Les experts d'ESET ont parlé de nouveaux logiciels malveillants ciblant les clusters HPC du monde entier. C'est intéressant pour plusieurs raisons. Malgré la taille relativement petite de la base de code (les échantillons analysés avaient une taille de 25 Ko), le malware est suffisamment complexe pour mener des attaques sur Linux, BSD et Solaris et, potentiellement, peut convenir aux attaques sur AIX et Microsoft Windows . Une autre caractéristique distinctive est la possibilité de transformer les serveurs infectés en nouveaux C&C à la commande de l'opérateur. En raison des nombreuses astuces et de la petite taille du code, les chercheurs l'ont nommé Kobalos - d'après les esprits grecs antiques espiègles qui ont autrefois volé Hercule et adoré tromper et effrayer les gens.



L'étude publiée par des experts décrit les vecteurs initiaux estimés des mécanismes de compromis, d'authentification et de distribution, des fonctions intégrées et fournit une analyse technique du code malveillant. Après cela, les experts signalent les signes de compromis et les méthodes appliquées de MITRE ATT & CK.



Nous avons eu l'idée que des personnes qui maîtrisent mal l'anglais, mais ne sont pas indifférentes aux recherches actuelles dans le domaine de la sécurité de l'information, en particulier à l'analyse des malwares, seraient intéressantes et utiles pour traduire l'analyse de tels, en notre avis, un malware inhabituel.



ESET Research a analysé Kobalos, un malware multiplateforme complexe et jusqu'alors inconnu conçu pour s'exécuter sous Linux, FreeBSD et Solaris. Étant donné que les victimes sont principalement des organisations bien connues, il ne fait aucun doute qu'elles ont été ciblées par le logiciel. Une fois déployé, Kobalos donne accès au système de fichiers et au terminal distant de l'hôte compromis, permettant aux attaquants d'exécuter des commandes arbitraires.



Kobalos possède des capacités de mise en réseau remarquables. Il peut fonctionner en mode passif ou en tant que bot, se connectant activement à ses serveurs C&C. Il est curieux que ces serveurs eux-mêmes aient été compromis par Kobalos: le code de leur utilisation se trouve dans tous les échantillons de ce malware.



Grâce à des recherches approfondies sur le réseau, ESET Research a pu identifier et informer les victimes de Kobalos. On ne sait pas quand ce logiciel a été développé, mais sa première activité connue, confirmée par une victime, a été enregistrée fin 2019. Le groupe d'attaquants qui dirigeait Kobalos a continué tout au long de 2020. Les techniques d'attaque Linux continuent d'évoluer et les auteurs de malwares mettent beaucoup d'efforts pour améliorer leurs conceptions. Kobalos est l'un de ces programmes.



Principales conclusions



  • Kobalos est une porte dérobée multi-plateforme qui fonctionne sous Linux, FreeBSD et Solaris. Il y a des indications que ce logiciel peut exister sous AIX et même Windows.


  • Kobalos , , , -. Kobalos , .
  • Kobalos , .
  • Kobalos C&C- . , .
  • OpenSSH. Kobalos.
  • Kobalos. , , - . , SSH.




Si vous avez suivi ESET Research ces dernières années, vous avez peut-être remarqué que nous préférons rechercher et documenter les logiciels malveillants côté serveur développés pour Linux et d'autres systèmes d'exploitation moins courants. L'un des premiers rapports de ce type est dédié à l' opération Windigo et décrit plusieurs familles de logiciels qui travaillent ensemble pour rediriger le trafic Internet, envoyer du spam et d'autres activités malveillantes. L'opération Windigo est basée sur Ebury, une porte dérobée OpenSSH qui vole les informations d'identification. Ebury peut compromettre le client et le serveur SSH sans modifier les exécutables OpenSSH. Au lieu de cela, il modifie la bibliothèque qu'ils sont en train de charger et corrige les fonctions pour pouvoir démarrer et voler les informations d'identification après le chargement de la porte dérobée. La tâche n'est pas facile, mais les auteurs d'Ebury ont réussi à la résoudre.



Après l'opération Windigo, nous avons découvert et décrit plusieurs autres logiciels malveillants sous Linux, tels que Mumblehard , Moose , Shishiga , et également décrit des dizaines de portes dérobées pour OpenSSH dans Le côté obscur du rapport ForSSHe .



Jusqu'à présent, nous n'avons pas rencontré de malwares Linux aussi difficiles à analyser qu'Ebury. Mais cette fois, la situation est différente: contrairement à Ebury, les actions de Kobalos ne semblent pas si vastes. Le nombre de voitures compromises par eux est de l'ordre de dizaines et, dans le cas d'Ebury, de dizaines de milliers. Cet article fournit une analyse technique complète de Kobalos, des cibles des attaquants et des indicateurs de compromission qui peuvent aider les victimes potentielles à trouver des logiciels malveillants et à s'en débarrasser.



Victimes



Après avoir analysé le malware, ESET a mené une analyse Internet approfondie à la recherche des victimes de Kobalos. Nous recherchions un comportement de porte dérobée spécifique, qui se caractérise par l'établissement d'une connexion TCP avec un hôte compromis à partir d'un port sortant spécifique.



Compte tenu de la complexité de ce logiciel, nous avons été surpris par le très petit nombre de victimes retrouvées. Cependant, les objectifs eux-mêmes n'ont manifestement pas été choisis par hasard: il s'agit d'ordinateurs haute performance (HPC) et de serveurs qui font partie de réseaux scientifiques et de recherche. L'un de ces ordinateurs avait au moins 512 Go de RAM et près de pétaoctets de stockage sur disque. Nous avons également trouvé d'autres organisations victimes bien connues, telles qu'un fournisseur de sécurité des terminaux (pas nous!).





Figure 1. Industries et régions auxquelles appartiennent les organisations compromises.



Dans certaines organisations, plusieurs serveurs ont été infectés à la fois. Nous avons informé toutes les victimes que nous avons trouvées et avons travaillé ensemble pour supprimer le malware. Merci à tous ceux qui ont répondu et partagé des informations qui nous ont aidés dans cette étude.



Vecteur initial de compromis



Nous ne savons pas de première main comment les systèmes ont été compromis afin que les attaquants puissent obtenir un accès administratif pour installer Kobalos. Nous ne pouvons que spéculer sur la base des preuves recueillies.



Sur les machines compromises dont les administrateurs système ont participé à l'enquête, nous avons découvert que le programme de vol d'informations d'identification SSH était présenté comme un client OpenSSH cheval de Troie. Déposer /usr/bin/ssh



a été remplacé par un exécutable modifié qui a enregistré le nom d'utilisateur, le mot de passe, le nom d'hôte cible et les a enregistrés dans un fichier crypté. Par conséquent, nous pensons que le vol d'identité était l'un des moyens de distribution de Kobalos. Cela pourrait également expliquer pourquoi de nombreux réseaux universitaires ont été compromis: si un client SSH était utilisé par des étudiants ou des chercheurs de plusieurs universités, les informations d'identification de tous ces systèmes tiers pourraient être volées.



Un autre point d'entrée possible pourrait être l'exploitation d'une vulnérabilité connue: certaines machines compromises exécutaient des systèmes d'exploitation et des applications anciens, non pris en charge ou non corrigés, donc l'option utilisant un exploit connu est la plus probable. Mais vous ne devez pas non plus exclure la possibilité d'utiliser une vulnérabilité actuellement inconnue.



Attaque des réseaux pour le calcul haute performance



ESET a partagé des informations avec des organisations qui jouent un rôle important dans la résolution d'incidents dans les systèmes de recherche et universitaires, comme l'équipe de sécurité informatique du CERN. Ils ont confirmé que de fin 2019 à mi-2020, la communauté HPC a été touchée par une vague de trois attaques différentes, dont certaines ont été annoncées publiquement .



Après de nombreux mois d'enquête, on ne sait toujours pas si ces trois vagues étaient liées les unes aux autres, ou s'il s'agissait simplement d'une coïncidence inattendue. Les opérateurs de logiciels malveillants ont utilisé différentes tactiques, techniques et niveaux de difficulté. D'un autre côté, il est étrange que lors de différentes attaques, certaines adresses IP aient coïncidé.



  1. La première vague a utilisé Kobalos, qui est décrit dans cette étude.
  2. La deuxième vague s'est concentrée sur l'extraction de crypto-monnaies avec un ensemble d'outils très différent.
  3. La troisième vague était la plus importante, mais sa charge utile n'a pas encore été déterminée.


Des signes indirects de compromis résultant des deuxième et troisième vagues ont été décrits par l'équipe de réponse aux incidents de sécurité informatique de l'infrastructure réseau européenne sous la forme d'incidents # EGI20200421 et # EGI2020512 .



On ne sait pas pourquoi la communauté HPC est dominante parmi les victimes de ces attaques. Les HPC sont bien sûr intéressants, mais ils sont généralement plus difficiles à pénétrer que les autres serveurs de R&D. Grâce à un processus de réponse aux incidents basé sur la communauté, le CERN et d'autres équipes impliquées ont identifié un certain nombre d'architectures obsolètes et de pratiques de sécurité sous-optimales qui ont joué un rôle clé dans la prolifération des attaques. En outre, la plupart des victimes de la communauté HPC étaient mal équipées pour mener des enquêtes, en particulier en termes de surveillance de l'activité du système.



Examen de Kobalos



Kobalos dispose de nombreuses capacités pour accéder aux systèmes compromis et masquer les traces de leur utilisation.



Accès aux systèmes compromis



Premièrement, Kobalos fournit des commandes générales pour lire et écrire dans le système de fichiers, ainsi que pour lancer un terminal et exécuter des commandes arbitraires. Malheureusement, il n'y a pas de charge utile spécifique dans le programme qui suggérerait les intentions des auteurs. Très probablement, les opérateurs exécutent un shell de commande via le terminal et exécutent les commandes dont ils ont besoin.



Disponibilité



Deuxièmement, Kobalos dispose d'un certain nombre de fonctionnalités qui vous permettent d'établir une connexion réseau entre les opérateurs et le malware en cours d'exécution. Le logiciel assure son accessibilité externe de plusieurs manières:



  1. Ouvre un port TCP et attend une connexion entrante (ce mode est parfois appelé une porte dérobée passive).
  2. Se connecte à une autre instance Kobalos configurée en tant que serveur C&C.
  3. En attente de connexions à un service légitime déjà en cours d'exécution, sortant d'un port TCP spécifique.


Cette dernière méthode nécessite de remplacer le service en cours d'exécution par un autre qui contient le code Kobalos. Dans tous les cas où nous avons constaté l'utilisation de cette méthode, les attaquants ont dû modifier le serveur OpenSSH en cours d'exécution. Le fichier a été sshd



complètement remplacé, de sorte que le programme a continué à fonctionner même lorsque le service ou le système a été redémarré.



Authentification et cryptage du réseau



Troisièmement, pour exécuter la porte dérobée, vous devez authentifier ses clients, qui doivent avoir une clé RSA-512 et un mot de passe privés. Après les avoir vérifiées, Kobalos génère et crypte deux clés de clé publique de 16 octets à l'aide de l'algorithme RSA-512 et les envoie aux attaquants. Ces deux clés sont utilisées pour le cryptage RC4 du trafic entrant et sortant ultérieur.



Changement de port



Quatrièmement, lors de l'authentification, l'opérateur peut continuer à interagir sur une autre connexion TCP. Sur demande, Kobalos peut commencer à écouter le port souhaité et y transférer toutes les communications ultérieures. Les données transitant par ce canal sont cryptées à l'aide de clés RC4 créées lors de l'authentification.



Proxying vers d'autres machines compromises



Cinquièmement, Kobalos peut être utilisé comme proxy pour se connecter à d'autres serveurs qu'il compromet. Ce n'est pas un proxy TCP ordinaire: il nécessite l'encapsulation des données dans des paquets spéciaux, et prend également en charge le changement de port ci-dessus: pour cela, une commande est envoyée qui "commute" la connexion.



Les proxies peuvent être chaînés, ce qui signifie que les opérateurs peuvent utiliser plusieurs machines compromises par Kobalos pour se connecter aux serveurs cibles.



Un ensemble de possibilités





Figure 2. Vue d'ensemble des capacités de Kobalos et des scénarios possibles pour accéder aux serveurs compromis.



Le premier scénario est une connexion directe à des serveurs compromis pour accéder à leurs ressources. Dans le diagramme, la porte dérobée s'exécute dans le processus du serveur OpenSSH et s'attend à ce que la connexion ait un port source. L'opérateur doit utiliser le port TCP source correct pour communiquer avec la porte dérobée.



Le deuxième scénario est sans doute le plus difficile, mais il comporte les caractéristiques uniques des Kobalos. L'opérateur peut exécuter le serveur C&C à partir de n'importe quel serveur exécutant ce logiciel. Aucun code supplémentaire n'est nécessaire pour cela, toutes les fonctionnalités sont déjà intégrées. Après son lancement, le serveur C&C vérifie la liste des bots connectés, et l'opérateur peut se connecter à n'importe lequel d'entre eux. Le dernier nœud nécessite une authentification et applique le chiffrement de bout en bout à l'aide de l'échange de clés RC4. Pour garantir un tel schéma de travail, l'instance Kobalos sur le serveur B doit avoir l'adresse IP et le port du serveur C&C fonctionnant sur le serveur A. Le serveur B échange le trafic uniquement avec le serveur A, masquant l'adresse IP de l'opérateur.



Dans le troisième scénario, le serveur A est utilisé pour proxy la connexion au serveur C. Cela applique également l'authentification et le chiffrement de bout en bout forcé. L'opérateur peut définir le port source lors de la connexion du serveur A à C. Cela signifie que le serveur A peut être utilisé pour se connecter à des instances Kobalos qui attendent une connexion à partir d'un port spécifique.



Analyse technique de Kobalos



Pour la première fois, nous avons analysé un serveur OpenSSH trojanisé. La taille du code malveillant et des données de Kobalos est assez petite: environ 25 Ko pour les échantillons x86-64. Curieusement, tout le code est emballé dans une seule fonction. Il n'y a qu'un seul appel à cette fonction dans le code OpenSSH légitime.



Kobalos est un logiciel complexe. De toute évidence, ses développeurs ont mis beaucoup d'efforts dans sa création. Les auteurs ont implémenté de nombreuses fonctionnalités et implémenté leur propre obfuscation.



Obscurcissement



Aplatissement exceptionnel du flux de contrôle



Le fait que le code s'insère dans une fonction ne signifie pas que le flux de contrôle est linéaire. Kobalos appelle récursivement sa fonction pour effectuer les sous-tâches requises.





Figure 3. Graphique du flux de contrôle Kobalos.



Le premier paramètre de la fonction est l'action à effectuer. Kobalos peut effectuer 37 actions. Celles-ci sont répertoriées dans l' annexe Fonctionnalités intégrées de Kobalos , qui vous aide à analyser les versions actuelles et futures de ce logiciel. La fonction sert également de gestionnaire de signal SIGCHLD



pour terminer correctement le processus enfant et SIGALRM



gérer le délai d'expiration de la connexion.



En ce qui concerne le code source de Kobalos, cela pourrait être comme la compilation du code C ci-dessous. Une partie de la conversion peut être automatisée en insérant des fonctions par le compilateur, mais en attribuant des identificateurs numériques à toutes les fonctions et en gérant le même nombre d'arguments dans les fonctions nécessite un travail manuel ou un outillage spécial.



Avant que Après
int add(int a, int b) {
return a + b;
}

int mul(int a, int b) {
return a * b;
}

int square(int a) {
return mul(a, a);
}

int get_magic(void) {
return add(square(59), 56);
}

int main(void) {
return get_magic();
}

      
      





int f(int action, int a, int b) {
int ret;
switch(action) {
case 1000:
ret = a + b;
break; case 1001:
ret = a * b;
break; case 1002:
ret = f(1001, a, a);
break; case 1003:
ret = f(1002, 59, 0);
ret = f(1000, ret, 56);
break;
}
return ret;
}

int main(void) {
return f(1003, 0, 0);
}

      
      







Figure 4. Ce code C montre à quoi le code source Kobalos peut ressembler après avoir aligné le flux de contrôle.



Valeurs de chaîne chiffrées



Le code et les données Kobalos ne contiennent pas de valeurs de chaîne de texte brut. Seules quelques courtes chaînes cryptées avec RC4 sont utilisées ici. Ils sont déchiffrés immédiatement après l'interaction initiale avec le programme, mais avant l'authentification. Pour tous les échantillons que nous avons analysés, une clé est utilisée - AE 0E 05 09 0F 3A C2 B5 0B 1B C6 E9 1D 2F E3 CE



.



Valeurs de chaîne décodées:



  1. % s% s
  2. / dev / ptmx
  3. ptem
  4. ldterm
  5. ttcompat
  6. / dev / tty
  7. % s
  8. % ré
  9. /
  10. \
  11. % d.% d
  12. win3.11
  13. win95
  14. winNT
  15. gagner ??
  16. \\. \ pipe \ 2
  17. % s% s.% s
  18. / dev / ptc


Dans les échantillons Kobalos que nous avons analysés, seules les valeurs en gras (1 et 6-9) sont utilisées. D'autres ne sont pas mentionnés, bien qu'ils puissent être utilisés dans d'autres versions. En particulier:



  • Les lignes 10 et 12-16 semblent être spécifiques à Windows.
  • La ligne 18 est le chemin d'accès au pilote de périphérique pseudo-terminal sous AIX.
  • Les lignes 3 à 5 sont utilisées par les appels système du pseudo-terminal Solaris.


Nous ne pouvons pas exclure la possibilité d'essayer de désinformer les chercheurs sur l'existence de versions pour d'autres systèmes d'exploitation. Étant donné que nous avons confirmé la prise en charge de trois systèmes d'exploitation, il n'est pas surprenant qu'il y en ait d'autres. En revanche, Windows 3.11 et Windows 95 ont plus de 25 ans. Existe-t-il des versions de Kobalos pour ces systèmes hérités?



S'opposer à une enquête



Une fois authentifié, certaines techniques sont appliquées au processus de porte dérobée pour entraver l'enquête:



  • La valeur RLIMIT_CORE



    est effacée pour empêcher la génération d'un vidage du noyau en cas de panne du processus.
  • La plupart des signaux sont ignorés pour qu'il soit plus difficile d'interrompre le processus.




Figure 5. Kobalos évite les vidages du noyau en cas de crash et ignore la plupart des signaux.



Il est important de noter que la configuration RLIMIT_CORE



ne fait pas de mal pour vider le processus manuellement, par exemple, en utilisant gcore



gdb. Cette limite est utilisée par le noyau pour déterminer la taille maximale d'un vidage mémoire lorsqu'un processus plante.



Horodatage



Une analyse du système de fichiers des serveurs compromis a montré qu'après le paramétrage, les horodatages des fichiers remplacés (comme ssh



pour l'ajout d'un module de vol d'informations d'identification ou sshd



pour le déploiement de Kobalos) sont falsifiés pour éviter les soupçons.



Configuration



Kobalos a une configuration statique qui active ou désactive les fonctions logicielles. Le tableau 1 répertorie les champs que nous considérons comme faisant partie de la configuration. La figure 6 montre un exemple concret.



Tableau 1. Structure de la configuration statique Kobalos:

Taille (octets) La description
2 Probablement un numéro de version. Transmis lors d'une authentification réussie. Dans tous les échantillons trouvés, cela compte 0xB03



(étant donné qu'il est transmis dans le format du plus élevé au plus bas, comme toutes les autres données Kobalos).
320 Module de clé publique RSA. Chiffré dans un format binaire spécial.
2 Port TCP pour écouter. S'il est défini sur zéro, Kobalos n'écoutera pas sur les ports, mais utilisera d'autres méthodes pour attendre une connexion à la porte dérobée.
2 C&C-, . , — .
2 . ( ) ( ).
4 IP- C&C- . Kobalos .
2 x 16 TCP-, C&C-.
16 MD5- , .




Figure 6. Exemple de configuration de l'exemple Kobalos intégré dans sshd.



Une partie de la configuration sera différente si Kobalos est exécuté en interne sshd



ou en tant que fichier exécutable séparé. Dans ce dernier cas, l'adresse du serveur C&C distant ( remote_c2_addr



) ou du port d'écoute ( listen_port



) est requise .



Déploiement et préservation



Si Kobalos est déployé pour s'exécuter dans le cadre d'un serveur OpenSSH, le fichier sshd



doit être recompilé pour ajouter du code malveillant. Nous avons comparé la version Trojan d'OpenSSH et celle qui devrait être installée sur le système, par exemple, à partir du gestionnaire de paquets. Il semble que l'opérateur compile Kobalos sur la base de la bonne source OpenSSH déjà installée sur le serveur. L'exécutable infecté est susceptible d'être compilé sur la machine de la victime avant de remplacer l'original. Très probablement, un tel schéma a été choisi dans le but d'assurer la sécurité du logiciel en évitant les discordances de version, en raison desquelles une incompatibilité de la bibliothèque peut survenir.



Il est à noter que pour remplacer sshd



a besoin des privilèges root. Cependant, il existe des versions de Kobalos sous forme de fichiers séparés qui se connectent au serveur C&C ou écoutent sur le port TCP. Vous n'avez pas besoin de privilèges d'administrateur pour les exécuter, mais l'accès au système de fichiers et à l'ensemble de commandes sera limité par le niveau d'accès de l'utilisateur actuel.



Interaction avec la porte dérobée



Connexion de porte dérobée



L'une des caractéristiques notables de Kobalos est la flexibilité dans l'établissement de connexions entre les opérateurs et les hôtes compromis. Cela peut être fait de trois manières:



  1. Écoute du port TCP spécifié (mode passif).
  2. En se connectant au serveur C&C (mode actif) et en attendant que l'opérateur se connecte via ce serveur.
  3. En remplaçant le service existant qui écoute sur les ports TCP et en attendant une connexion à partir d'un port TCP source spécifique.


En utilisant la configuration statique de Kobalos, plusieurs méthodes peuvent être activées à la fois, cependant, dans chaque échantillon que nous avons analysé, une seule a été activée.



Cette dernière méthode nécessite de modifier le démon exécutable. La version trojanized appelle le code Kobalos chaque fois qu'elle accepte une nouvelle connexion TCP, comme le montre la figure 7. La porte dérobée peut l'accepter si la connexion provient d'un port TCP spécifique. Si le numéro de port correspond, la fonction ne renvoie rien et le sous-processus se termine lorsque la connexion est fermée. Si le port ne correspond pas à celui prescrit, le programme ne fait rien et transfère le travail au code du service légitime, qui continue de fonctionner correctement.





Figure 7. Appel d'une fonction à partir d'une fonction OpenSSH trojanized après avoir accepté une nouvelle connexion TCP. C'est celui que nous avons le plus vu et qui n'a été abusé que par le serveur OpenSSH. Cependant, les données peuvent être erronées, car c'est ainsi que nous pourrions les détecter lors de la numérisation d'Internet. Comme le montre la figure 8, Kobalos écoute sur le port TCP 55201. kobalos



main

















Figure 8. Comparaison du port source avec 55201.



Kobalos implémente une méthode supplémentaire pour filtrer les connexions TCP entrantes, en comparant le port source avec une liste de 16 ports:





Figure 9. Comparaison d'un port source avec une liste de 16 ports.



Liste de 16 ports:



vingt 567 2734 22392
21 982 5392 33921
53 1821 11568 44983
230 1912 19678 55201


Cependant, aucun des échantillons trouvés n'utilisait ce filtre. Il peut avoir été utilisé dans une version précédente de la porte dérobée.



Authentification



Une fois la connexion établie, l'authentification est effectuée. Pour plus de travail, vous avez besoin d'une clé RSA privée et d'un mot de passe de 32 octets. Le client Kobalos envoie un premier paquet de 320 octets au serveur infecté, dont la structure est décrite dans le tableau 2.



Tableau 2. La structure du paquet d'authentification (chiffré à l'aide de la clé RSA privée) :

Taille (octets) La description Valeur
quatre Paramètre mystérieux 0x7FFF000A





2 Port de liaison Si 0x0000



, alors Kobalos choisit un port aléatoire. Si 0xFFFF



, alors il utilise une connexion TCP existante.
une Identifiant du canal de communication Semble toujours être défini comme 0xFF



.
32 Mot de passe La valeur du mot de passe correspond au hachage MD5 dans la configuration statique.
280 Remplissage


Les 64 premiers octets du paquet sont déchiffrés à l'aide du module et de l'exposant de clé publique RSA-512 configurés 0x10001



(voir la figure 11). Ensuite, comme le montre la figure 10, le hachage MD5 est appliqué au mot de passe de 32 octets et le résultat est comparé aux informations de la configuration statique.





Figure 10. Après avoir reçu 320 octets, l'authentification est effectuée.





Figure 11. Chargement d'une clé publique RSA-512.



En utilisant la clé publique RSA, Kobalos crypte et définit les clés RC4 qui sont utilisées pour une communication ultérieure: une pour le trafic entrant, une autre pour le trafic sortant. Kobalos envoie des clés cryptées dans sa réponse.



Tableau 3. Structure de la réponse Kobalos (chiffrée avec la clé publique RSA) :

Taille (octets) La description Valeur
quatre Paramètre mystérieux 0x7FFF000A





16 Clé RC4 pour le trafic entrant Clé RC4 utilisée pour le trafic vers l'hôte compromis.
16 Touche RC4 pour le trafic sortant Clé RC4 utilisée pour le trafic d'un hôte compromis.
2 Port lié Port TCP utilisé comme canal actif. La valeur 0xFFFF



signifie utiliser la connexion actuelle.
282 Remplissage


Canal actif



Après avoir réussi l'authentification, le canal actif peut utiliser un port différent. Vous avez peut-être remarqué qu'avec l'authentification client, vous devez fournir un "port de liaison" dans le message chiffré.



  • Si sa valeur diffère de 0xFFFF



    , Kobalos commencera à écouter le port TCP spécifié.
  • Si la valeur est zéro, la porte dérobée commencera à écouter un port aléatoire supérieur à 1024.


Comme mentionné ci-dessus, dans la réponse d'authentification, avec la paire de clés RC4, le numéro du port nouvellement ouvert est transmis. Si vous le souhaitez, une connexion TCP supplémentaire peut être créée: si une valeur est transmise en tant que port de liaison 0xFFFF



, la connexion actuelle est utilisée.



Les communications ultérieures sur ces connexions TCP sont encapsulées dans des paquets dont le format est décrit dans le Tableau 4.



Tableau 4. Structure des paquets Kobalos :

Taille (octets) Valeur
une Signification mystérieuse ( 0x7F



)
2 Charge utile
une Identifiant du canal de communication.
une Identifiant du canal de communication.
payload_size Charge utile (cryptée avec RC4).


Kobalos est le premier à envoyer le paquet à l'opérateur connecté. Le package contient des informations de base sur la machine, telles que le nom d'hôte et la version du noyau. La figure 12 montre les niveaux d'encapsulation dans un emballage.





Figure 12. Informations envoyées à l'opérateur depuis un hôte compromis.



La figure 13 montre les processus de communication entre Kobalos et son client.





Figure 13. Diagramme de séquence du protocole de réseau Kobalos.



Gestion de la porte dérobée



Après l'authentification, l'opérateur peut émettre différentes commandes vers la porte dérobée. Nous les avons divisés en catégories:



  1. Connectez-vous à d'autres serveurs infectés par Kobalos et agissez en tant que proxy.
  2. Lire et écrire tous les fichiers dans le système de fichiers.
  3. Lancement et accès à un pseudo-terminal sur un hôte compromis.
  4. Lancement et gestion des serveurs Kobalos C&C avec accès aux bots connectés.


Les commandes sont encapsulées dans le canal actif. Ils commencent par un octet d'identification, suivi des paramètres analysés par cette commande. Les commandes décrites dans ce travail sont traitées par Kobalos, c'est-à-dire que l'opérateur les envoie au système compromis à l'aide d'un client spécial. Kobalos répond dans le même format, avec le premier octet d'identifiant, et les réponses sont traitées par le même client. Par exemple, après authentification, la commande "envoyer les informations d'hôte" ( 0x04



) peut être donnée .



Utilisation comme proxy



Les opérateurs peuvent utiliser les Kobalos installés sur la machine compromise pour se connecter à d'autres instances de la porte dérobée sur d'autres systèmes. Le mode proxy utilise la taille de paquet spéciale décrite ci-dessus pour l'authentification et l'encapsulation, c'est-à-dire qu'il ne s'agit pas d'un proxy TCP normal.



Lors de la connexion à une machine tierce, l'opérateur peut sélectionner le port TCP source. Cela vous permet de vous connecter à des instances Kobalos qui attendent une connexion à partir d'un port spécifique. La reconnexion du canal actif via un autre port est également prise en charge. Pour cela, une commande spéciale est donnée.



L'une des tâches dans ce cas est d'assurer un certain niveau d'anonymat de l'opérateur. Le nœud d'extrémité ne voit que l'adresse IP de l'autre machine compromise, pas l'adresse IP de l'opérateur. Pour masquer davantage l'adresse de l'opérateur, vous pouvez créer des chaînes de machines proxy compromises. La figure 14 montre un tel scénario.





Figure 14. Kobalos est utilisé comme proxy.



Les commandes de contrôle proxy sont décrites dans le tableau 5.



Tableau 5. Commandes pour utiliser Kobalos en tant que proxy :

Commander La description Options
0x01 Établissement d'une connexion à un autre hôte compromis par Kobalos. Adresse distante. Port source. Port d'extrémité. Message d'authentification (320 octets).
0x03 . , TCP-. .
0x05 .




Après l'authentification, l'opérateur peut lire ou écrire n'importe quel fichier sur le système. Dans le protocole de mise en réseau Kobalos, la charge utile encapsulée est définie à l'aide d'un entier 16 bits. Cela signifie que l'opérateur ne peut envoyer que des paquets de 64 Ko. Par exemple, s'il veut écrire 200 Ko dans un fichier, il devra exécuter quatre commandes d'écriture réussies. La commande de lecture a une limitation encore plus stricte: seuls 1000 octets peuvent être lus et envoyés à la fois.



Le tableau 6 décrit les commandes permettant de travailler avec le système de fichiers.



Tableau 6. Commandes de lecture et d'écriture de fichiers :

Commander La description Options
0x18 Ouverture d'un fichier pour l'écriture; sinon, le fichier est créé. Recherche de position. Le chemin d'accès au fichier.
0x1A Ecrire dans un fichier. Données à écrire. Ils seront écrasés à partir de la position de recherche.
0x1C Fermeture du fichier après l'enregistrement.
0x1D Ouverture et lecture d'un fichier. Recherche de position. Le chemin d'accès au fichier.
0x20 Fermeture du fichier après lecture.


Créer un pseudo-terminal



Cette fonctionnalité permet à un opérateur authentifié de créer un shell dans un nouveau pseudo-terminal et d'exécuter des commandes arbitraires. Pour ce faire, utilisez les commandes du Tableau 7.



Tableau 7. Commandes de création et de gestion de pseudo-terminaux :

Commander La description Options
0x12 Lancement d'un nouveau pseudo-terminal. Le chemin vers le shell (par exemple /bin/sh



). Argument.
0x0D Spécifie la taille de la fenêtre du pseudo-terminal. Valeurs de structure winsize



acceptées par TIOCSWINSZ .
0x14 Fermer un pseudo-terminal.
0x16 Ecrire sur un pseudo-terminal. Données à écrire.


Les données du terminal sont envoyées aux opérateurs, et après les données vient l'identifiant de la commande de fermeture 0x17



. Il est implémenté dans le client que les opérateurs utilisent.



Utiliser comme serveur C&C



L'une des caractéristiques les plus inhabituelles de Kobalos est que le code du serveur C&C est déjà intégré à la porte dérobée elle-même. Cela permet aux attaquants de transformer toutes les machines infectées en serveurs C&C (pour d'autres bots) avec une seule commande. Après le démarrage du serveur, l'opérateur peut définir son adresse IP et son port dans les configurations des futures instances Kobalos qui seront déployées sur d'autres hôtes. Ceci permet:



  • Utilisez des ressources compromises comme serveurs C&C, plutôt que de louer des serveurs auprès de fournisseurs réguliers. Cela réduit la probabilité d'indisponibilité du serveur.
  • Utilisez le serveur C&C comme nœud intermédiaire pour les machines derrière des pare-feu avec lesquelles il n'y a pas de connexion directe depuis Internet.


Lorsque l'opérateur envoie une commande "transition vers le mode C&C" ( 0x21



) , le numéro de port est passé en paramètre. Kobalos commence à l'écouter et les bots utilisent ce port pour se connecter à l'instance de serveur C&C. Cependant, la porte dérobée écoute également le numéro de port supérieur suivant. Par exemple, si les bots utilisent le port TCP 7070, alors en mode C&C, Kobalos écoute également le 7071. Le deuxième port est utilisé par l'opérateur pour contrôler les fonctions C&C, telles que lister les bots et leur établir des tunnels. Le diagramme est illustré à la figure 15.





Figure 15. L'opérateur Kobalos appelle les bots qui se sont signalés au serveur C&C.



Le tableau 8 décrit les commandes de contrôle des capacités du serveur C&C.



Tableau 8. Commandes pour contrôler les fonctions du serveur C&C :

Commander La description Options
0x21 Lancement du serveur C&C. Port TCP pour le serveur C&C.
0x23 Obtenez le nombre de connexions actives et le total depuis le démarrage de C&C.
0x25 Liste de tous les robots prêts à exécuter des commandes.
0x29 Déconnexion du serveur C&C.
0x2B Connectez-vous au bot. Index des robots dans la liste des robots prêts à se connecter. Message d'authentification (320 octets).
0x2D Connexion à un bot sans authentification. Index des robots dans la liste des robots prêts à se connecter.


Commandes 0x23



- 0x2D



traitées par le sous-processus du serveur C&C. Comme le montre la figure 16, après avoir été envoyées sur un canal actif, les données sont redirigées via TCP vers l'interface de bouclage du port de contrôle (un de plus que le numéro de port utilisé par les bots) du serveur C&C.





Figure 16. Les paquets liés à la gestion du serveur C&C sont transférés via TCP vers un sous-processus.



Autres commandes



Variables d'environnement



Pour le processus de porte dérobée, il existe une commande permettant de définir les variables d'environnement. Il prend une chaîne comme paramètre et la transmet simplement à putenv , qui attend des données au format "VAR = valeur".



Tableau 9. Autres commandes comprises par Kobalos :

Commander La description Options
0x0E Définit la variable d'environnement de la session. Chaîne à laquelle passer putenv



.


Opérations vides



Il y a deux autres commandes implémentées, mais elles ne font rien. Nous avons deux explications à cela:



  • Les auteurs ont supprimé la fonctionnalité des commandes car elles étaient utilisées dans les versions précédentes et ne sont plus nécessaires.
  • Les commandes sont spécifiques à la plate-forme et ne s'appliquent pas aux versions Linux et FreeBSD de Kobalos que nous avons analysées.




Figure 17. Équipes et ne rien faire. La deuxième explication semble plus probable car nous connaissons les valeurs de chaîne pour Solaris, AIX et Windows (voir le chapitre Valeurs de chaîne chiffrées). 0x07



0x09











Programme de vol d'informations d'identification OpenSSH



Sur la plupart des systèmes compromis par Kobalos, la porte dérobée a également déployé un programme pour voler les informations d'identification SSH via un client SSH cheval de Troie. Nous avons trouvé différentes versions de ces fichiers, y compris Linux et FreeBSD. Contrairement à Kobalos, les capacités de ce programme n'ont guère été obscurcies. Sa fonction principale est de voler le nom d'hôte, le numéro de port, le nom d'utilisateur et le mot de passe pour établir une connexion SSH à partir d'un hôte compromis. Les données sont enregistrées dans un fichier crypté. Les versions plus récentes du cheval de Troie peuvent également transmettre des informations sur le réseau via UDP, mais cette fonctionnalité n'a pas été activée dans la configuration de la plupart des échantillons trouvés.



Mais au moment de la publication de notre précédente étude sur les portes dérobées OpenSSH «Le côté obscur du ForSSHE», nous ne connaissions pas ce cheval de Troie, il n'est donc pas mentionné dans cet ouvrage. Nous ne pouvons pas non plus le lier à l'un des programmes de vol d'informations d'identification OpenSSH décrits dans les sources ouvertes.



L'emplacement du fichier de données volé dépend de la version du programme. Tous les exemples ont créé un /var/run



fichier avec l'extension .pid dans le répertoire . Il est utilisé dans de nombreux fichiers de ce répertoire. Vous pouvez voir des exemples de noms de fichiers et de chemins d'accès à ceux-ci à partir de différents exemples dans le chapitre «Signes de compromission».



Tous les échantillons trouvés chiffrent le contenu des fichiers à l'aide d'un simple chiffrement. Comme le montre la figure 18, le cheval de Troie ajoute simplement 123 à chaque octet de données qu'il stocke.





Figure 18. Chiffrement et écriture des informations d'identification SSH volées dans le fichier.



La version FreeBSD utilise le même format et le même chiffrement. Cependant, ils sont implémentés un peu différemment, par exemple, dans le programme, le chemin d'accès au fichier est chiffré à l'aide d'un XOR à un octet.



Développement d'une famille de programmes



Après avoir informé l'une des organisations victimes, elles ont découvert ce qui semble être une version plus récente d'un cheval de Troie voleur d'informations d'identification. Il contient une configuration cryptée et permet aux informations volées d'être transmises via UDP à l'hôte distant spécifié dans la configuration. Ebury et d'autres programmes de vol d'informations d'identification SSH tels que Bonadan, Kessel et Chandrila ont également cette capacité. Peut-être qu'UDP a été choisi pour contourner les pare-feu et ne pas établir de connexions TCP avec des hôtes potentiellement non approuvés. Le cheval de Troie n'utilise qu'une seule méthode de transmission - via un fichier ou un réseau, car le nom de l'hôte cible et le chemin d'accès au fichier sont stockés dans la même variable.



La figure 19 montre le code décompilé pour l'envoi de données via UDP. Et la figure 20 montre la configuration de l'exemple trouvé. Il a été configuré pour enregistrer les informations volées dans /var/run/sshd/sshd.pid



.





Figure 19. Le cheval de Troie envoie les informations d'identification via UDP .





Figure 20. Exemple de configuration utilisant un fichier pour capturer des données volées.



Curieusement, la configuration contient également le nom de l'hôte de la victime. Il est probablement utilisé par les opérateurs pour désigner une source de données. Cela signifie également que chaque serveur compromis reçoit une instance unique du cheval de Troie.



Conclusion



De nombreuses fonctionnalités et techniques de contournement de réseau bien mises en œuvre indiquent que les auteurs de Kobalos sont beaucoup plus compétents que de nombreux auteurs de logiciels malveillants pour Linux et d'autres systèmes non Windows. Le ciblage - des organisations assez connues - nous indique également que les opérateurs de Kobalos ne visent pas à infecter autant de systèmes que possible. Les faibles traces et les techniques de contournement du réseau pourraient être la raison pour laquelle la porte dérobée est passée inaperçue jusqu'à ce que nous informions les victimes des résultats de notre analyse du réseau.



Nous ne pouvons pas répondre à la question sur les intentions des assaillants. Les capacités de la porte dérobée vous permettent de l'utiliser pour résoudre n'importe quel problème. Aucun logiciel supplémentaire n'a été trouvé sur les machines compromises, à l'exception d'un cheval de Troie qui vole les informations d'identification SSH. Par conséquent, nous considérons SSH comme le point d'entrée, et non comme la charge utile. Selon les informations fournies par les administrateurs système des systèmes d'information HPC compromis des administrateurs système des systèmes HPC compromis, personne n'a tenté d'exploiter les crypto-monnaies ou de lancer d'autres tâches nécessitant une grande puissance de calcul.



Que poursuivent les attaquants?



Nous n'avons pas non plus été en mesure de savoir depuis combien de temps ce logiciel est utilisé. Nous avons trouvé des lignes liées à Windows 3.11 et Windows 95 qui sont sorties il y a plus de 25 ans. Existe-t-il une version Windows de Kobalos? Ce programme a été créé il y a si longtemps? Nous connaissons de nouvelles infections en 2019 et 2020, mais n'avons trouvé aucune preuve d'une utilisation antérieure.



Alors que les auteurs de ce logiciel semblent bien maîtriser le fonctionnement des protocoles réseau et des systèmes d'exploitation de leurs victimes, Kobalos présente plusieurs faiblesses. Premièrement, les problèmes de cryptographie sont probablement dus au développement de cette industrie, si Kobalos a vraiment été développé depuis très longtemps. Deuxièmement, vous remarquerez peut-être qu'il existe des instances à l'écoute passive, en particulier si elles nécessitent un port TCP source spécifique. Nous avons réussi à tirer parti de cette fonctionnalité et à notifier les victimes pour réduire le nombre d'hôtes infectés et mieux comprendre cette menace nouvellement découverte.



Nous rendons également compte du travail de Maciej Kotowicz de MalwareLab pl , qui a analysé Kobalos de manière indépendante et avec qui nous avons échangé les résultats de l'enquête. Il a dit Oh My H@ck 2020.



. Kobalos



1003 INITIALIZE socket, filter Kobalos , ( enum).
1004 START_LISTENING C&C- .
1005 START_C2_SERVER socket_1, socket_2 C&C-.
1006 SEND_PACKET socket_fd, &channel_1,

&channel_2, data, data_len
Kobalos socket_fd.
1007 RECV_PACKET socket_fd, &channel_1,

&channel_2, data, data_len
Kobalos socket_fd.
1008 GET_RANDOM_INT random_int 32- . PRNG .
1009 GET_HOST_INFO out_buf, returns buf_len , IP- .
1010 SET_COMMON_SOCKOPT socket SO_REUSEADDR SO_KEEPALIVE

true, SO_LINGER —

15 .
1011 RC4_DECRYPT_STRING_INPLACE str, len str RC4- .
1012 CLEANUP_THINGS what_to_close, send_report . . .
1013 RC4_INIT context, key_size, key RC4 .
1014 RC4_CRYPT context, len, data_in, data_out RC4- .
1015 MD5 input, input_len, output_digest MD5-.
1016

to 1037
, .
1038 RSA_PUBLIC_DECRYPT
1039 LOAD_PUB_KEY key_bin_data, public_key Charge un BLOB avec une clé RSA publique de key_bin_data à public_key.


Signes de compromis



Noms trouvés par ESET



  • Linux / Kobalos
  • Linux / Agent.IV
  • Linux / SSHDoor.EV
  • Linux / SSHDoor.FB
  • Linux / SSHDoor.FC


Échantillons



Kobalos



SHA-1 OS cible Construit dans Disponibilité
FBF0A76CED2939D1F7EC5F9EA58C5A294207F7FE



RHEL sshd En attente de connexion depuis le port source 55201.
479F470E83F9A5B66363FBA5547FDFCF727949DA



Debian Autonome Se connecte à

151.80.57 [.] 191: 7070
AFFA12CC94578D63A8B178AE19F6601D5C8BB224



FreeBSD sshd En attente de connexion depuis le port source 55201.
325F24E8F5D56DB43D6914D9234C08C888CDAE50



Ubuntu sshd En attente de connexion depuis le port source 55201.
A4050A8171B0FA3AE9031E0F8B7272FACF04A3AA



Arch Linux sshd En attente de connexion depuis le port source 55201.


Cheval de Troie pour voler les informations d'identification SSH



SHA-1 OS cible Écrit dans
6616DE799B5105EE2EB83BBE25C7F4433420DFF7



RHEL /var/run/nscd/ns.pid



E094DD02CC954B6104791925E0D1880782B046CF



RHEL /var/run/udev/ud.pid



1DD0EDC5744D63A731DB8C3B42EFBD09D91FED78



FreeBSD /var/run/udevd.pid



C1F530D3C189B9A74DBE02CFEB29F38BE8CA41BA



Arch Linux /var/run/nscd/ns.pid



659CBDF9288137937BB71146B6F722FFCDA1C5FE



Ubuntu /var/run/sshd/sshd.pid





Clés



Clé publique RSA



-----BEGIN PUBLIC KEY----- MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOUgD8sEF1kZ04QxCd60HrB+TxWnLQED
wzb0sZ8vMMD6xnUAJspdYzSVDnRnKYjTOM43qtLNcJOwVj6cuC1uHHMCAwEAAQ==
-----END PUBLIC KEY-----

      
      





Clé RC4 statique pour les valeurs de chaîne



AE0E05090F3AC2B50B1BC6E91D2FE3CE

      
      





Règles YARA



rule kobalos
{
meta:
 = “Kobalos malware” author = “Marc-Etienne M.Léveillé” date = “2020-11-02”

reference = «http://www.welivesecurity.com» source = «https://github.com/eset/malware-ioc/» license = «BSD 2-Clause»

version = “1”

strings:
$encrypted_strings_sizes = {
05 00 00 00 09 00 00 00 04 00 00 00 06 00 00 00
08 00 00 00 08 00 00 00 02 00 00 00 02 00 00 00
01 00 00 00 01 00 00 00 05 00 00 00 07 00 00 00
05 00 00 00 05 00 00 00 05 00 00 00 0A 00 00 00
}
$password_md5_digest = { 3ADD48192654BD558A4A4CED9C255C4C }
$rsa_512_mod_header = { 10 11 02 00 09 02 00 }
$strings_RC4_key = { AE0E05090F3AC2B50B1BC6E91D2FE3CE }

condition:
any of them
}

rule kobalos_ssh_credential_stealer { meta:
 = “Kobalos SSH credential stealer seen in OpenSSH client” author = “Marc-Etienne M.Léveillé”
date = “2020-11-02”
reference = «http://www.welivesecurity.com» source = «https://github.com/eset/malware-ioc/» license = «BSD 2-Clause»

version = “1”

strings:
$ = “user: %.128s host: %.128s port %05d user: %.128s password: %.128s”

condition:
any of them

}

      
      





Techniques MITRE ATT & CK



Le tableau a été compilé à l'aide de la huitième version du framework ATT & CK.



Tactique Identifiant Nom La description
Durabilité T1554 Compromettre ClientSoftware Binary Kobalos OpenSSH- sshd



.Kobalos SSH- .
T1205 Traffic Signaling Kobalos TCP- .
Defense Evasion T1070.003 Clear Command History Kobalos , .
T1070.006 Timestomp Kobalos .
T1027.002 Software Packing Kobalos .
Command And Control T1573.001 Encrypted Channel: Symmetric Cryptography RC4.
T1573.002 Encrypted Channel: Asymmetric Cryptography RSA-512.
T1090.003 Proxy: Multi-hop Proxy Kobalos , Kobalos.



All Articles