
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.
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-nspara descobrir namespaces que você não pode listar em todo o cluster.
Demonstração
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ário | Plataforma |
|---|---|
k8scout-linux-amd64 | Linux x86-64 |
k8scout-linux-arm64 | Linux ARM64 |
k8scout-darwin-amd64 | macOS Intel |
k8scout-darwin-arm64 | macOS 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, listserviceaccounts,secrets(somente metadados),configmaps: get, listpods,deployments,daemonsets,statefulsets,jobs,cronjobs: get, listroles,rolebindings,clusterroles,clusterrolebindings: get, listmutatingwebhookconfigurations,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