Apache Tomcat Ajp CVE-2020-1938漏洞复现

环境搭建:

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

Apache Tomcat Ajp CVE-2020-1938漏洞复现_第1张图片

 

Apache Tomcat Ajp CVE-2020-1938漏洞复现_第2张图片

 

tomcat调试:

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

漏洞复现:

任意文件读取

任意文件包含

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

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

漏洞分析:

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

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

Apache Tomcat Ajp CVE-2020-1938漏洞复现_第3张图片

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

 Apache Tomcat Ajp CVE-2020-1938漏洞复现_第4张图片

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

Apache Tomcat Ajp CVE-2020-1938漏洞复现_第5张图片

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

Apache Tomcat Ajp CVE-2020-1938漏洞复现_第6张图片

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

Apache Tomcat Ajp CVE-2020-1938漏洞复现_第7张图片

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

Apache Tomcat Ajp CVE-2020-1938漏洞复现_第8张图片

文件包含

org/apache/jasper/servlet/JspServlet.java

Apache Tomcat Ajp CVE-2020-1938漏洞复现_第9张图片

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

文件读取:

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

Apache Tomcat Ajp CVE-2020-1938漏洞复现_第10张图片

 Apache Tomcat Ajp CVE-2020-1938漏洞复现_第11张图片

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

 

 Apache Tomcat Ajp CVE-2020-1938漏洞复现_第12张图片

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

看一下git上的ajp的一个demo

Apache Tomcat Ajp CVE-2020-1938漏洞复现_第13张图片

 

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

Apache Tomcat Ajp CVE-2020-1938漏洞复现_第14张图片

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

Apache Tomcat Ajp CVE-2020-1938漏洞复现_第15张图片

 

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

Apache Tomcat Ajp CVE-2020-1938漏洞复现_第16张图片

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

 

总结:

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

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

任意包含只需要:

1.请求存在的jsp

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

任意文件读取:

1.请求不存在的文件

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

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

 

修复:

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

Apache Tomcat Ajp CVE-2020-1938漏洞复现_第17张图片

 监听本地:

    "AJP/1.3"
               address="::1"
               port="8009" 
               redirectPort="8443" />

此时重启tomcat即测试不成功

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

tomcat version7 version9

"8009" protocol="AJP/1.3" redirectPort="8443" 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漏洞复现)