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 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 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'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 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 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'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'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 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À 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 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â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 obscurciAprès avoir filtré le code indésirable, l'exportation
DllRegisterServer
appelée par
regsvr32.exe
ressemble Ă ceci:
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)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.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 .