Dans cet article, nous vous expliquerons comment le cybergroupe OceanLotus (APT32 et APT-C-00) a récemment utilisé l'un des exploits accessibles au public pour
OceanLotus est spécialisé dans le cyberespionnage, ses cibles prioritaires étant les pays d'Asie du Sud-Est. Les attaquants forgent des documents qui attirent l'attention des victimes potentielles afin de 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 pots de miel varient selon les attaques, depuis les fichiers « à double extension », les archives auto-extractibles, les documents avec des macros, jusqu'aux exploits connus.
Utilisation d'un exploit dans Microsoft Equation Editor
Mi-2018, OceanLotus a mené une campagne exploitant la vulnérabilité CVE-2017-11882. L'un des documents malveillants du cybergroupe a été analysé par les spécialistes du 360 Threat Intelligence Center (
La 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 s'adresse aux utilisateurs intéressés par la politique cambodgienne (CNRP - Cambodge National Rescue Party, dissous fin 2017). Malgré l'extension .doc, le document est au format RTF (voir image ci-dessous), contient du code inutile et est également déformé.
Figure 1. « Déchets » en RTF
Même s'il y a des éléments tronqués, Word ouvre ce fichier RTF avec succès. Comme vous pouvez le voir sur la figure 2, il existe une structure EQNOLEFILEHDR au décalage 0xC00, suivie d'un en-tête MTEF, puis d'une entrée MTEF (figure 3) pour la police.
Figure 2. Valeurs d'entrée FONT
Figure 3.
Débordement possible sur le terrain prénom, car sa taille n'est pas vérifiée avant la copie. Un nom trop long déclenche une vulnérabilité. Comme vous pouvez le voir d'après le contenu du fichier RTF (offset 0xC26 sur la figure 2), le tampon est rempli de shellcode suivi d'une commande factice (0x90
) et adresse de retour 0x402114
. L'adresse est un élément de dialogue dans EQNEDT32.exe
, indiquant les instructions RET
. Cela fait qu'EIP pointe vers le début du champ prénomcontenant le shellcode.
Figure 4. Début du shellcode de l'exploit
adresse 0x45BD3C
stocke une variable qui est déréférencée jusqu'à ce qu'elle atteigne un pointeur vers la structure actuellement chargée MTEFData
. Le reste du shellcode est ici.
Le but du shellcode est d'exécuter le deuxième morceau de shellcode intégré dans le document ouvert. Le shellcode d'origine essaie d'abord de trouver le descripteur de fichier du document ouvert en itérant sur tous les descripteurs système (NtQuerySystemInformation
avec une argumentation SystemExtendedHandleInformation
) et vérifier s'ils correspondent PID descripteur et PID processus WinWord
et si le document a été ouvert avec un masque d'accès - 0x12019F
.
Pour confirmer que le bon handle a été trouvé (et non le handle 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 correspondent à "yyyy
"(Méthode de chasse aux œufs). Une fois qu'une correspondance est trouvée, le document est copié dans un dossier temporaire (GetTempPath
) comment ole.dll
. Ensuite, les 12 derniers octets du document sont lus.
Figure 5. Fin des marqueurs de document
Valeur de 32 bits entre les marqueurs AABBCCDD
и yyyy
est le décalage du prochain shellcode. Il est appelé à l'aide de la fonction CreateThread
. Extrait du même shellcode que celui utilisé précédemment par le groupe OceanLotus.
La deuxième étape
Suppression de composants
Les noms de fichiers et de répertoires sont choisis dynamiquement. Le code sélectionne aléatoirement le nom de l'exécutable ou du fichier DLL dans C:Windowssystem32
. Il fait ensuite une requête à ses ressources et récupère le champ FileDescription
à utiliser comme nom de dossier. Si cela ne fonctionne pas, le code sélectionne au hasard un nom de dossier dans les 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 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.
ressource 0x102
est analysé et les fichiers sont vidés dans %ProgramFiles%
ou %AppData%
, dans un dossier sélectionné au hasard. Modification de l'heure de création pour avoir les mêmes valeurs que kernel32.dll
.
Par exemple, voici le dossier et la liste des fichiers créés en sélectionnant l'exécutable C:Windowssystem32TCPSVCS.exe
comme source de données.
Figure 6. Extraction de divers composants
Structure des ressources 0x102
dans un compte-gouttes est assez complexe. En quelques mots, il contient :
— Noms de fichiers
— Taille et contenu du fichier
— Format de compression (COMPRESSION_FORMAT_LZNT1
, utilisé par la fonction RtlDecompressBuffer
)
Le premier fichier est réinitialisé comme TCPSVCS.exe
, ce qui est légitime AcroTranscoder.exe
(selon FileDescription
, SHA-1 : 2896738693A8F36CC7AD83EF1FA46F82F32BE5A3
).
Vous avez peut-être remarqué que certains fichiers DLL pèsent plus de 11 Mo. En effet, un grand tampon contigu de données aléatoires est placé à 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é.
Assurer la persévérance
ressource 0x101
dans le compte-gouttes contient deux entiers de 32 bits qui spécifient comment la persistance doit être fournie. La valeur du premier spécifie comment le malware persistera sans droits d'administrateur.
Tableau 1. Mécanisme de persistance sans droits d'administrateur
La valeur du deuxième entier spécifie la manière dont le logiciel malveillant doit assurer sa persistance lorsqu'il est exécuté avec des droits d'administrateur.
Tableau 2. Mécanisme de persistance avec droits d'administrateur
Le nom du service est le nom du fichier sans extension ; le nom d'affichage est le nom du dossier, mais s'il existe déjà, la chaîne " lui est ajoutéeRevision 1
» (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 de panne, le service doit être redémarré après 1 seconde. Alors la valeur WOW64
La clé de registre du nouveau service est définie sur 4, indiquant qu'il s'agit d'un service 32 bits.
Une tâche planifiée est créée via plusieurs interfaces COM : ITaskScheduler
, ITask
, ITaskTrigger
, IPersistFile
и ITaskScheduler
. Essentiellement, le logiciel malveillant crée une tâche cachée, définit les informations du compte ainsi que les informations de l'utilisateur ou de 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'un intervalle entre deux exécutions de 10 minutes, ce qui signifie qu'elle s'exécutera en continu.
Morceau malveillant
Dans notre exemple, le fichier exécutable TCPSVCS.exe
(AcroTranscoder.exe
) est un logiciel légitime qui charge les DLL qui sont réinitialisées en même temps. Dans ce cas, il est intéressant Flash Video Extension.dll
.
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 obtient une section .text
dossier TCPSVCS.exe
, change sa défense en PAGE_EXECUTE_READWRITE
et le réécrit en ajoutant des instructions factices :
Figure 8. Séquence d'instructions
A la fin de l'adresse de la fonction FLVCore::Uninitialize(void)
, exporté Flash Video Extension.dll
, l'instruction est ajoutée CALL
. Cela signifie qu'après le chargement de la DLL malveillante, lorsque le runtime appelle WinMain
в TCPSVCS.exe
, le pointeur d'instruction pointera vers NOP, provoquant FLVCore::Uninitialize(void)
, étape suivante.
La fonction crée simplement un mutex commençant par {181C8480-A975-411C-AB0A-630DB8B0A221}
suivi du nom d'utilisateur actuel. Il lit ensuite le fichier *.db3 sauvegardé, 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 que le groupe OceanLotus utilise généralement. Nous avons de nouveau réussi à décompresser sa charge utile à l'aide du script d'émulateur que nous avons publié.
Le script extrait la scène finale. Ce composant est une porte dérobée, que nous avons déjà analysée dans {A96B020F-0000-466F-A96D-A91BBF8EAC96}
fichier binaire. La configuration du malware 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
L'équipe OceanLotus démontre à nouveau une combinaison de différentes techniques pour éviter la détection. Ils sont revenus avec un diagramme « raffiné » du processus d’infection. En choisissant des noms aléatoires et en remplissant les exécutables avec des 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 de chargements de DLL tiers, les attaquants n'ont qu'à supprimer le fichier binaire légitime. AcroTranscoder
.
Archives auto-extractibles
Après les fichiers RTF, le groupe est passé aux archives auto-extractibles (SFX) avec des icônes de documents communes pour semer davantage la confusion chez l'utilisateur. Threatbook a écrit à ce sujet ({A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll
. Depuis mi-janvier 2019, OceanLotus réutilise cette technique, mais en modifiant certaines configurations au fil du temps. Dans cette section, nous parlerons de la technique et des changements.
Créer un leurre
document THICH-THONG-LAC-HANH-THAP-THIEN-VIET-NAM (1).EXE
(SHA-1 : AC10F5B1D5ECAB22B7B418D6E98FA18E32BBDEAB
) a été découvert pour la première fois en 2018. Ce fichier SFX a été créé judicieusement - dans la description (Informations de version), il est indiqué qu'il s'agit d'une image JPEG. Le script SFX ressemble à ceci :
Figure 9. Commandes SFX
Le malware se réinitialise {9ec60ada-a200-4159-b310-8071892ed0c3}.ocx
(SHA-1 : EFAC23B0E6395B1178BCF7086F72344B24C04DCC
), ainsi qu'une photo 2018 thich thong lac.jpg.
L'image du leurre ressemble à ceci :
Figure 10. Image leurre
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 d'un fichier OCX est très similaire à celui des autres composants OceanLotus - de nombreuses séquences de commandes JZ/JNZ
и PUSH/RET
, en alternance avec du code poubelle.
Figure 11. Code obscurci
Après avoir filtré le code indésirable, exportez DllRegisterServer
, appelé regsvr32.exe
, ressemble à ceci:
Figure 12. Code d'installation de base
En gros, au premier appel DllRegisterServer
l'exportation définit la valeur du registre HKCUSOFTWAREClassesCLSID{E08A0F4B-1F65-4D4D-9A09-BD4625B9C5A1}Model
pour le 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. À partir de là, la ressource et de nombreuses actions dans la RAM sont lues et exécutées.
Le shellcode est le même chargeur PE utilisé dans les campagnes OceanLotus précédentes. Il peut être émulé en utilisant db293b825dcc419ba7dc2c49fa2757ee.dll
, le charge en mémoire et exécute DllEntry
.
La DLL extrait le contenu de sa ressource, la décrypte (AES-256-CBC) et la décompresse (LZMA). La ressource a un format spécifique facile à décompiler.
Figure 13. Structure de configuration du programme d'installation (KaitaiStruct Visualizer)
La configuration est spécifiée explicitement - en fonction du 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).
Une persistance supplémentaire est assurée en créant une tâche avec le nom BackgroundUploadTask[junk].job
Où [junk]
représente un ensemble d'octets 0x9D
и 0xA0
.
Nom de l'application de tâche %windir%System32control.exe
, et la valeur du paramètre est le chemin d'accès au fichier binaire téléchargé. La tâche cachée s'exécute tous les jours.
Structurellement, un fichier CPL est une DLL avec un nom interne ac8e06de0a6c4483af9837d96504127e.dll
, qui exporte une fonction CPlApplet
. Ce fichier décrypte 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 crypté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)
Bien que la structure soit similaire, de nombreuses valeurs de champ ont été mises à jour par rapport à celles affichées dans
Le premier élément du tableau binaire contient une DLL (HttpProv.dll
MD5: 2559738D1BD4A999126F900C7357B759
),
Recherches supplémentaires
Lors de la collecte d’échantillons, nous avons remarqué certaines caractéristiques. Le spécimen que nous venons de décrire est apparu vers juillet 2018, et d’autres similaires sont apparus récemment, entre mi-janvier et début février 2019. L'archive SFX a été utilisée comme vecteur d'infection, laissant tomber un document leurre légitime et un fichier OSX malveillant.
Même si OceanLotus utilise de faux horodatages, nous avons remarqué que les horodatages des fichiers SFX et OCX sont toujours les mêmes (0x57B0C36A
(08/14/2016 à 7h15 UTC) et 0x498BE80F
(02/06/2009 à 7h34 UTC) respectivement). Cela indique probablement que les auteurs ont une sorte de « concepteur » 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, on retrouve différents noms indiquant les pays qui intéressent les attaquants :
— Les nouvelles coordonnées de Cambodge Media (New).xls.exe
— 李建香 (个人简历).exe (faux document pdf d'un CV)
— feedback, Rallye aux USA du 28 au 29 juillet 2018.exe
Depuis que la porte dérobée a été découverte {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 malwares.
Tout d’abord, les auteurs ont commencé à supprimer les noms des DLL d’assistance (DNSprov.dll
et deux versions HttpProv.dll
). Les opérateurs ont alors arrêté de packaging la troisième DLL (la deuxième version HttpProv.dll
), en choisissant d’en intégrer un seul.
Deuxièmement, de nombreux champs de configuration de porte dérobée ont été modifiés, probablement pour échapper à la détection à mesure que de nombreux IoC devenaient disponibles. Les champs importants modifiés par les auteurs incluent :
- Clé de registre AppX modifiée (voir IoC)
- chaîne d'encodage mutex ("def", "abc", "ghi")
- numéro de port
Enfin, toutes les nouvelles versions analysées ont de nouveaux C&C répertoriés dans la section IoCs.
résultats
OceanLotus continue de se développer. Le cybergroupe se concentre sur le raffinement et l’expansion des outils et des leurres. Les auteurs dissimulent les charges utiles malveillantes à l’aide de documents accrocheurs dont le sujet est pertinent pour les victimes visées. Ils développent de nouveaux schémas et utilisent également des outils accessibles au public, tels que l'exploit Equation Editor. De plus, ils améliorent 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
Des indicateurs de compromission ainsi que les attributs MITRE ATT&CK sont disponibles
Source: habr.com