环境搭建:

sudo docker pull duonghuuphuc/tomcat-8.5.32

sudo docker run -d -it -p 8080:8080 -p 8009:8009   --name ghostcat duonghuuphuc/tomcat-8.5.32

tomcat调试:

export JAVA_OPTS='-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005'

漏洞复现:

任意文件读取

任意文件包含

请求存在的jsp使其包含指定的文件中的jsp代码

实际上根据不同的匹配将由不同的serverlet进行处理

漏洞分析:

这里根据网上的exp来分析一下:

首先去去github看看是啥时候commit修复的该漏洞

可以确定2月5号已经修复该问题了,点进去看看修复点

可以看到这里把原先的监听外网,改为监听本地地址了,根据网上的资料可以看到实际上攻击过程主要控制以下三个属性,发送的消息如果包含着三个值,那么serverlet将根据三个值属性进行request请求的改造,而这三个值都可以直接加到ajp数据包中

从修改的文件中大致可以推断到处理ajp消息的文件,进去看看

其中AjpProcessor.java中定义了处理jsp数据包中attributes中的逻辑,可以看到在处理attr属性时else了一条set,那么如果n,v可控就可以注入属性了

实际上上面的设置属性是在prepareRequest函数中,处理完后将调用getAdapter继续之后的请求过程,即匹配serverlet了

文件包含

org/apache/jasper/servlet/JspServlet.java

实际上这里文件包含只需要用到这两个属性即可,当然前提是匹配到存在的jsp文件,例如请求index.jsp

文件读取:

直接双shift找到defaultserverlet,在doget方法中通过getRelaticePath拿到请求的路径

这里将通过设置的属性来获取最重要读取的文件属性,这里需要同时设置这三个属性才可以,因为此时请求路径不存在,所以就从属性中取路径了,只要求该属性不为null即可,并重新定义要读取的文件

之后经过处理将这两个属性拼接并返回,即serverlet_path/path_info,之后就读取文件资源

看一下git上的ajp的一个demo

这里调用完end以后就构造完数据包,接下来就发包了,所以要改一下end函数

这里结束字节是0XFF,所以要在该字节前面插入

抓包可以看到ajp协议的通信过程

可以清楚看到所加入的属性值,都是明文,加入位置也可以清楚看到

总结:

任意文件读取和任意文件包含范围:

webapps目录下的文件,默认的exp只能读取webapps/ROOT下的文件

任意包含只需要:

1.请求存在的jsp

2.pathinfo和serverlet_path两个属性执行包含的文件

任意文件读取:

1.请求不存在的文件

2.request_uri属性必须存在,值可为任意

3.pathinfo和serverlet_path组合对应文件路径

修复:

1.若不需要使用Tomcat AJP协议,可直接关闭AJP Connector,或将其监听地址改为仅监听本机localhost。

监听本地:

    <Connector protocol="AJP/1.3"
address="::1"
port=""
redirectPort="" />

此时重启tomcat即测试不成功

2.增加ajp connector密钥认证方式

tomcat version7 version9

<Connector port="" protocol="AJP/1.3" redirectPort="" address="YOUR_TOMCAT_IP_ADDRESS" secret="YOUR_TOMCAT_AJP_SECRET"/>

tomcat version8

tips:

影响范围

Apache Software Foundation Tomcat 6.*

Apache Software Foundation Tomcat 7.0.0 - 7.0.99

Apache Software Foundation Tomcat 8.0.0 - 8.5.50

Apache Software Foundation Tomcat 9.0.0 - 9.0.30

poc地址:

https://github.com/0nise/CVE-2020-1938

参考:

https://blog.csdn.net/yiqiushi4748/article/details/104428847

https://mp.weixin.qq.com/s?__biz=MzI4NjE2NjgxMQ==&mid=2650241245&idx=1&sn=2ca66d99fafb82b17b9023e65a143d63&chksm=f3e2c2a9c4954bbfa58ed15d4647eab743d79375eb51853ab2aecacf5f5c85b862f91cc0d685&mpshare=1&scene=23&srcid=&sharer_sharetime=1582366241817&sharer_shareid=ae6683d6c0e7df9a0b7c15e7cacf6b3c#rd

https://blog.csdn.net/wangchengsi/article/details/2973012 coyote框架

https://youmeek.gitbooks.io/intellij-idea-tutorial/content/remote-debugging.html idea之旅

https://xz.aliyun.com/t/7325 先知讲tomcat的,还行

