OceanLotus : mise Ă  jour de malwares pour macOS

En mars 2019, un nouvel Ă©chantillon de malware pour macOS du groupe cybercriminel OceanLotus a Ă©tĂ© tĂ©lĂ©chargĂ© sur VirusTotal, un service de scan en ligne populaire. Le fichier exĂ©cutable de ce backdoor possĂšde les mĂȘmes capacitĂ©s que la version prĂ©cĂ©dente de malware 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 dropper associĂ© Ă  cet Ă©chantillon, donc nous ne connaissons pas encore le vecteur d'infection.

Nous avons récemment publié un post sur OceanLotus et comment les opérateurs essaient d'assurer la persistance, d'accélérer l'exécution du code et de minimiser les traces de présence dans les systÚmes Windows. Il est également connu que ce groupe cybercriminel possÚde un composant pour macOS. Ce post décrit en détail les changements dans la derniÚre version du malware pour macOS par rapport à la version précédente (décrite par Trend Micro), ainsi que la maniÚre dont on peut automatiser la décryptage des chaßnes lors de l'analyse à l'aide de l'API IDA Hex-Rays.

OceanLotus : mise Ă  jour de malwares pour macOS

Analyse

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

Anti-debugging et protection contre les sandbox

Comme tous les binaires macOS d'OceanLotus, cet échantillon est compressé avec UPX, mais la plupart des outils d'identification de packagers ne le reconnaissent pas comme tel. Probablement parce qu'ils contiennent principalement une signature dépendant de la présence de la chaßne « UPX », en outre, les signatures Mach-O sont rencontrées moins fréquemment et sont mises à jour moins souvent. Cette caractéristique complique la détection statique. Fait intéressant, aprÚs décompression, le point d'entrée se trouve au début de la section __cfstring dans le segment .TEXT. Dans cette section, il y a des attributs flag, comme montré dans l'image ci-dessous.

OceanLotus : mise Ă  jour de malwares pour macOS
Figure 1. Attributs de la section MACH-O __cfstring

Comme indiqué dans la Figure 2, les emplacements de code dans la section __cfstring permettent de tromper certains outils de désassemblage en affichant le code sous forme de chaßnes.

OceanLotus : mise Ă  jour de malwares pour macOS
Figure 2. Le code du backdoor est identifié par IDA comme des données

AprÚs l'exécution, le binaire crée un thread comme moyen de protection contre le débogage, dont le seul objectif est de vérifier en permanence la présence d'un débogueur. Pour cela, le thread :

— Tente de dĂ©tacher 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 la fonction task_get_exception_ports
— VĂ©rifie si le dĂ©bogueur est connectĂ©, comme le montre l'image ci-dessous, en vĂ©rifiant la prĂ©sence d'un drapeau P_TRACED dans le processus actuel

OceanLotus : mise Ă  jour de malwares pour macOS
Figure 3. Vérification de la connexion du débogueur via la fonction sysctl

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

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

AprĂšs cela, l'Ă©norme vĂ©rifie la valeur retournĂ©e par 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 est l'une des suivantes : “MBP”, “MBA”, “MB”, “MM”, “IM”, “MP” et “XS”. Ce sont des codes de modĂšle systĂšme, par exemple, “MBP” signifie MacBook Pro, “MBA” – MacBook Air, etc.

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

Extensions principales

Bien que les commandes de backdoor n'aient pas changé depuis l'étude de Trend Micro, nous avons remarqué quelques autres modifications. Les serveurs C&C utilisés dans cet échantillon sont relativement nouveaux, leur date de création étant le 22.10.2018.

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

L'URL de la ressource a changé 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 du tableau ci-dessous.

OceanLotus : mise Ă  jour de malwares pour macOS

En outre, pour les changements de configuration, l'Ă©chantillon utilise pour le filtrage rĂ©seau non la bibliothĂšque libcurl, mais une bibliothĂšque externe. Pour la trouver, le backdoor essaie de dĂ©chiffrer chaque fichier dans le rĂ©pertoire actuel en utilisant AES-256-CBC avec la clĂ© gFjMXBgyXWULmVVVzyxy, complĂ©tĂ©e par des zĂ©ros. Chaque fichier est dĂ©chiffrĂ© et enregistrĂ© sous le nom /tmp/store, et une tentative de le charger en tant que bibliothĂšque est faite en utilisant la fonction dlopen. Lorsque l'essai de dĂ©chiffrement mĂšne Ă  un appel rĂ©ussi dlopen, le backdoor extrait les fonctions exportĂ©es Boriry et ChadylonV, qui semblent ĂȘtre responsables de l'interaction rĂ©seau avec le serveur. Nous n'avons pas de dropper ni d'autres fichiers de l'emplacement source de l'Ă©chantillon, donc nous ne pouvons pas analyser cette bibliothĂšque. De plus, comme le composant est chiffrĂ©, la rĂšgle YARA basĂ©e sur ces chaĂźnes ne correspondra pas au fichier trouvĂ© sur le disque.

