安全矩阵

 找回密码
 立即注册
搜索
查看: 2510|回复: 0

tomcat漏洞CVE-2017-12615原理与复现

[复制链接]

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
发表于 2021-9-27 21:06:27 | 显示全部楼层 |阅读模式
原文链接:tomcat漏洞CVE-2017-12615原理与复现


CVE-2017-12615对应的漏洞为任意文件写入,主要影响的是Tomcat的7.0.0-7.0.81这几个版本
漏洞原理

由于配置不当(非默认配置),将配置文件conf/web.xml中的readonly设置为了 false,导致可以使用PUT方法上传任意文件,但限制了jsp后缀的上传
根据描述,在 Windows 服务器下,将 readonly 参数设置为 false 时,即可通过 PUT 方式创建一个 JSP 文件,并可以执行任意代码
通过阅读 conf/web.xml 文件,可以发现,默认 readonly 为 true,当 readonly 设置为 false 时,可以通过 PUT / DELETE 进行文件操控

漏洞复现

这里使用vuluhub的docker进行漏洞复现,这里就不详细介绍环境搭建了
首先进入CVE-2017-12615的docker环境
sudo docker-compose up -ddocker ps   //查看docker环境是否启动成功

这里首先进入docker里查看一下web.xml的代码,可以看到这里readonly设置为false,所以存在漏洞
sudo docker exec -ti ec bash    //进入docker容器cat conf/web.xml | grep readonly


访问下8080端口,对应的是Tomcat 8.5.19

在8080端口进行抓包,这里发现是一个GET方法

这里首先测试一下,改为PUT方法写入一个test.txt,这里看到返回201,应该已经上传成功了
PUT /test.txt HTTP/1.1testpoc

这里进入docker查看一下已经写入成功了
cd /usr/local/tomcat/webapps/ROOTls

之前说过,使用PUT方法上传任意文件,但限制了jsp后缀的上传,这里首先使用PUT方法直接上传一个冰蝎的jsp上去,发现返回的是404,应该是被拦截了

这里就需要进行绕过,这里绕过有三种方法
  1. 1.Windows下不允许文件以空格结尾
  2. 以PUT /a001.jsp%20 HTTP/1.1上传到 Windows会被自动去掉末尾空格

  3. 2.Windows NTFS流
  4. Put/a001.jsp::$DATA HTTP/1.1

  5. 3. /在文件名中是非法的,也会被去除(Linux/Windows)
  6. Put/a001.jsp/http:/1.1
复制代码

首先使用%20绕过。我们知道%20对应的是空格,在windows中若文件这里在jsp后面添加%20即可达到自动抹去空格的效果。例如:"phpinfo.php "Windows会自动去掉末尾的空格变成"phpinfo.php"
这里看到返回201已经上传成功了

进入docker查看一下,确认是上传上去了

第二种方法为在jsp后缀后面使用/,因为/在文件名中是非法的,在windows和linux中都会自动去除。根据这个特性,上传/ice1.jsp/,看到返回201

进入docker查看发现已经上传成功

第三种方法就是使用Windows NTFS流,那么什么是NTFS流呢?
流文件,即NTFS交换数据流(alternate data streams,简称ADS),是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都可以存在多个数据流,就是说除了主文件流之外还可以有许多非主文件流寄宿在主文件流中。它使用资源派生来维持与文件相关的信息,虽然我们无法看到数据流文件,但是它却是真实存在于我们的系统中的。创建一个数据交换流文件的方法很简单,命令为“宿主文件:准备与宿主文件关联的数据流文件”。
这是一个全新的概念,但是在NTFS诞生之时就早已有之,我们平时也接触到了,但是并不知道是流文件在起作用,那么,比如我们下载个程序,下载完成后,运行他会提示一个对话框要不要运行他,还有一个复选框,“以后都不用提示了”。这个就是流文件起的作用,如果我们删除他的流文件,这个对话框就不会再提示了。但是,流文件,在Windows中是没有提供命令和方法去操作他,我们看不到,也无法修改,不过微软的Sysinternals工具包中的streams程序专门提供了对流文件的操作,另外ARK软件也提供了相关功能,但仅仅是让你看到这个文件的存在以及删除这个文件,一共2个功能。
那么这里我们用到NTFS文件系统的存储数据流的一个属性DATA ,就是请求 a.asp 本身的数据,如果a.asp 还包含了其他的数据流,比如 a.asp:lake2.asp,请求 a.asp:lake2.asp:DATA,则是请求a.asp中的流数据lake2.asp的流数据内容。
在jsp后面添加:DATA,看到返回201,上传成功

进入docker验证一下

这里随便连接一个jsp即可拿到webshell





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-4-19 21:48 , Processed in 0.016610 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表