网站建设、公众号开发、微网站、微商城、小程序就找牛创网络 !

7*24小时服务专线: 152-150-65-006 023-68263070 扫描二维码加我微信 在线QQ

漏洞公告团结互助,让我们共同进步!

当前位置:主页 > 技术资讯 > 网络安全 > 漏洞公告 >

我们的优势: 10年相关行业经验,专业设计师量身定制 设计师一对一服务模式,上百家客户案例! 企业保证,正规流程,正规合作 7*24小时在线服务,售后无忧

POC编写:CNVD-2020-10487/CVE-2020-1938漏洞,tomcat服务器端口8009上的ajp协议漏洞,未经授权用户可读取网站目录中任意文件。

文章来源:重庆网络安全 发布时间:2020-03-06 17:50:06 围观次数:
分享到:

摘要:POC编写:CNVD-2020-10487 CVE-2020-1938漏洞,tomcat服务器端口8009上的ajp协议漏洞,未经授权用户可读取网站目录中任意文件。

 调试分析,编写poc的过程:CNVD-2020-10487/CVE-2020-1938漏洞,tomcat服务器端口8009上的ajp协议漏洞,未经授权用户可读取网站目录中任意文件。


一.漏洞介绍


  简而言之,tomcat服务器端口8009上的ajp协议漏洞,未经授权用户可读取网站目录中任意文件。


  漏洞编号:


  CNVD-2020-10487 / CVE-2020-1938

  受影响的版本:


  ApacheTomcat 9.x <9.0.31


  ApacheTomcat 8.x <8.5.51


  ApacheTomcat 7.x <7.0.100


  ApacheTomcat 6.x


二.设置调试环境


  为了观察数据流并编写POC,我们需要设置调试环境。


  tomcat是一个开源项目,所以第一个想法是下载源代码并根据源代码进行调试。在这里下载的版本是9.0.2代码。 调试器选择了Idea。

blob.png

三.ajp协议学习


  到目前为止,不知道什么是ajp协议以及该协议的作用,既然知道tomcat漏洞是由ajp协议引起的。我们必须知道这个协议是什么。


  Apache官方有文档


  当然,乍看之下这份文件可能不容易理解,所以百度了一下。

blob.png

 可以通过两种方式访问tomcat网站。一种是通过浏览器直接输入网址。另一个是通过ajp协议访问。


  AJP协议是一种定向数据包(面向数据包)协议,它使用二进制形式而不是文本形式来提高性能。


  因此,我们需要编写一个ajp客户端程序来与tomcat服务器的端口8009进行数据交互。当然,只要我们详细了解ajp协议及其各个字段的含义,我们可以自己编写一个ajp客户端。 先去github并用关键字ajp和ajp client搜索。发现已经有其他人的ajp-client项目。

blob.png

  下载了所有三个ajp-clients。边调试边测试。最后poc完成。


  在这里,我们需要讨论ajp协议中重要的字段。

blob.png

 Forward Request包就是我们要发送给tomcat 8009端口的内容,用来触发漏洞的。该字段中最重要的字段是attributes,稍后将在调试和跟踪时找到它们。


四.调试跟踪


  通过引用,我们知道当tomcat收到ajp请求时,它将调用org.apache.coyote.ajp.AjpProcessor来处理ajp消息,并且prepareRequest获取ajp的内容以设置request对象的Attribute属性。


  现在,我们在AjpProcessor中找到prepareRequest()函数,并在该函数的开头设置一个断点,并在request.setAttribute(n,v)处设置一个断点。

blob.png

编写测试代码,如下所示(test_servlet放置在webapps目录中的servlet代码):

blob.png

 运行该程序,该程序成功中断了prepareRequest(),继续单步执行,其间您可以观察到某些字段的变化。 但是程序不会进入while循环,并且自然不会执行request.setAttribute(n,v)函数。 再次跟踪时,发现获得attitudes值时,while循环的判断条件返回-1。回顾前一节提到的Forward Request结构,看到了attitudes字段。该字段可能与代码中while循环中的attitudecode有关。


  查看了ajp-client中用于attitudes字段的代码,发现该项目未处理attitudes字段。 根据理解在AjpClient.java中添加了attitudes处理代码。


public List<Pair<String,String>> headers = new LinkedList<Pair<String,String>>(); 


public List<Pair<String,String>> attributes = new LinkedList<Pair<String, String>>();


  添加函数setHeaders()这个函数并不重要,添加函数addAttributes()。

blob.png

在query函数中添加,处理atrribute代码

blob.png

修改测试代码如下

blob.png

(test_servlet / xx是不存在的地址或映射,只有将其设置为不存在的地址,代码流才会进入DefaultServlet)


  运行程序,程序成功进入while循环

blob.png

 至于为什么以这种方式编写addAttributes参数,在经过几次调试之后将知道。


  该程序执行request.setAttribute(n,v)函数,然后执行DefaultServlet的serveResource函数。

blob.png

追溯到getRelativePath函数,

blob.png

 这将获得我们设置的attributes值。然后使用resources.getResource(path); 确定设置的路径文件是否存在,如果存在,则返回文件内容,如果不存在,则报告错误。


  已成功读取文件。

blob.png

关于org.apache.jasper.servlet.JspServlet类实现文件的包含,此处将不对其进行分析。

本文由 重庆网络安全 整理发布,转载请保留出处,内容部分来自于互联网,如有侵权请联系我们删除。

相关热词搜索:POC编写 CNVD-2020-10487 CVE-2020-1938 tomcat ajp协议漏洞 读取网站目录任意文件 重庆网络安全

上一篇:Secure Remote Access中SQL注入漏洞、缓冲区溢出漏洞、目录遍历漏洞、代码注入漏洞等漏洞分析
下一篇:CVE-2020-0668漏洞分析:Windows Service Tracing任意文件移动漏洞

热门资讯

鼠标向下滚动