
k8scout v0.1.2
Coloca un solo binario en un pod de Kubernetes comprometido y mapea instantáneamente todas las rutas de ataque realistas hacia cluster-admin, escape de nodo, robo de secretos y toma de control de IAM en la nube.
k8scout
Beta — Un motor de rutas de ataque de Kubernetes en un solo binario para evaluaciones de seguridad autorizadas.
Colóquelo en un pod comprometido, ejecútelo y obtenga un mapa de cada ruta de escalada realista: desde su punto de apoyo actual hasta administrador del clúster, acceso a nodos, robo de secretos y roles IAM en la nube.
La idea
Tienes RCE en un pod de Kubernetes. ¿Ahora qué?
k8scout responde a esa pregunta. Descubre automáticamente lo que la cuenta de servicio del pod comprometido puede hacer, traza el gráfico RBAC y localiza rutas de ataque de múltiples pasos desde su punto de apoyo exacto hasta objetivos de alto valor.
Funciona en tres modos:
- Modo ofensivo (por defecto) — se ejecuta desde dentro de un pod comprometido. Descubre tu identidad, permisos y todas las rutas de escalada alcanzables desde tu posición actual.
- Modo de revisión (
--reviewer-mode) — se ejecuta con un SA de solo lectura para auditar la superficie de ataque completa del clúster para todas las identidades. - Modo de reconocimiento (
--recon) — una revisión rápida y de bajo impacto solo de tu identidad, permisos efectivos y qué recursos puedes tocar. Sin gráfico ni búsqueda de rutas. Añade--bruteforce-nspara descubrir espacios de nombres que no puedas listar a nivel de clúster.
Demostración
Lo que encuentra
k8scout construye un gráfico de permisos ponderado y ejecuta búsqueda de rutas basada en Dijkstra para descubrir cadenas de ataque realistas de múltiples pasos:
- De pod a administrador del clúster — a través de vinculaciones RBAC, mutación de cargas de trabajo o creación de CRB
- Escape de contenedor a nodo — mediante contenedores privilegiados, hostPID, hostNetwork, capacidades peligrosas o montajes hostPath
- Movimiento lateral — ejecutar en otros pods, robar sus tokens SA, pivotar a través de sus permisos
- Robo de secretos y credenciales — tokens SA montados, secretos, configmaps con credenciales filtradas, tokens huérfanos
- Escalada IAM en la nube — IRSA (AWS), GKE Workload Identity, Azure Workload Identity, abuso de audiencia de tokens proyectados
- Cadenas de suplantación — toma de control SA a SA mediante permisos de suplantación
- Mutación de cargas de trabajo — parchear un despliegue para cambiar su SA, luego heredar los permisos de esa SA
- Inyección de webhooks — control de webhook mutante para inyectar en cargas de trabajo futuras
- Abuso de operadores GitOps — escalada de privilegios de operadores ArgoCD, Flux, External Secrets y Vault
- Detección de configuraciones incorrectas — vinculaciones colgantes, verbos comodín, tokens montados automáticamente, secretos en texto plano en variables de entorno
Cada hallazgo incluye IDs de técnicas MITRE ATT&CK, una puntuación de riesgo y una ruta de ataque paso a paso con los nodos del gráfico reales involucrados. 50 reglas de detección en total.
Inicio rápido
Desde un pod comprometido (caso de uso 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!
El binario detecta automáticamente que se ejecuta dentro del clúster, identifica el pod y el SA, y comienza la búsqueda de rutas desde tu punto de apoyo exacto.
Uso previsto: Compromisos de pruebas de penetración, operaciones de equipo rojo, revisiones de seguridad internas y auditorías de endurecimiento de clústeres. Siempre obtén la autorización adecuada antes de ejecutarlo contra cualquier clúster.
Desde tu máquina local
# Uses ~/.kube/config or $KUBECONFIG
k8scout --all-namespaces --out result.json
# Target a single namespace
k8scout --namespace production --out result.json
Modo de reconocimiento (verificación rápida de permisos y recursos)
# 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 omite la construcción de gráficos, inferencia e IA — es la forma más rápida de responder
"¿qué tiene realmente este token?". Reporta la identidad actual, sus
permisos efectivos (SelfSubjectRulesReview) y una matriz de capacidades por recurso
(SelfSubjectAccessReview). --bruteforce-ns confirma que existe un espacio de nombres
leyendo objetos conocidos que todo espacio de nombres tiene (el objeto espacio de nombres, su
ServiceAccount default o el ConfigMap kube-root-ca.crt) — útil cuando la
identidad no puede listar espacios de nombres pero aún puede acceder a algunos específicos.
Modo de revisión (auditoría completa del clúster)
# 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
Con narrativa de IA
export OPENAI_API_KEY="sk-..."
k8scout --all-namespaces --out result.json
Instalación
Binarios precompilados
Descárgalos desde la página de Lanzamientos. Todos los binarios están enlazados estáticamente y no tienen dependencias.
| Binario | Plataforma |
|---|---|
k8scout-linux-amd64 | Linux x86-64 |
k8scout-linux-arm64 | Linux ARM64 |
k8scout-darwin-amd64 | macOS Intel |
k8scout-darwin-arm64 | macOS Apple Silicon |
Compilar desde el código fuente
Requiere 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
Cómo funciona
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
Incluso con un SA mínimo que no puede listar pods ni objetos RBAC, la herramienta sintetiza el gráfico de punto de apoyo solo a partir de los datos de identidad y descubre qué es alcanzable a través de los permisos SSRR/SSAR.
Visualización del gráfico de ataque
Carga el informe JSON en web/graph.html en cualquier navegador (arrastrar y soltar, no se necesita servidor).
- Pestaña de Rutas de Ataque — clasificadas por puntuación de riesgo, cada una muestra la cadena completa de múltiples saltos desde el punto de apoyo hasta el objetivo
- Vista de cadenas múltiples — visualiza rutas de ataque superpuestas simultáneamente en un solo gráfico
- Gráfico dirigido por fuerzas — todos los nodos y aristas con categorías codificadas por colores y anillos de puntuación de riesgo
- Modo de enfoque — atenúa el ruido estructural para resaltar los nodos relevantes para el ataque
- Alternancia RBAC — oculta los nodos RBAC pero los muestra automáticamente cuando forman parte de una ruta de ataque activa
- Minimapa — navega por gráficos grandes sin perder el contexto
- Detalle de nodo — haz clic en cualquier nodo para ver metadatos, conexiones y hallazgos relacionados
- Exportar — descarga un informe de pruebas de penetración en HTML autocontenido
Referencia de 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
Cuando se ejecuta desde un pod comprometido: No se necesita RBAC especial. SSRR y SSAR siempre están permitidos. La herramienta se degrada correctamente si el SA no puede listar objetos del clúster — aún descubre permisos y genera hallazgos a partir de lo disponible.
Para una enumeración completa (recomendado para el SA de k8scout): acceso de solo lectura definido en 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
Los valores de los secretos nunca se leen a menos que la identidad tenga permiso GET confirmado a través de SSAR.
Comentarios sobre la versión Beta
k8scout está en desarrollo activo. Si encuentras un error, un falso positivo o una brecha de detección en tu clúster, por favor abre un issue. Los falsos positivos y las rutas no detectadas son especialmente útiles — incluye el JSON del hallazgo anonimizado si es posible.
Licencia
MIT