Home Comunidade Eventos YouTube Networks Desafios // produtos Academy News CTI | CVE Contato

07 - Velociraptor (Caça em escala)

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione video: https://youtu.be/... no frontmatter da nota.

Velociraptor (Caça em escala)

Nota 07 do capítulo 09 (Ferramentas e Plataformas), dedicada à caça interativa e em escala sobre endpoints com VQL.
O Velociraptor coloca o processo de hunting do capítulo 07 em execução federada sobre milhares de hosts, de forma controlada e read-only.
Dialoga com as notas 06 e 08 deste capítulo, com o controle DAT.1 e com os grupos HNT e AUT do capítulo 15.

1. Contexto e Posicionamento na Biblioteca

A nota 06 deste capítulo mostrou ferramentas que examinam um host por vez, sob demanda e com custo alto por alvo. O Velociraptor resolve o problema oposto: executar a mesma pergunta de caça sobre milhares de endpoints de uma vez, de forma read-only, com controle fino de recursos e sem obrigar o despejo de toda telemetria em um SIEM. Ele ocupa na biblioteca o papel de motor de execução do processo de hunting: hipóteses do capítulo 07 viram artifacts VQL aqui, e as descobertas voltam ao ciclo de inteligência como novas detecções, novas baselines e novas hipóteses.

Três características distinguem o Velociraptor de um agente de EDR comercial. Primeiro, é código aberto e sem licenciamento por endpoint, o que permite cobrir ativos que o EDR não cobre, como servidores legados, estações de laboratório e redes isoladas. Segundo, a unidade de trabalho é o artifact, um pacote declarativo com nome, parâmetros e consultas VQL versionável em Git, o que torna cada caça reprodutível e auditável. Terceiro, o acesso aos dados é interativo: o analista pergunta, o endpoint responde apenas o resultado, e nada precisa ser ingerido permanentemente em um data lake para isso.

2. Arquitetura: Servidor, Clientes, VQL e Artifacts

A arquitetura é cliente-servidor com TLS mútuo. O servidor expõe a GUI (porta padrão 8889) e o frontend que recebe os agentes (porta padrão 8009); cada cliente roda um binário único que persiste como serviço e puxa trabalho do servidor. O cliente executa VQL localmente e devolve só as linhas resultantes, o que mantém o tráfego de rede proporcional ao resultado e não à telemetria bruta. O servidor mantém o datastore de arquivos (FileStore local ou bucket S3), a fila de tarefas por cliente e o cadastro de hosts com client_id estável, que sobrevive a reinstalações do agente.

O VQL (Velociraptor Query Language) é uma linguagem parecida com SQL, composta por funções e plugins que leem estado do sistema: pslist() para processos, glob() para arquivos, parse_evtx() para logs de eventos, read_reg_key() para registro, parse_pe() para binários, entre dezenas de outros. Um artifact empacota uma ou mais fontes de consulta VQL com metadados: nome hierárquico, descrição, autor, parâmetros tipados e referência a MITRE ATT&CK. A biblioteca padrão traz centenas de artifacts prontos, e a prática da casa é estendê-la com artifacts Custom, versionados em repositório e revisados no mesmo fluxo de código do time.

Componente Papel Observação operacional
Cliente (agente) Executa VQL local e responde tarefas binário único por SO, atualização centralizada
Frontend (8009) Recebe conexões dos clientes TLS mútuo, enrolamento de chaves por HMAC
GUI (8889) Hunts, notebooks, VFS, coletores RBAC por grupos definidos na configuração
Datastore Guarda resultados e uploads FileStore em disco ou S3, com ciclo de limpeza
Artifact Unidade declarativa de caça YAML versionado em Git, com parâmetros tipados

3. VQL na Prática: Execução, Persistência e Acesso a Credenciais

A execução suspeita viva é a caça de partida mais comum. A consulta abaixo procura interpretadores com padrões de download cradle e execução ofuscada na linha de comando, cobrindo T1059.001 e variantes de evasion:

SELECT Pid, Name, Exe, CommandLine, CreateTime AS Inicio
FROM pslist()
WHERE Name =~ "(?i)(powershell|pwsh|mshta|rundll32|regsvr32|wscript)"
  AND CommandLine =~ "(?i)(frombase64string|iex|downloadstring|downloadfile|-e?nc)"

Persistência combina três fontes clássicas, Run keys, serviços e tarefas agendadas, cada uma como artifact pronto da biblioteca padrão. O filtro por caminhos de usuário elimina a maior parte do ruído de software corporativo legítimo:

