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é
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.
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.
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
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.
En plus de ce changement de configuration, l'exemple n'utilise pas de bibliothèque pour le filtrage réseau 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 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 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
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).
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.
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.
Figure 6. Xréfs vers la fonction f_decrypt
Le script final peut être trouvé sur
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
Source: habr.com