Nous sommes en 2021, et les documents malveillants (aussi appelés « maldocs ») sont toujours d'actualité, depuis la fin des années 90 avec les macro-virus VBA comme Melissa, et surtout depuis leur grand retour vers 2014. En 2020, on a même vu ressurgir de l'oubli les macros Excel 4 qui datent de... 1992 ! Aujourd'hui, les maldocs sont utilisés comme vecteur d'attaque initial pour de nombreuses familles de malware comme Hancitor, ZLoader, Emotet, Qakbot ou encore des groupes comme Sofacy/APT28. Dans cet article, nous allons voir comment analyser différents types de documents malveillants à l'aide d'outils libres : oletools, msoffcrypto-tool, ViperMonkey et XLMMacroDeobfuscator.
1. Installer les outils
Tous les outils présentés dans cet article sont développés en Python. Il est donc nécessaire d'installer un interpréteur Python, de préférence Python 3. Ils peuvent fonctionner sous Linux, Unix, Mac ou Windows.
Les différents outils peuvent ensuite être installés et mis à jour avec la commande pip :
- pip install -U oletools[full] pour installer ou mettre à jour oletools vers la dernière version. La version 0.60 (juin 2021) est nécessaire pour certaines fonctions mentionnées dans cet article.
- pip install -U msoffcrypto-tool pour installer ou mettre à jour msoffcrypto-tool.
- Pour installer ou mettre à jour XLMMacroDeobfuscator, il est préférable d'utiliser la version de développement sur GitHub, car la release « stable » sur PyPI n'inclut pas toujours les corrections qui permettent d'analyser les macros récentes :
- pip install -U https://github.com/DissectMalware/xlrd2/archive/master.zip ;
- pip install -U https://github.com/DissectMalware/pyxlsb2/archive/master.zip ;
- pip install -U https://github.com/DissectMalware/XLMMacroDeobfuscator/archive/
master.zip.
ViperMonkey est un cas un peu différent. Pour l'instant, il ne fonctionne qu'avec Python 2, et comme le parseur et l'émulateur sont plutôt lents, il est préférable d'utiliser l'interpréteur PyPy2 qui est jusqu'à 5 fois plus rapide que l'interpréteur CPython classique. Il existe aussi un conteneur Docker qui peut être plus facile à utiliser. Le site du projet [VMONKEY] détaille les différentes options d'installation.
2. Identifier le format de fichier - ftguess
La première étape pour analyser un document malveillant est d'identifier le format de fichier. Cela est nécessaire pour choisir les outils adaptés. Par exemple, un document Word peut être sauvegardé dans de nombreux formats différents comme OpenXML, OLE (Word 97-2003), RTF, Word 6, MHT (MIME+HTML), Word 2003 XML, Word 2007 XML (FlatOPC), et toujours s'appeler « .doc ». Les auteurs de malware utilisent parfois les formats moins courants pour éviter la détection.
En général, commencer par ouvrir le fichier dans un éditeur hexadécimal est une bonne solution pour se faire une première idée.
Les outils comme file/libmagic, TrID et exiftool [FILE, TRID, EXIFTOOL] sont couramment employés pour identifier le format d'un fichier d'après son contenu. Ils sont même intégrés à la plupart des frameworks et services en ligne d'analyse de malware. Ces outils fonctionnent très bien dans la grande majorité des cas, cependant ils peuvent parfois donner des résultats incorrects, incomplets ou même introduire des vulnérabilités. Par exemple :
- file/libmagic reconnaissent les formats MS Office OpenXML (e.g. Word/Excel/PowerPoint 2007+) en identifiant la présence de certains noms de répertoires dans la structure de l'archive Zip, par exemple word ou xl. Ce sont les noms utilisés par défaut par MS Office, mais un fichier malveillant peut être modifié pour utiliser des noms différents pour tromper l'analyse, comme expliqué dans [JCV07].
- Une vulnérabilité a été découverte (et corrigée) dans exiftool en 2021 [CVE-2021-22204] : en insérant des métadonnées particulières dans différents formats de fichiers comme JPEG, PNG ou PDF, il est possible de faire exécuter du code Perl par le parseur. Plus un parseur est complexe et propose de nombreuses fonctionnalités, plus le risque de vulnérabilités augmente.
Lorsqu'on analyse un fichier malveillant, il est donc nécessaire de prendre en compte ces risques. En général, il est préférable d'analyser les fichiers malveillants sur un système isolé, dans une machine virtuelle ou un conteneur.
Oletools inclut ftguess, un nouvel outil ajouté à la version 0.60, pour identifier de façon plus sûre et précise le format d'un fichier, en particulier pour les formats de documents malveillants (MS Office, RTF, PDF). Le but de ftguess est d'utiliser les mêmes critères que MS Office pour identifier les formats, par exemple :
- Pour les formats OLE (Office 97-2003), l'identification est basée sur le class ID (CLSID) du storage racine dans la structure OLE, ou à défaut sur la présence de certains streams/storages.
- Pour les formats OpenXML (Office 2007+), les fichiers XML [Content_Types].xml et _rels\.rels sont parsés pour extraire le type exact de document.
Voici par exemple l'identification d'un fichier Word 97 par son CLSID :
3. Première analyse rapide - oleid
Depuis la version 0.60 d'oletools, oleid permet de faire une première passe d'analyse rapide. Il commence par identifier le format grâce à ftguess, puis lance les autres outils d'oletools correspondant au format. Il présente un résumé des informations les plus utiles, et indique quels outils employer pour avoir plus de détails. Ce résumé inclut :
- le format de fichier et de conteneur ;
- les métadonnées les plus utiles : titre, auteur, page de code des propriétés (intéressant par exemple si c'est une page de code cyrillique pour un document en français ou anglais) ;
- indique si le fichier est chiffré ou non ;
- présence de macros VBA, et si des mots-clés suspects ont été identifiés ;
- présence de macros Excel 4 / XLM ;
- présence d'objets OLE, et s'ils contiennent des fichiers exécutables ou s'ils correspondent à des vulnérabilités connues ;
- présence de liens externes (modèle externe, objet OLE externe, etc.) pouvant pointer sur d'autres fichiers malveillants.
Un exemple en figure 1 montre l'analyse d'oleid sur un maldoc Hancitor de mai 2021 (SHA256 : D43EC0226FD6AF4D0848CD1FA2329B93FB73341814DD8536C53B6DA0E31B3844).
4. Métadonnées - olemeta/oletimes/exiftool
Il est parfois utile de vérifier les métadonnées d'un document malveillant, car elles peuvent donner des informations intéressantes pour l'analyse, et certaines macros y stockent aussi des données. Les outils suivants peuvent être employés pour cela :
- olemeta : extrait les métadonnées des fichiers OLE ;
- oletimes : extrait les dates/heures de création et modification de la structure OLE (streams et storages) ;
- exiftool : extrait les métadonnées de très nombreux formats de fichiers.
5. Analyse de macros VBA
De nombreux formats de fichiers peuvent contenir des macros VBA. Les plus courants sont les fichiers Word (doc, docm) et Excel (xls, xlsm), mais on peut aussi en trouver dans les fichiers PowerPoint, Publisher, Visio et dans des formats plus exotiques comme MHT (MIME HTML), Word 2003 XML ou Word/Excel 2007 XML.
5.1 Analyse dans MS Office
Il est possible d'ouvrir un document malveillant dans Word, Excel ou PowerPoint, d'étudier le code des macros dans l'éditeur VBA, et d'utiliser le debugger intégré pour comprendre les parties obfusquées. Cette solution a toutefois quelques limitations :
- Il existe toujours un risque d'exécuter du code malveillant et compromettre la machine locale. Il vaut donc mieux le faire sur une machine dédiée et isolée, que l'on peut facilement réinitialiser.
- Cette méthode nécessite Windows et MS Office.
- Avec certaines installations d'Office, le code des macros ne peut s'afficher qu'après avoir cliqué sur Activer le contenu, ce qui risque de déclencher l'exécution du code malveillant. On peut l'éviter en appuyant sur la touche [Shift] simultanément, ce qui désactive les triggers comme AutoOpen, cependant cela ne couvre pas tous les cas. Par exemple, si une macro se déclenche à la fermeture du document avec Document_Close ou à l'aide d'un objet ActiveX, le code malveillant pourra toujours s'exécuter [VBASHIFT].
- Si les macros VBA sont protégées par un mot de passe, il ne sera pas possible d'afficher le code dans l'éditeur VBA, à moins de modifier manuellement certains caractères du fichier dans un éditeur hexadécimal.
- Cette approche ne peut pas être automatisée.
5.2 Analyse statique - olevba
olevba permet d'extraire le code des macros VBA et de faire une analyse statique en identifiant un grand nombre de mots-clés souvent utilisés dans les macros malveillantes (exécution de code, téléchargement de fichier, écriture de fichier, appel de DLL, etc.). Il extrait aussi les indicateurs potentiels comme les URL, adresses IP, noms de fichiers exécutables, et ce, qu'ils apparaissent en clair ou bien encodés (hexadécimal, Base64, chaîne inversée, etc.). Il supporte quasiment tous les formats de fichiers pouvant contenir du VBA, à part les bases MS Access.
Le résultat d'olevba sur le document Hancitor mentionné précédemment est présenté en figure 2 et 3.
Ici nous pouvons voir que la macro VBA contient 3 procédures (Sub) :
- Document_Open s'exécute à l'ouverture du document, appelle yyy puis xxx, renomme un fichier en rem.r dans le répertoire de démarrage de Word, et enfin exécute ce fichier comme une DLL à l'aide de Shell("rundll32.exe") ;
- yyy sélectionne le contenu du document et le copie dans le presse-papiers ;
- xxx recherche un fichier nommé « fax.f » dans le répertoire temporaire de Word.
Cette macro est relativement simple et courte, pourtant il semble manquer une étape. Nous verrons plus loin comment compléter l'analyse.
olevba fournit aussi d'autres options et fonctionnalités qui peuvent servir suivant les macros analysées, notamment :
- l'option --deobf utilise un parseur d'expressions VBA pour déobfusquer certaines chaînes de caractères. Par exemple, l'expression StrReverse("e" & Chr(120) & "e.23lldnu" & Chr$(100 + 14)) est automatiquement décodée en "rundll32.exe".
- l'option --reveal applique le même décodage que --deobf et montre le code de la macro VBA déobfusqué.
- olevba utilise pcodedmp pour extraire le P-code (macro VBA précompilée) et le compare au code source VBA pour détecter si la technique de VBA stomping a été utilisée pour camoufler le code. Celle-ci consiste à remplacer le code source VBA par une macro innocente, alors que MS Office va exécuter le P-code en priorité [VBASTOMP].
5.3 Détection de macros malveillantes - mraptor
mraptor est un autre outil pour l'analyse de macros VBA, dont le but est de détecter si une macro est potentiellement malicieuse ou non. L'algorithme est relativement simple : si la macro s'exécute automatiquement (Document_Open, AutoOpen...) et effectue au moins une opération d'écriture sur le système (CreateTextFile, URLDownloadToFileA...) ou bien exécute du code extérieur à la macro (Shell, CreateObject...), alors elle est potentiellement malicieuse. Cet algorithme, bien que ne reposant que sur quelques expressions régulières sans machine learning, permet de détecter la quasi-totalité des macros malicieuses depuis Concept/Melissa des années 90 jusqu'aux maldocs les plus récents en 2021. La détection n'est pas parfaite puisqu'il y a forcément des faux-positifs avec des macros non malicieuses qui écrivent sur le disque ou utilisent CreateObject, mais cela permet au moins de faire un premier triage.
Il est possible d'intégrer mraptor à une passerelle de messagerie pour bloquer les pièces jointes contenant des macros suspectes, en utilisant le script mraptor_milter, ou bien le projet MacroMilter [MACROMILTER].
5.4 Analyse dynamique de VBA par émulation - ViperMonkey
Certaines macros VBA sont tellement obfusquées qu'il est très difficile de les analyser de façon statique. Par exemple, pour certains maldocs, il faut suivre l'exécution de centaines de fonctions pour assembler une chaîne de caractères qui sera exécutée ensuite comme un script PowerShell ou pour écrire un fichier binaire sur le disque.
Dans ce cas, l'analyse dynamique par émulation permet de mieux comprendre le comportement du code, et extraire les appels de fonction importants et les chaînes de caractères camouflées. L'outil ViperMonkey implémente un parseur VBA et un moteur d'émulation qui simule le fonctionnement de Word et Excel.
Le parseur VBA transforme le code de la macro en un modèle objet Python (abstract syntax tree). Ensuite l'émulateur parcourt le code pas à pas, calcule les expressions, met à jour les variables, et suit les appels de fonctions. Il doit simuler toutes les commandes et fonctions de la bibliothèque standard VBA, les fonctions VBA de Word et Excel, les appels d'objets ActiveX classiques, ainsi que les fonctions des DLL système souvent appelées par les maldocs. Il est quasiment impossible de couvrir toutes les fonctions accessibles depuis MS Office, mais depuis 2015 ViperMonkey a beaucoup progressé et permet d'analyser une bonne partie des macros malveillantes.
6. Analyse de macros Excel 4 / XLM
Les macros Excel 4 (aussi appelées XLM ou XLF) utilisent un langage complètement différent de VBA et sont implémentées dans les fichiers Excel en tant que formules dans des feuilles de calcul spécifiques (macro sheets). Ces macros sont aussi dangereuses que les macros VBA, car elles ont accès aux mêmes fonctionnalités (appel de DLL, exécution de code, écriture sur disque, etc.).
Cependant, l'analyse de macros XLM peut être beaucoup plus compliquée que pour VBA :
- Une macro XLM s'exécute de cellule en cellule et peut « sauter » à n'importe quel endroit dans la feuille de calcul, si bien que le code n'apparaît pas forcément de façon linéaire. Un auteur de macro malveillante peut complexifier la structure à l'infini.
- Une macro XLM peut utiliser toutes les fonctionnalités des formules Excel pour rendre l'analyse difficile.
- Contrairement à VBA, une macro XLM peut modifier son propre code à l'exécution, ce qui offre des possibilités de camouflage et de polymorphisme beaucoup plus poussées.
- Il est possible d'appeler une macro XLM depuis VBA et de combiner les deux. Ce type d'hybride est heureusement très rare, car il peut être extrêmement difficile à analyser.
olevba et oledump (avec plugin_biff) permettent d'extraire le code des macros XLM même quand les feuilles de macros sont cachées dans Excel. Mais l'analyse statique est généralement très difficile, car les auteurs de malware ont bien compris comment complexifier ces macros. L'outil XLMMacroDeobfuscator a été développé pour émuler pas à pas l'exécution des macros XLM en partant du point d'entrée. Grâce à cela, il est beaucoup plus facile de comprendre le déroulement de la macro.
Depuis la version 0.60, olevba intègre XLMMacroDeobfuscator pour fournir à la fois le code brut des macros XLM et le résultat de leur émulation. Un exemple de macro Qakbot de mai 2021 (SHA256 : DB66539408A53E25BF005990C1B868EF140303D2CCFA6964B63B26B6BFC1B07B), montrant tout d'abord les formules « brutes » de la macro XLM puis le résultat de l'émulation, est illustré dans les figures 4, 5 et 6.
Grâce à l'émulation, cette analyse montre que la macro XLM commence par charger urlmon.dll pour appeler la fonction URLDownloadToFileA, puis utilise cette fonction pour télécharger trois DLL depuis différentes URL. Enfin, la macro utilise rundll32 pour exécuter le code des trois DLL.
Dans certains cas, les macros XLM vérifient la date pour ne s'exécuter qu'un jour particulier ou bien vérifient la langue du système, afin d'éviter l'analyse. Dans ce cas, il est préférable d'utiliser l'émulateur XLMMacroDeobfuscator pour avoir accès à toutes les options.
7. Fichiers chiffrés - msoffcrypto-tool
Les documents malveillants sont parfois chiffrés avec un mot de passe, afin de tromper certains outils d'analyse ou de détection. Pour les formats OLE (Office 97-2003), cela ne pose pas de problème pour olevba ou mraptor, car le chiffrement ne couvre que les données et non pas le code des macros VBA. Par contre, pour les formats OpenXML (Office 2007+), l'intégralité du fichier est chiffrée et il faut donc connaître le mot de passe pour déchiffrer le code des macros.
Il existe deux mots de passe particuliers, qui permettent à un document chiffré de s'ouvrir directement dans Excel ou PowerPoint, sans que l'utilisateur n'ait besoin de taper le mot de passe : VelvetSweatshop pour Excel (souvent utilisé pour camoufler un malware), et /01Hannes Ruescher/01 pour PowerPoint. Sinon, il arrive parfois que le document malveillant soit envoyé par e-mail, en demandant à la victime d'entre un mot de passe simple comme « 123 ».
Pour tester si un fichier est chiffré, utiliser oleid ou bien msoffcrypto-tool -t <fichier>.
Pour déchiffrer un fichier : msoffcrypto-tool -p <mot de passe> <fichier source> <fichier destination>.
olevba et les autres outils sont capables de déchiffrer automatiquement les fichiers si leur mot de passe est connu, ou s'il est fourni en ligne de commandes.
8. Analyse de documents RTF - rtfobj
Contrairement aux autres formats de fichiers MS Office, les documents RTF ne peuvent pas contenir de macros. Il est cependant possible d'y inclure des objets OLE. Deux types d'objets OLE sont particulièrement utilisés dans les documents malveillants :
- Les objets OLE Package peuvent contenir n'importe quel fichier, y compris des exécutables ou des scripts.
- Les objets OLE qui correspondent à des vulnérabilités, comme par exemple les objets Equation Editor qui peuvent exploiter les vulnérabilités CVE-2017-11882, CVE-2018-0798 ou CVE-2018-0802. Ces objets sont toujours très utilisés dans des campagnes de malware en 2021, bien que ces vulnérabilités aient été corrigées depuis plusieurs années.
L'outil rtfobj parse la structure des fichiers RTF, identifie les objets OLE et affiche leurs caractéristiques. Il indique s'il s'agit d'un objet Package contenant un fichier exécutable, ou si la classe de l'objet correspond à une vulnérabilité connue. L'option -s permet d'extraire chaque objet dans un fichier.
Un exemple de document RTF malveillant contenant un exécutable caché dans un objet OLE Package est présenté en figure 7.
9. Objets OLE et liens externes - oleobj
oleobj est l'équivalent de rtfobj pour les autres types de formats MS Office (Word, Excel, PowerPoint). Il permet de détecter et d'extraire tous les objets OLE.
Une fonctionnalité supplémentaire d'oleobj est qu'il détecte également les liens externes dans les fichiers OpenXML (MS Office 2007+), notamment :
- les objets OLE externes ;
- les modèles Word externes ;
- les frames externes.
Tous ces liens externes peuvent utiliser une URL http/https pour pointer sur un document malveillant situé sur un serveur distant. Par exemple, un document Word ne contenant aucune macro peut ainsi pointer sur un modèle sur Internet, que Word va automatiquement télécharger et ouvrir. Si ce modèle externe contient des macros, elles pourront alors être exécutées (après confirmation de l'utilisateur).
La figure 8 illustre un exemple de document contenant un lien externe extrait par oleobj.
10. Un exemple récent - Hancitor
Regardons de plus près le document Hancitor montré précédemment comme exemple pour oleid et olevba : oleid nous informe qu'en plus des macros VBA, le document contient également un objet OLE (ObjectPool), ce qui est plutôt inhabituel. Nous pouvons l'extraire grâce à oleobj (voir figure 9).
Le nom du fichier est « fax.f ». Nous pouvons utiliser ftguess pour identifier son format : il s'agit d'un exécutable Windows ou d'une DLL (figure 10).
En observant le code de la macro VBA extrait plus haut par olevba, on voit que la première procédure exécutée est yyy(). Celle-ci sélectionne le contenu du document Word puis le copie dans le presse-papiers. Après quelques tests, je me suis rendu compte que cette opération anodine est en fait une astuce pour forcer Word à écrire le fichier « fax.f » sur le disque. En effet, lorsqu'on sélectionne un objet OLE Package et qu'on presse [Ctrl+C], Word extrait le fichier qu'il contient dans un répertoire temporaire.
La deuxième procédure exécutée est xxx(). Celle-ci récupère le répertoire temporaire de Word grâce à Options.DefaultFilePath(wdTempFilePath) puis y cherche le fichier « fax.f ».
Enfin, la procédure Document_Open renomme « fax.f » en « rem.r » puis exécute le code contenu dans ce fichier grâce à rundll32.exe. Le fichier contenu dans l'objet OLE Package est donc une DLL que la macro VBA copie sur disque et exécute. Ce document malveillant est un « dropper ».
11. Intégration d'oletools dans une application Python
La plupart des outils présentés dans cet article fournissent une API Python qui peut être appelée dans un script ou une application pour automatiser l'analyse. Un certain nombre de frameworks et de services en ligne d'analyse de malware ont par exemple intégré olevba pour l'analyse de macros ou rtfobj pour les fichiers RTF.
12. Sandboxing
En complément de l'analyse statique et de l'émulation, il est aussi possible de faire une analyse dynamique en utilisant un des services en ligne qui permettent d'ouvrir les documents malveillants dans MS Office, comme par exemple https://app.any.run/, https://www.hybrid-analysis.com/, https://tria.ge ou https://www.joesandbox.com.
Conclusion
Les documents malveillants sont toujours très utilisés comme vecteur d'attaque en 2021, et les techniques d'obfuscation pour échapper à la détection et l'analyse évoluent en permanence. Les outils présentés dans cet article doivent donc aussi être constamment améliorés. N'hésitez pas à me contacter si vous découvrez un bug, si vous avez des suggestions ou si vous souhaitez contribuer au développement.
Remerciements
Un grand merci à Fred Raynal pour avoir accepté cet article, à Christophe Brocas pour sa relecture, et à tous les contributeurs qui aident au développement d'oletools et ViperMonkey.
Références
[OLETOOLS] https://github.com/decalage2/oletools
[MSOFFCRYPTO] https://github.com/nolze/msoffcrypto-tool
[VMONKEY] https://github.com/decalage2/ViperMonkey
[XLMDEOBF] https://github.com/DissectMalware/XLMMacroDeobfuscator
[FILE] http://www.darwinsys.com/file/
[TRID] https://mark0.net/soft-trid-e.html
[EXIFTOOL] https://exiftool.org/
[CVE-2021-22204] ExifTool CVE-2021-22204 - Arbitrary Code Execution, https://devcraft.io/2021/05/04/exiftool-arbitrary-code-execution-cve-2021-22204.html
[JCV07] OpenOffice / OpenDocument and MS Office 2007 / Open XML security, Philippe Lagadec, Journal of Computer Virology, 2007, https://www.decalage.info/opendocument_openxml
[VBASHIFT] https://www.decalage.info/vbashift
[VBASTOMP] https://vbastomp.com/
[MACROMILTER] https://github.com/sbidy/MacroMilter