Apache Tomcat Ajp-CVE-2020-1938漏洞复现的更多相关文章

  1. Apache Solr Velocity模板注入RCE漏洞复现

    Apache Solr Velocity模板注入RCE漏洞复现 一.Apache Solr介绍 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于web-service的API接口,用户可以通 ...

  2. Apache Druid 远程代码执行 CVE-2021-25646 漏洞复现

    Apache Druid 远程代码执行 CVE-2021-25646 漏洞复现 前言 Apache Druid 是用Java编写的面向列的开源分布式数据存储,旨在快速获取大量事件数据,并在数据之上提供 ...

  3. Apache Tomcat RCE(CVE-2017-12615 )漏洞案例分析

    首先搭建tomcat环境: 下载当前项目的版本的tomcat

  4. Tomcat CVE-2017-12615 远程上传漏洞复现

    漏洞名称:CVE-2017-12615-远程代码执行漏洞 CVE-2017-12615:远程代码执行漏洞 当 Tomcat运行在Windows操作系统时,且启用了HTTP PUT请求方法(例如,将 r ...

  5. apache tomcat 目录session应用信息漏洞

    Tomcat 是一款开源的 Web 应用服务器软件.Tomcat 属于轻量级应用服务器,在中小型系统和并发访问用户不多的场合下被普遍使用,是开发和调试 JSP 程序的首选. 漏洞描述 apache T ...

  6. Apache+tomcat ajp模式转发域名

    本示例使用Apache24 和 tomcat7.0.62 本机IP:192.168.10.38 要实现的效果 访问来源 192.168.10.38      ---->apache ----&g ...

  7. Apache Struts2 S2-013远程代码执行漏洞复现

    墨者学院开的靶场 进入环境 Struts2-013好家伙,框架直接写脸上,怕人看不出来= = 看了看源码什么的啥都没发现= = 去了解了一下这个漏洞,爬回来继续做 漏洞原理 struts2的标签中&l ...

  8. Tomcat AJP 文件包含漏洞复现(CVE-2020-1938)

    漏洞原理 Tomcat配置了两个Connecto,它们分别是HTTP和AJP. HTTP默认端口为8080,处理http请求:AJP默认端口8009,用于处理 AJP 协议的请求. AJP比http更 ...

  9. CVE-2020-1938:Apache-Tomcat-Ajp漏洞-复现

    0x00 漏洞简介 Apache与Tomcat都是Apache开源组织开发的用于处理HTTP服务的项目,两者都是免费的,都可以做为独立的Web服务器运行. Apache Tomcat服务器存在文件包含 ...

  10. 8.Struts2-057漏洞复现

    漏洞信息: 定义XML配置时如果namespace值未设置且上层动作配置(Action Configuration)中未设置或用通配符namespace时可能会导致远程代码执行. url标签未设置va ...

随机推荐

  1. MapGIS注记文字无损转入ArcGIS软件

    在GIS软件中,注释是一种十分特殊的对象,虽然各类软件都支持注释,但它却不属于GIS的基本对象.因此通常的格式转换软件,都不对注释对象做特别的支持,我们最常见的Shape文件格式就只有点.线.面要素, ...

  2. 牛客网上的ST阶跃表

    给你一个长为n的序列a和一个常数k 有m次询问,每次查询一个区间[l,r]内所有数最少分成多少个连续段,使得每段的和都 <= k 如果这一次查询无解,输出"Chtholly" ...

  3. 字典树 (HDU 2072)

    lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数.下面你的任务是帮助xiaoou333解决这个问题. Input有多组数据,每组一行,每组就是 ...

  4. sender e

    sender 产生事件的对象e 事件的参数

  5. 用户输入- Unity3D游戏开发培训

    用户输入- Unity3D游戏开发培训   作者:Jesai 时间:2018-02-12 14:28:45 用户输入Input 鼠标按键: -方法:GetMouseButton(); -方法:GetM ...

  6. 【java面试】框架篇之Spring

    1.你如何理解Spring? 具体来说Spring是一个轻量级的容器,用于管理业务相关对象的.核心功能主要为:IOC,AOP,MVC. IOD:控制反转,将对象的创建过程交给容器,让容器管理对象的生命 ...

  7. leetcode 全解(python版)

    本着blabla的精神,在这里(可能会)给出leetcode的全部习题答案 --持续更新中... 1.给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整 ...

  8. typescript step by step

    如果有本 typescript的书 这个名字不错 啊 step one

  9. URL各部分详解

    就以下面这个URL为例,介绍下普通URL的各部分组成 http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&pa ...

  10. Spring注解开发系列Ⅵ --- AOP&事务

    注解开发 --- AOP AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,横向重复,纵向抽取.详细的AO ...