Kuma 服务网格控制面打点与HTTP API、GUI利用技术

Kuma 服务网格控制面打点与HTTP API、GUI利用技术

Kuma 的控制面打点价值很高,因为它既有完整的 HTTP API,又有同端口 GUI,并且控制面对:

  • Mesh
  • Dataplane
  • Zone
  • Secret
  • Policy
  • xDS
  • Token

这些对象都拥有直接可用的查询与部分写入能力。官方文档明确指出:

  • kuma-cp 默认在 5681 提供 HTTP API,在 5682 提供 HTTPS API
  • HTTP API 可用于检索配置与策略状态
  • Universal 模式下,API 还允许直接修改状态
  • GUI 就挂在控制面 API 服务上
  • Inspect API 可直接查看策略匹配与 Envoy config dump

对攻击者来说,这意味着一旦控制面进入低信任网络,往往可以一步拿到:

  • 网格名称与多租户边界
  • Sidecar / gateway dataplane 列表
  • 服务标签、端口、协议、zone 与版本
  • Policy 选择器与实际命中结果
  • 代理的 xDS 配置与路由快照
  • 区域拓扑、zone ingress/egress 状态
  • 用于新 dataplane 接入的 bootstrap token

更关键的是,Kuma 把控制面 API 和 GUI 设计成强运维导向接口。对于红队或渗透测试来说,这不是“看个 dashboard”,而是:

  1. 网格 CMDB
  2. 策略解析器
  3. dataplane 注册与令牌面
  4. xDS 与 Envoy 配置读取面

本文重点围绕:

  1. 如何识别 Kuma HTTP API 与 GUI
  2. 如何利用 meshes/dataplanes/policies/xds/config 恢复网格结构
  3. 如何理解 tokens/dataplanesecrets/config 的实际风险边界
  4. UniversalKubernetes 模式下哪些接口是只读,哪些具备写入价值
  5. 蓝队如何从控制面日志、K8s 审计和策略变更中定位这类打点

下文请求/响应样例为脱敏后的实战常见结构,重点保留对象组织、关键字段和利用判断依据。


0. 攻击面概览

0.1 常见端口与路径

Kuma 控制面默认端口为:

  • 5681:HTTP API / GUI
  • 5682:HTTPS API / GUI

首轮建议优先测试:

  • /config
  • /versions
  • /meshes
  • /mesh-insights
  • /dataplanes
  • /dataplanes+insights
  • /tokens/dataplane
  • /zones
  • /zone-ingresses
  • /gui

若环境启用了 Inspect API 能力,还应重点关注:

  • /meshes/{mesh}/dataplanes/{name}/policies
  • /meshes/{mesh}/dataplanes/{name}/rules
  • /meshes/{mesh}/dataplanes/{name}/xds
  • /zone-ingresses/{name}/xds
  • /zone-egresses/{name}/xds

0.2 官方边界的实战含义

官方文档直接说明:

  • HTTP API 用于读取配置与策略状态
  • 在 Universal 模式可通过 API 修改状态
  • 在 Kubernetes 模式通常应通过 CRD 改状态
  • /config 返回控制面的有效配置,但不会回显数据库密码等 secrets

这里要特别注意三点:

  1. “不会返回密码”不等于低风险
  2. 资源与策略图本身就足够敏感
  3. 在 Universal 模式下,控制面 API 暴露常常直接具备写入面

0.3 GUI 与 API 的关系

Kuma GUI 并不是独立产品,而是挂在控制面 API 上的一层视图。官方主页和文档都直接用:

kubectl port-forward svc/kuma-control-plane -n kuma-system 5681:5681

再访问:

http://127.0.0.1:5681/gui

这意味着实战里一旦 56815682 被错误发布:

  • GUI 可达通常意味着 API 同时在侧
  • GUI 能看到的对象,大多都可以从 API 结构化获取

1. 第一轮打点:识别 Kuma 控制面 API 与 GUI

1.1 GET /gui

请求示例

GET /gui HTTP/1.1
Host: kuma-cp.target.example:5681
Accept: text/html
Connection: close

典型响应示例

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Connection: close
<!doctype html>
<html>
  <head>
    <title>Kuma</title>
  </head>
  <body>
    <div id="root"></div>
  </body>
</html>

