Cyberattaque : le groupe présumé de cyberespionnage iranien APT34 exploite la faille CVE-2017-11882 au Moyen-Orient

Moins d’une semaine après la sortie du correctif de la faille CVE-2017-11882 de Microsoft Office, le 14 novembre 2017, FireEye a observé une attaque exploitant cette vulnérabilité à l’encontre d’un organisme public au Moyen-Orient. Selon FireEye, l'action aurait été menée par un groupe de cyberespions iraniens, APT34, au moyen d'un backdoor PowerShell personnalisé.

L'attaque s'inscrirait dans une campagne de cyberespionnage lancée en 2014 et essentiellement axée sur des opérations de repérage pour le compte du pouvoir iranien. À ce jour, les attaques se sont essentiellement concentrées sur des pays du Moyen-Orient, dans des secteurs aussi variés que la finance, les pouvoirs publics, l'énergie, les télécommunications ou encore l'industrie chimique. Plusieurs indices nous mettent sur la piste iranienne, notamment l'usage et la référence à des infrastructures basées dans ce pays, mais aussi la concordance des cibles choisies avec les intérêts politiques de Téhéran.

Pour mener ses opérations, APT34 s'appuie sur des outils à la fois publics et propriétaires. Ses agents recourent notamment à des comptes compromis pour mener des actions de spear-phishing, parfois combinées à des tactiques d'ingénierie sociale. En mai 2016, FireEye avait  publié  un article sur une campagne de spear-phishing visant plusieurs banques du Moyen-Orient. La méthode consistait à envoyer des pièces jointes avec macro pour propager le malware POWBAT. Nous attribuons aujourd'hui cette attaque à APT34. Lors d'une attaque en juillet 2017, le groupe s'est servi d'un backdoor PowerShell (POWRUNER) et d'un téléchargeur avec algorithme de génération de noms de domaines (DGA), appelé BONDUPDATER. Le backdoor était introduit à l'aide d'un fichier .rtf malveillant exploitant CVE-2017-0199.

Or, dans sa dernière campagne en date, APT34 a exploité la vulnérabilité CVE-2017-11882 de Microsoft Office pour déployer ces deux mêmes malwares.

Le rapport complet est accessible aux clients  MySIGHT. À l'heure actuelle, les caractéristiques connues d'APT34 rappellent vaguement celles du groupe "OilRig". Les ensembles de données utilisés pour traquer les cybercriminels pouvant varier d'une entreprise à une autre, il est possible que notre classification des activités soit quelque peu différente.

CVE-2017-11882: Corruption de la mémoire dans Microsoft Office

CVE-2017-11882 touche plusieurs versions de Microsoft Office. Cette vulnérabilité apparaît dès lors que le logiciel Microsoft ne parvient pas à traiter correctement des objets en mémoire. Un pirate parvenant à l’exploiter peut alors exécuter du code arbitraire à distance avec les mêmes privilèges que l'utilisateur connecté. Microsoft a publié un correctif le 14 novembre 2017. Une semaine plus tard, la preuve de concept (POC) était rendue publique par les chercheurs ayant signalé la faille.

La vulnérabilité se situe au niveau d’EQNEDT32.exe, l'ancien éditeur d'équations de Microsoft Office servant à insérer et évaluer des formules mathématiques. L’éditeur d'équations s'intègre à Microsoft Office via la technologie OLE (Object Linking and Embedding). Il s’agit donc d'un processus distinct, et non d'un processus enfant d'Office. Lorsqu'une formule arrive à l'éditeur, ce dernier copie les données sans en contrôler la longueur. D’où un risque de corruption de la mémoire. EQNEDT32.exe est compilé par un ancien compilateur et n'est pas compatible avec la distribution aléatoire de l’espace d’adressage (ASLR), une technique de protection contre l'exploitation des vulnérabilités de corruption de la mémoire. L'attaquant peut donc aisément altérer le flux d’exécution du programme.

Anatomie de l’attaque

APT34 envoie à sa victime un e-mail de spear-phishing renfermant un fichier .rtf malveillant en pièce jointe (MD5: a0e6933f4e0497269620f44a083b2ed4). Le fichier .rtf exploite la faille CVE-2017-11882 pour corrompre la mémoire avant d'infiltrer les données infectieuses dans la pile. Ensuite, le malware écrase l'adresse de la fonction avec l'adresse d'une instruction existante de EQNEDT32.exe. L'instruction écrasée (cf. figure 1) sert alors à appeler la fonction “WinExec” depuis kernel32.dll (instruction 00430c12).


