
Déposez un seul binaire dans un pod Kubernetes compromis et cartographiez instantanément chaque chemin d'attaque réaliste vers cluster-admin, node escape, secret theft et cloud IAM takeover.
Bêta — Un moteur de chemins d'attaque Kubernetes en un seul binaire pour les évaluations de sécurité autorisées.
Déposez-le dans un pod compromis, exécutez-le, et obtenez une carte de chaque chemin d'escalade réaliste — de votre point d'appui actuel jusqu'à l'administrateur du cluster, l'accès aux nœuds, le vol de secrets et les rôles IAM cloud.
Vous avez un RCE dans un pod Kubernetes. Et maintenant ?
k8scout répond à cette question. Il découvre automatiquement ce que le compte de service du pod compromis peut faire, cartographie le graphe RBAC et trace des chemins d'attaque en plusieurs étapes depuis votre point d'appui exact jusqu'aux cibles de haute valeur.
Il fonctionne en trois modes :
--reviewer-mode) — exécuté avec un SA en lecture seule pour auditer la surface d'attaque complète du cluster pour toutes les identités.--recon) — un aperçu rapide et léger de votre identité, de vos autorisations effectives et des ressources que vous pouvez toucher. Pas de graphe ni de recherche de chemin. Ajoutez --bruteforce-ns pour découvrir les espaces de noms que vous ne pouvez pas lister à l'échelle du cluster.
k8scout construit un graphe d'autorisations pondéré et exécute une recherche de chemin basée sur Dijkstra pour découvrir des chaînes d'attaque réalistes en plusieurs étapes :
Chaque constat inclut les identifiants de technique MITRE ATT&CK, un score de risque et un chemin d'attaque étape par étape avec les nœuds du graphe réels impliqués. 50 règles de détection au total.
# Copy the binary into the pod
kubectl cp k8scout-linux-amd64 <ns>/<pod>:/tmp/k8scout
# Run it
kubectl exec -it <ns>/<pod> -- chmod +x /tmp/k8scout
kubectl exec -it <ns>/<pod> -- /tmp/k8scout --out /tmp/result.json
# Pull the results
kubectl cp <ns>/<pod>:/tmp/result.json ./result.json
# This flow works exactly like this in you're revshell!
Le binaire détecte automatiquement qu'il s'exécute dans le cluster, identifie le pod et le SA, et commence la recherche de chemin à partir de votre point d'appui exact.
Utilisation prévue : Tests d'intrusion, opérations d'équipe rouge, revues de sécurité internes et audits de renforcement du cluster. Obtenez toujours une autorisation appropriée avant de l'exécuter contre un cluster.
# Uses ~/.kube/config or $KUBECONFIG
k8scout --all-namespaces --out result.json
# Target a single namespace
k8scout --namespace production --out result.json
# Who am I, what can I do, and what resources can I access?
k8scout --recon
# Discover namespaces you can't list cluster-wide (built-in wordlist)
k8scout --recon --bruteforce-ns
# Bruteforce with your own namespace wordlist (one name per line)
k8scout --recon --bruteforce-ns --ns-wordlist ./namespaces.txt
Recon saute la construction du graphe, l'inférence et l'IA — c'est le moyen le plus rapide de répondre à la question « qu'est-ce que ce jeton possède réellement ? ». Il signale l'identité actuelle, ses autorisations effectives (SelfSubjectRulesReview) et une matrice de capacités par ressource (SelfSubjectAccessReview). --bruteforce-ns confirme l'existence d'un espace de noms en lisant des objets bien connus que chaque espace de noms possède (l'objet espace de noms, son ServiceAccount default ou la ConfigMap kube-root-ca.crt) — utile lorsque l'identité ne peut pas lister les espaces de noms mais peut toujours accéder à des espaces spécifiques.
# Deploy the read-only RBAC and job
kubectl apply -f deploy/rbac.yaml
kubectl apply -f deploy/job.yaml
# Or run directly with reviewer permissions
k8scout --reviewer-mode --all-namespaces --out result.json
export OPENAI_API_KEY="sk-..."
k8scout --all-namespaces --out result.json
Téléchargez depuis la page des Releases. Tous les binaires sont liés statiquement sans dépendances.
| Binaire | Plateforme |
|---|---|
k8scout-linux-amd64 | Linux x86-64 |
k8scout-linux-arm64 | Linux ARM64 |
k8scout-darwin-amd64 |
Nécessite Go 1.22+.
git clone https://github.com/hac01/k8scout
cd k8scout
make build # native binary
make build-linux # static Linux amd64 binary
make build-all # all four release targets
k8scout (running inside compromised pod)
|
├── 1. Detect foothold
│ Pod name (HOSTNAME), SA (TokenReview), Node (downward API)
│
├── 2. Discover permissions
│ SSRR per namespace + ~30 concurrent SSAR spot-checks
│ (always permitted, no RBAC needed)
│
├── 3. Enumerate cluster objects (graceful degradation if denied)
│ Namespaces, RBAC, Workloads, Pods, Secrets, Nodes, Webhooks, CRDs
│
├── 4. Build attack graph
│ Nodes: pods, SAs, roles, bindings, secrets, workloads, nodes, cloud identities
│ Edges: runs_as, mounts, authenticates_as, can_exec, can_patch,
│ can_impersonate, runs_on, assumes_cloud_role, granted_by, ...
│
├── 5. Find attack paths (Dijkstra from foothold to high-value targets)
│ Weighted by attacker effort — cheapest (most realistic) paths first
│ Targets: cluster-admin, nodes, SA tokens, cloud IAM, privileged workloads
│
├── 6. Run inference rules (50 rules with MITRE ATT&CK mapping)
│
├── 7. Optional: AI risk narrative (GPT-4o)
│
└── 8. Output: text summary + JSON report
Même avec un SA minimal qui ne peut pas lister les pods ou les objets RBAC, l'outil synthétise le graphe du point d'appui à partir des seules données d'identité et découvre ce qui est accessible via les permissions SSRR/SSAR.
Chargez le rapport JSON dans web/graph.html dans n'importe quel navigateur (glisser-déposer, aucun serveur nécessaire).
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
Lors de l'exécution depuis un pod compromis : Aucun RBAC spécial nécessaire. SSRR et SSAR sont toujours autorisés. L'outil se dégrade gracieusement si le SA ne peut pas lister les objets du cluster — il découvre toujours les autorisations et génère des constats à partir de ce qui est disponible.
Pour une énumération complète (recommandée pour le SA k8scout) : accès en lecture seule défini dans deploy/rbac.yaml :
namespaces, nodes: get, listserviceaccounts, secrets (metadata only), configmaps: get, listpods, deployments, daemonsets, statefulsets, jobs, cronjobs: get, listroles, rolebindings, clusterroles, clusterrolebindings: get, listLes valeurs des secrets ne sont jamais lues sauf si l'identité a confirmé l'autorisation GET via SSAR.
k8scout est en développement actif. Si vous rencontrez un bug, un faux positif ou une lacune de détection dans votre cluster, veuillez ouvrir un ticket. Les faux positifs et les chemins manqués sont particulièrement utiles — incluez le JSON de constat anonymisé si possible.
MIT
| macOS Intel |
k8scout-darwin-arm64 | macOS Apple Silicon |
mutatingwebhookconfigurations, validatingwebhookconfigurations: get, list