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协议的功能以及默认关闭了


浙公网安备 33010602011771号