zoukankan      html  css  js  c++  java
  • 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协议的功能以及默认关闭了

  • 相关阅读:
    cpu 怎么区分指令与数据,寄存器与内存各自对应什么
    添加省略号
    有关自有属性,原型属性的问题
    实现一个new
    滚动条样式修改
    备忘录实现+具体需求应用备忘录
    Math.random生成指定范围的随机数
    reduce详细用法
    一个搜索上下的功能,用的不多
    svg拖拽rect,line,circle
  • 原文地址:https://www.cnblogs.com/wh4am1/p/12359267.html
Copyright © 2011-2022 走看看