Tomcat 简介
Tomcat 是一个开源的轻量级 Web 应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 Java 程序的首选。
实际上 Tomcat 是 Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行 tomcat 时,它实际上作为一个与 Apache 独立的进程单独运行的。
Apache 为 HTML 页面服务,Tomcat 主要运行 JSP 页面和 Servlet。另外,Tomcat 和 IIS 等 Web 服务器一样,具有处理 HTML 页面的功能,不过 Tomcat 处理静态 HTML 的能力不如 Apache 服务器。
1、CVE-2017-12615
CVE-2017-12615 对应的漏洞为:任意文件写入,主要影响的是 Tomcat 的 7.0.0-7.0.81 这几个版本。
漏洞原理:
由于配置不当(非默认配置),将配置文件 conf/web.xml 中的 readonly 参数设置为了 false,导致可以使用 PUT 方法上传任意文件,但限制了 jsp 后缀的上传,不过对于不同平台有多种绕过方法。
通过阅读 conf/web.xml 文件,可以发现,默认 readonly 为 true,当 readonly 设置为 false 时,可以通过 PUT / DELETE 进行文件操控
漏洞复现:
这里使用 vuluhub 靶场的 docker 进行漏洞复现,关于环境搭建可以看官网的手册:链接
vuluhub 靶场下载好后,首先进入 CVE-2017-12615 的 docker 环境
docker-compose up -d //靶场的编译和运行
docker ps //查看docker环境是否启动成功
首先进入 docker 查看一下 web.xml 的配置参数
docker exec -it ce968a90f837 /bin/bash
cat conf/web.xml | grep readonly
可以看到这里 readonly 设置为 false,所以存在漏洞。
访问8080端口,可以看到是 Tomcat 8.5.19 版本。
BP抓包,发现这里是 GET 方法
这里首先测试一下,改为 PUT 方法写入一个 test.txt
返回201,应该已经上传成功了。
进入 docker 查看一下,写入成功了。
cd /usr/local/tomcat/webapps/ROOT
前面说过,使用PUT方法上传任意文件,但限制了 jsp 后缀的上传。测试一下,上传一个冰蝎的jsp上去,发现返回的是404,应该是被拦截了
这里就需要进行绕过,有三种绕过方法,分为 windows 和 linux 环境下。
1、Windows下不允许文件以空格结尾
PUT /shell.jsp%20 HTTP/1.1
上传到 Windows 会被自动去掉末尾空格
2、Windows NTFS 流
PUT /shell.jsp::$DATA HTTP/1.1
由于 Windows 的特性,会忽略::$data
后缀,并将文件新建。
3、"/"
在文件名中是非法的,也会被去除(Linux/Windows)
PUT /shell.jsp / HTTP/1.1
首先使用%20
绕过。我们知道%20
对应的是空格,在 windows 中,若 jsp 文件后面添加%20
即可达到自动抹去空格的效果。
返回201,应该上传成功了,进入docker查看一下,确认传上去了。
但是注意,这是在 window 下才能使用冰蝎等工具连接,Linux虽然可以上传绕过,但是连接不了!文件名其实也发生了改变。
第二种方法就是使用 Windows NTFS 流,在 jsp后面添加::$DATA
,Windows下会自动去掉::$DATA
。
看到返回201,上传成功。
但是和上面一样也是 Windows 下才能连接的。
第三种方法为在 jsp 后缀后面使用"/"
,因为"/"
在文件名中是非法的,在 windows 和 linux 中都会自动去除。根据这个特性,上传shell3.jsp/
,返回201。
上传成功,使用冰蝎连接。
成功拿到webshell!
2、弱口令&war远程部署
漏洞原理:
在 Tomcat8 环境下默认进入后台的密码为 tomcat/tomcat,未修改造成未授权即可进入后台。
漏洞复现:
进入 Tomcat8 的 docker 环境,并启动。
访问后台管理地址,使用 tomcat/tomcat 进入后台
http://192.168.50.131:8080/manager/html
进入到后台页面
看到这里有一个上传 war 包的地方,很多 Java 的中间件都可以用 war 远程部署来拿 shell,tomcat也不例外。
首先将我们的 冰蝎马 shell.jsp 打包成 test.war 。
步骤:首先新建一个文件夹,里面只有 shell.jsp 文件,输入命令:
jar -cvf test.war .
test.war 就是打包后生成的文件名称。
后面的.
是把当前目录下所有文件打包。
上传我们制作的 war 包
test.war 应该已经部署成功,访问下面url测试一下
http://192.168.50.131:8080/test/shell.jsp
没有报错404那么应该已经上传成功。使用冰蝎连接成功得到 shell
这里还可以用 msf 里面的 exploit/multi/http/tomcat_mgr_upload
模块
运行即可得到一个 meterpreter
3、manager 暴力破解
漏洞原理:
后台密码用 base64 编码传输,抓包解密即可得到后台密码,也可以进行爆破。
漏洞复现:
还是用上面的环境,访问
http://192.168.50.131:8080/manager/html
进行抓包,在没有输入帐号密码的时候是没有什么数据的。
把这个包放过去,会请求输入用户名和密码,再进行抓包
就可以得到 Authorization 这个字段,这个字段有一个 Basic,就是base64加密的意思。
base64解密得到账号密码 tomcat:tomcat
那么根据上面的情况,猜想能不能对 manager 进行暴力破解呢?答案是可以的!
步骤如下:
再次访问 manager 页面
192.168.50.131:8080/manager/html/
发送至 Intruder 模块,添加 Authorization 字段
Authorization:Basic
设置 payload 类型,选择自定义迭代器。
这里需要添加3个参数,对应:用户名:密码
参数1,用户(这里做个演示,字典很小):
参数2,冒号:
参数3,密码:
因为是 base64 编码,需要对 paylodad 进行编码处理。
需要去掉自带的编码,不去会失败!
OK,开始爆破
爆破成功, base64 解码即可得到用户名和密码。
参考文章:
最全的Tomcat漏洞复现笔记
Burp暴力破解tomcat后台
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 2058751973@qq.com