GUI 的价值在于:

  • 直观确认目标是 kuma-cp
  • 往往可进一步侧信道出 API 基础路径
  • 说明控制面服务本身已经可达,而非仅有 dataplane 端口暴露

1.2 GET /versions

/versions 适合做轻量识别。

请求示例

GET /versions HTTP/1.1
Host: kuma-cp.target.example:5681
Accept: application/json
Connection: close

典型响应示例

{
  "kumaCp": {
    "version": "2.12.1",
    "gitTag": "2.12.1"
  },
  "envoy": {
    "version": "1.31.2"
  }
}

这一步能直接判断:

  • 控制面版本
  • 绑定的 Envoy 版本代际
  • 后续应参考哪一代 API 与策略体系

1.3 GET /config

/config 是最值得首轮留档的控制面接口之一。

请求示例

GET /config HTTP/1.1
Host: kuma-cp.target.example:5681
Accept: application/json
Connection: close

典型响应示例

{
  "apiServer": {
    "http": {
      "enabled": true,
      "port": 5681
    },
    "https": {
      "enabled": false
    }
  },
  "store": {
    "type": "postgres"
  },
  "multizone": {
    "global": {
      "kds": {}
    }
  },
  "gui": {
    "enabled": true,
    "readOnly": false
  }
}

官方文档强调敏感 secret 不会直接出现,但这个接口仍能告诉攻击者:

  • 是否启用了明文 HTTP
  • 后端存储类型
  • 是否为多区部署
  • GUI 是否启用只读
  • 是否启用了 HTTPS 与客户端证书认证

这本身已经足够用于判断控制面安全级别。


2. 第二轮打点:恢复 Mesh、Dataplane 与 Zone 图谱

2.1 GET /meshes

请求示例

GET /meshes HTTP/1.1
Host: kuma-cp.target.example:5681
Accept: application/json
Connection: close

典型响应示例

{
  "total": 2,
  "items": [
    {
      "type": "Mesh",
      "name": "default",
      "mtls": {
        "enabledBackend": "ca-1"
      }
    },
    {
      "type": "Mesh",
      "name": "payments"
    }
  ]
}

这一步能回收:

  • 网格数量
  • 多租户或环境边界
  • mTLS backend 轮廓
  • 哪些 mesh 名字直指业务用途

2.2 GET /mesh-insights

mesh-insights 对打点尤其有用,因为它不是“配置”,而是控制面视角下的健康与规模总览。

请求示例

GET /mesh-insights HTTP/1.1
Host: kuma-cp.target.example:5681
Accept: application/json
Connection: close

典型响应示例

{
  "total": 1,
  "items": [
    {
      "type": "MeshInsight",
      "name": "default",
      "dataplanes": {
        "total": 14,
        "offline": 1,
        "partiallyDegraded": 2
      },
      "dataplanesByType": {
        "standard": {
          "total": 12
        },
        "gateway": {
          "total": 2
        }
      },
      "policies": {
        "MeshTrafficPermission": {
          "total": 3
        },
        "MeshHTTPRoute": {
          "total": 5
        }
      }
    }
  ]
}

这个接口能帮助攻击者判断:

  • 网格规模
  • 是否存在 gateway dataplane
  • 当前有多少策略对象
  • 哪些 mesh 正处于异常状态

2.3 GET /dataplanes+insights

请求示例

GET /dataplanes+insights HTTP/1.1
Host: kuma-cp.target.example:5681
Accept: application/json
Connection: close

典型响应示例

{
  "items": [
    {
      "type": "DataplaneOverview",
      "mesh": "default",
      "name": "backend-1",
      "dataplane": {
        "networking": {
          "address": "10.42.1.19",
          "inbound": [
            {
              "port": 10010,
              "servicePort": 10011,
              "tags": {
                "kuma.io/service": "backend",
                "version": "v1",
                "env": "prod"
              }
            }
          ],
          "outbound": [
            {
              "port": 33033,
              "tags": {
                "kuma.io/service": "database"
              }
            }
          ]
        }
      },
      "dataplaneInsight": {
        "subscriptions": [],
        "mTLS": {
          "certificateExpirationTime": "2026-07-15T14:04:57.832482Z"
        }
      }
    }
  ]
}

