GhostCat漏洞的一些见解

关于我之前研究GhostCat漏洞的复现,后做出的一些想法,想得到验证,故有此一篇文章。

从GhostCat漏洞的出发点都不难看出是从tomcat的web.xml中的servlet配置

但除了网上流传的exp之外,我发现对cgi的利用缺没有人研究。

 如正常方式配置CGIServlet服务

 在Context.xml文件中添加privileged="true"

开启debug之后

 程序会执行this.prepareRequest()解析请求

并传入CGIServlet的doget方法

 在CGIServlet.CGIEnvironment方法中设置了如下变量:

this.context = this.getServletContext();
this.webAppRootDir = context.getRealPath("/");
this.tmpDir = (File)context.getAttribute("javax.servlet.context.tempdir");

往后调用了

 进入后获取web路径

 cginame存放着要运行的cgi程序

 如果cginame中存放的不是文件,则findCGI会返回null

 这里开始我换了个路径

 

 继续查看代码

 这里的contextPath、servletPath和cginame都可控

 这里以字符串数组进行返回

 返回出来后执行

 将所有env环境保存,退回到doget方法

 cgi.run方法中存在runtime().exec()

 执行的程序是python

 输入的程序为路径

最终导致任意路径程序运行

 如果用普通的http协议是无法复现成功的。

漏洞利用条件:

1.Tomcat服务器需要开启CGIServlet

2.Tomcat AJP协议可以操控相关属性

3.利用的CGI的路径必须存在,且为文件类型。

4.有可以操控的文件。(上传文件、日志文件)

 

 CGI文件如下:

 exec执行参数:

 如果想要执行系统命令,所执行的文件必须跟上绝对路径

 运行poc

 同时在python的lib目录中存在一个formatter.py的gadget,可以通过利用formatter.py来读取任意文件的内容。由于formatter.py是需要参数,这里可以通过set该qurey_string属性

 Windows下传入的query_string参数不能带有 “” 字符所以这里路径得用 “/”

 要能使参数传入进去,首先必须得enableCmdLineArguments参数为true

 运行程序,并传入参数

安全防御:

在tomcat8.5.51以后的版本不存在GhostCat漏洞,这里在AjpProcess类中进行对比

 新版Tomcat在static代码类中添加了一个javaxAttributes变量

该HashSet中存在的属性解为白名单数据

 在更新的版本中AJP协议的功能以及默认关闭了

原文地址:https://www.cnblogs.com/wh4am1/p/12359267.html