Voltar às atualizações
New releaseAug 16, 2026

k8scout v0.1.2

Solte um único binário em um pod Kubernetes comprometido e mapeie instantaneamente todos os caminhos de ataque realistas para cluster-admin, escape de nó, roubo de segredos e tomada de controle de IAM na nuvem.

Compartilhar

logotipo k8scout

GitHub stars GitHub forks GitHub issues GitHub license

k8scout

Beta — Um mecanismo de caminhos de ataque Kubernetes em um único binário para avaliações de segurança autorizadas.

Coloque-o dentro de um pod comprometido, execute-o e obtenha um mapa de cada caminho de escalação realista — do seu ponto de apoio atual até cluster-admin, acesso a nós, roubo de segredos e funções IAM em nuvem.


A ideia

Você tem RCE em um pod Kubernetes. E agora?

O k8scout responde a essa pergunta. Ele descobre automaticamente o que a conta de serviço do pod comprometido pode fazer, mapeia o grafo RBAC e traça caminhos de ataque de múltiplas etapas a partir do seu ponto de apoio exato até alvos de alto valor.

Ele funciona em três modos:

  • Modo ofensivo (padrão) — execute de dentro de um pod comprometido. Descobre sua identidade, permissões e todos os caminhos de escalação alcançáveis a partir da sua posição atual.
  • Modo revisor (--reviewer-mode) — execute com uma SA somente leitura para auditar toda a superfície de ataque do cluster para todas as identidades.
  • Modo reconhecimento (--recon) — uma verificação rápida e de baixo impacto apenas da sua identidade, permissões efetivas e quais recursos você pode tocar. Sem grafo ou busca de caminhos. Adicione --bruteforce-ns para descobrir namespaces que você não pode listar em todo o cluster.

Demonstração

demonstração k8scout


O que ele encontra

O k8scout constrói um grafo de permissões ponderado e executa busca de caminhos baseada em Dijkstra para descobrir cadeias de ataque realistas de múltiplas etapas:

  • Pod para cluster-admin — através de bindings RBAC, mutação de workloads ou criação de CRB
  • Escape de container para nó — via containers privilegiados, hostPID, hostNetwork, capabilities perigosas ou mounts hostPath
  • Movimento lateral — exec em outros pods, roubo de tokens SA, pivotar através de suas permissões
  • Roubo de segredos e credenciais — tokens SA montados, secrets, configmaps com credenciais vazadas, tokens órfãos
  • Escalação de IAM em nuvem — IRSA (AWS), GKE Workload Identity, Azure Workload Identity, abuso de audiências de token projetado
  • Cadeias de personificação — tomada de SA para SA através de permissões de impersonate
  • Mutação de workloads — aplicar patch em um deployment para alterar sua SA, depois herdar as permissões dessa SA
  • Injeção de webhook — controle de webhook mutante para injetar em workloads futuras
  • Abuso de operadores GitOps — escalação de privilégio de operadores ArgoCD, Flux, External Secrets e Vault
  • Detecção de má configuração — bindings pendentes, verbos curinga, tokens montados automaticamente, segredos em texto claro em variáveis de ambiente

Cada descoberta inclui IDs de técnica MITRE ATT&CK, uma pontuação de risco e um caminho de ataque passo a passo com os nós do grafo envolvidos. 50 regras de detecção no total.


Início rápido

A partir de um pod comprometido (caso de uso principal)

# Copie o binário para dentro do pod
kubectl cp k8scout-linux-amd64 <ns>/<pod>:/tmp/k8scout

# Execute-o
kubectl exec -it <ns>/<pod> -- chmod +x /tmp/k8scout
kubectl exec -it <ns>/<pod> -- /tmp/k8scout --out /tmp/result.json

# Obtenha os resultados
kubectl cp <ns>/<pod>:/tmp/result.json ./result.json

# Esse fluxo funciona exatamente assim se você estiver usando uma revshell!