Figure 1 : Désassemblage de l'adresse de la fonction écrasée

La fonction “WinExec” est ensuite appelée pour créer un processus enfant, “mshta.exe”, avec les privilèges de l'utilisateur actuellement connecté. Le processus “mshta.exe” télécharge ensuite un script malveillant depuis hxxp://mumbai-m[.]site/b.txt avant de l'exécuter (figure 2).


Figure 2 : Copie des données de l'attaquant sur le tampon corrompu

Flux d’exécution

Le script malveillant passe par une série d'étapes pour exécuter et, au final, établir une connexion avec le serveur de commande et de contrôle (C2). La figure 3 représente le déroulement complet de l'attaque à partir de l'exploit.


Figure 3 : CVE-2017-11882 et POWRUNER : déroulement de l'attaque

  1. Le fichier .rtf malveillant exploite la faille CVE-2017-11882.
  2. Le malware écrase l'adresse de la fonction avec une instruction existante de EQNEDT32.exe.
  3. Le malware crée un processus enfant, “mshta.exe”, qui télécharge un fichier depuis hxxp://mumbai-m[.]site/b.txt.
  4. b.txt renferme une commande PowerShell pour télécharger un injecteur depuis hxxp://dns-update[.]club/v.txt. La commande PowerShell renomme le fichier téléchargé (v.txt devient v.vbs) et exécute le script.
  5. Le script v.vbs installe quatre composants (hUpdateCheckers.base, dUpdateCheckers.base, cUpdateCheckers.bat et GoogleUpdateschecker.vbs) sur le répertoire : C:\ProgramData\Windows\Microsoft\java\
  6. v.vbs utilise CertUtil.exe, un programme de ligne de commande Microsoft installé avec les Services de certificat de l’éditeur, pour décrypter les fichiers encodés en base64 (hUpdateCheckers.base et dUpdateCheckers.base), avant d'installer UpdateCheckers.ps1 et dUpdateCheckers.ps1 sur le répertoire intermédiaire.
  7. cUpdateCheckers.bat se lance et planifie une tâche pour établir la persistance de GoogleUpdateschecker.vbs.
  8. GoogleUpdateschecker.vbs s'exécute après un temps de veille de 5 secondes.
  9. cUpdateCheckers.bat et *.base sont supprimés du répertoire intermédiaire.

La figure 4 présente un extrait du script v.vbs durant la phase d'exécution.


Figure 4 : Script v.vbs durant la phase d'exécution

Une fois toutes les étapes du flux d'exécution franchies, le planificateur de tâches relance toutes les minutes le composant GoogleUpdateschecker.vbs, qui à son tour exécute les scripts dUpdateCheckers.ps1 et hUpdateCheckers.ps1. Ces scripts PowerShell représentent le payload final. Ils contiennent un téléchargeur avec DGA et un composant backdoor qui établit la connexion avec le serveur C2 pour recevoir des commandes et effectuer d'autres actions malveillantes. 

hUpdateCheckers.ps1 (POWRUNER)

Le backdoor POWRUNER est un script PowerShell qui envoie et reçoit des commandes du serveur C2. POWRUNER est exécuté toutes les minutes par le planificateur de tâches. La figure 5 présente un échantillon du backdoor POWRUNER.


Figure 5 : Le script PowerShell POWRUNER : hUpdateCheckers.ps1

POWRUNER envoie d'abord une requête GET aléatoire au serveur C2 et attend sa réponse. Le serveur répond soit par “not_now”, soit par une séquence aléatoire à 11 chiffres. Dans le second cas, POWRUNER renvoie une requête GET, puis stocke la réponse dans une chaîne. POWRUNER prend alors le dernier chiffre de la réponse stockée qu'il interprète comme une commande pour effectuer une action prédéfinie. Les commandes et les actions correspondantes sont listées dans le tableau 1.

Commande

Description

Action

0

La réponse du serveur contient des commandes batch

Exécution des commandes batch et renvoi des résultats au serveur

1

La réponse du serveur est un chemin de fichier

Vérification du chemin du fichier et chargement (PUT) du fichier sur le serveur

2

La réponse du serveur est un chemin de fichier

Vérification du chemin du fichier et téléchargement (GET) du fichier

Tableau 1 : Commandes POWRUNER

Une fois la commande exécutée, POWRUNER renvoie les résultats au serveur C2 et stoppe l'exécution.

