
Скрипт для рандомизации профилей Cobalt Strike Malleable C2 и снижения вероятности обнаружения сигнатурными средствами защиты.
Этот скрипт рандомизирует Malleable C2 профили Cobalt Strike с помощью метаязыка, что, надеемся, снизит вероятность срабатывания сигнатурных средств обнаружения. Вкратце, скрипт разбирает предоставленный шаблон, заменяет переменные на случайные значения из предоставленного или встроенного списка слов, проверяет новый шаблон с помощью 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]
| Параметр | Описание |
|---|
Если список слов не предоставлен, по умолчанию используется встроенный список. Дополнительную информацию о создании таких списков см. ниже или в папке 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%% выведут пять случайных символов из строки набора. При создании такого набора имейте в виду, что некоторые символы запрещены в 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";
}
}
}
А вот два результата для одного и того же профиля:
# 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";
}
}
}
| -profile, -p | Путь к шаблону Malleable C2 для рандомизации (ОБЯЗАТЕЛЬНО) |
| -count, -c | Количество создаваемых рандомизированных профилей {По умолчанию = 1} |
| -cobalt, -d | Каталог, в котором находится Cobalt Strike (для c2lint) {По умолчанию = текущий каталог} |
| -output, -o | Базовое имя выходного файла {По умолчанию = базовое имя шаблона и случайная строка} |
| -notest, -n | Пропустить проверку с помощью c2lint (флаг) |
| Параметр | Описание |
|---|
| -charset | Файл с пользовательским набором символов для использования с переменной %%customchar%% |
| -wordlist | Файл со списком пользовательских слов для использования с переменной %%word%% |
| -useragent | Файл со списком useragent |
| -spawnto | Файл со списком пользовательских процессов spawnto |
| -pipename | Файл со списком пользовательских значений pipename |
| -pipename_stager | Файл со списком пользовательских значений pipename_stager |
| -dns_stager_subhost | Файл со списком пользовательских значений dns_stager_subhost |
| -dns_stager_prepend | Файл со списком пользовательских значений dns_stager_prepend |
| Переменная | Описание | Поддерживает количество? |
|---|
| alphanumeric | Выводит случайную букву или цифру ASCII в смешанном регистре | Да |
| alphanumspecial | Выводит случайную букву ASCII, цифру или знак пунктуации в смешанном регистре | Да |
| alphanumspecialurl | Выводит случайную букву ASCII, цифру или один из следующих символов: -._~ | Да |
| alphaupper | Выводит случайную заглавную букву ASCII | Да |
| alphalower | Выводит случайную строчную букву ASCII | Да |
| alphauppernumber | Выводит случайную заглавную букву ASCII или цифру | Да |
| alphalowernumber | Выводит случайную строчную букву ASCII или цифру | Да |
| alpha | Выводит случайную букву ASCII | Да |
| number | Выводит случайную цифру | Да |
| hex | Выводит случайную шестнадцатеричную цифру | Да |
| netbios | Выводит случайную букву ASCII, цифру или один из следующих символов: !@#$%^&)(.-'_{}~ | Да |
| custom | Соответствует случайному символу из предоставленного файла charset | Да |
| word | Выводит случайное слово из предоставленного или встроенного списка слов | Да |
| boolean | Выводит 'True' или 'False' | Да |
| useragent | Выводит случайный 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 из предоставленного или встроенного списка | Нет |