本文记录了从一次未授权的访问到获取系统shell的渗透测试过程,文中主要阐述了攻击方法、漏洞成因以及防御思路。在进行攻防过程阶段,最重要的工作莫过于信息收集,本文不想记录对信息收集中的数据反复甄别的过程,而是想对一次重大的发现进行过程记录,通过对收集的数据进行反复的筛选发现了2375端口,相信很多在做云原生或者做容器化部署的朋友,应该对这个端口不陌生,没错这个就是docker swarm。从官方的文档可以看出swarm是用来管理docker集群的,本次获取shell权限的过程就与此有着莫大的关系。
起因
有一位运维同学在部署docker swarm的时候,在管理的docker 节点上会开放一个TCP端口2375,绑定在0.0.0.0上,相信很多有经验的运维大牛应该知道swarm是用来管理docker集群的,应该放在内网才对。但是不知道出于什么原因,他是在公网上的几台机器上安装swarm的,并且2375端口的访问策略是开放的,所以可以直接访问,那么这就造成了可以远程执行docker命令。
漏洞利用过程
当发现2375端口是开放的,所以肯定要访问一下该服务,发现是可以直接访问。
现在可以确定存在一个未授权的访问漏洞,难道渗透测试就此结束了嘛!恐怕也才是开始,既然这个端口可以远程执行docker指令所以肯定要好好利用一番,首先要看一下所有镜像。
已经获取到了镜像ID,这个在后续的过程中会有利用的,所以先记录一下,接着查看一下容器内部。
又是简单的收集了一波信息,现在要做的就是要获得宿主机的权限了,毕竟现在一直在容器里。首先要做的就是启动一个容器,挂载宿主机的var/spool/cron/目录,之后将反弹shell的脚本写入到/var/spool/cron/root中做一个执行计划,攻击机nc -vv -l -p Port进行监听,这个时候会得到一个反弹的shell。
通过执行命令,我们获得了宿主机的反弹shell。现在你会发现docker逃逸成功了,拿下了该服务器。
就这样,我们不仅拿下了服务器,甚至还是获得了root权限,总体来说还是获得了不错的成果。从一次未受权的访问漏洞到获取的系统shell,是对一个漏洞的深入挖掘,达到攻击的目的,其实后果造成的危害还是很大的,但其实修复这个漏洞是比较容易的。企业在信息安全建设中,如果只是修复漏洞,那会变得疲于奔命,所以对这种问题还是要构建完整的防御体系,从未授权的访问到获取到系统root权限,需要经过很长的攻击链,如果能及时的阻断攻击链,也是对漏洞攻击面的缩小。
防御思路
1.简单的方法就是对2375端口做网络访问控制,如ACL控制,或者访问规则等;
2.修改docker swarm的认证方式,使用TLS认证,Docker CLI 在发送命令到docker daemon之前,会首先发送它的证书,如果证书是由daemon信任的CA所签名的,才可以继续执行。
写在最后
在企业安全体系的建设过程中,是离不开渗透测试或者说安全攻防的,安全的生命周期链路比较长,从安全需求再到安全的持续运营阶段,其实渗透测试已经在安全生命周期的末端了,发现漏洞的情况已经是产品的末期。其实还是要在产品的初期,引入安全自动化平台对产品的安全质量进行阈门控制。并且建设整体的安全架构,及时的阻断攻击链,把漏洞对环境的影响面降到最低。