这一步对渗透来说极具价值,因为它把:

  • dataplane IP
  • inbound/outbound 端口
  • 服务标签
  • 版本标签
  • mTLS 证书到期时间

一次性结构化给出。

2.4 GET /zonesGET /zone-ingresses

如果是多区部署,这两组接口就是横向地图。

请求示例

GET /zones HTTP/1.1
Host: kuma-cp.target.example:5681
Accept: application/json
Connection: close

典型响应示例

{
  "items": [
    {
      "type": "Zone",
      "name": "cluster-east",
      "enabled": true
    },
    {
      "type": "Zone",
      "name": "cluster-west",
      "enabled": true
    }
  ]
}

请求示例

GET /zone-ingresses HTTP/1.1
Host: kuma-cp.target.example:5681
Accept: application/json
Connection: close

典型响应示例

{
  "items": [
    {
      "type": "ZoneIngress",
      "name": "zone-ingress-east",
      "networking": {
        "address": "172.18.0.40",
        "port": 10001,
        "advertisedAddress": "zi-east.target.example",
        "advertisedPort": 10001
      }
    }
  ]
}

对攻击者来说,多区信息意味着:

  • 控制面不只管理本集群
  • zone ingress / egress 可能成为更高价值流量中转点

3. 第三轮打点:策略命中、Inspect API 与 xDS 配置恢复

3.1 GET /meshes/{mesh}/dataplanes/{name}/policies

官方 HTTP API 文档明确给出了这个接口及返回结构,它是理解某个 dataplane 实际被哪些策略命中的最佳入口。

请求示例

GET /meshes/default/dataplanes/backend-1/policies HTTP/1.1
Host: kuma-cp.target.example:5681
Accept: application/json
Connection: close

典型响应示例

{
  "total": 3,
  "kind": "SidecarDataplane",
  "items": [
    {
      "type": "inbound",
      "name": "127.0.0.1:10010:10011",
      "matchedPolicies": {
        "TrafficPermission": [
          {
            "type": "TrafficPermission",
            "mesh": "default",
            "name": "allow-all-default"
          }
        ],
        "MeshTimeout": [
          {
            "type": "MeshTimeout",
            "mesh": "default",
            "name": "timeout-all-default"
          }
        ]
      }
    }
  ]
}

这一步能帮助判断:

  • 某个 dataplane 实际被哪些策略控制
  • 是否存在宽松默认放行
  • 具体的策略名是否暴露业务意图

3.2 GET /meshes/{mesh}/dataplanes/{name}/rules

如果要继续往“策略如何合并后作用于代理”这一层走,rulespolicies 更接近最终生效图。

请求示例

GET /meshes/default/dataplanes/backend-1/rules HTTP/1.1
Host: kuma-cp.target.example:5681
Accept: application/json
Connection: close

典型响应示例

{
  "items": [
    {
      "inbound": {
        "service": "backend"
      },
      "rules": [
        {
          "type": "MeshTrafficPermission",
          "origin": "allow-all-default"
        },
        {
          "type": "MeshHTTPRoute",
          "origin": "backend-route-default"
        }
      ]
    }
  ]
}

这一步的意义在于:

  • 比单纯对象枚举更接近真实流量控制结果
  • 便于识别默认路由、默认放行与灰度规则

3.3 GET /meshes/{mesh}/dataplanes/{name}/xds

这是 Kuma 控制面最值钱的接口之一,因为它把某个 dataplane 的 Envoy xDS 配置直接送出来。

请求示例

GET /meshes/default/dataplanes/backend-1/xds HTTP/1.1
Host: kuma-cp.target.example:5681
Accept: application/json
Connection: close

典型响应示例

{
  "configs": [
    {
      "@type": "type.googleapis.com/envoy.admin.v3.ListenersConfigDump"
    },
    {
      "@type": "type.googleapis.com/envoy.admin.v3.RoutesConfigDump"
    },
    {
      "@type": "type.googleapis.com/envoy.admin.v3.ClustersConfigDump"
    }
  ]
}

如果继续细读,通常可恢复:

  • listener 端口
  • route prefix
  • upstream cluster 名称
  • TLS / secret 使用关系
  • mesh gateway 或 sidecar 的真实入口图

这一步会把服务网格从“控制面对象模型”直接推进到“Envoy 实际生效配置”。