SELECT * FROM Artifact.Windows.Registry.Run()
WHERE ValueData =~ "(?i)(users|appdata|temp|powershell|wscript|mshta)"

SELECT Name, PathName, StartMode
FROM Artifact.Windows.System.Services()
WHERE PathName =~ "(?i)(users|appdata|temp|public)"

O histórico de execução via prefetch permite enxergar ferramentas que já saíram do host, o que o pslist não alcança. A caixa abaixo procura utilitários de administração remota e de manipulação de sombras de cópia, padrão associado a movimento lateral e a ações de ransomware:

SELECT Name, LastRunTimes, RunCount
FROM Artifact.Windows.Timeline.Prefetch()
WHERE Name =~ "(?i)(psexec|wmic|net|vssadmin|wbadmin)"

O acesso a credenciais é caçado por telemetria de handles, em geral via Sysmon EID 10, consultado com parse_evtx no cliente. A consulta abaixo lista processos que abriram lsass.exe com direitos de leitura de memória, excluindo os processos de sistema que têm esse direito legítimo:

SELECT EventTime, EventData.SourceImage AS Origem,
       EventData.GrantedAccess AS Acesso
FROM parse_evtx(filename="C:/Windows/system32/winevt/Logs/Microsoft-Windows-Sysmon%4Operational.evtx")
WHERE System.EventID.Value = 10
  AND EventData.TargetImage =~ "(?i)lsass\\.exe"
  AND NOT EventData.SourceImage =~ "(?i)(csrss|winlogon|services|lsass|svchost)"

4. Exemplo de Artifact VQL Completo

O artifact abaixo é o formato declarativo completo: nome hierárquico, descrição, referência ATT&CK, parâmetro tipado com valor padrão e duas fontes independentes, uma sobre processos vivos e outra sobre histórico de execução. Salve-o como Custom.Hunting.PowerShellOfuscado e importe pela GUI em View Artifacts, ou mantenha um diretório de definições carregado no servidor:

name: Custom.Hunting.PowerShellOfuscado
description: |
  Procura PowerShell com padroes de download cradle e execucao ofuscada,
  apoiando as hipoteses de execucao e evasion do capitulo 08.
reference:
  - https://attack.mitre.org/techniques/T1059/001/
author: time.hunting@empresa.internal
parameters:
  - name: RegexSuspeito
    type: regex
    default: "(?i)(frombase64string|iex|downloadstring|downloadfile|-e?nc\\s)"
sources:
  - name: ProcessosVivos
    query: |
      SELECT Pid, Name, Exe, CommandLine, CreateTime AS Inicio
      FROM pslist()
      WHERE Name =~ "(?i)(powershell|pwsh)"
        AND CommandLine =~ RegexSuspeito
  - name: PrefetchHistorico
    query: |
      SELECT Name, LastRunTimes, RunCount
      FROM Artifact.Windows.Timeline.Prefetch()
      WHERE Name =~ "(?i)(POWERSHELL|PWSH)"

A separação em fontes importa na leitura de resultados: cada fonte aparece com seu nome na saída do hunt, o que permite comparar hosts com processo vivo e hosts com histórico de execução, dois estados com implicações distintas de contenção.

5. Caça Federada em Milhares de Endpoints

O hunt é o mecanismo federado: o analista seleciona artifacts, parâmetros, rótulos de clientes e prazo de coleta, e o servidor distribui a tarefa para todo o parque elegível. Cada cliente executa quando conecta e devolve linhas ao hunt; o notebook do hunt permite correlacionar, agregar e visualizar sem exportar nada. Em frotas de milhares de endpoints, três práticas separam caça controlada de indisposição: começar por um grupo canário com dezenas de hosts, usar rótulos (labels) para delimitar frotas por criticidade e sempre limitar recursos.

Os controles de recursos do cliente são a garantia de segurança operacional: ops_per_second limita operações VQL por segundo, cpu_limit e iops_limit teto o uso percentual de CPU e de disco, e max_execution_time encerra consultas travadas. Uma hunt de disco completo sobre 10 mil servidores sem esses limites é uma autocatástrofe; com limites, a mesma hunt se espalha ao longo de horas e ninguém percebe. O padrão da casa deve ser: cpu_limit 50, iops_limit 30 e canário obrigatório para qualquer artifact novo.

6. Coleta Forense e Coletor Offline

