
Ferramenta interativa de visualização de dados para blue teams analisarem dados de detecção, compreenderem relações, reduzirem a fadiga de alertas e melhorarem a resposta a incidentes.
O Detectree é uma ferramenta de visualização de dados para blue teams. Ela fornece uma representação gráfica dos dados de detecção, o que permite que um analista gere opiniões quase instantâneas sobre a natureza da atividade subjacente e compreenda relações complexas entre os pontos de dados. Em última análise, isso pode ajudar a reduzir o tempo de resposta, reduzir a fadiga de alertas e facilitar a comunicação entre analistas dentro das equipes.
O Detectree é escrito em svelte e baseado na biblioteca javascript force-graph.
Para usar o Detectree no seu ambiente, as detecções precisam atender a um conjunto mínimo de propriedades. Na tabela a seguir, você pode ver quais campos devem ser incluídos em cada detecção e quais são opcionais.
| Campo | Obrigatório |
|---|---|
| ID do Endpoint | sim |
| Categoria | sim |
| Severidade | sim |
| Nome da Detecção | sim |
| Nome do Processo Pai | sim |
| ID do Processo Pai | sim |
| Nome do Processo | sim |
| ID do Processo | sim |
| Usuário | não |
| Linha de Comando | não |
| Nome do Arquivo | não |
| Chave de Registro | não |
| Endereço de Rede | não |
| Nome do Processo Alvo | não |
| ID do Processo Alvo | não |
Os mapeamentos para cada campo são definidos no arquivo schema.yml; um arquivo de exemplo schema.yml.example é fornecido. Este arquivo define quais campos devem ser extraídos dos dados no backend e como eles são mapeados internamente. Em particular, a parte de mapeamento contém o mapeamento do detectree à esquerda e o mapeamento do backend à direita; você precisará preencher o mapeamento de acordo com o seu ambiente.
O schema também contém a configuração do backend; para elastic deve ser direto, mas o significado dos vários campos é o seguinte:
primaryId é o identificador único do endpoint. É isso que é usado para recuperar as detecções.
timeField é o campo de tempo usado para restringir a consulta.
source é o campo que identifica o tipo de detecção; no schema de exemplo, isso é mapeado para NewProcess, RegistryWrite, FileAccess e assim por diante.
Posteriormente, em mappings, o campo type identifica uma detecção específica; por exemplo, se o seu backend suporta apenas detecções NewProcess (ou qualquer que seja o nome correspondente), você precisará de apenas um mapeamento. Estritamente relacionado a isso, o campo kind vincula o tipo de detecção ao do detectree. Como exemplo, se kind for file, o mapeamento deve fornecer um filePath que será usado para desenhar um nó de contexto.
Atualmente, o único backend suportado é o elastic; no entanto, deve ser trivial construir um adaptador para qualquer novo backend. Consulte a seção Adicionando um novo backend para obter mais informações.
Para implantar o aplicativo no seu ambiente, você precisa instalar as dependências necessárias com npm install (ou pnpm install ou yarn). Em seguida, você precisará selecionar o adaptador certo para o seu ambiente; siga este guia para obter as informações mais atualizadas.
Se, por exemplo, você quiser usar node como seu backend, precisará instalar @sveltejs/adapter-node e modificar seu svelte.config.js, substituindo @sveltejs/adapter-auto por @sveltejs/adapter-node. O projeto pode então ser compilado com o seguinte comando; a saída estará na pasta output.
npm run build
Um servidor de desenvolvimento pode ser iniciado com o seguinte comando, o que permitirá servir o aplicativo localmente.
npm run dev
# ou inicie o servidor e abra o aplicativo em uma nova aba do navegador
npm run dev -- --open
Um exemplo de grafo pode ser visto na seguinte captura de tela

Para suportar um novo backend, você precisa criar um arquivo TypeScript dedicado na pasta backend_adapters. Você pode usar o elastic como modelo; o novo módulo deve expor uma função de consulta que deve receber como entrada os mesmos parâmetros que a do arquivo elastic. Você pode então consultar o backend escolhido da maneira preferida. A função de consulta deve retornar um objeto contendo os dados mapeados de acordo com o mapeamento definido no arquivo schema.yaml. Finalmente, para que o backend seja selecionado corretamente, você também precisa adicioná-lo no seguinte objeto dentro de draw_tree.ts; as chaves do objeto aqui também serão como o backend é referenciado no schema.yml
const backendTypes = {
elastic: '../backend_adapters/elastic'
};