Le serveur C2 peut également envoyer une commande PowerShell pour effectuer et stocker une capture d'écran du système de la victime. Si la commande “fileupload” est activée, POWRUNER envoie alors la capture d'écran sous forme de fichier image au serveur C2. La figure 6 illustre la fonction “Get-Screenshot” envoyée par le serveur C2.


Figure 6 : Fonction de capture d'écran PowerShell

dUpdateCheckers.ps1 (BONDUPDATER)

Parmi les dernières avancées d'APT34, on notera tout particulièrement l'utilisation d'algorithmes DGA pour la génération de sous-domaines. Le script BONDUPDATER, qui tient son nom de la chaîne codée en dur “B007”, utilise un algorithme DGA personnalisé pour générer des sous-domaines destinés à la communication avec le serveur C2.

Implémentation d'algorithmes de génération de noms de domaines (DGA)

La figure 7 offre une vue détaillée d'un domaine (456341921300006B0C8B2CE9C9B007.mumbai-m[.]site) généré par un algorithme DGA personnalisé de BONDUPDATER.


Figure 7 : Vue détaillée d'un sous-domaine créé par BONDUPDATER

  1. Il s'agit d'un nombre aléatoire créé sur la base de l'expression : $rnd = -join (Get-Random -InputObject (10..99) -Count (%{ Get-Random -InputObject (1..6)}));
  2. La valeur est de 0 ou 1. Initialement fixée à 0, la valeur passe à 1 si la première adresse IP de domaine résolue commence par 24.125.X.X.
  3. La valeur initiale est de 000. Elle procède ensuite par paliers de 3 à chaque requête DNS.
  4. Douze premiers caractères de l'UUID du système.
  5. Chaîne codée en dur “B007”.
  6. Domaine codé en dur “mumbai-m[.]site”.

BONDUPDATER tente alors de résoudre le domaine DGA résultant et effectue les actions suivantes en fonction de la résolution des adresses IP :

  1. Création d'un fichier temporaire dans %temp%
    • Les deux derniers octets des adresses IP résolues forment le nom du fichier créé.
  2. BONDUPDATER vérifie les deux derniers caractères du nom du fichier et entreprend l'action correspondante (tableau 2).

Caractéristique

Description

0

Le fichier contient des commandes batch ; exécution des commandes batch

1

Le fichier temporaire est renommé en tant que .ps1

2

Le fichier temporaire est renommé en tant que .vbs

Tableau 2 : Actions BONDUPDATER

La figure 8 est une capture d'écran de l'implémentation du DGA de BONDUPDATER.


Figure 8 : Algorithme de génération de noms de domaines

Voici quelques exemples des sous-domaines générés, observés en phase d'exécution :

143610035BAF04425847B007.mumbai-m[.]site

835710065BAF04425847B007.mumbai-m[.]site

376110095BAF04425847B007.mumbai-m[.]site

Communication réseau

La figure 9 présente un exemple de communications réseau entre un serveur et un client backdoor POWRUNER.


Figure 9 : Exemple de communications réseau

Dans cet exemple, le client POWRUNER envoie une requête GET aléatoire au serveur C2. Celui-ci répond par un nombre aléatoire (99999999990). Le dernier chiffre étant 0, POWRUNER envoie une nouvelle requête GET aléatoire pour recevoir  une autre chaîne de commande. Le serveur C2 renvoie alors une réponse encodée en base64.

Si le serveur avait répondu par la chaîne “not_now” (figure 10), POWRUNER n'aurait pas envoyé de nouvelle requête et aurait terminé son exécution.


Figure 10 : Exemple de réponse "“not_now”" du serveur

Commandes batch

POWRUNER peut aussi recevoir des commandes batch du serveur C2 pour collecter des informations sur l'hôte (utilisateur actuellement connecté, nom de l'hôte, données de configuration réseau, connexions actives, informations de processus, comptes de l'administrateur local et de domaines, annuaire des utilisateurs, etc.). La figure 11 montre un exemple de commandes batch.


Figure 11 : Commandes batch envoyées par le serveur C2 POWRUNER

Autres utilisations de POWRUNER / BONDUPDATER

APT34 utilise POWRUNER et BONDUPDATER dans ses opérations au Moyen-Orient depuis juillet 2017. Ce même mois, une appliance Web MPS de FireEye a détecté et stoppé une requête d'APT34 pour installer un téléchargeur de POWRUNER / BONDUPDATER. Toujours en juillet 2017, FireEye a observé une autre attaque d'APT34 au Moyen-Orient. Cette fois-ci, le groupe a utilisé un fichier .rtf malveillant (MD5: 63D66D99E46FB93676A4F475A65566D8) exploitant la faille CVE-2017-0199. Le fichier a envoyé une requête GET pour télécharger un fichier malveillant depuis

