安全声明:本文所述技术内容仅供安全研究与授权测试使用,旨在提升安全防御意识。任何未经授权的访问或攻击行为均属违法,使用者需自行承担全部法律责任。
在渗透测试或红队演练过程中,我们有时会获取到Kubernetes(K8s)集群的配置文件(kubeconfig)。这份文件是通往集群控制权的钥匙,通过它,我们可以使用kubectl命令行工具与集群进行交互,执行部署应用、管理资源、查看状态等一系列操作。
要成功使用kubectl,我们首先需要在本地配置好连接环境。下面,我们将分别介绍在Windows和Linux系统上配置及连接K8s集群的完整流程,并探讨如何利用已控制的节点进行横向移动。
K8s集群配置文件解析
我们获取到的集群配置文件通常是一个经过Base64编码的字符串,解码后即可得到标准的YAML格式kubeconfig文件。

关键点提示:在配置中,server字段的地址通常是内网IP。若想直接利用,我们需要寻找一份server地址为公网的配置文件。更常见的攻击路径是:先控制一个公网可达的集群,在该集群内部寻找可以访问目标内网的容器,再通过此容器作为跳板,进一步渗透内网集群。后续的横向移动思路正基于此。
配置连接环境并实施连接
Windows 环境配置
1. 下载Windows版kubectl
访问Kubernetes官方发布页面,下载对应版本的kubectl.exe。例如:
https://dl.k8s.io/release/v1.21.14/bin/windows/amd64/kubectl.exe
2. 组织本地目录结构
在本地创建一个文件夹(例如kubernetes),并在其中新建bin和config两个子文件夹。
- 将下载的
kubectl.exe放入bin文件夹。
- 将获取到的k8s配置文件保存为
.conf格式的文件(例如test.conf),放入config文件夹。

3. 配置系统环境变量
需要配置以下三个环境变量:
-
KUBERNETES_HOME:指向你的kubernetes主目录。
- 变量名:
KUBERNETES_HOME
- 变量值:
C:\Users\Administrator\Downloads\kubernetes(请根据实际路径修改)

-
KUBECONFIG:指向你的k8s配置文件。
- 变量名:
KUBECONFIG
- 变量值:
C:\Users\Administrator\Downloads\kubernetes\config\test.conf(请根据实际路径和文件名修改)

-
PATH:将kubectl所在目录添加到系统路径。
- 编辑
Path变量,新增一项:%KUBERNETES_HOME%\bin

4. 验证配置
打开新的命令提示符(CMD),执行以下命令测试是否配置成功:
kubectl -h
若出现kubectl的帮助信息,则说明工具环境配置成功。此时,你已经可以远程控制目标K8s集群了。

5. 开始控制集群
配置完成后,我们就可以对集群执行各种操作。
(1) 查看所有Pod信息
首先,获取所有命名空间下的Pod列表及其详细信息,这有助于我们了解集群概况并选择目标。
kubectl get pods --all-namespaces -o wide

重点关注NAMESPACE(命名空间)、NAME(Pod名称)和IP字段。后续对容器的操作将依赖于前两者。
(2) 探测容器内可用的Shell
进入容器前,最好先查看其/bin目录下有哪些可用的Shell解释器。
kubectl exec -it <容器名> -n <命名空间> -- ls /bin
例如:
kubectl exec -it apixxxxxxxx8w -n cxxxxxxxxxt -- ls /bin

(3) 获取容器交互式Shell
根据上一步的探测结果,尝试获取容器的交互式Shell。常见的是/bin/bash或/bin/sh。
kubectl exec -it <容器名> -n <命名空间> -- /bin/bash
# 或
kubectl exec -it <容器名> -n <命名空间> -- /bin/sh
例如:
kubectl exec -it apixxxxxxxx8w -n cxxxxxxxxxt -- /bin/bash
kubectl exec -it apixxxxxxxx8w -n cxxxxxxxxxt -- /bin/sh
注意:如果容器内没有对应的Shell,命令会报错。例如,尝试使用/bin/bash进入一个只有/bin/sh的容器时会失败。此时应换用存在的Shell。


Linux环境配置与横向移动
K8s集群的横向移动思路很直接:先控制一个公网可达的集群,然后在集群内部寻找能连通目标内网的容器。此时,之前关注的server内网IP就派上用场了。进入该容器后,重复上述步骤,将内网集群的kubeconfig配置部署上去,即可实现控制。由于控制的容器通常是Linux系统,我们需要配置Linux版的kubectl。
1. 进入容器并下载Linux版kubectl
首先,通过上一节的方法获取到一个容器的Shell。然后,在容器内下载kubectl二进制文件。
# 下载地址示例
curl -O https://dl.k8s.io/release/v1.21.14/bin/linux/amd64/kubectl
# 或使用 wget
wget https://dl.k8s.io/release/v1.21.14/bin/linux/amd64/kubectl
2. 创建目录结构
与Windows类似,创建统一的目录结构来管理kubectl和配置文件。
mkdir /opt/kubernetes
mkdir /opt/kubernetes/bin
mkdir /opt/kubernetes/config

- 将下载的
kubectl文件移动到/opt/kubernetes/bin/目录。
- 将目标内网集群的kubeconfig文件(建议以易于识别的内网地址命名)放入
/opt/kubernetes/config/目录。
- 重要:记得为
kubectl文件添加执行权限:chmod +x /opt/kubernetes/bin/kubectl。
3. 配置环境变量
编辑/etc/profile文件,将相关路径加入环境变量。
vi /etc/profile
在文件末尾添加以下内容(请根据你的实际配置文件名称修改KUBECONFIG的值):
KUBERNETES_HOME=/opt/kubernetes
KUBECONFIG=$KUBERNETES_HOME/config/10.247.xxx.xxx.conf # .conf文件是你自己命名的文件。
PATH=$PATH:$KUBERNETES_HOME/bin
export PATH KUBERNETES_HOME KUBECONFIG
保存退出后,使配置立即生效:
source /etc/profile

4. 控制新集群
配置完成后,即可使用与Windows下完全相同的命令来控制新的内网集群。
# 查看新集群的所有Pod
kubectl get pods --all-namespaces -o wide
# 获取新集群中容器的Shell
kubectl exec -it <新容器名> -n <新命名空间> -- /bin/bash
# 或
kubectl exec -it <新容器名> -n <新命名空间> -- /bin/sh
至此,我们已经成功实现了一次横向移动,能够控制至少两个集群(一个公网,一个内网)。
控制同网段的其他集群
在已控制的跳板节点上,如果想切换控制同一网段内的另一个集群,方法非常简单:
- 将新集群的kubeconfig文件保存为新的
.conf文件,放入/opt/kubernetes/config/目录。
- 更新
KUBECONFIG环境变量的值,指向新的配置文件。
- 在Linux上,重新执行
source /etc/profile;在Windows上,则需要重新打开一个CMD窗口。
操作提示:通常,使用kubectl进行常规的集群连接和容器操作,不会触发安全告警机制。但进行渗透测试活动时,务必在授权范围内进行,并在退出前妥善清理操作痕迹。
Kubernetes集群的攻防是云原生安全中的重要议题,深入理解其配置与连接机制,无论对于攻击方还是防守方都至关重要。如果你对这类安全技术话题感兴趣,欢迎在云栈社区与我们进行更多交流。