
Un script para aleatorizar perfiles Malleable C2 de Cobalt Strike y reducir las posibilidades de activar controles de detección basados en firmas.
Este script randomiza perfiles Malleable C2 de Cobalt Strike mediante el uso de un metalenguaje, reduciendo así las posibilidades de activar controles de detección basados en firmas. En resumen, el script analiza la plantilla proporcionada, sustituye las variables por un valor aleatorio de una lista de palabras proporcionada o incorporada, prueba la nueva plantilla con c2lint y (si no hay errores de c2lint) genera el nuevo perfil Malleable C2.
Los perfiles Malleable C2 de ejemplo compatibles con este script se pueden encontrar en el directorio Sample Templates de este repositorio.
Para obtener más información sobre este script, consulte mi publicación en el 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]
| Parámetro | Descripción |
|---|---|
Si no se proporciona una lista de palabras, se utilizará una lista incorporada por defecto. Para obtener más información sobre cómo crear estas listas, consulte abajo o la carpeta Sample Wordlists de este repositorio.
La mayoría de estas variables de lista de palabras están directamente relacionadas con las opciones de Malleable C2. Para obtener más información sobre lo que hacen estas opciones de perfil, consulte la documentación oficial.
El metalenguaje de sustitución comprende variables específicas, algunas de las cuales permiten recuentos de repetición opcionales, encerradas entre signos de porcentaje dobles, de la siguiente manera:
%%variable:count%%
Como otro ejemplo, la siguiente variable dará como resultado 20 caracteres alfanuméricos:
%%alphanumeric:20%%
Los archivos de listas de palabras son simplemente cadenas separadas por líneas, por tabulaciones o continuas (dependiendo del tipo de lista de palabras) colocadas en un archivo de texto.
Las siguientes listas de palabras deben estar separadas por líneas, con cada entrada en una nueva línea:
La lista de palabras spawnto es un poco más complicada. Malleable C2 requiere una opción x86 y x64 para modificar todos los procesos de spawn. Por lo tanto, cada línea de la lista de palabras debe contener tanto la ruta del proceso x86 como la x64 separadas por un tabulador, con el proceso x86 listado primero. Por ejemplo:
%windir%\\syswow64\\eventvwr.exe %windir%\\sysnative\\eventvwr.exe
Es importante tener en cuenta que las cadenas syswow64 y sysnative en las rutas de los procesos deben estar en minúsculas.
El último tipo de lista de palabras es el juego de caracteres personalizado. Este archivo debe incluir cualquier carácter que el script deba sustituir aleatoriamente. Por ejemplo, un archivo charset de AEIOUY y una variable de %%custom:5%% generará cinco caracteres aleatorios de la cadena charset. Al crear este juego de caracteres, tenga en cuenta que algunos caracteres tienen prohibido aparecer en una URI y pueden interferir con las comunicaciones de Beacon.
Para obtener listas de palabras de ejemplo, consulte el directorio Sample Wordlists de este repositorio.
Aquí hay un fragmento de un perfil de Amazon modificado:
# 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";
}
}
}
Y aquí hay dos conjuntos de salida del mismo perfil:
# 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 |
| Ruta a la plantilla Malleable C2 a randomizar (REQUERIDO) |
| -count, -c | Número de perfiles randomizados a crear {Por defecto = 1} |
| -cobalt, -d | Directorio donde se encuentra Cobalt Strike (para c2lint) {Por defecto = directorio actual} |
| -output, -o | Nombre base de salida {Por defecto = nombre base de la plantilla y cadena aleatoria} |
| -notest, -n | Omitir la prueba con c2lint (Indicador) |
| Parámetro | Descripción |
|---|
| -charset | Archivo con un juego de caracteres personalizado para usar con la variable %%customchar%% |
| -wordlist | Archivo con una lista de palabras personalizadas para usar con la variable %%word%% |
| -useragent | Archivo con una lista de user-agents |
| -spawnto | Archivo con una lista de procesos spawnto personalizados |
| -pipename | Archivo con una lista de valores pipename personalizados |
| -pipename_stager | Archivo con una lista de valores pipename_stager personalizados |
| -dns_stager_subhost | Archivo con una lista de valores dns_stager_subhost personalizados |
| -dns_stager_prepend | Archivo con una lista de valores dns_stager_prepend personalizados |
| Variable | Descripción | ¿Soporta Recuento? |
|---|
| alphanumeric | Genera una letra o dígito ascii aleatorio (mayúsculas y minúsculas) | Sí |
| alphanumspecial | Genera una letra, dígito o signo de puntuación ascii aleatorio (mayúsculas y minúsculas) | Sí |
| alphanumspecialurl | Genera una letra o dígito ascii aleatorio (mayúsculas y minúsculas), o uno de los siguientes caracteres: -._~ | Sí |
| alphaupper | Genera una letra mayúscula ascii aleatoria | Sí |
| alphalower | Genera una letra minúscula ascii aleatoria | Sí |
| alphauppernumber | Genera una letra mayúscula ascii o dígito aleatorio | Sí |
| alphalowernumber | Genera una letra minúscula ascii o dígito aleatorio | Sí |
| alpha | Genera una letra ascii aleatoria | Sí |
| number | Genera un dígito aleatorio | Sí |
| hex | Genera un dígito hexadecimal aleatorio | Sí |
| netbios | Genera una letra ascii aleatoria (mayúsculas y minúsculas), dígito, o uno de los siguientes caracteres: !@#$%^&)(.-'_{}~ | Sí |
| custom | Asigna un carácter aleatorio del archivo charset proporcionado | Sí |
| word | Genera una palabra aleatoria de la lista de palabras proporcionada o incorporada | Sí |
| boolean | Genera 'True' o 'False' | Sí |
| useragent | Genera un user-agent aleatorio de la lista proporcionada o incorporada | No |
| spawnto_x86 | Genera una ruta de proceso x86 aleatoria de la lista proporcionada o incorporada | No |
| spawnto_x64 | Genera una ruta de proceso x64 aleatoria de la lista proporcionada o incorporada | No |
| pipename | Genera un pipename aleatorio de la lista proporcionada o incorporada | No |
| pipename_stager | Genera un pipename_stager aleatorio de la lista proporcionada o incorporada | No |
| dns_stager_subhost | Genera un dns_stager_subhost aleatorio de la lista proporcionada o incorporada | No |
| dns_stager_prepend | Genera un dns_stager_prepend aleatorio de la lista proporcionada o incorporada | No |