OceanLotus: mise à jour Malvari pour macOS

En mars 2019, VirusTotal, un service d'analyse en ligne populaire, a téléchargé un nouvel exemple de malware pour macOS du cybergroupe OceanLotus. Le fichier exécutable de porte dérobée a les mêmes capacités que la version précédente de malvari pour macOS que nous avons étudiée, mais sa structure a changé et il est devenu plus difficile à détecter. Malheureusement, nous n'avons pas pu trouver le compte-gouttes associé à cet échantillon, nous ne connaissons donc pas encore le vecteur d'infection.

Récemment, nous avons publié un article sur OceanLotus et comment les opérateurs tentent d'assurer la persistance, d'accélérer l'exécution du code et de minimiser les traces de présence sur les systèmes Windows. Il est également connu que ce cyber-groupe a un composant pour macOS. Cet article décrit en détail les changements dans la dernière version de Malware pour macOS par rapport à la version précédente ( décrite par Trend Micro ), ainsi que la façon dont l'analyse peut automatiser le déchiffrement des chaînes à l'aide de l'API IDA Hex-Rays.


Analyse


Les trois parties suivantes décrivent l'analyse d'échantillons avec le hachage SHA-1 E615632C9998E4D3E5ACD8851864ED09B02C77D2 . Le fichier est appelé flashlightd , les produits antivirus ESET le détectent comme OSX / OceanLotus.D.

Protection anti-débogage et sandbox


Comme tous les binaires macOS d'OceanLotus, l'exemple est fourni avec UPX, mais la plupart des outils d'identification de packer ne le reconnaissent pas comme tel. Probablement parce qu'elles contiennent principalement une signature, selon la présence de la chaîne «UPX», de plus, les signatures Mach-O sont moins courantes et ne sont pas mises à jour aussi souvent. Cette fonction rend la détection statique difficile. Fait intéressant, après le déballage, le point d'entrée se trouve au début de la section __cfstring dans le segment .TEXT . Il existe des attributs d'indicateur dans cette section, comme indiqué dans l'image ci-dessous.


Figure 1. Attributs de la section MACH-O __cfstring

Comme le montre la figure 2, l'emplacement du code dans la section __cfstring permet de tromper certains outils de démontage en affichant le code sous forme de chaînes.


Figure 2. Le code de porte dérobée est défini par l'IDA comme des données

Après le démarrage du fichier binaire crée un flux comme moyen de protection contre le débogage, dont le seul but est de vérifier en permanence la présence d'un débogueur. Pour ce fil:

  • Tente de décrocher tout débogueur en appelant ptrace avec PT_DENY_ATTACH comme paramètre de requête
  • Vérifie si certains ports d'exception sont ouverts en appelant task_get_exception_ports
  • Vérifie si le débogueur est connecté, comme illustré dans la figure ci-dessous, en vérifiant la présence de l'indicateur P_TRACED dans le processus en cours


Figure 3. Vérification de la connexion du débogueur à l'aide de la fonction sysctl

Si le chien de garde détecte la présence d'un débogueur, la fonction de exit est appelée. En outre, l'exemple vérifie ensuite l'environnement en exécutant deux commandes:

ioreg -l | grep -e "Manufacturer" sysctl hw.model

Après cela, l'exemple vérifie la valeur de retour par rapport à une liste codée en dur de chaînes de systèmes de virtualisation connus: acle , vmware , virtualbox ou parallels . Enfin, la commande suivante vérifie si la machine fait partie des «MBP», «MBA», «MB», «MM», «IM», «MP» et «XS». Ce sont des codes de modèle de système, par exemple, "MBP" signifie MacBook Pro, "MBA" signifie MacBook Air, etc.

system_profiler SPHardwareDataType 2>/dev/null | awk '/Boot ROM Version/ {split($0, line, ":");printf("%s", line[2]);}

Ajouts clés


Malgré le fait que les équipes de portes dérobées n'ont pas changé depuis l'étude Trend Micro, nous avons remarqué plusieurs autres modifications. Les serveurs C&C utilisés dans cet exemple sont assez récents, la date de leur création est le 22/10/2018.

  • daff.faybilodeau [.] com
  • sarc.onteagleroad [.] com
  • au.charlineopkesston [.] com

L'URL de la ressource a été remplacée par /dp/B074WC4NHW/ref=gbps_img_m-9_62c3_750e6b35 .
Le premier paquet envoyé au serveur C&C contient plus d'informations sur la machine hôte, y compris toutes les données collectées par les commandes du tableau ci-dessous.



