Dans ce post, nous allons expliquer comment le groupe cybercriminel OceanLotus (APT32 et APT-C-00) a récemment utilisé l'une des failles publiques pour , une vulnérabilité de corruption de la mémoire dans Microsoft Office, et comment le malware du groupe assure la persistance dans les systèmes compromis sans laisser de traces. Ensuite, nous décrirons comment, depuis début 2019, le groupe a utilisé des archives auto-extractibles pour exécuter du code.
OceanLotus se spécialise dans l'espionnage cybernétique, ciblant en priorité les pays d'Asie du Sud-Est. Les attaquants falsifient des documents pour attirer l'attention des victimes potentielles afin de les convaincre d'exécuter un backdoor, tout en développant leurs outils malveillants. Les méthodes utilisées pour créer des leurres varient selon les attaques — incluant des fichiers à 'double extension', des archives auto-extractibles, des documents avec macros, et des exploits connus.

Utilisation de l'exploit dans Microsoft Equation Editor
Au milieu de 2018, OceanLotus a mené une campagne exploitant la vulnérabilité CVE-2017-11882. L'un des documents malveillants du groupe cybercriminel a été analysé par des spécialistes du 360 Threat Intelligence Center (), incluant une description détaillée de l'exploit. Dans le post ci-dessous, un aperçu de ce type de document malveillant.
Première étape
Document FW Report on demonstration of former CNRP in Republic of Korea.doc (SHA-1: D1357B284C951470066AAA7A8228190B88A5C7C3) est similaire à celui mentionné dans l'étude ci-dessus. Il est intéressant car il cible des utilisateurs intéressés par la politique cambodgienne (CNRP - Parti de sauvetage national du Cambodge, dissous à la fin de 2017). Malgré l'extension .doc, le document est au format RTF (voir l'image ci-dessous), contient du code indésirable, ainsi que des éléments déformés.

Figure 1. 'Déchets' dans RTF
Malgré la présence d'éléments distordus, Word ouvre avec succès ce fichier RTF. Comme on peut le voir sur la figure 2, la structure EQNOLEFILEHDR avec un décalage de 0xC00 est suivie de l'en-tête MTEF, puis de l'enregistrement MTEF (figure 3) pour la police.

Figure 2. Valeurs d'enregistrement FONT

Figure 3.
Possible débordement dans le champ nom, car sa taille n'est pas vérifiée avant la copie. Un nom trop long déclenche une vulnérabilité. Comme le montre le contenu du fichier RTF (décalage 0xC26 sur la figure 2), le tampon est rempli de shellcode, suivi d'une commande factice (0x90) et d'une adresse de retour 0x402114. L'adresse est un élément de dialogue dans EQNEDT32.exe, indiquant l'instruction RET. Cela conduit à ce que l'EIP pointe vers le début du champ nom, contenant du shellcode.

Figure 4. Début du shellcode de l'exploit
Adresse 0x45BD3C stocke une variable qui est déréférencée jusqu'à atteindre le pointeur de la structure actuellement chargée MTEFData. Ici se trouve le reste du shellcode.
L'objectif du shellcode est l'exécution d'un second fragment de shellcode intégré dans le document ouvert. D'abord, le shellcode d'origine tente de trouver le descripteur de fichier du document ouvert, en parcourant tous les descripteurs du système (NtQuerySystemInformation avec l'argument SystemExtendedHandleInformation) et en vérifiant si PID le descripteur et PID www.iphones.ru/iNotes/sravnenie-apple-pencil-1-i-apple-pencil-2-chto-izmenilos-11-13-2018 WinWord et si le document a été ouvert avec un masque d'accès – 0x12019F.
Pour confirmer la détection du bon descripteur (et non d'un descripteur d'un autre document ouvert), le contenu du fichier est affiché à l'aide de la fonction CreateFileMapping, et le shellcode vérifie si les quatre derniers octets du document sont «yyyy» (méthode de la chasse aux œufs). Une fois une correspondance détectée, le document est copié dans un dossier temporaire (GetTempPath) comme ole.dll. Ensuite, les 12 derniers octets du document sont lus.
![]()
Figure 5. Marqueurs de fin de document
Une valeur 32 bits entre les marqueurs AABBCCDD et yyyy – est le déplacement vers le prochain shellcode. Il est appelé via la fonction CreateThread. Le même shellcode que celui utilisé par le groupe OceanLotus précédemment a été extrait. , que nous avons publié en mars 2018, fonctionne toujours pour le dumping de la seconde étape.
Deuxième étape
Extraction des composants
Les noms de fichiers et de répertoires sont sélectionnés dynamiquement. Le code choisit aléatoirement un nom de fichier exécutable ou DLL dans C:Windowssystem32. Ensuite, il interroge ses ressources et extrait le champ FileDescription à utiliser comme nom de dossier. Si cela ne fonctionne pas, le code choisit aléatoirement un nom de dossier à partir des répertoires %ProgramFiles% ou C:Windows (à partir de GetWindowsDirectoryW). Il évite d'utiliser un nom qui pourrait entrer en conflit avec des fichiers existants et s'assure qu'il ne contient pas les mots suivants : windows, par Microsoft, desktop, system, system32 ou syswow64. Si le répertoire existe déjà, le nom est complété par « NLS_{6 caractères} ».
Ressource 0x102 est analysé et les fichiers sont déversés dans %ProgramFiles% ou %AppData%, dans un dossier choisi au hasard. L'heure de création est modifiée pour avoir les mêmes valeurs que kernel32.dll.
. Par exemple, voici le dossier et la liste des fichiers, créés en sélectionnant un fichier exécutable. C:Windowssystem32TCPSVCS.exe comme source de données.

