
API Python para uso com a especificação External C2 do Cobalt Strike
Framework Python para uso com a especificação External C2 do Cobalt Strike, conforme descrito na spec.
O principal objetivo do design é ser uma implementação muito modular da especificação external c2 que forneça abstração suficiente para implementar facilmente canais C2 para o Cobalt Strike. Idealmente, tudo que um usuário precisa fazer é criar um módulo transport, um módulo encoder e preencher um arquivo de configuração para implementar um novo canal.
Você precisará fazer várias alterações de configuração antes de começar. Você precisará:
builds/client/dbox/dbox_client.py, altere token para o gerado no passo 2.builds/server/utils/transports/transport_dbox.py faça as mesmas alterações que no passo 3.cd builds/client/dbox && ./compile_dll.shstart_externalc2.cna do seu cliente CS.cd builds/server/ && ./dbox_server.pyLink para vídeo de demonstração: https://www.youtube.com/watch?v=nTRHSh_uCcA
Este projeto consiste em três partes principais:
O Builder constrói dinamicamente implantações do cliente e do servidor com base na configuração especificada. Idealmente, o cliente poderia ser distribuído como um único arquivo compilado, como um dll ou exe.
O Cliente é essencialmente o payload que é executado no endpoint, referido como third-party client dentro da especificação. A lógica do cliente é principalmente estática:
transporttransporttransport em busca de novas tarefastransportAs configurações necessárias para os mecanismos de transporte e codificação são copiadas estaticamente para o cliente. A lógica de funções para os mecanismos de transporte e codificação também são copiadas estaticamente de seus respectivos módulos.
A lógica de injeção de processo é determinada pelo Builder.
O Servidor é a aplicação que intermedia a comunicação entre o client e o c2 server, referido como third-party Client Controller dentro da especificação. A lógica do servidor é principalmente estática, mas suporta saída verbosa e de depuração para auxiliar no desenvolvimento:
encodertransporttransportencodertransporttransportencoderA determinação de qual módulo encoder e transport o servidor importa é determinada a partir dos valores armazenados em config.py.
Nenhuma importação de módulos transport ou encoder não utilizados é realizada.
As tabelas a seguir descrevem funções compartilhadas entre os módulos encoding e transport, e o cliente. As funções compartilhadas são essencialmente o mesmo código.
UMA NOTA MUITO IMPORTANTE: Os dados enviados para as funções sendData e recvData do cliente devem ser dados brutos, enquanto os dados enviados para as funções sendData e retrieveData do módulo de transporte devem já estar codificados ou decodificados conforme necessário.
| Função de Transporte | Função do Cliente | Descrição |
|---|---|---|
| prepTransport |
| Função do Codificador | Função do Cliente | Descrição |
|---|---|---|
| encode | encode | Define modificações feitas nos dados brutos para prepará-los para o transporte |
| decode | decode | Define modificações feitas nos dados brutos recebidos do transporte para serem retransmitidos ao seu destino |
Primeiro, determine qual módulo de transporte e codificação você gostaria de usar. Usaremos transport_gmail e encoder_b64url para o seguinte exemplo.
Em seguida, modifique server/config.py conforme suas necessidades, garantindo que ENCODER_MODULE e TRANSPORT_MODULE estejam configurados corretamente e apontados para os módulos desejados:
EXTERNAL_C2_ADDR = "127.0.0.1"
EXTERNAL_C2_PORT = "2222"
C2_PIPE_NAME = "foobar"
C2_BLOCK_TIME = 100
C2_ARCH = "x86"
IDLE_TIME = 5
ENCODER_MODULE = "encoder_b64url"
TRANSPORT_MODULE = "transport_gmail"
verbose = False
debug = False
Em seguida, modifique a seção de configuração para o módulo transport e encoder selecionados.
Certifique-se de que a seção de configuração do arquivo client/mechanism/$mechanism_client.py corresponde a quaisquer configurações que você definiu até agora.
Na máquina executando o servidor, execute:
python server.py
Para uma saída mais detalhada, você pode executar:
python server.py -v
Para uma saída mais detalhada e saída adicional útil para depuração, você pode executar:
python server.py -d
Em seguida, execute o cliente no endpoint de destino.
Se tudo funcionou, um novo beacon será registrado no console do Cobalt Strike com o qual você pode interagir.
Por que você escreveu isso?: Não havia muitas implementações publicadas da especificação, e das que foram publicadas, ou não estão em uma linguagem que eu conheço ou não têm a modularidade e abstração que eu estava procurando.
Por que Python 2?: Sou preguiçoso e é fácil implementar novos canais de transporte e codificação nela.
Seu código é uma porcaria: Isso não é uma pergunta.
Posso enviar novos módulos de transporte e/ou codificador?: Sim, por favor! Envie um pull request e ficarei feliz em revisar.
Abstração e modularidade semelhantes serão implementadas no componente cliente também, para suportar diferentes métodos de injeção de processo para o payload do beacon e outros recursos no roadmap.
Atualmente, falta a funcionalidade de builder, que está planejada para construir dinamicamente implantações do cliente e servidor, mas está no roadmap.
| prepTransport |
| Realiza quaisquer pré-configurações necessárias para utilizar o mecanismo de transporte |
| sendData | sendData | Define como os dados são enviados através do mecanismo de transporte |
| retrieveData | recvData | Define como os dados são recebidos através do mecanismo de transporte |