Covenant C2 Framework: O Tutorial Completo
Dec 16, 2022
Covenant is one of the latest and greatest command and control (C2) post-exploitation frameworks. This post will walk you through the process of configuring Covenant and using it to execute payloads on compromised hosts.
Nota: Este post demonstra as capacidades do Covenant em meados de setembro de 2019.
1. Instale Covenant
Primeiro, precisamos instalar o Covenant em uma máquina host que funcionará tanto como o banco de dados do Covenant quanto o aplicativo de gerenciamento controlando os agentes da aplicação, conhecidos como grunts.
Pré-requisitos
Para este post no blog, instalei o Covenant em uma estação de trabalho Windows 10, mas qualquer sistema operacional Windows Server recente ou distribuição Linux que suporte .NET Core também deve funcionar bem.
As seguintes aplicações devem ser instaladas na máquina que hospeda Covenant:
Conteúdo relacionado selecionado:
Processo de instalação
Dada a arquitetura moderna e multiplataforma do Covenant, ele não oferece um executável de instalação antiquado. Em vez disso, precisamos clonar o repositório git do projeto e, em seguida, construir e executar a aplicação usando os seguintes comandos:
git clone --recurse-submodules https://github.com/cobbr/Covenant
cd Covenant/Covenant
dotnet build
dotnet run
Alternativamente, poderíamos executar Covenant em um contêiner Docker.
2. Crie uma conta.
Com o serviço Covenant em funcionamento, podemos acessar a interface de aplicação Covenant na sua porta web padrão de 7443. Seremos solicitados a configurar uma conta de usuário:
Após completarmos o processo de registro, seremos redirecionados para a página de Gerenciamento de Usuários:
O menu à esquerda permite-nos navegar pelas várias capacidades do Covenant.
3. Configure um listener.
Os ouvintes permitem que os grunhidos se comuniquem com o aplicativo Covenant. Não há ouvintes configurados por padrão, então precisamos configurar um. Clique em Listeners no menu à esquerda para abrir a página do ouvinte:
Em seguida, clique no botão Create para abrir a página de criação do HTTP Listener:
Precisaremos atualizar alguns dos valores fornecidos:
- Nome — Por padrão, Covenant fornece um nome simples do tipo “GUID”. Sinta-se à vontade para alterá-lo para algo mais legível.
- BindAddress e ConnectAddress — Certifique-se de que ambos especifiquem um endereço acessível pelos grunts.
- UseSSL — Se você deseja usar SSL, precisará especificar um arquivo de certificado SSL e senha.
Uma vez que a configuração esteja completa, clique no botão Create para criar e habilitar o listener.
4. Crie um lançador.
Em seguida, precisamos criar um launcher. Os launchers são usados para transformar hosts remotos em grunts e conectá-los ao aplicativo Covenant. Eles normalmente vêm na forma de um pacote de payload que é executado em um host remoto. Cada launcher é emparelhado com um listener.
No menu esquerdo da página de Gerenciamento de Usuários, clique em Launchers. Você verá uma lista de tipos de lançadores. O lançador Binário, que é usado para gerar binários personalizados, é um dos lançadores mais fáceis de usar, então vamos selecionar Binary para o nosso primeiro lançador.
A página de configuração será aberta:
Especifique as seguintes opções de configuração:
- Listener — Especifique o listener que o novo lançador usará. Vamos usar o listener HTTP que criamos anteriormente:
- Modelo — Vamos usar o modelo pronto para uso GruntHTTP:
- Atraso e Variação — Essas configurações controlam a frequência com que um grunt se comunica com Covenant. Podemos manter os valores padrão.
- ConnectAttempts e KillDate — Essas configurações controlam quando um grunt deixará de tentar se comunicar com Covenant. Podemos manter os valores padrão.
Uma vez que a configuração esteja completa, clique no botão Generate para criar o novo lançador e voltar à página de configuração.
5. Crie um grunt executando o lançador.
A seguir, precisamos salvar o payload do launcher: Clicando em Download e depois em Salvar Arquivo.
Em seguida, copie o arquivo salvo para o host desejado e execute-o.
O novo grunt registrado aparecerá no nosso painel em Covenant:
6. Atribua tarefas ao subalterno.
Do menu esquerdo da página de Gerenciamento de Usuários, clique em Grunts e então abra o grunt que acabamos de registrar. A aba Info fornece detalhes sobre o status da conexão e funcionalidade:
Para atribuir uma tarefa ao nosso ajudante, precisamos clicar na aba Task.
Exemplo 1: Tire uma captura de tela.
Primeiro, vamos supor que queremos que o grunt tire uma captura de tela da área de trabalho do usuário ativo. Selecionamos Screenshot no menu suspenso de Tarefa e depois clicamos no botão Task abaixo para executar imediatamente esta ação no grunt:
Atualize a página para ver o status atualizado da tarefa. Ela mostrará que a tarefa foi concluída e fornecerá seu resultado, que neste caso é simplesmente uma captura de tela. Observe que o resultado de uma tarefa depende do tipo de tarefa.
Exemplo 2: Execute o Mimikatz.
Vamos fazer com que o trabalho pesado realize outra tarefa: Execute Mimikatz.
Precisamos voltar para a aba Tarefas na página de detalhes do nosso grunt. Em seguida, selecionaremos Mimikatz no menu suspenso de Tarefas.
Muitas tarefas possuem um conjunto de parâmetros de entrada personalizáveis. As tarefas Mimikatz têm um parâmetro de entrada “Command” que nos permite especificar qual comando Mimikatz queremos executar. Convenientemente, ele já vem preenchido com o comando sekurlsa::logonPasswords, que descobre senhas armazenadas na memória. Vamos atribuir essa tarefa ao nosso grunt e ver o que acontece.
Acontece que uma conta de Domain Admin estava logada neste host secundário — então na saída da tarefa, podemos ver a senha do Domain Admin em texto claro!
Executar o Mimikatz usando o Covenant ajuda os adversários a evitar detecção porque o Covenant não armazena tarefas diretamente no host grunt. Em vez disso, ele compila e implanta dinamicamente o payload da tarefa através de sua conexão com o cliente no momento da atribuição da tarefa. Além disso, cada vez que um novo grunt é criado ou uma nova tarefa é atribuída a um grunt, o código relevante é recompilado e ofuscado com o ConfuserEx, o que evita payloads estáticos que seriam mais fáceis de identificar. De fato, ao realizar os passos aqui na minha máquina, o Windows Defender estava ativado e atualizado, mas as tarefas do Mimikatz do grunt foram executadas sem problemas.
Revisando o histórico de tarefas e saídas.
Covenant oferece um histórico claro das tarefas que executou. No menu esquerdo da página de User Management, clique em Taskings:
Você pode ver tanto a tarefa de captura de tela quanto a tarefa mimikatz que executamos anteriormente. Clique em qualquer linha para visualizar os parâmetros da tarefa e o resultado completo.
Observe que muitas tarefas também salvam elementos de sua saída na página de Data. Clique nas diversas abas para visualizar credenciais, indicadores, artefatos baixados e capturas de tela. Por exemplo, aqui estão as credenciais descobertas pela nossa tarefa Mimikatz:
E aqui está uma captura de tela feita por nossa outra tarefa:
Exemplo 3: Baixe um arquivo.
Agora, vamos executar mais uma tarefa no nosso grunt para baixar um arquivo para que possamos visualizá-lo na aba Downloads.
Suponhamos que descobrimos que existe um arquivo em nosso host grunt chamado MySecretDocument.txt. Vamos usar a tarefa Download para obter uma cópia deste arquivo para nós mesmos!
Executar esta tarefa irá recuperar uma cópia do arquivo e disponibilizá-la imediatamente na aba Downloads:
Esta tarefa é simples por si só, mas apresenta alguns casos de uso fascinantes, dado o fato de que podemos executá-la usando os direitos do usuário que executou o lançador grunt ou credenciais que obtivemos por meio de outras tarefas.
Conclusão
Covenant já oferece uma grande variedade de tarefas, e a lista cresce todos os dias graças ao envolvimento da comunidade open-source. Este projeto provavelmente terá um futuro empolgante e certamente vale a pena dar uma olhada!
Compartilhar em
Saiba Mais
Sobre o autor
Joe Dibley
Pesquisador de Segurança
Pesquisador de Segurança na Netwrix e membro da Equipe de Pesquisa de Segurança da Netwrix. Joe é um especialista em Active Directory, Windows e uma ampla variedade de plataformas de software empresarial e tecnologias, Joe pesquisa novos riscos de segurança, técnicas de ataque complexas e as respectivas mitigações e detecções.
Saiba mais sobre este assunto
Exemplo de Análise de Risco: Como Avaliar Riscos
O Triângulo da CIA e Sua Aplicação no Mundo Real
Criar usuários do AD em massa e enviar suas credenciais por e-mail usando PowerShell
Como adicionar e remover grupos AD e objetos nos grupos com PowerShell
Atributos do Active Directory: Último Logon