Figure 6. Extraction de différents composants
Structure de la ressource 0x102 dans le dropper est assez complexe. En deux mots, il contient :
— Noms de fichiers
— Taille et contenu des fichiers
— Format de compression (COMPRESSION_FORMAT_LZNT1, utilisé par la fonction RtlDecompressBuffer)
Le premier fichier est écrit comme TCPSVCS.exe, qui est légitime AcroTranscoder.exe (selon FileDescription, SHA-1 : 2896738693A8F36CC7AD83EF1FA46F82F32BE5A3).
Vous avez peut-être remarqué que la taille de certains fichiers DLL dépasse 11 Mo. Cela est dû au fait qu'un grand tampon continu de données aléatoires est intégré dans le fichier exécutable. Il est possible que cela soit une méthode pour éviter la détection par certains produits de sécurité.
Assurance de la persistance
Ressource 0x101 dans le dropper contient deux entiers de 32 bits qui définissent comment assurer la persistance. La valeur du premier indique comment le logiciel malveillant tiendra sa persistance sans privilèges d'administrateur.

Tableau 1. Mécanisme de persistance sans privilèges d'administrateur
La valeur du deuxième entier indique comment le logiciel malveillant doit assurer la persistance, fonctionnant avec des privilèges d'administrateur.

Tableau 2. Mécanisme de persistance avec privilèges d'administrateur
Le nom du service est le nom du fichier sans extension ; le nom affiché est le nom du dossier, mais s'il existe déjà, une chaîne “Révision 1” est ajoutée (le nombre augmente jusqu'à ce qu'un nom inutilisé soit trouvé). Les opérateurs ont veillé à ce que la persistance via le service soit robuste - en cas d'échec, le service doit être redémarré après 1 seconde. Ensuite, la valeur de WOW64 la nouvelle clé de registre du service est définie sur 4, ce qui indique qu'il s'agit d'un service 32 bits.
La tâche planifiée est créée via plusieurs interfaces COM : ITaskScheduler, ITask, ITaskTrigger, IPersistFile et ITaskScheduler. En gros, le logiciel malveillant crée une tâche cachée, établit des informations sur le compte avec les informations de l'utilisateur actuel ou de l'administrateur, puis définit un déclencheur.
Il s'agit d'une tâche quotidienne d'une durée de 24 heures avec des intervalles de 10 minutes entre deux exécutions, ce qui signifie qu'elle sera exécutée en continu.
Bit malveillant
Dans notre exemple, le fichier exécutable TCPSVCS.exe (AcroTranscoder.exe) est un logiciel légitime qui charge des DLL, qui sont supprimées avec lui. Dans ce cas, il est intéressant de noter Flash Video Extension.dll.
Sa fonction DLLMain appelle simplement une autre fonction. Il existe quelques prédicats flous :

Figure 7. Prédicats flous
Après ces vérifications trompeuses, le code obtient une section .text fichiers TCPSVCS.exe, en modifiant sa protection en PAGE_EXECUTE_READWRITE et la réécrit, en ajoutant des instructions factices :