O binário detecta automaticamente que está sendo executado dentro do cluster, identifica o pod e a SA e começa a busca de caminhos a partir do seu ponto de apoio exato.

Uso pretendido: Engajamentos de teste de penetração, operações de equipe vermelha, revisões internas de segurança e auditorias de hardening de cluster. Sempre obtenha autorização adequada antes de executar contra qualquer cluster.

A partir da sua máquina local

# Usa ~/.kube/config ou $KUBECONFIG
k8scout --all-namespaces --out result.json

# Alveje um único namespace
k8scout --namespace production --out result.json

Modo reconhecimento (verificação rápida de permissão e recursos)

# Quem sou eu, o que posso fazer e quais recursos posso acessar?
k8scout --recon

# Descubra namespaces que você não pode listar em todo o cluster (wordlist embutida)
k8scout --recon --bruteforce-ns

# Bruteforce com sua própria wordlist de namespaces (um nome por linha)
k8scout --recon --bruteforce-ns --ns-wordlist ./namespaces.txt

O recon ignorar construção de grafo, inferência e IA — é a maneira mais rápida de responder "o que esse token realmente tem?". Ele reporta a identidade atual, suas permissões efetivas (SelfSubjectRulesReview) e uma matriz de capacidade por recurso (SelfSubjectAccessReview). --bruteforce-ns confirma que um namespace existe ao ler objetos conhecidos que todo namespace possui (o objeto namespace, seu default ServiceAccount ou o ConfigMap kube-root-ca.crt) — útil quando a identidade não pode listar namespaces mas ainda pode acessar namespaces específicos.

Modo revisor (auditoria completa do cluster)

# Implemente o RBAC somente leitura e o job
kubectl apply -f deploy/rbac.yaml
kubectl apply -f deploy/job.yaml

# Ou execute diretamente com permissões de revisor
k8scout --reviewer-mode --all-namespaces --out result.json

Com narrativa de IA

export OPENAI_API_KEY="sk-..."
k8scout --all-namespaces --out result.json

Instalação

Binários pré-compilados

Baixe da página de Releases. Todos os binários são estaticamente vinculados, sem dependências.

BinárioPlataforma
k8scout-linux-amd64Linux x86-64
k8scout-linux-arm64Linux ARM64
k8scout-darwin-amd64macOS Intel
k8scout-darwin-arm64macOS Apple Silicon

Compilar a partir do código fonte

Requer Go 1.22+.

git clone https://github.com/hac01/k8scout
cd k8scout
make build          # binário nativo
make build-linux    # binário Linux estático amd64
make build-all      # todos os quatro alvos de release

Como funciona

k8scout (executando dentro de um pod comprometido)
 |
 ├── 1. Detectar ponto de apoio
 │     Nome do pod (HOSTNAME), SA (TokenReview), Node (downward API)
 │
 ├── 2. Descobrir permissões
 │     SSRR por namespace + ~30 verificações pontuais SSAR concorrentes
 │     (sempre permitido, nenhum RBAC necessário)
 │
 ├── 3. Enumerar objetos do cluster (degradação graciosa se negado)
 │     Namespaces, RBAC, Workloads, Pods, Secrets, Nodes, Webhooks, CRDs
 │
 ├── 4. Construir grafo de ataque
 │     Nós: pods, SAs, roles, bindings, secrets, workloads, nodes, identidades na nuvem
 │     Arestas: runs_as, mounts, authenticates_as, can_exec, can_patch,
 │            can_impersonate, runs_on, assumes_cloud_role, granted_by, ...
 │
 ├── 5. Encontrar caminhos de ataque (Dijkstra do ponto de apoio até alvos de alto valor)
 │     Ponderado pelo esforço do atacante — primeiro os mais baratos (mais realistas)
 │     Alvos: cluster-admin, nodes, tokens SA, IAM na nuvem, workloads privilegiados
 │
 ├── 6. Executar regras de inferência (50 regras com mapeamento MITRE ATT&CK)
 │
 ├── 7. Opcional: Narrativa de risco por IA (GPT-4o)
 │
 └── 8. Saída: resumo em texto + relatório JSON

