关于我之前研究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协议的功能以及默认关闭了