ESET: Nouveaux schémas de livraison de porte dérobée OceanLotus Cybergroup

Dans un article, nous décrirons comment le cyber-groupe OceanLotus (APT32 et APT-C-00) a récemment utilisé l'un des exploits publics pour CVE-2017-11882 , la vulnérabilité de corruption de mémoire dans Microsoft Office et comment le logiciel malveillant de groupe assure la persistance dans les systèmes compromis sans laisser de traces. . Ensuite, nous décrivons comment, depuis le début de 2019, le groupe a utilisé des archives auto-extractibles pour exécuter le code.

OceanLotus est spécialisé dans le cyberespionnage, avec des objectifs prioritaires en Asie du Sud-Est. Les attaquants falsifient des documents qui attirent l'attention des victimes potentielles pour les convaincre d'effectuer une porte dérobée et travaillent également au développement d'outils. Les méthodes utilisées pour créer des leurres varient selon les attaques - des fichiers à "double extension", des archives auto-extractibles, des documents avec des macros aux exploits connus.


Utilisation d'un exploit dans Microsoft Equation Editor


Mi-2018, OceanLotus a lancé une campagne utilisant la vulnérabilité CVE-2017-11882. Un des documents malveillants du cybergroupe a été analysé par 360 experts du Threat Intelligence Center (une étude en chinois ), y compris une description détaillée de l'exploit. Dans le post ci-dessous, un aperçu d'un tel document malveillant.

Première étape


Le 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 en ce qu'il cible les utilisateurs intéressés par la politique cambodgienne (CNRP - Cambodian's National Salvation Party, dissous fin 2017). Malgré l'extension .doc, le document a le format RTF (voir la figure ci-dessous), contient du code indésirable et est également déformé.


Figure 1. Corbeille dans RTF

Malgré la présence d'éléments déformés, Word ouvre correctement ce fichier RTF. Comme le montre la figure 2, voici la structure EQNOLEFILEHDR avec un décalage de 0xC00, suivie de l'en-tête MTEF, puis de l'entrée MTEF (figure 3) pour la police.


Figure 2. Valeurs d'enregistrement FONT


Figure 3. Format d'enregistrement FONT

Un débordement dans le champ du nom est possible, 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 code shell, suivi d'une commande fictive ( 0x90 ) et d'une adresse de retour 0x402114 . L'adresse est une boîte de dialogue dans EQNEDT32.exe qui pointe vers une instruction RET . Cela amène EIP à pointer vers le début du champ de nom contenant le shellcode.


Figure 4. Début du shellcode d'exploitation

L'adresse 0x45BD3C stocke une variable qui est déréférencée jusqu'à ce qu'elle atteigne un pointeur vers la structure MTEFData actuellement chargée. Voici le reste du shellcode.