Figure 8. Séquence des instructions
À la fin, à l'adresse de la fonction FLVCore::Uninitialize(void), exportée Flash Video Extension.dll, une instruction est ajoutée CALL. Cela signifie qu'après le chargement de la DLL malveillante, lorsque l'environnement d'exécution appelle WinMain dans TCPSVCS.exe, le pointeur d'instruction pointera sur NOP, entraînant ainsi l'appel de FLVCore::Uninitialize(void), l'étape suivante.
La fonction crée simplement un mutex, commençant par {181C8480-A975-411C-AB0A-630DB8B0A221}, suivi du nom d'utilisateur actuel. Ensuite, elle lit le fichier supprimé avec l'extension *.db3, qui contient du code indépendant de la position, et utilise CreateThread pour exécuter son contenu.
Le contenu du fichier *.db3 est un shellcode généralement utilisé par le groupe OceanLotus. Nous avons une fois de plus réussi à décompresser sa charge utile en utilisant un script d'émulateur que nous avons publié .
Le script extrait l'étape finale. Ce composant est un backdoor que nous avons déjà analysé dans . Cela peut être identifié par le GUID {A96B020F-0000-466F-A96D-A91BBF8EAC96} du fichier binaire. La configuration du malware est toujours chiffrée dans la ressource PE. Elle a une configuration à peu près identique, mais les serveurs C&C diffèrent de précédemment :
- andreagahuvrauvin[.]com
- byronorenstein[.]com
- stienollmache[.]xyz
Le groupe OceanLotus montre à nouveau une combinaison de différentes techniques pour éviter la détection. Ils sont revenus avec un schéma de processus d'infection « amélioré ». En choisissant des noms aléatoires et en remplissant les fichiers exécutables de données aléatoires, ils réduisent le nombre d'IoC fiables (basés sur les hachages et les noms de fichiers). De plus, grâce à l'utilisation d'un téléchargement DLL tiers, les attaquants n'ont qu'à supprimer le binaire légitime AcroTranscoder.
Archives auto-extractibles
Après les fichiers RTF, le groupe est passé à des archives auto-extractibles (SFX) avec des icônes de documents courants, afin de dérouter encore plus l'utilisateur. À ce sujet, Threatbook a écrit (). Après le lancement, les fichiers RAR autoinstallables sont extraits et les DLL avec l'extension .ocx sont exécutées, la charge utile finale ayant été documentée précédemment. {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll. Depuis la mi-janvier 2019, OceanLotus utilise à nouveau cette technique mais modifie certaines configurations au fil du temps. Dans cette section, nous allons parler de la technique et des changements.
Création d'appâts
Document THICH-THONG-LAC-HANH-THAP-THIEN-VIET-NAM (1).EXE (SHA-1: AC10F5B1D5ECAB22B7B418D6E98FA18E32BBDEAB) découvert pour la première fois en 2018. Ce fichier SFX est créé avec soin – dans la description (Version Info) il est dit que c'est une image JPEG. Le script SFX est le suivant :

Figure 9. Commandes SFX
Le logiciel malveillant extraira {9ec60ada-a200-4159-b310-8071892ed0c3}.ocx (SHA-1: EFAC23B0E6395B1178BCF7086F72344B24C04DCC), ainsi qu'une image 2018 thich thong lac.jpg.
L'image d'appât est la suivante :

Figure 10. Image d'appât
Vous avez peut-être remarqué que les deux premières lignes du script SFX appellent deux fois le fichier OCX, mais ce n'est pas une erreur.
{9ec60ada-a200-4159-b310-8071892ed0c3}.ocx (ShLd.dll)
Le flux de contrôle du fichier OCX est très similaire à d'autres composants d'OceanLotus – beaucoup de séquences de commandes JZ/JNZ et PUSH/RET, alternant avec du code obfusqué.

Figure 11. Code obfusqué
Après filtrage du code obfusqué, l'exportation DllRegisterServer, appelée par regsvr32.exe, est la suivante :

Figure 12. Code principal de l'installateur
En effet, lors du premier appel, DllRegisterServer l'exportation définit la valeur du registre HKCUSOFTWAREClassesCLSID{E08A0F4B-1F65-4D4D-9A09-BD4625B9C5A1}Model pour un décalage chiffré dans la DLL (0x10001DE0).
Lorsque la fonction est appelée une deuxième fois, elle lit la même valeur et s'exécute à cette adresse. Les ressources et de nombreuses actions en mémoire sont alors lues et exécutées.
Le shellcode est le même chargeur PE utilisé dans les campagnes précédentes d'OceanLotus. Il peut être émulé avec . En fin de compte, il extrait db293b825dcc419ba7dc2c49fa2757ee.dll, le charge en mémoire et l'exécute. DllEntry.
La DLL extrait le contenu de sa ressource, le déchiffre (AES-256-CBC) et le décompresse (LZMA). La ressource a un format spécifique qui peut être facilement décompilé.

Figure 13. Structure de configuration de l'installateur (KaitaiStruct Visualizer)
La configuration est clairement définie – selon le niveau de privilège, les données binaires seront écrites dans %appdata%IntellogsBackgroundUploadTask.cpl ou %windir%System32BackgroundUploadTask.cpl ou SysWOW64 pour les systèmes 64 bits).
Ensuite, la persistance est assurée en créant une tâche nommée BackgroundUploadTask[junk].job, où [junk] représente un ensemble d'octets 0x9D et 0xA0.
Nom de l'application de la tâche %windir%System32control.exe, et la valeur du paramètre est le chemin vers le fichier binaire téléchargé. La tâche cachée s'exécute chaque jour.
Constructivement, le fichier CPL est une DLL avec un nom interne ac8e06de0a6c4483af9837d96504127e.dll, qui exporte la fonction CPlApplet. Ce fichier déchiffre sa seule ressource {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll, puis charge cette DLL et appelle son unique exportation DllEntry.
Le fichier de configuration du backdoor
La configuration du backdoor est chiffrée et intégrée dans ses ressources. La structure du fichier de configuration est très similaire à celle précédente.

Figure 14. Structure de la configuration du backdoor (KaitaiStruct Visualizer)
Bien qu'ayant une structure similaire, les valeurs de nombreux champs ont été mises à jour par rapport aux données fournies dans .
Le premier élément du tableau binaire contient la DLL (HttpProv.dll MD5: 2559738D1BD4A999126F900C7357B759), . Mais comme le nom de l'exportation a été retiré du fichier binaire, les hashes ne correspondent pas.
Recherches supplémentaires
En collectant des échantillons, nous avons remarqué certaines caractéristiques. L'échantillon décrit ci-dessus est apparu vers juillet 2018, et d'autres semblables lui ont été découverts tout récemment, entre janvier et début février 2019. Un fichier SFX a été utilisé comme vecteur d'infection, déversant un document légitime comme appât et un fichier malveillant OCX.
Bien que OceanLotus utilise de faux timestamps, nous avons remarqué que les timestamps des fichiers SFX et OCX sont toujours identiques (0x57B0C36A (14/08/2016 @ 19:15 UTC) et 0x498BE80F (06/02/2009 @ 07:34 UTC) respectivement). Cela indique probablement que les auteurs disposent d'un certain 'constructeur', qui utilise les mêmes modèles et change juste quelques caractéristiques.
Parmi les documents que nous avons examinés depuis début 2018, divers titres indiquent les pays d'intérêt des attaquants :
— The New Contact Information Of Cambodia Media(New).xls.exe
— 李建香 (个人简历).exe (faux document PDF d'un CV)
— feedback, Rally in USA from July 28-29, 2018.exe
Depuis la découverte du backdoor {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll et la publication de son analyse par plusieurs chercheurs, nous avons observé quelques changements dans les données de configuration des logiciels malveillants.
Tout d'abord, les auteurs ont commencé à supprimer les noms des DLL auxiliaires (DNSprov.dll et deux versions HttpProv.dll). Ensuite, les opérateurs ont cessé d'emballer la troisième DLL (deuxième version HttpProv.dll), choisissant d'intégrer uniquement une.
Deuxièmement, de nombreux champs de configuration du backdoor ont été modifiés, probablement pour éviter la détection, car de nombreux IoCs sont devenus disponibles. Parmi les champs importants modifiés par les auteurs, on trouve les suivants :
- section du registre AppX modifiée (voir IoCs)
- chaîne de codage du mutex («def», «abc», «ghi»)
- numéro de port
Enfin, de nouvelles C&C sont apparues dans toutes les nouvelles versions analysées, listées dans la section IoCs.
Conclusions
OceanLotus continue d'évoluer. Le groupe cybernétique est concentré sur le perfectionnement et l'élargissement de ses outils et appâts. Les auteurs masquent les charges utiles malveillantes avec des documents accrocheurs, dont le sujet est pertinent pour les victimes supposées. Ils développent de nouveaux schémas et utilisent également des outils disponibles publiquement, comme l'exploit Editor d'Equation. De plus, ils perfectionnent les outils pour réduire le nombre d'artefacts restant sur les machines des victimes, diminuant ainsi la chance d'être détectés par les logiciels antivirus.
Indicateurs de compromis
Les indicateurs de compromis, ainsi que les attributs MITRE ATT&CK, sont disponibles et .
Source : habr.com