hxxp://94.23.172.164/dupdatechecker.doc.

Comme le montre la figure 12, le script contenu dans le fichier dupatechecker.doc tente de télécharger un autre fichier nommé dupatechecker.exe depuis le même serveur. L'auteur du malware s’est même permis le luxe d’écrire un commentaire, vraisemblablement destiné à narguer ouvertement les chercheurs en sécurité.


Figure 12 : Contenu du script dupdatechecker.doc

Le fichier dupatechecker.exe (MD5: C9F16F0BE8C77F0170B9B6CE876ED7FB) installe BONDUPDATER et POWRUNER, lesquels se connectent à proxychecker[.]pro pour C2.

Perspectives et répercussions

L'activité récente d'APT34 a démontré qu'il s'agissait d'un groupe très habile et potentiellement pourvu de ses propres ressources de développement. Au cours de ces derniers mois, APT34 s'est montré capable d'exploiter rapidement au moins deux vulnérabilités (CVE-2017-0199 and CVE-2017-11882) pour attaquer plusieurs structures situées au Moyen-Orient. Pour FireEye, la capacité du groupe à constamment perfectionner ses malwares (à l’image des algorithmes DGA pour le serveur C2) témoigne de sa volonté de développer des méthodes furtives échappant à toute détection. Selon nos prévisions, le malware et les tactiques d'APT34 sont donc appelés à évoluer pour venir à bout des défenses mises en place par leurs cibles au Moyen-Orient.

Indicateurs de compromission

Nom du fichier / nom du domaine / adresse IP

MD5 Hash or DESCRIPTION

Document de l'exploit CVE-2017-11882

A0E6933F4E0497269620F44A083B2ED4

b.txt

9267D057C065EA7448ACA1511C6F29C7

v.txt/v.vbs

B2D13A336A3EB7BD27612BE7D4E334DF

dUpdateCheckers.base

4A7290A279E6F2329EDD0615178A11FF

hUpdateCheckers.base

841CE6475F271F86D0B5188E4F8BC6DB

cUpdateCheckers.bat

52CA9A7424B3CC34099AD218623A0979

dUpdateCheckers.ps1

BBDE33F5709CB1452AB941C08ACC775E

hUpdateCheckers.ps1

247B2A9FCBA6E9EC29ED818948939702

GoogleUpdateschecker.vbs

C87B0B711F60132235D7440ADD0360B0

hxxp://mumbai-m[.]site

POWRUNER C2

hxxp://dns-update[.]club

Serveur intermédiaire du malware

CVE-2017-0199 exploit document

63D66D99E46FB93676A4F475A65566D8

94.23.172.164:80

Serveur intermédiaire du malware

dupdatechecker.doc

D85818E82A6E64CA185EDFDDBA2D1B76

dupdatechecker.exe

C9F16F0BE8C77F0170B9B6CE876ED7FB

proxycheker[.]pro

C2

46.105.221.247

A résolu mumbai-m[.]site & hpserver[.]online

148.251.55.110

A résolu mumbai-m[.]site and dns-update[.]club

185.15.247.147

A résolu dns-update[.]club

145.239.33.100

A résolu dns-update[.]club

82.102.14.219

A résolu ns2.dns-update[.]club & hpserver[.]online & anyportals[.]com

v7-hpserver.online.hta

E6AC6F18256C4DDE5BF06A9191562F82

dUpdateCheckers.base

3C63BFF9EC0A340E0727E5683466F435

hUpdateCheckers.base

EEB0FF0D8841C2EBE643FE328B6D9EF5

cUpdateCheckers.bat

FB464C365B94B03826E67EABE4BF9165

dUpdateCheckers.ps1

635ED85BFCAAB7208A8B5C730D3D0A8C

hUpdateCheckers.ps1

13B338C47C52DE3ED0B68E1CB7876AD2

googleupdateschecker.vbs

DBFEA6154D4F9D7209C1875B2D5D70D5

hpserver[.]online

C2

v7-anyportals.hta

EAF3448808481FB1FDBB675BC5EA24DE

dUpdateCheckers.base

42449DD79EA7D2B5B6482B6F0D493498

hUpdateCheckers.base

A3FCB4D23C3153DD42AC124B112F1BAE

dUpdateCheckers.ps1

EE1C482C41738AAA5964730DCBAB5DFF

hUpdateCheckers.ps1

E516C3A3247AF2F2323291A670086A8F

anyportals[.]com

C2