Comme décrit dans l'article mentionné ci-dessus, un cliendID. Cet identifiant est un hachage MD5 de la valeur retournée par 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)
— commande inconnue («x1ex72x0a«), qui est utilisĂ©e dans les exemples prĂ©cĂ©dents

Avant le hachage, un caractÚre «0» ou «1» est ajouté à la valeur retournée pour indiquer la présence de privilÚges root. Ce clientID est stocké dans /Library/Storage/File System/HFS/25cf5d02-e50b-4288-870a-528d56c3cf6e/pivtoken.appex, si le code est exécuté avec root ou dans ~/Library/SmartCardsServices/Technology/PlugIns/drivers/snippets.ecgML dans tous les autres cas. Le fichier est généralement caché à l'aide de la fonction _chflags, son horodatage est modifié à l'aide de la commande touch -t avec une valeur aléatoire.

Déchiffrement des chaßnes

Comme dans les versions prĂ©cĂ©dentes, les chaĂźnes sont chiffrĂ©es Ă  l'aide de l'AES-256-CBC (clĂ© hexadĂ©cimale : 9D7274AD7BCEF0DED29BDBB428C251DF8B350B92 complĂ©tĂ©e par des zĂ©ros, et l'IV est rempli de zĂ©ros) par 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 pour chiffrer les chaĂźnes, le dĂ©chiffrement peut ĂȘtre automatisĂ©. En plus de ce poste, nous publions un script IDA utilisant l'API Hex-Rays pour dĂ©chiffrer les chaĂźnes prĂ©sentes dans le fichier binaire. Ce script peut aider dans l'analyse future d'OceanLotus et dans l'analyse des Ă©chantillons existants que nous n'avons pas pu obtenir pour le moment. Le script repose sur une mĂ©thode universelle pour obtenir les arguments passĂ©s Ă  la fonction. De plus, il recherche les attributions des paramĂštres. La mĂ©thode peut ĂȘtre rĂ©utilisĂ©e pour obtenir une liste des arguments d'une fonction, puis les transmettre en retour (callback).

Sachant le prototype de la fonction decrypt, le script trouve toutes les rĂ©fĂ©rences croisĂ©es Ă  cette fonction, tous les arguments, puis dĂ©chiffre 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, un alphabet personnalisĂ© utilisĂ© par la fonction de dĂ©codage base64 doit ĂȘtre dĂ©fini, et une variable globale contenant la longueur de la clĂ© (dans ce cas DWORD, voir figure 4) doit ĂȘtre dĂ©finie.

OceanLotus : mise Ă  jour de malwares pour macOS
Figure 4. Définition de la variable globale key_len

Dans la fenĂȘtre Function, vous pouvez faire un clic droit sur la fonction de dĂ©chiffrement et cliquer sur « Extraire et dĂ©chiffrer les arguments ». Le script doit placer les chaĂźnes dĂ©chiffrĂ©es dans les commentaires, comme indiquĂ© Ă  la figure 5.

OceanLotus : mise Ă  jour de malwares pour macOS
Figure 5. Le texte déchiffré est placé dans les commentaires

Ainsi, les chaĂźnes dĂ©chiffrĂ©es sont facilement regroupĂ©es dans la fenĂȘtre IDA xrefs pour cette fonction, comme montrĂ© Ă  la figure 6.

OceanLotus : mise Ă  jour de malwares pour macOS
Figure 6. Xrefs de la fonction f_decrypt

La version finale du script peut ĂȘtre trouvĂ©e sur Github repository.

Sortie

Comme déjà mentionné, OceanLotus améliore et met constamment à jour son ensemble d'outils. Cette fois, le groupe cyber a amélioré le logiciel malveillant pour les utilisateurs de Mac. Le code n'a pas beaucoup changé, mais étant donné que de nombreux utilisateurs de Mac ignorent les produits de sécurité, la protection contre la détection des malwares est moins prioritaire.

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 reste inconnu.

Indicateurs de compromis

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

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster