
코발트 스트라이크의 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";
}
}
}
그리고 동일한 프로필에서 두 가지 출력 세트입니다:
# 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 값 목록이 있는 파일 |
| 변수 | 설명 | 개수 지원? |
|---|
| 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_stager | 제공된 또는 내장 목록에서 무작위 pipename_stager 출력 | 아니요 |
| dns_stager_subhost | 제공된 또는 내장 목록에서 무작위 dns_stager_subhost 출력 | 아니요 |
| dns_stager_prepend | 제공된 또는 내장 목록에서 무작위 dns_stager_prepend 출력 | 아니요 |