
Cobalt Strike Malleable C2プロファイルをランダム化し、シグネチャベースの検出制御に検知される可能性を減らすスクリプト
このスクリプトは、メタ言語を通して Cobalt Strike の Malleable C2 プロファイルをランダム化し、シグネチャベースの検知コントロールにフラグを立てられる可能性を減らすことを目的としています。簡単に言うと、スクリプトは指定されたテンプレートを解析し、提供されたワードリストまたは内蔵ワードリストからランダムな値を変数に代入し、c2lint で新しいテンプレートをテストし、( c2lint エラーがない場合) 新しい Malleable C2 プロファイルを出力します。
このスクリプトと互換性のあるサンプルの Malleable C2 プロファイルは、このリポジトリの Sample Templates ディレクトリにあります。
このスクリプトの詳細については、私のブログ記事 Randomized Malleable C2 Profiles Made Easy を参照してください。
python malleable-c2-randomizer.py [-h] -profile PROFILE
[-count COUNT]
[-cobalt COBALT]
[-output OUTPUT]
[-notest]
[-charset CHARSET]
[-wordlist WORDLIST]
[-useragent USERAGENT]
[-spawnto SPAWNTO]
[-pipename PIPENAME]
[-pipename_stager PIPENAME_STAGER]
[-dns_stager_subhost DNS_STAGER_SUBHOST]
| パラメータ | 説明 |
|---|---|
| -profile, -p | ランダム化する Malleable C2 テンプレートへのパス (必須) |
| -count, -c | 作成するランダム化プロファイルの数 {デフォルト = 1} |
ワードリストが提供されない場合、デフォルトで内蔵リストが使用されます。これらのリストの作成に関する詳細は、下記またはこのリポジトリの Sample Wordlists フォルダを参照してください。
これらのワードリスト変数のほとんどは、Malleable C2 オプションに直接関連しています。これらのプロファイルオプションの機能の詳細については、公式ドキュメントを参照してください。
置換メタ言語は、特定の変数 (一部はオプションで繰り返し数を指定可能) を二重パーセント記号で囲んだもので構成されます。例:
%%variable:count%%
別の例として、次の変数は20文字の英数字を生成します:
%%alphanumeric:20%%
ワードリストファイルは、単にテキストファイル内に配置された改行区切り、タブ区切り、または連続した文字列です (ワードリストの種類によって異なります)。
次のワードリストは、各エントリを新しい行に配置して改行区切りにする必要があります:
spawnto ワードリストはもう少し複雑です。Malleable C2 では、すべてのプロセス生成を変更するために x86 オプションと x64 オプションが必要です。したがって、ワードリストの各行には、x86 と x64 の両方のプロセスパスをタブで区切って含め、x86 プロセスを最初にリストする必要があります。例:
%windir%\\syswow64\\eventvwr.exe %windir%\\sysnative\\eventvwr.exe
プロセスパス内の syswow64 と sysnative という文字列は小文字にする必要があることに注意してください。
最後のワードリストの種類は、カスタム文字セットです。このファイルには、スクリプトがランダムに置換する任意の文字を含める必要があります。たとえば、AEIOUY の文字セットファイルと %%custom:5%% 変数は、文字セット文字列から5つのランダムな文字を出力します。この文字セットを作成するときは、一部の文字は URI に出現することが禁止されており、Beacon の通信に干渉する可能性があることに留意してください。
サンプルのワードリストについては、このリポジトリの Sample Wordlists ディレクトリを参照してください。
以下は、修正された Amazon プロファイルからの抜粋です:
# This profile has been modified to use with the Malleable C2 Profile Randomizer
#
# Amazon browsing traffic profile
#
# Author: @harmj0y
#
set sleeptime "%%number:2%%00";
set jitter "1%%number%%";
set maxdns "24%%number%%";
set useragent "%%useragent%%";
http-get {
set uri "/s/ref=nb_sb_noss_1/%%number:3%%-%%number:8%%-%%number:7%%/field-keywords=%%word%%";
client {
header "Accept" "*/*";
header "Host" "www.amazon.com";
metadata {
base64;
prepend "session-token=";
prepend "skin=noskin;";
append "csm-hit=s-%%alphanumeric:20%%|%%number:13%%";
header "Cookie";
}
}
}
そして、同じプロファイルから生成された2つの出力セットは次のとおりです:
# This profile has been modified to use with the Malleable C2 Profile Randomizer
#
# Amazon browsing traffic profile
#
# Author: @harmj0y
#
set sleeptime "5600";
set jitter "19";
set maxdns "244";
set useragent "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1";
http-get {
set uri "/s/ref=nb_sb_noss_1/818-61846941-6716865/field-keywords=number";
client {
header "Accept" "*/*";
header "Host" "www.amazon.com";
metadata {
base64;
prepend "session-token=";
prepend "skin=noskin;";
append "csm-hit=s-UXnlEVYWc36qEuDMFPzW|2872195700726";
header "Cookie";
}
}
}
# This profile has been modified to use with the Malleable C2 Profile Randomizer
#
# Amazon browsing traffic profile
#
# Author: @harmj0y
#
set sleeptime "7400";
set jitter "19";
set maxdns "246";
set useragent "Mozilla/5.0 (Windows NT 10.0; WOW64)";
http-get {
set uri "/s/ref=nb_sb_noss_1/684-10075672-1686806/field-keywords=year";
client {
header "Accept" "*/*";
header "Host" "www.amazon.com";
metadata {
base64;
prepend "session-token=";
prepend "skin=noskin;";
append "csm-hit=s-ub5oBmGd0pnDoImCjDyK|2539750656854";
header "Cookie";
}
}
}
| -cobalt, -d | Cobalt Strike が配置されているディレクトリ (c2lint 用) {デフォルト = カレントディレクトリ} |
| -output, -o | 出力ベース名 {デフォルト = テンプレートのベース名とランダムな文字列} |
| -notest, -n | c2lint によるテストをスキップする (フラグ) |
| パラメータ | 説明 |
|---|
| -charset | %%customchar%% 変数で使用するカスタム文字セットを含むファイル |
| -wordlist | %%word%% 変数で使用するカスタム単語のリストを含むファイル |
| -useragent | ユーザーエージェントのリストを含むファイル |
| -spawnto | カスタム spawnto プロセスのリストを含むファイル |
| -pipename | カスタム pipename 値のリストを含むファイル |
| -pipename_stager | カスタム pipename_stager 値のリストを含むファイル |
| -dns_stager_subhost | カスタム dns_stager_subhost 値のリストを含むファイル |
| -dns_stager_prepend | カスタム dns_stager_prepend 値のリストを含むファイル |
| 変数 | 説明 | Count指定可能? |
|---|
| alphanumeric | 大文字小文字混在のランダムな ASCII 英字または数字を出力 | はい |
| alphanumspecial | 大文字小文字混在のランダムな ASCII 英字、数字、または句読点を出力 | はい |
| alphanumspecialurl | 大文字小文字混在のランダムな ASCII 英字、数字、または次の文字のいずれかを出力: -._~ | はい |
| alphaupper | ランダムな大文字の ASCII 英字を出力 | はい |
| alphalower | ランダムな小文字の ASCII 英字を出力 | はい |
| alphauppernumber | ランダムな大文字の ASCII 英字または数字を出力 | はい |
| alphalowernumber | ランダムな小文字の ASCII 英字または数字を出力 | はい |
| alpha | ランダムな ASCII 英字を出力 | はい |
| number | ランダムな数字を出力 | はい |
| hex | ランダムな16進数字を出力 | はい |
| netbios | 大文字小文字混在のランダムな ASCII 英字、数字、または次の文字のいずれかを出力: !@#$%^&)(.-'_{}~ | はい |
| custom | 指定された charset ファイル内のランダムな文字にマップ | はい |
| word | 提供された、または内蔵のワードリストからランダムな単語を出力 | はい |
| boolean | 'True' または 'False' を出力 | はい |
| useragent | 提供された、または内蔵のリストからランダムなユーザーエージェントを出力 | いいえ |
| spawnto_x86 | 提供された、または内蔵のリストからランダムな x86 プロセスパスを出力 | いいえ |
| spawnto_x64 | 提供された、または内蔵のリストからランダムな x64 プロセスパスを出力 | いいえ |
| pipename | 提供された、または内蔵のリストからランダムな pipename を出力 | いいえ |
| pipename_stager | 提供された、または内蔵のリストからランダムな pipename_stager を出力 | いいえ |
| dns_stager_subhost | 提供された、または内蔵のリストからランダムな dns_stager_subhost を出力 | いいえ |
| dns_stager_prepend | 提供された、または内蔵のリストからランダムな dns_stager_prepend を出力 | いいえ |