
Gera perfis maleáveis de C2 randomizados e validados por lint para o Cobalt Strike, automatizando a configuração de beacons HTTP/S, DNS, SMB e SSH com randomização personalizável de IOC.
C2concealer é uma ferramenta de linha de comando que gera perfis maleáveis C2 aleatorizados para uso no Cobalt Strike.
git clone https://github.com/RedSiege/C2concealer.git
cd C2concealer
python3 -m venv .venv
source .venv/bin/activate
pip3 install -e .
Consulte as instruções Docker
Uso:
$ C2concealer --hostname google.com --variant 3
Flags:
(opcional)
--hostname
O hostname usado nas configurações do lado do cliente e servidor HTTP. O padrão é None.
--variant
Um inteiro que define o número de variantes HTTP do cliente/servidor a serem geradas.
Recomendado entre 1 e 5. Máximo 10.
root@kali:~# C2concealer --variant 1 --hostname google.com
[i] Procurando pela ferramenta c2lint no seu sistema (parte do Cobalt Strike). Pode levar de 10 a 20 segundos.
[i] Encontrado c2lint no diretório /opt/cobaltstrike/c2lint.
Escolha uma opção SSL:
1. Certificado SSL autoassinado (apenas insira alguns detalhes)
2. Certificado SSL LetsEncrypt (requer um registro A temporário para o domínio relevante apontado para esta máquina)
3. Keystore existente
4. Sem SSL
[?] Opção [1/2/3/4]:
Dica: Sempre use um certificado SSL. Preferencialmente um certificado do LetsEncrypt ou similar. Dica: As variantes HTTP permitem selecionar diferentes IOCs para tráfego HTTP em diferentes beacons. Recomenda-se um valor de pelo menos 1.
Examinamos a documentação do Cobalt Strike e definimos intervalos de valores que fariam sentido para cada atributo do perfil. Às vezes esses dados são tão simples quanto um inteiro aleatório dentro de um intervalo e outras vezes precisamos escolher um valor aleatório de um dicionário Python. De qualquer forma, começamos a criação da ferramenta definindo os dados que formariam um perfil válido.
Em seguida, dividimos cada seção (ou bloco) do perfil maleável em um arquivo .py separado, que contém a lógica para sortear valores apropriados para cada atributo e gerar uma string formatada para aquele bloco do perfil. Concatenamos todos os blocos do perfil, executamos algumas verificações rápidas de consistência e validamos o perfil com o linter do Cobalt Strike (c2lint). O resultado é um perfil que deveria funcionar para seus engajamentos. Sempre recomendamos testar o perfil (incluindo injeção de processo e spawning) antes de iniciar uma campanha.
Se você está olhando o código, recomendamos começar com estes dois arquivos: /C2concealer/main.py e /C2concealer/profile.py. Após revisar os comentários, confira os geradores de blocos de perfil individuais na pasta: /C2concealer/components.
Isso é crucial. Esta é uma ferramenta de código aberto. Fornecedores podem facilmente criar assinaturas para os perfis que ela gera. Embora executar a ferramenta forneça um ótimo ponto de partida para construir um perfil maleável do Cobalt Strike, recomendamos explorar as seguintes áreas para personalizar os dados usados para preencher os perfis gerados:
/C2concealer/data/
Além disso, você pode personalizar vários atributos durante todo o processo de geração de perfil. Por exemplo, no arquivo: /C2concealer/components/stageblock.py, você pode alterar o intervalo do qual o valor do tamanho da imagem PE é sorteado (próximo às linhas 73-74). Por favor, examine todos os diferentes arquivos no diretório components.
Se você chegou até aqui, sabemos que esta ferramenta será muito útil. A maneira como recomendamos encarar esta ferramenta é que construímos o esqueleto do código para gerar automaticamente esses perfis. Agora é com você pensar quais valores fazem sentido para cada atributo nas suas campanhas e atualizar as fontes de dados.
Embora tenhamos coberto muitas opções possíveis para a linguagem de perfil Malleable C2, existem muitas opções que não configuramos. Recomendamos fortemente consultar a documentação do Malleable Command and Control e modificar seu perfil.
As seguintes opções não são configuradas, ou são configuradas estaticamente pelo C2concealer e você deve considerar alterá-las.
http-config| Opção Ausente | Observações |
|---|---|
set block_useragents | Bloquear padrões de UA que não são de beacon |
set allow_useragents | Lista de permissão de padrões de UA (CS 4.3+) |
stageprocess-injectpost-ex| Opção Ausente | Observações |
|---|---|
set pipename | Pipe nomeado para trabalhos pós-ex |
dns-beacon| Opção Ausente | Observações |
|---|---|
set ns_response | drop/idle/zero para tratamento NS. Padrão é drop se não configurado. |
set dns_stager_prepend | Prepend de dados para payloads em staged |
| Transformação Ausente | Observações |
|---|---|
lznt1 | Compressão — não está em nenhuma cadeia de codificação |
Um grande agradecimento ao Raphael Mudge por melhorar constantemente o conjunto de funcionalidades do perfil maleável e a documentação para aprendê-lo. Também, enormes agradecimentos ao @killswitch-GUI por seu script que automatiza a geração de certificados LetsEncrypt para servidores de equipe CS. Finalmente, dois posts de blog que facilitaram muito a vida: o post do @bluescreenofjeff (https://bluescreenofjeff.com/2017-01-24-how-to-write-malleable-c2-profiles-for-cobalt-strike/) e o post do Joe Vest (https://posts.specterops.io/a-deep-dive-into-cobalt-strike-malleable-c2-6660e33b0e0b).
Versão 1.0
Versão 1.1
| Opção Ausente | Observações |
|---|
set allocator | Fixado em VirtualAlloc; faltando HeapAlloc, MapViewOfFile para randomização |
set magic_mz_x86 / magic_mz_x64 | Spoofing de cabeçalho MZ |
set magic_pe | Spoofing de marcador PE |
set rich_header | Spoofing de metadados do compilador |
set module_x86 / module_x64 | Module stomping |
set copy_pe_header | — |
set data_store_size | — |
set eaf_bypass | Bypass de verificação EAT |
set syscall_method | None/Direct/Indirect (CS 4.8+) |
set rdll_loader | PrependLoader/StompLoader |
set rdll_use_syscalls | — |
set rdll_use_driploading | — |
set rdll_dripload_delay | — |
Bloco transform-obfuscate | Opções base64, lznt1, rc4, xor totalmente ausentes |
append em transform-x86/x64 | Apenas prepend e strrep são usados |
| Opção Ausente | Observações |
|---|
set allocator | Fixado em VirtualAllocEx; faltando NtMapViewOfSection para randomização |
set use_driploading | — |
set dripload_delay | — |
append em transform-x86/x64 | Apenas prepend usado |
Execute: NtQueueApcThread | Não está no bloco execute |
Execute: NtQueueApcThread-s | Não está no bloco execute |
Execute: ObfSetThreadContext | Não está no bloco execute |
Execute: SetThreadContext | Não está no bloco execute |
| Spoofing de função execute | Sintaxe module!function+0x## não suportada |
rc4 "key" |
| Criptografia — não está em nenhuma cadeia de codificação |
xor "key" | XOR — não está em nenhuma cadeia de codificação |
uri-append | Declaração de terminação — não implementada |