OceanLotus : mise à jour du malware pour macOS

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

Nous avons récemment publié 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 l'empreinte sur les systèmes Windows. On sait également que ce cybergroupe dispose également d’un composant pour macOS. Cet article détaille les modifications apportées à la dernière version du malware pour macOS par rapport à la version précédente (décrit par Trend Micro), et décrit également comment automatiser le déchiffrement des chaînes lors de l'analyse à l'aide de l'API IDA Hex-Rays.

OceanLotus : mise à jour du malware pour macOS

Analyse

Les trois parties suivantes décrivent l'analyse d'un échantillon avec un hachage SHA-1 E615632C9998E4D3E5ACD8851864ED09B02C77D2. Le fichier s'appelle lampe de poche, les produits antivirus ESET le détectent sous le nom OSX/OceanLotus.D.

Protection anti-débogage et sandbox

Comme tous les binaires macOS OceanLotus, l'exemple est packagé avec UPX, mais la plupart des outils d'identification des packagers ne le reconnaissent pas comme tel. C'est probablement parce qu'ils contiennent pour la plupart une signature dépendant de 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 fonctionnalité rend la détection statique difficile. Fait intéressant, après déballage, le point d'entrée se trouve au début de la section __cfstring dans le segment .TEXT. Cette section comporte des attributs de drapeau, comme indiqué dans l'image ci-dessous.

OceanLotus : mise à jour du malware pour macOS
Figure 1. Attributs de la section MACH-O __cfstring

Comme le montre la figure 2, les emplacements des codes dans la section __cfstring vous permet de tromper certains outils de désassemblage en affichant le code sous forme de chaînes.

OceanLotus : mise à jour du malware pour macOS
Figure 2. Code de porte dérobée détecté par IDA en tant que données

Une fois exécuté, le binaire crée un thread comme anti-débogueur dont le seul but est de vérifier en permanence la présence d'un débogueur. Pour ce flux :

— Essaie de décrocher n'importe quel débogueur, en appelant ptrace с PT_DENY_ATTACH comme paramètre de requête
- Vérifie si certains ports exclusifs sont ouverts en appelant une fonction task_get_exception_ports
- Vérifie si le débogueur est connecté, comme indiqué dans la figure ci-dessous, en vérifiant la présence du flag P_TRACED dans le processus actuel

OceanLotus : mise à jour du malware pour macOS
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 est appelée exit. De plus, l'exemple vérifie ensuite l'environnement en exécutant deux commandes :

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

L'exemple vérifie ensuite la valeur de retour par rapport à une liste de chaînes codées en dur provenant de systèmes de virtualisation connus : clé, vmware, virtualbox ou parallèles. Enfin, la commande suivante vérifie si la machine est l'un des suivants « MBP », « MBA », « MB », « MM », « IM », « MP » et « XS ». Il s'agit de 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]);}

Principaux ajouts

Bien que les commandes de porte dérobée n'aient pas changé depuis les recherches de Trend Micro, nous avons remarqué quelques autres modifications. Les serveurs C&C utilisés dans cet exemple sont relativement nouveaux et ont été créés le 22.10.2018/XNUMX/XNUMX.

- daff.faybilodeau[.]com
- sarc.onteagleroad[.]com
- fr.charlineopkesston[.]com

L'URL de la ressource a été modifiée en /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 dans le tableau ci-dessous.

OceanLotus : mise à jour du malware pour macOS

En plus de ce changement de configuration, l'exemple n'utilise pas de bibliothèque pour le filtrage réseau libcurl, mais une bibliothèque externe. Pour le trouver, la porte dérobée tente de décrypter chaque fichier du répertoire actuel en utilisant AES-256-CBC avec la clé gFjMXBgyXWULmVVVzyxy, complété par des zéros. Chaque fichier est décrypté et enregistré sous /tmp/store, et une tentative de chargement en tant que bibliothèque est effectuée à l'aide de la fonction ouvrir. Lorsqu'une tentative de décryptage aboutit à un appel réussi dlopen, la porte dérobée extrait les fonctions exportées Boriry и ChadylonV, qui sont apparemment responsables de la communication réseau avec le serveur. Nous n'avons pas le compte-gouttes ni d'autres fichiers provenant de l'emplacement d'origine de l'échantillon, nous ne pouvons donc pas analyser cette bibliothèque. De plus, le composant étant chiffré, une règle YARA basée sur ces chaînes ne correspondra pas au fichier trouvé sur le disque.

Comme décrit dans l'article ci-dessus, cela crée identité du client. Cet ID est le 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 '/IOPlatformUUID/ { split($0, line, """); printf("%s", line[4]); }'
- ifconfig en0 | awk '/ether /{print $2}' (obtenir l'adresse MAC)
- équipe inconnue ("x1ex72x0a"), qui est utilisé dans les échantillons précédents

Avant le hachage, un « 0 » ou un « 1 » est ajouté à la valeur de retour pour indiquer les privilèges root. Ce identité du client stocké dans /Library/Storage/File System/HFS/25cf5d02-e50b-4288-870a-528d56c3cf6e/pivtoken.appex, si le code est exécuté en tant que root ou dans ~/Library/SmartCardsServices/Technology/PlugIns/drivers/snippets.ecgML dans tous les autres cas. Le 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.

Chaînes de décodage

Comme pour les options précédentes, les chaînes sont chiffrées à l'aide d'AES-256-CBC (clé hexadécimale : 9D7274AD7BCEF0DED29BDBB428C251DF8B350B92 complété par des zéros et IV rempli de zéros) via la fonction CCCrypte. La clé a changé par rapport aux versions précédentes, mais comme le groupe utilise toujours le même algorithme de chiffrement de chaîne, le décryptage 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 le 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 de réception des arguments passés à une fonction. De plus, il recherche les affectations de paramètres. La méthode peut être réutilisée pour obtenir une liste d'arguments de fonction, puis la transmettre au rappel.

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

OceanLotus : mise à jour du malware pour macOS
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écryptage et cliquer sur « Extraire et décrypter les arguments ». Le script doit placer les lignes déchiffrées dans les commentaires, comme le montre la figure 5.

OceanLotus : mise à jour du malware pour macOS
Figure 5. Le texte déchiffré est placé dans les commentaires

De cette façon, les chaînes déchiffrées sont commodément placées ensemble dans la fenêtre IDA. xréfs pour cette fonction, comme le montre la figure 6.

OceanLotus : mise à jour du malware pour macOS
Figure 6. Xréfs vers la fonction f_decrypt

Le script final peut être trouvé sur Github référentiel.

conclusion

Comme déjà mentionné, OceanLotus améliore et met à jour constamment sa boîte à outils. Cette fois, le cybergroupe a amélioré le malware pour qu'il fonctionne 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 détectaient déjà ce fichier au moment de la recherche. La bibliothèque réseau utilisée pour la communication C&C étant 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 compromission ainsi que les attributs MITRE ATT&CK sont également disponibles sur GitHub.

Source: habr.com

Ajouter un commentaire