Retour aux mises à jour
New releaseAug 16, 2026

k8scout v0.1.2

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.

Partager

logo k8scout

Étoiles GitHub Forks GitHub Problèmes GitHub Licence GitHub

k8scout

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.


L'idée

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 :

  • Mode offensif (par défaut) — exécuté depuis un pod compromis. Découvre votre identité, vos autorisations et tous les chemins d'escalade accessibles depuis votre position actuelle.
  • Mode réviseur (--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.
  • Mode reconnaissance (--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.

Démo

démo k8scout


Ce qu'il trouve

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 :

  • Pod vers cluster-admin — via les liaisons RBAC, la mutation de charge de travail ou la création de CRB
  • Évasion de conteneur vers nœud — via des conteneurs privilégiés, hostPID, hostNetwork, des capacités dangereuses ou des montages hostPath
  • Mouvement latéral — exec dans d'autres pods, voler leurs jetons SA, pivoter via leurs autorisations
  • Vol de secrets et d'identifiants — jetons SA montés, secrets, configmaps avec identifiants divulgués, jetons orphelins
  • Escalade IAM cloud — IRSA (AWS), GKE Workload Identity, Azure Workload Identity, abus d'audience de jeton projeté
  • Chaînes d'usurpation — prise de contrôle SA-à-SA via des autorisations d'usurpation
  • Mutation de charge de travail — patcher un déploiement pour changer son SA, puis hériter des autorisations de ce SA
  • Injection de webhook — contrôle du webhook mutateur pour injecter dans les futures charges de travail
  • Abus d'opérateur GitOps — ArgoCD, Flux, External Secrets et escalade de privilèges de l'opérateur Vault
  • Détection de mauvaise configuration — liaisons pendantes, verbes génériques, jetons montés automatiquement, secrets en texte brut dans les variables d'environnement

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.


Démarrage rapide

Depuis un pod compromis (cas d'utilisation principal)

# 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.

Depuis votre machine locale

# Uses ~/.kube/config or $KUBECONFIG
k8scout --all-namespaces --out result.json

# Target a single namespace
k8scout --namespace production --out result.json

Mode reconnaissance (vérification rapide des autorisations et des ressources)

# 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.

Mode réviseur (audit complet du cluster)

# 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

Avec un récit IA

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

Installation

Binaires pré-construits

Téléchargez depuis la page des Releases. Tous les binaires sont liés statiquement sans dépendances.

BinairePlateforme
k8scout-linux-amd64Linux x86-64
k8scout-linux-arm64Linux ARM64
k8scout-darwin-amd64macOS Intel
k8scout-darwin-arm64macOS Apple Silicon

Compiler à partir des sources

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

Comment ça marche

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.


Visualisation du graphe d'attaque

Chargez le rapport JSON dans web/graph.html dans n'importe quel navigateur (glisser-déposer, aucun serveur nécessaire).

  • Onglet Chemins d'attaque — classés par score de risque, chacun montrant la chaîne complète à plusieurs sauts du point d'appui à la cible
  • Vue multi-chaîne — visualiser les chemins d'attaque qui se chevauchent simultanément sur un seul graphe
  • Graphe orienté par forces — tous les nœuds et arêtes avec catégories codées par couleur et anneaux de score de risque
  • Mode focus — atténue le bruit structurel pour mettre en évidence les nœuds pertinents pour l'attaque
  • Bascule RBAC — cache les nœuds RBAC mais les affiche automatiquement lorsqu'ils font partie d'un chemin d'attaque actif
  • Mini-carte — naviguer dans les grands graphes sans perdre le contexte
  • Détail du nœud — cliquez sur n'importe quel nœud pour obtenir les métadonnées, les connexions et les constats associés
  • Export — télécharger un rapport de test d'intrusion HTML autonome

Référence 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

Exigences RBAC

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, list
  • serviceaccounts, secrets (metadata only), configmaps: get, list
  • pods, deployments, daemonsets, statefulsets, jobs, cronjobs: get, list
  • roles, rolebindings, clusterroles, clusterrolebindings: get, list
  • mutatingwebhookconfigurations, validatingwebhookconfigurations: get, list

Les valeurs des secrets ne sont jamais lues sauf si l'identité a confirmé l'autorisation GET via SSAR.


Retours bêta

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.


Licence

MIT

Catégories