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
Figure 1. Corbeille dans RTFMalgré 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 2. Valeurs d'enregistrement FONT Figure 3. Format d'enregistrement FONT
Figure 3. Format d'enregistrement FONTUn 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
Figure 4. Début du shellcode d'exploitationL'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
Figure 5. Marqueurs de fin de documentLa 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
Figure 6. Extraction de divers composantsLa 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
Tableau 1. Mécanisme de persistance sans droits d'administrateurLa 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
Tableau 2. Mécanisme de persistance avec droits d'administrateurUn 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
Figure 7. Prédicats flousAprè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
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[.]xyzOceanLotus 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
Figure 9. Commandes SFXLe 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
Figure 10. L'image de l'appâtVous 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
Figure 11. Code obscurciAprès avoir filtré le code indésirable, l'exportation 
DllRegisterServer appelée par 
regsvr32.exe ressemble Ă  ceci:
 Figure 12. Code d'installation de base
Figure 12. Code d'installation de baseEn 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)
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)
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.exeDepuis 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 .