OceanLotus: nouvelle porte dérobée, anciens schémas

Le groupe OceanLotus (alias APT32 et APT-C-00) est connu pour ses attaques en Asie de l'Est. L’année dernière, un certain nombre d’études sur les travaux du groupe ont été publiées, y compris des documents CyberReason , une revue FireEye et une description de l’attaque de Volexity . Comme nous pouvons le voir, le groupe met à jour les portes dérobées, l'infrastructure et les vecteurs d'infection.

OceanLotus continue de cibler les entreprises et les agences gouvernementales en Asie de l'Est. Selon la télémétrie ESET, les objectifs prioritaires d'OceanLotus sont au Vietnam, au Laos, au Cambodge et aux Philippines.

Il y a quelques mois, nous avons découvert et analysé l'une de leurs dernières portes dérobées. Il met en œuvre plusieurs outils qui rendent difficile l'analyse et évitent la détection - nous en discuterons dans un article.



Distribution


Les attaquants utilisent différentes méthodes pour convaincre la victime de lancer un compte-gouttes malveillant.

Double extensions et fausses icĂ´nes d'application (Word, PDF, etc.)


Les compte-gouttes sont susceptibles de se propager via des pièces jointes aux e-mails. Nous avons observé les noms de fichiers suivants:
- Mi17 Technical issues - Phonesack Grp.exe (Mi-17 - Modèle d'hélicoptère russe)
- Chi tiet don khieu nai gui saigontel.exe (traduit du vietnamien - «détails de la réclamation envoyée à Saigontel», Saigontel - société de télécommunications vietnamienne)
- Updated AF MOD contract - Jan 2018.exe
- remove_pw_Reschedule of CISD Regular Meeting.exe
- Sorchornor_with_PM_-_Sep_2017.exe
- 20170905-Evaluation Table.xls.exe
- CV_LeHoangThing.doc.exe (de faux CV ont également été trouvés au Canada)

Tous ces fichiers ont quelque chose en commun: lancer un document d'appât protégé par mot de passe. Il n'est pas clair si le mot de passe se trouve quelque part dans les données de la lettre transmise, ou si le document ne doit pas être ouvert.

Faux installateurs


Plusieurs faux installateurs se faisant passer pour des installateurs ou des mises à jour logicielles ont été repérés dans des campagnes de points d'eau. Un exemple est le programme d'installation de Firefox reconditionné décrit par 360 Labs sur Freebuf (en chinois).

Un autre échantillon que nous avons vu s'appelait RobototFontUpdate.exe . Il s'est probablement propagé à travers des sites compromis, mais nous n'en avons pas suffisamment de preuves.

Tous les fichiers décrits, qu'ils aient été distribués par courrier ou téléchargés lors de la visite d'un site compromis, livraient le même composant de porte dérobée. Dans un article, nous analyserons un échantillon de RobototFontUpdate.exe et montrerons comment il parvient à exécuter une charge utile malveillante sur le système.

Analyse technique


Le processus d'installation et d'exécution dépend de l'obfuscation multicouche, à savoir le chiffrement des composants, la reconstruction des fichiers PE, le chargement de shellcode et les techniques de chargement latéral. Ce dernier a été décrit dans la précédente étude Korplug d' ESET.

Examen des progrès


L'attaque se compose de deux parties: un compte-gouttes et un lanceur. Chaque étape de chaque partie du processus sera expliquée en détail dans la section correspondante. Les deux diagrammes ci-dessous donnent une brève idée de la progression globale du malware.


Figure 1. La progression du compte-gouttes


Figure 2. Progression de la porte dérobée

Presque tous ces composants sont obscurcis. L'obfuscation est basée sur des commandes de transition de paires conditionnelles complémentaires. Pour chacune des formes: JZ / JNZ, JP / JNP, JO / JNO et ainsi de suite, chaque paire effectue une transition vers le même objectif. La séquence est entrecoupée de code indésirable qui utilise le pointeur de pile mais ne modifie pas la valeur de l'indicateur conditionnel. Il s'avère que la transition se produit dans la même branche. Cela entraîne des problèmes lors du processus de décompilation en raison de l'utilisation de valeurs de pointeur de pile positives.


Figure 3. Transition conditionnelle complémentaire

De plus, certains éléments de base du programme ajoutent une adresse à la pile, après quoi ils se terminent par JMP / CALL, tandis que d'autres éléments de base ajoutent deux adresses et se terminent par la commande RET. Le second ajout d'élément est la fonction appelée, et le premier est l'adresse du prochain élément de programme de base où la transition sera effectuée. Ainsi, les éléments de base du programme sont créés sans objets parents.


Figure 4. Technique PUSH / JMP

Grâce à une combinaison de deux techniques d'obscurcissement, de «beaux» graphiques sont obtenus:


Figure 5. Obscurcir une séquence d'exécution

Remarquer le code indésirable est assez simple. Il peut être ignoré dans l'analyse des échantillons, si vous connaissez le schéma d'application.

Compte-gouttes


Étape 1. Document d'appât


Ces derniers mois, OceanLotus a utilisé plusieurs leurres. L'un d'eux est un faux logiciel pour mettre à jour la police TrueType Roboto Slab regular . Le choix d'une police semble un peu étrange, car il ne prend pas en charge de nombreuses langues d'Asie de l'Est.


Figure 6. IcĂ´ne de mise Ă  jour de la police RobototFontUpdate

Une fois exécuté, le fichier binaire déchiffre ses ressources (XOR, 128 octets, clé codée en dur) et restaure les données déchiffrées (LZMA). Fichier RobotoSlab-Regular.ttf légitime

(SHA1: 912895e6bb9e05af3a1e58a1da417e992a71a324 ) est écrit dans le dossier %temp% et lancé à l'aide de la fonction ShellExecute API Win32.

Le code shell décrypté à partir des ressources est exécuté. Après exécution, une fausse mise à jour de police implémente une autre application dont le seul but est de supprimer le compte-gouttes. Cette application d'effacement est %temp%\[0-9].tmp.exe tant que %temp%\[0-9].tmp.exe .

Étape 2. Code shell


À chaque étape, le même shellcode est utilisé.

Le shellcode est un chargeur PE personnalisé. Il restaure le fichier exécutable en mémoire - déchiffre toutes les sections et calcule les mouvements et autres retraits nécessaires. Le RtlMoveMemory utilise les trois fonctions de l'API Windows: VirtualAlloc , RtlZeroMemory et RtlZeroMemory .

La fonction RtlZeroMemory utilisée pour RtlZeroMemory champs dans l'en-tête PE. Le recours à un vidage automatique de la mémoire échouera, car les en-têtes MZ / PE sont corrompus.
Le code shell appelle la fonction de connexion PE déchiffrée, puis la DLLEntry exportation DLLEntry .

Étape 3. Le vrai compte-gouttes


{103004A5-829C-418E-ACE9-A7615D30E125}.dll
Cet exécutable déchiffre les ressources à l'aide de l'algorithme AES en mode CBC via l'API Windows. La clé codée en dur a une taille de 256 bits. Après décryptage, les données compressées sont décompressées (algorithme LZMA).

Si le processus est démarré avec des droits d'administrateur, les logiciels malveillants assurent la persistance en créant un service. Sinon, la clé de Registre Run classique est utilisée ( HKCU\SOFTWARE\Microsoft\ Windows\CurrentVersion\Run;DeviceAssociationService;rastlsc.exe ).

Si le code dropper est exécuté avec des droits d'administrateur, il essaie d'écrire les fichiers répertoriés ci-dessous dans le dossier C:\Program Files\Symantec\Symantec Endpoint Protection\12.1.671.4971.104a\DeviceAssociationService\ , sinon, les écrit dans le dossier %APPDATA%\Symantec\Symantec Endpoint Protection\12.1.671.4971.104a\DeviceAssociationService\ :

- rastlsc.exe (SHA1: 2616da1697f7c764ee7fb558887a6a3279861fac , copie de l'application légitime Symantec Network Access Control, dot1xtra.exe )
- SyLog.bin (SHA1: 5689448b4b6260ec9c35f129df8b8f2622c66a45 , porte dérobée cryptée)
- rastls.dll (SHA1: 82e579bd49d69845133c9aa8585f8bd26736437b , une DLL malveillante que rastlsc.exe )

Le chemin varie d'un échantillon à l'autre, mais la disposition est similaire. Selon les droits, le logiciel malveillant vide les fichiers dans %ProgramFiles% ou %appdata% . Nous avons également observé:

- \Symantec\CNG Key Isolation\
- \Symantec\Connected User Experiences and Telemetry\
- \Symantec\DevQuery Background Discovery Broker Tasks\

Ces chemins sont utilisés par divers produits Symantec.

Après avoir atteint la persistance et implémenté le fichier exécutable, un fichier légitime,
rastlsc.exe , est exécuté à l'aide de CreateProcessW .

Nous avons également observé une version ( {BB7BDEC9-B59D-492E-A4AF-4C7B1C9E646B}.dll ) qui exécute rastlsc.exe avec le paramètre krv . Nous discuterons plus en détail ci-dessous.

Composant de porte dérobée: remplissage rastlsc.exe


L'équipe OceanLotus utilise une technique ancienne et bien connue dans l'un des exécutables des produits Symantec. L'essentiel est d'utiliser le processus de chargement d'une bibliothèque d'un fichier .exe légitime et signé en écrivant une bibliothèque malveillante dans le même dossier. Cela rendra le comportement malveillant légitime car ces actions sont effectuées pendant que l'exécutable approuvé est en cours d'exécution.

Comme mentionné ci-dessus, le fichier rastlsc.exe légitime est réinitialisé et exécuté.
Il importe le fichier rastls.dll , qui dans ce cas a un contenu malveillant.


Figure 7. Rastlsc.exe signé numériquement de Symantec

Nous avons également constaté un remplissage à l'aide d'autres exécutables légitimes et signés, y compris mcoemcpy.exe de McAfee, qui charge McUtil.dll . Cette technique était auparavant utilisée par PlugX, qui a attiré l'attention du Vietnam CERT (en vietnamien).

Étape 1. Remplissage de la bibliothèque, rastls.dll


Le nom interne du fichier dll est {7032F494-0562-4422-9C39-14230E095C52}.dll , mais nous avons vu d'autres versions, par exemple {5248F13C-85F0-42DF-860D-1723EEAA4F90}.dll . Toutes les fonctions exportées conduisent à l'exécution de la même fonction.


Figure 8. Toutes les exportations rasltls.dll conduisent Ă  une seule fonction

Export essaie de lire le fichier SyLog.bin situé dans le même dossier. D'autres versions ont essayé d'ouvrir le fichier OUTLFLTR.DAT . Si le fichier existe, il sera décrypté à l'aide de l'algorithme AES en mode CBC avec une clé de 256 bits codée en dur, puis les données compressées reçues seront décompressées (compression LZMA).

La variante McUtil.dll utilise une technique différente. À première vue, la fonction principale ne fait rien de malveillant, mais en fait elle remplace la section .text du fichier légitime mcoemcpy.exe , un fichier binaire. Il génère un shellcode dont la tâche est d'appeler une fonction pour lire le shellcode crypté de la deuxième étape à partir du fichier mcscentr.adf .

Le pseudo-code suivant est utilisé pour créer du code shell:

x = False i = 0
buff = genRandom()
opc1 = [0x58,0x59,0x5a,0x5b]
opc2 = [0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57]
opc3 = [0x90,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,
0x49,0x4a,0x4b]
while i < len(buff):
currentChar = buff[i] if currentChar < 0xc8:
buff[i] = opc1[currentChar % len(opc1)]
else:
if x:
buff[i] = opc2[currentChar % len(opc2)]
else:
buff[i] = opc3[currentChar % len(opc3)] x = x == False
i+=1


Ci-dessous dans la figure, vous pouvez voir une liste du résultat de l'assembleur:


Figure 9. Shellcode généré

Étapes 2 à 4. Shellcode, lanceur et shellcode à nouveau


Le {E1E4CBED-5690-4749-819D-24FB660DF55F}.dll décrypte et télécharge la {E1E4CBED-5690-4749-819D-24FB660DF55F}.dll . La bibliothèque charge des ressources et essaie de démarrer le service DeviceAssociationService. Les informations décryptées contiennent également un shellcode. Ce dernier décrypte la dernière étape: une porte dérobée.

La variante {92BA1818-0119-4F79-874E-E3BF79C355B8}.dll vérifie si rastlsc.exe exécuté avec krv comme premier paramètre. Si tel est le cas, une tâche est créée et rastlsc.exe est à nouveau exécuté, mais sans ce paramètre.

Étape 5. Porte dérobée


{A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll

Tout d'abord, le malware essaie de télécharger ses ressources et de les décrypter en utilisant l'algorithme RC4. Les ressources résultantes contiennent des données utilisées pour configurer la porte dérobée. Le format de configuration n'est pas difficile à trouver. En utilisant la structure Kaitai et son amortisseur de structure, nous obtenons ce qui suit:


Figure 10. Structure de configuration

Remarque : à l'exception de la ligne domain_encoding_str et de la bibliothèque httpprov, les données changent d'un échantillon à l'autre. Les clés de registre sont presque les mêmes, mais elles ont un schéma similaire: \HKCU\SOFTWARE\Classes\AppX[a-f0-9]{32} , rien de remarquable.

Le programme malveillant reçoit les 10 premiers octets du nom d'utilisateur (UTF-16), les code avec la chaîne de trois lettres mutex_encoding_str en UTF-16 et le code en hexadécimal. Le résultat est utilisé comme nom du mutex. Par exemple, pour un utilisateur dont le nom commence par abc et une clé sous la forme de vwx , le mutex sera \Sessions\1\BaseNamedObjects\170015001b .

La porte dérobée comprend un chargeur PE qui charge la bibliothèque HTTPProv.dll en mémoire, appelle le point d'entrée, puis appelle la fonction d'exportation CreateInstance .

La communication


La porte dérobée utilise le protocole de communication TCP standard sur le port 25123 . Pour obtenir l'adresse IP du serveur, la porte dérobée crée d'abord une requête DNS spécifique.

Le programme malveillant sélectionne l'un des trois domaines dans la configuration et ajoute un sous-domaine spécial qui est généré à l'aide de deux valeurs. La première valeur est le nom de l'ordinateur sur une longueur de 16 octets. Le second est un ID de version à quatre octets. Le code Python 2 ci-dessous est un algorithme de codage:

letters=domain_encoding_str # “ghijklmnop” hex_pc_name=pc_name.encode(“UTF-16LE”).encode(“hex”) s=''
for c in hex_pc_name:
if 0x2f < ord(c) < 0x3a:
s+=letters[ord(c) - 0x30]
else:
s+=c


Par exemple, si le nom de l'ordinateur est random-pc et que l'ID de version est 0x0a841523, le domaine suivant est généré:
niggmhggmeggmkggmfggmdggidggngggmjgg.ijhlokga.dwarduong[.]com

L'expression régulière suivante peut être utilisée pour étiqueter le serveur C&C de cette porte dérobée:
[ghijklmnopabcdef]{4-60}\.[ghijklmnopabcdef]{8}\.[az]+\.[az]+

Si l'adresse IP appartient à un domaine spécifique, le malware essaie d'établir une connexion TCP via le port 25123 . Chacun des exemples a trois noms de domaine différents qui sont utilisés pour trouver le serveur C&C.

Le processus de communication est crypté via RC4 et compressé à l'aide de LZMA. Il est possible de décrypter le trafic, car la clé est ajoutée au début des paquets. Le format est le suivant:
[ RC4 (4 )][ ]

Chaque octet clé est généré par la fonction rand . Après avoir déchiffré et déballé le paquet, les données ont le format suivant:
[dw:][dw:][dw: ][dw: ][dw:] [dw:]

La première fois que le client se connecte au serveur, l'UUID est transmis, qui est utilisé comme identifiant de session. Ce dernier est stocké dans la clé de registre en tant que données binaires: HKCU\SOFTWARE\Classes\ AppXc52346ec40fb4061ad96be0e6cb7d16a\DefaultIcon

Comme nous l'avons dit précédemment, la porte dérobée contient également une bibliothèque appelée HTTPprov . Il est utilisé comme moyen alternatif de communiquer avec le serveur. Le fichier DLL envoie une requête POST via HTTP. Il prend également en charge HTTPS et les proxys utilisant SOCKS5, SOCKS4a et SOCKS4. La bibliothèque est liée statiquement à libcurl .

Après l'initialisation, une entrée de registre sera créée - une commande pour que la porte dérobée utilise davantage HTTP pour communiquer avec le serveur de commandes: HKCU\SOFTWARE\Classes\ CLSID{E3517E26-8E93-458D-A6DF-8030BC80528B} .

L'application cliente standard est utilisée: Mozilla/4.0 ( ; MSIE 8.0; Windows NT 6.0; Trident/4.0) .

La principale caractéristique de cette bibliothèque est un algorithme de cryptage spécial pour un identifiant de ressource universel. La partie ressource de l'URI est créée à l'aide du pseudocode suivant:

buffEnd = ((DWORD)genRand(4) % 20) + 10 + buff; while (buff < buffEnd){
b=genRand(16);
if (b[0] - 0x50 > 0x50)
t=0;
else
*buf++= UPPER(vowels[b[1] % 5]);
v=consonants[b[1]%21]); if (!t)
v=UPPER(v);
*buff++= v;
if (v!='h' && b[2] - 0x50 < 0x50)
*buff++= 'h';
*buff++= vowels[b[4] % 5];
if (b[5] < 0x60)
*buff++= vowels[b[6] % 5];
*buff++= consonants[b[7] % 21];
if (b[8] < 0x50)
*buff++= vowels[b[9] % 5];
*buff++= '-';
};
*buff='\0';


Remarque : pour plus de clarté, la partie chargée de vérifier la longueur de la chaîne a été supprimée du code.

Pour obtenir l'identifiant de la chaîne générée, deux nombres sont ajoutés à l'aide d'un algorithme spécial de vérification de somme:

checksum=crc32(buff)
num2=(checksum >> 16) + (checksum & 0xffff) * 2
num1=(num2 ^ 1) & 0xf
URL=GENERATED_DOMAIN+ “/” + num1 + “/” + num2 + “-” + buff


En ajoutant le générateur d'URI de la bibliothèque HTTPprov , nous obtenons l'URL suivante:
hXXp://niggmhggmeggmkggmfggmdggidggngggmjgg.ijhlokga.aisicoin[.]com/ 13/139756-Ses-Ufali-L

Équipes


Après avoir reçu l'identifiant de session SESSIONID, la porte dérobée crée une empreinte digitale du système. Le package est construit comme suit (retrait dans le package - description):

0x000 - octets: la valeur change dans chaque version
0x001 - 0x01: octet codé en dur
0x002 - bool: privilèges élevés
0x003 - dword: ID de version
0x007 - chaîne (UTF-16), nom d'ordinateur (max. 0x20)
0x027 - chaîne (UTF-16), nom d'utilisateur
0x079 - le résultat d'une requête de registre dans les valeurs HKLM\SOFTWARE\Microsoft\Windows NT\ CurrentVersion : ProductName , CSDVersion , CurrentVersion , ReleaseId , CurrentBuildNumber et le résultat de l'appel à IsWow64Process (x86|x64)
0x179 - le format suivant de la chaîne% s (% s); remplacé par ( GetVolumeInformationW:VolumeNameBuffer ), VolumePathNames
0x279 - Disque physique, contrôle d'E / S d'un périphérique PhysicalDriveIOControl 0x2D1400 (IOCTL_STORAGE_QUERY_ PROPERTY) (VolSerialNumber)
0x379 - wmi SELECT SerialNumber FROM Win32_BaseBoard
0x3f9 - Récupère la date et l'heure actuelles GetSystemTimeAsFileTime
0x400 - bool: inconnu
0x401 - dword: reçu après décryptage de la ressource

Voici un exemple d'empreinte digitale système:


Figure 11. Empreinte digitale du système

Il s'agit d'une porte dérobée à part entière qui offre à ses opérateurs un certain nombre de fonctionnalités: manipulation du fichier, du registre et des processus, téléchargement de composants supplémentaires, obtention d'une empreinte numérique du système. Voici les numéros et les descriptions des commandes prises en charge:

0 - empreinte digitale numérique
1 - définit l'ID de session
2 - créer un processus et obtenir un résultat (en utilisant les canaux de programme)
3 - définit le compteur des tentatives de connexion
4 - reporte l'heure du scrutin
5 - lit un fichier ou une clé de registre et considère MD5
6 - créer un processus
7 - crée un fichier, une entrée de registre ou un flux en mémoire
8 - écrit dans le registre
9 - interroge le registre
10 - recherche des fichiers dans le système
11 - transfère les fichiers vers un autre répertoire
12 - supprime les fichiers du disque
13 - Obtenir une liste des disques balisés dans le système en utilisant la fonction
GetLogicalDriveStringW
14 - crée un répertoire
15 - supprime le répertoire
16 - lit le fichier depuis l'offset
17 - appelle le chargeur PE (passer Ă  la communication via HTTPprov )
18 - [inconnu]
19 - 0: interrogation de la valeur dans le registre; 1: mise en œuvre et mise en œuvre du programme
20 - définit la variable d'environnement
21 - lance le shellcode dans un nouveau thread
22 - retourne la variable d'environnement
23 dans la nouvelle version - redémarre lui-même si la variable d'environnement APPL n'existe pas

Conclusion


OceanLotus reste très actif et continue de mettre à jour la boîte à outils.
Le groupe cherche à dissimuler ses activités, pour cela les attaquants sélectionnent soigneusement les victimes, limitent la propagation des malwares, utilisent plusieurs serveurs afin de ne pas attirer l'attention sur le même domaine ou la même adresse IP. Le déchiffrement du composant mis en œuvre et la technique de chargement latéral, malgré sa grande popularité, permettent d'éviter la détection, puisque le travail des attaquants dans ce cas est déguisé en application légitime.

Indicateurs de compromis (IoC)


Échantillons


Tableau 1: compte-gouttes




Tableau 2: bibliothèques




Réseau


Adresses IP


46.183.220.81
46.183.220.82
46.183.222.82
46.183.222.83
46.183.222.84
46.183.223.106
46.183.223.107
74.121.190.130
74.121.190.150
79.143.87.230

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


All Articles