Além de caça, o Velociraptor cumpre papel de coletor forense sob demanda. O artifact Windows.KapeFiles.Collect executa alvos de triagem no padrão KAPE, puxando prefetch, hives de registro, logs de eventos e artefatos de execução em um único upload, o que alimenta diretamente o Plaso da nota 06. O navegador VFS permite descer à árvore de arquivos de um cliente específico, baixar arquivos com hash e manter a proveniência registrada no servidor. O coletor offline fecha a lacuna de hosts sem linha com o servidor: o comando velociraptor collector gera um binário autônomo com os artifacts embutidos, que roda no host alvo e produz um zip importável de volta ao servidor, mantendo o mesmo formato de resultado.

Esse binário autônomo é a ponte entre o parque gerenciado e o parque sem conectividade: ambientes industriais, DMZs rígidas e notebooks em field service podem ser triados com o mesmo repertório de artifacts e triados depois pelo mesmo time. O zip importado entra no servidor como coleta local, com os mesmos notebooks, exportações e trilhas de auditoria, o que mantém a evidência dentro de um único fluxo auditável.

7. Integração com Hunting Programático

O servidor expõe API gRPC autenticada por certificado, e o pacote Python pyvelociraptor torna cada hunt programável. O esqueleto abaixo lista clientes e dispara uma consulta via API, base para automatização do controle AUT.4 do capítulo 15:

from pyvelociraptor import ApiClient, api_pb2, api_pb2_grpc

config = open("/etc/velociraptor/api.config.yaml").read()
conn = ApiClient(api_pb2.ApiClientConfiguration.FromString(config))
stub = api_pb2_grpc.APIStub(conn)

vql = "SELECT client_id, os_info.fqdn AS Host FROM clients()"
request = api_pb2.VQLCollectorRequest(
    query=[api_pb2.VQLRequest(VQL=vql)],
    max_row=1000,
)
for resposta in stub.Query(request):
    if resposta.response:
        print(resposta.response)

O padrão de automação recomendado nesta biblioteca é o seguinte: um agendador dispara semanalmente as hunts de alta prioridade via API; os resultados são exportados em JSON para o bucket do lake descrito na nota 08; as linhas relevantes entram no SIEM com etiqueta de fonte velociraptor; e as descobertas que viram detecção permanente migram para regras Sigma, reduzindo a dependência de hunt manual. Os notebooks do servidor também executam Python com VQL embutido, útil para prototipar antes de versar o artifact.

8. Limitações

O Velociraptor exige conectividade de volta ao servidor, e clientes offline só recebem hunts quando reconectam, o que deixa janelas cegas em frotas móveis. O VQL é read-only por desenho: contenção e erradicação exigem integração com SOAR ou ação manual, e tentar forçar o Velociraptor a agir é má prática. A curva de aprendizado do VQL é real para times acostumados a console gráfica, e a qualidade dos artifacts comunitários varia, o que impõe revisão antes de qualquer uso em produção. Por fim, o servidor é ativo de altíssimo valor: quem controla a GUI controla milhares de hosts, e por isso o acesso deve ser restrito, auditado e com MFA, e o tráfego de clientes nunca deve atravessar redes administrativas sem isolamento.

9. Erros Comuns e Pontos de Atenção

O erro mais caro é liberar hunts de coleta pesada sem canário e sem limites de recursos, tratando o parque inteiro como laboratório. O segundo é transformar o Velociraptor em SIEM: manter resultados de centenas de hunts no datastore sem política de expiração incha o armazenamento e degrada a GUI; exporte o que interessa e deixe a retenção longa para o lake da nota 08. O terceiro é copiar artifacts da internet sem leitura linha a linha, porque parâmetros mal configurados, como globs muito largos, multiplicam o custo em disco e em rede em cada cliente.

Na leitura de resultados, cuidado com a inversão de conclusão: ausência de linhas em uma hunt não prova ausência de comprometimento, apenas que aquele artifact, naquele instante e com aqueles parâmetros, não viu nada. Registre sempre a versão do artifact, os parâmetros usados e o prazo de coleta no relatório, seguindo a nota 05 do capítulo 07, para que a caça seja reprodutível por outro analista.

10. Integração com o Restante da Biblioteca

Esta nota executa em escala o que os capítulos 07 e 08 planejam: cada hipótese de caça vira artifact, cada técnica do capítulo 08 vira consulta VQL com referência ATT&CK, e cada descoberta realimenta a produção de inteligência do capítulo 05. O controle DAT.1 encontra aqui o complemento open source do inventário de telemetria, e os grupos HNT do capítulo 15 usam os controles de recursos como política de execução. A nota 08 do capítulo 09 mostra para onde vão os resultados em volume, e a nota 14 da biblioteca, sobre BAS, usa artifacts de validação para provar que a simulação deixou os rastros esperados.