
Un script pour randomiser les profils C2 malléables de Cobalt Strike et réduire les risques de déclencher les contrôles de détection basés sur les signatures.
Ce script randomise les profils Malleable C2 de Cobalt Strike grâce à l'utilisation d'un métalangage, réduisant ainsi les chances de déclencher les contrôles de détection basés sur des signatures. En bref, le script analyse le modèle fourni, remplace les variables par une valeur aléatoire provenant d'une liste de mots fournie ou intégrée, teste le nouveau modèle avec c2lint, et (s'il n'y a pas d'erreurs c2lint) produit le nouveau profil Malleable C2.
Des exemples de profils Malleable C2 compatibles avec ce script se trouvent dans le répertoire Sample Templates de ce dépôt.
Pour en savoir plus sur ce script, consultez mon article de blog 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]
| Paramètre | Description |
|---|---|
| -profile, -p | Chemin vers le modèle Malleable C2 à randomiser (OBLIGATOIRE) |
| -count, -c | Le nombre de profils randomisés à créer {Par défaut = 1} |
| -cobalt, -d | Le répertoire où se trouve Cobalt Strike (pour c2lint) {Par défaut = répertoire courant} |
| -output, -o | Nom de base de la sortie {Par défaut = nom de base du modèle et chaîne aléatoire} |
| -notest, -n | Passer le test avec c2lint (Drapeau) |
Si aucune liste de mots n'est fournie, une liste intégrée sera utilisée par défaut. Pour plus d'informations sur la création de ces listes, voir ci-dessous ou le dossier Sample Wordlists de ce dépôt.
| Paramètre | Description |
|---|---|
| -charset | Fichier avec un jeu de caractères personnalisé à utiliser avec la variable %%customchar%% |
| -wordlist | Fichier avec une liste de mots personnalisés à utiliser avec la variable %%word%% |
| -useragent | Fichier avec une liste de user-agents |
| -spawnto | Fichier avec une liste de processus spawnto personnalisés |
| -pipename | Fichier avec une liste de valeurs pipename personnalisées |
| -pipename_stager | Fichier avec une liste de valeurs pipename_stager personnalisées |
| -dns_stager_subhost | Fichier avec une liste de valeurs dns_stager_subhost personnalisées |
| -dns_stager_prepend | Fichier avec une liste de valeurs dns_stager_prepend personnalisées |
La plupart de ces variables de liste de mots sont directement liées aux options Malleable C2. Pour plus d'informations sur ce que font ces options de profil, consultez la documentation officielle.
Le métalangage de substitution comprend des variables spécifiques, dont certaines permettent des comptes de répétition optionnels, entourées de doubles signes de pourcentage, comme suit :
%%variable:count%%
Autre exemple, la variable suivante produira 20 caractères alphanumériques :
%%alphanumeric:20%%
| Variable | Description | Compteur pris en charge ? |
|---|---|---|
| alphanumeric | Génère une lettre ascii minuscule ou majuscule ou un chiffre aléatoire | Oui |
| alphanumspecial | Génère une lettre ascii minuscule ou majuscule, un chiffre ou une ponctuation aléatoire | Oui |
| alphanumspecialurl | Génère une lettre ascii minuscule ou majuscule, un chiffre ou l'un des caractères suivants : -._~ | Oui |
| alphaupper | Génère une lettre ascii majuscule aléatoire | Oui |
| alphalower | Génère une lettre ascii minuscule aléatoire | Oui |
| alphauppernumber | Génère une lettre ascii majuscule ou un chiffre aléatoire | Oui |
| alphalowernumber | Génère une lettre ascii minuscule ou un chiffre aléatoire | Oui |
| alpha | Génère une lettre ascii aléatoire | Oui |
| number | Génère un chiffre aléatoire | Oui |
| hex | Génère un chiffre hexadécimal aléatoire | Oui |
| netbios | Génère une lettre ascii minuscule ou majuscule, un chiffre ou l'un des caractères suivants : !@#$%^&)(.-'_{}~ | Oui |
| custom | Correspond à un caractère aléatoire dans le fichier charset fourni | Oui |
| word | Génère un mot aléatoire à partir de la liste de mots fournie ou intégrée | Oui |
| boolean | Génère 'True' ou 'False' | Oui |
| useragent | Génère un user-agent aléatoire à partir de la liste fournie ou intégrée | Non |
| spawnto_x86 | Génère un chemin de processus x86 aléatoire à partir de la liste fournie ou intégrée | Non |
| spawnto_x64 | Génère un chemin de processus x64 aléatoire à partir de la liste fournie ou intégrée | Non |
| pipename | Génère un nom de tube aléatoire à partir de la liste fournie ou intégrée | Non |
| pipename_stager | Génère un pipename_stager aléatoire à partir de la liste fournie ou intégrée | Non |
| dns_stager_subhost | Génère un dns_stager_subhost aléatoire à partir de la liste fournie ou intégrée | Non |
Les fichiers de listes de mots sont simplement des chaînes séparées par des lignes, des tabulations ou continues (selon le type de liste) placées dans un fichier texte.
Les listes de mots suivantes doivent être séparées par des lignes, chaque entrée sur une nouvelle ligne :
La liste de mots spawnto est un peu plus compliquée. Malleable C2 nécessite une option x86 et x64 pour modifier tous les lancements de processus. Par conséquent, chaque ligne de la liste de mots doit contenir à la fois les chemins de processus x86 et x64 séparés par une tabulation, le processus x86 étant listé en premier. Par exemple :
%windir%\\syswow64\\eventvwr.exe %windir%\\sysnative\\eventvwr.exe
Il est important de noter que les chaînes syswow64 et sysnative dans les chemins de processus doivent être en minuscules.
Le dernier type de liste de mots est le jeu de caractères personnalisé. Ce fichier doit inclure tous les caractères que le script doit substituer aléatoirement. Par exemple, un fichier charset de AEIOUY et une variable de %%custom:5%% produiront cinq caractères aléatoires à partir de la chaîne charset. Lors de la construction de ce jeu de caractères, gardez à l'esprit que certains caractères sont interdits dans une URI et peuvent interférer avec les communications de Beacon.
Pour des exemples de listes de mots, consultez le répertoire Sample Wordlists de ce dépôt.
Voici un extrait d'un profil Amazon modifié :
# 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";
}
}
}
Et voici deux ensembles de résultats du même profil :
# 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";
}
}
}
| dns_stager_prepend | Génère un dns_stager_prepend aléatoire à partir de la liste fournie ou intégrée | Non |