
Genera perfiles maleables C2 aleatorios y validados por linter para Cobalt Strike, automatizando la configuración de beacons HTTP/S, DNS, SMB y SSH con aleatorización de IOC personalizable.
C2concealer es una herramienta de línea de comandos que genera perfiles maleables C2 aleatorizados para usar en Cobalt Strike.
git clone https://github.com/RedSiege/C2concealer.git
cd C2concealer
python3 -m venv .venv
source .venv/bin/activate
pip3 install -e .
Consulte las instrucciones de Docker
Usage:
$ C2concealer --hostname google.com --variant 3
Flags:
(optional)
--hostname
The hostname used in HTTP client and server side settings. Default is None.
--variant
An integer defining the number of HTTP client/server variants to generate.
Recommend between 1 and 5. Max 10.
root@kali:~# C2concealer --variant 1 --hostname google.com
[i] Searching for the c2lint tool on your system (part of Cobalt Strike). Might take 10-20 seconds.
[i] Found c2lint in the /opt/cobaltstrike/c2lint directory.
Choose an SSL option:
1. Self-signed SSL cert (just input a few details)
2. LetsEncrypt SSL cert (requies a temporary A record for the relevant domain to be pointed to this machine)
3. Existing keystore
4. No SSL
[?] Option [1/2/3/4]:
Consejo: Utilice siempre un certificado SSL. Preferiblemente un certificado de LetsEncrypt o similar. Consejo: Las variantes HTTP le permiten seleccionar diferentes IOCs para el tráfico HTTP en diferentes beacons. Se recomienda un valor de al menos 1.
Analizamos minuciosamente la documentación de Cobalt Strike y definimos rangos de valores que tuvieran sentido para cada atributo del perfil. A veces esos datos son tan simples como un entero aleatorio dentro de un rango, y otras veces necesitamos elegir un valor aleatorio de un diccionario de Python. En cualquier caso, comenzamos la creación de la herramienta definiendo los datos que conformarían un perfil válido.
Luego dividimos cada sección (o bloque) del perfil maleable en un archivo .py separado, que contiene la lógica para obtener valores aleatorios apropiados para cada atributo y luego generar una cadena formateada para ese bloque del perfil. Concatenamos todos los bloques del perfil, ejecutamos algunas comprobaciones rápidas de coherencia y luego pasamos el perfil por el linter de Cobalt Strike (c2lint). El resultado es un perfil que debería funcionar en sus compromisos. Siempre recomendamos probar el perfil (incluyendo la inyección de procesos y el spawning) antes de iniciar una campaña.
Si está investigando el código, le recomendamos empezar con estos dos archivos: /C2concealer/__main__.py y /C2concealer/profile.py. Después de revisar los comentarios, eche un vistazo a los generadores de bloques de perfil individuales en la carpeta: /C2concealer/components.
Esto es crucial. Es una herramienta de código abierto. Los proveedores pueden crear fácilmente firmas para los perfiles que genera. Si bien ejecutar la herramienta proporciona un excelente punto de partida para construir un perfil maleable de Cobalt Strike, recomendamos profundizar en las siguientes áreas para personalizar los datos que se utilizan para poblar los perfiles generados:
/C2concealer/data/
Además, puede personalizar varios atributos a lo largo del proceso de generación del perfil. Por ejemplo, en el archivo: /C2concealer/components/stageblock.py, puede cambiar el rango del que se extrae el valor del tamaño de la imagen PE (cerca de las líneas 73-74). Revise todos los diferentes archivos en el directorio components.
Si ha llegado hasta aquí, sabemos que esta herramienta le será de gran utilidad. La forma en que recomendamos ver esta herramienta es que hemos construido el esqueleto de código para generar automáticamente estos perfiles. Ahora depende de usted pensar qué valores tienen sentido para cada atributo en sus campañas y actualizar las fuentes de datos.
Si bien hemos cubierto muchas opciones posibles para el lenguaje de perfiles maleables C2, hay muchas opciones que no configuramos. Le recomendamos encarecidamente que consulte la documentación de Malleable Command and Control y modifique su perfil.
Las siguientes opciones no están configuradas, o están configuradas estáticamente por C2concealer, y debería considerar cambiarlas.
http-config| Opción faltante | Notas |
|---|---|
set block_useragents | Bloquear patrones UA que no sean de beacon |
set allow_useragents | Lista blanca de patrones UA (CS 4.3+) |
stage| Opción faltante | Notas |
|---|---|
set allocator | Hardcoded VirtualAlloc; falta la aleatorización de HeapAlloc, MapViewOfFile |
set magic_mz_x86 / magic_mz_x64 | Suplantación de cabecera MZ |
set magic_pe | Suplantación de marcador PE |
set rich_header | Suplantación de metadatos del compilador |
set module_x86 / module_x64 | Module stomping |
set copy_pe_header | — |
set data_store_size | — |
set eaf_bypass | Bypass de verificación EAT |
set syscall_method | Ninguno/Directo/Indirecto (CS 4.8+) |
set rdll_loader | PrependLoader/StompLoader |
set rdll_use_syscalls | — |
set rdll_use_driploading | — |
set rdll_dripload_delay | — |
Bloque transform-obfuscate | Opciones base64, lznt1, rc4, xor completamente ausentes |
append en transform-x86/x64 | Solo se utilizan prepend y strrep |
process-inject| Opción faltante | Notas |
|---|---|
set allocator | Hardcoded VirtualAllocEx; falta la aleatorización de NtMapViewOfSection |
set use_driploading | — |
set dripload_delay | — |
append en transform-x86/x64 | Solo se utiliza prepend |
Ejecutar: NtQueueApcThread | No está en el bloque de ejecución |
Ejecutar: NtQueueApcThread-s | No está en el bloque de ejecución |
Ejecutar: ObfSetThreadContext | No está en el bloque de ejecución |
Ejecutar: SetThreadContext | No está en el bloque de ejecución |
| Suplantación de función de ejecución | Sintaxis module!function+0x## no compatible |
post-ex| Opción faltante | Notas |
|---|---|
set pipename | Tubería con nombre para trabajos post-ex |
dns-beacon| Opción faltante | Notas |
|---|---|
set ns_response | Manejo de NS drop/idle/zero. Por defecto es drop si no se configura. |
set dns_stager_prepend | Anteponer datos a los payloads staged |
| Transformación faltante | Notas |
|---|---|
lznt1 | Compresión — no está en ninguna cadena de codificación |
rc4 "key" | Cifrado — no está en ninguna cadena de codificación |
xor "key" | XOR — no está en ninguna cadena de codificación |
uri-append | Sentencia de terminación — no implementada |
Un gran agradecimiento a Raphael Mudge por mejorar constantemente el conjunto de funciones de perfiles maleables y la documentación para aprender sobre ello. También, enormes gracias a @killswitch-GUI por su script que automatiza la generación de certificados LetsEncrypt para servidores de equipo de CS. Finalmente, dos publicaciones de blog que hicieron la vida mucho más fácil: la publicación de @bluescreenofjeff (https://bluescreenofjeff.com/2017-01-24-how-to-write-malleable-c2-profiles-for-cobalt-strike/) y la publicación de Joe Vest (https://posts.specterops.io/a-deep-dive-into-cobalt-strike-malleable-c2-6660e33b0e0b).
Versión 1.0
Versión 1.1