该脚本通过使用元语言随机化 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} |
| -cobalt, -d |
如果未提供词表,默认将使用内置列表。关于创建这些列表的更多信息,请参见下面的 构建词表 或本仓库中的 Sample Wordlists 文件夹。
其中大部分词表变量直接与 Malleable C2 选项相关。有关这些配置文件选项的更多信息,请查看官方文档。
替换元语言由特定的变量组成,部分变量支持可选的重复次数,并用双百分号包裹,如下所示:
%%变量名:次数%%
另一个示例,以下变量将生成 20 个字母数字字符:
%%alphanumeric:20%%
词表文件是按照换行分隔、制表符分隔或连续字符串(取决于词表类型)放置在一个文本文件中的。
以下词表应为每行一条记录,以换行分隔:
spawnto 词表稍微复杂一些。Malleable C2 需要同时提供 x86 和 x64 选项来修改所有进程生成。因此,词表的每一行应包含由制表符分隔的 x86 和 x64 进程路径,其中 x86 进程在前。例如:
%windir%\\syswow64\\eventvwr.exe %windir%\\sysnative\\eventvwr.exe
需要注意的是,进程路径中的 syswow64 和 sysnative 字符串应为小写。
最后一种词表类型是自定义字符集。该文件应包含用于脚本随机替换的任何字符。例如,字符集文件为 AEIOUY,变量为 %%custom:5%%,则会从字符集中输出五个随机字符。在构建此字符集时,请记住某些字符禁止出现在 URI 中,并可能干扰 Beacon 的通信。
示例词表请参见本仓库中的 Sample Wordlists 目录。
以下是修改过的 Amazon 配置文件片段:
# 此配置文件已修改为适用于 Malleable C2 Profile Randomizer
#
# Amazon 浏览流量配置文件
#
# 作者: @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";
}
}
}
以下是同一配置文件的两组输出:
# 此配置文件已修改为适用于 Malleable C2 Profile Randomizer
#
# Amazon 浏览流量配置文件
#
# 作者: @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";
}
}
}
# 此配置文件已修改为适用于 Malleable C2 Profile Randomizer
#
# Amazon 浏览流量配置文件
#
# 作者: @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 Strike 所在目录(用于 c2lint){默认 = 当前目录} |
| -output, -o | 输出基础名称 {默认 = 模板基础名加随机字符串} |
| -notest, -n | 跳过 c2lint 测试(标志) |
| 参数 | 描述 |
|---|
| -charset | 包含自定义字符集的文件,用于 %%customchar%% 变量 |
| -wordlist | 包含自定义词列表的文件,用于 %%word%% 变量 |
| -useragent | 包含用户代理列表的文件 |
| -spawnto | 包含自定义 spawnto 进程列表的文件 |
| -pipename | 包含自定义管道名称列表的文件 |
| -pipename_stager | 包含自定义管道名称(stager)列表的文件 |
| -dns_stager_subhost | 包含自定义 DNS stager 子域名列表的文件 |
| -dns_stager_prepend | 包含自定义 DNS stager 前置字符串列表的文件 |
| 变量 | 描述 | 支持次数? |
|---|
| alphanumeric | 输出随机的大小写字母或数字 | 是 |
| alphanumspecial | 输出随机的大小写字母、数字或标点符号 | 是 |
| alphanumspecialurl | 输出随机的大小写字母、数字或以下字符之一:-._~ | 是 |
| alphaupper | 输出随机的大写字母 | 是 |
| alphalower | 输出随机的小写字母 | 是 |
| alphauppernumber | 输出随机的大写字母或数字 | 是 |
| alphalowernumber | 输出随机的小写字母或数字 | 是 |
| alpha | 输出随机的字母 | 是 |
| number | 输出随机的数字 | 是 |
| hex | 输出随机的十六进制数字 | 是 |
| netbios | 输出随机的大小写字母、数字或以下字符之一:!@#$%^&)(.-'_{}~ | 是 |
| custom | 映射到提供的 charset 文件中的随机字符 | 是 |
| word | 输出提供的或内置词表中的随机词 | 是 |
| boolean | 输出 'True' 或 'False' | 是 |
| useragent | 输出提供的或内置列表中的随机用户代理 | 否 |
| spawnto_x86 | 输出提供的或内置列表中的随机 x86 进程路径 | 否 |
| spawnto_x64 | 输出提供的或内置列表中的随机 x64 进程路径 | 否 |
| pipename | 输出提供的或内置列表中的随机管道名称 | 否 |
| pipename_stager | 输出提供的或内置列表中的随机管道名称(stager) | 否 |
| dns_stager_subhost | 输出提供的或内置列表中的随机 DNS stager 子域名 | 否 |
| dns_stager_prepend | 输出提供的或内置列表中的随机 DNS stager 前置字符串 | 否 |