Outre cette modification de configuration, l'exemple n'utilise pas la bibliothèque libcurl pour le filtrage réseau, mais une bibliothèque externe. Pour le trouver, la porte dérobée essaie de décrypter chaque fichier du répertoire en cours en utilisant AES-256-CBC avec la clé gFjMXBgyXWULmVVVzyxy de zéros. Chaque fichier est décrypté et enregistré sous /tmp/store , et une tentative de chargement en tant que bibliothèque a été effectuée à l'aide de la fonction dlopen . Lorsqu'une tentative de déchiffrement aboutit à un appel dlopen réussi, la porte dérobée récupère les ChadylonV Boriry et ChadylonV exportées, qui semblent être responsables de la communication réseau avec le serveur. Nous n'avons pas de compte-gouttes ni d'autres fichiers de l'emplacement source de l'échantillon, nous ne pouvons donc pas analyser cette bibliothèque. De plus, puisque le composant est crypté, la règle YARA basée sur ces lignes ne correspondra pas au fichier trouvé sur le disque.

Comme décrit dans l'article ci-dessus, cliendID est créé. Cet identifiant est un hachage MD5 de la valeur de retour de l'une des commandes suivantes:

- ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformSerialNumber/ { split($0, line, "\""); printf("%s", line[4]); }' ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformSerialNumber/ { split($0, line, "\""); printf("%s", line[4]); }'
- ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformUUID/ { split($0, line, "\""); printf("%s", line[4]); }' ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformUUID/ { split($0, line, "\""); printf("%s", line[4]); }'
- ifconfig en0 | awk \'/ether /{print $2}\' ifconfig en0 | awk \'/ether /{print $2}\' (obtenir l'adresse MAC)
- commande inconnue (" \x1e\x72\x0a "), utilisée dans les exemples précédents

Avant le hachage, le caractère "0" ou "1" est ajouté à la valeur renvoyée, indiquant la présence de privilèges root. Cet ID client est stocké dans /Library/Storage/File System/HFS/25cf5d02-e50b-4288-870a-528d56c3cf6e/pivtoken.appex si le code s'exécute en tant que root ou dans ~ / Library / SmartCardsServices / Technology / PlugIns / drivers / snippets.ecgML dans tous les autres cas. Un fichier est généralement masqué à l'aide de la fonction _chflags , son horodatage est modifié à l'aide de la commande touch –t avec une valeur aléatoire.

Décodage des chaînes


Comme dans les versions précédentes, les chaînes sont chiffrées à l'aide de AES-256-CBC (clé hexadécimale: 9D7274AD7BCEF0DED29BDBB428C251DF8B350B92 de zéros et IV est rempli de zéros) à l'aide de la fonction CCCrypt . La clé a été modifiée par rapport aux versions précédentes, mais comme le groupe utilise toujours le même algorithme de chiffrement de chaîne, le déchiffrement peut être automatisé. En plus de cet article, nous publions un script IDA qui utilise l'API Hex-Rays pour décrypter les chaînes présentes dans un fichier binaire. Ce script peut aider à l'analyse future d'OceanLotus et à l'analyse d'échantillons existants que nous n'avons pas encore pu obtenir. Le script est basé sur une méthode universelle pour recevoir des arguments passés à une fonction. Il recherche également des paramètres de destination. La méthode peut être réutilisée pour obtenir une liste d'arguments de fonction, puis la transmettre à un rappel.

Connaissant le prototype de la fonction de décryptage , le script trouve toutes les références croisées à cette fonction, tous les arguments, puis décrypte les données et place du texte brut à l'intérieur du commentaire à l'adresse de la référence croisée. Pour que le script fonctionne correctement, il doit avoir l'alphabet défini par l'utilisateur utilisé par la fonction de décodage base64 et une variable globale contenant la longueur de clé doit être définie (dans ce cas, DWORD, voir figure 4).


Figure 4. Définition de la variable globale key_len

Dans la fenêtre Fonction, vous pouvez cliquer avec le bouton droit sur la fonction de déchiffrement et cliquer sur "Extraire et déchiffrer les arguments". Le script doit mettre les lignes déchiffrées dans les commentaires, comme le montre la figure 5.


Figure 5. Le texte déchiffré est placé dans le commentaire

Ainsi, les lignes déchiffrées sont commodément placées ensemble dans la fenêtre des xréfs IDA pour cette fonction, comme le montre la figure 6.


Figure 6. Xréfs à la fonction f_decrypt

Le script final peut être trouvé sur le dépôt Github .

Conclusion


Comme déjà mentionné, OceanLotus améliore et met constamment à jour son ensemble d'outils. Cette fois, le cyber-groupe a amélioré les logiciels malveillants pour travailler avec les utilisateurs de Mac. Le code n'a pas beaucoup changé, mais comme de nombreux utilisateurs de Mac ignorent les produits de sécurité, la protection des logiciels malveillants contre la détection est d'une importance secondaire.

Les produits ESET avaient déjà détecté ce fichier au moment de l'étude. Étant donné que la bibliothèque réseau utilisée pour la communication C&C est désormais chiffrée sur le disque, le protocole réseau exact utilisé par les attaquants n'est pas encore connu.

Indicateurs de compromis


Les indicateurs de compromis ainsi que les attributs MITRE ATT & CK sont également disponibles sur GitHub .

Source: https://habr.com/ru/post/fr447530/


All Articles