3.4 Inspect API 与 GUI 的联动价值

官方 Inspect API 文档和 2.1 版本发布说明都明确提到:

  • 可以查看特定 dataplane 匹配到的 policy
  • 可以查看受某一 policy 影响的 dataplane
  • 可以查看每个 dataplane 的 Envoy config dump
  • GUI 也增强了对 config dump 与搜索的支持

这说明:

  • GUI 可视化只是入口
  • 真正高价值的是背后的 Inspect / HTTP API 对象关系

4. 令牌、Secrets 与控制面配置面的风险判断

4.1 POST /tokens/dataplane

官方 HTTP API 列表明确给出了 dataplane token 接口。这类接口一旦被未授权主体调用,后果通常不只是看信息,而是能新增受信 dataplane 接入能力。

请求示例

POST /tokens/dataplane HTTP/1.1
Host: kuma-cp.target.example:5681
Content-Type: application/json
Connection: close

{
  "name": "shadow-dp",
  "mesh": "default",
  "tags": {
    "kuma.io/service": "backend-shadow"
  }
}

典型响应示例

{
  "token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."
}

这类接口的危险点在于:

  • 可签发新 dataplane bootstrap token
  • 为后续伪造 sidecar/gateway 身份提供入口
  • 在 Universal 场景尤其危险

4.2 /secrets/global-secrets

Kuma 文档说明:

  • Secret 资源用于存储敏感数据
  • 它被策略在运行时使用
  • mTLS 自动生成证书也会依赖 secret 资源

但需要准确表述的是:

  • Secret 资源是否可枚举、能看到哪些元数据、是否能直接读取值,取决于部署与认证边界
  • 不应简单写成“直接能把所有证书私钥拿出来”

在打点视角里,这类接口至少可能暴露:

  • secret 资源名字
  • mesh 归属
  • 证书/密钥后端的存在性

这本身已足够帮助攻击者定位高价值对象。

4.3 /config 暴露的现实价值

即使 /config 不回显数据库密码,它依然可以暴露:

  • store.type 是 postgres 还是 memory
  • API 是否启用明文 HTTP
  • HTTPS 是否要求客户端证书
  • inter-cp server / zone 同步相关配置是否开启

结合官方配置文档给出的环境变量与配置项,攻击者可以进一步判断:

  • 是否存在客户端证书缺失
  • 多区间通信端口与 TLS 约束是否收紧
  • 明文流量是否可能携带 token 或配置

5. 典型高风险场景

5.1 明文 5681 控制面暴露

这是最典型也最现实的错误配置:

  1. 5681 暴露在业务网段或公网
  2. GUI 与 API 同时可达
  3. 攻击者枚举 mesh/dataplane/policy/xds

请求示例

GET /dataplanes+insights HTTP/1.1
Host: kuma-cp.target.example:5681
Accept: application/json
Connection: close

风险结果

  • dataplane 地址、端口、服务标签、证书状态全部泄露
  • 后续可直接对 gateway dataplane 和高价值服务做定向评估

5.2 Universal 模式下的 API 写入面

官方文档明确说,在 Universal 模式下 HTTP API 可修改状态。也就是说,若控制面 API 未做有效认证边界,攻击面就从“读取网格图”直接升级为“写入资源对象”。

这类环境中最危险的对象通常包括:

  • Mesh
  • Dataplane
  • Policy
  • Token
  • ZoneIngress

5.3 GUI 暴露配合 Inspect API

如果攻击者能访问 GUI,再结合 HTTP API:

  • GUI 用于快速发现高价值 dataplane / gateway
  • Inspect API 用于结构化导出命中策略与 Envoy config

这条链会显著降低黑盒猜测成本。

5.4 控制面 API 与 Envoy admin 的组合

Kuma dataplane 文档说明:

  • kuma-dp 会启动 Envoy
  • Envoy admin 通常监听在 loopback 9901

这意味着如果攻击者既拿到控制面 API,又在集群内部具备端口转发或本地 SSRF 能力,那么:

  1. 从控制面 API 恢复 dataplane 列表
  2. 从具体节点/Pod 命中 loopback admin
  3. 形成控制面+数据面联合打点

这是服务网格环境里很常见的升级路径。


6. 蓝队日志、检测与处置

