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 __cfstringComme 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éesAprè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 sysctlSi 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_lenDans 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 commentaireAinsi, 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_decryptLe 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 .