
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.
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-nspour découvrir les espaces de noms que vous ne pouvez pas lister à l'échelle du cluster.
Démo
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.
| Binaire | Plateforme |
|---|---|
k8scout-linux-amd64 | Linux x86-64 |
k8scout-linux-arm64 | Linux ARM64 |
k8scout-darwin-amd64 | macOS Intel |
k8scout-darwin-arm64 | macOS 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, listserviceaccounts,secrets(metadata only),configmaps: get, listpods,deployments,daemonsets,statefulsets,jobs,cronjobs: get, listroles,rolebindings,clusterroles,clusterrolebindings: get, listmutatingwebhookconfigurations,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