Mesmo com uma SA mínima que não pode listar pods ou objetos RBAC, a ferramenta sintetiza o grafo do ponto de apoio apenas com dados de identidade e descobre o que é alcançável através das permissões SSRR/SSAR.


Visualização do grafo de ataque

Carregue o relatório JSON em web/graph.html em qualquer navegador (arrastar e soltar, sem necessidade de servidor).

  • Aba Caminhos de Ataque — classificados por pontuação de risco, cada um mostrando a cadeia completa de múltiplos saltos do ponto de apoio até o alvo
  • Visão multi-cadeia — visualize caminhos de ataque sobrepostos simultaneamente em um único grafo
  • Grafo direcionado por força — todos os nós e arestas com categorias codificadas por cores e anéis de pontuação de risco
  • Modo foco — escurece ruído estrutural para destacar nós relevantes para ataque
  • Alternância RBAC — oculta nós RBAC, mas os mostra automaticamente quando fazem parte de um caminho de ataque ativo
  • Mini-mapa — navegue por grafos grandes sem perder contexto
  • Detalhe do nó — clique em qualquer nó para obter metadados, conexões e descobertas relacionadas
  • Exportar — baixe um relatório de teste de penetração HTML autocontido

Referência CLI

k8scout [flags]

Flags:
  --out string            Output JSON file path (default "k8scout-result.json")
  --namespace string      Enumerate a single namespace
  --all-namespaces        Enumerate all accessible namespaces (default true)
  --format string         Output format: text | json (default "text")
  --timeout int           Per-request timeout in seconds (default 60)
  --log-level string      debug | info | warn | error (default "info")
  --kubeconfig string     Path to kubeconfig (auto-detected if not set)
  --reviewer-mode         Full cluster RBAC audit for all identities
  --recon                 Quick recon: identity, permissions (SSRR), accessible resources (SSAR)
  --bruteforce-ns         Bruteforce namespace names to find ones you can't list (use with --recon)
  --ns-wordlist string    Custom namespace wordlist for --bruteforce-ns (defaults to a built-in list)
  --stealth               Skip SSRR/SSAR to reduce audit log footprint
  --skip-ssar             Skip SSAR spot-checks only
  --openai-key string     OpenAI API key (or OPENAI_API_KEY env var)
  --openai-model string   OpenAI model (default "gpt-4o")
  --skip-ai               Skip AI narrative generation

Requisitos RBAC

Ao executar de um pod comprometido: Nenhum RBAC especial é necessário. SSRR e SSAR são sempre permitidos. A ferramenta degrada graciosamente se a SA não puder listar objetos do cluster — ela ainda descobre permissões e gera descobertas a partir do que está disponível.

Para enumeração completa (recomendado para a SA do k8scout): acesso somente leitura definido em deploy/rbac.yaml:

  • namespaces, nodes: get, list
  • serviceaccounts, secrets (somente metadados), configmaps: get, list
  • pods, deployments, daemonsets, statefulsets, jobs, cronjobs: get, list
  • roles, rolebindings, clusterroles, clusterrolebindings: get, list
  • mutatingwebhookconfigurations, validatingwebhookconfigurations: get, list

Os valores dos segredos nunca são lidos, a menos que a identidade tenha permissão GET confirmada via SSAR.


Feedback da versão Beta

k8scout está em desenvolvimento ativo. Se você encontrar um bug, falso positivo ou uma lacuna de detecção em seu cluster, por favor abra uma issue. Falsos positivos e caminhos perdidos são especialmente úteis — inclua o JSON da descoberta anonimizado, se possível.


Licença

MIT

Categorias