Le but du code shell est d'exécuter le deuxième fragment du code shell incorporé dans un document ouvert. Tout d'abord, le shellcode source essaie de trouver le descripteur de fichier du document ouvert, NtQuerySystemInformation sur tous les descripteurs système ( NtQuerySystemInformation avec l'argument SystemExtendedHandleInformation ) et vérifiant si le descripteur PID et le processus PID de WinWord et si le document a été ouvert avec le masque d'accès - 0x12019F .

Pour confirmer la détection du descripteur correct (et non le descripteur d'un autre document ouvert), le contenu du fichier est affiché à l'aide de la fonction CreateFileMapping , et le code shell vérifie si les quatre derniers octets du document correspondent à " yyyy " (méthode de chasse aux œufs). Dès qu'une correspondance est trouvée, le document est copié dans un dossier temporaire ( GetTempPath ) en tant que ole.dll . Ensuite, les 12 derniers octets du document sont lus.


Figure 5. Marqueurs de fin de document

La valeur 32 bits entre les marqueurs AABBCCDD et yyyy est le décalage du prochain AABBCCDD . Il est appelé à l'aide de la fonction CreateThread . Extrait le même shellcode utilisé par OceanLotus auparavant. Le script d'émulation Python que nous avons publié en mars 2018 fonctionne toujours pour vider la deuxième étape.

Deuxième étape


Récupération des composants


Les noms de fichiers et de répertoires sont sélectionnés dynamiquement. Le code sélectionne de manière aléatoire le nom d'un fichier exécutable ou DLL dans C:\Windows\system32 . Il fait ensuite une demande à ses ressources et récupère le champ FileDescription pour l'utiliser comme nom de dossier. Si cela ne fonctionne pas, le code sélectionne au hasard le nom du dossier dans les répertoires %ProgramFiles% ou C:\Windows (dans GetWindowsDirectoryW). Il évite l'utilisation d'un nom susceptible d'entrer en conflit avec les fichiers existants et garantit qu'il ne contient pas les mots suivants: windows , Microsoft , desktop , system , system32 ou syswow64 . Si le répertoire existe déjà, "NLS_ {6 caractères}" est ajouté au nom.

La ressource 0x102 analysée et les fichiers sont transférés dans %ProgramFiles% ou %AppData% , dans un dossier sélectionné de manière aléatoire. Le temps de création a changé pour avoir les mêmes valeurs que kernel32.dll .

Par exemple, voici un dossier et une liste de fichiers créés en sélectionnant le fichier exécutable C:\Windows\system32\TCPSVCS.exe comme source de données.


Figure 6. Extraction de divers composants

La structure de la ressource 0x102 dans le compte-gouttes est assez compliquée. En résumé, 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 réinitialisé en tant que TCPSVCS.exe , qui est l' AcroTranscoder.exe légitime (selon FileDescription , SHA-1: 2896738693A8F36CC7AD83EF1FA46F82F32BE5A3 ).

Vous avez peut-être remarqué que certains fichiers DLL dépassent 11 Mo. Cela est dû au fait qu'un grand tampon contigu de données aléatoires se trouve à l'intérieur du fichier exécutable. Il est possible que ce soit un moyen d'éviter la détection par certains produits de sécurité.

Persistance


La ressource 0x101 dans le 0x101 contient deux entiers 32 bits qui déterminent comment maintenir la persistance. La valeur de la première indique comment le logiciel malveillant conservera sa persistance sans droits d'administrateur.


Tableau 1. Mécanisme de persistance sans droits d'administrateur

La valeur du deuxième entier indique comment le malware doit garantir la persistance tout en travaillant en tant qu'administrateur.


Tableau 2. Mécanisme de persistance avec droits d'administrateur

Un nom de service est un nom de fichier sans extension; le nom d'affichage est le nom du dossier, mais s'il existe déjà, la chaîne « Revision 1 » lui est ajoutée (le nombre augmente jusqu'à ce qu'un nom inutilisé soit trouvé). Les opérateurs se sont assurés que la persistance à travers le service était stable - en cas de panne, le service devrait être redémarré après 1 seconde. Ensuite, la valeur WOW64 de la nouvelle clé de Registre de 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 substance, le programme malveillant crée une tâche masquée, définit les informations de compte ainsi que des informations sur l'utilisateur ou l'administrateur actuel, puis définit le déclencheur.

Il s'agit d'une tâche quotidienne d'une durée de 24 heures et d'intervalles entre deux cycles de 10 minutes, ce qui signifie qu'elle sera effectuée en continu.

Bit malveillant


Dans notre exemple, le fichier exécutable TCPSVCS.exe ( AcroTranscoder.exe ) est un logiciel légitime qui télécharge les DLL qui en sont vidées. Dans ce cas, Flash Video Extension.dll présente un intérêt.

Sa fonction DLLMain appelle simplement une autre fonction. Certains prédicats flous sont présents:


Figure 7. Prédicats flous

Après ces vérifications trompeuses, le code reçoit la section .text du fichier TCPSVCS.exe , modifie sa protection en PAGE_EXECUTE_READWRITE et l'écrase en ajoutant des instructions factices:


Figure 8. La séquence d'instructions

À la fin, l'instruction CALL est ajoutée à l'adresse de la fonction FLVCore::Uninitialize(void) exportée par Flash Video Extension.dll . Cela signifie qu'après le chargement de la DLL malveillante, lorsque le runtime appelle WinMain dans TCPSVCS.exe , le pointeur d'instruction pointera vers NOP, entraînant l'appel à 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. Elle lit ensuite le fichier vidé avec l'extension * .db3, qui contient du code indépendant de la position, et utilise CreateThread pour exécuter le contenu.

Le contenu du fichier * .db3 est le shellcode couramment utilisé par le groupe OceanLotus. Encore une fois, nous avons réussi à décompresser sa charge utile à l'aide du script d'émulateur que nous avons publié sur GitHub .

Le script récupère l'étape finale. Ce composant est une porte dérobée que nous avons déjà analysée dans une précédente étude OceanLotus . Cela peut être déterminé par le GUID {A96B020F-0000-466F-A96D-A91BBF8EAC96} fichier binaire. La configuration du logiciel malveillant est toujours chiffrée dans la ressource PE. Il a à peu près la même configuration, mais les serveurs C&C sont différents des précédents:

- andreagahuvrauvin[.]com
- byronorenstein[.]com
- stienollmache[.]xyz


OceanLotus démontre à nouveau une combinaison de différentes techniques pour éviter la détection. Ils sont revenus avec un aperçu «raffiné» du processus d'infection. En choisissant des noms aléatoires et en remplissant les fichiers exécutables avec des données aléatoires, ils réduisent le nombre d'IoC de confiance (en fonction des hachages et des noms de fichiers). De plus, grâce à l'utilisation du chargement de DLL tiers, les attaquants n'ont qu'à supprimer le binaire AcroTranscoder légitime.

Archives auto-extractibles


Après les fichiers RTF, le groupe est passé aux archives auto-extractibles (SFX) avec des icônes de document communes pour embrouiller davantage l'utilisateur. Ceci a été écrit par Threatbook ( lien en chinois ). Après le démarrage, les fichiers RAR auto-extractibles sont vidés et les DLL avec l'extension .ocx sont exécutées, dont la charge utile finale a été précédemment documentée {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll . Depuis la mi-janvier 2019, OceanLotus a réutilisé cette technique, mais au fil du temps, certaines configurations ont changé. Dans cette section, nous parlerons de la technologie et des changements.

Création d'appâts


Le document THICH-THONG-LAC-HANH-THAP-THIEN-VIET-NAM (1).EXE (SHA-1: AC10F5B1D5ECAB22B7B418D6E98FA18E32BBDEAB ) a été trouvé en 2018. Ce fichier SFX a été créé à bon escient - la description ( Info version ) indique qu'il s'agit d'une image JPEG. Le script SFX est le suivant:


Figure 9. Commandes SFX

Le malware réinitialise {9ec60ada-a200-4159-b310-8071892ed0c3}.ocx (SHA-1: EFAC23B0E6395B1178BCF7086F72344B24C04DCC ), ainsi que l'image 2018 thich thong lac.jpg.

L'image de l'appât est la suivante:


Figure 10. L'image de l'appât

Vous avez peut-être remarqué que les deux premières lignes du script SFX appellent le fichier OSX deux fois, mais ce n'est pas une erreur.

{9ec60ada-a200-4159-b310-8071892ed0c3} .ocx (ShLd.dll)


Le flux de contrôle de fichiers OSX est très similaire à d'autres composants OceanLotus - il existe de nombreuses séquences de commandes JZ/JNZ et PUSH/RET alternant avec du code indésirable.


Figure 11. Code obscurci

Après avoir filtré le code indésirable, l'exportation DllRegisterServer appelée par regsvr32.exe ressemble à ceci:


Figure 12. Code d'installation de base

En fait, la première fois que DllRegisterServer appelé DllRegisterServer exportation définit la valeur de Registre HKCU\SOFTWARE\Classes\CLSID\{E08A0F4B-1F65-4D4D-9A09-BD4625B9C5A1}\Model pour l'offset chiffré dans la DLL ( 0x10001DE0 ).

Lorsqu'une fonction est appelée une deuxième fois, elle lit la même valeur et s'exécute à cette adresse. De là, une ressource est lue et exécutée et de nombreuses actions en RAM.

Le shellcode est le même chargeur PE utilisé dans les campagnes OceanLotus précédentes. Il peut être émulé en utilisant notre script . Par conséquent, il db293b825dcc419ba7dc2c49fa2757ee.dll , le charge en mémoire et exécute DllEntry .

La DLL extrait le contenu de sa ressource, la déchiffre (AES-256-CBC) et la décompresse (LZMA). La ressource a un format spécifique facile à décompiler.


Figure 13. Structure de configuration de l'installateur (KaitaiStruct Visualizer)

La configuration est définie explicitement - selon le niveau de privilège, les données binaires seront écrites dans %appdata%\Intel\logs\BackgroundUploadTask.cpl ou %windir%\System32\BackgroundUploadTask.cpl (ou SysWOW64 pour les systèmes 64 bits).

La persistance est alors assurée en créant une tâche nommée BackgroundUploadTask[junk].job , où [junk] est un ensemble d'octets 0x9D et 0xA0 .

Le nom d'application de la tâche est %windir%\System32\control.exe et la valeur du paramètre est le chemin d'accès au fichier binaire non chargé. La tâche cachée s'exécute tous les jours.

Structurellement, le fichier CPL est une DLL avec le 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 sa seule exportation DllEntry .

Fichier de configuration de porte dérobée


La configuration de la porte dérobée est chiffrée et intégrée dans ses ressources. La structure du fichier de configuration est très similaire à la précédente.


Figure 14. Structure de configuration de la porte dérobée (KaitaiStruct Visualizer)

Malgré la structure similaire, les valeurs de nombreux champs ont été mises à jour par rapport aux données fournies dans notre ancien rapport .

Le premier élément du tableau binaire contient la DLL ( HttpProv.dll MD5: 2559738D1BD4A999126F900C7357B759 ) identifiée par Tencent . Mais puisque le nom d'exportation a été supprimé du binaire, les hachages ne correspondent pas.

Recherches supplémentaires


En collectant des échantillons, nous avons attiré l'attention sur certaines caractéristiques. L'échantillon qui vient d'être décrit est apparu vers juillet 2018, et d'autres l'aiment tout récemment, à la mi-janvier - début février 2019. Une archive SFX a été utilisée comme vecteur d'infection, déversant un document d'appât légitime et un fichier OSX malveillant.

Bien qu'OceanLotus utilise de faux horodatages, nous avons remarqué que les horodatages des fichiers SFX et OCX sont toujours les mêmes ( 0x57B0C36A ( 0x57B0C36A à 19h15 UTC) et 0x498BE80F (02/06/2009 à 0x498BE80F UTC). ) respectivement). Cela indique probablement que les auteurs ont un certain «constructeur» qui utilise les mêmes modèles et modifie simplement certaines caractéristiques.

Parmi les documents que nous avons étudiés depuis début 2018, il existe différents noms qui indiquent les pays d'intérêt des agresseurs:

- Les nouvelles coordonnées des médias cambodgiens (nouveau) .xls.exe
- 李建 香 (个人 简历) .exe (faux document pdf d'un CV)
- feedback, rallye aux USA du 28 au 29 juillet 2018.exe

Depuis la découverte de la porte dérobée {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll et la publication de son analyse par plusieurs chercheurs, nous avons observé certains changements dans les données de configuration des logiciels malveillants.

Tout d'abord, les auteurs ont commencé à supprimer les noms des DLL DLL auxiliaires ( DNSprov.dll et deux versions de HttpProv.dll ). Ensuite, les opérateurs ont arrêté de HttpProv.dll la troisième DLL (la deuxième version de HttpProv.dll ), choisissant d'en incorporer une seule.

Deuxièmement, de nombreux champs de configuration de porte dérobée ont été modifiés, probablement pour éviter la détection, car de nombreux IoC sont devenus disponibles. Parmi les domaines importants modifiés par les auteurs figurent les suivants:

  • ClĂ© de registre AppX modifiĂ©e (voir IoC)
  • chaĂ®ne de codage mutex ("def", "abc", "ghi")
  • numĂ©ro de port

Enfin, dans toutes les nouvelles versions analysées, les nouveaux C&C sont répertoriés dans la section IoCs.

Conclusions


OceanLotus continue d'évoluer. Le cybergroupe se concentre sur le raffinement et l'expansion des outils et des leurres. Les auteurs masquent des charges utiles malveillantes à l'aide de documents accrocheurs pertinents pour les victimes présumées. Ils développent de nouvelles conceptions et utilisent également des outils accessibles au public, tels que l'exploit Equation Editor. De plus, ils perfectionnent les outils pour réduire le nombre d'artefacts restant sur les machines des victimes, réduisant ainsi les chances de détection par un logiciel antivirus.

Indicateurs de compromis


Les indicateurs de compromis ainsi que les attributs MITRE ATT & CK sont disponibles sur Welivesecurity et sur GitHub .

Source: https://habr.com/ru/post/fr446604/


All Articles