6.1 应优先收集哪些日志

排查 Kuma 控制面打点与利用时,优先级最高的是:

  • kuma-cp API 访问日志
  • GUI 访问日志
  • Kubernetes Audit Log
  • CRD / policy 变更记录
  • dataplane token 签发审计
  • zone / inter-cp 同步日志

6.2 重点检索的路径

建议优先关注:

  • /config
  • /versions
  • /meshes
  • /mesh-insights
  • /dataplanes
  • /dataplanes+insights
  • /meshes/{mesh}/dataplanes/{name}/policies
  • /meshes/{mesh}/dataplanes/{name}/rules
  • /meshes/{mesh}/dataplanes/{name}/xds
  • /tokens/dataplane
  • /zones
  • /zone-ingresses
  • /gui

6.3 典型日志示例

2026-06-16T12:02:17Z INFO api request method=GET path=/dataplanes+insights status=200 client=198.51.100.42
2026-06-16T12:02:22Z INFO api request method=GET path=/meshes/default/dataplanes/backend-1/xds status=200 client=198.51.100.42
2026-06-16T12:02:31Z WARN api request method=POST path=/tokens/dataplane status=201 client=198.51.100.42

6.4 异常行为关联

如果出现以下行为组合,应优先升级为高危控制面事件:

  1. 先访问 /meshes/mesh-insights
  2. 再访问 /dataplanes+insights
  3. 然后访问 /policies/rules/xds
  4. 最后出现 POST /tokens/dataplane

这通常说明攻击者已经从网格拓扑枚举进入到代理接入或控制阶段。

6.5 应急排查重点

发现异常后,优先核对:

  1. 5681 是否暴露在不该出现的网段
  2. GUI 是否开启且未做足够认证
  3. 是否允许明文 HTTP
  4. 是否启用了 HTTPS 客户端证书认证
  5. 是否存在非预期的 dataplane token 签发
  6. 是否有新 dataplane / gateway 在短时间内注册

7. 加固建议

7.1 优先关闭明文控制面

最优先动作包括:

  • 不暴露 5681 到公网或低信任网段
  • 优先使用 5682
  • 为 HTTPS API 启用客户端证书认证

7.2 区分 KubernetesUniversal 模式风险

Kubernetes 模式下:

  • 更多写操作应通过 CRD
  • 但读取面仍然高度敏感

Universal 模式下:

  • HTTP API 的写入能力更强
  • 应把它当作真正的管理面高危入口

7.3 保护 GUI 与 Inspect API

不要把 GUI 当成“只是个看板”:

  • GUI 与 API 同端口
  • GUI 看到的对象往往都能结构化导出
  • Inspect / xDS 接口能直接白盒化 dataplane 配置

7.4 审计 token 与策略写入

至少应为以下动作加告警:

  • dataplane token 签发
  • mesh/policy 变更
  • xDS/config dump 高频导出
  • zone ingress / egress 变更

8. 打点评估清单

遇到 Kuma 控制面目标时,建议至少留档:

  1. 5681/5682 是否可达
  2. /gui 是否公开
  3. /config 是否暴露控制面有效配置
  4. /meshes/mesh-insights 是否暴露网格规模
  5. /dataplanes+insights 是否暴露服务标签、地址、证书时间
  6. /policies/rules 是否可读出实际命中结果
  7. /xds 是否可导出 dataplane 的 Envoy 配置
  8. /tokens/dataplane 是否存在写入或签发能力
  9. 环境是 Kubernetes 还是 Universal

9. 总结

Kuma 控制面的高价值,在于它把服务网格最核心的三层视图同时暴露了出来:

  • 资源视图:MeshDataplaneZone
  • 策略视图:PoliciesRules
  • 运行视图:xDSGUIInsights

再叠加 token 签发与多区对象接口,攻击者就可以从一次简单打点迅速升级到:

  • 网格拓扑恢复
  • Sidecar / gateway 精准画像
  • 策略命中与路由规则白盒分析
  • dataplane 接入能力评估

因此,在 04 渗透攻击 的语境里,Kuma 不应被视为单纯“服务网格面板”,而应视为标准的服务网格控制面管理接口目标。只要 HTTP APIGUI 落入低信任网络,黑盒渗透就会迅速转化为高价值的控制面配置利用。