从tomcat上传漏洞到docker逃逸(靶场)
本文最后更新于:2023-02-28 21:51
前言
参考链接:
本次测试是在实验环境,不是真实的生产环境。用实验环境的原因是为了学习,最近复现了一些docker逃逸的漏洞,然后想通过配合一些命令执行的漏洞,最终达到逃逸到宿主机的效果。
本来想使用 tomcat CVE-2017-12615 PUT 上传漏洞和逃逸漏洞 CVE-2020-15257。但是有个坑点,15257这个洞启动容器时需要使用参数--net=host
命令,想通过修改docker-compose.yml
文件增加这个参数,但是使用这个参数后就不能使用-p
进行端口绑定了,修改之后报错,是因为对 docker-compose 的配置文件不了解吧。
应用层的漏洞,我选用的是 tomcat CVE-2017-12615 PUT 上传漏洞;搭建环境使用的是 vulhub,docker 逃逸漏洞选用的是 CVE-2019-5736。
实验环境:
- Ubuntu 16.04,IP:192.168.221.163
- docker版本 18.03.1-ce
环境搭建
-
下载 vulhub 中的
tomcat/CVE-2017-12615
文件夹。 -
安装 docker-compose,首先安装pip,通过
curl https://bootstrap.pypa.io/pip/3.5/get-pip.py -o get-pip.py
下载 pip 安装脚本,使用 root 权限,运行python3 get-pip.py
即可自动安装pip。 -
pip 安装完成后,安装构建工具,因为一些库的使用依赖于这些构建工具
apt-get install python3-dev libssl-dev libffi-dev build-essential
-
构建工具完成后,再使用 root 权限运行 pip 安装
docker-compose
:pip install docker-compose
。
docker-compose 环境安装完成之后,再安装符合漏洞版本的docker环境。
1 |
|
docker 安装完成之后,进入到CVE-2017-12615
文件夹中,使用docker-compose up -d
命令启用容器。
通过tomcat获取容器权限
容器启用后,访问http://your-ip:8080
端口,即可看到 tomcat 展示页面,使用 burp 获取请求报文。通过cve-2017-12615 将冰蝎的jsp
木马上传到容器中,如果响应为201
,表示创建成功,创建后的文件在容器/usr/local/tomcat/webapps/ROOT
目录下。
1 |
|
上传完成后,使用冰蝎进行连接,密码:rebeyond
。
通过docker漏洞逃逸到主机
判断服务器是否在docker 环境中。常用的方法有三种:
- 是否存在
.dockerenv
文件(可能不存在):ls -alh /.dockerenv
- 查看系统进程
cgroup
信息中是否存在docker
字符串:cat /proc/1/cgroup
- 检测虚拟化环境(可能不存在):
systemd-detect-virt -c
确定当前应用服务处于容器中后,按道理来讲应该进行信息收集
,但因为是实验环境,这个案例就先不这样做了,如何做后面补充。所以我们假设我们已经知道当前docker 版本存在CVE-2019-5736
这个漏洞,下载POC:https://github.com/Frichetten/CVE-2019-5736-PoC,将执行的 payload 改为反弹 shell 的payload,使用golang
进行编译GO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
,编译完成后,将其上传到 docker 容器中。
在接收shell的主机上监听端口,在容器中运行 exp 文件后,需要再次进入容器才能触发该漏洞,之后获得容器宿主机反弹的shell:
漏洞原理参考:https://ble55ing.github.io/2020/03/19/docker-20195736/,只要调用 docker 就会反弹shell。
该漏洞利用完成之后,环境被污染了,如果要测试其他内容需要重置环境,重置环境的方法是卸载docker并重装😢。
1 |
|
docker内部信息收集
前面留了个坑,就是如何收集容器内部的信息。这里推荐一个工具:CDK。这个文档已经说的很详细了,直接看文档就可以。